From 1292d50926c3a412c7c4e8720170f493a0f5ab8e Mon Sep 17 00:00:00 2001 From: Mike Westerhof Date: Sun, 5 Apr 2009 21:08:58 -0500 Subject: SlugOS: leds - attempt to modload ledtrig-timer rather than assuming it is built into the kernel. (From Martin Michlmayr) --- recipes/slugos-init/files/leds | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes/slugos-init/files/leds b/recipes/slugos-init/files/leds index b40d5d874e..68f0c23a98 100644 --- a/recipes/slugos-init/files/leds +++ b/recipes/slugos-init/files/leds @@ -31,6 +31,8 @@ led_set(){ esac >"$1/brightness";; slow|fast|panic|blink|flash) + modprobe ledtrig-timer > /dev/null 2>&1 || true + echo -n timer case "$setting" in -- cgit v1.2.3 From 26b1e968669865d31ed0b53d048d989e93519e45 Mon Sep 17 00:00:00 2001 From: Mike Westerhof Date: Sun, 5 Apr 2009 22:05:27 -0500 Subject: SlugOS: leds - fix logic to attempt to beep even if udev hasn't yet run. --- recipes/slugos-init/files/leds | 5 +++++ recipes/slugos-init/slugos-init_5.0.bb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/recipes/slugos-init/files/leds b/recipes/slugos-init/files/leds index 68f0c23a98..b1f6e126b4 100644 --- a/recipes/slugos-init/files/leds +++ b/recipes/slugos-init/files/leds @@ -198,6 +198,11 @@ beep(){ break fi done + # If udev hasn't run, then /dev/input doesn't exist, so + # fallback to /dev/buzzer if possible. + if test -e /dev/buzzer -a ! -d /dev/input; then + arg="-e /dev/buzzer" + fi /bin/beep $arg "$@" 2>/dev/null fi return 0 diff --git a/recipes/slugos-init/slugos-init_5.0.bb b/recipes/slugos-init/slugos-init_5.0.bb index beeaa34135..bf3bb6fee8 100644 --- a/recipes/slugos-init/slugos-init_5.0.bb +++ b/recipes/slugos-init/slugos-init_5.0.bb @@ -4,7 +4,7 @@ PRIORITY = "required" LICENSE = "GPL" DEPENDS = "base-files devio" RDEPENDS = "busybox devio" -PR = "r10" +PR = "r11" SRC_URI = "file://boot/flash \ file://boot/disk \ -- cgit v1.2.3 From 45c1142d3e0fc422277cf4671613aa9b61bf010f Mon Sep 17 00:00:00 2001 From: Mike Westerhof Date: Sun, 5 Apr 2009 23:35:38 -0500 Subject: SlugOS: toolchain/sdk - add a number of missing components provided by task-sdk-bare, as noted by Tom Rini. --- recipes/tasks/task-slugos-toolchain-target.bb | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/recipes/tasks/task-slugos-toolchain-target.bb b/recipes/tasks/task-slugos-toolchain-target.bb index 489a41213b..fb0418fe29 100644 --- a/recipes/tasks/task-slugos-toolchain-target.bb +++ b/recipes/tasks/task-slugos-toolchain-target.bb @@ -2,31 +2,21 @@ DESCRIPTION = "Packages for a standalone SDK or external toolchain" LICENSE = "MIT" ALLOW_EMPTY = "1" -PR = "r1" +PR = "r3" PACKAGES = "${PN}" -# Stuff contained in this SDK is largely taken from task-sdk-base.bb. +DEPENDS = "task-sdk-bare" + # This is a starting point, and nothing more at present -- please fill # this out with a reasonable set of development tools for a SlugOS image. # Also feel free to remove stuff that's silly. RDEPENDS_${PN} = "\ - libgcc \ + task-sdk-bare \ linux-libc-headers-dev \ libssl \ libcrypto \ openssl-dev \ - libstdc++ \ - " - -# Not sure if we need these or not... -NOT_SURE_ABOUT = "\ - libsegfault \ - " - -# This one needs further investigation; seems to be some sort -# of naming problem that breaks the SDK when it is added directly. -ODDLY_BROKEN_PACKAGES ="\ - libz-dev \ + zlib-dev \ " -- cgit v1.2.3 From 389043beaee17cd6bc90e5c8e7140fdab51c9ae8 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 6 Apr 2009 08:56:14 +0200 Subject: kernel,module-base class, bitbake.conf: introduce MACHINE_KERNEL_PR * bandaid till we have a better way to track ABI changes --- classes/kernel.bbclass | 4 ++++ classes/module-base.bbclass | 4 ++++ conf/bitbake.conf | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/classes/kernel.bbclass b/classes/kernel.bbclass index 17e8941745..954c407d51 100644 --- a/classes/kernel.bbclass +++ b/classes/kernel.bbclass @@ -64,6 +64,10 @@ export CMDLINE_CONSOLE = "console=${@bb.data.getVar("KERNEL_CONSOLE",d,1) or "tt KERNEL_VERSION = "${@get_kernelversion('${S}')}" KERNEL_MAJOR_VERSION = "${@get_kernelmajorversion('${KERNEL_VERSION}')}" +# A machine.conf or local.conf can increase MACHINE_KERNEL_PR to force +# rebuilds for kernel and external modules +PR = "${MACHINE_KERNEL_PR}" + KERNEL_LOCALVERSION ?= "" # kernels are generally machine specific diff --git a/classes/module-base.bbclass b/classes/module-base.bbclass index c98baceeab..bc53e1bad5 100644 --- a/classes/module-base.bbclass +++ b/classes/module-base.bbclass @@ -5,6 +5,10 @@ inherit kernel-arch export OS = "${TARGET_OS}" export CROSS_COMPILE = "${TARGET_PREFIX}" +# A machine.conf or local.conf can increase MACHINE_KERNEL_PR to force +# rebuilds for kernel and external modules +PR = "${MACHINE_KERNEL_PR}" + export KERNEL_VERSION = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-abiversion')}" export KERNEL_SOURCE = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-source')}" KERNEL_OBJECT_SUFFIX = "${@[".o", ".ko"][base_read_file('${STAGING_KERNEL_DIR}/kernel-abiversion') > "2.6.0"]}" diff --git a/conf/bitbake.conf b/conf/bitbake.conf index a0d652a26d..136f01c228 100644 --- a/conf/bitbake.conf +++ b/conf/bitbake.conf @@ -162,6 +162,10 @@ EXTENDPEVER = "${@['','${PE\x7d:'][bb.data.getVar('PE',d,1) > 0]}" EXTENDPV = "${EXTENDPEVER}${PV}-${PR}${DISTRO_PR}" P = "${PN}-${PV}" +# Define a PR for kernels that machines can override so things like +# modules get rebuilt +MACHINE_KERNEL_PR ?= "r0" + # Base package name # Automatically derives "foo" from "foo-native", "foo-cross" or "foo-initial" # otherwise it is the same as PN and P -- cgit v1.2.3 From 594a5295448cfc2d97e9b1721efe57c3362635bf Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 6 Apr 2009 09:11:49 +0200 Subject: omap3 boards: introduce MACHINE_KERNEL_PR, put it in conf/machine/include/omap3.inc --- conf/machine/beagleboard.conf | 14 ++------------ conf/machine/include/omap3.inc | 12 ++++++++++++ conf/machine/omap3-pandora.conf | 7 +------ conf/machine/omap3evm.conf | 8 +------- conf/machine/overo.conf | 7 +------ recipes/dsplink/gstreamer-ti_svn.bb | 2 +- recipes/dsplink/ti-codec-engine_2.21.bb | 1 - recipes/dsplink/ti-codec-engine_2.23.bb | 1 - recipes/dsplink/ti-dmai_svn.bb | 2 +- recipes/powervr-drivers/omap3-sgx-modules_1.3.13.1397.bb | 2 -- 10 files changed, 19 insertions(+), 37 deletions(-) create mode 100644 conf/machine/include/omap3.inc diff --git a/conf/machine/beagleboard.conf b/conf/machine/beagleboard.conf index 78c63019ae..69cdec6f1f 100644 --- a/conf/machine/beagleboard.conf +++ b/conf/machine/beagleboard.conf @@ -13,23 +13,14 @@ XSERVER = "xserver-xorg \ # Only has DVI connector for external screen GUI_MACHINE_CLASS = "bigscreen" -#include conf/machine/include/tune-arm1136jf-s.inc -# requires gcc 4.3.0: -include conf/machine/include/tune-cortexa8.inc +require conf/machine/include/omap3.inc - -IMAGE_FSTYPES += "tar.bz2 jffs2" +IMAGE_FSTYPES += "tar.bz2 ubi" EXTRA_IMAGECMD_jffs2 = "-lnp " # Guesswork SERIAL_CONSOLE = "115200 ttyS2" -PREFERRED_PROVIDER_virtual/kernel = "linux-omap" - -KERNEL_IMAGETYPE = "uImage" - -UBOOT_ENTRYPOINT = "0x80008000" -UBOOT_LOADADDRESS = "0x80008000" UBOOT_MACHINE = "omap3_beagle_config" # do ubiattach /dev/ubi_ctrl -m 4 @@ -49,7 +40,6 @@ UBINIZE_ARGS = "-m 2048 -p 128KiB -s 512" PREFERRED_VERSION_u-boot = "git" -EXTRA_IMAGEDEPENDS += "u-boot x-load" MACHINE_EXTRA_RRECOMMENDS = " omap3-sgx-modules " # and sdio diff --git a/conf/machine/include/omap3.inc b/conf/machine/include/omap3.inc new file mode 100644 index 0000000000..f6cf895c52 --- /dev/null +++ b/conf/machine/include/omap3.inc @@ -0,0 +1,12 @@ +require conf/machine/include/tune-cortexa8.inc +PREFERRED_PROVIDER_virtual/kernel = "linux-omap" +MACHINE_KERNEL_PR = "r20" + +KERNEL_IMAGETYPE = "uImage" + +UBOOT_ENTRYPOINT = "0x80008000" +UBOOT_LOADADDRESS = "0x80008000" + +EXTRA_IMAGEDEPENDS += "u-boot x-load" + +MACHINE_EXTRA_RRECOMMENDS = " omap3-sgx-modules " diff --git a/conf/machine/omap3-pandora.conf b/conf/machine/omap3-pandora.conf index 5bfbb712f2..99d92d5512 100644 --- a/conf/machine/omap3-pandora.conf +++ b/conf/machine/omap3-pandora.conf @@ -3,7 +3,7 @@ #@DESCRIPTION: Machine configuration for the Pandora http://www.openpandora.org/ Handheld Console TARGET_ARCH = "arm" -include conf/machine/include/tune-cortexa8.inc +require conf/machine/include/omap3.inc PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" XSERVER = "xserver-xorg \ @@ -28,12 +28,7 @@ EXTRA_IMAGECMD_jffs2 = "-lnp " SERIAL_CONSOLE = "115200 ttyS0" -PREFERRED_PROVIDER_virtual/kernel = "linux-omap" -#KERNEL_IMAGETYPE = "uImage" - -#UBOOT_ENTRYPOINT = "0x80008000" -#UBOOT_LOADADDRESS = "0x80008000" #UBOOT_ARCH = "arm" #UBOOT_MACHINE = "omap3_pandora_config" diff --git a/conf/machine/omap3evm.conf b/conf/machine/omap3evm.conf index 610b1dfc12..8780b827f5 100644 --- a/conf/machine/omap3evm.conf +++ b/conf/machine/omap3evm.conf @@ -13,9 +13,7 @@ XSERVER = "xserver-xorg \ GUI_MACHINE_CLASS = "smallscreen" -#include conf/machine/include/tune-arm1136jf-s.inc -# requires gcc 4.3.0: -include conf/machine/include/tune-cortexa8.inc +require conf/machine/include/omap3.inc # Ship all kernel modules MACHINE_EXTRA_RRECOMMENDS = " omap3-sgx-modules kernel-modules" @@ -27,10 +25,6 @@ SERIAL_CONSOLE = "115200 ttyS0" PREFERRED_PROVIDER_virtual/kernel ?= "linux-omap-pm" -KERNEL_IMAGETYPE = "uImage" - -UBOOT_ENTRYPOINT = "0x80008000" -UBOOT_LOADADDRESS = "0x80008000" UBOOT_ARCH = "arm" UBOOT_MACHINE = "omap3_evm_config" diff --git a/conf/machine/overo.conf b/conf/machine/overo.conf index 2a93ab069d..cb32539928 100644 --- a/conf/machine/overo.conf +++ b/conf/machine/overo.conf @@ -2,18 +2,13 @@ #@NAME: overo machine #@DESCRIPTION: Machine configuration for the Gumstix Overo -include conf/machine/include/tune-cortexa8.inc +require conf/machine/include/omap3.inc TARGET_ARCH = "arm" MACHINE_FEATURES = "kernel26 screen apm usbgadget usbhost vfat alsa touchscreen" -UBOOT_ENTRYPOINT = "0x80008000" -UBOOT_LOADADDRESS = "0x80008000" UBOOT_MACHINE_overo = "omap3_overo_config" -PREFERRED_PROVIDER_virtual/kernel = "linux-omap" - -KERNEL_IMAGETYPE = "uImage" SERIAL_CONSOLE = "115200 ttyS2" IMAGE_FSTYPES += "tar.bz2" diff --git a/recipes/dsplink/gstreamer-ti_svn.bb b/recipes/dsplink/gstreamer-ti_svn.bb index ab705f3622..6944ad59b8 100644 --- a/recipes/dsplink/gstreamer-ti_svn.bb +++ b/recipes/dsplink/gstreamer-ti_svn.bb @@ -4,7 +4,7 @@ SRC_URI = "svn://gforge.ti.com/svn/gstreamer_ti/trunk;module=gstreamer_ti;proto= " SRCREV = "160" -PR = "r7" +PR = "${MACHINE_KERNEL_PR}" # Again, no '.' in PWD allowed :( PV = "0+svnr${SRCREV}" diff --git a/recipes/dsplink/ti-codec-engine_2.21.bb b/recipes/dsplink/ti-codec-engine_2.21.bb index 5b1d5e0b6b..f0b0d7e1ce 100644 --- a/recipes/dsplink/ti-codec-engine_2.21.bb +++ b/recipes/dsplink/ti-codec-engine_2.21.bb @@ -8,7 +8,6 @@ RDEPENDS = "update-modules" inherit module # tconf from xdctools dislikes '.' in pwd :/ -PR = "r19" PV = "221" # Get CE tarball from TI website, place in sources and calculate diff --git a/recipes/dsplink/ti-codec-engine_2.23.bb b/recipes/dsplink/ti-codec-engine_2.23.bb index a42c33bcdd..bbf54d4ff9 100644 --- a/recipes/dsplink/ti-codec-engine_2.23.bb +++ b/recipes/dsplink/ti-codec-engine_2.23.bb @@ -9,7 +9,6 @@ inherit module DEFAULT_PREFERENCE = "-1" # tconf from xdctools dislikes '.' in pwd :/ -PR = "r0" PV = "223" # Get CE tarball from TI website, place in sources and calculate md5sum diff --git a/recipes/dsplink/ti-dmai_svn.bb b/recipes/dsplink/ti-dmai_svn.bb index bcbaea8f65..76fa74a258 100644 --- a/recipes/dsplink/ti-dmai_svn.bb +++ b/recipes/dsplink/ti-dmai_svn.bb @@ -15,7 +15,7 @@ SRCREV = "36" S = "${WORKDIR}/BRIJESH_GIT_022309/davinci_multimedia_application_interface/dmai" # Yes, the xdc stuff still breaks with a '.' in PWD PV = "120+svnr${SRCREV}" -PR = "r16" +PR = "${MACHINE_KERNEL_PR}" TARGET = "all" TARGET_neuros-osd2 = " dm6446_al dm6446_db" diff --git a/recipes/powervr-drivers/omap3-sgx-modules_1.3.13.1397.bb b/recipes/powervr-drivers/omap3-sgx-modules_1.3.13.1397.bb index 985a0c044b..fc9f02f5df 100644 --- a/recipes/powervr-drivers/omap3-sgx-modules_1.3.13.1397.bb +++ b/recipes/powervr-drivers/omap3-sgx-modules_1.3.13.1397.bb @@ -1,8 +1,6 @@ DESCRIPTION = "Kernel drivers for the PowerVR SGX chipset found in the omap3 SoCs" LICENSE = "GPLv2" -PR = "r6" - inherit module SRC_URI = "http://dominion.thruhere.net/koen/OE/omap3-sgx-modules-${PV}.tar.bz2 \ -- cgit v1.2.3 From 0289d87d39d3b77c70c948a248d94f565ee71029 Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:44:02 +0100 Subject: Add support for AT91SAM9G20EK --- conf/machine/at91sam9g20ek.conf | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 conf/machine/at91sam9g20ek.conf diff --git a/conf/machine/at91sam9g20ek.conf b/conf/machine/at91sam9g20ek.conf new file mode 100644 index 0000000000..8a56e3b498 --- /dev/null +++ b/conf/machine/at91sam9g20ek.conf @@ -0,0 +1,27 @@ +#@TYPE: Machine +#@Name: Atmel AT91SAM9G20EK Development Platform +#@DESCRIPTION: Machine configuration for the at91sam9g20ek development board with a at91sam9g20 processor + +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" +PREFERRED_PROVIDER_xserver = "xserver-kdrive" + +KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at92sam9g20ek_config" + +#don't try to access tty1 +USE_VT = "0" + +MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget" +#EXTRA_IMAGEDEPENDS += "u-boot" +#EXTRA_IMAGEDEPENDS += "at91bootstrap" + +# used by sysvinit_2 +SERIAL_CONSOLE = "115200 ttyS0" +IMAGE_FSTYPES ?= "jffs2" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" + +require conf/machine/include/tune-arm926ejs.inc -- cgit v1.2.3 From 038dd6020c471b8cc9684de38a610ea5326a09f5 Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:43:30 +0100 Subject: Add support for at91cap9adk development board with a at91cap9500 processor --- conf/machine/at91cap9adk.conf | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 conf/machine/at91cap9adk.conf diff --git a/conf/machine/at91cap9adk.conf b/conf/machine/at91cap9adk.conf new file mode 100644 index 0000000000..3512d19744 --- /dev/null +++ b/conf/machine/at91cap9adk.conf @@ -0,0 +1,27 @@ +#@TYPE: Machine +#@Name: Atmel AT91CAP9ADK Development Platform +#@DESCRIPTION: Machine configuration for the at91cap9adk development board with a at91cap9500 processor + +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" +PREFERRED_PROVIDER_xserver = "xserver-kdrive" + +KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at91cap9adk_config" + +#don't try to access tty1 +USE_VT = "0" + +MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget screen touchscreen" +EXTRA_IMAGEDEPENDS += "u-boot" +#EXTRA_IMAGEDEPENDS += "at91bootstrap" + +# used by sysvinit_2 +SERIAL_CONSOLE = "115200 ttyS0" +IMAGE_FSTYPES ?= "jffs2" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" + +require conf/machine/include/tune-arm926ejs.inc -- cgit v1.2.3 From b42626ddd44ce9f0062ada19c894e759934011c9 Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:44:24 +0100 Subject: Add support for AT91SAM9RL64 --- conf/machine/at91sam9rlek.conf | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 conf/machine/at91sam9rlek.conf diff --git a/conf/machine/at91sam9rlek.conf b/conf/machine/at91sam9rlek.conf new file mode 100644 index 0000000000..06f942b1d3 --- /dev/null +++ b/conf/machine/at91sam9rlek.conf @@ -0,0 +1,29 @@ +#@TYPE: Machine +#@Name: Atmel AT91SAM9RLEK Development Platform +#@DESCRIPTION: Machine configuration for the at91sam9rlek development board with a at91sam9rl64 processor + +TARGET_ARCH = "arm" +#PACKAGE_EXTRA_ARCHS = "armv4t armv5te" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" +PREFERRED_PROVIDER_xserver = "xserver-kdrive" + +KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at92sam9rlek_config" + +#don't try to access tty1 +USE_VT = "0" + +MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget screen touchscreen" +EXTRA_IMAGEDEPENDS += "u-boot" +#EXTRA_IMAGEDEPENDS += "at91bootstrap" + +# used by sysvinit_2 +SERIAL_CONSOLE = "115200 ttyS0" +IMAGE_FSTYPES ?= "jffs2" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" + +require conf/machine/include/tune-arm926ejs.inc + -- cgit v1.2.3 From 82f0e66ef890ef247af932524f66f5c63fedc5d2 Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:35:21 +0100 Subject: Add recipe for at91bootstrap-2.10 --- .../at91bootstrap-2.10/at91cap9adk/defconfig | 68 +++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9260ek/defconfig | 68 +++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9261ek/defconfig | 68 +++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9263ek/defconfig | 68 +++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9g20ek/defconfig | 70 ++++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9rlek/defconfig | 68 +++++++++++++++++++++ .../at91bootstrap-2.10/at91sam9xeek/defconfig | 68 +++++++++++++++++++++ recipes/at91bootstrap/at91bootstrap_2.10.bb | 26 ++++++++ 8 files changed, 504 insertions(+) create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91cap9adk/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9260ek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9261ek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9263ek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9g20ek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9rlek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap-2.10/at91sam9xeek/defconfig create mode 100644 recipes/at91bootstrap/at91bootstrap_2.10.bb diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91cap9adk/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91cap9adk/defconfig new file mode 100644 index 0000000000..169c58ea06 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91cap9adk/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:12:57 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91cap9adk" +# CONFIG_AT91SAM9260EK is not set +# CONFIG_AT91SAM9261EK is not set +# CONFIG_AT91SAM9263EK is not set +# CONFIG_AT91SAM9RLEK is not set +# CONFIG_AT91SAM9XEEK is not set +# CONFIG_AT91SAM9G20EK is not set +CONFIG_AT91CAP9ADK=y +CONFIG_CHIP="AT91CAP9" +CONFIG_BOARD="at91cap9adk" +CONFIG_MACH_TYPE="1442" +CONFIG_LINK_ADDR="0x000000" +CONFIG_TOP_OF_MEMORY="0x108000" +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +# CONFIG_SDRAM is not set +CONFIG_SDDRC=y +ALLOW_DATAFLASH=y +ALLOW_FLASH=y +# ALLOW_NANDFLASH is not set +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +DATAFLASHCARD_ON_CS0=y +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +CONFIG_DATAFLASHCARD=y +CONFIG_CARD_SUFFIX="card" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x73F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9260ek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9260ek/defconfig new file mode 100644 index 0000000000..9f1d450d4e --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9260ek/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:12:18 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9260ek" +CONFIG_AT91SAM9260EK=y +# CONFIG_AT91SAM9261EK is not set +# CONFIG_AT91SAM9263EK is not set +# CONFIG_AT91SAM9RLEK is not set +# CONFIG_AT91SAM9XEEK is not set +# CONFIG_AT91SAM9G20EK is not set +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9260" +CONFIG_BOARD="at91sam9260ek" +CONFIG_MACH_TYPE="0x44B" +CONFIG_LINK_ADDR="0x200000" +CONFIG_TOP_OF_MEMORY="0x301000" +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +DATAFLASHCARD_ON_CS0=y +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +CONFIG_DATAFLASHCARD=y +CONFIG_CARD_SUFFIX="card" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9261ek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9261ek/defconfig new file mode 100644 index 0000000000..3e8824d1d4 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9261ek/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:16:48 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9261ek" +# CONFIG_AT91SAM9260EK is not set +CONFIG_AT91SAM9261EK=y +# CONFIG_AT91SAM9263EK is not set +# CONFIG_AT91SAM9RLEK is not set +# CONFIG_AT91SAM9XEEK is not set +# CONFIG_AT91SAM9G20EK is not set +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9261" +CONFIG_BOARD="at91sam9261ek" +CONFIG_MACH_TYPE="0x350" +CONFIG_LINK_ADDR="0x300000" +CONFIG_TOP_OF_MEMORY="0x328000" +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +# DATAFLASHCARD_ON_CS0 is not set +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +# CONFIG_DATAFLASHCARD is not set +CONFIG_CARD_SUFFIX="" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9263ek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9263ek/defconfig new file mode 100644 index 0000000000..9724ee2a30 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9263ek/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:11:38 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9263ek" +# CONFIG_AT91SAM9260EK is not set +# CONFIG_AT91SAM9261EK is not set +CONFIG_AT91SAM9263EK=y +# CONFIG_AT91SAM9RLEK is not set +# CONFIG_AT91SAM9XEEK is not set +# CONFIG_AT91SAM9G20EK is not set +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9263" +CONFIG_BOARD="at91sam9263ek" +CONFIG_MACH_TYPE="0x4B2" +CONFIG_LINK_ADDR="0x300000" +CONFIG_TOP_OF_MEMORY="0x314000" +# CONFIG_CRYSTAL_16_000MHZ is not set +CONFIG_CRYSTAL_16_36766MHZ=y +# CONFIG_CRYSTAL_18_432MHZ is not set +CONFIG_CRYSTAL="CRYSTAL_16_36766MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +DATAFLASHCARD_ON_CS0=y +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +CONFIG_DATAFLASHCARD=y +CONFIG_CARD_SUFFIX="card" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9g20ek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9g20ek/defconfig new file mode 100644 index 0000000000..7951ce28ea --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9g20ek/defconfig @@ -0,0 +1,70 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:13:52 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9g20ek" +# CONFIG_AT91SAM9260EK is not set +# CONFIG_AT91SAM9261EK is not set +# CONFIG_AT91SAM9263EK is not set +# CONFIG_AT91SAM9RLEK is not set +# CONFIG_AT91SAM9XEEK is not set +CONFIG_AT91SAM9G20EK=y +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9G20" +CONFIG_BOARD="at91sam9g20ek" +CONFIG_MACH_TYPE="0x658" +CONFIG_LINK_ADDR="0x200000" +CONFIG_TOP_OF_MEMORY="0x301000" +# CONFIG_BUS_SPEED_100MHZ is not set +CONFIG_BUS_SPEED_133MHZ=y +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +DATAFLASHCARD_ON_CS0=y +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +CONFIG_DATAFLASHCARD=y +CONFIG_CARD_SUFFIX="card" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9rlek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9rlek/defconfig new file mode 100644 index 0000000000..ca9a7962b6 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9rlek/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:14:48 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9rlek" +# CONFIG_AT91SAM9260EK is not set +# CONFIG_AT91SAM9261EK is not set +# CONFIG_AT91SAM9263EK is not set +CONFIG_AT91SAM9RLEK=y +# CONFIG_AT91SAM9XEEK is not set +# CONFIG_AT91SAM9G20EK is not set +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9RL" +CONFIG_BOARD="at91sam9rlek" +CONFIG_MACH_TYPE="1326" +CONFIG_LINK_ADDR="0x300000" +CONFIG_TOP_OF_MEMORY="0x310000" +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +# DATAFLASHCARD_ON_CS0 is not set +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +# CONFIG_DATAFLASHCARD is not set +CONFIG_CARD_SUFFIX="" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9xeek/defconfig b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9xeek/defconfig new file mode 100644 index 0000000000..298b53f4e4 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap-2.10/at91sam9xeek/defconfig @@ -0,0 +1,68 @@ +# +# Automatically generated make config: don't edit +# Sat Dec 27 17:15:15 2008 +# +HAVE_DOT_CONFIG=y +CONFIG_BOARDNAME="at91sam9xeek" +# CONFIG_AT91SAM9260EK is not set +# CONFIG_AT91SAM9261EK is not set +# CONFIG_AT91SAM9263EK is not set +# CONFIG_AT91SAM9RLEK is not set +CONFIG_AT91SAM9XEEK=y +# CONFIG_AT91SAM9G20EK is not set +# CONFIG_AT91CAP9ADK is not set +CONFIG_CHIP="AT91SAM9XE" +CONFIG_BOARD="at91sam9xeek" +CONFIG_MACH_TYPE="0x44B" +CONFIG_LINK_ADDR="0x200000" +CONFIG_TOP_OF_MEMORY="0x301000" +# CONFIG_CRYSTAL_16_000MHZ is not set +# CONFIG_CRYSTAL_16_36766MHZ is not set +CONFIG_CRYSTAL_18_432MHZ=y +CONFIG_CRYSTAL="CRYSTAL_18_432MHZ" + +# +# Memory selection +# +CONFIG_SDRAM=y +# CONFIG_SDDRC is not set +ALLOW_DATAFLASH=y +# ALLOW_FLASH is not set +ALLOW_NANDFLASH=y +# ALLOW_SDCARD is not set +CONFIG_DATAFLASH=y +# CONFIG_FLASH is not set +# CONFIG_NANDFLASH is not set +# CONFIG_SDCARD is not set +CONFIG_MEMORY="dataflash" + +# +# SPI configuration +# +CONFIG_SPI_CLK=33000000 +CONFIG_SPI_BOOT_CS0=y +# CONFIG_SPI_BOOT_CS1 is not set +DATAFLASHCARD_ON_CS0=y +# DATAFLASHCARD_ON_CS1 is not set +# DATAFLASHCARD_ON_CS2 is not set +# DATAFLASHCARD_ON_CS3 is not set +CONFIG_DATAFLASHCARD=y +CONFIG_CARD_SUFFIX="card" +CONFIG_SPI_BOOT="AT91C_SPI_PCS0_DATAFLASH" +CONFIG_SPI_MODE_0=y +# CONFIG_SPI_MODE_1 is not set +# CONFIG_SPI_MODE_2 is not set +# CONFIG_SPI_MODE_3 is not set +CONFIG_SPI_MODE=0 +CONFIG_PROJECT="dataflash" +CONFIG_LOAD_UBOOT=y +# CONFIG_LOAD_EXAMPLE is not set +# CONFIG_LOAD_SMALL_APP is not set +# CONFIG_LOAD_LARGE_APP is not set +CONFIG_IMG_ADDRESS="0x00008400" +CONFIG_IMG_SIZE="0x00040000" +CONFIG_JUMP_ADDR="0x23F00000" +CONFIG_APP_CHECK=y +# CONFIG_LONG_TEST is not set +CONFIG_DEBUG=y +CONFIG_HW_INIT=y diff --git a/recipes/at91bootstrap/at91bootstrap_2.10.bb b/recipes/at91bootstrap/at91bootstrap_2.10.bb new file mode 100644 index 0000000000..a652f1b155 --- /dev/null +++ b/recipes/at91bootstrap/at91bootstrap_2.10.bb @@ -0,0 +1,26 @@ +DESCRIPTION = "at91bootstrap: loaded into internal SRAM by AT91 BootROM" +SECTION = "bootloaders" + +SRC_URI = "ftp://www.at91.com/pub/buildroot/${PN}-${PV}.tar.bz2 \ + file://defconfig \ + " + +AT91BOOTSTRAP_FLAGS ?= "" + +S = "${WORKDIR}/${PN}-${PV}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +EXTRA_OEMAKE = "CROSS_COMPILE=${TARGET_PREFIX} DESTDIR=${DEPLOY_DIR_IMAGE} REVISION=${PR}" + +do_compile () { + unset LDFLAGS + unset CFLAGS + unset CPPFLAGS + + rm -Rf ${S}/binaries + cp ${S}/../defconfig ${S}/.config + oe_runmake AT91_CUSTOM_FLAGS="${AT91BOOTSTRAP_FLAGS}" + oe_runmake AT91_CUSTOM_FLAGS="${AT91BOOTSTRAP_FLAGS}" boot + oe_runmake AT91_CUSTOM_FLAGS="${AT91BOOTSTRAP_FLAGS}" install +} + -- cgit v1.2.3 From 7753dd28919f32c5fbe31ddf60fe6d77f38b77df Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:35:51 +0100 Subject: Add recipe for u-boot-2009.01 --- .../u-boot-2009.01-exp-001-config.patch | 266 +++++++ .../u-boot-2009.01-exp-002-at91sam9g20ek.patch | 802 +++++++++++++++++++++ ...u-boot-2009.01-exp-003-drivers-net-macb.c.patch | 28 + ...boot-2009.01-include_asm-avr32_io.h.patch.avr32 | 13 + recipes/u-boot/u-boot_2009.01.bb | 28 + 5 files changed, 1137 insertions(+) create mode 100644 recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-001-config.patch create mode 100644 recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-002-at91sam9g20ek.patch create mode 100644 recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-003-drivers-net-macb.c.patch create mode 100644 recipes/u-boot/u-boot-2009.01/u-boot-2009.01-include_asm-avr32_io.h.patch.avr32 create mode 100644 recipes/u-boot/u-boot_2009.01.bb diff --git a/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-001-config.patch b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-001-config.patch new file mode 100644 index 0000000000..f1c30aa1ba --- /dev/null +++ b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-001-config.patch @@ -0,0 +1,266 @@ +diff -urN u-boot-2008.10-0rig//doc/README.at91 u-boot-2008.10/doc/README.at91 +--- u-boot-2008.10-0rig//doc/README.at91 1970-01-01 01:00:00.000000000 +0100 ++++ u-boot-2008.10/doc/README.at91 2008-12-31 12:16:34.000000000 +0100 +@@ -0,0 +1,88 @@ ++Atmel AT91 Evaluation kits ++ ++http://atmel.com/dyn/products/tools.asp?family_id=605#1443 ++ ++------------------------------------------------------------------------------ ++AT91SAM9260EK ++------------------------------------------------------------------------------ ++ ++Memory map ++ 0x20000000 - 23FFFFFF SDRAM (64 MB) ++ 0xC0000000 - Cxxxxxxx Atmel Dataflash card (J13) ++ 0xD0000000 - Dxxxxxxx Soldered Atmel Dataflash ++ ++Environment variables ++ ++ U-Boot environment variables can be stored at different places: ++ - Dataflash on SPI chip select 1 (default) ++ - Dataflash on SPI chip select 0 (dataflash card) ++ - Nand flash. ++ ++ You can choose your storage location at config step (here for at91sam9260ek) : ++ make at91sam9260ek_config - use data flash (spi cs1) (default) ++ make at91sam9260ek_nandflash_config - use nand flash ++ make at91sam9260ek_dataflash_cs0_config - use data flash (spi cs0) ++ make at91sam9260ek_dataflash_cs1_config - use data flash (spi cs1) ++ ++ ++------------------------------------------------------------------------------ ++AT91SAM9261EK ++------------------------------------------------------------------------------ ++ ++Memory map ++ 0x20000000 - 23FFFFFF SDRAM (64 MB) ++ 0xC0000000 - Cxxxxxxx Soldered Atmel Dataflash ++ 0xD0000000 - Dxxxxxxx Atmel Dataflash card (J22) ++ ++Environment variables ++ ++ U-Boot environment variables can be stored at different places: ++ - Dataflash on SPI chip select 0 (default) ++ - Dataflash on SPI chip select 3 (dataflash card) ++ - Nand flash. ++ ++ You can choose your storage location at config step (here for at91sam9260ek) : ++ make at91sam9261ek_config - use data flash (spi cs0) (default) ++ make at91sam9261ek_nandflash_config - use nand flash ++ make at91sam9261ek_dataflash_cs0_config - use data flash (spi cs0) ++ make at91sam9261ek_dataflash_cs3_config - use data flash (spi cs3) ++ ++ ++------------------------------------------------------------------------------ ++AT91SAM9263EK ++------------------------------------------------------------------------------ ++ ++Memory map ++ 0x20000000 - 23FFFFFF SDRAM (64 MB) ++ 0xC0000000 - Cxxxxxxx Atmel Dataflash card (J9) ++ ++Environment variables ++ ++ U-Boot environment variables can be stored at different places: ++ - Dataflash on SPI chip select 0 (dataflash card) ++ - Nand flash. ++ ++ You can choose your storage location at config step (here for at91sam9260ek) : ++ make at91sam9263ek_config - use data flash (spi cs0) (default) ++ make at91sam9263ek_nandflash_config - use nand flash ++ make at91sam9263ek_dataflash_cs0_config - use data flash (spi cs0) ++ ++ ++------------------------------------------------------------------------------ ++AT91SAM9RLEK ++------------------------------------------------------------------------------ ++ ++Memory map ++ 0x20000000 - 23FFFFFF SDRAM (64 MB) ++ 0xC0000000 - Cxxxxxxx Soldered Atmel Dataflash ++ ++Environment variables ++ ++ U-Boot environment variables can be stored at different places: ++ - Dataflash on SPI chip select 0 ++ - Nand flash. ++ ++ You can choose your storage location at config step (here for at91sam9260ek) : ++ make at91sam9263ek_config - use data flash (spi cs0) (default) ++ make at91sam9263ek_nandflash_config - use nand flash ++ make at91sam9263ek_dataflash_cs0_config - use data flash (spi cs0) +diff -urN u-boot-2008.10-0rig//include/configs/at91sam9260ek.h u-boot-2008.10/include/configs/at91sam9260ek.h +--- u-boot-2008.10-0rig//include/configs/at91sam9260ek.h 2008-12-31 12:15:59.000000000 +0100 ++++ u-boot-2008.10/include/configs/at91sam9260ek.h 2008-12-31 12:16:34.000000000 +0100 +@@ -127,10 +127,6 @@ + #define CFG_MEMTEST_START PHYS_SDRAM + #define CFG_MEMTEST_END 0x23e00000 + +-#undef CFG_USE_DATAFLASH_CS0 +-#define CFG_USE_DATAFLASH_CS1 1 +-#undef CFG_USE_NANDFLASH +- + #ifdef CFG_USE_DATAFLASH_CS0 + + /* bootstrap + u-boot + env + linux in dataflash on CS0 */ +diff -urN u-boot-2008.10-0rig//include/configs/at91sam9261ek.h u-boot-2008.10/include/configs/at91sam9261ek.h +--- u-boot-2008.10-0rig//include/configs/at91sam9261ek.h 2008-12-31 12:15:59.000000000 +0100 ++++ u-boot-2008.10/include/configs/at91sam9261ek.h 2008-12-31 12:16:34.000000000 +0100 +@@ -142,9 +142,6 @@ + #define CFG_MEMTEST_START PHYS_SDRAM + #define CFG_MEMTEST_END 0x23e00000 + +-#define CFG_USE_DATAFLASH_CS0 1 +-#undef CFG_USE_NANDFLASH +- + #ifdef CFG_USE_DATAFLASH_CS0 + + /* bootstrap + u-boot + env + linux in dataflash on CS0 */ +@@ -157,6 +154,20 @@ + #define CONFIG_BOOTARGS "console=ttyS0,115200 " \ + "root=/dev/mtdblock0 " \ + "mtdparts=at91_nand:-(root) " \ ++ "rw rootfstype=jffs2" ++ ++#elif CFG_USE_DATAFLASH_CS3 ++ ++/* bootstrap + u-boot + env + linux in dataflash on CS3 */ ++#define CFG_ENV_IS_IN_DATAFLASH 1 ++#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS3 + 0x8400) ++#define CFG_ENV_OFFSET 0x4200 ++#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS3 + CFG_ENV_OFFSET) ++#define CFG_ENV_SIZE 0x4200 ++#define CONFIG_BOOTCOMMAND "cp.b 0xD0042000 0x22000000 0x210000; bootm" ++#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ ++ "root=/dev/mtdblock0 " \ ++ "mtdparts=at91_nand:-(root) " \ + "rw rootfstype=jffs2" + + #else /* CFG_USE_NANDFLASH */ +diff -urN u-boot-2008.10-0rig//include/configs/at91sam9263ek.h u-boot-2008.10/include/configs/at91sam9263ek.h +--- u-boot-2008.10-0rig//include/configs/at91sam9263ek.h 2008-12-31 12:15:59.000000000 +0100 ++++ u-boot-2008.10/include/configs/at91sam9263ek.h 2008-12-31 12:16:34.000000000 +0100 +@@ -148,9 +148,6 @@ + #define CFG_MEMTEST_START PHYS_SDRAM + #define CFG_MEMTEST_END 0x23e00000 + +-#define CFG_USE_DATAFLASH 1 +-#undef CFG_USE_NANDFLASH +- + #ifdef CFG_USE_DATAFLASH + + /* bootstrap + u-boot + env + linux in dataflash on CS0 */ +diff -urN u-boot-2008.10-0rig//include/configs/at91sam9rlek.h u-boot-2008.10/include/configs/at91sam9rlek.h +--- u-boot-2008.10-0rig//include/configs/at91sam9rlek.h 2008-12-31 12:15:59.000000000 +0100 ++++ u-boot-2008.10/include/configs/at91sam9rlek.h 2008-12-31 12:16:34.000000000 +0100 +@@ -117,9 +117,6 @@ + #define CFG_MEMTEST_START PHYS_SDRAM + #define CFG_MEMTEST_END 0x23e00000 + +-#define CFG_USE_DATAFLASH 1 +-#undef CFG_USE_NANDFLASH +- + #ifdef CFG_USE_DATAFLASH + + /* bootstrap + u-boot + env + linux in dataflash on CS0 */ +diff -urN u-boot-2008.10-0rig//Makefile u-boot-2008.10/Makefile +--- u-boot-2008.10-0rig//Makefile 2008-12-31 12:15:55.000000000 +0100 ++++ u-boot-2008.10/Makefile 2008-12-31 12:18:31.000000000 +0100 +@@ -2487,15 +2487,6 @@ + at91rm9200dk_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200 + +-at91sam9261ek_config : unconfig +- @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9261ek atmel at91 +- +-at91sam9263ek_config : unconfig +- @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9263ek atmel at91 +- +-at91sam9rlek_config : unconfig +- @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9rlek atmel at91 +- + cmc_pu2_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200 + +@@ -2518,8 +2509,79 @@ + at91cap9adk_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm926ejs at91cap9adk atmel at91 + ++at91sam9260ek_nandflash_config \ ++at91sam9260ek_dataflash_cs0_config \ ++at91sam9260ek_dataflash_cs1_config \ + at91sam9260ek_config : unconfig +- @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9260ek atmel at91 ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ elif [ "$(findstring dataflash_cs0,$@)" ] ; then \ ++ echo "#define CFG_USE_DATAFLASH_CS0 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH_CS1 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS1" ; \ ++ fi; ++ @$(MKCONFIG) -a at91sam9260ek arm arm926ejs at91sam9260ek atmel at91 ++ ++at91sam9xeek_nandflash_config \ ++at91sam9xeek_dataflash_cs0_config \ ++at91sam9xeek_dataflash_cs1_config \ ++at91sam9xeek_config : unconfig ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ elif [ "$(findstring dataflash_cs0,$@)" ] ; then \ ++ echo "#define CFG_USE_DATAFLASH_CS0 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH_CS1 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS1" ; \ ++ fi; ++ @$(MKCONFIG) -n at91sam9xeek -a at91sam9260ek arm arm926ejs at91sam9260ek atmel at91 ++ ++at91sam9261ek_nandflash_config \ ++at91sam9261ek_dataflash_cs0_config \ ++at91sam9261ek_dataflash_cs3_config \ ++at91sam9261ek_config : unconfig ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ elif [ "$(findstring dataflash_cs3,$@)" ] ; then \ ++ echo "#define CFG_USE_DATAFLASH_CS3 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS3" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH_CS0 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ fi; ++ @$(MKCONFIG) -a at91sam9261ek arm arm926ejs at91sam9261ek atmel at91 ++ ++at91sam9263ek_nandflash_config \ ++at91sam9263ek_dataflash_config \ ++at91sam9263ek_dataflash_cs0_config \ ++at91sam9263ek_config : unconfig ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ fi; ++ @$(MKCONFIG) -a at91sam9263ek arm arm926ejs at91sam9263ek atmel at91 ++ ++at91sam9rlek_nandflash_config \ ++at91sam9rlek_dataflash_config \ ++at91sam9rlek_dataflash_cs0_config \ ++at91sam9rlek_config : unconfig ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ fi; ++ @$(MKCONFIG) -a at91sam9rlek arm arm926ejs at91sam9rlek atmel at91 + + ######################################################################## + ## ARM Integrator boards - see doc/README-integrator for more info. diff --git a/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-002-at91sam9g20ek.patch b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-002-at91sam9g20ek.patch new file mode 100644 index 0000000000..bb7e6b1167 --- /dev/null +++ b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-002-at91sam9g20ek.patch @@ -0,0 +1,802 @@ +diff -urN u-boot-2008.10-0rig/Makefile u-boot-2008.10/Makefile +--- u-boot-2008.10-0rig/Makefile 2008-12-28 14:07:30.000000000 +0100 ++++ u-boot-2008.10/Makefile 2008-12-28 14:06:28.000000000 +0100 +@@ -2541,6 +2541,22 @@ + fi; + @$(MKCONFIG) -n at91sam9xeek -a at91sam9260ek arm arm926ejs at91sam9260ek atmel at91 + ++at91sam9g20ek_nandflash_config \ ++at91sam9g20ek_dataflash_cs0_config \ ++at91sam9g20ek_dataflash_cs1_config \ ++at91sam9g20ek_config : unconfig ++ @if [ "$(findstring _nandflash,$@)" ] ; then \ ++ echo "#define CFG_USE_NANDFLASH 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in NAND FLASH" ; \ ++ elif [ "$(findstring dataflash_cs0,$@)" ] ; then \ ++ echo "#define CFG_USE_DATAFLASH_CS0 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \ ++ else \ ++ echo "#define CFG_USE_DATAFLASH_CS1 1" >>$(obj)include/config.h ; \ ++ $(XECHO) "... with environment variable in SPI DATAFLASH CS1" ; \ ++ fi; ++ @$(MKCONFIG) -a at91sam9g20ek arm arm926ejs at91sam9g20ek atmel at91 ++ + at91sam9261ek_nandflash_config \ + at91sam9261ek_dataflash_cs0_config \ + at91sam9261ek_dataflash_cs3_config \ +Index: include/configs/at91sam9g20ek.h +=================================================================== +--- a/include/configs/at91sam9g20ek.h (.../u-boot-1.3.4) (revision 0) ++++ b/include/configs/at91sam9g20ek.h (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,198 @@ ++/* ++ * (C) Copyright 2007-2008 ++ * Stelian Pop ++ * Lead Tech Design ++ * ++ * Configuation settings for the AT91SAM9G20EK board. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * 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 ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++/* ARM asynchronous clock */ ++#define AT91_MAIN_CLOCK 396288000 /* from 18.432 MHz crystal */ ++#define AT91_MASTER_CLOCK 132096000 /* peripheral = main / 3 */ ++#define CFG_HZ 1000000 /* 1us resolution */ ++ ++#define AT91_SLOW_CLOCK 32768 /* slow clock */ ++ ++#define CONFIG_ARM926EJS 1 /* This is an ARM926EJS Core */ ++#define CONFIG_AT91SAM9G20 1 /* It's an Atmel AT91SAM9G20 SoC*/ ++#define CONFIG_AT91SAM9G20EK 1 /* on an AT91SAM9G20EK Board */ ++#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ ++ ++#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ ++#define CONFIG_SETUP_MEMORY_TAGS 1 ++#define CONFIG_INITRD_TAG 1 ++ ++#define CONFIG_SKIP_LOWLEVEL_INIT ++#define CONFIG_SKIP_RELOCATE_UBOOT ++ ++/* ++ * Hardware drivers ++ */ ++#define CONFIG_ATMEL_USART 1 ++#undef CONFIG_USART0 ++#undef CONFIG_USART1 ++#undef CONFIG_USART2 ++#define CONFIG_USART3 1 /* USART 3 is DBGU */ ++ ++#define CONFIG_BOOTDELAY 3 ++ ++/* ++ * BOOTP options ++ */ ++#define CONFIG_BOOTP_BOOTFILESIZE 1 ++#define CONFIG_BOOTP_BOOTPATH 1 ++#define CONFIG_BOOTP_GATEWAY 1 ++#define CONFIG_BOOTP_HOSTNAME 1 ++ ++/* ++ * Command line configuration. ++ */ ++#include ++#undef CONFIG_CMD_BDI ++#undef CONFIG_CMD_IMI ++#undef CONFIG_CMD_AUTOSCRIPT ++#undef CONFIG_CMD_FPGA ++#undef CONFIG_CMD_LOADS ++#undef CONFIG_CMD_IMLS ++ ++#define CONFIG_CMD_PING 1 ++#define CONFIG_CMD_DHCP 1 ++#define CONFIG_CMD_NAND 1 ++#define CONFIG_CMD_USB 1 ++ ++/* SDRAM */ ++#define CONFIG_NR_DRAM_BANKS 1 ++#define PHYS_SDRAM 0x20000000 ++#define PHYS_SDRAM_SIZE 0x04000000 /* 64 megs */ ++ ++/* DataFlash */ ++#define CONFIG_HAS_DATAFLASH 1 ++#define CFG_SPI_WRITE_TOUT (5*CFG_HZ) ++#define CFG_MAX_DATAFLASH_BANKS 2 ++#define CFG_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* CS0 */ ++#define CFG_DATAFLASH_LOGIC_ADDR_CS1 0xD0000000 /* CS1 */ ++#define AT91_SPI_CLK 15000000 ++#define DATAFLASH_TCSS (0x22 << 16) ++#define DATAFLASH_TCHS (0x1 << 24) ++ ++/* NAND flash */ ++#define NAND_MAX_CHIPS 1 ++#define CFG_MAX_NAND_DEVICE 1 ++#define CFG_NAND_BASE 0x40000000 ++#define CFG_NAND_DBW_8 1 ++ ++/* NOR flash - no real flash on this board */ ++#define CFG_NO_FLASH 1 ++ ++/* Ethernet */ ++#define CONFIG_MACB 1 ++#define CONFIG_RMII 1 ++#define CONFIG_NET_MULTI 1 ++#define CONFIG_NET_RETRY_COUNT 20 ++#define CONFIG_RESET_PHY_R 1 ++ ++/* USB */ ++#define CONFIG_USB_OHCI_NEW 1 ++#define LITTLEENDIAN 1 ++#define CONFIG_DOS_PARTITION 1 ++#define CFG_USB_OHCI_CPU_INIT 1 ++#define CFG_USB_OHCI_REGS_BASE 0x00500000 /* AT91SAM9G20_UHP_BASE */ ++#define CFG_USB_OHCI_SLOT_NAME "at91sam9g20" ++#define CFG_USB_OHCI_MAX_ROOT_PORTS 2 ++#define CONFIG_USB_STORAGE 1 ++ ++#define CFG_LOAD_ADDR 0x22000000 /* load address */ ++ ++#define CFG_MEMTEST_START PHYS_SDRAM ++#define CFG_MEMTEST_END 0x23e00000 ++ ++#ifdef CFG_USE_DATAFLASH_CS0 ++ ++/* bootstrap + u-boot + env + linux in dataflash on CS0 */ ++#define CFG_ENV_IS_IN_DATAFLASH 1 ++#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400) ++#define CFG_ENV_OFFSET 0x4200 ++#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET) ++#define CFG_ENV_SIZE 0x4200 ++#define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x22000000 0x210000; bootm" ++#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ ++ "root=/dev/mtdblock0 " \ ++ "mtdparts=at91_nand:-(root) " \ ++ "rw rootfstype=jffs2" ++ ++#elif CFG_USE_DATAFLASH_CS1 ++ ++/* bootstrap + u-boot + env + linux in dataflash on CS1 */ ++#define CFG_ENV_IS_IN_DATAFLASH 1 ++#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS1 + 0x8400) ++#define CFG_ENV_OFFSET 0x4200 ++#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS1 + CFG_ENV_OFFSET) ++#define CFG_ENV_SIZE 0x4200 ++#define CONFIG_BOOTCOMMAND "cp.b 0xD0042000 0x22000000 0x210000; bootm" ++#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ ++ "root=/dev/mtdblock0 " \ ++ "mtdparts=at91_nand:-(root) " \ ++ "rw rootfstype=jffs2" ++ ++#else /* CFG_USE_NANDFLASH */ ++ ++/* bootstrap + u-boot + env + linux in nandflash */ ++#define CFG_ENV_IS_IN_NAND 1 ++#define CFG_ENV_OFFSET 0x60000 ++#define CFG_ENV_OFFSET_REDUND 0x80000 ++#define CFG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */ ++#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xA0000 0x200000; bootm" ++#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ ++ "root=/dev/mtdblock5 " \ ++ "mtdparts=at91_nand:128k(bootstrap)ro," \ ++ "256k(uboot)ro,128k(env1)ro," \ ++ "128k(env2)ro,2M(linux),-(root) " \ ++ "rw rootfstype=jffs2" ++ ++#endif ++ ++#define CONFIG_BAUDRATE 115200 ++#define CFG_BAUDRATE_TABLE {115200 , 19200, 38400, 57600, 9600 } ++ ++#define CFG_PROMPT "U-Boot> " ++#define CFG_CBSIZE 256 ++#define CFG_MAXARGS 16 ++#define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) ++#define CFG_LONGHELP 1 ++#define CONFIG_CMDLINE_EDITING 1 ++ ++#define ROUND(A, B) (((A) + (B)) & ~((B) - 1)) ++/* ++ * Size of malloc() pool ++ */ ++#define CFG_MALLOC_LEN ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000) ++#define CFG_GBL_DATA_SIZE 128 /* 128 bytes for initial data */ ++ ++#define CONFIG_STACKSIZE (32*1024) /* regular stack */ ++ ++#ifdef CONFIG_USE_IRQ ++#error CONFIG_USE_IRQ not supported ++#endif ++ ++#endif +Index: board/atmel/at91sam9g20ek/nand.c +=================================================================== +--- a/board/atmel/at91sam9g20ek/nand.c (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/nand.c (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,79 @@ ++/* ++ * (C) Copyright 2007-2008 ++ * Stelian Pop ++ * Lead Tech Design ++ * ++ * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * 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 ++#include ++#include ++#include ++ ++#include ++ ++/* ++ * hardware specific access to control-lines ++ */ ++#define MASK_ALE (1 << 21) /* our ALE is AD21 */ ++#define MASK_CLE (1 << 22) /* our CLE is AD22 */ ++ ++static void at91sam9g20ek_nand_hwcontrol(struct mtd_info *mtd, int cmd) ++{ ++ struct nand_chip *this = mtd->priv; ++ ulong IO_ADDR_W = (ulong) this->IO_ADDR_W; ++ ++ IO_ADDR_W &= ~(MASK_ALE|MASK_CLE); ++ switch (cmd) { ++ case NAND_CTL_SETCLE: ++ IO_ADDR_W |= MASK_CLE; ++ break; ++ case NAND_CTL_SETALE: ++ IO_ADDR_W |= MASK_ALE; ++ break; ++ case NAND_CTL_CLRNCE: ++ at91_set_gpio_value(AT91_PIN_PC14, 1); ++ break; ++ case NAND_CTL_SETNCE: ++ at91_set_gpio_value(AT91_PIN_PC14, 0); ++ break; ++ } ++ this->IO_ADDR_W = (void *) IO_ADDR_W; ++} ++ ++static int at91sam9g20ek_nand_ready(struct mtd_info *mtd) ++{ ++ return at91_get_gpio_value(AT91_PIN_PC13); ++} ++ ++int board_nand_init(struct nand_chip *nand) ++{ ++ nand->eccmode = NAND_ECC_SOFT; ++#ifdef CFG_NAND_DBW_16 ++ nand->options = NAND_BUSWIDTH_16; ++#endif ++ nand->hwcontrol = at91sam9g20ek_nand_hwcontrol; ++ nand->dev_ready = at91sam9g20ek_nand_ready; ++ nand->chip_delay = 20; ++ ++ return 0; ++} +Index: board/atmel/at91sam9g20ek/at91sam9g20ek.c +=================================================================== +--- a/board/atmel/at91sam9g20ek/at91sam9g20ek.c (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/at91sam9g20ek.c (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,250 @@ ++/* ++ * (C) Copyright 2007-2008 ++ * Stelian Pop ++ * Lead Tech Design ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB) ++#include ++#endif ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++/* ------------------------------------------------------------------------- */ ++/* ++ * Miscelaneous platform dependent initialisations ++ */ ++ ++static void at91sam9g20ek_serial_hw_init(void) ++{ ++#ifdef CONFIG_USART0 ++ at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD0 */ ++ at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD0 */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0); ++#endif ++ ++#ifdef CONFIG_USART1 ++ at91_set_A_periph(AT91_PIN_PB6, 1); /* TXD1 */ ++ at91_set_A_periph(AT91_PIN_PB7, 0); /* RXD1 */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1); ++#endif ++ ++#ifdef CONFIG_USART2 ++ at91_set_A_periph(AT91_PIN_PB8, 1); /* TXD2 */ ++ at91_set_A_periph(AT91_PIN_PB9, 0); /* RXD2 */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2); ++#endif ++ ++#ifdef CONFIG_USART3 /* DBGU */ ++ at91_set_A_periph(AT91_PIN_PB14, 0); /* DRXD */ ++ at91_set_A_periph(AT91_PIN_PB15, 1); /* DTXD */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); ++#endif ++} ++ ++#ifdef CONFIG_CMD_NAND ++static void at91sam9g20ek_nand_hw_init(void) ++{ ++ unsigned long csa; ++ ++ /* Enable CS3 */ ++ csa = at91_sys_read(AT91_MATRIX_EBICSA); ++ at91_sys_write(AT91_MATRIX_EBICSA, ++ csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); ++ ++ /* Configure SMC CS3 for NAND/SmartMedia */ ++ at91_sys_write(AT91_SMC_SETUP(3), ++ AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(0) | ++ AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(0)); ++ at91_sys_write(AT91_SMC_PULSE(3), ++ AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(3) | ++ AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(3)); ++ at91_sys_write(AT91_SMC_CYCLE(3), ++ AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7)); ++ at91_sys_write(AT91_SMC_MODE(3), ++ AT91_SMC_READMODE | AT91_SMC_WRITEMODE | ++ AT91_SMC_EXNWMODE_DISABLE | ++#ifdef CFG_NAND_DBW_16 ++ AT91_SMC_DBW_16 | ++#else /* CFG_NAND_DBW_8 */ ++ AT91_SMC_DBW_8 | ++#endif ++ AT91_SMC_TDF_(3)); ++ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC); ++ ++ /* Configure RDY/BSY */ ++ at91_set_gpio_input(AT91_PIN_PC13, 1); ++ ++ /* Enable NandFlash */ ++ at91_set_gpio_output(AT91_PIN_PC14, 1); ++} ++#endif ++ ++#ifdef CONFIG_HAS_DATAFLASH ++static void at91sam9g20ek_spi_hw_init(void) ++{ ++ at91_set_A_periph(AT91_PIN_PA3, 0); /* SPI0_NPCS0 */ ++ at91_set_B_periph(AT91_PIN_PC11, 0); /* SPI0_NPCS1 */ ++ ++ at91_set_A_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */ ++ at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ ++ at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ ++ ++ /* Enable clock */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_SPI0); ++} ++#endif ++ ++#ifdef CONFIG_MACB ++static void at91sam9g20ek_macb_hw_init(void) ++{ ++ /* Enable clock */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_EMAC); ++ ++ /* ++ * Disable pull-up on: ++ * RXDV (PA17) => PHY normal mode (not Test mode) ++ * ERX0 (PA14) => PHY ADDR0 ++ * ERX1 (PA15) => PHY ADDR1 ++ * ERX2 (PA25) => PHY ADDR2 ++ * ERX3 (PA26) => PHY ADDR3 ++ * ECRS (PA28) => PHY ADDR4 => PHYADDR = 0x0 ++ * ++ * PHY has internal pull-down ++ */ ++ writel(pin_to_mask(AT91_PIN_PA14) | ++ pin_to_mask(AT91_PIN_PA15) | ++ pin_to_mask(AT91_PIN_PA17) | ++ pin_to_mask(AT91_PIN_PA25) | ++ pin_to_mask(AT91_PIN_PA26) | ++ pin_to_mask(AT91_PIN_PA28), ++ pin_to_controller(AT91_PIN_PA0) + PIO_PUDR); ++ ++ /* Need to reset PHY -> 500ms reset */ ++ at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | ++ (AT91_RSTC_ERSTL & (0x0D << 8)) | ++ AT91_RSTC_URSTEN); ++ ++ at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST); ++ ++ /* Wait for end hardware reset */ ++ while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL)); ++ ++ /* Restore NRST value */ ++ at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | ++ (AT91_RSTC_ERSTL & (0x0 << 8)) | ++ AT91_RSTC_URSTEN); ++ ++ /* Re-enable pull-up */ ++ writel(pin_to_mask(AT91_PIN_PA14) | ++ pin_to_mask(AT91_PIN_PA15) | ++ pin_to_mask(AT91_PIN_PA17) | ++ pin_to_mask(AT91_PIN_PA25) | ++ pin_to_mask(AT91_PIN_PA26) | ++ pin_to_mask(AT91_PIN_PA28), ++ pin_to_controller(AT91_PIN_PA0) + PIO_PUER); ++ ++ at91_set_A_periph(AT91_PIN_PA19, 0); /* ETXCK_EREFCK */ ++ at91_set_A_periph(AT91_PIN_PA17, 0); /* ERXDV */ ++ at91_set_A_periph(AT91_PIN_PA14, 0); /* ERX0 */ ++ at91_set_A_periph(AT91_PIN_PA15, 0); /* ERX1 */ ++ at91_set_A_periph(AT91_PIN_PA18, 0); /* ERXER */ ++ at91_set_A_periph(AT91_PIN_PA16, 0); /* ETXEN */ ++ at91_set_A_periph(AT91_PIN_PA12, 0); /* ETX0 */ ++ at91_set_A_periph(AT91_PIN_PA13, 0); /* ETX1 */ ++ at91_set_A_periph(AT91_PIN_PA21, 0); /* EMDIO */ ++ at91_set_A_periph(AT91_PIN_PA20, 0); /* EMDC */ ++ ++#ifndef CONFIG_RMII ++ at91_set_B_periph(AT91_PIN_PA28, 0); /* ECRS */ ++ at91_set_B_periph(AT91_PIN_PA29, 0); /* ECOL */ ++ at91_set_B_periph(AT91_PIN_PA25, 0); /* ERX2 */ ++ at91_set_B_periph(AT91_PIN_PA26, 0); /* ERX3 */ ++ at91_set_B_periph(AT91_PIN_PA27, 0); /* ERXCK */ ++#if defined(CONFIG_AT91SAM9G20EK) ++ /* ++ * use PA10, PA11 for ETX2, ETX3. ++ * PA23 and PA24 are for TWI EEPROM ++ */ ++ at91_set_B_periph(AT91_PIN_PA10, 0); /* ETX2 */ ++ at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */ ++#else ++ at91_set_B_periph(AT91_PIN_PA23, 0); /* ETX2 */ ++ at91_set_B_periph(AT91_PIN_PA24, 0); /* ETX3 */ ++#endif ++ at91_set_B_periph(AT91_PIN_PA22, 0); /* ETXER */ ++#endif ++ ++} ++#endif ++ ++int board_init(void) ++{ ++ /* Enable Ctrlc */ ++ console_init_f(); ++ ++ /* arch number of AT91SAM9G20EK-Board */ ++ gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G20EK; ++ /* adress of boot parameters */ ++ gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; ++ ++ at91sam9g20ek_serial_hw_init(); ++#ifdef CONFIG_CMD_NAND ++ at91sam9g20ek_nand_hw_init(); ++#endif ++#ifdef CONFIG_HAS_DATAFLASH ++ at91sam9g20ek_spi_hw_init(); ++#endif ++#ifdef CONFIG_MACB ++ at91sam9g20ek_macb_hw_init(); ++#endif ++ ++ return 0; ++} ++ ++int dram_init(void) ++{ ++ gd->bd->bi_dram[0].start = PHYS_SDRAM; ++ gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; ++ return 0; ++} ++ ++#ifdef CONFIG_RESET_PHY_R ++void reset_phy(void) ++{ ++#ifdef CONFIG_MACB ++ /* ++ * Initialize ethernet HW addr prior to starting Linux, ++ * needed for nfsroot ++ */ ++ eth_init(gd->bd); ++#endif ++} ++#endif +Index: board/atmel/at91sam9g20ek/led.c +=================================================================== +--- a/board/atmel/at91sam9g20ek/led.c (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/led.c (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,64 @@ ++/* ++ * (C) Copyright 2007-2008 ++ * Stelian Pop ++ * Lead Tech Design ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * 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 ++#include ++#include ++#include ++#include ++ ++#define RED_LED AT91_PIN_PA9 /* this is the power led */ ++#define GREEN_LED AT91_PIN_PA6 /* this is the user led */ ++ ++void red_LED_on(void) ++{ ++ at91_set_gpio_value(RED_LED, 1); ++} ++ ++void red_LED_off(void) ++{ ++ at91_set_gpio_value(RED_LED, 0); ++} ++ ++void green_LED_on(void) ++{ ++ at91_set_gpio_value(GREEN_LED, 0); ++} ++ ++void green_LED_off(void) ++{ ++ at91_set_gpio_value(GREEN_LED, 1); ++} ++ ++void coloured_LED_init(void) ++{ ++ /* Enable clock */ ++ at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOA); ++ ++ at91_set_gpio_output(RED_LED, 1); ++ at91_set_gpio_output(GREEN_LED, 1); ++ ++ at91_set_gpio_value(RED_LED, 0); ++ at91_set_gpio_value(GREEN_LED, 1); ++} +Index: board/atmel/at91sam9g20ek/partition.c +=================================================================== +--- a/board/atmel/at91sam9g20ek/partition.c (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/partition.c (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,40 @@ ++/* ++ * (C) Copyright 2008 ++ * Ulf Samuelsson ++ * ++ * 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 ++#include ++#include ++#include ++ ++AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS]; ++ ++struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = { ++ {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ ++ {CFG_DATAFLASH_LOGIC_ADDR_CS1, 1} ++}; ++ ++/*define the area offsets*/ ++dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { ++ {0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, ++ {0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, ++ {0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, ++ {0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, ++ {0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, ++}; +Index: board/atmel/at91sam9g20ek/config.mk +=================================================================== +--- a/board/atmel/at91sam9g20ek/config.mk (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/config.mk (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1 @@ ++TEXT_BASE = 0x23f00000 +Index: board/atmel/at91sam9g20ek/Makefile +=================================================================== +--- a/board/atmel/at91sam9g20ek/Makefile (.../u-boot-1.3.4) (revision 0) ++++ b/board/atmel/at91sam9g20ek/Makefile (.../u-boot-1.3.4-exp) (revision 8417) +@@ -0,0 +1,57 @@ ++# ++# (C) Copyright 2003-2008 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# (C) Copyright 2008 ++# Stelian Pop ++# Lead Tech Design ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# 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 $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS-y += at91sam9g20ek.o ++COBJS-y += led.o ++COBJS-y += partition.o ++COBJS-$(CONFIG_CMD_NAND) += nand.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS-y)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) $(SOBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak $(obj).depend ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +Index: include/asm-arm/arch-at91/hardware.h +=================================================================== +--- a/include/asm-arm/arch-at91/hardware.h (.../u-boot-1.3.4) (revision 8417) ++++ b/include/asm-arm/arch-at91/hardware.h (.../u-boot-1.3.4-exp) (revision 8417) +@@ -18,7 +18,7 @@ + + #if defined(CONFIG_AT91RM9200) + #include +-#elif defined(CONFIG_AT91SAM9260) ++#elif defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9G20) + #include + #define AT91_BASE_EMAC AT91SAM9260_BASE_EMAC + #define AT91_BASE_SPI AT91SAM9260_BASE_SPI0 +diff -urN u-boot-2008.10-0rig/include/asm-arm/mach-types.h u-boot-2008.10/include/asm-arm/mach-types.h +--- u-boot-2008.10-0rig/include/asm-arm/mach-types.h 2008-10-18 21:30:31.000000000 +0200 ++++ u-boot-2008.10/include/asm-arm/mach-types.h 2008-12-28 23:40:55.000000000 +0100 +@@ -23998,6 +23998,18 @@ + # define machine_is_geneva() (0) + #endif + ++#ifdef CONFIG_MACH_AT91SAM9G20EK ++# ifdef machine_arch_type ++# undef machine_arch_type ++# define machine_arch_type __machine_arch_type ++# else ++# define machine_arch_type MACH_TYPE_AT91SAM9G20EK ++# endif ++# define machine_is_at91sam9g20ek() (machine_arch_type == MACH_TYPE_AT91SAM9G20EK) ++#else ++# define machine_is_at91sam9g20ek() (0) ++#endif ++ + /* + * These have not yet been registered + */ +diff -urN u-boot-2008.10-0rig/board/atmel/at91sam9g20ek/at91sam9g20ek.c u-boot-2008.10/board/atmel/at91sam9g20ek/at91sam9g20ek.c +--- u-boot-2008.10-0rig/board/atmel/at91sam9g20ek/at91sam9g20ek.c 2008-12-28 14:09:52.000000000 +0100 ++++ u-boot-2008.10/board/atmel/at91sam9g20ek/at91sam9g20ek.c 2008-12-28 23:56:09.000000000 +0100 +@@ -248,3 +248,13 @@ + #endif + } + #endif ++ ++int board_eth_init(bd_t *bis) ++{ ++ int rc = 0; ++#ifdef CONFIG_MACB ++ rc = macb_eth_initialize(0, (void *)AT91_BASE_EMAC, 0x00); ++#endif ++ return rc; ++} ++ diff --git a/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-003-drivers-net-macb.c.patch b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-003-drivers-net-macb.c.patch new file mode 100644 index 0000000000..81ab7c6e6e --- /dev/null +++ b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-exp-003-drivers-net-macb.c.patch @@ -0,0 +1,28 @@ +diff -urN u-boot-2008.10-0rig/drivers/net/macb.c u-boot-2008.10/drivers/net/macb.c +--- u-boot-2008.10-0rig/drivers/net/macb.c 2008-10-18 21:30:31.000000000 +0200 ++++ u-boot-2008.10/drivers/net/macb.c 2008-12-28 23:44:11.000000000 +0100 +@@ -415,18 +415,16 @@ + + /* choose RMII or MII mode. This depends on the board */ + #ifdef CONFIG_RMII +-#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ +- defined(CONFIG_AT91SAM9263) +- macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); +-#else ++#if defined(CONFIG_AVR32) + macb_writel(macb, USRIO, 0); +-#endif + #else +-#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ +- defined(CONFIG_AT91SAM9263) +- macb_writel(macb, USRIO, MACB_BIT(CLKEN)); ++ macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); ++#endif + #else ++#if defined(CONFIG_AVR32) + macb_writel(macb, USRIO, MACB_BIT(MII)); ++#else ++ macb_writel(macb, USRIO, MACB_BIT(CLKEN)); + #endif + #endif /* CONFIG_RMII */ + diff --git a/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-include_asm-avr32_io.h.patch.avr32 b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-include_asm-avr32_io.h.patch.avr32 new file mode 100644 index 0000000000..07cddb0001 --- /dev/null +++ b/recipes/u-boot/u-boot-2009.01/u-boot-2009.01-include_asm-avr32_io.h.patch.avr32 @@ -0,0 +1,13 @@ +diff -urN u-boot-2009.01-rc3/include/asm-avr32/io.h u-boot-avr32//include/asm-avr32/io.h +--- u-boot-2009.01-rc3/include/asm-avr32/io.h 2009-01-18 21:37:48.000000000 +0100 ++++ u-boot-avr32//include/asm-avr32/io.h 2009-01-22 07:14:38.000000000 +0100 +@@ -125,9 +125,4 @@ + + } + +-static inline phys_addr_t virt_to_phys(void * vaddr) +-{ +- return (phys_addr_t)(vaddr); +-} +- + #endif /* __ASM_AVR32_IO_H */ diff --git a/recipes/u-boot/u-boot_2009.01.bb b/recipes/u-boot/u-boot_2009.01.bb new file mode 100644 index 0000000000..fd1801a29b --- /dev/null +++ b/recipes/u-boot/u-boot_2009.01.bb @@ -0,0 +1,28 @@ +require u-boot.inc + +PV = "2009.01" + +DEFAULT_PREFERENCE = "-1" + +DEFAULT_PREFERENCE_at91rm9200dk = "1" +DEFAULT_PREFERENCE_at91sam9rlek = "1" +DEFAULT_PREFERENCE_at91sam9260ek = "1" +DEFAULT_PREFERENCE_at91sam9261ek = "1" +DEFAULT_PREFERENCE_at91sam9g20ek = "1" +DEFAULT_PREFERENCE_at91sam9263ek = "1" +DEFAULT_PREFERENCE_at91cap9adk = "1" +DEFAULT_PREFERENCE_atngw100 = "1" +DEFAULT_PREFERENCE_atstk1000 = "1" + +PR = "r1" + +SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-${PV}.tar.bz2" + +SRC_URI_append_at91sam9263ek = "\ + file://u-boot-2009.01-exp-002-at91sam9g20ek.patch;patch=1 \ + file://u-boot-2009.01-exp-003-drivers-net-macb.c.patch;patch=1 \ + " + +PACKAGE_ARCH = "${MACHINE_ARCH}" +PARALLEL_MAKE = "" + -- cgit v1.2.3 From 2604bdcde32fcf3b66769479b47499faa442a19b Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:34:05 +0100 Subject: Add linux-2.6.28 support for SAM9260/1/SAM9G20/ATNGW100 --- .../at91sam9260dfc/at91sam9260dfc_defconfig | 1640 +++++++++++++++++++ .../at91sam9261ek/at91sam9261ek_defconfig | 1432 +++++++++++++++++ .../at91sam9g20dfc/at91sam9g20dfc_defconfig | 1650 ++++++++++++++++++++ .../linux/linux-2.6.28/atngw100/atngw100_defconfig | 1277 +++++++++++++++ 4 files changed, 5999 insertions(+) create mode 100644 recipes/linux/linux-2.6.28/at91sam9260dfc/at91sam9260dfc_defconfig create mode 100644 recipes/linux/linux-2.6.28/at91sam9261ek/at91sam9261ek_defconfig create mode 100644 recipes/linux/linux-2.6.28/at91sam9g20dfc/at91sam9g20dfc_defconfig create mode 100644 recipes/linux/linux-2.6.28/atngw100/atngw100_defconfig diff --git a/recipes/linux/linux-2.6.28/at91sam9260dfc/at91sam9260dfc_defconfig b/recipes/linux/linux-2.6.28/at91sam9260dfc/at91sam9260dfc_defconfig new file mode 100644 index 0000000000..9b01dc06a6 --- /dev/null +++ b/recipes/linux/linux-2.6.28/at91sam9260dfc/at91sam9260dfc_defconfig @@ -0,0 +1,1640 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28 +# Mon Jan 5 14:25:53 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +CONFIG_ARCH_AT91SAM9260=y +# CONFIG_ARCH_AT91SAM9261 is not set +# CONFIG_ARCH_AT91SAM9263 is not set +# CONFIG_ARCH_AT91SAM9RL is not set +# CONFIG_ARCH_AT91SAM9G20 is not set +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9260 Variants +# +# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set + +# +# AT91SAM9260 / AT91SAM9XE Board Type +# +CONFIG_MACH_AT91SAM9260EK=y +# CONFIG_MACH_CAM60 is not set +# CONFIG_MACH_SAM9_L9260 is not set +# CONFIG_MACH_AFEB9260 is not set +# CONFIG_MACH_USB_A9260 is not set +# CONFIG_MACH_QIL_A9260 is not set + +# +# AT91 Board Options +# +CONFIG_MTD_AT91_DATAFLASH_CARD=y +# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +CONFIG_AT91_PROGRAMMABLE_CLOCKS=y +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +CONFIG_ARCH_FLATMEM_HAS_HOLES=y +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +CONFIG_LEDS=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x20410000,3145728 root=/dev/ram0 rw" +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# CPU Power Management +# +# CONFIG_CPU_IDLE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETLABEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +CONFIG_IP_SCTP=y +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y +# CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set +# CONFIG_MTD_DATAFLASH_OTP is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_ATMEL is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +CONFIG_MTD_ONENAND=y +CONFIG_MTD_ONENAND_VERIFY_WRITE=y +# CONFIG_MTD_ONENAND_GENERIC is not set +# CONFIG_MTD_ONENAND_OTP is not set +# CONFIG_MTD_ONENAND_2X_PROGRAM is not set +# CONFIG_MTD_ONENAND_SIM is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=15360 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ATMEL_TCLIB is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_ICS932S401 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_DH is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +CONFIG_DAVICOM_PHY=y +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACB=y +CONFIG_MACB_TX_SRAM=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set +# CONFIG_ENC28J60 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +CONFIG_NETDEV_1000=y +CONFIG_NETDEV_10000=y + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=y +# CONFIG_PPP_SYNC_TTY is not set +# CONFIG_PPP_DEFLATE is not set +# CONFIG_PPP_BSDCOMP is not set +# CONFIG_PPP_MPPE is not set +# CONFIG_PPPOE is not set +# CONFIG_PPPOL2TP is not set +# CONFIG_SLIP is not set +CONFIG_SLHC=y +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_HELPER_AUTO=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_SIMTEC is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_STUB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_DS1682 is not set +# CONFIG_AT24 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_PCF8575 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7473 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_AT91SAM9X_WATCHDOG is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM8350_I2C is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_SOUND=y +# CONFIG_SOUND_OSS_CORE is not set +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_MIXER_OSS is not set +# CONFIG_SND_PCM_OSS is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_ARM=y +# CONFIG_SND_AT91_AC97 is not set +CONFIG_SND_SPI=y +CONFIG_SND_AT73C213=y +CONFIG_SND_AT73C213_TARGET_BITRATE=48000 +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +CONFIG_SND_SOC=y +CONFIG_SND_ATMEL_SOC=y +# CONFIG_SND_SOC_ALL_CODECS is not set +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +CONFIG_HID_A4TECH=y +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BRIGHT=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DELL=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GYRATION=y +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SUNPLUS=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +CONFIG_USB_DEBUG=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set +CONFIG_USB_MON=y +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; +# + +# +# see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +# CONFIG_USB_EZUSB is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CP2101 is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_FUNSOFT is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MOTOROLA is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_HP4X is not set +# CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_SELECTED=y +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=y +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +# CONFIG_USB_ZERO is not set +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_AT91=y +# CONFIG_MMC_SPI is not set +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_PCA955X is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_AT91SAM9 is not set +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +# CONFIG_UIO is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SYSV68_PARTITION is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=y +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +CONFIG_NLS_CODEPAGE_865=y +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=y +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set +CONFIG_DLM=y +# CONFIG_DLM_DEBUG is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +CONFIG_SECURITY=y +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_NETWORK is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_SECURITY_ROOTPLUG is not set +CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0 +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=y +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=m +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/recipes/linux/linux-2.6.28/at91sam9261ek/at91sam9261ek_defconfig b/recipes/linux/linux-2.6.28/at91sam9261ek/at91sam9261ek_defconfig new file mode 100644 index 0000000000..9cdb7074f1 --- /dev/null +++ b/recipes/linux/linux-2.6.28/at91sam9261ek/at91sam9261ek_defconfig @@ -0,0 +1,1432 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28.1 +# Fri Jan 23 19:10:00 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y +CONFIG_FREEZER=y + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +# CONFIG_ARCH_AT91SAM9260 is not set +CONFIG_ARCH_AT91SAM9261=y +# CONFIG_ARCH_AT91SAM9263 is not set +# CONFIG_ARCH_AT91SAM9RL is not set +# CONFIG_ARCH_AT91SAM9G20 is not set +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9261 Board Type +# +CONFIG_MACH_AT91SAM9261EK=y + +# +# AT91 Board Options +# +# CONFIG_MTD_AT91_DATAFLASH_CARD is not set +# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +CONFIG_AT91_PROGRAMMABLE_CLOCKS=y +# CONFIG_AT91_SLOW_CLOCK is not set +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +CONFIG_ARCH_FLATMEM_HAS_HOLES=y +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +CONFIG_LEDS=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# CPU Power Management +# +# CONFIG_CPU_IDLE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_SLEEP=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_APM_EMULATION is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=y +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y +# CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set +# CONFIG_MTD_DATAFLASH_OTP is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +CONFIG_MTD_NAND_ATMEL=y +# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set +# CONFIG_MTD_NAND_ATMEL_ECC_HW_HSIAO is not set +CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y +# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=8192 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ATMEL_TCLIB is not set +# CONFIG_EEPROM_93CX6 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +CONFIG_DM9000=y +CONFIG_DM9000_DEBUGLEVEL=4 +# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set +# CONFIG_ENC28J60 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=y +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_I2C is not set +CONFIG_SPI=y +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D15605 is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_ATMEL=y +CONFIG_FB_INTSRAM=y +# CONFIG_FB_ATMEL_STN is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=y +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +# CONFIG_LCD_PLATFORM is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_ATMEL_LCDC=y +# CONFIG_BACKLIGHT_CORGI is not set + +# +# Display device support +# +CONFIG_DISPLAY_SUPPORT=y + +# +# Display hardware drivers +# + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +# CONFIG_LOGO is not set +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_SEQUENCER=y +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_ARM=y +# CONFIG_SND_AT91_AC97 is not set +CONFIG_SND_SPI=y +CONFIG_SND_AT73C213=y +CONFIG_SND_AT73C213_TARGET_BITRATE=48000 +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_SOC is not set +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +CONFIG_HID_A4TECH=y +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BRIGHT=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DELL=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GYRATION=y +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SUNPLUS=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_DEVICE_CLASS is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set +CONFIG_USB_MON=y +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; +# + +# +# see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_SELECTED=y +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=y +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +CONFIG_USB_ZERO=m +# CONFIG_USB_ETH is not set +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_AT91=y +# CONFIG_MMC_SPI is not set +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_AT91SAM9=y +CONFIG_RTC_DRV_AT91SAM9_RTT=0 +CONFIG_RTC_DRV_AT91SAM9_GPBR=0 +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +# CONFIG_UIO is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=y +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=y +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_KERNEL is not set +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_FRAME_POINTER=y +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_DEBUG_USER=y + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +# CONFIG_CRYPTO_MANAGER is not set +# CONFIG_CRYPTO_MANAGER2 is not set +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +# CONFIG_CRYPTO_CBC is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/recipes/linux/linux-2.6.28/at91sam9g20dfc/at91sam9g20dfc_defconfig b/recipes/linux/linux-2.6.28/at91sam9g20dfc/at91sam9g20dfc_defconfig new file mode 100644 index 0000000000..58242c5e8d --- /dev/null +++ b/recipes/linux/linux-2.6.28/at91sam9g20dfc/at91sam9g20dfc_defconfig @@ -0,0 +1,1650 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28 +# Mon Jan 5 14:47:44 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +# CONFIG_ARCH_AT91SAM9260 is not set +# CONFIG_ARCH_AT91SAM9261 is not set +# CONFIG_ARCH_AT91SAM9263 is not set +# CONFIG_ARCH_AT91SAM9RL is not set +CONFIG_ARCH_AT91SAM9G20=y +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9G20 Board Type +# +CONFIG_MACH_AT91SAM9G20EK=y + +# +# AT91 Board Options +# +CONFIG_MTD_AT91_DATAFLASH_CARD=y +# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +CONFIG_AT91_PROGRAMMABLE_CLOCKS=y +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +CONFIG_ARCH_FLATMEM_HAS_HOLES=y +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +CONFIG_LEDS=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x20410000,3145728 root=/dev/ram0 rw" +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# CPU Power Management +# +# CONFIG_CPU_IDLE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETLABEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +CONFIG_IP_SCTP=y +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y +# CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set +# CONFIG_MTD_DATAFLASH_OTP is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_ATMEL is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +CONFIG_MTD_ONENAND=y +CONFIG_MTD_ONENAND_VERIFY_WRITE=y +# CONFIG_MTD_ONENAND_GENERIC is not set +# CONFIG_MTD_ONENAND_OTP is not set +# CONFIG_MTD_ONENAND_2X_PROGRAM is not set +# CONFIG_MTD_ONENAND_SIM is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=15360 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ATMEL_TCLIB is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_ICS932S401 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_DH is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +CONFIG_DAVICOM_PHY=y +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACB=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set +# CONFIG_ENC28J60 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=y +# CONFIG_PPP_SYNC_TTY is not set +# CONFIG_PPP_DEFLATE is not set +# CONFIG_PPP_BSDCOMP is not set +# CONFIG_PPP_MPPE is not set +# CONFIG_PPPOE is not set +# CONFIG_PPPOL2TP is not set +# CONFIG_SLIP is not set +CONFIG_SLHC=y +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +CONFIG_I2C_GPIO=y +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_SIMTEC is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_STUB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_DS1682 is not set +CONFIG_AT24=m +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_PCF8575 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7473 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_AT91SAM9X_WATCHDOG is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM8350_I2C is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_SOUND=y +# CONFIG_SOUND_OSS_CORE is not set +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_MIXER_OSS is not set +# CONFIG_SND_PCM_OSS is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_ARM=y +# CONFIG_SND_AT91_AC97 is not set +CONFIG_SND_SPI=y +CONFIG_SND_AT73C213=m +CONFIG_SND_AT73C213_TARGET_BITRATE=48000 +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +CONFIG_SND_SOC=y +CONFIG_SND_ATMEL_SOC=y +CONFIG_SND_ATMEL_SOC_SSC=y +CONFIG_SND_AT91_SOC_SAM9G20_WM8731=y +CONFIG_SND_SOC_ALL_CODECS=y +CONFIG_SND_SOC_AD73311=y +CONFIG_SND_SOC_AK4535=y +CONFIG_SND_SOC_CS4270=y +CONFIG_SND_SOC_SSM2602=y +CONFIG_SND_SOC_TLV320AIC23=y +CONFIG_SND_SOC_TLV320AIC26=y +CONFIG_SND_SOC_TLV320AIC3X=y +CONFIG_SND_SOC_UDA1380=y +CONFIG_SND_SOC_WM8510=y +CONFIG_SND_SOC_WM8580=y +CONFIG_SND_SOC_WM8731=y +CONFIG_SND_SOC_WM8750=y +CONFIG_SND_SOC_WM8753=y +CONFIG_SND_SOC_WM8900=y +CONFIG_SND_SOC_WM8903=y +CONFIG_SND_SOC_WM8971=y +CONFIG_SND_SOC_WM8990=y +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +CONFIG_HID_A4TECH=y +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BRIGHT=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DELL=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GYRATION=y +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SUNPLUS=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +CONFIG_USB_DEBUG=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set +CONFIG_USB_MON=y +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; +# + +# +# see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +# CONFIG_USB_EZUSB is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CP2101 is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_FUNSOFT is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MOTOROLA is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_HP4X is not set +# CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_SELECTED=y +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=y +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +# CONFIG_USB_ZERO is not set +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_AT91=y +# CONFIG_MMC_SPI is not set +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_PCA955X is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_AT91SAM9 is not set +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +# CONFIG_UIO is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SYSV68_PARTITION is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=y +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +CONFIG_NLS_CODEPAGE_865=y +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +CONFIG_NLS_ISO8859_15=y +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set +CONFIG_DLM=y +# CONFIG_DLM_DEBUG is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +CONFIG_SECURITY=y +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_NETWORK is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_SECURITY_ROOTPLUG is not set +CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0 +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=y +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=m +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/recipes/linux/linux-2.6.28/atngw100/atngw100_defconfig b/recipes/linux/linux-2.6.28/atngw100/atngw100_defconfig new file mode 100644 index 0000000000..b4f78d0794 --- /dev/null +++ b/recipes/linux/linux-2.6.28/atngw100/atngw100_defconfig @@ -0,0 +1,1277 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.27.10 +# Tue Jan 6 09:24:25 2009 +# +CONFIG_AVR32=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_BUG=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +# CONFIG_BASE_FULL is not set +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +CONFIG_KPROBES=y +# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set +# CONFIG_HAVE_IOREMAP_PROT is not set +CONFIG_HAVE_KPROBES=y +# CONFIG_HAVE_KRETPROBES is not set +# CONFIG_HAVE_ARCH_TRACEHOOK is not set +# CONFIG_HAVE_DMA_ATTRS is not set +# CONFIG_USE_GENERIC_SMP_HELPERS is not set +CONFIG_HAVE_CLK=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=1 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +# CONFIG_IOSCHED_AS is not set +# CONFIG_IOSCHED_DEADLINE is not set +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_CLASSIC_RCU=y + +# +# System Type and features +# +# CONFIG_TICK_ONESHOT is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_SUBARCH_AVR32B=y +CONFIG_MMU=y +CONFIG_PERFORMANCE_COUNTERS=y +CONFIG_PLATFORM_AT32AP=y +CONFIG_CPU_AT32AP700X=y +CONFIG_CPU_AT32AP7000=y +# CONFIG_BOARD_ATSTK1000 is not set +CONFIG_BOARD_ATNGW100=y +CONFIG_LOADER_U_BOOT=y + +# +# Atmel AVR32 AP options +# +# CONFIG_AP700X_32_BIT_SMC is not set +CONFIG_AP700X_16_BIT_SMC=y +# CONFIG_AP700X_8_BIT_SMC is not set +CONFIG_LOAD_ADDRESS=0x10000000 +CONFIG_ENTRY_ADDRESS=0x90000000 +CONFIG_PHYS_OFFSET=0x10000000 +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +CONFIG_QUICKLIST=y +# CONFIG_HAVE_ARCH_BOOTMEM_NODE is not set +# CONFIG_ARCH_HAVE_MEMORY_PRESENT is not set +# CONFIG_NEED_NODE_MEMMAP_SIZE is not set +CONFIG_ARCH_FLATMEM_ENABLE=y +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +# CONFIG_ARCH_SPARSEMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_NR_QUICK=2 +CONFIG_VIRT_TO_BUS=y +# CONFIG_OWNERSHIP_TRACE is not set +# CONFIG_NMI_DEBUGGING is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set +CONFIG_CMDLINE="" + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +# CONFIG_CPU_FREQ_DEBUG is not set +# CONFIG_CPU_FREQ_STAT is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_AT32AP=y + +# +# Bus options +# +# CONFIG_ARCH_SUPPORTS_MSI is not set +# CONFIG_PCCARD is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_USER=y +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=y +CONFIG_NET_KEY=y +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IP_MULTIPLE_TABLES is not set +# CONFIG_IP_ROUTE_MULTIPATH is not set +# CONFIG_IP_ROUTE_VERBOSE is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +# CONFIG_IP_PIMSM_V2 is not set +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IP_VS is not set +CONFIG_IPV6=y +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +# CONFIG_IPV6_MIP6 is not set +CONFIG_INET6_XFRM_TUNNEL=y +CONFIG_INET6_TUNNEL=y +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CT_ACCT=y +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_EVENTS is not set +# CONFIG_NF_CT_PROTO_DCCP is not set +CONFIG_NF_CT_PROTO_GRE=m +# CONFIG_NF_CT_PROTO_SCTP is not set +# CONFIG_NF_CT_PROTO_UDPLITE is not set +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +# CONFIG_NF_CT_NETLINK is not set +CONFIG_NETFILTER_XTABLES=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +CONFIG_NETFILTER_XT_MATCH_REALM=m +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +# CONFIG_IP_NF_QUEUE is not set +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PROTO_GRE=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +CONFIG_STP=m +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_DECNET is not set +CONFIG_LLC=m +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set +CONFIG_NET_CLS_ROUTE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_TCPPROBE is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set + +# +# Wireless +# +# CONFIG_CFG80211 is not set +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +# CONFIG_PREVENT_FIRMWARE_BUILD is not set +# CONFIG_FW_LOADER is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_CFI_INTELEXT is not set +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x80000000 +CONFIG_MTD_PHYSMAP_LEN=0x0 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=m +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_MISC_DEVICES is not set +# CONFIG_HAVE_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_DMA is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +# CONFIG_MII is not set +CONFIG_MACB=y +# CONFIG_ENC28J60 is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_WAN is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +# CONFIG_PPPOL2TP is not set +# CONFIG_SLIP is not set +CONFIG_SLHC=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set +# CONFIG_PHONE is not set + +# +# Input device support +# +# CONFIG_INPUT is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_I2C=m +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=m + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +CONFIG_I2C_GPIO=m +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_SIMTEC is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_STUB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_DS1682 is not set +# CONFIG_AT24 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_PCF8575 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_TPS65010 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +CONFIG_SPI_SPIDEV=m +# CONFIG_SPI_TLE62X0 is not set +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIOLIB=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set + +# +# I2C GPIO expanders: +# +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set + +# +# PCI GPIO expanders: +# + +# +# SPI GPIO expanders: +# +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MCP23S08 is not set +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_AT32AP700X_WDT=y + +# +# Sonics Silicon Backplane +# +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_SOUND is not set +CONFIG_USB_SUPPORT=y +# CONFIG_USB_ARCH_HAS_HCD is not set +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_AMD5536UDC is not set +CONFIG_USB_GADGET_ATMEL_USBA=y +CONFIG_USB_ATMEL_USBA=y +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_ATMELMCI is not set +CONFIG_MMC_SPI=m +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_PCA955X is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_AT32AP700X=y +# CONFIG_DMADEVICES is not set +# CONFIG_UIO is not set + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=m +# CONFIG_EXT3_FS_XATTR is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=m +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_DNOTIFY is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=m + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=850 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +CONFIG_ROOT_NFS=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +# CONFIG_NFSD_V4 is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_EXPERIMENTAL is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=m +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=m +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=m +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_KPROBES_SANITY_TEST is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_LKDTM is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_SAMPLES is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_MANAGER=y +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=y +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=m +# CONFIG_CRYPTO_LRW is not set +CONFIG_CRYPTO_PCBC=m +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=m +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +# CONFIG_CRYPTO_LZO is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_GENERIC_FIND_FIRST_BIT is not set +# CONFIG_GENERIC_FIND_NEXT_BIT is not set +CONFIG_CRC_CCITT=m +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +CONFIG_CRC7=m +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y -- cgit v1.2.3 From 2b0bd3ae7fa508106813113f12f3a4e11e03101f Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:39:44 +0100 Subject: Add checksums for new packages --- conf/checksums.ini | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/conf/checksums.ini b/conf/checksums.ini index fbe1bc77bb..8a7fc457e1 100644 --- a/conf/checksums.ini +++ b/conf/checksums.ini @@ -1846,10 +1846,22 @@ sha256=3ec786e6df9e1a935aff4848b6989cad8f87c1fa8813dc033b338e18b17138d8 md5=b47d4fa958aaf83916b6a917626102cd sha256=9d1fff10d391cb64890bb8e0050d3f023520a8dd5aee43c4d3f9c6f8611da668 +[ftp://www.at91.com/pub/buildroot/at91bootstrap-2.10.tar.bz2] +md5=a3bcd50138d29c1d23a0d378edb52dfe +sha256=019b98442d4debcd74d759043884b4b0ed48a2bef425649bfe3061d00e854fc5 + [ftp://www.at91.com/pub/buildroot/at91bootstrap-2.3.tar.bz2] md5=a29b3f07e623d20894ab23335daf5da5 sha256=d598d078c24a24b13eac8a219a4ab05499909404cbd4efcb8641fdcde28464c0 +[ftp://www.at91.com/pub/buildroot/at91bootstrap-2.4.tar.bz2] +md5=10161158f116e0b171582a2f66854af1 +sha256=c01e579401453ae97bd7671997d4b3d3b63e25e7e1e9cec02611a944ad1727fa + +[ftp://www.at91.com/pub/buildroot/at91bootstrap-2.8.tar.bz2] +md5=117b73e2bf1f8d52afe6e742e33444a6 +sha256=a5647ea3761560d7ee1baecea3f09c942f10441e60c6ddd3bad6a450d84a3918 + [ftp://ftp.debian.org/debian/pool/main/a/at/at_3.1.8-11.tar.gz] md5=81dbae5162aaa8a398a81424d6631c77 sha256=0d77c73a3c151a7da647dd924f32151e5ee4574530568fd65067882f79cd5a44 @@ -22650,6 +22662,14 @@ sha256=8ab07cd758a1775642629e624f70e376fa8e84a2f879dee4544158d9c90cde2a md5=ca12b805b4f2bdcf15733be3fe22e896 sha256=096aa286d923b7cc356bbe0dda0a29a701369deeb27ada1a2f053155aa403c31 +[ftp://ftp.denx.de/pub/u-boot/u-boot-2008.10.tar.bz2] +md5=9d7758c475068a8452430f18d1751566 +sha256=5cd64b5ac52720a7f60015e01696422277ecc459e89dce8b16d457f30a9409ab + +[ftp://ftp.denx.de/pub/u-boot/u-boot-2009.01.tar.bz2] +md5=cb11d3d74eee4d31124523d90d8c31fa +sha256=0c0afa2816482e087987f71958b656ff0c122032f5e3897a8d17daca5bc14115 + [http://linux.omap.com/pub/bootloader/2430sdp/source/u-boot-SEP1106.tar.gz] md5=49c07dec9e1be69fd01d46f47ec03731 sha256=a090786113b02647413ebc15888af269f2e6d50f73cbb94b0619cc1702911dae -- cgit v1.2.3 From fba2f2496d1855a307b8279ff947c770ad507e0b Mon Sep 17 00:00:00 2001 From: Ulf Samuelsson Date: Fri, 13 Mar 2009 20:42:25 +0100 Subject: Update sam9260/1/3 and ap7000 (stk100,ngw100) to use linux-2.6.28, u-boot-2009.01 and at91bootstrap-2.10 --- conf/machine/at32stk1000.conf | 4 ++-- conf/machine/at91cap9adk.conf | 2 ++ conf/machine/at91sam9260ek.conf | 10 +++++++++- conf/machine/at91sam9261ek.conf | 10 +++++++++- conf/machine/at91sam9263ek.conf | 13 +++++++++++-- conf/machine/at91sam9g20ek.conf | 2 ++ conf/machine/at91sam9rlek.conf | 2 ++ conf/machine/atngw100.conf | 11 ++++++----- 8 files changed, 43 insertions(+), 11 deletions(-) diff --git a/conf/machine/at32stk1000.conf b/conf/machine/at32stk1000.conf index 7a7370263a..d821d661a9 100644 --- a/conf/machine/at32stk1000.conf +++ b/conf/machine/at32stk1000.conf @@ -2,10 +2,10 @@ #@Name: Atmel STK1000 AVR32AP7000 Development Platform #@DESCRIPTION: Atmel STK1000 AVR32AP7000 Development Platform - TARGET_ARCH = "avr32" PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" PREFERRED_PROVIDER_xserver = "xserver-kdrive" #don't try to access tty1 @@ -22,7 +22,7 @@ ROOT_FLASH_SIZE = "8" EXTRA_IMAGECMD_jffs2 = " --big-endian --pagesize=4096 --eraseblock=65536" KERNEL_IMAGETYPE = "uImage" -PREFERRED_VERSION_u-boot = "1.3.2" +PREFERRED_VERSION_u-boot = "2009.01" UBOOT_MACHINE = "atstk1002_config" UBOOT_ENTRYPOINT = "0x90000000" diff --git a/conf/machine/at91cap9adk.conf b/conf/machine/at91cap9adk.conf index 3512d19744..50549dabf6 100644 --- a/conf/machine/at91cap9adk.conf +++ b/conf/machine/at91cap9adk.conf @@ -12,6 +12,8 @@ KERNEL_IMAGETYPE = "uImage" PREFERRED_VERSION_u-boot = "2009.01" UBOOT_MACHINE = "at91cap9adk_config" +PREFERRED_VERSION_at91bootstrap = "2.10" + #don't try to access tty1 USE_VT = "0" diff --git a/conf/machine/at91sam9260ek.conf b/conf/machine/at91sam9260ek.conf index 59ef577480..3882c118fb 100644 --- a/conf/machine/at91sam9260ek.conf +++ b/conf/machine/at91sam9260ek.conf @@ -1,18 +1,26 @@ #@TYPE: Machine #@Name: Atmel AT91SAM9260EK Development Platform -#@DESCRIPTION: Machine.inciguration for the at91sam9260ek development board with a at91sam9260 processor +#@DESCRIPTION: Machine configuration for the at91sam9260ek development board with a at91sam9260 processor TARGET_ARCH = "arm" +#PACKAGE_EXTRA_ARCHS = "armv4t armv5te" PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" PREFERRED_PROVIDER_xserver = "xserver-kdrive" KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at92sam9260ek_config" + +PREFERRED_VERSION_at91bootstrap = "2.10" #don't try to access tty1 USE_VT = "0" MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget" +EXTRA_IMAGEDEPENDS += "u-boot" +EXTRA_IMAGEDEPENDS += "at91bootstrap" # used by sysvinit_2 SERIAL_CONSOLE = "115200 ttyS0" diff --git a/conf/machine/at91sam9261ek.conf b/conf/machine/at91sam9261ek.conf index 570ff165f7..a3a9be6dc1 100644 --- a/conf/machine/at91sam9261ek.conf +++ b/conf/machine/at91sam9261ek.conf @@ -1,18 +1,26 @@ #@TYPE: Machine #@Name: Atmel AT91SAM9261EK Development Platform -#@DESCRIPTION: Machine.inciguration for the at91sam9261ek development board with a at91sam9261 processor +#@DESCRIPTION: Machine configuration for the at91sam9261ek development board with a at91sam9261 processor TARGET_ARCH = "arm" +#PACKAGE_EXTRA_ARCHS = "armv4t armv5te" PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" PREFERRED_PROVIDER_xserver = "xserver-kdrive" KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at92sam9261ek_config" + +PREFERRED_VERSION_at91bootstrap = "2.10" #don't try to access tty1 USE_VT = "0" MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget screen touchscreen" +EXTRA_IMAGEDEPENDS += "u-boot" +EXTRA_IMAGEDEPENDS += "at91bootstrap" # used by sysvinit_2 SERIAL_CONSOLE = "115200 ttyS0" diff --git a/conf/machine/at91sam9263ek.conf b/conf/machine/at91sam9263ek.conf index 9fd34f95a0..e633148172 100644 --- a/conf/machine/at91sam9263ek.conf +++ b/conf/machine/at91sam9263ek.conf @@ -3,14 +3,24 @@ #@DESCRIPTION: Machine configuration for the at91sam9263ek development board with a at91sam9263 processor TARGET_ARCH = "arm" +#PACKAGE_EXTRA_ARCHS = "armv4t armv5te" PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" PREFERRED_PROVIDER_xserver = "xserver-kdrive" +KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "at91sam9263ek_config" + +PREFERRED_VERSION_at91bootstrap = "2.10" + #don't try to access tty1 USE_VT = "0" -MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget screen" +MACHINE_FEATURES = "kernel26 alsa ext2 usbhost usbgadget screen touchscreen" +EXTRA_IMAGEDEPENDS += "u-boot" +EXTRA_IMAGEDEPENDS += "at91bootstrap" # used by sysvinit_2 SERIAL_CONSOLE = "115200 ttyS0" @@ -19,4 +29,3 @@ EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" require conf/machine/include/tune-arm926ejs.inc -KERNEL_IMAGETYPE = "uImage" diff --git a/conf/machine/at91sam9g20ek.conf b/conf/machine/at91sam9g20ek.conf index 8a56e3b498..df19389d9f 100644 --- a/conf/machine/at91sam9g20ek.conf +++ b/conf/machine/at91sam9g20ek.conf @@ -12,6 +12,8 @@ KERNEL_IMAGETYPE = "uImage" PREFERRED_VERSION_u-boot = "2009.01" UBOOT_MACHINE = "at92sam9g20ek_config" +PREFERRED_VERSION_at91bootstrap = "2.10" + #don't try to access tty1 USE_VT = "0" diff --git a/conf/machine/at91sam9rlek.conf b/conf/machine/at91sam9rlek.conf index 06f942b1d3..ba19cb3e00 100644 --- a/conf/machine/at91sam9rlek.conf +++ b/conf/machine/at91sam9rlek.conf @@ -13,6 +13,8 @@ KERNEL_IMAGETYPE = "uImage" PREFERRED_VERSION_u-boot = "2009.01" UBOOT_MACHINE = "at92sam9rlek_config" +PREFERRED_VERSION_at91bootstrap = "2.10" + #don't try to access tty1 USE_VT = "0" diff --git a/conf/machine/atngw100.conf b/conf/machine/atngw100.conf index d7e17aa896..ecfd2d4fee 100644 --- a/conf/machine/atngw100.conf +++ b/conf/machine/atngw100.conf @@ -1,16 +1,17 @@ #@TYPE: Machine -#@Name: Atmel ATNGW100 Network Gateway Kit +#@Name: Atmel ATNGW100 AVR32AP7000 Network Gateway Kit #@DESCRIPTION: Atmel ATNGW100 Network Gateway Kit TARGET_ARCH = "avr32" +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_VERSION_linux = "2.6.28" PREFERRED_PROVIDER_xserver = "xserver-kdrive" #don't try to access tty1 USE_VT = "0" -MACHINE_FEATURES = "kernel26 ext2 usbgadget" -PREFERRED_PROVIDER_virtual/kernel = "linux" +MACHINE_FEATURES = "kernel26 alsa ext2 usbgadget" # used by sysvinit_2 SERIAL_CONSOLE = "115200 ttyS0" @@ -20,11 +21,11 @@ IMAGE_FSTYPES ?= "tar.bz2 jffs2" ROOT_FLASH_SIZE = "8" EXTRA_IMAGECMD_jffs2 = " --big-endian --pagesize=4096 --eraseblock=65536" -PREFERRED_VERSION_u-boot = "1.1.4" KERNEL_IMAGETYPE = "uImage" +PREFERRED_VERSION_u-boot = "2009.01" +UBOOT_MACHINE = "atngw100_config" UBOOT_ENTRYPOINT = "0x90000000" UBOOT_LOADADDRESS = "0x10000000" - require conf/machine/include/tune-at32ap7000.inc -- cgit v1.2.3 From 87ece9c2e0532d110109c94f81b4b5082e76d3a7 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 6 Apr 2009 11:37:02 +0200 Subject: linux-omap 2.6.28: introduce MACHINE_KERNEL_PR linux-omap 2.6.29: introduce MACHINE_KERNEL_PR, seperate out dss2 patches, add isp and musb patches --- recipes/linux/linux-omap-2.6.29/DSS2.diff | 23964 ------------------- ...t-gro-Fix-legacy-path-napi_complete-crash.patch | 39 + ...002-OMAPFB-move-omapfb.h-to-include-linux.patch | 1316 + ...003-DSS2-OMAP2-3-Display-Subsystem-driver.patch | 14450 +++++++++++ .../dss2/0004-DSS2-OMAP-framebuffer-driver.patch | 3403 +++ .../dss2/0005-DSS2-Add-panel-drivers.patch | 396 + .../0006-DSS2-HACK-Add-DSS2-support-for-N800.patch | 1079 + ...Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch | 5715 +++++ ...unction-to-display-object-to-get-the-back.patch | 39 + .../dss2/0009-DSS2-Add-acx565akm-panel.patch | 778 + ...2-Small-VRFB-context-allocation-bug-fixed.patch | 28 + ...-Allocated-memory-for-Color-Look-up-table.patch | 37 + .../dss2/0012-DSS2-Fix-DMA-rotation.patch | 65 + .../0013-DSS2-Verify-that-overlay-paddr-0.patch | 41 + ...base-address-definitions-and-resources-fo.patch | 153 + ...1-omap-iommu-tlb-and-pagetable-primitives.patch | 1226 + ...mmu-omap2-architecture-specific-functions.patch | 453 + ...map-iommu-omap3-iommu-device-registration.patch | 124 + ...u-simple-virtual-address-space-management.patch | 1083 + ...ap-iommu-entries-for-Kconfig-and-Makefile.patch | 45 + ...-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch | 26 + ...u-We-support-chained-scatterlists-probabl.patch | 24 + ...p2-iommu-entries-for-Kconfig-and-Makefile.patch | 29 + ...dd-ISP-main-driver-and-register-definitio.patch | 4625 ++++ .../0002-omap3isp-Add-ISP-MMU-wrapper.patch | 209 + .../0003-omap3isp-Add-userspace-header.patch | 696 + .../0004-omap3isp-Add-ISP-frontend-CCDC.patch | 1875 ++ ...0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch | 3413 +++ ...Add-statistics-collection-modules-H3A-and.patch | 2741 +++ .../0007-omap3isp-Add-CSI2-interface-support.patch | 2384 ++ .../omap3camera/0008-omap3isp-Add-ISP-tables.patch | 4018 ++++ .../0009-omap34xxcam-Add-camera-driver.patch | 2249 ++ ...izer-and-Previewer-driver-added-to-commit.patch | 2915 +++ ...Resizer-bug-fixes-on-top-of-1.0.2-release.patch | 730 + .../v4l/0001-V4L2-Add-COLORFX-user-control.patch | 44 + ...f-v4l2_int_device_try_attach_all-requires.patch | 50 + .../isp/v4l/0003-V4L-Int-if-Dummy-slave.patch | 61 + ...t-device-add-support-for-VIDIOC_QUERYMENU.patch | 33 + .../0005-V4L-Int-if-Add-vidioc_int_querycap.patch | 35 + ...-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch | 43 + ...B-composite-avoid-inconsistent-lock-state.patch | 76 + ...sb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch | 218 + ...rewrite-host-periodic-endpoint-allocation.patch | 106 + ...isable-VUSB-regulators-when-cable-unplugg.patch | 181 + ...t-composite-device-level-suspend-resume-h.patch | 84 + ...dget-fix-ethernet-link-reports-to-ethtool.patch | 47 + ...sb-musb_host-minor-enqueue-locking-fix-v2.patch | 60 + .../0009-usb-musb_host-fix-ep0-fifo-flushing.patch | 93 + ...b-sanitize-clearing-TXCSR-DMA-bits-take-2.patch | 361 + .../0011-musb-fix-isochronous-TXDMA-take-2.patch | 417 + ...12-musb-fix-possible-panic-while-resuming.patch | 56 + ...usb_host-refactor-musb_save_toggle-take-2.patch | 91 + ...get-suppress-parasitic-TX-interrupts-with.patch | 32 + ...musb_gadget-fix-unhandled-endpoint-0-IRQs.patch | 202 + ...musb_host-factor-out-musb_ep_-get-set-_qh.patch | 146 + .../0017-musb_host-refactor-URB-giveback.patch | 132 + ...018-musb-split-out-CPPI-interrupt-handler.patch | 167 + ...9-musb_host-simplify-check-for-active-URB.patch | 158 + ...sb_host-streamline-musb_cleanup_urb-calls.patch | 58 + ...1-twl4030-usb-fix-minor-reporting-goofage.patch | 70 + ...dma-mode-1-for-TX-if-transfer-size-equals.patch | 38 + .../0023-musb-add-high-bandwidth-ISO-support.patch | 187 + .../0024-USB-otg-adding-nop-usb-transceiver.patch | 259 + ...-usb-xceiv-behave-when-linked-as-a-module.patch | 90 + ...musb-proper-hookup-to-transceiver-drivers.patch | 1109 + .../musb/0027-musb-otg-timer-cleanup.patch | 198 + ...-musb-make-initial-HNP-roleswitch-work-v2.patch | 133 + ...b-support-disconnect-after-HNP-roleswitch.patch | 145 + recipes/linux/linux-omap_2.6.28.bb | 1 - recipes/linux/linux-omap_2.6.29.bb | 70 +- 70 files changed, 61652 insertions(+), 23967 deletions(-) delete mode 100644 recipes/linux/linux-omap-2.6.29/DSS2.diff create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0004-DSS2-OMAP-framebuffer-driver.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0005-DSS2-Add-panel-drivers.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0009-DSS2-Add-acx565akm-panel.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0012-DSS2-Fix-DMA-rotation.patch create mode 100644 recipes/linux/linux-omap-2.6.29/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0001-omap-iommu-tlb-and-pagetable-primitives.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0002-omap-iommu-omap2-architecture-specific-functions.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0003-omap-iommu-omap3-iommu-device-registration.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0004-omap-iommu-simple-virtual-address-space-management.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0005-omap-iommu-entries-for-Kconfig-and-Makefile.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0006-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0007-omap-iommu-We-support-chained-scatterlists-probabl.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/iommu/0008-omap2-iommu-entries-for-Kconfig-and-Makefile.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0001-omap3isp-Add-ISP-main-driver-and-register-definitio.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0002-omap3isp-Add-ISP-MMU-wrapper.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0003-omap3isp-Add-userspace-header.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0004-omap3isp-Add-ISP-frontend-CCDC.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0006-omap3isp-Add-statistics-collection-modules-H3A-and.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0007-omap3isp-Add-CSI2-interface-support.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0008-omap3isp-Add-ISP-tables.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/omap3camera/0009-omap34xxcam-Add-camera-driver.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/v4l/0001-V4L2-Add-COLORFX-user-control.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/v4l/0002-V4L-Int-if-v4l2_int_device_try_attach_all-requires.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/v4l/0003-V4L-Int-if-Dummy-slave.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/v4l/0004-V4L-int-device-add-support-for-VIDIOC_QUERYMENU.patch create mode 100644 recipes/linux/linux-omap-2.6.29/isp/v4l/0005-V4L-Int-if-Add-vidioc_int_querycap.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0001-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0002-USB-composite-avoid-inconsistent-lock-state.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0003-USB-musb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0005-USB-TWL-disable-VUSB-regulators-when-cable-unplugg.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0006-USB-gadget-composite-device-level-suspend-resume-h.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0007-usb-gadget-fix-ethernet-link-reports-to-ethtool.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0008-usb-musb_host-minor-enqueue-locking-fix-v2.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0009-usb-musb_host-fix-ep0-fifo-flushing.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0010-musb-sanitize-clearing-TXCSR-DMA-bits-take-2.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0011-musb-fix-isochronous-TXDMA-take-2.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0012-musb-fix-possible-panic-while-resuming.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0013-musb_host-refactor-musb_save_toggle-take-2.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0014-musb_gadget-suppress-parasitic-TX-interrupts-with.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0015-musb_gadget-fix-unhandled-endpoint-0-IRQs.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0016-musb_host-factor-out-musb_ep_-get-set-_qh.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0017-musb_host-refactor-URB-giveback.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0018-musb-split-out-CPPI-interrupt-handler.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0019-musb_host-simplify-check-for-active-URB.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0020-musb_host-streamline-musb_cleanup_urb-calls.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0021-twl4030-usb-fix-minor-reporting-goofage.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0022-musb-use-dma-mode-1-for-TX-if-transfer-size-equals.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0023-musb-add-high-bandwidth-ISO-support.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0024-USB-otg-adding-nop-usb-transceiver.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0025-nop-usb-xceiv-behave-when-linked-as-a-module.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0026-musb-proper-hookup-to-transceiver-drivers.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0027-musb-otg-timer-cleanup.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0028-musb-make-initial-HNP-roleswitch-work-v2.patch create mode 100644 recipes/linux/linux-omap-2.6.29/musb/0029-musb-support-disconnect-after-HNP-roleswitch.patch diff --git a/recipes/linux/linux-omap-2.6.29/DSS2.diff b/recipes/linux/linux-omap-2.6.29/DSS2.diff deleted file mode 100644 index b2935aa17a..0000000000 --- a/recipes/linux/linux-omap-2.6.29/DSS2.diff +++ /dev/null @@ -1,23964 +0,0 @@ - arch/arm/plat-omap/include/mach/omapfb.h | 398 - - b/Documentation/arm/OMAP/DSS | 311 + - b/arch/arm/configs/dss_omap3_beagle_defconfig | 1369 ++++ - b/arch/arm/configs/dss_overo_defconfig | 1826 +++++ - b/arch/arm/mach-omap1/board-nokia770.c | 2 - b/arch/arm/mach-omap2/board-3430sdp.c | 218 - b/arch/arm/mach-omap2/board-n800.c | 217 - b/arch/arm/mach-omap2/board-omap3beagle.c | 91 - b/arch/arm/mach-omap2/board-omap3evm.c | 203 - b/arch/arm/mach-omap2/board-overo.c | 98 - b/arch/arm/mach-omap2/io.c | 2 - b/arch/arm/plat-omap/Makefile | 2 - b/arch/arm/plat-omap/fb.c | 30 - b/arch/arm/plat-omap/include/mach/display.h | 520 + - b/arch/arm/plat-omap/include/mach/vram.h | 33 - b/arch/arm/plat-omap/include/mach/vrfb.h | 47 - b/arch/arm/plat-omap/vram.c | 615 + - b/arch/arm/plat-omap/vrfb.c | 159 - b/drivers/video/Kconfig | 1 - b/drivers/video/Makefile | 1 - b/drivers/video/omap/Kconfig | 5 - b/drivers/video/omap/blizzard.c | 2 - b/drivers/video/omap/dispc.c | 2 - b/drivers/video/omap/hwa742.c | 2 - b/drivers/video/omap/lcd_2430sdp.c | 2 - b/drivers/video/omap/lcd_ams_delta.c | 2 - b/drivers/video/omap/lcd_apollon.c | 2 - b/drivers/video/omap/lcd_h3.c | 2 - b/drivers/video/omap/lcd_h4.c | 3 - b/drivers/video/omap/lcd_inn1510.c | 2 - b/drivers/video/omap/lcd_inn1610.c | 2 - b/drivers/video/omap/lcd_ldp.c | 2 - b/drivers/video/omap/lcd_mipid.c | 2 - b/drivers/video/omap/lcd_omap2evm.c | 2 - b/drivers/video/omap/lcd_omap3beagle.c | 2 - b/drivers/video/omap/lcd_omap3evm.c | 2 - b/drivers/video/omap/lcd_osk.c | 2 - b/drivers/video/omap/lcd_overo.c | 2 - b/drivers/video/omap/lcd_p2.c | 2 - b/drivers/video/omap/lcd_palmte.c | 2 - b/drivers/video/omap/lcd_palmtt.c | 2 - b/drivers/video/omap/lcd_palmz71.c | 3 - b/drivers/video/omap/lcdc.c | 2 - b/drivers/video/omap/omapfb_main.c | 2 - b/drivers/video/omap/rfbi.c | 3 - b/drivers/video/omap/sossi.c | 2 - b/drivers/video/omap2/Kconfig | 3 - b/drivers/video/omap2/Makefile | 4 - b/drivers/video/omap2/displays/Kconfig | 32 - b/drivers/video/omap2/displays/Makefile | 6 - b/drivers/video/omap2/displays/ctrl-blizzard.c | 279 - b/drivers/video/omap2/displays/panel-generic.c | 96 - b/drivers/video/omap2/displays/panel-n800.c | 435 + - b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c | 108 - b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c | 112 - b/drivers/video/omap2/dss/Kconfig | 89 - b/drivers/video/omap2/dss/Makefile | 6 - b/drivers/video/omap2/dss/core.c | 641 ++ - b/drivers/video/omap2/dss/dispc.c | 2781 +++++++++ - b/drivers/video/omap2/dss/display.c | 687 ++ - b/drivers/video/omap2/dss/dpi.c | 379 + - b/drivers/video/omap2/dss/dsi.c | 3693 ++++++++++++ - b/drivers/video/omap2/dss/dss.c | 345 + - b/drivers/video/omap2/dss/dss.h | 326 + - b/drivers/video/omap2/dss/manager.c | 463 + - b/drivers/video/omap2/dss/overlay.c | 587 + - b/drivers/video/omap2/dss/rfbi.c | 1304 ++++ - b/drivers/video/omap2/dss/sdi.c | 245 - b/drivers/video/omap2/dss/venc.c | 600 + - b/drivers/video/omap2/omapfb/Kconfig | 35 - b/drivers/video/omap2/omapfb/Makefile | 2 - b/drivers/video/omap2/omapfb/omapfb-ioctl.c | 656 ++ - b/drivers/video/omap2/omapfb/omapfb-main.c | 1944 ++++++ - b/drivers/video/omap2/omapfb/omapfb-sysfs.c | 371 + - b/drivers/video/omap2/omapfb/omapfb.h | 143 - b/include/linux/omapfb.h | 418 + - 76 files changed, 22501 insertions(+), 490 deletions(-) -diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS -new file mode 100644 -index 0000000..9e902a2 ---- /dev/null -+++ b/Documentation/arm/OMAP/DSS -@@ -0,0 +1,311 @@ -+OMAP2/3 Display Subsystem -+------------------------- -+ -+This is an almost total rewrite of the OMAP FB driver in drivers/video/omap -+(let's call it DSS1). The main differences between DSS1 and DSS2 are DSI, -+TV-out and multiple display support, but there are lots of small improvements -+also. -+ -+The DSS2 driver (omapdss module) is in arch/arm/plat-omap/dss/, and the FB, -+panel and controller drivers are in drivers/video/omap2/. DSS1 and DSS2 live -+currently side by side, you can choose which one to use. -+ -+Features -+-------- -+ -+Working and tested features include: -+ -+- MIPI DPI (parallel) output -+- MIPI DSI output in command mode -+- MIPI DBI (RFBI) output -+- SDI output -+- TV output -+- All pieces can be compiled as a module or inside kernel -+- Use DISPC to update any of the outputs -+- Use CPU to update RFBI or DSI output -+- OMAP DISPC planes -+- RGB16, RGB24 packed, RGB24 unpacked -+- YUV2, UYVY -+- Scaling -+- Adjusting DSS FCK to find a good pixel clock -+- Use DSI DPLL to create DSS FCK -+ -+Tested boards include: -+- OMAP3 SDP board -+- Beagle board -+- N810 -+ -+omapdss driver -+-------------- -+ -+The DSS driver does not itself have any support for Linux framebuffer, V4L or -+such like the current ones, but it has an internal kernel API that upper level -+drivers can use. -+ -+The DSS driver models OMAP's overlays, overlay managers and displays in a -+flexible way to enable non-common multi-display configuration. In addition to -+modelling the hardware overlays, omapdss supports virtual overlays and overlay -+managers. These can be used when updating a display with CPU or system DMA. -+ -+Panel and controller drivers -+---------------------------- -+ -+The drivers implement panel or controller specific functionality and are not -+usually visible to users except through omapfb driver. They register -+themselves to the DSS driver. -+ -+omapfb driver -+------------- -+ -+The omapfb driver implements arbitrary number of standard linux framebuffers. -+These framebuffers can be routed flexibly to any overlays, thus allowing very -+dynamic display architecture. -+ -+The driver exports some omapfb specific ioctls, which are compatible with the -+ioctls in the old driver. -+ -+The rest of the non standard features are exported via sysfs. Whether the final -+implementation will use sysfs, or ioctls, is still open. -+ -+V4L2 drivers -+------------ -+ -+V4L2 is being implemented in TI. -+ -+From omapdss point of view the V4L2 drivers should be similar to framebuffer -+driver. -+ -+Architecture -+-------------------- -+ -+Some clarification what the different components do: -+ -+ - Framebuffer is a memory area inside OMAP's SRAM/SDRAM that contains the -+ pixel data for the image. Framebuffer has width and height and color -+ depth. -+ - Overlay defines where the pixels are read from and where they go on the -+ screen. The overlay may be smaller than framebuffer, thus displaying only -+ part of the framebuffer. The position of the overlay may be changed if -+ the overlay is smaller than the display. -+ - Overlay manager combines the overlays in to one image and feeds them to -+ display. -+ - Display is the actual physical display device. -+ -+A framebuffer can be connected to multiple overlays to show the same pixel data -+on all of the overlays. Note that in this case the overlay input sizes must be -+the same, but, in case of video overlays, the output size can be different. Any -+framebuffer can be connected to any overlay. -+ -+An overlay can be connected to one overlay manager. Also DISPC overlays can be -+connected only to DISPC overlay managers, and virtual overlays can be only -+connected to virtual overlays. -+ -+An overlay manager can be connected to one display. There are certain -+restrictions which kinds of displays an overlay manager can be connected: -+ -+ - DISPC TV overlay manager can be only connected to TV display. -+ - Virtual overlay managers can only be connected to DBI or DSI displays. -+ - DISPC LCD overlay manager can be connected to all displays, except TV -+ display. -+ -+Sysfs -+----- -+The sysfs interface is mainly used for testing. I don't think sysfs -+interface is the best for this in the final version, but I don't quite know -+what would be the best interfaces for these things. -+ -+The sysfs interface is divided to two parts: DSS and FB. -+ -+/sys/class/graphics/fb? directory: -+mirror 0=off, 1=on -+rotate Rotation 0-3 for 0, 90, 180, 270 degrees -+rotate_type 0 = DMA rotation, 1 = VRFB rotation -+overlays List of overlay numbers to which framebuffer pixels go -+phys_addr Physical address of the framebuffer -+virt_addr Virtual address of the framebuffer -+size Size of the framebuffer -+ -+/sys/devices/platform/omapdss/overlay? directory: -+enabled 0=off, 1=on -+input_size width,height (ie. the framebuffer size) -+manager Destination overlay manager name -+name -+output_size width,height -+position x,y -+screen_width width -+ -+/sys/devices/platform/omapdss/manager? directory: -+display Destination display -+name -+ -+/sys/devices/platform/omapdss/display? directory: -+ctrl_name Controller name -+mirror 0=off, 1=on -+update_mode 0=off, 1=auto, 2=manual -+enabled 0=off, 1=on -+name -+rotate Rotation 0-3 for 0, 90, 180, 270 degrees -+timings Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw) -+ When writing, two special timings are accepted for tv-out: -+ "pal" and "ntsc" -+panel_name -+tear_elim Tearing elimination 0=off, 1=on -+ -+There are also some debugfs files at /omapdss/ which show information -+about clocks and registers. -+ -+Examples -+-------- -+ -+The following definitions have been made for the examples below: -+ -+ovl0=/sys/devices/platform/omapdss/overlay0 -+ovl1=/sys/devices/platform/omapdss/overlay1 -+ovl2=/sys/devices/platform/omapdss/overlay2 -+ -+mgr0=/sys/devices/platform/omapdss/manager0 -+mgr1=/sys/devices/platform/omapdss/manager1 -+ -+lcd=/sys/devices/platform/omapdss/display0 -+dvi=/sys/devices/platform/omapdss/display1 -+tv=/sys/devices/platform/omapdss/display2 -+ -+fb0=/sys/class/graphics/fb0 -+fb1=/sys/class/graphics/fb1 -+fb2=/sys/class/graphics/fb2 -+ -+Default setup on OMAP3 SDP -+-------------------------- -+ -+Here's the default setup on OMAP3 SDP board. All planes go to LCD. DVI -+and TV-out are not in use. The columns from left to right are: -+framebuffers, overlays, overlay managers, displays. Framebuffers are -+handled by omapfb, and the rest by the DSS. -+ -+FB0 --- GFX -\ DVI -+FB1 --- VID1 --+- LCD ---- LCD -+FB2 --- VID2 -/ TV ----- TV -+ -+Example: Switch from LCD to DVI -+---------------------- -+ -+w=`cat $dvi/horizontal | cut -d "," -f 1` -+h=`cat $dvi/vertical | cut -d "," -f 1` -+ -+echo "0" > $lcd/enabled -+echo "" > $mgr0/display -+fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h -+# at this point you have to switch the dvi/lcd dip-switch from the omap board -+echo "dvi" > $mgr0/display -+echo "1" > $dvi/enabled -+ -+After this the configuration looks like: -+ -+FB0 --- GFX -\ -- DVI -+FB1 --- VID1 --+- LCD -/ LCD -+FB2 --- VID2 -/ TV ----- TV -+ -+Example: Clone GFX overlay to LCD and TV -+------------------------------- -+ -+w=`cat $tv/horizontal | cut -d "," -f 1` -+h=`cat $tv/vertical | cut -d "," -f 1` -+ -+echo "0" > $ovl0/enabled -+echo "0" > $ovl1/enabled -+ -+echo "" > $fb1/overlays -+echo "0,1" > $fb0/overlays -+ -+echo "$w,$h" > $ovl1/output_size -+echo "tv" > $ovl1/manager -+ -+echo "1" > $ovl0/enabled -+echo "1" > $ovl1/enabled -+ -+echo "1" > $tv/enabled -+ -+After this the configuration looks like (only relevant parts shown): -+ -+FB0 +-- GFX ---- LCD ---- LCD -+ \- VID1 ---- TV ---- TV -+ -+Misc notes -+---------- -+ -+OMAP FB allocates the framebuffer memory using the OMAP VRAM allocator. -+ -+Using DSI DPLL to generate pixel clock it is possible produce the pixel clock -+of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI. -+ -+Rotation and mirroring currently only supports RGB565 and RGB8888 modes. VRFB -+does not support mirroring. -+ -+VRFB rotation requires much more memory than non-rotated framebuffer, so you -+probably need to increase your vram setting before using VRFB rotation. Also, -+many applications may not work with VRFB if they do not pay attention to all -+framebuffer parameters. -+ -+Kernel boot arguments -+--------------------- -+ -+vram= -+ - Amount of total VRAM to preallocate. For example, "10M". omapfb -+ allocates memory for framebuffers from VRAM. -+ -+omapfb.mode=:[,...] -+ - Default video mode for specified displays. For example, -+ "dvi:800x400MR-24@60". See drivers/video/modedb.c. -+ There are also two special modes: "pal" and "ntsc" that -+ can be used to tv out. -+ -+omapfb.vram=:[@][,...] -+ - VRAM allocated for a framebuffer. Normally omapfb allocates vram -+ depending on the display size. With this you can manually allocate -+ more or define the physical address of each framebuffer. For example, -+ "1:4M" to allocate 4M for fb1. -+ -+omapfb.debug= -+ - Enable debug printing. You have to have OMAPFB debug support enabled -+ in kernel config. -+ -+omapfb.test= -+ - Draw test pattern to framebuffer whenever framebuffer settings change. -+ You need to have OMAPFB debug support enabled in kernel config. -+ -+omapfb.vrfb= -+ - Use VRFB rotation for all framebuffers. -+ -+omapfb.rotate= -+ - Default rotation applied to all framebuffers. -+ 0 - 0 degree rotation -+ 1 - 90 degree rotation -+ 2 - 180 degree rotation -+ 3 - 270 degree rotation -+ -+omapfb.mirror= -+ - Default mirror for all framebuffers. Only works with DMA rotation. -+ -+omapdss.def_disp= -+ - Name of default display, to which all overlays will be connected. -+ Common examples are "lcd" or "tv". -+ -+omapdss.debug= -+ - Enable debug printing. You have to have DSS debug support enabled in -+ kernel config. -+ -+TODO -+---- -+ -+DSS locking -+ -+Error checking -+- Lots of checks are missing or implemented just as BUG() -+ -+System DMA update for DSI -+- Can be used for RGB16 and RGB24P modes. Probably not for RGB24U (how -+ to skip the empty byte?) -+ -+OMAP1 support -+- Not sure if needed -+ -diff --git a/arch/arm/configs/dss_omap3_beagle_defconfig b/arch/arm/configs/dss_omap3_beagle_defconfig -new file mode 100644 -index 0000000..8a428db ---- /dev/null -+++ b/arch/arm/configs/dss_omap3_beagle_defconfig -@@ -0,0 +1,1369 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.29-rc3-omap1 -+# Mon Feb 2 12:09:46 2009 -+# -+CONFIG_ARM=y -+CONFIG_SYS_SUPPORTS_APM_EMULATION=y -+CONFIG_GENERIC_GPIO=y -+CONFIG_GENERIC_TIME=y -+CONFIG_GENERIC_CLOCKEVENTS=y -+CONFIG_MMU=y -+# CONFIG_NO_IOPORT is not set -+CONFIG_GENERIC_HARDIRQS=y -+CONFIG_STACKTRACE_SUPPORT=y -+CONFIG_HAVE_LATENCYTOP_SUPPORT=y -+CONFIG_LOCKDEP_SUPPORT=y -+CONFIG_TRACE_IRQFLAGS_SUPPORT=y -+CONFIG_HARDIRQS_SW_RESEND=y -+CONFIG_GENERIC_IRQ_PROBE=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y -+CONFIG_VECTORS_BASE=0xffff0000 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+# CONFIG_LOCALVERSION_AUTO is not set -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+CONFIG_BSD_PROCESS_ACCT=y -+# CONFIG_BSD_PROCESS_ACCT_V3 is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+ -+# -+# RCU Subsystem -+# -+CONFIG_CLASSIC_RCU=y -+# CONFIG_TREE_RCU is not set -+# CONFIG_PREEMPT_RCU is not set -+# CONFIG_TREE_RCU_TRACE is not set -+# CONFIG_PREEMPT_RCU_TRACE is not set -+# CONFIG_IKCONFIG is not set -+CONFIG_LOG_BUF_SHIFT=14 -+CONFIG_GROUP_SCHED=y -+CONFIG_FAIR_GROUP_SCHED=y -+# CONFIG_RT_GROUP_SCHED is not set -+CONFIG_USER_SCHED=y -+# CONFIG_CGROUP_SCHED is not set -+# CONFIG_CGROUPS is not set -+CONFIG_SYSFS_DEPRECATED=y -+CONFIG_SYSFS_DEPRECATED_V2=y -+# CONFIG_RELAY is not set -+# CONFIG_NAMESPACES is not set -+CONFIG_BLK_DEV_INITRD=y -+CONFIG_INITRAMFS_SOURCE="" -+CONFIG_CC_OPTIMIZE_FOR_SIZE=y -+CONFIG_SYSCTL=y -+CONFIG_EMBEDDED=y -+CONFIG_UID16=y -+# CONFIG_SYSCTL_SYSCALL is not set -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+CONFIG_KALLSYMS_EXTRA_PASS=y -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_COMPAT_BRK=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_AIO=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+CONFIG_HAVE_OPROFILE=y -+# CONFIG_KPROBES is not set -+CONFIG_HAVE_KPROBES=y -+CONFIG_HAVE_KRETPROBES=y -+CONFIG_HAVE_CLK=y -+CONFIG_HAVE_GENERIC_DMA_COHERENT=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+# CONFIG_MODULE_FORCE_LOAD is not set -+CONFIG_MODULE_UNLOAD=y -+# CONFIG_MODULE_FORCE_UNLOAD is not set -+CONFIG_MODVERSIONS=y -+CONFIG_MODULE_SRCVERSION_ALL=y -+CONFIG_BLOCK=y -+# CONFIG_LBD is not set -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_BLK_DEV_BSG is not set -+# CONFIG_BLK_DEV_INTEGRITY is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+CONFIG_DEFAULT_AS=y -+# CONFIG_DEFAULT_DEADLINE is not set -+# CONFIG_DEFAULT_CFQ is not set -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="anticipatory" -+# CONFIG_FREEZER is not set -+ -+# -+# System Type -+# -+# CONFIG_ARCH_AAEC2000 is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_REALVIEW is not set -+# CONFIG_ARCH_VERSATILE is not set -+# CONFIG_ARCH_AT91 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_EP93XX is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_NETX is not set -+# CONFIG_ARCH_H720X is not set -+# CONFIG_ARCH_IMX is not set -+# CONFIG_ARCH_IOP13XX is not set -+# CONFIG_ARCH_IOP32X is not set -+# CONFIG_ARCH_IOP33X is not set -+# CONFIG_ARCH_IXP23XX is not set -+# CONFIG_ARCH_IXP2000 is not set -+# CONFIG_ARCH_IXP4XX is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_KIRKWOOD is not set -+# CONFIG_ARCH_KS8695 is not set -+# CONFIG_ARCH_NS9XXX is not set -+# CONFIG_ARCH_LOKI is not set -+# CONFIG_ARCH_MV78XX0 is not set -+# CONFIG_ARCH_MXC is not set -+# CONFIG_ARCH_ORION5X is not set -+# CONFIG_ARCH_PNX4008 is not set -+# CONFIG_ARCH_PXA is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_S3C2410 is not set -+# CONFIG_ARCH_S3C64XX is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_LH7A40X is not set -+# CONFIG_ARCH_DAVINCI is not set -+CONFIG_ARCH_OMAP=y -+# CONFIG_ARCH_MSM is not set -+# CONFIG_ARCH_W90X900 is not set -+ -+# -+# TI OMAP Implementations -+# -+CONFIG_ARCH_OMAP_OTG=y -+# CONFIG_ARCH_OMAP1 is not set -+# CONFIG_ARCH_OMAP2 is not set -+CONFIG_ARCH_OMAP3=y -+ -+# -+# OMAP Feature Selections -+# -+# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set -+# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set -+# CONFIG_OMAP_SMARTREFLEX is not set -+# CONFIG_OMAP_RESET_CLOCKS is not set -+CONFIG_OMAP_BOOT_TAG=y -+CONFIG_OMAP_BOOT_REASON=y -+# CONFIG_OMAP_COMPONENT_VERSION is not set -+# CONFIG_OMAP_GPIO_SWITCH is not set -+# CONFIG_OMAP_MUX is not set -+# CONFIG_OMAP_MCBSP is not set -+# CONFIG_OMAP_MBOX_FWK is not set -+# CONFIG_OMAP_MPU_TIMER is not set -+CONFIG_OMAP_32K_TIMER=y -+CONFIG_OMAP_32K_TIMER_HZ=128 -+CONFIG_OMAP_TICK_GPTIMER=12 -+CONFIG_OMAP_DM_TIMER=y -+# CONFIG_OMAP_LL_DEBUG_UART1 is not set -+# CONFIG_OMAP_LL_DEBUG_UART2 is not set -+CONFIG_OMAP_LL_DEBUG_UART3=y -+CONFIG_ARCH_OMAP34XX=y -+CONFIG_ARCH_OMAP3430=y -+ -+# -+# OMAP Board Type -+# -+# CONFIG_MACH_NOKIA_RX51 is not set -+# CONFIG_MACH_OMAP_LDP is not set -+# CONFIG_MACH_OMAP_3430SDP is not set -+# CONFIG_MACH_OMAP3EVM is not set -+CONFIG_MACH_OMAP3_BEAGLE=y -+# CONFIG_MACH_OVERO is not set -+# CONFIG_MACH_OMAP3_PANDORA is not set -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+CONFIG_CPU_32v6K=y -+CONFIG_CPU_V7=y -+CONFIG_CPU_32v7=y -+CONFIG_CPU_ABRT_EV7=y -+CONFIG_CPU_PABRT_IFAR=y -+CONFIG_CPU_CACHE_V7=y -+CONFIG_CPU_CACHE_VIPT=y -+CONFIG_CPU_COPY_V6=y -+CONFIG_CPU_TLB_V7=y -+CONFIG_CPU_HAS_ASID=y -+CONFIG_CPU_CP15=y -+CONFIG_CPU_CP15_MMU=y -+ -+# -+# Processor Features -+# -+CONFIG_ARM_THUMB=y -+# CONFIG_ARM_THUMBEE is not set -+# CONFIG_CPU_ICACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_DISABLE is not set -+# CONFIG_CPU_BPREDICT_DISABLE is not set -+CONFIG_HAS_TLS_REG=y -+# CONFIG_OUTER_CACHE is not set -+ -+# -+# Bus support -+# -+# CONFIG_PCI_SYSCALL is not set -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+# CONFIG_PCCARD is not set -+ -+# -+# Kernel Features -+# -+CONFIG_TICK_ONESHOT=y -+CONFIG_NO_HZ=y -+CONFIG_HIGH_RES_TIMERS=y -+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y -+CONFIG_VMSPLIT_3G=y -+# CONFIG_VMSPLIT_2G is not set -+# CONFIG_VMSPLIT_1G is not set -+CONFIG_PAGE_OFFSET=0xC0000000 -+# CONFIG_PREEMPT is not set -+CONFIG_HZ=128 -+CONFIG_AEABI=y -+CONFIG_OABI_COMPAT=y -+CONFIG_ARCH_FLATMEM_HAS_HOLES=y -+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_PAGEFLAGS_EXTENDED=y -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_PHYS_ADDR_T_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=0 -+CONFIG_VIRT_TO_BUS=y -+CONFIG_UNEVICTABLE_LRU=y -+# CONFIG_LEDS is not set -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Boot options -+# -+CONFIG_ZBOOT_ROM_TEXT=0x0 -+CONFIG_ZBOOT_ROM_BSS=0x0 -+CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:tgt:eth0:off rw console=ttyS2,115200n8" -+# CONFIG_XIP_KERNEL is not set -+# CONFIG_KEXEC is not set -+ -+# -+# CPU Power Management -+# -+# CONFIG_CPU_FREQ is not set -+# CONFIG_CPU_IDLE is not set -+ -+# -+# Floating point emulation -+# -+ -+# -+# At least one emulation must be selected -+# -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_NWFPE_XP is not set -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_VFP=y -+CONFIG_VFPv3=y -+# CONFIG_NEON is not set -+ -+# -+# Userspace binary formats -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -+CONFIG_HAVE_AOUT=y -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_MISC=y -+ -+# -+# Power management options -+# -+CONFIG_PM=y -+CONFIG_PM_DEBUG=y -+# CONFIG_PM_VERBOSE is not set -+# CONFIG_SUSPEND is not set -+# CONFIG_APM_EMULATION is not set -+CONFIG_ARCH_SUSPEND_POSSIBLE=y -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_COMPAT_NET_DEV_OPS=y -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_FIB_HASH=y -+CONFIG_IP_PNP=y -+CONFIG_IP_PNP_DHCP=y -+CONFIG_IP_PNP_BOOTP=y -+CONFIG_IP_PNP_RARP=y -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_INET_AH is not set -+# CONFIG_INET_ESP is not set -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+# CONFIG_INET_TUNNEL is not set -+CONFIG_INET_XFRM_MODE_TRANSPORT=y -+CONFIG_INET_XFRM_MODE_TUNNEL=y -+CONFIG_INET_XFRM_MODE_BEET=y -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+# CONFIG_IPV6 is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_NET_DSA is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_SCHED is not set -+# CONFIG_DCB is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+# CONFIG_BT is not set -+# CONFIG_AF_RXRPC is not set -+# CONFIG_PHONET is not set -+CONFIG_WIRELESS=y -+# CONFIG_CFG80211 is not set -+CONFIG_WIRELESS_OLD_REGULATORY=y -+# CONFIG_WIRELESS_EXT is not set -+# CONFIG_LIB80211 is not set -+# CONFIG_MAC80211 is not set -+# CONFIG_WIMAX is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+CONFIG_STANDALONE=y -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+# CONFIG_FW_LOADER is not set -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_TESTS is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+# CONFIG_MTD_AR7_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+# CONFIG_MTD_OOPS is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+# CONFIG_MTD_CFI is not set -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+CONFIG_MTD_MAP_BANK_WIDTH_4=y -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+CONFIG_MTD_NAND=y -+# CONFIG_MTD_NAND_VERIFY_WRITE is not set -+# CONFIG_MTD_NAND_ECC_SMC is not set -+# CONFIG_MTD_NAND_MUSEUM_IDS is not set -+# CONFIG_MTD_NAND_GPIO is not set -+CONFIG_MTD_NAND_OMAP2=y -+CONFIG_MTD_NAND_IDS=y -+# CONFIG_MTD_NAND_DISKONCHIP is not set -+# CONFIG_MTD_NAND_NANDSIM is not set -+# CONFIG_MTD_NAND_PLATFORM is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# LPDDR flash memory drivers -+# -+# CONFIG_MTD_LPDDR is not set -+# CONFIG_MTD_QINFO_PROBE is not set -+ -+# -+# UBI - Unsorted block images -+# -+# CONFIG_MTD_UBI is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=16384 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+# CONFIG_MISC_DEVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+# CONFIG_SCSI_MULTI_LUN is not set -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_LIBFC is not set -+# CONFIG_SCSI_DEBUG is not set -+# CONFIG_SCSI_DH is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_VETH is not set -+# CONFIG_NET_ETHERNET is not set -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+# CONFIG_IWLWIFI_LEDS is not set -+ -+# -+# Enable WiMAX (Networking options) to see the WiMAX drivers -+# -+# CONFIG_WAN is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+# CONFIG_INPUT_KEYBOARD is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+# CONFIG_SERIO is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_CONSOLE_TRANSLATIONS=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+# CONFIG_VT_HW_CONSOLE_BINDING is not set -+CONFIG_DEVKMEM=y -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+CONFIG_SERIAL_8250=y -+CONFIG_SERIAL_8250_CONSOLE=y -+CONFIG_SERIAL_8250_NR_UARTS=32 -+CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -+CONFIG_SERIAL_8250_EXTENDED=y -+CONFIG_SERIAL_8250_MANY_PORTS=y -+CONFIG_SERIAL_8250_SHARE_IRQ=y -+CONFIG_SERIAL_8250_DETECT_IRQ=y -+CONFIG_SERIAL_8250_RSA=y -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_CORE=y -+CONFIG_SERIAL_CORE_CONSOLE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+CONFIG_HW_RANDOM=y -+# CONFIG_NVRAM is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+CONFIG_I2C_CHARDEV=y -+CONFIG_I2C_HELPER_AUTO=y -+ -+# -+# I2C Hardware Bus support -+# -+ -+# -+# I2C system bus drivers (mostly embedded / system-on-chip) -+# -+# CONFIG_I2C_GPIO is not set -+# CONFIG_I2C_OCORES is not set -+CONFIG_I2C_OMAP=y -+# CONFIG_I2C2_OMAP_BEAGLE is not set -+# CONFIG_I2C_SIMTEC is not set -+ -+# -+# External I2C/SMBus adapter drivers -+# -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_TAOS_EVM is not set -+ -+# -+# Other I2C/SMBus bus drivers -+# -+# CONFIG_I2C_PCA_PLATFORM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_PCF8574 is not set -+# CONFIG_PCF8575 is not set -+# CONFIG_SENSORS_PCA9539 is not set -+# CONFIG_SENSORS_PCF8591 is not set -+# CONFIG_TWL4030_MADC is not set -+# CONFIG_TWL4030_PWRBUTTON is not set -+# CONFIG_TWL4030_POWEROFF is not set -+# CONFIG_SENSORS_MAX6875 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_LP5521 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+# CONFIG_SPI is not set -+CONFIG_ARCH_REQUIRE_GPIOLIB=y -+CONFIG_GPIOLIB=y -+# CONFIG_DEBUG_GPIO is not set -+# CONFIG_GPIO_SYSFS is not set -+ -+# -+# Memory mapped GPIO expanders: -+# -+ -+# -+# I2C GPIO expanders: -+# -+# CONFIG_GPIO_MAX732X is not set -+# CONFIG_GPIO_PCA953X is not set -+# CONFIG_GPIO_PCF857X is not set -+CONFIG_GPIO_TWL4030=y -+ -+# -+# PCI GPIO expanders: -+# -+ -+# -+# SPI GPIO expanders: -+# -+# CONFIG_W1 is not set -+# CONFIG_POWER_SUPPLY is not set -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+# CONFIG_THERMAL_HWMON is not set -+# CONFIG_WATCHDOG is not set -+CONFIG_SSB_POSSIBLE=y -+ -+# -+# Sonics Silicon Backplane -+# -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_CORE is not set -+# CONFIG_MFD_SM501 is not set -+# CONFIG_MFD_ASIC3 is not set -+# CONFIG_HTC_EGPIO is not set -+# CONFIG_HTC_PASIC3 is not set -+# CONFIG_TPS65010 is not set -+CONFIG_TWL4030_CORE=y -+# CONFIG_TWL4030_POWER is not set -+# CONFIG_MFD_TMIO is not set -+# CONFIG_MFD_T7L66XB is not set -+# CONFIG_MFD_TC6387XB is not set -+# CONFIG_MFD_TC6393XB is not set -+# CONFIG_PMIC_DA903X is not set -+# CONFIG_MFD_WM8400 is not set -+# CONFIG_MFD_WM8350_I2C is not set -+# CONFIG_MFD_PCF50633 is not set -+ -+# -+# Multimedia devices -+# -+ -+# -+# Multimedia core support -+# -+# CONFIG_VIDEO_DEV is not set -+# CONFIG_DVB_CORE is not set -+# CONFIG_VIDEO_MEDIA is not set -+ -+# -+# Multimedia drivers -+# -+CONFIG_DAB=y -+ -+# -+# Graphics support -+# -+# CONFIG_VGASTATE is not set -+# CONFIG_VIDEO_OUTPUT_CONTROL is not set -+CONFIG_FB=y -+# CONFIG_FIRMWARE_EDID is not set -+# CONFIG_FB_DDC is not set -+# CONFIG_FB_BOOT_VESA_SUPPORT is not set -+CONFIG_FB_CFB_FILLRECT=m -+CONFIG_FB_CFB_COPYAREA=m -+CONFIG_FB_CFB_IMAGEBLIT=m -+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -+# CONFIG_FB_SYS_FILLRECT is not set -+# CONFIG_FB_SYS_COPYAREA is not set -+# CONFIG_FB_SYS_IMAGEBLIT is not set -+# CONFIG_FB_FOREIGN_ENDIAN is not set -+# CONFIG_FB_SYS_FOPS is not set -+# CONFIG_FB_SVGALIB is not set -+# CONFIG_FB_MACMODES is not set -+# CONFIG_FB_BACKLIGHT is not set -+# CONFIG_FB_MODE_HELPERS is not set -+# CONFIG_FB_TILEBLITTING is not set -+ -+# -+# Frame buffer hardware drivers -+# -+# CONFIG_FB_S1D13XXX is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FB_METRONOME is not set -+# CONFIG_FB_MB862XX is not set -+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set -+CONFIG_OMAP2_DSS=m -+CONFIG_OMAP2_DSS_VRAM_SIZE=4 -+CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y -+# CONFIG_OMAP2_DSS_RFBI is not set -+CONFIG_OMAP2_DSS_VENC=y -+# CONFIG_OMAP2_DSS_SDI is not set -+# CONFIG_OMAP2_DSS_DSI is not set -+# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set -+CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 -+CONFIG_FB_OMAP2=m -+CONFIG_FB_OMAP2_DEBUG_SUPPORT=y -+# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set -+CONFIG_FB_OMAP2_NUM_FBS=3 -+ -+# -+# OMAP2/3 Display Device Drivers -+# -+CONFIG_PANEL_GENERIC=m -+# CONFIG_PANEL_SHARP_LS037V7DW01 is not set -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+# CONFIG_VGA_CONSOLE is not set -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FRAMEBUFFER_CONSOLE is not set -+# CONFIG_LOGO is not set -+# CONFIG_SOUND is not set -+# CONFIG_HID_SUPPORT is not set -+CONFIG_USB_SUPPORT=y -+CONFIG_USB_ARCH_HAS_HCD=y -+CONFIG_USB_ARCH_HAS_OHCI=y -+CONFIG_USB_ARCH_HAS_EHCI=y -+# CONFIG_USB is not set -+# CONFIG_USB_OTG_WHITELIST is not set -+# CONFIG_USB_OTG_BLACKLIST_HUB is not set -+CONFIG_USB_MUSB_HDRC=y -+CONFIG_USB_MUSB_SOC=y -+ -+# -+# OMAP 343x high speed USB support -+# -+# CONFIG_USB_MUSB_HOST is not set -+CONFIG_USB_MUSB_PERIPHERAL=y -+# CONFIG_USB_MUSB_OTG is not set -+CONFIG_USB_GADGET_MUSB_HDRC=y -+# CONFIG_MUSB_PIO_ONLY is not set -+CONFIG_USB_INVENTRA_DMA=y -+# CONFIG_USB_TI_CPPI_DMA is not set -+# CONFIG_USB_MUSB_DEBUG is not set -+ -+# -+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; -+# -+CONFIG_USB_GADGET=y -+# CONFIG_USB_GADGET_DEBUG is not set -+# CONFIG_USB_GADGET_DEBUG_FILES is not set -+# CONFIG_USB_GADGET_DEBUG_FS is not set -+CONFIG_USB_GADGET_VBUS_DRAW=2 -+CONFIG_USB_GADGET_SELECTED=y -+# CONFIG_USB_GADGET_AT91 is not set -+# CONFIG_USB_GADGET_ATMEL_USBA is not set -+# CONFIG_USB_GADGET_FSL_USB2 is not set -+# CONFIG_USB_GADGET_LH7A40X is not set -+# CONFIG_USB_GADGET_OMAP is not set -+# CONFIG_USB_GADGET_PXA25X is not set -+# CONFIG_USB_GADGET_PXA27X is not set -+# CONFIG_USB_GADGET_S3C2410 is not set -+# CONFIG_USB_GADGET_IMX is not set -+# CONFIG_USB_GADGET_M66592 is not set -+# CONFIG_USB_GADGET_AMD5536UDC is not set -+# CONFIG_USB_GADGET_FSL_QE is not set -+# CONFIG_USB_GADGET_CI13XXX is not set -+# CONFIG_USB_GADGET_NET2280 is not set -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+CONFIG_USB_GADGET_DUALSPEED=y -+# CONFIG_USB_ZERO is not set -+CONFIG_USB_ETH=y -+CONFIG_USB_ETH_RNDIS=y -+# CONFIG_USB_GADGETFS is not set -+# CONFIG_USB_FILE_STORAGE is not set -+# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set -+# CONFIG_USB_G_PRINTER is not set -+# CONFIG_USB_CDC_COMPOSITE is not set -+ -+# -+# OTG and related infrastructure -+# -+CONFIG_USB_OTG_UTILS=y -+# CONFIG_USB_GPIO_VBUS is not set -+# CONFIG_ISP1301_OMAP is not set -+CONFIG_TWL4030_USB=y -+CONFIG_MMC=y -+# CONFIG_MMC_DEBUG is not set -+# CONFIG_MMC_UNSAFE_RESUME is not set -+ -+# -+# MMC/SD/SDIO Card Drivers -+# -+CONFIG_MMC_BLOCK=y -+CONFIG_MMC_BLOCK_BOUNCE=y -+# CONFIG_SDIO_UART is not set -+# CONFIG_MMC_TEST is not set -+ -+# -+# MMC/SD/SDIO Host Controller Drivers -+# -+# CONFIG_MMC_SDHCI is not set -+CONFIG_MMC_OMAP_HS=y -+# CONFIG_MEMSTICK is not set -+# CONFIG_ACCESSIBILITY is not set -+# CONFIG_NEW_LEDS is not set -+CONFIG_RTC_LIB=y -+CONFIG_RTC_CLASS=y -+CONFIG_RTC_HCTOSYS=y -+CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -+# CONFIG_RTC_DEBUG is not set -+ -+# -+# RTC interfaces -+# -+CONFIG_RTC_INTF_SYSFS=y -+CONFIG_RTC_INTF_PROC=y -+CONFIG_RTC_INTF_DEV=y -+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -+# CONFIG_RTC_DRV_TEST is not set -+ -+# -+# I2C RTC drivers -+# -+# CONFIG_RTC_DRV_DS1307 is not set -+# CONFIG_RTC_DRV_DS1374 is not set -+# CONFIG_RTC_DRV_DS1672 is not set -+# CONFIG_RTC_DRV_MAX6900 is not set -+# CONFIG_RTC_DRV_RS5C372 is not set -+# CONFIG_RTC_DRV_ISL1208 is not set -+# CONFIG_RTC_DRV_X1205 is not set -+# CONFIG_RTC_DRV_PCF8563 is not set -+# CONFIG_RTC_DRV_PCF8583 is not set -+# CONFIG_RTC_DRV_M41T80 is not set -+CONFIG_RTC_DRV_TWL4030=y -+# CONFIG_RTC_DRV_S35390A is not set -+# CONFIG_RTC_DRV_FM3130 is not set -+# CONFIG_RTC_DRV_RX8581 is not set -+ -+# -+# SPI RTC drivers -+# -+ -+# -+# Platform RTC drivers -+# -+# CONFIG_RTC_DRV_CMOS is not set -+# CONFIG_RTC_DRV_DS1286 is not set -+# CONFIG_RTC_DRV_DS1511 is not set -+# CONFIG_RTC_DRV_DS1553 is not set -+# CONFIG_RTC_DRV_DS1742 is not set -+# CONFIG_RTC_DRV_STK17TA8 is not set -+# CONFIG_RTC_DRV_M48T86 is not set -+# CONFIG_RTC_DRV_M48T35 is not set -+# CONFIG_RTC_DRV_M48T59 is not set -+# CONFIG_RTC_DRV_BQ4802 is not set -+# CONFIG_RTC_DRV_V3020 is not set -+ -+# -+# on-CPU RTC drivers -+# -+# CONFIG_DMADEVICES is not set -+# CONFIG_REGULATOR is not set -+# CONFIG_UIO is not set -+# CONFIG_STAGING is not set -+ -+# -+# CBUS support -+# -+# CONFIG_CBUS is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+# CONFIG_EXT3_FS_XATTR is not set -+# CONFIG_EXT4_FS is not set -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+CONFIG_FILE_LOCKING=y -+# CONFIG_XFS_FS is not set -+# CONFIG_OCFS2_FS is not set -+# CONFIG_BTRFS_FS is not set -+CONFIG_DNOTIFY=y -+CONFIG_INOTIFY=y -+CONFIG_INOTIFY_USER=y -+CONFIG_QUOTA=y -+# CONFIG_QUOTA_NETLINK_INTERFACE is not set -+CONFIG_PRINT_QUOTA_WARNING=y -+CONFIG_QUOTA_TREE=y -+# CONFIG_QFMT_V1 is not set -+CONFIG_QFMT_V2=y -+CONFIG_QUOTACTL=y -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_FUSE_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+# CONFIG_NTFS_FS is not set -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+CONFIG_PROC_SYSCTL=y -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+# CONFIG_CONFIGFS_FS is not set -+CONFIG_MISC_FILESYSTEMS=y -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_JFFS2_FS_WRITEBUFFER=y -+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -+# CONFIG_JFFS2_SUMMARY is not set -+# CONFIG_JFFS2_FS_XATTR is not set -+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -+CONFIG_JFFS2_ZLIB=y -+# CONFIG_JFFS2_LZO is not set -+CONFIG_JFFS2_RTIME=y -+# CONFIG_JFFS2_RUBIN is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_SQUASHFS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_OMFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+# CONFIG_NFS_V3_ACL is not set -+CONFIG_NFS_V4=y -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+CONFIG_SUNRPC_GSS=y -+# CONFIG_SUNRPC_REGISTER_V4 is not set -+CONFIG_RPCSEC_GSS_KRB5=y -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+CONFIG_ENABLE_WARN_DEPRECATED=y -+CONFIG_ENABLE_MUST_CHECK=y -+CONFIG_FRAME_WARN=1024 -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_UNUSED_SYMBOLS is not set -+CONFIG_DEBUG_FS=y -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SHIRQ is not set -+CONFIG_DETECT_SOFTLOCKUP=y -+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 -+CONFIG_SCHED_DEBUG=y -+# CONFIG_SCHEDSTATS is not set -+# CONFIG_TIMER_STATS is not set -+# CONFIG_DEBUG_OBJECTS is not set -+# CONFIG_DEBUG_SLAB is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+CONFIG_DEBUG_MUTEXES=y -+# CONFIG_DEBUG_LOCK_ALLOC is not set -+# CONFIG_PROVE_LOCKING is not set -+# CONFIG_LOCK_STAT is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+# CONFIG_DEBUG_KOBJECT is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_WRITECOUNT is not set -+# CONFIG_DEBUG_MEMORY_INIT is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_DEBUG_SG is not set -+# CONFIG_DEBUG_NOTIFIERS is not set -+CONFIG_FRAME_POINTER=y -+# CONFIG_BOOT_PRINTK_DELAY is not set -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_RCU_CPU_STALL_DETECTOR is not set -+# CONFIG_BACKTRACE_SELF_TEST is not set -+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -+# CONFIG_FAULT_INJECTION is not set -+# CONFIG_LATENCYTOP is not set -+CONFIG_HAVE_FUNCTION_TRACER=y -+ -+# -+# Tracers -+# -+# CONFIG_FUNCTION_TRACER is not set -+# CONFIG_IRQSOFF_TRACER is not set -+# CONFIG_SCHED_TRACER is not set -+# CONFIG_CONTEXT_SWITCH_TRACER is not set -+# CONFIG_BOOT_TRACER is not set -+# CONFIG_TRACE_BRANCH_PROFILING is not set -+# CONFIG_STACK_TRACER is not set -+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set -+# CONFIG_SAMPLES is not set -+CONFIG_HAVE_ARCH_KGDB=y -+# CONFIG_KGDB is not set -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_ERRORS=y -+# CONFIG_DEBUG_STACK_USAGE is not set -+# CONFIG_DEBUG_LL is not set -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITYFS is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+ -+# -+# Crypto core or helper -+# -+# CONFIG_CRYPTO_FIPS is not set -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_ALGAPI2=y -+CONFIG_CRYPTO_AEAD2=y -+CONFIG_CRYPTO_BLKCIPHER=y -+CONFIG_CRYPTO_BLKCIPHER2=y -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_HASH2=y -+CONFIG_CRYPTO_RNG2=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_MANAGER2=y -+# CONFIG_CRYPTO_GF128MUL is not set -+# CONFIG_CRYPTO_NULL is not set -+# CONFIG_CRYPTO_CRYPTD is not set -+# CONFIG_CRYPTO_AUTHENC is not set -+# CONFIG_CRYPTO_TEST is not set -+ -+# -+# Authenticated Encryption with Associated Data -+# -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_SEQIV is not set -+ -+# -+# Block modes -+# -+CONFIG_CRYPTO_CBC=y -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_CTS is not set -+CONFIG_CRYPTO_ECB=m -+# CONFIG_CRYPTO_LRW is not set -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_XTS is not set -+ -+# -+# Hash modes -+# -+# CONFIG_CRYPTO_HMAC is not set -+# CONFIG_CRYPTO_XCBC is not set -+ -+# -+# Digest -+# -+CONFIG_CRYPTO_CRC32C=y -+# CONFIG_CRYPTO_MD4 is not set -+CONFIG_CRYPTO_MD5=y -+# CONFIG_CRYPTO_MICHAEL_MIC is not set -+# CONFIG_CRYPTO_RMD128 is not set -+# CONFIG_CRYPTO_RMD160 is not set -+# CONFIG_CRYPTO_RMD256 is not set -+# CONFIG_CRYPTO_RMD320 is not set -+# CONFIG_CRYPTO_SHA1 is not set -+# CONFIG_CRYPTO_SHA256 is not set -+# CONFIG_CRYPTO_SHA512 is not set -+# CONFIG_CRYPTO_TGR192 is not set -+# CONFIG_CRYPTO_WP512 is not set -+ -+# -+# Ciphers -+# -+# CONFIG_CRYPTO_AES is not set -+# CONFIG_CRYPTO_ANUBIS is not set -+# CONFIG_CRYPTO_ARC4 is not set -+# CONFIG_CRYPTO_BLOWFISH is not set -+# CONFIG_CRYPTO_CAMELLIA is not set -+# CONFIG_CRYPTO_CAST5 is not set -+# CONFIG_CRYPTO_CAST6 is not set -+CONFIG_CRYPTO_DES=y -+# CONFIG_CRYPTO_FCRYPT is not set -+# CONFIG_CRYPTO_KHAZAD is not set -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_SEED is not set -+# CONFIG_CRYPTO_SERPENT is not set -+# CONFIG_CRYPTO_TEA is not set -+# CONFIG_CRYPTO_TWOFISH is not set -+ -+# -+# Compression -+# -+# CONFIG_CRYPTO_DEFLATE is not set -+# CONFIG_CRYPTO_LZO is not set -+ -+# -+# Random Number Generation -+# -+# CONFIG_CRYPTO_ANSI_CPRNG is not set -+CONFIG_CRYPTO_HW=y -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_GENERIC_FIND_LAST_BIT=y -+CONFIG_CRC_CCITT=y -+# CONFIG_CRC16 is not set -+# CONFIG_CRC_T10DIF is not set -+# CONFIG_CRC_ITU_T is not set -+CONFIG_CRC32=y -+# CONFIG_CRC7 is not set -+CONFIG_LIBCRC32C=y -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_IOPORT=y -+CONFIG_HAS_DMA=y -diff --git a/arch/arm/configs/dss_overo_defconfig b/arch/arm/configs/dss_overo_defconfig -new file mode 100644 -index 0000000..bf7dbe1 ---- /dev/null -+++ b/arch/arm/configs/dss_overo_defconfig -@@ -0,0 +1,1826 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.29-rc3-omap1 -+# Sat Feb 14 12:23:43 2009 -+# -+CONFIG_ARM=y -+CONFIG_SYS_SUPPORTS_APM_EMULATION=y -+CONFIG_GENERIC_GPIO=y -+CONFIG_GENERIC_TIME=y -+CONFIG_GENERIC_CLOCKEVENTS=y -+CONFIG_MMU=y -+# CONFIG_NO_IOPORT is not set -+CONFIG_GENERIC_HARDIRQS=y -+CONFIG_STACKTRACE_SUPPORT=y -+CONFIG_HAVE_LATENCYTOP_SUPPORT=y -+CONFIG_LOCKDEP_SUPPORT=y -+CONFIG_TRACE_IRQFLAGS_SUPPORT=y -+CONFIG_HARDIRQS_SW_RESEND=y -+CONFIG_GENERIC_IRQ_PROBE=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y -+CONFIG_OPROFILE_ARMV7=y -+CONFIG_VECTORS_BASE=0xffff0000 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+CONFIG_BSD_PROCESS_ACCT=y -+# CONFIG_BSD_PROCESS_ACCT_V3 is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+ -+# -+# RCU Subsystem -+# -+CONFIG_CLASSIC_RCU=y -+# CONFIG_TREE_RCU is not set -+# CONFIG_PREEMPT_RCU is not set -+# CONFIG_TREE_RCU_TRACE is not set -+# CONFIG_PREEMPT_RCU_TRACE is not set -+CONFIG_IKCONFIG=y -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=14 -+CONFIG_GROUP_SCHED=y -+CONFIG_FAIR_GROUP_SCHED=y -+# CONFIG_RT_GROUP_SCHED is not set -+CONFIG_USER_SCHED=y -+# CONFIG_CGROUP_SCHED is not set -+# CONFIG_CGROUPS is not set -+CONFIG_SYSFS_DEPRECATED=y -+CONFIG_SYSFS_DEPRECATED_V2=y -+# CONFIG_RELAY is not set -+# CONFIG_NAMESPACES is not set -+CONFIG_BLK_DEV_INITRD=y -+CONFIG_INITRAMFS_SOURCE="" -+CONFIG_CC_OPTIMIZE_FOR_SIZE=y -+CONFIG_SYSCTL=y -+CONFIG_EMBEDDED=y -+CONFIG_UID16=y -+# CONFIG_SYSCTL_SYSCALL is not set -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+# CONFIG_ELF_CORE is not set -+# CONFIG_COMPAT_BRK is not set -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_AIO=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLUB_DEBUG=y -+# CONFIG_SLAB is not set -+CONFIG_SLUB=y -+# CONFIG_SLOB is not set -+CONFIG_PROFILING=y -+CONFIG_TRACEPOINTS=y -+# CONFIG_MARKERS is not set -+CONFIG_OPROFILE=y -+CONFIG_HAVE_OPROFILE=y -+# CONFIG_KPROBES is not set -+CONFIG_HAVE_KPROBES=y -+CONFIG_HAVE_KRETPROBES=y -+CONFIG_HAVE_CLK=y -+CONFIG_HAVE_GENERIC_DMA_COHERENT=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+# CONFIG_MODULE_FORCE_LOAD is not set -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+CONFIG_MODVERSIONS=y -+CONFIG_MODULE_SRCVERSION_ALL=y -+CONFIG_BLOCK=y -+CONFIG_LBD=y -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_BLK_DEV_BSG is not set -+# CONFIG_BLK_DEV_INTEGRITY is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+# CONFIG_DEFAULT_AS is not set -+# CONFIG_DEFAULT_DEADLINE is not set -+CONFIG_DEFAULT_CFQ=y -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="cfq" -+CONFIG_FREEZER=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_AAEC2000 is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_REALVIEW is not set -+# CONFIG_ARCH_VERSATILE is not set -+# CONFIG_ARCH_AT91 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_EP93XX is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_NETX is not set -+# CONFIG_ARCH_H720X is not set -+# CONFIG_ARCH_IMX is not set -+# CONFIG_ARCH_IOP13XX is not set -+# CONFIG_ARCH_IOP32X is not set -+# CONFIG_ARCH_IOP33X is not set -+# CONFIG_ARCH_IXP23XX is not set -+# CONFIG_ARCH_IXP2000 is not set -+# CONFIG_ARCH_IXP4XX is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_KIRKWOOD is not set -+# CONFIG_ARCH_KS8695 is not set -+# CONFIG_ARCH_NS9XXX is not set -+# CONFIG_ARCH_LOKI is not set -+# CONFIG_ARCH_MV78XX0 is not set -+# CONFIG_ARCH_MXC is not set -+# CONFIG_ARCH_ORION5X is not set -+# CONFIG_ARCH_PNX4008 is not set -+# CONFIG_ARCH_PXA is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_S3C2410 is not set -+# CONFIG_ARCH_S3C64XX is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_LH7A40X is not set -+# CONFIG_ARCH_DAVINCI is not set -+CONFIG_ARCH_OMAP=y -+# CONFIG_ARCH_MSM is not set -+# CONFIG_ARCH_W90X900 is not set -+ -+# -+# TI OMAP Implementations -+# -+CONFIG_ARCH_OMAP_OTG=y -+# CONFIG_ARCH_OMAP1 is not set -+# CONFIG_ARCH_OMAP2 is not set -+CONFIG_ARCH_OMAP3=y -+ -+# -+# OMAP Feature Selections -+# -+# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set -+# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set -+CONFIG_OMAP_SMARTREFLEX=y -+# CONFIG_OMAP_SMARTREFLEX_TESTING is not set -+# CONFIG_OMAP_RESET_CLOCKS is not set -+CONFIG_OMAP_BOOT_TAG=y -+CONFIG_OMAP_BOOT_REASON=y -+# CONFIG_OMAP_COMPONENT_VERSION is not set -+# CONFIG_OMAP_GPIO_SWITCH is not set -+# CONFIG_OMAP_MUX is not set -+CONFIG_OMAP_MCBSP=y -+# CONFIG_OMAP_MBOX_FWK is not set -+# CONFIG_OMAP_MPU_TIMER is not set -+CONFIG_OMAP_32K_TIMER=y -+CONFIG_OMAP_32K_TIMER_HZ=128 -+CONFIG_OMAP_TICK_GPTIMER=1 -+CONFIG_OMAP_DM_TIMER=y -+# CONFIG_OMAP_LL_DEBUG_UART1 is not set -+# CONFIG_OMAP_LL_DEBUG_UART2 is not set -+CONFIG_OMAP_LL_DEBUG_UART3=y -+CONFIG_ARCH_OMAP34XX=y -+CONFIG_ARCH_OMAP3430=y -+ -+# -+# OMAP Board Type -+# -+# CONFIG_MACH_NOKIA_RX51 is not set -+# CONFIG_MACH_OMAP_LDP is not set -+# CONFIG_MACH_OMAP_3430SDP is not set -+# CONFIG_MACH_OMAP3EVM is not set -+# CONFIG_MACH_OMAP3_BEAGLE is not set -+CONFIG_MACH_OVERO=y -+# CONFIG_MACH_OMAP3_PANDORA is not set -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+CONFIG_CPU_32v6K=y -+CONFIG_CPU_V7=y -+CONFIG_CPU_32v7=y -+CONFIG_CPU_ABRT_EV7=y -+CONFIG_CPU_PABRT_IFAR=y -+CONFIG_CPU_CACHE_V7=y -+CONFIG_CPU_CACHE_VIPT=y -+CONFIG_CPU_COPY_V6=y -+CONFIG_CPU_TLB_V7=y -+CONFIG_CPU_HAS_ASID=y -+CONFIG_CPU_CP15=y -+CONFIG_CPU_CP15_MMU=y -+ -+# -+# Processor Features -+# -+CONFIG_ARM_THUMB=y -+CONFIG_ARM_THUMBEE=y -+# CONFIG_CPU_ICACHE_DISABLE is not set -+# CONFIG_CPU_DCACHE_DISABLE is not set -+# CONFIG_CPU_BPREDICT_DISABLE is not set -+CONFIG_HAS_TLS_REG=y -+# CONFIG_OUTER_CACHE is not set -+ -+# -+# Bus support -+# -+# CONFIG_PCI_SYSCALL is not set -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+# CONFIG_PCCARD is not set -+ -+# -+# Kernel Features -+# -+CONFIG_TICK_ONESHOT=y -+CONFIG_NO_HZ=y -+CONFIG_HIGH_RES_TIMERS=y -+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y -+CONFIG_VMSPLIT_3G=y -+# CONFIG_VMSPLIT_2G is not set -+# CONFIG_VMSPLIT_1G is not set -+CONFIG_PAGE_OFFSET=0xC0000000 -+# CONFIG_PREEMPT is not set -+CONFIG_HZ=128 -+CONFIG_AEABI=y -+# CONFIG_OABI_COMPAT is not set -+CONFIG_ARCH_FLATMEM_HAS_HOLES=y -+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_PAGEFLAGS_EXTENDED=y -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_PHYS_ADDR_T_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=0 -+CONFIG_VIRT_TO_BUS=y -+CONFIG_UNEVICTABLE_LRU=y -+CONFIG_LEDS=y -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Boot options -+# -+CONFIG_ZBOOT_ROM_TEXT=0x0 -+CONFIG_ZBOOT_ROM_BSS=0x0 -+CONFIG_CMDLINE=" debug " -+# CONFIG_XIP_KERNEL is not set -+CONFIG_KEXEC=y -+CONFIG_ATAGS_PROC=y -+ -+# -+# CPU Power Management -+# -+CONFIG_CPU_FREQ=y -+CONFIG_CPU_FREQ_TABLE=y -+# CONFIG_CPU_FREQ_DEBUG is not set -+CONFIG_CPU_FREQ_STAT=y -+CONFIG_CPU_FREQ_STAT_DETAILS=y -+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y -+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -+CONFIG_CPU_FREQ_GOV_USERSPACE=y -+CONFIG_CPU_FREQ_GOV_ONDEMAND=y -+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -+# CONFIG_CPU_IDLE is not set -+ -+# -+# Floating point emulation -+# -+ -+# -+# At least one emulation must be selected -+# -+CONFIG_VFP=y -+CONFIG_VFPv3=y -+CONFIG_NEON=y -+ -+# -+# Userspace binary formats -+# -+CONFIG_BINFMT_ELF=y -+CONFIG_HAVE_AOUT=y -+CONFIG_BINFMT_AOUT=m -+CONFIG_BINFMT_MISC=y -+ -+# -+# Power management options -+# -+CONFIG_PM=y -+CONFIG_PM_DEBUG=y -+# CONFIG_PM_VERBOSE is not set -+CONFIG_CAN_PM_TRACE=y -+CONFIG_PM_SLEEP=y -+CONFIG_SUSPEND=y -+# CONFIG_PM_TEST_SUSPEND is not set -+CONFIG_SUSPEND_FREEZER=y -+# CONFIG_APM_EMULATION is not set -+CONFIG_ARCH_SUSPEND_POSSIBLE=y -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_COMPAT_NET_DEV_OPS=y -+CONFIG_PACKET=y -+CONFIG_PACKET_MMAP=y -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_FIB_HASH=y -+CONFIG_IP_PNP=y -+CONFIG_IP_PNP_DHCP=y -+CONFIG_IP_PNP_BOOTP=y -+CONFIG_IP_PNP_RARP=y -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_INET_AH is not set -+# CONFIG_INET_ESP is not set -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+CONFIG_INET_TUNNEL=m -+CONFIG_INET_XFRM_MODE_TRANSPORT=y -+CONFIG_INET_XFRM_MODE_TUNNEL=y -+CONFIG_INET_XFRM_MODE_BEET=y -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+CONFIG_IPV6=m -+# CONFIG_IPV6_PRIVACY is not set -+# CONFIG_IPV6_ROUTER_PREF is not set -+# CONFIG_IPV6_OPTIMISTIC_DAD is not set -+# CONFIG_INET6_AH is not set -+# CONFIG_INET6_ESP is not set -+# CONFIG_INET6_IPCOMP is not set -+# CONFIG_IPV6_MIP6 is not set -+# CONFIG_INET6_XFRM_TUNNEL is not set -+# CONFIG_INET6_TUNNEL is not set -+CONFIG_INET6_XFRM_MODE_TRANSPORT=m -+CONFIG_INET6_XFRM_MODE_TUNNEL=m -+CONFIG_INET6_XFRM_MODE_BEET=m -+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -+CONFIG_IPV6_SIT=m -+CONFIG_IPV6_NDISC_NODETYPE=y -+# CONFIG_IPV6_TUNNEL is not set -+# CONFIG_IPV6_MULTIPLE_TABLES is not set -+# CONFIG_IPV6_MROUTE is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_NET_DSA is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_SCHED is not set -+# CONFIG_DCB is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+CONFIG_BT=y -+CONFIG_BT_L2CAP=y -+CONFIG_BT_SCO=y -+CONFIG_BT_RFCOMM=y -+CONFIG_BT_RFCOMM_TTY=y -+CONFIG_BT_BNEP=y -+CONFIG_BT_BNEP_MC_FILTER=y -+CONFIG_BT_BNEP_PROTO_FILTER=y -+CONFIG_BT_HIDP=y -+ -+# -+# Bluetooth device drivers -+# -+# CONFIG_BT_HCIBTSDIO is not set -+CONFIG_BT_HCIUART=y -+CONFIG_BT_HCIUART_H4=y -+CONFIG_BT_HCIUART_BCSP=y -+# CONFIG_BT_HCIUART_LL is not set -+# CONFIG_BT_HCIBRF6150 is not set -+# CONFIG_BT_HCIH4P is not set -+# CONFIG_BT_HCIVHCI is not set -+# CONFIG_AF_RXRPC is not set -+# CONFIG_PHONET is not set -+CONFIG_WIRELESS=y -+CONFIG_CFG80211=y -+# CONFIG_CFG80211_REG_DEBUG is not set -+CONFIG_NL80211=y -+CONFIG_WIRELESS_OLD_REGULATORY=y -+CONFIG_WIRELESS_EXT=y -+CONFIG_WIRELESS_EXT_SYSFS=y -+CONFIG_LIB80211=y -+CONFIG_LIB80211_CRYPT_WEP=m -+CONFIG_LIB80211_CRYPT_CCMP=m -+CONFIG_LIB80211_CRYPT_TKIP=m -+CONFIG_MAC80211=y -+ -+# -+# Rate control algorithm selection -+# -+CONFIG_MAC80211_RC_PID=y -+CONFIG_MAC80211_RC_MINSTREL=y -+CONFIG_MAC80211_RC_DEFAULT_PID=y -+# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set -+CONFIG_MAC80211_RC_DEFAULT="pid" -+# CONFIG_MAC80211_MESH is not set -+CONFIG_MAC80211_LEDS=y -+# CONFIG_MAC80211_DEBUGFS is not set -+# CONFIG_MAC80211_DEBUG_MENU is not set -+# CONFIG_WIMAX is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+CONFIG_STANDALONE=y -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+CONFIG_FIRMWARE_IN_KERNEL=y -+CONFIG_EXTRA_FIRMWARE="" -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_CONCAT=y -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_TESTS is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+# CONFIG_MTD_AR7_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+# CONFIG_MTD_OOPS is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+# CONFIG_MTD_CFI is not set -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+CONFIG_MTD_MAP_BANK_WIDTH_4=y -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_DATAFLASH is not set -+# CONFIG_MTD_M25P80 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+CONFIG_MTD_NAND=y -+# CONFIG_MTD_NAND_VERIFY_WRITE is not set -+# CONFIG_MTD_NAND_ECC_SMC is not set -+# CONFIG_MTD_NAND_MUSEUM_IDS is not set -+# CONFIG_MTD_NAND_GPIO is not set -+CONFIG_MTD_NAND_OMAP2=y -+CONFIG_MTD_NAND_IDS=y -+# CONFIG_MTD_NAND_DISKONCHIP is not set -+# CONFIG_MTD_NAND_NANDSIM is not set -+# CONFIG_MTD_NAND_PLATFORM is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# LPDDR flash memory drivers -+# -+# CONFIG_MTD_LPDDR is not set -+# CONFIG_MTD_QINFO_PROBE is not set -+ -+# -+# UBI - Unsorted block images -+# -+# CONFIG_MTD_UBI is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+CONFIG_BLK_DEV_CRYPTOLOOP=m -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=16384 -+# CONFIG_BLK_DEV_XIP is not set -+CONFIG_CDROM_PKTCDVD=m -+CONFIG_CDROM_PKTCDVD_BUFFERS=8 -+# CONFIG_CDROM_PKTCDVD_WCACHE is not set -+# CONFIG_ATA_OVER_ETH is not set -+CONFIG_MISC_DEVICES=y -+# CONFIG_ICS932S401 is not set -+# CONFIG_OMAP_STI is not set -+# CONFIG_ENCLOSURE_SERVICES is not set -+# CONFIG_C2PORT is not set -+ -+# -+# EEPROM support -+# -+# CONFIG_EEPROM_AT24 is not set -+# CONFIG_EEPROM_AT25 is not set -+# CONFIG_EEPROM_LEGACY is not set -+CONFIG_EEPROM_93CX6=m -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+CONFIG_RAID_ATTRS=m -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+CONFIG_CHR_DEV_SG=m -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_LIBFC is not set -+# CONFIG_SCSI_DEBUG is not set -+# CONFIG_SCSI_DH is not set -+# CONFIG_ATA is not set -+CONFIG_MD=y -+CONFIG_BLK_DEV_MD=m -+CONFIG_MD_LINEAR=m -+CONFIG_MD_RAID0=m -+CONFIG_MD_RAID1=m -+CONFIG_MD_RAID10=m -+CONFIG_MD_RAID456=m -+CONFIG_MD_RAID5_RESHAPE=y -+CONFIG_MD_MULTIPATH=m -+CONFIG_MD_FAULTY=m -+CONFIG_BLK_DEV_DM=m -+# CONFIG_DM_DEBUG is not set -+CONFIG_DM_CRYPT=m -+CONFIG_DM_SNAPSHOT=m -+CONFIG_DM_MIRROR=m -+CONFIG_DM_ZERO=m -+CONFIG_DM_MULTIPATH=m -+CONFIG_DM_DELAY=m -+# CONFIG_DM_UEVENT is not set -+CONFIG_NETDEVICES=y -+CONFIG_DUMMY=m -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+CONFIG_TUN=m -+# CONFIG_VETH is not set -+# CONFIG_NET_ETHERNET is not set -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+CONFIG_WLAN_80211=y -+CONFIG_LIBERTAS=y -+CONFIG_LIBERTAS_SDIO=y -+CONFIG_LIBERTAS_DEBUG=y -+# CONFIG_LIBERTAS_THINFIRM is not set -+# CONFIG_MAC80211_HWSIM is not set -+CONFIG_P54_COMMON=m -+# CONFIG_IWLWIFI_LEDS is not set -+CONFIG_HOSTAP=m -+CONFIG_HOSTAP_FIRMWARE=y -+CONFIG_HOSTAP_FIRMWARE_NVRAM=y -+# CONFIG_B43 is not set -+# CONFIG_B43LEGACY is not set -+# CONFIG_RT2X00 is not set -+ -+# -+# Enable WiMAX (Networking options) to see the WiMAX drivers -+# -+# CONFIG_WAN is not set -+CONFIG_PPP=m -+# CONFIG_PPP_MULTILINK is not set -+# CONFIG_PPP_FILTER is not set -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_PPP_MPPE=m -+CONFIG_PPPOE=m -+# CONFIG_PPPOL2TP is not set -+# CONFIG_SLIP is not set -+CONFIG_SLHC=m -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+CONFIG_INPUT_MOUSEDEV_PSAUX=y -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_STOWAWAY is not set -+# CONFIG_KEYBOARD_TWL4030 is not set -+# CONFIG_KEYBOARD_LM8323 is not set -+# CONFIG_KEYBOARD_GPIO is not set -+CONFIG_INPUT_MOUSE=y -+CONFIG_MOUSE_PS2=y -+CONFIG_MOUSE_PS2_ALPS=y -+CONFIG_MOUSE_PS2_LOGIPS2PP=y -+CONFIG_MOUSE_PS2_SYNAPTICS=y -+CONFIG_MOUSE_PS2_LIFEBOOK=y -+CONFIG_MOUSE_PS2_TRACKPOINT=y -+# CONFIG_MOUSE_PS2_ELANTECH is not set -+# CONFIG_MOUSE_PS2_TOUCHKIT is not set -+# CONFIG_MOUSE_SERIAL is not set -+# CONFIG_MOUSE_APPLETOUCH is not set -+# CONFIG_MOUSE_BCM5974 is not set -+# CONFIG_MOUSE_VSXXXAA is not set -+# CONFIG_MOUSE_GPIO is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+CONFIG_SERIO_SERPORT=y -+CONFIG_SERIO_LIBPS2=y -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_CONSOLE_TRANSLATIONS=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+CONFIG_VT_HW_CONSOLE_BINDING=y -+CONFIG_DEVKMEM=y -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+CONFIG_SERIAL_8250=y -+CONFIG_SERIAL_8250_CONSOLE=y -+CONFIG_SERIAL_8250_NR_UARTS=32 -+CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -+CONFIG_SERIAL_8250_EXTENDED=y -+CONFIG_SERIAL_8250_MANY_PORTS=y -+CONFIG_SERIAL_8250_SHARE_IRQ=y -+CONFIG_SERIAL_8250_DETECT_IRQ=y -+CONFIG_SERIAL_8250_RSA=y -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_CORE=y -+CONFIG_SERIAL_CORE_CONSOLE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+CONFIG_HW_RANDOM=y -+# CONFIG_NVRAM is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+CONFIG_I2C_CHARDEV=y -+CONFIG_I2C_HELPER_AUTO=y -+ -+# -+# I2C Hardware Bus support -+# -+ -+# -+# I2C system bus drivers (mostly embedded / system-on-chip) -+# -+# CONFIG_I2C_GPIO is not set -+# CONFIG_I2C_OCORES is not set -+CONFIG_I2C_OMAP=y -+# CONFIG_I2C_SIMTEC is not set -+ -+# -+# External I2C/SMBus adapter drivers -+# -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_TAOS_EVM is not set -+ -+# -+# Other I2C/SMBus bus drivers -+# -+# CONFIG_I2C_PCA_PLATFORM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_PCF8574 is not set -+# CONFIG_PCF8575 is not set -+# CONFIG_SENSORS_PCA9539 is not set -+# CONFIG_SENSORS_PCF8591 is not set -+CONFIG_TWL4030_MADC=m -+CONFIG_TWL4030_PWRBUTTON=y -+CONFIG_TWL4030_POWEROFF=y -+# CONFIG_SENSORS_MAX6875 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_SENSORS_TSL2563 is not set -+# CONFIG_LP5521 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+CONFIG_SPI=y -+# CONFIG_SPI_DEBUG is not set -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+# CONFIG_SPI_BITBANG is not set -+# CONFIG_SPI_GPIO is not set -+CONFIG_SPI_OMAP24XX=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_TSC210X is not set -+# CONFIG_SPI_TSC2301 is not set -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+CONFIG_ARCH_REQUIRE_GPIOLIB=y -+CONFIG_GPIOLIB=y -+CONFIG_DEBUG_GPIO=y -+CONFIG_GPIO_SYSFS=y -+ -+# -+# Memory mapped GPIO expanders: -+# -+ -+# -+# I2C GPIO expanders: -+# -+# CONFIG_GPIO_MAX732X is not set -+# CONFIG_GPIO_PCA953X is not set -+# CONFIG_GPIO_PCF857X is not set -+CONFIG_GPIO_TWL4030=y -+ -+# -+# PCI GPIO expanders: -+# -+ -+# -+# SPI GPIO expanders: -+# -+# CONFIG_GPIO_MAX7301 is not set -+# CONFIG_GPIO_MCP23S08 is not set -+# CONFIG_W1 is not set -+CONFIG_POWER_SUPPLY=m -+# CONFIG_POWER_SUPPLY_DEBUG is not set -+# CONFIG_PDA_POWER is not set -+# CONFIG_BATTERY_DS2760 is not set -+# CONFIG_TWL4030_BCI_BATTERY is not set -+# CONFIG_BATTERY_BQ27x00 is not set -+CONFIG_HWMON=y -+# CONFIG_HWMON_VID is not set -+# CONFIG_SENSORS_AD7414 is not set -+# CONFIG_SENSORS_AD7418 is not set -+# CONFIG_SENSORS_ADCXX is not set -+# CONFIG_SENSORS_ADM1021 is not set -+# CONFIG_SENSORS_ADM1025 is not set -+# CONFIG_SENSORS_ADM1026 is not set -+# CONFIG_SENSORS_ADM1029 is not set -+# CONFIG_SENSORS_ADM1031 is not set -+# CONFIG_SENSORS_ADM9240 is not set -+# CONFIG_SENSORS_ADT7462 is not set -+# CONFIG_SENSORS_ADT7470 is not set -+# CONFIG_SENSORS_ADT7473 is not set -+# CONFIG_SENSORS_ADT7475 is not set -+# CONFIG_SENSORS_ATXP1 is not set -+# CONFIG_SENSORS_DS1621 is not set -+# CONFIG_SENSORS_F71805F is not set -+# CONFIG_SENSORS_F71882FG is not set -+# CONFIG_SENSORS_F75375S is not set -+# CONFIG_SENSORS_GL518SM is not set -+# CONFIG_SENSORS_GL520SM is not set -+# CONFIG_SENSORS_IT87 is not set -+# CONFIG_SENSORS_LM63 is not set -+# CONFIG_SENSORS_LM70 is not set -+# CONFIG_SENSORS_LM75 is not set -+# CONFIG_SENSORS_LM77 is not set -+# CONFIG_SENSORS_LM78 is not set -+# CONFIG_SENSORS_LM80 is not set -+# CONFIG_SENSORS_LM83 is not set -+# CONFIG_SENSORS_LM85 is not set -+# CONFIG_SENSORS_LM87 is not set -+# CONFIG_SENSORS_LM90 is not set -+# CONFIG_SENSORS_LM92 is not set -+# CONFIG_SENSORS_LM93 is not set -+# CONFIG_SENSORS_LTC4245 is not set -+# CONFIG_SENSORS_MAX1111 is not set -+# CONFIG_SENSORS_MAX1619 is not set -+# CONFIG_SENSORS_MAX6650 is not set -+# CONFIG_SENSORS_PC87360 is not set -+# CONFIG_SENSORS_PC87427 is not set -+# CONFIG_SENSORS_DME1737 is not set -+# CONFIG_SENSORS_SMSC47M1 is not set -+# CONFIG_SENSORS_SMSC47M192 is not set -+# CONFIG_SENSORS_SMSC47B397 is not set -+# CONFIG_SENSORS_ADS7828 is not set -+# CONFIG_SENSORS_THMC50 is not set -+# CONFIG_SENSORS_VT1211 is not set -+# CONFIG_SENSORS_W83781D is not set -+# CONFIG_SENSORS_W83791D is not set -+# CONFIG_SENSORS_W83792D is not set -+# CONFIG_SENSORS_W83793 is not set -+# CONFIG_SENSORS_W83L785TS is not set -+# CONFIG_SENSORS_W83L786NG is not set -+# CONFIG_SENSORS_W83627HF is not set -+# CONFIG_SENSORS_W83627EHF is not set -+# CONFIG_SENSORS_TSC210X is not set -+CONFIG_SENSORS_OMAP34XX=y -+# CONFIG_HWMON_DEBUG_CHIP is not set -+# CONFIG_THERMAL is not set -+# CONFIG_THERMAL_HWMON is not set -+CONFIG_WATCHDOG=y -+CONFIG_WATCHDOG_NOWAYOUT=y -+ -+# -+# Watchdog Device Drivers -+# -+# CONFIG_SOFT_WATCHDOG is not set -+CONFIG_OMAP_WATCHDOG=y -+CONFIG_SSB_POSSIBLE=y -+ -+# -+# Sonics Silicon Backplane -+# -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_CORE is not set -+# CONFIG_MFD_SM501 is not set -+# CONFIG_MFD_ASIC3 is not set -+# CONFIG_HTC_EGPIO is not set -+# CONFIG_HTC_PASIC3 is not set -+# CONFIG_TPS65010 is not set -+CONFIG_TWL4030_CORE=y -+# CONFIG_TWL4030_POWER is not set -+# CONFIG_MFD_TMIO is not set -+# CONFIG_MFD_T7L66XB is not set -+# CONFIG_MFD_TC6387XB is not set -+# CONFIG_MFD_TC6393XB is not set -+# CONFIG_PMIC_DA903X is not set -+# CONFIG_MFD_WM8400 is not set -+# CONFIG_MFD_WM8350_I2C is not set -+# CONFIG_MFD_PCF50633 is not set -+ -+# -+# Multimedia devices -+# -+ -+# -+# Multimedia core support -+# -+CONFIG_VIDEO_DEV=m -+CONFIG_VIDEO_V4L2_COMMON=m -+CONFIG_VIDEO_ALLOW_V4L1=y -+CONFIG_VIDEO_V4L1_COMPAT=y -+CONFIG_DVB_CORE=m -+CONFIG_VIDEO_MEDIA=m -+ -+# -+# Multimedia drivers -+# -+CONFIG_MEDIA_ATTACH=y -+CONFIG_MEDIA_TUNER=m -+# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set -+CONFIG_MEDIA_TUNER_SIMPLE=m -+CONFIG_MEDIA_TUNER_TDA8290=m -+CONFIG_MEDIA_TUNER_TDA9887=m -+CONFIG_MEDIA_TUNER_TEA5761=m -+CONFIG_MEDIA_TUNER_TEA5767=m -+CONFIG_MEDIA_TUNER_MT20XX=m -+CONFIG_MEDIA_TUNER_XC2028=m -+CONFIG_MEDIA_TUNER_XC5000=m -+CONFIG_VIDEO_V4L2=m -+CONFIG_VIDEO_V4L1=m -+CONFIG_VIDEO_CAPTURE_DRIVERS=y -+# CONFIG_VIDEO_ADV_DEBUG is not set -+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y -+# CONFIG_VIDEO_VIVI is not set -+# CONFIG_VIDEO_CPIA is not set -+# CONFIG_VIDEO_SAA5246A is not set -+# CONFIG_VIDEO_SAA5249 is not set -+# CONFIG_SOC_CAMERA is not set -+CONFIG_RADIO_ADAPTERS=y -+# CONFIG_RADIO_TEA5764 is not set -+# CONFIG_DVB_DYNAMIC_MINORS is not set -+CONFIG_DVB_CAPTURE_DRIVERS=y -+# CONFIG_TTPCI_EEPROM is not set -+# CONFIG_DVB_B2C2_FLEXCOP is not set -+ -+# -+# Supported DVB Frontends -+# -+ -+# -+# Customise DVB Frontends -+# -+# CONFIG_DVB_FE_CUSTOMISE is not set -+ -+# -+# Multistandard (satellite) frontends -+# -+# CONFIG_DVB_STB0899 is not set -+# CONFIG_DVB_STB6100 is not set -+ -+# -+# DVB-S (satellite) frontends -+# -+CONFIG_DVB_CX24110=m -+CONFIG_DVB_CX24123=m -+CONFIG_DVB_MT312=m -+CONFIG_DVB_S5H1420=m -+# CONFIG_DVB_STV0288 is not set -+# CONFIG_DVB_STB6000 is not set -+CONFIG_DVB_STV0299=m -+CONFIG_DVB_TDA8083=m -+CONFIG_DVB_TDA10086=m -+# CONFIG_DVB_TDA8261 is not set -+CONFIG_DVB_VES1X93=m -+CONFIG_DVB_TUNER_ITD1000=m -+# CONFIG_DVB_TUNER_CX24113 is not set -+CONFIG_DVB_TDA826X=m -+CONFIG_DVB_TUA6100=m -+# CONFIG_DVB_CX24116 is not set -+# CONFIG_DVB_SI21XX is not set -+ -+# -+# DVB-T (terrestrial) frontends -+# -+CONFIG_DVB_SP8870=m -+CONFIG_DVB_SP887X=m -+CONFIG_DVB_CX22700=m -+CONFIG_DVB_CX22702=m -+# CONFIG_DVB_DRX397XD is not set -+CONFIG_DVB_L64781=m -+CONFIG_DVB_TDA1004X=m -+CONFIG_DVB_NXT6000=m -+CONFIG_DVB_MT352=m -+CONFIG_DVB_ZL10353=m -+CONFIG_DVB_DIB3000MB=m -+CONFIG_DVB_DIB3000MC=m -+CONFIG_DVB_DIB7000M=m -+CONFIG_DVB_DIB7000P=m -+CONFIG_DVB_TDA10048=m -+ -+# -+# DVB-C (cable) frontends -+# -+CONFIG_DVB_VES1820=m -+CONFIG_DVB_TDA10021=m -+CONFIG_DVB_TDA10023=m -+CONFIG_DVB_STV0297=m -+ -+# -+# ATSC (North American/Korean Terrestrial/Cable DTV) frontends -+# -+CONFIG_DVB_NXT200X=m -+# CONFIG_DVB_OR51211 is not set -+# CONFIG_DVB_OR51132 is not set -+CONFIG_DVB_BCM3510=m -+CONFIG_DVB_LGDT330X=m -+# CONFIG_DVB_LGDT3304 is not set -+CONFIG_DVB_S5H1409=m -+CONFIG_DVB_AU8522=m -+CONFIG_DVB_S5H1411=m -+ -+# -+# ISDB-T (terrestrial) frontends -+# -+# CONFIG_DVB_S921 is not set -+ -+# -+# Digital terrestrial only tuners/PLL -+# -+CONFIG_DVB_PLL=m -+CONFIG_DVB_TUNER_DIB0070=m -+ -+# -+# SEC control devices for DVB-S -+# -+CONFIG_DVB_LNBP21=m -+# CONFIG_DVB_ISL6405 is not set -+CONFIG_DVB_ISL6421=m -+# CONFIG_DVB_LGS8GL5 is not set -+ -+# -+# Tools to develop new frontends -+# -+# CONFIG_DVB_DUMMY_FE is not set -+# CONFIG_DVB_AF9013 is not set -+# CONFIG_DAB is not set -+ -+# -+# Graphics support -+# -+# CONFIG_VGASTATE is not set -+# CONFIG_VIDEO_OUTPUT_CONTROL is not set -+CONFIG_FB=y -+# CONFIG_FIRMWARE_EDID is not set -+# CONFIG_FB_DDC is not set -+# CONFIG_FB_BOOT_VESA_SUPPORT is not set -+CONFIG_FB_CFB_FILLRECT=m -+CONFIG_FB_CFB_COPYAREA=m -+CONFIG_FB_CFB_IMAGEBLIT=m -+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -+# CONFIG_FB_SYS_FILLRECT is not set -+# CONFIG_FB_SYS_COPYAREA is not set -+# CONFIG_FB_SYS_IMAGEBLIT is not set -+# CONFIG_FB_FOREIGN_ENDIAN is not set -+# CONFIG_FB_SYS_FOPS is not set -+# CONFIG_FB_SVGALIB is not set -+# CONFIG_FB_MACMODES is not set -+# CONFIG_FB_BACKLIGHT is not set -+# CONFIG_FB_MODE_HELPERS is not set -+# CONFIG_FB_TILEBLITTING is not set -+ -+# -+# Frame buffer hardware drivers -+# -+# CONFIG_FB_S1D13XXX is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FB_METRONOME is not set -+# CONFIG_FB_MB862XX is not set -+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set -+CONFIG_OMAP2_DSS=m -+CONFIG_OMAP2_DSS_VRAM_SIZE=8 -+CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y -+# CONFIG_OMAP2_DSS_RFBI is not set -+CONFIG_OMAP2_DSS_VENC=y -+# CONFIG_OMAP2_DSS_SDI is not set -+# CONFIG_OMAP2_DSS_DSI is not set -+# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set -+CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 -+ -+# -+# OMAP2/3 Display Device Drivers -+# -+CONFIG_PANEL_GENERIC=m -+CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C=m -+# CONFIG_PANEL_SHARP_LS037V7DW01 is not set -+# CONFIG_PANEL_N800 is not set -+# CONFIG_CTRL_BLIZZARD is not set -+CONFIG_FB_OMAP2=m -+CONFIG_FB_OMAP2_DEBUG_SUPPORT=y -+# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set -+CONFIG_FB_OMAP2_NUM_FBS=3 -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+CONFIG_DISPLAY_SUPPORT=y -+ -+# -+# Display hardware drivers -+# -+ -+# -+# Console display driver support -+# -+# CONFIG_VGA_CONSOLE is not set -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FRAMEBUFFER_CONSOLE is not set -+# CONFIG_LOGO is not set -+# CONFIG_SOUND is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+CONFIG_HID_DEBUG=y -+# CONFIG_HIDRAW is not set -+# CONFIG_HID_PID is not set -+ -+# -+# Special HID drivers -+# -+CONFIG_HID_COMPAT=y -+# CONFIG_HID_APPLE is not set -+CONFIG_USB_SUPPORT=y -+CONFIG_USB_ARCH_HAS_HCD=y -+CONFIG_USB_ARCH_HAS_OHCI=y -+CONFIG_USB_ARCH_HAS_EHCI=y -+# CONFIG_USB is not set -+# CONFIG_USB_OTG_WHITELIST is not set -+# CONFIG_USB_OTG_BLACKLIST_HUB is not set -+CONFIG_USB_MUSB_HDRC=y -+CONFIG_USB_MUSB_SOC=y -+ -+# -+# OMAP 343x high speed USB support -+# -+# CONFIG_USB_MUSB_HOST is not set -+CONFIG_USB_MUSB_PERIPHERAL=y -+# CONFIG_USB_MUSB_OTG is not set -+CONFIG_USB_GADGET_MUSB_HDRC=y -+CONFIG_MUSB_PIO_ONLY=y -+# CONFIG_USB_MUSB_DEBUG is not set -+ -+# -+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; -+# -+CONFIG_USB_GADGET=y -+# CONFIG_USB_GADGET_DEBUG is not set -+# CONFIG_USB_GADGET_DEBUG_FILES is not set -+# CONFIG_USB_GADGET_DEBUG_FS is not set -+CONFIG_USB_GADGET_VBUS_DRAW=2 -+CONFIG_USB_GADGET_SELECTED=y -+# CONFIG_USB_GADGET_AT91 is not set -+# CONFIG_USB_GADGET_ATMEL_USBA is not set -+# CONFIG_USB_GADGET_FSL_USB2 is not set -+# CONFIG_USB_GADGET_LH7A40X is not set -+# CONFIG_USB_GADGET_OMAP is not set -+# CONFIG_USB_GADGET_PXA25X is not set -+# CONFIG_USB_GADGET_PXA27X is not set -+# CONFIG_USB_GADGET_S3C2410 is not set -+# CONFIG_USB_GADGET_IMX is not set -+# CONFIG_USB_GADGET_M66592 is not set -+# CONFIG_USB_GADGET_AMD5536UDC is not set -+# CONFIG_USB_GADGET_FSL_QE is not set -+# CONFIG_USB_GADGET_CI13XXX is not set -+# CONFIG_USB_GADGET_NET2280 is not set -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+CONFIG_USB_GADGET_DUALSPEED=y -+# CONFIG_USB_ZERO is not set -+CONFIG_USB_ETH=y -+CONFIG_USB_ETH_RNDIS=y -+# CONFIG_USB_GADGETFS is not set -+# CONFIG_USB_FILE_STORAGE is not set -+# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set -+# CONFIG_USB_G_PRINTER is not set -+# CONFIG_USB_CDC_COMPOSITE is not set -+ -+# -+# OTG and related infrastructure -+# -+CONFIG_USB_OTG_UTILS=y -+# CONFIG_USB_GPIO_VBUS is not set -+# CONFIG_ISP1301_OMAP is not set -+CONFIG_TWL4030_USB=y -+CONFIG_MMC=y -+# CONFIG_MMC_DEBUG is not set -+CONFIG_MMC_UNSAFE_RESUME=y -+ -+# -+# MMC/SD/SDIO Card Drivers -+# -+CONFIG_MMC_BLOCK=y -+CONFIG_MMC_BLOCK_BOUNCE=y -+CONFIG_SDIO_UART=y -+# CONFIG_MMC_TEST is not set -+ -+# -+# MMC/SD/SDIO Host Controller Drivers -+# -+# CONFIG_MMC_SDHCI is not set -+CONFIG_MMC_OMAP_HS=y -+# CONFIG_MMC_SPI is not set -+# CONFIG_MEMSTICK is not set -+# CONFIG_ACCESSIBILITY is not set -+CONFIG_NEW_LEDS=y -+CONFIG_LEDS_CLASS=y -+ -+# -+# LED drivers -+# -+# CONFIG_LEDS_OMAP_DEBUG is not set -+# CONFIG_LEDS_OMAP is not set -+# CONFIG_LEDS_OMAP_PWM is not set -+# CONFIG_LEDS_PCA9532 is not set -+CONFIG_LEDS_GPIO=y -+# CONFIG_LEDS_PCA955X is not set -+ -+# -+# LED Triggers -+# -+CONFIG_LEDS_TRIGGERS=y -+CONFIG_LEDS_TRIGGER_TIMER=y -+CONFIG_LEDS_TRIGGER_HEARTBEAT=y -+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set -+CONFIG_RTC_LIB=y -+CONFIG_RTC_CLASS=y -+CONFIG_RTC_HCTOSYS=y -+CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -+# CONFIG_RTC_DEBUG is not set -+ -+# -+# RTC interfaces -+# -+CONFIG_RTC_INTF_SYSFS=y -+CONFIG_RTC_INTF_PROC=y -+CONFIG_RTC_INTF_DEV=y -+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -+# CONFIG_RTC_DRV_TEST is not set -+ -+# -+# I2C RTC drivers -+# -+# CONFIG_RTC_DRV_DS1307 is not set -+# CONFIG_RTC_DRV_DS1374 is not set -+# CONFIG_RTC_DRV_DS1672 is not set -+# CONFIG_RTC_DRV_MAX6900 is not set -+# CONFIG_RTC_DRV_RS5C372 is not set -+# CONFIG_RTC_DRV_ISL1208 is not set -+# CONFIG_RTC_DRV_X1205 is not set -+# CONFIG_RTC_DRV_PCF8563 is not set -+# CONFIG_RTC_DRV_PCF8583 is not set -+# CONFIG_RTC_DRV_M41T80 is not set -+CONFIG_RTC_DRV_TWL4030=y -+# CONFIG_RTC_DRV_S35390A is not set -+# CONFIG_RTC_DRV_FM3130 is not set -+# CONFIG_RTC_DRV_RX8581 is not set -+ -+# -+# SPI RTC drivers -+# -+# CONFIG_RTC_DRV_M41T94 is not set -+# CONFIG_RTC_DRV_DS1305 is not set -+# CONFIG_RTC_DRV_DS1390 is not set -+# CONFIG_RTC_DRV_MAX6902 is not set -+# CONFIG_RTC_DRV_R9701 is not set -+# CONFIG_RTC_DRV_RS5C348 is not set -+# CONFIG_RTC_DRV_DS3234 is not set -+ -+# -+# Platform RTC drivers -+# -+# CONFIG_RTC_DRV_CMOS is not set -+# CONFIG_RTC_DRV_DS1286 is not set -+# CONFIG_RTC_DRV_DS1511 is not set -+# CONFIG_RTC_DRV_DS1553 is not set -+# CONFIG_RTC_DRV_DS1742 is not set -+# CONFIG_RTC_DRV_STK17TA8 is not set -+# CONFIG_RTC_DRV_M48T86 is not set -+# CONFIG_RTC_DRV_M48T35 is not set -+# CONFIG_RTC_DRV_M48T59 is not set -+# CONFIG_RTC_DRV_BQ4802 is not set -+# CONFIG_RTC_DRV_V3020 is not set -+ -+# -+# on-CPU RTC drivers -+# -+# CONFIG_DMADEVICES is not set -+# CONFIG_REGULATOR is not set -+# CONFIG_UIO is not set -+# CONFIG_STAGING is not set -+ -+# -+# CBUS support -+# -+# CONFIG_CBUS is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+# CONFIG_EXT3_FS_XATTR is not set -+# CONFIG_EXT4_FS is not set -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+CONFIG_FS_POSIX_ACL=y -+CONFIG_FILE_LOCKING=y -+CONFIG_XFS_FS=m -+# CONFIG_XFS_QUOTA is not set -+# CONFIG_XFS_POSIX_ACL is not set -+# CONFIG_XFS_RT is not set -+# CONFIG_XFS_DEBUG is not set -+# CONFIG_GFS2_FS is not set -+# CONFIG_OCFS2_FS is not set -+# CONFIG_BTRFS_FS is not set -+CONFIG_DNOTIFY=y -+CONFIG_INOTIFY=y -+CONFIG_INOTIFY_USER=y -+CONFIG_QUOTA=y -+# CONFIG_QUOTA_NETLINK_INTERFACE is not set -+CONFIG_PRINT_QUOTA_WARNING=y -+CONFIG_QUOTA_TREE=y -+# CONFIG_QFMT_V1 is not set -+CONFIG_QFMT_V2=y -+CONFIG_QUOTACTL=y -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+CONFIG_FUSE_FS=m -+ -+# -+# CD-ROM/DVD Filesystems -+# -+CONFIG_ISO9660_FS=m -+CONFIG_JOLIET=y -+CONFIG_ZISOFS=y -+CONFIG_UDF_FS=m -+CONFIG_UDF_NLS=y -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+# CONFIG_NTFS_FS is not set -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+CONFIG_PROC_SYSCTL=y -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+# CONFIG_CONFIGFS_FS is not set -+CONFIG_MISC_FILESYSTEMS=y -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_JFFS2_FS_WRITEBUFFER=y -+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -+CONFIG_JFFS2_SUMMARY=y -+CONFIG_JFFS2_FS_XATTR=y -+CONFIG_JFFS2_FS_POSIX_ACL=y -+CONFIG_JFFS2_FS_SECURITY=y -+CONFIG_JFFS2_COMPRESSION_OPTIONS=y -+CONFIG_JFFS2_ZLIB=y -+CONFIG_JFFS2_LZO=y -+CONFIG_JFFS2_RTIME=y -+CONFIG_JFFS2_RUBIN=y -+# CONFIG_JFFS2_CMODE_NONE is not set -+CONFIG_JFFS2_CMODE_PRIORITY=y -+# CONFIG_JFFS2_CMODE_SIZE is not set -+# CONFIG_JFFS2_CMODE_FAVOURLZO is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_SQUASHFS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_OMFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+# CONFIG_NFS_V3_ACL is not set -+CONFIG_NFS_V4=y -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+CONFIG_EXPORTFS=m -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+CONFIG_SUNRPC_GSS=y -+# CONFIG_SUNRPC_REGISTER_V4 is not set -+CONFIG_RPCSEC_GSS_KRB5=y -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+CONFIG_ENABLE_WARN_DEPRECATED=y -+CONFIG_ENABLE_MUST_CHECK=y -+CONFIG_FRAME_WARN=1024 -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_UNUSED_SYMBOLS is not set -+CONFIG_DEBUG_FS=y -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SHIRQ is not set -+CONFIG_DETECT_SOFTLOCKUP=y -+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 -+CONFIG_SCHED_DEBUG=y -+CONFIG_SCHEDSTATS=y -+CONFIG_TIMER_STATS=y -+# CONFIG_DEBUG_OBJECTS is not set -+# CONFIG_SLUB_DEBUG_ON is not set -+# CONFIG_SLUB_STATS is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+CONFIG_DEBUG_MUTEXES=y -+# CONFIG_DEBUG_LOCK_ALLOC is not set -+# CONFIG_PROVE_LOCKING is not set -+# CONFIG_LOCK_STAT is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+CONFIG_STACKTRACE=y -+# CONFIG_DEBUG_KOBJECT is not set -+# CONFIG_DEBUG_BUGVERBOSE is not set -+# CONFIG_DEBUG_INFO is not set -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_WRITECOUNT is not set -+# CONFIG_DEBUG_MEMORY_INIT is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_DEBUG_SG is not set -+# CONFIG_DEBUG_NOTIFIERS is not set -+CONFIG_FRAME_POINTER=y -+# CONFIG_BOOT_PRINTK_DELAY is not set -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_RCU_CPU_STALL_DETECTOR is not set -+# CONFIG_BACKTRACE_SELF_TEST is not set -+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -+# CONFIG_FAULT_INJECTION is not set -+# CONFIG_LATENCYTOP is not set -+CONFIG_NOP_TRACER=y -+CONFIG_HAVE_FUNCTION_TRACER=y -+CONFIG_RING_BUFFER=y -+CONFIG_TRACING=y -+ -+# -+# Tracers -+# -+# CONFIG_FUNCTION_TRACER is not set -+# CONFIG_IRQSOFF_TRACER is not set -+# CONFIG_SCHED_TRACER is not set -+# CONFIG_CONTEXT_SWITCH_TRACER is not set -+# CONFIG_BOOT_TRACER is not set -+# CONFIG_TRACE_BRANCH_PROFILING is not set -+# CONFIG_STACK_TRACER is not set -+# CONFIG_FTRACE_STARTUP_TEST is not set -+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set -+# CONFIG_SAMPLES is not set -+CONFIG_HAVE_ARCH_KGDB=y -+# CONFIG_KGDB is not set -+# CONFIG_DEBUG_USER is not set -+# CONFIG_DEBUG_ERRORS is not set -+# CONFIG_DEBUG_STACK_USAGE is not set -+# CONFIG_DEBUG_LL is not set -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITYFS is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_XOR_BLOCKS=m -+CONFIG_ASYNC_CORE=m -+CONFIG_ASYNC_MEMCPY=m -+CONFIG_ASYNC_XOR=m -+CONFIG_CRYPTO=y -+ -+# -+# Crypto core or helper -+# -+# CONFIG_CRYPTO_FIPS is not set -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_ALGAPI2=y -+CONFIG_CRYPTO_AEAD2=y -+CONFIG_CRYPTO_BLKCIPHER=y -+CONFIG_CRYPTO_BLKCIPHER2=y -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_HASH2=y -+CONFIG_CRYPTO_RNG2=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_MANAGER2=y -+CONFIG_CRYPTO_GF128MUL=m -+CONFIG_CRYPTO_NULL=m -+CONFIG_CRYPTO_CRYPTD=m -+# CONFIG_CRYPTO_AUTHENC is not set -+CONFIG_CRYPTO_TEST=m -+ -+# -+# Authenticated Encryption with Associated Data -+# -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_SEQIV is not set -+ -+# -+# Block modes -+# -+CONFIG_CRYPTO_CBC=y -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_CTS is not set -+CONFIG_CRYPTO_ECB=y -+CONFIG_CRYPTO_LRW=m -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_XTS is not set -+ -+# -+# Hash modes -+# -+CONFIG_CRYPTO_HMAC=m -+CONFIG_CRYPTO_XCBC=m -+ -+# -+# Digest -+# -+CONFIG_CRYPTO_CRC32C=y -+CONFIG_CRYPTO_MD4=m -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_MICHAEL_MIC=y -+# CONFIG_CRYPTO_RMD128 is not set -+# CONFIG_CRYPTO_RMD160 is not set -+# CONFIG_CRYPTO_RMD256 is not set -+# CONFIG_CRYPTO_RMD320 is not set -+CONFIG_CRYPTO_SHA1=m -+CONFIG_CRYPTO_SHA256=m -+CONFIG_CRYPTO_SHA512=m -+CONFIG_CRYPTO_TGR192=m -+CONFIG_CRYPTO_WP512=m -+ -+# -+# Ciphers -+# -+CONFIG_CRYPTO_AES=y -+CONFIG_CRYPTO_ANUBIS=m -+CONFIG_CRYPTO_ARC4=y -+CONFIG_CRYPTO_BLOWFISH=m -+CONFIG_CRYPTO_CAMELLIA=m -+CONFIG_CRYPTO_CAST5=m -+CONFIG_CRYPTO_CAST6=m -+CONFIG_CRYPTO_DES=y -+CONFIG_CRYPTO_FCRYPT=m -+CONFIG_CRYPTO_KHAZAD=m -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_SEED is not set -+CONFIG_CRYPTO_SERPENT=m -+CONFIG_CRYPTO_TEA=m -+CONFIG_CRYPTO_TWOFISH=m -+CONFIG_CRYPTO_TWOFISH_COMMON=m -+ -+# -+# Compression -+# -+CONFIG_CRYPTO_DEFLATE=m -+# CONFIG_CRYPTO_LZO is not set -+ -+# -+# Random Number Generation -+# -+# CONFIG_CRYPTO_ANSI_CPRNG is not set -+CONFIG_CRYPTO_HW=y -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_GENERIC_FIND_LAST_BIT=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=m -+CONFIG_CRC_T10DIF=y -+CONFIG_CRC_ITU_T=y -+CONFIG_CRC32=y -+CONFIG_CRC7=y -+CONFIG_LIBCRC32C=y -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y -+CONFIG_LZO_COMPRESS=y -+CONFIG_LZO_DECOMPRESS=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_IOPORT=y -+CONFIG_HAS_DMA=y -diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c -index 8780ca6..ca4680a 100644 ---- a/arch/arm/mach-omap1/board-nokia770.c -+++ b/arch/arm/mach-omap1/board-nokia770.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -32,7 +33,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c -index 0a1099e..2bba94d 100644 ---- a/arch/arm/mach-omap2/board-3430sdp.c -+++ b/arch/arm/mach-omap2/board-3430sdp.c -@@ -255,8 +255,226 @@ static struct regulator_consumer_supply sdp3430_vdac_supply = { - static struct regulator_consumer_supply sdp3430_vdvi_supply = { - .supply = "vdvi", - .dev = &sdp3430_lcd_device.dev, -+ -+#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 -+#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 -+#if 0 -+#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 24 -+#define SDP3430_LCD_PANEL_ENABLE_GPIO 28 -+#else -+#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8 -+#define SDP3430_LCD_PANEL_ENABLE_GPIO 5 -+#endif -+ -+#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER -+#define ENABLE_VAUX2_DEDICATED 0x09 -+#define ENABLE_VAUX2_DEV_GRP 0x20 -+#define ENABLE_VAUX3_DEDICATED 0x03 -+#define ENABLE_VAUX3_DEV_GRP 0x20 -+ -+#define ENABLE_VPLL2_DEDICATED 0x05 -+#define ENABLE_VPLL2_DEV_GRP 0xE0 -+#define TWL4030_VPLL2_DEV_GRP 0x33 -+#define TWL4030_VPLL2_DEDICATED 0x36 -+ -+#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) -+ -+static unsigned backlight_gpio; -+static unsigned enable_gpio; -+static int lcd_enabled; -+static int dvi_enabled; -+ -+static void enable_vpll2(int enable) -+{ -+ u8 ded_val, grp_val; -+ -+ if (enable) { -+ ded_val = ENABLE_VPLL2_DEDICATED; -+ grp_val = ENABLE_VPLL2_DEV_GRP; -+ } else { -+ ded_val = 0; -+ grp_val = 0; -+ } -+ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ded_val, TWL4030_VPLL2_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ grp_val, TWL4030_VPLL2_DEV_GRP); -+} -+ -+static int sdp3430_dsi_power_up(void) -+{ -+ if (omap_rev() > OMAP3430_REV_ES1_0) -+ enable_vpll2(1); -+ return 0; -+} -+ -+static void sdp3430_dsi_power_down(void) -+{ -+ if (omap_rev() > OMAP3430_REV_ES1_0) -+ enable_vpll2(0); -+} -+ -+static void __init sdp3430_display_init(void) -+{ -+ int r; -+ -+ enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; -+ backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; -+ -+ r = gpio_request(enable_gpio, "LCD reset"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD reset GPIO\n"); -+ goto err0; -+ } -+ -+ r = gpio_request(backlight_gpio, "LCD Backlight"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD backlight GPIO\n"); -+ goto err1; -+ } -+ -+ gpio_direction_output(enable_gpio, 0); -+ gpio_direction_output(backlight_gpio, 0); -+ -+ return; -+err1: -+ gpio_free(enable_gpio); -+err0: -+ return; -+} -+ -+ -+static int sdp3430_panel_enable_lcd(struct omap_display *display) -+{ -+ u8 ded_val, ded_reg; -+ u8 grp_val, grp_reg; -+ -+ if (dvi_enabled) { -+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); -+ return -EINVAL; -+ } -+ -+ ded_reg = TWL4030_VAUX3_DEDICATED; -+ ded_val = ENABLE_VAUX3_DEDICATED; -+ grp_reg = TWL4030_VAUX3_DEV_GRP; -+ grp_val = ENABLE_VAUX3_DEV_GRP; -+ -+ gpio_direction_output(enable_gpio, 1); -+ gpio_direction_output(backlight_gpio, 1); -+ -+ if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg)) -+ return -EIO; -+ if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg)) -+ return -EIO; -+ -+ sdp3430_dsi_power_up(); -+ -+ lcd_enabled = 1; -+ -+ return 0; -+} -+ -+static void sdp3430_panel_disable_lcd(struct omap_display *display) -+{ -+ lcd_enabled = 0; -+ -+ sdp3430_dsi_power_down(); -+ -+ gpio_direction_output(enable_gpio, 0); -+ gpio_direction_output(backlight_gpio, 0); -+} -+ -+static struct omap_dss_display_config sdp3430_display_data = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "lcd", -+ .panel_name = "sharp-ls037v7dw01", -+ .u.dpi.data_lines = 16, -+ .panel_enable = sdp3430_panel_enable_lcd, -+ .panel_disable = sdp3430_panel_disable_lcd, - }; - -+static int sdp3430_panel_enable_dvi(struct omap_display *display) -+{ -+ if (lcd_enabled) { -+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); -+ return -EINVAL; -+ } -+ -+ sdp3430_dsi_power_up(); -+ -+ dvi_enabled = 1; -+ -+ return 0; -+} -+ -+static void sdp3430_panel_disable_dvi(struct omap_display *display) -+{ -+ sdp3430_dsi_power_down(); -+ -+ dvi_enabled = 0; -+} -+ -+ -+static struct omap_dss_display_config sdp3430_display_data_dvi = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "dvi", -+ .panel_name = "panel-generic", -+ .u.dpi.data_lines = 24, -+ .panel_enable = sdp3430_panel_enable_dvi, -+ .panel_disable = sdp3430_panel_disable_dvi, -+}; -+ -+static int sdp3430_panel_enable_tv(struct omap_display *display) -+{ -+#define ENABLE_VDAC_DEDICATED 0x03 -+#define ENABLE_VDAC_DEV_GRP 0x20 -+ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEDICATED, -+ TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); -+ -+ return 0; -+} -+ -+static void sdp3430_panel_disable_tv(struct omap_display *display) -+{ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEV_GRP); -+} -+ -+static struct omap_dss_display_config sdp3430_display_data_tv = { -+ .type = OMAP_DISPLAY_TYPE_VENC, -+ .name = "tv", -+ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, -+ .panel_enable = sdp3430_panel_enable_tv, -+ .panel_disable = sdp3430_panel_disable_tv, -+}; -+ -+static struct omap_dss_board_info sdp3430_dss_data = { -+ .dsi_power_up = sdp3430_dsi_power_up, -+ .dsi_power_down = sdp3430_dsi_power_down, -+ .num_displays = 3, -+ .displays = { -+ &sdp3430_display_data, -+ &sdp3430_display_data_dvi, -+ &sdp3430_display_data_tv, -+ } -+}; -+ -+static struct platform_device sdp3430_dss_device = { -+ .name = "omapdss", -+ .id = -1, -+ .dev = { -+ .platform_data = &sdp3430_dss_data, -+ }, -+}; -+ -+ - static struct platform_device *sdp3430_devices[] __initdata = { - &sdp3430_smc91x_device, - &sdp3430_lcd_device, -diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c -index 60a414c..6abfdb4 100644 ---- a/arch/arm/mach-omap2/board-n800.c -+++ b/arch/arm/mach-omap2/board-n800.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -39,8 +40,8 @@ - #include - #include - #include --#include - #include -+#include - - #include <../drivers/cbus/tahvo.h> - #include <../drivers/media/video/tcm825x.h> -@@ -161,23 +162,176 @@ static struct omap_uart_config n800_uart_config __initdata = { - - #include "../../../drivers/cbus/retu.h" - --static struct omap_fbmem_config n800_fbmem0_config __initdata = { -- .size = 752 * 1024, -+static struct omap_tmp105_config n800_tmp105_config __initdata = { -+ .tmp105_irq_pin = 125, -+ .set_power = n800_tmp105_set_power, - }; - --static struct omap_fbmem_config n800_fbmem1_config __initdata = { -- .size = 752 * 1024, --}; - --static struct omap_fbmem_config n800_fbmem2_config __initdata = { -- .size = 752 * 1024, -+ -+ -+/* DISPLAY */ -+static struct { -+ struct clk *sys_ck; -+} blizzard; -+ -+static int blizzard_get_clocks(void) -+{ -+ blizzard.sys_ck = clk_get(0, "osc_ck"); -+ if (IS_ERR(blizzard.sys_ck)) { -+ printk(KERN_ERR "can't get Blizzard clock\n"); -+ return PTR_ERR(blizzard.sys_ck); -+ } -+ return 0; -+} -+ -+static unsigned long blizzard_get_clock_rate(void) -+{ -+ return clk_get_rate(blizzard.sys_ck); -+} -+ -+static int n800_pn800_enable(struct omap_display *display) -+{ -+ if (display->hw_config.panel_reset_gpio != -1) { -+ printk("enabling panel gpio\n"); -+ gpio_direction_output(display->hw_config.panel_reset_gpio, 1); -+ } -+ -+ return 0; -+} -+ -+static void n800_pn800_disable(struct omap_display *display) -+{ -+ if (display->hw_config.panel_reset_gpio != -1) { -+ printk("disabling panel gpio\n"); -+ gpio_direction_output(display->hw_config.panel_reset_gpio, 0); -+ msleep(120); -+ } -+} -+ -+static int n800_blizzard_enable(struct omap_display *display) -+{ -+ printk("enabling bliz powers\n"); -+ -+ /* Vcore to 1.475V */ -+ tahvo_set_clear_reg_bits(0x07, 0, 0xf); -+ msleep(10); -+ -+ clk_enable(blizzard.sys_ck); -+ -+ if (display->hw_config.ctrl_reset_gpio != -1) -+ gpio_direction_output(display->hw_config.ctrl_reset_gpio, 1); -+ -+ printk("osc_ck %lu\n", blizzard_get_clock_rate()); -+ -+ return 0; -+} -+ -+static void n800_blizzard_disable(struct omap_display *display) -+{ -+ printk("disabling bliz powers\n"); -+ -+ if (display->hw_config.ctrl_reset_gpio != -1) -+ gpio_direction_output(display->hw_config.ctrl_reset_gpio, 0); -+ -+ clk_disable(blizzard.sys_ck); -+ -+ /* Vcore to 1.005V */ -+ tahvo_set_clear_reg_bits(0x07, 0xf, 0); -+} -+ -+static int n800_set_backlight_level(struct omap_display *display, int level) -+{ -+ return 0; -+} -+ -+static struct omap_dss_display_config n800_dsi_display_data = { -+ .type = OMAP_DISPLAY_TYPE_DBI, -+ .name = "lcd", -+ .ctrl_name = "ctrl-blizzard", -+ .panel_name = "panel-pn800", -+ .panel_reset_gpio = -1, -+ .ctrl_reset_gpio = N800_BLIZZARD_POWERDOWN_GPIO, -+ .panel_enable = n800_pn800_enable, -+ .panel_disable = n800_pn800_disable, -+ .ctrl_enable = n800_blizzard_enable, -+ .ctrl_disable = n800_blizzard_disable, -+ .set_backlight = n800_set_backlight_level, -+ .u.rfbi = { -+ .channel = 0, -+ /* 8 for cmd mode, 16 for pixel data. ctrl-blizzard handles switching */ -+ .data_lines = 8, -+ }, -+ .panel_data = 0, // XXX used for panel datalines -+}; -+static struct omap_dss_board_info n800_dss_data = { -+ .num_displays = 1, -+ .displays = { -+ &n800_dsi_display_data, -+ }, - }; - --static struct omap_tmp105_config n800_tmp105_config __initdata = { -- .tmp105_irq_pin = 125, -- .set_power = n800_tmp105_set_power, -+static struct platform_device n800_dss_device = { -+ .name = "omapdss", -+ .id = -1, -+ .dev = { -+ .platform_data = &n800_dss_data, -+ }, - }; - -+static void __init n800_display_init(void) -+{ -+ int r; -+ const struct omap_lcd_config *conf; -+ -+ conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); -+ if (conf != NULL) { -+ n800_dsi_display_data.panel_reset_gpio = conf->nreset_gpio; -+ n800_dsi_display_data.panel_data = -+ (void*)(u32)conf->data_lines; // XXX -+ //printk("\n\nTULI %d\n\n", conf->data_lines); -+ } else { -+ printk("\n\nEI TULLU MIOTÄÄÄ\n\n"); -+ } -+ -+ blizzard_get_clocks(); -+ clk_enable(blizzard.sys_ck); // XXX always enable -+ -+ //omapfb_set_ctrl_platform_data(&n800_blizzard_data); -+ // -+ if (n800_dsi_display_data.ctrl_reset_gpio != -1) { -+ r = gpio_request(n800_dsi_display_data.ctrl_reset_gpio, -+ "Blizzard pd"); -+ if (r < 0) { -+ n800_dsi_display_data.ctrl_reset_gpio = -1; -+ printk(KERN_ERR "Unable to get Blizzard GPIO\n"); -+ } else { -+ gpio_direction_output(n800_dsi_display_data.ctrl_reset_gpio, -+ 1); -+ // XXX always enable -+ } -+ } -+ -+ if (n800_dsi_display_data.panel_reset_gpio != -1) { -+ r = gpio_request(n800_dsi_display_data.panel_reset_gpio, -+ "panel reset"); -+ if (r < 0) { -+ n800_dsi_display_data.panel_reset_gpio = -1; -+ printk(KERN_ERR "Unable to get pn800 GPIO\n"); -+ } else { -+ gpio_direction_output(n800_dsi_display_data.panel_reset_gpio, -+ 1); -+ // XXX always enable -+ } -+ } -+} -+ -+/* DISPLAY END */ -+ -+ -+ -+ -+ - static void mipid_shutdown(struct mipid_platform_data *pdata) - { - if (pdata->nreset_gpio != -1) { -@@ -191,6 +345,7 @@ static struct mipid_platform_data n800_mipid_platform_data = { - .shutdown = mipid_shutdown, - }; - -+#if 0 - static void __init mipid_dev_init(void) - { - const struct omap_lcd_config *conf; -@@ -201,26 +356,9 @@ static void __init mipid_dev_init(void) - n800_mipid_platform_data.data_lines = conf->data_lines; - } - } -+#endif - --static struct { -- struct clk *sys_ck; --} blizzard; -- --static int blizzard_get_clocks(void) --{ -- blizzard.sys_ck = clk_get(0, "osc_ck"); -- if (IS_ERR(blizzard.sys_ck)) { -- printk(KERN_ERR "can't get Blizzard clock\n"); -- return PTR_ERR(blizzard.sys_ck); -- } -- return 0; --} -- --static unsigned long blizzard_get_clock_rate(struct device *dev) --{ -- return clk_get_rate(blizzard.sys_ck); --} -- -+#if 0 - static void blizzard_enable_clocks(int enable) - { - if (enable) -@@ -265,14 +403,12 @@ static void __init blizzard_dev_init(void) - gpio_direction_output(N800_BLIZZARD_POWERDOWN_GPIO, 1); - - blizzard_get_clocks(); -- omapfb_set_ctrl_platform_data(&n800_blizzard_data); -+ //omapfb_set_ctrl_platform_data(&n800_blizzard_data); - } -+#endif - - static struct omap_board_config_kernel n800_config[] __initdata = { - { OMAP_TAG_UART, &n800_uart_config }, -- { OMAP_TAG_FBMEM, &n800_fbmem0_config }, -- { OMAP_TAG_FBMEM, &n800_fbmem1_config }, -- { OMAP_TAG_FBMEM, &n800_fbmem2_config }, - { OMAP_TAG_TMP105, &n800_tmp105_config }, - }; - -@@ -379,7 +515,7 @@ static struct omap2_mcspi_device_config tsc2005_mcspi_config = { - - static struct spi_board_info n800_spi_board_info[] __initdata = { - { -- .modalias = "lcd_mipid", -+ .modalias = "panel-n800", - .bus_num = 1, - .chip_select = 1, - .max_speed_hz = 4000000, -@@ -404,7 +540,7 @@ static struct spi_board_info n800_spi_board_info[] __initdata = { - - static struct spi_board_info n810_spi_board_info[] __initdata = { - { -- .modalias = "lcd_mipid", -+ .modalias = "panel-n800", - .bus_num = 1, - .chip_select = 1, - .max_speed_hz = 4000000, -@@ -572,6 +708,7 @@ static struct platform_device *n800_devices[] __initdata = { - #if defined(CONFIG_CBUS_RETU) && defined(CONFIG_LEDS_OMAP_PWM) - &n800_keypad_led_device, - #endif -+ &n800_dss_device, - }; - - #ifdef CONFIG_MENELAUS -@@ -703,9 +840,10 @@ void __init nokia_n800_common_init(void) - if (machine_is_nokia_n810()) - i2c_register_board_info(2, n810_i2c_board_info_2, - ARRAY_SIZE(n810_i2c_board_info_2)); -- -- mipid_dev_init(); -- blizzard_dev_init(); -+ -+ //mipid_dev_init(); -+ //blizzard_dev_init(); -+ n800_display_init(); - } - - static void __init nokia_n800_init(void) -@@ -726,6 +864,7 @@ void __init nokia_n800_map_io(void) - omap_board_config_size = ARRAY_SIZE(n800_config); - - omap2_set_globals_242x(); -+ omap2_set_sdram_vram(800 * 480 * 2 * 3, 0); - omap2_map_common_io(); - } - -diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c -index 346351e..7d2716b 100644 ---- a/arch/arm/mach-omap2/board-omap3beagle.c -+++ b/arch/arm/mach-omap2/board-omap3beagle.c -@@ -30,6 +30,7 @@ - - #include - #include -+#include - - #include - #include -@@ -43,6 +44,7 @@ - #include - #include - #include -+#include - - #include "twl4030-generic-scripts.h" - #include "mmc-twl4030.h" -@@ -369,13 +371,94 @@ static struct platform_device keys_gpio = { - }, - }; - -+/* DSS */ -+ -+static int beagle_enable_dvi(struct omap_display *display) -+{ -+ if (display->hw_config.panel_reset_gpio != -1) -+ gpio_direction_output(display->hw_config.panel_reset_gpio, 1); -+ -+ return 0; -+} -+ -+static void beagle_disable_dvi(struct omap_display *display) -+{ -+ if (display->hw_config.panel_reset_gpio != -1) -+ gpio_direction_output(display->hw_config.panel_reset_gpio, 0); -+} -+ -+static struct omap_dss_display_config beagle_display_data_dvi = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "dvi", -+ .panel_name = "panel-generic", -+ .u.dpi.data_lines = 24, -+ .panel_reset_gpio = 170, -+ .panel_enable = beagle_enable_dvi, -+ .panel_disable = beagle_disable_dvi, -+}; -+ -+ -+static int beagle_panel_enable_tv(struct omap_display *display) -+{ -+#define ENABLE_VDAC_DEDICATED 0x03 -+#define ENABLE_VDAC_DEV_GRP 0x20 -+ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEDICATED, -+ TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); -+ -+ return 0; -+} -+ -+static void beagle_panel_disable_tv(struct omap_display *display) -+{ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEV_GRP); -+} -+ -+static struct omap_dss_display_config beagle_display_data_tv = { -+ .type = OMAP_DISPLAY_TYPE_VENC, -+ .name = "tv", -+ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, -+ .panel_enable = beagle_panel_enable_tv, -+ .panel_disable = beagle_panel_disable_tv, -+}; -+ -+static struct omap_dss_board_info beagle_dss_data = { -+ .num_displays = 2, -+ .displays = { -+ &beagle_display_data_dvi, -+ &beagle_display_data_tv, -+ } -+}; -+ -+static struct platform_device beagle_dss_device = { -+ .name = "omapdss", -+ .id = -1, -+ .dev = { -+ .platform_data = &beagle_dss_data, -+ }, -+}; -+ -+static void __init beagle_display_init(void) -+{ -+ int r; -+ -+ r = gpio_request(beagle_display_data_dvi.panel_reset_gpio, "DVI reset"); -+ if (r < 0) -+ printk(KERN_ERR "Unable to get DVI reset GPIO\n"); -+} -+ - static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { - { OMAP_TAG_UART, &omap3_beagle_uart_config }, -- { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, - }; - - static struct platform_device *omap3_beagle_devices[] __initdata = { -- &omap3_beagle_lcd_device, -+ &beagle_dss_device, - &leds_gpio, - &keys_gpio, - }; -@@ -428,13 +511,11 @@ static void __init omap3_beagle_init(void) - omap_serial_init(); - - omap_cfg_reg(J25_34XX_GPIO170); -- gpio_request(170, "DVI_nPD"); -- /* REVISIT leave DVI powered down until it's needed ... */ -- gpio_direction_output(170, true); - - usb_musb_init(); - usb_ehci_init(); - omap3beagle_flash_init(); -+ beagle_display_init(); - } - - static void __init omap3_beagle_map_io(void) -diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c -index 024d7c4..7a720ec 100644 ---- a/arch/arm/mach-omap2/board-omap3evm.c -+++ b/arch/arm/mach-omap2/board-omap3evm.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - #include "sdram-micron-mt46h32m32lf-6.h" - #include "twl4030-generic-scripts.h" -@@ -216,13 +217,201 @@ static int __init omap3_evm_i2c_init(void) - return 0; - } - --static struct platform_device omap3_evm_lcd_device = { -- .name = "omap3evm_lcd", -- .id = -1, -+#define LCD_PANEL_LR 2 -+#define LCD_PANEL_UD 3 -+#define LCD_PANEL_INI 152 -+#define LCD_PANEL_ENABLE_GPIO 153 -+#define LCD_PANEL_QVGA 154 -+#define LCD_PANEL_RESB 155 -+ -+#define ENABLE_VDAC_DEDICATED 0x03 -+#define ENABLE_VDAC_DEV_GRP 0x20 -+#define ENABLE_VPLL2_DEDICATED 0x05 -+#define ENABLE_VPLL2_DEV_GRP 0xE0 -+ -+#define TWL4030_GPIODATA_IN3 0x03 -+#define TWL4030_GPIODATA_DIR3 0x06 -+#define TWL4030_VPLL2_DEV_GRP 0x33 -+#define TWL4030_VPLL2_DEDICATED 0x36 -+ -+static int lcd_enabled; -+static int dvi_enabled; -+ -+static void __init omap3_evm_display_init(void) -+{ -+ int r; -+ r = gpio_request(LCD_PANEL_LR, "lcd_panel_lr"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD_PANEL_LR\n"); -+ return; -+ } -+ r = gpio_request(LCD_PANEL_UD, "lcd_panel_ud"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD_PANEL_UD\n"); -+ goto err_1; -+ } -+ -+ r = gpio_request(LCD_PANEL_INI, "lcd_panel_ini"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD_PANEL_INI\n"); -+ goto err_2; -+ } -+ r = gpio_request(LCD_PANEL_RESB, "lcd_panel_resb"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD_PANEL_RESB\n"); -+ goto err_3; -+ } -+ r = gpio_request(LCD_PANEL_QVGA, "lcd_panel_qvga"); -+ if (r) { -+ printk(KERN_ERR "failed to get LCD_PANEL_QVGA\n"); -+ goto err_4; -+ } -+ -+ gpio_direction_output(LCD_PANEL_LR, 0); -+ gpio_direction_output(LCD_PANEL_UD, 0); -+ gpio_direction_output(LCD_PANEL_INI, 0); -+ gpio_direction_output(LCD_PANEL_RESB, 0); -+ gpio_direction_output(LCD_PANEL_QVGA, 0); -+ -+#define TWL_LED_LEDEN 0x00 -+#define TWL_PWMA_PWMAON 0x00 -+#define TWL_PWMA_PWMAOFF 0x01 -+ -+ twl4030_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF); -+ -+ gpio_direction_output(LCD_PANEL_RESB, 1); -+ gpio_direction_output(LCD_PANEL_INI, 1); -+ gpio_direction_output(LCD_PANEL_QVGA, 0); -+ gpio_direction_output(LCD_PANEL_LR, 1); -+ gpio_direction_output(LCD_PANEL_UD, 1); -+ -+ return; -+ -+err_4: -+ gpio_free(LCD_PANEL_RESB); -+err_3: -+ gpio_free(LCD_PANEL_INI); -+err_2: -+ gpio_free(LCD_PANEL_UD); -+err_1: -+ gpio_free(LCD_PANEL_LR); -+ -+} -+ -+static int omap3_evm_panel_enable_lcd(struct omap_display *display) -+{ -+ if (dvi_enabled) { -+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); -+ return -EINVAL; -+ } -+ if (omap_rev() > OMAP3430_REV_ES1_0) { -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP); -+ } -+ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); -+ lcd_enabled = 1; -+ return 0; -+} -+ -+static void omap3_evm_panel_disable_lcd(struct omap_display *display) -+{ -+ if (omap_rev() > OMAP3430_REV_ES1_0) { -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, -+ TWL4030_VPLL2_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, -+ TWL4030_VPLL2_DEV_GRP); -+ } -+ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); -+ lcd_enabled = 0; -+} -+ -+static struct omap_display_data omap3_evm_display_data = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "lcd", -+ .panel_name = "sharp-ls037v7dw01", -+ .u.dpi.data_lines = 18, -+ .panel_enable = omap3_evm_panel_enable_lcd, -+ .panel_disable = omap3_evm_panel_disable_lcd, - }; - --static struct omap_lcd_config omap3_evm_lcd_config __initdata = { -- .ctrl_name = "internal", -+static int omap3_evm_panel_enable_tv(struct omap_display *display) -+{ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEDICATED, TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, -+ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); -+ return 0; -+} -+ -+static void omap3_evm_panel_disable_tv(struct omap_display *display) -+{ -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEDICATED); -+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, -+ TWL4030_VDAC_DEV_GRP); -+} -+ -+static struct omap_display_data omap3_evm_display_data_tv = { -+ .type = OMAP_DISPLAY_TYPE_VENC, -+ .name = "tv", -+ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, -+ .panel_enable = omap3_evm_panel_enable_tv, -+ .panel_disable = omap3_evm_panel_disable_tv, -+}; -+ -+ -+static int omap3_evm_panel_enable_dvi(struct omap_display *display) -+{ -+ if (lcd_enabled) { -+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); -+ return -EINVAL; -+ } -+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, -+ TWL4030_GPIODATA_IN3); -+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, -+ TWL4030_GPIODATA_DIR3); -+ dvi_enabled = 1; -+ -+ return 0; -+} -+ -+static void omap3_evm_panel_disable_dvi(struct omap_display *display) -+{ -+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00, -+ TWL4030_GPIODATA_IN3); -+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00, -+ TWL4030_GPIODATA_DIR3); -+ dvi_enabled = 0; -+} -+ -+ -+static struct omap_display_data omap3_evm_display_data_dvi = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "dvi", -+ .panel_name = "panel-generic", -+ .u.dpi.data_lines = 24, -+ .panel_enable = omap3_evm_panel_enable_dvi, -+ .panel_disable = omap3_evm_panel_disable_dvi, -+}; -+ -+static struct omap_dss_platform_data omap3_evm_dss_data = { -+ .num_displays = 3, -+ .displays = { -+ &omap3_evm_display_data, -+ &omap3_evm_display_data_dvi, -+ &omap3_evm_display_data_tv, -+ } -+}; -+static struct platform_device omap3_evm_dss_device = { -+ .name = "omapdss", -+ .id = -1, -+ .dev = { -+ .platform_data = &omap3_evm_dss_data, -+ }, - }; - - static void ads7846_dev_init(void) -@@ -281,11 +470,10 @@ static void __init omap3_evm_init_irq(void) - - static struct omap_board_config_kernel omap3_evm_config[] __initdata = { - { OMAP_TAG_UART, &omap3_evm_uart_config }, -- { OMAP_TAG_LCD, &omap3_evm_lcd_config }, - }; - - static struct platform_device *omap3_evm_devices[] __initdata = { -- &omap3_evm_lcd_device, -+ &omap3_evm_dss_device, - &omap3evm_smc911x_device, - }; - -@@ -305,6 +493,7 @@ static void __init omap3_evm_init(void) - usb_ehci_init(); - omap3evm_flash_init(); - ads7846_dev_init(); -+ omap3_evm_display_init(); - } - - static void __init omap3_evm_map_io(void) -diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c -index 071f4b0..267bb6b 100644 ---- a/arch/arm/mach-omap2/board-overo.c -+++ b/arch/arm/mach-omap2/board-overo.c -@@ -41,6 +41,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -176,6 +177,9 @@ static void __init overo_ads7846_init(void) - static inline void __init overo_ads7846_init(void) { return; } - #endif - -+static int lcd_enabled; -+static int dvi_enabled; -+ - static struct mtd_partition overo_nand_partitions[] = { - { - .name = "xloader", -@@ -360,22 +364,101 @@ static void __init overo_init_irq(void) - omap_gpio_init(); - } - --static struct platform_device overo_lcd_device = { -- .name = "overo_lcd", -- .id = -1, -+/* DSS */ -+ -+#define OVERO_GPIO_LCD_EN 144 -+ -+static void __init overo_display_init(void) -+{ -+ int r; -+ -+ r = gpio_request(OVERO_GPIO_LCD_EN, "display enable"); -+ if (r) -+ printk("fail1\n"); -+ r = gpio_direction_output(OVERO_GPIO_LCD_EN, 1); -+ if (r) -+ printk("fail2\n"); -+ gpio_export(OVERO_GPIO_LCD_EN, 0); -+} -+ -+static int overo_panel_enable_dvi(struct omap_display *display) -+{ -+ if (lcd_enabled) { -+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); -+ return -EINVAL; -+ } -+ dvi_enabled = 1; -+ -+ gpio_set_value(OVERO_GPIO_LCD_EN, 1); -+ -+ return 0; -+} -+ -+static void overo_panel_disable_dvi(struct omap_display *display) -+{ -+ gpio_set_value(OVERO_GPIO_LCD_EN, 0); -+ -+ dvi_enabled = 0; -+} -+ -+static struct omap_dss_display_config overo_display_data_dvi = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "dvi", -+ .panel_name = "panel-generic", -+ .u.dpi.data_lines = 24, -+ .panel_enable = overo_panel_enable_dvi, -+ .panel_disable = overo_panel_disable_dvi, - }; - --static struct omap_lcd_config overo_lcd_config __initdata = { -- .ctrl_name = "internal", -+static int overo_panel_enable_lcd(struct omap_display *display) -+{ -+ if (dvi_enabled) { -+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); -+ return -EINVAL; -+ } -+ -+ gpio_set_value(OVERO_GPIO_LCD_EN, 1); -+ lcd_enabled = 1; -+ return 0; -+} -+ -+static void overo_panel_disable_lcd(struct omap_display *display) -+{ -+ gpio_set_value(OVERO_GPIO_LCD_EN, 0); -+ lcd_enabled = 0; -+} -+ -+static struct omap_dss_display_config overo_display_data_lcd = { -+ .type = OMAP_DISPLAY_TYPE_DPI, -+ .name = "lcd43", -+ .panel_name = "samsung-lte430wq-f0c", -+ .u.dpi.data_lines = 24, -+ .panel_enable = overo_panel_enable_lcd, -+ .panel_disable = overo_panel_disable_lcd, -+ }; -+ -+static struct omap_dss_board_info overo_dss_data = { -+ .num_displays = 2, -+ .displays = { -+ &overo_display_data_dvi, -+ &overo_display_data_lcd, -+ } -+}; -+ -+static struct platform_device overo_dss_device = { -+ .name = "omapdss", -+ .id = -1, -+ .dev = { -+ .platform_data = &overo_dss_data, -+ }, - }; - - static struct omap_board_config_kernel overo_config[] __initdata = { - { OMAP_TAG_UART, &overo_uart_config }, -- { OMAP_TAG_LCD, &overo_lcd_config }, - }; - - static struct platform_device *overo_devices[] __initdata = { -- &overo_lcd_device, -+ &overo_dss_device, - }; - - static void __init overo_init(void) -@@ -390,6 +473,7 @@ static void __init overo_init(void) - overo_flash_init(); - overo_init_smsc911x(); - overo_ads7846_init(); -+ overo_display_init(); - - if ((gpio_request(OVERO_GPIO_W2W_NRESET, - "OVERO_GPIO_W2W_NRESET") == 0) && -diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c -index adbe21f..a04e3ee 100644 ---- a/arch/arm/mach-omap2/io.c -+++ b/arch/arm/mach-omap2/io.c -@@ -18,13 +18,13 @@ - #include - #include - #include -+#include - #include - - #include - - #include - #include --#include - #include - #include - #include -diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile -index 3ebc09e..e6146b2 100644 ---- a/arch/arm/plat-omap/Makefile -+++ b/arch/arm/plat-omap/Makefile -@@ -4,7 +4,7 @@ - - # Common support - obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \ -- usb.o fb.o io.o -+ usb.o fb.o vram.o vrfb.o io.o - obj-m := - obj-n := - obj- := -diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c -index 3746222..1dc3415 100644 ---- a/arch/arm/plat-omap/fb.c -+++ b/arch/arm/plat-omap/fb.c -@@ -28,13 +28,13 @@ - #include - #include - #include -+#include - - #include - #include - - #include - #include --#include - - #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) - -@@ -327,6 +327,34 @@ static inline int omap_init_fb(void) - - arch_initcall(omap_init_fb); - -+#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) -+ -+static u64 omap_fb_dma_mask = ~(u32)0; -+static struct omapfb_platform_data omapfb_config; -+ -+static struct platform_device omap_fb_device = { -+ .name = "omapfb", -+ .id = -1, -+ .dev = { -+ .dma_mask = &omap_fb_dma_mask, -+ .coherent_dma_mask = ~(u32)0, -+ .platform_data = &omapfb_config, -+ }, -+ .num_resources = 0, -+}; -+ -+void omapfb_set_platform_data(struct omapfb_platform_data *data) -+{ -+ omapfb_config = *data; -+} -+ -+static inline int omap_init_fb(void) -+{ -+ return platform_device_register(&omap_fb_device); -+} -+ -+arch_initcall(omap_init_fb); -+ - #else - - void omapfb_reserve_sdram(void) {} -diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h -new file mode 100644 -index 0000000..6288353 ---- /dev/null -+++ b/arch/arm/plat-omap/include/mach/display.h -@@ -0,0 +1,520 @@ -+/* -+ * linux/include/asm-arm/arch-omap/display.h -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#ifndef __ASM_ARCH_OMAP_DISPLAY_H -+#define __ASM_ARCH_OMAP_DISPLAY_H -+ -+#include -+#include -+#include -+ -+#define DISPC_IRQ_FRAMEDONE (1 << 0) -+#define DISPC_IRQ_VSYNC (1 << 1) -+#define DISPC_IRQ_EVSYNC_EVEN (1 << 2) -+#define DISPC_IRQ_EVSYNC_ODD (1 << 3) -+#define DISPC_IRQ_ACBIAS_COUNT_STAT (1 << 4) -+#define DISPC_IRQ_PROG_LINE_NUM (1 << 5) -+#define DISPC_IRQ_GFX_FIFO_UNDERFLOW (1 << 6) -+#define DISPC_IRQ_GFX_END_WIN (1 << 7) -+#define DISPC_IRQ_PAL_GAMMA_MASK (1 << 8) -+#define DISPC_IRQ_OCP_ERR (1 << 9) -+#define DISPC_IRQ_VID1_FIFO_UNDERFLOW (1 << 10) -+#define DISPC_IRQ_VID1_END_WIN (1 << 11) -+#define DISPC_IRQ_VID2_FIFO_UNDERFLOW (1 << 12) -+#define DISPC_IRQ_VID2_END_WIN (1 << 13) -+#define DISPC_IRQ_SYNC_LOST (1 << 14) -+#define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15) -+#define DISPC_IRQ_WAKEUP (1 << 16) -+ -+enum omap_display_type { -+ OMAP_DISPLAY_TYPE_NONE = 0, -+ OMAP_DISPLAY_TYPE_DPI = 1 << 0, -+ OMAP_DISPLAY_TYPE_DBI = 1 << 1, -+ OMAP_DISPLAY_TYPE_SDI = 1 << 2, -+ OMAP_DISPLAY_TYPE_DSI = 1 << 3, -+ OMAP_DISPLAY_TYPE_VENC = 1 << 4, -+}; -+ -+enum omap_plane { -+ OMAP_DSS_GFX = 0, -+ OMAP_DSS_VIDEO1 = 1, -+ OMAP_DSS_VIDEO2 = 2 -+}; -+ -+enum omap_channel { -+ OMAP_DSS_CHANNEL_LCD = 0, -+ OMAP_DSS_CHANNEL_DIGIT = 1, -+}; -+ -+enum omap_color_mode { -+ OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */ -+ OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */ -+ OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */ -+ OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */ -+ OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */ -+ OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */ -+ OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */ -+ OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */ -+ OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */ -+ OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */ -+ OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */ -+ OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ -+ OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ -+ OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ -+ -+ OMAP_DSS_COLOR_GFX_OMAP3 = -+ OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | -+ OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | -+ OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | -+ OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | -+ OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | -+ OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, -+ -+ OMAP_DSS_COLOR_VID_OMAP3 = -+ OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | -+ OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | -+ OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | -+ OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 | -+ OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY, -+}; -+ -+enum omap_lcd_display_type { -+ OMAP_DSS_LCD_DISPLAY_STN, -+ OMAP_DSS_LCD_DISPLAY_TFT, -+}; -+ -+enum omap_dss_load_mode { -+ OMAP_DSS_LOAD_CLUT_AND_FRAME = 0, -+ OMAP_DSS_LOAD_CLUT_ONLY = 1, -+ OMAP_DSS_LOAD_FRAME_ONLY = 2, -+ OMAP_DSS_LOAD_CLUT_ONCE_FRAME = 3, -+}; -+ -+enum omap_dss_color_key_type { -+ OMAP_DSS_COLOR_KEY_GFX_DST = 0, -+ OMAP_DSS_COLOR_KEY_VID_SRC = 1, -+}; -+ -+enum omap_rfbi_te_mode { -+ OMAP_DSS_RFBI_TE_MODE_1 = 1, -+ OMAP_DSS_RFBI_TE_MODE_2 = 2, -+}; -+ -+enum omap_panel_config { -+ OMAP_DSS_LCD_IVS = 1<<0, -+ OMAP_DSS_LCD_IHS = 1<<1, -+ OMAP_DSS_LCD_IPC = 1<<2, -+ OMAP_DSS_LCD_IEO = 1<<3, -+ OMAP_DSS_LCD_RF = 1<<4, -+ OMAP_DSS_LCD_ONOFF = 1<<5, -+ -+ OMAP_DSS_LCD_TFT = 1<<20, -+}; -+ -+enum omap_dss_venc_type { -+ OMAP_DSS_VENC_TYPE_COMPOSITE, -+ OMAP_DSS_VENC_TYPE_SVIDEO, -+}; -+ -+struct omap_display; -+struct omap_panel; -+struct omap_ctrl; -+ -+/* RFBI */ -+ -+struct rfbi_timings { -+ int cs_on_time; -+ int cs_off_time; -+ int we_on_time; -+ int we_off_time; -+ int re_on_time; -+ int re_off_time; -+ int we_cycle_time; -+ int re_cycle_time; -+ int cs_pulse_width; -+ int access_time; -+ -+ int clk_div; -+ -+ u32 tim[5]; /* set by rfbi_convert_timings() */ -+ -+ int converted; -+}; -+ -+void omap_rfbi_write_command(const void *buf, u32 len); -+void omap_rfbi_read_data(void *buf, u32 len); -+void omap_rfbi_write_data(const void *buf, u32 len); -+void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, -+ u16 x, u16 y, -+ u16 w, u16 h); -+int omap_rfbi_enable_te(bool enable, unsigned line); -+int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, -+ unsigned hs_pulse_time, unsigned vs_pulse_time, -+ int hs_pol_inv, int vs_pol_inv, int extif_div); -+ -+/* DSI */ -+int dsi_vc_dcs_write(int channel, u8 *data, int len); -+int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len); -+int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen); -+int dsi_vc_set_max_rx_packet_size(int channel, u16 len); -+int dsi_vc_send_null(int channel); -+ -+/* Board specific data */ -+struct omap_dss_display_config { -+ enum omap_display_type type; -+ -+ union { -+ struct { -+ u8 data_lines; -+ } dpi; -+ -+ struct { -+ u8 channel; -+ u8 data_lines; -+ } rfbi; -+ -+ struct { -+ u8 datapairs; -+ } sdi; -+ -+ struct { -+ u8 clk_lane; -+ u8 clk_pol; -+ u8 data1_lane; -+ u8 data1_pol; -+ u8 data2_lane; -+ u8 data2_pol; -+ unsigned long ddr_clk_hz; -+ } dsi; -+ -+ struct { -+ enum omap_dss_venc_type type; -+ } venc; -+ } u; -+ -+ int panel_reset_gpio; -+ int ctrl_reset_gpio; -+ -+ const char *name; /* for debug */ -+ const char *ctrl_name; -+ const char *panel_name; -+ -+ void *panel_data; -+ void *ctrl_data; -+ -+ /* platform specific enable/disable */ -+ int (*panel_enable)(struct omap_display *display); -+ void (*panel_disable)(struct omap_display *display); -+ int (*ctrl_enable)(struct omap_display *display); -+ void (*ctrl_disable)(struct omap_display *display); -+ int (*set_backlight)(struct omap_display *display, -+ int level); -+}; -+ -+struct device; -+ -+/* Board specific data */ -+struct omap_dss_board_info { -+ unsigned (*get_last_off_on_transaction_id)(struct device *dev); -+ int (*dsi_power_up)(void); -+ void (*dsi_power_down)(void); -+ int num_displays; -+ struct omap_dss_display_config *displays[]; -+}; -+ -+struct omap_ctrl { -+ struct module *owner; -+ -+ const char *name; -+ -+ int (*init)(struct omap_display *display); -+ void (*cleanup)(struct omap_display *display); -+ int (*enable)(struct omap_display *display); -+ void (*disable)(struct omap_display *display); -+ int (*suspend)(struct omap_display *display); -+ int (*resume)(struct omap_display *display); -+ void (*setup_update)(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h); -+ -+ int (*enable_te)(struct omap_display *display, bool enable); -+ -+ u8 (*get_rotate)(struct omap_display *display); -+ int (*set_rotate)(struct omap_display *display, u8 rotate); -+ -+ bool (*get_mirror)(struct omap_display *display); -+ int (*set_mirror)(struct omap_display *display, bool enable); -+ -+ int (*run_test)(struct omap_display *display, int test); -+ int (*memory_read)(struct omap_display *display, -+ void *buf, size_t size, -+ u16 x, u16 y, u16 w, u16 h); -+ -+ u8 pixel_size; -+ -+ struct rfbi_timings timings; -+ -+ void *priv; -+}; -+ -+struct omap_video_timings { -+ /* Unit: pixels */ -+ u16 x_res; -+ /* Unit: pixels */ -+ u16 y_res; -+ /* Unit: KHz */ -+ u32 pixel_clock; -+ /* Unit: pixel clocks */ -+ u16 hsw; /* Horizontal synchronization pulse width */ -+ /* Unit: pixel clocks */ -+ u16 hfp; /* Horizontal front porch */ -+ /* Unit: pixel clocks */ -+ u16 hbp; /* Horizontal back porch */ -+ /* Unit: line clocks */ -+ u16 vsw; /* Vertical synchronization pulse width */ -+ /* Unit: line clocks */ -+ u16 vfp; /* Vertical front porch */ -+ /* Unit: line clocks */ -+ u16 vbp; /* Vertical back porch */ -+ -+}; -+ -+#ifdef CONFIG_OMAP2_DSS_VENC -+/* Hardcoded timings for tv modes. Venc only uses these to -+ * identify the mode, and does not actually use the configs -+ * itself. However, the configs should be something that -+ * a normal monitor can also show */ -+const extern struct omap_video_timings omap_dss_pal_timings; -+const extern struct omap_video_timings omap_dss_ntsc_timings; -+#endif -+ -+struct omap_panel { -+ struct module *owner; -+ -+ const char *name; -+ -+ int (*init)(struct omap_display *display); -+ void (*cleanup)(struct omap_display *display); -+ int (*remove)(struct omap_display *display); -+ int (*enable)(struct omap_display *display); -+ void (*disable)(struct omap_display *display); -+ int (*suspend)(struct omap_display *display); -+ int (*resume)(struct omap_display *display); -+ int (*run_test)(struct omap_display *display, int test); -+ -+ struct omap_video_timings timings; -+ -+ int acbi; /* ac-bias pin transitions per interrupt */ -+ /* Unit: line clocks */ -+ int acb; /* ac-bias pin frequency */ -+ -+ enum omap_panel_config config; -+ -+ u8 recommended_bpp; -+ -+ void *priv; -+}; -+ -+/* XXX perhaps this should be removed */ -+enum omap_dss_overlay_managers { -+ OMAP_DSS_OVL_MGR_LCD, -+ OMAP_DSS_OVL_MGR_TV, -+}; -+ -+struct omap_overlay_manager; -+ -+struct omap_overlay_info { -+ bool enabled; -+ -+ u32 paddr; -+ void __iomem *vaddr; -+ u16 screen_width; -+ u16 width; -+ u16 height; -+ enum omap_color_mode color_mode; -+ u8 rotation; -+ bool mirror; -+ -+ u16 pos_x; -+ u16 pos_y; -+ u16 out_width; /* if 0, out_width == width */ -+ u16 out_height; /* if 0, out_height == height */ -+}; -+ -+enum omap_overlay_caps { -+ OMAP_DSS_OVL_CAP_SCALE = 1 << 0, -+ OMAP_DSS_OVL_CAP_DISPC = 1 << 1, -+}; -+ -+struct omap_overlay { -+ struct kobject kobj; -+ struct list_head list; -+ -+ const char *name; -+ int id; -+ struct omap_overlay_manager *manager; -+ enum omap_color_mode supported_modes; -+ struct omap_overlay_info info; -+ enum omap_overlay_caps caps; -+ -+ int (*set_manager)(struct omap_overlay *ovl, -+ struct omap_overlay_manager *mgr); -+ int (*unset_manager)(struct omap_overlay *ovl); -+ -+ int (*set_overlay_info)(struct omap_overlay *ovl, -+ struct omap_overlay_info *info); -+ void (*get_overlay_info)(struct omap_overlay *ovl, -+ struct omap_overlay_info *info); -+}; -+ -+enum omap_overlay_manager_caps { -+ OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0, -+}; -+ -+struct omap_overlay_manager { -+ struct kobject kobj; -+ struct list_head list; -+ -+ const char *name; -+ int id; -+ enum omap_overlay_manager_caps caps; -+ struct omap_display *display; -+ int num_overlays; -+ struct omap_overlay **overlays; -+ enum omap_display_type supported_displays; -+ -+ int (*set_display)(struct omap_overlay_manager *mgr, -+ struct omap_display *display); -+ int (*unset_display)(struct omap_overlay_manager *mgr); -+ -+ int (*apply)(struct omap_overlay_manager *mgr); -+ -+ void (*set_default_color)(struct omap_overlay_manager *mgr, u32 color); -+ void (*set_trans_key)(struct omap_overlay_manager *mgr, -+ enum omap_dss_color_key_type type, -+ u32 trans_key); -+ void (*enable_trans_key)(struct omap_overlay_manager *mgr, -+ bool enable); -+}; -+ -+enum omap_display_caps { -+ OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0, -+}; -+ -+enum omap_dss_update_mode { -+ OMAP_DSS_UPDATE_DISABLED = 0, -+ OMAP_DSS_UPDATE_AUTO, -+ OMAP_DSS_UPDATE_MANUAL, -+}; -+ -+enum omap_dss_display_state { -+ OMAP_DSS_DISPLAY_DISABLED = 0, -+ OMAP_DSS_DISPLAY_ACTIVE, -+ OMAP_DSS_DISPLAY_SUSPENDED, -+}; -+ -+struct omap_display { -+ struct kobject kobj; -+ struct list_head list; -+ -+ /*atomic_t ref_count;*/ -+ int ref_count; -+ /* helper variable for driver suspend/resume */ -+ int activate_after_resume; -+ -+ enum omap_display_type type; -+ const char *name; -+ -+ enum omap_display_caps caps; -+ -+ struct omap_overlay_manager *manager; -+ -+ enum omap_dss_display_state state; -+ -+ struct omap_dss_display_config hw_config; /* board specific data */ -+ struct omap_ctrl *ctrl; /* static common data */ -+ struct omap_panel *panel; /* static common data */ -+ -+ int (*enable)(struct omap_display *display); -+ void (*disable)(struct omap_display *display); -+ -+ int (*suspend)(struct omap_display *display); -+ int (*resume)(struct omap_display *display); -+ -+ void (*get_resolution)(struct omap_display *display, -+ u16 *xres, u16 *yres); -+ int (*get_recommended_bpp)(struct omap_display *display); -+ -+ int (*check_timings)(struct omap_display *display, -+ struct omap_video_timings *timings); -+ void (*set_timings)(struct omap_display *display, -+ struct omap_video_timings *timings); -+ void (*get_timings)(struct omap_display *display, -+ struct omap_video_timings *timings); -+ int (*update)(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h); -+ int (*sync)(struct omap_display *display); -+ int (*wait_vsync)(struct omap_display *display); -+ -+ int (*set_update_mode)(struct omap_display *display, -+ enum omap_dss_update_mode); -+ enum omap_dss_update_mode (*get_update_mode) -+ (struct omap_display *display); -+ -+ int (*enable_te)(struct omap_display *display, bool enable); -+ int (*get_te)(struct omap_display *display); -+ -+ u8 (*get_rotate)(struct omap_display *display); -+ int (*set_rotate)(struct omap_display *display, u8 rotate); -+ -+ bool (*get_mirror)(struct omap_display *display); -+ int (*set_mirror)(struct omap_display *display, bool enable); -+ -+ int (*run_test)(struct omap_display *display, int test); -+ int (*memory_read)(struct omap_display *display, -+ void *buf, size_t size, -+ u16 x, u16 y, u16 w, u16 h); -+ -+ void (*configure_overlay)(struct omap_overlay *overlay); -+}; -+ -+int omap_dss_get_num_displays(void); -+struct omap_display *omap_dss_get_display(int no); -+void omap_dss_put_display(struct omap_display *display); -+ -+void omap_dss_register_ctrl(struct omap_ctrl *ctrl); -+void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl); -+ -+void omap_dss_register_panel(struct omap_panel *panel); -+void omap_dss_unregister_panel(struct omap_panel *panel); -+ -+int omap_dss_get_num_overlay_managers(void); -+struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); -+ -+int omap_dss_get_num_overlays(void); -+struct omap_overlay *omap_dss_get_overlay(int num); -+ -+typedef void (*omap_dispc_isr_t) (void *arg, u32 mask); -+int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); -+int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); -+ -+int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout); -+int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, -+ unsigned long timeout); -+ -+#endif -diff --git a/arch/arm/plat-omap/include/mach/omapfb.h b/arch/arm/plat-omap/include/mach/omapfb.h -deleted file mode 100644 -index b226bdf..0000000 ---- a/arch/arm/plat-omap/include/mach/omapfb.h -+++ /dev/null -@@ -1,398 +0,0 @@ --/* -- * File: arch/arm/plat-omap/include/mach/omapfb.h -- * -- * Framebuffer driver for TI OMAP boards -- * -- * Copyright (C) 2004 Nokia Corporation -- * Author: Imre Deak -- * -- * 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. -- */ -- --#ifndef __OMAPFB_H --#define __OMAPFB_H -- --#include --#include -- --/* IOCTL commands. */ -- --#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) --#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) --#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) --#define OMAP_IO(num) _IO('O', num) -- --#define OMAPFB_MIRROR OMAP_IOW(31, int) --#define OMAPFB_SYNC_GFX OMAP_IO(37) --#define OMAPFB_VSYNC OMAP_IO(38) --#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) --#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) --#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) --#define OMAPFB_LCD_TEST OMAP_IOW(45, int) --#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) --#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) --#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) --#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) --#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) --#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) --#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) --#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) --#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) -- --#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff --#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 --#define OMAPFB_CAPS_PANEL_MASK 0xff000000 -- --#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 --#define OMAPFB_CAPS_TEARSYNC 0x00002000 --#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 --#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 --#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 --#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 --#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 --#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 --#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 -- --/* Values from DSP must map to lower 16-bits */ --#define OMAPFB_FORMAT_MASK 0x00ff --#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 --#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 --#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 --#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 --#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 -- --#define OMAPFB_EVENT_READY 1 --#define OMAPFB_EVENT_DISABLED 2 -- --#define OMAPFB_MEMTYPE_SDRAM 0 --#define OMAPFB_MEMTYPE_SRAM 1 --#define OMAPFB_MEMTYPE_MAX 1 -- --enum omapfb_color_format { -- OMAPFB_COLOR_RGB565 = 0, -- OMAPFB_COLOR_YUV422, -- OMAPFB_COLOR_YUV420, -- OMAPFB_COLOR_CLUT_8BPP, -- OMAPFB_COLOR_CLUT_4BPP, -- OMAPFB_COLOR_CLUT_2BPP, -- OMAPFB_COLOR_CLUT_1BPP, -- OMAPFB_COLOR_RGB444, -- OMAPFB_COLOR_YUY422, --}; -- --struct omapfb_update_window { -- __u32 x, y; -- __u32 width, height; -- __u32 format; -- __u32 out_x, out_y; -- __u32 out_width, out_height; -- __u32 reserved[8]; --}; -- --struct omapfb_update_window_old { -- __u32 x, y; -- __u32 width, height; -- __u32 format; --}; -- --enum omapfb_plane { -- OMAPFB_PLANE_GFX = 0, -- OMAPFB_PLANE_VID1, -- OMAPFB_PLANE_VID2, --}; -- --enum omapfb_channel_out { -- OMAPFB_CHANNEL_OUT_LCD = 0, -- OMAPFB_CHANNEL_OUT_DIGIT, --}; -- --struct omapfb_plane_info { -- __u32 pos_x; -- __u32 pos_y; -- __u8 enabled; -- __u8 channel_out; -- __u8 mirror; -- __u8 reserved1; -- __u32 out_width; -- __u32 out_height; -- __u32 reserved2[12]; --}; -- --struct omapfb_mem_info { -- __u32 size; -- __u8 type; -- __u8 reserved[3]; --}; -- --struct omapfb_caps { -- __u32 ctrl; -- __u32 plane_color; -- __u32 wnd_color; --}; -- --enum omapfb_color_key_type { -- OMAPFB_COLOR_KEY_DISABLED = 0, -- OMAPFB_COLOR_KEY_GFX_DST, -- OMAPFB_COLOR_KEY_VID_SRC, --}; -- --struct omapfb_color_key { -- __u8 channel_out; -- __u32 background; -- __u32 trans_key; -- __u8 key_type; --}; -- --enum omapfb_update_mode { -- OMAPFB_UPDATE_DISABLED = 0, -- OMAPFB_AUTO_UPDATE, -- OMAPFB_MANUAL_UPDATE --}; -- --#ifdef __KERNEL__ -- --#include --#include --#include --#include -- --#include -- --#define OMAP_LCDC_INV_VSYNC 0x0001 --#define OMAP_LCDC_INV_HSYNC 0x0002 --#define OMAP_LCDC_INV_PIX_CLOCK 0x0004 --#define OMAP_LCDC_INV_OUTPUT_EN 0x0008 --#define OMAP_LCDC_HSVS_RISING_EDGE 0x0010 --#define OMAP_LCDC_HSVS_OPPOSITE 0x0020 -- --#define OMAP_LCDC_SIGNAL_MASK 0x003f -- --#define OMAP_LCDC_PANEL_TFT 0x0100 -- --#define OMAPFB_PLANE_XRES_MIN 8 --#define OMAPFB_PLANE_YRES_MIN 8 -- --#ifdef CONFIG_ARCH_OMAP1 --#define OMAPFB_PLANE_NUM 1 --#else --#define OMAPFB_PLANE_NUM 3 --#endif -- --struct omapfb_device; -- --struct lcd_panel { -- const char *name; -- int config; /* TFT/STN, signal inversion */ -- int bpp; /* Pixel format in fb mem */ -- int data_lines; /* Lines on LCD HW interface */ -- -- int x_res, y_res; -- int pixel_clock; /* In kHz */ -- int hsw; /* Horizontal synchronization -- pulse width */ -- int hfp; /* Horizontal front porch */ -- int hbp; /* Horizontal back porch */ -- int vsw; /* Vertical synchronization -- pulse width */ -- int vfp; /* Vertical front porch */ -- int vbp; /* Vertical back porch */ -- int acb; /* ac-bias pin frequency */ -- int pcd; /* pixel clock divider. -- Obsolete use pixel_clock instead */ -- -- int (*init) (struct lcd_panel *panel, -- struct omapfb_device *fbdev); -- void (*cleanup) (struct lcd_panel *panel); -- int (*enable) (struct lcd_panel *panel); -- void (*disable) (struct lcd_panel *panel); -- unsigned long (*get_caps) (struct lcd_panel *panel); -- int (*set_bklight_level)(struct lcd_panel *panel, -- unsigned int level); -- unsigned int (*get_bklight_level)(struct lcd_panel *panel); -- unsigned int (*get_bklight_max) (struct lcd_panel *panel); -- int (*run_test) (struct lcd_panel *panel, int test_num); --}; -- --struct extif_timings { -- int cs_on_time; -- int cs_off_time; -- int we_on_time; -- int we_off_time; -- int re_on_time; -- int re_off_time; -- int we_cycle_time; -- int re_cycle_time; -- int cs_pulse_width; -- int access_time; -- -- int clk_div; -- -- u32 tim[5]; /* set by extif->convert_timings */ -- -- int converted; --}; -- --struct lcd_ctrl_extif { -- int (*init) (struct omapfb_device *fbdev); -- void (*cleanup) (void); -- void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div); -- unsigned long (*get_max_tx_rate)(void); -- int (*convert_timings) (struct extif_timings *timings); -- void (*set_timings) (const struct extif_timings *timings); -- void (*set_bits_per_cycle)(int bpc); -- void (*write_command) (const void *buf, unsigned int len); -- void (*read_data) (void *buf, unsigned int len); -- void (*write_data) (const void *buf, unsigned int len); -- void (*transfer_area) (int width, int height, -- void (callback)(void * data), void *data); -- int (*setup_tearsync) (unsigned pin_cnt, -- unsigned hs_pulse_time, unsigned vs_pulse_time, -- int hs_pol_inv, int vs_pol_inv, int div); -- int (*enable_tearsync) (int enable, unsigned line); -- -- unsigned long max_transmit_size; --}; -- --struct omapfb_notifier_block { -- struct notifier_block nb; -- void *data; -- int plane_idx; --}; -- --typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, -- unsigned long event, -- void *fbi); -- --struct omapfb_mem_region { -- u32 paddr; -- void __iomem *vaddr; -- unsigned long size; -- u8 type; /* OMAPFB_PLANE_MEM_* */ -- unsigned alloc:1; /* allocated by the driver */ -- unsigned map:1; /* kernel mapped by the driver */ --}; -- --struct omapfb_mem_desc { -- int region_cnt; -- struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; --}; -- --struct lcd_ctrl { -- const char *name; -- void *data; -- -- int (*init) (struct omapfb_device *fbdev, -- int ext_mode, -- struct omapfb_mem_desc *req_md); -- void (*cleanup) (void); -- void (*bind_client) (struct omapfb_notifier_block *nb); -- void (*get_caps) (int plane, struct omapfb_caps *caps); -- int (*set_update_mode)(enum omapfb_update_mode mode); -- enum omapfb_update_mode (*get_update_mode)(void); -- int (*setup_plane) (int plane, int channel_out, -- unsigned long offset, -- int screen_width, -- int pos_x, int pos_y, int width, -- int height, int color_mode); -- int (*set_rotate) (int angle); -- int (*setup_mem) (int plane, size_t size, -- int mem_type, unsigned long *paddr); -- int (*mmap) (struct fb_info *info, -- struct vm_area_struct *vma); -- int (*set_scale) (int plane, -- int orig_width, int orig_height, -- int out_width, int out_height); -- int (*enable_plane) (int plane, int enable); -- int (*update_window) (struct fb_info *fbi, -- struct omapfb_update_window *win, -- void (*callback)(void *), -- void *callback_data); -- void (*sync) (void); -- void (*suspend) (void); -- void (*resume) (void); -- int (*run_test) (int test_num); -- int (*setcolreg) (u_int regno, u16 red, u16 green, -- u16 blue, u16 transp, -- int update_hw_mem); -- int (*set_color_key) (struct omapfb_color_key *ck); -- int (*get_color_key) (struct omapfb_color_key *ck); --}; -- --enum omapfb_state { -- OMAPFB_DISABLED = 0, -- OMAPFB_SUSPENDED= 99, -- OMAPFB_ACTIVE = 100 --}; -- --struct omapfb_plane_struct { -- int idx; -- struct omapfb_plane_info info; -- enum omapfb_color_format color_mode; -- struct omapfb_device *fbdev; --}; -- --struct omapfb_device { -- int state; -- int ext_lcdc; /* Using external -- LCD controller */ -- struct mutex rqueue_mutex; -- -- int palette_size; -- u32 pseudo_palette[17]; -- -- struct lcd_panel *panel; /* LCD panel */ -- const struct lcd_ctrl *ctrl; /* LCD controller */ -- const struct lcd_ctrl *int_ctrl; /* internal LCD ctrl */ -- struct lcd_ctrl_extif *ext_if; /* LCD ctrl external -- interface */ -- struct device *dev; -- struct fb_var_screeninfo new_var; /* for mode changes */ -- -- struct omapfb_mem_desc mem_desc; -- struct fb_info *fb_info[OMAPFB_PLANE_NUM]; --}; -- --struct omapfb_platform_data { -- struct omap_lcd_config lcd; -- struct omapfb_mem_desc mem_desc; -- void *ctrl_platform_data; --}; -- --#ifdef CONFIG_ARCH_OMAP1 --extern struct lcd_ctrl omap1_lcd_ctrl; --#else --extern struct lcd_ctrl omap2_disp_ctrl; --#endif -- --extern void omapfb_reserve_sdram(void); --extern void omapfb_register_panel(struct lcd_panel *panel); --extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); --extern void omapfb_notify_clients(struct omapfb_device *fbdev, -- unsigned long event); --extern int omapfb_register_client(struct omapfb_notifier_block *nb, -- omapfb_notifier_callback_t callback, -- void *callback_data); --extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); --extern int omapfb_update_window_async(struct fb_info *fbi, -- struct omapfb_update_window *win, -- void (*callback)(void *), -- void *callback_data); -- --/* in arch/arm/plat-omap/fb.c */ --extern void omapfb_set_ctrl_platform_data(void *pdata); -- --#endif /* __KERNEL__ */ -- --#endif /* __OMAPFB_H */ -diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h -new file mode 100644 -index 0000000..f176562 ---- /dev/null -+++ b/arch/arm/plat-omap/include/mach/vram.h -@@ -0,0 +1,33 @@ -+/* -+ * File: arch/arm/plat-omap/include/mach/vram.h -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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. -+ */ -+ -+#ifndef __OMAPVRAM_H -+#define __OMAPVRAM_H -+ -+#include -+ -+extern int omap_vram_free(unsigned long paddr, size_t size); -+extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr); -+extern int omap_vram_reserve(unsigned long paddr, size_t size); -+extern void omap2_set_sdram_vram(u32 size, u32 start); -+extern void omap2_set_sram_vram(u32 size, u32 start); -+ -+#endif -diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h -new file mode 100644 -index 0000000..2047862 ---- /dev/null -+++ b/arch/arm/plat-omap/include/mach/vrfb.h -@@ -0,0 +1,47 @@ -+/* -+ * File: arch/arm/plat-omap/include/mach/vrfb.h -+ * -+ * VRFB -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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. -+ */ -+ -+#ifndef __VRFB_H -+#define __VRFB_H -+ -+#define OMAP_VRFB_LINE_LEN 2048 -+ -+struct vrfb -+{ -+ u8 context; -+ void __iomem *vaddr[4]; -+ unsigned long paddr[4]; -+ u16 xoffset; -+ u16 yoffset; -+ u8 bytespp; -+}; -+ -+extern int omap_vrfb_request_ctx(struct vrfb *vrfb); -+extern void omap_vrfb_release_ctx(struct vrfb *vrfb); -+extern void omap_vrfb_adjust_size(u16 *width, u16 *height, -+ u8 bytespp); -+extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, -+ u16 width, u16 height, -+ u8 bytespp); -+ -+#endif /* __VRFB_H */ -diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c -new file mode 100644 -index 0000000..f24a110 ---- /dev/null -+++ b/arch/arm/plat-omap/vram.c -@@ -0,0 +1,615 @@ -+/* -+ * linux/arch/arm/plat-omap/vram.c -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+/*#define DEBUG*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+ -+#ifdef DEBUG -+#define DBG(format, ...) printk(KERN_DEBUG "VRAM: " format, ## __VA_ARGS__) -+#else -+#define DBG(format, ...) -+#endif -+ -+#define OMAP2_SRAM_START 0x40200000 -+/* Maximum size, in reality this is smaller if SRAM is partially locked. */ -+#define OMAP2_SRAM_SIZE 0xa0000 /* 640k */ -+ -+#define REG_MAP_SIZE(_page_cnt) \ -+ ((_page_cnt + (sizeof(unsigned long) * 8) - 1) / 8) -+#define REG_MAP_PTR(_rg, _page_nr) \ -+ (((_rg)->map) + (_page_nr) / (sizeof(unsigned long) * 8)) -+#define REG_MAP_MASK(_page_nr) \ -+ (1 << ((_page_nr) & (sizeof(unsigned long) * 8 - 1))) -+ -+#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) -+ -+/* postponed regions are used to temporarily store region information at boot -+ * time when we cannot yet allocate the region list */ -+#define MAX_POSTPONED_REGIONS 10 -+ -+static int postponed_cnt __initdata; -+static struct { -+ unsigned long paddr; -+ size_t size; -+} postponed_regions[MAX_POSTPONED_REGIONS] __initdata; -+ -+struct vram_alloc { -+ struct list_head list; -+ unsigned long paddr; -+ unsigned pages; -+}; -+ -+struct vram_region { -+ struct list_head list; -+ struct list_head alloc_list; -+ unsigned long paddr; -+ unsigned pages; -+}; -+ -+static DEFINE_MUTEX(region_mutex); -+static LIST_HEAD(region_list); -+ -+static inline int region_mem_type(unsigned long paddr) -+{ -+ if (paddr >= OMAP2_SRAM_START && -+ paddr < OMAP2_SRAM_START + OMAP2_SRAM_SIZE) -+ return OMAPFB_MEMTYPE_SRAM; -+ else -+ return OMAPFB_MEMTYPE_SDRAM; -+} -+ -+static struct vram_region *omap_vram_create_region(unsigned long paddr, -+ unsigned pages) -+{ -+ struct vram_region *rm; -+ -+ rm = kzalloc(sizeof(*rm), GFP_KERNEL); -+ -+ if (rm) { -+ INIT_LIST_HEAD(&rm->alloc_list); -+ rm->paddr = paddr; -+ rm->pages = pages; -+ } -+ -+ return rm; -+} -+ -+#if 0 -+static void omap_vram_free_region(struct vram_region *vr) -+{ -+ list_del(&vr->list); -+ kfree(vr); -+} -+#endif -+ -+static struct vram_alloc *omap_vram_create_allocation(struct vram_region *vr, -+ unsigned long paddr, unsigned pages) -+{ -+ struct vram_alloc *va; -+ struct vram_alloc *new; -+ -+ new = kzalloc(sizeof(*va), GFP_KERNEL); -+ -+ if (!new) -+ return NULL; -+ -+ new->paddr = paddr; -+ new->pages = pages; -+ -+ list_for_each_entry(va, &vr->alloc_list, list) { -+ if (va->paddr > new->paddr) -+ break; -+ } -+ -+ list_add_tail(&new->list, &va->list); -+ -+ return new; -+} -+ -+static void omap_vram_free_allocation(struct vram_alloc *va) -+{ -+ list_del(&va->list); -+ kfree(va); -+} -+ -+static __init int omap_vram_add_region_postponed(unsigned long paddr, -+ size_t size) -+{ -+ if (postponed_cnt == MAX_POSTPONED_REGIONS) -+ return -ENOMEM; -+ -+ postponed_regions[postponed_cnt].paddr = paddr; -+ postponed_regions[postponed_cnt].size = size; -+ -+ ++postponed_cnt; -+ -+ return 0; -+} -+ -+/* add/remove_region can be exported if there's need to add/remove regions -+ * runtime */ -+static int omap_vram_add_region(unsigned long paddr, size_t size) -+{ -+ struct vram_region *rm; -+ unsigned pages; -+ -+ DBG("adding region paddr %08lx size %d\n", -+ paddr, size); -+ -+ size &= PAGE_MASK; -+ pages = size >> PAGE_SHIFT; -+ -+ rm = omap_vram_create_region(paddr, pages); -+ if (rm == NULL) -+ return -ENOMEM; -+ -+ list_add(&rm->list, ®ion_list); -+ -+ return 0; -+} -+ -+int omap_vram_free(unsigned long paddr, size_t size) -+{ -+ struct vram_region *rm; -+ struct vram_alloc *alloc; -+ unsigned start, end; -+ -+ DBG("free mem paddr %08lx size %d\n", paddr, size); -+ -+ size = PAGE_ALIGN(size); -+ -+ mutex_lock(®ion_mutex); -+ -+ list_for_each_entry(rm, ®ion_list, list) { -+ list_for_each_entry(alloc, &rm->alloc_list, list) { -+ start = alloc->paddr; -+ end = alloc->paddr + (alloc->pages >> PAGE_SHIFT); -+ -+ if (start >= paddr && end < paddr + size) -+ goto found; -+ } -+ } -+ -+ mutex_unlock(®ion_mutex); -+ return -EINVAL; -+ -+found: -+ omap_vram_free_allocation(alloc); -+ -+ mutex_unlock(®ion_mutex); -+ return 0; -+} -+EXPORT_SYMBOL(omap_vram_free); -+ -+static int _omap_vram_reserve(unsigned long paddr, unsigned pages) -+{ -+ struct vram_region *rm; -+ struct vram_alloc *alloc; -+ size_t size; -+ -+ size = pages << PAGE_SHIFT; -+ -+ list_for_each_entry(rm, ®ion_list, list) { -+ unsigned long start, end; -+ -+ DBG("checking region %lx %d\n", rm->paddr, rm->pages); -+ -+ if (region_mem_type(rm->paddr) != region_mem_type(paddr)) -+ continue; -+ -+ start = rm->paddr; -+ end = start + (rm->pages << PAGE_SHIFT) - 1; -+ if (start > paddr || end < paddr + size - 1) -+ continue; -+ -+ DBG("block ok, checking allocs\n"); -+ -+ list_for_each_entry(alloc, &rm->alloc_list, list) { -+ end = alloc->paddr - 1; -+ -+ if (start <= paddr && end >= paddr + size - 1) -+ goto found; -+ -+ start = alloc->paddr + (alloc->pages << PAGE_SHIFT); -+ } -+ -+ end = rm->paddr + (rm->pages << PAGE_SHIFT) - 1; -+ -+ if (!(start <= paddr && end >= paddr + size - 1)) -+ continue; -+found: -+ DBG("FOUND area start %lx, end %lx\n", start, end); -+ -+ if (omap_vram_create_allocation(rm, paddr, pages) == NULL) -+ return -ENOMEM; -+ -+ return 0; -+ } -+ -+ return -ENOMEM; -+} -+ -+int omap_vram_reserve(unsigned long paddr, size_t size) -+{ -+ unsigned pages; -+ int r; -+ -+ DBG("reserve mem paddr %08lx size %d\n", paddr, size); -+ -+ size = PAGE_ALIGN(size); -+ pages = size >> PAGE_SHIFT; -+ -+ mutex_lock(®ion_mutex); -+ -+ r = _omap_vram_reserve(paddr, pages); -+ -+ mutex_unlock(®ion_mutex); -+ -+ return r; -+} -+EXPORT_SYMBOL(omap_vram_reserve); -+ -+static int _omap_vram_alloc(int mtype, unsigned pages, unsigned long *paddr) -+{ -+ struct vram_region *rm; -+ struct vram_alloc *alloc; -+ -+ list_for_each_entry(rm, ®ion_list, list) { -+ unsigned long start, end; -+ -+ DBG("checking region %lx %d\n", rm->paddr, rm->pages); -+ -+ if (region_mem_type(rm->paddr) != mtype) -+ continue; -+ -+ start = rm->paddr; -+ -+ list_for_each_entry(alloc, &rm->alloc_list, list) { -+ end = alloc->paddr; -+ -+ if (end - start >= pages << PAGE_SHIFT) -+ goto found; -+ -+ start = alloc->paddr + (alloc->pages << PAGE_SHIFT); -+ } -+ -+ end = rm->paddr + (rm->pages << PAGE_SHIFT); -+found: -+ if (end - start < pages << PAGE_SHIFT) -+ continue; -+ -+ DBG("FOUND %lx, end %lx\n", start, end); -+ -+ alloc = omap_vram_create_allocation(rm, start, pages); -+ if (alloc == NULL) -+ return -ENOMEM; -+ -+ *paddr = start; -+ -+ return 0; -+ } -+ -+ return -ENOMEM; -+} -+ -+int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr) -+{ -+ unsigned pages; -+ int r; -+ -+ BUG_ON(mtype > OMAPFB_MEMTYPE_MAX || !size); -+ -+ DBG("alloc mem type %d size %d\n", mtype, size); -+ -+ size = PAGE_ALIGN(size); -+ pages = size >> PAGE_SHIFT; -+ -+ mutex_lock(®ion_mutex); -+ -+ r = _omap_vram_alloc(mtype, pages, paddr); -+ -+ mutex_unlock(®ion_mutex); -+ -+ return r; -+} -+EXPORT_SYMBOL(omap_vram_alloc); -+ -+#ifdef CONFIG_PROC_FS -+static void *r_next(struct seq_file *m, void *v, loff_t *pos) -+{ -+ struct list_head *l = v; -+ -+ (*pos)++; -+ -+ if (list_is_last(l, ®ion_list)) -+ return NULL; -+ -+ return l->next; -+} -+ -+static void *r_start(struct seq_file *m, loff_t *pos) -+{ -+ loff_t p = *pos; -+ struct list_head *l = ®ion_list; -+ -+ mutex_lock(®ion_mutex); -+ -+ do { -+ l = l->next; -+ if (l == ®ion_list) -+ return NULL; -+ } while (p--); -+ -+ return l; -+} -+ -+static void r_stop(struct seq_file *m, void *v) -+{ -+ mutex_unlock(®ion_mutex); -+} -+ -+static int r_show(struct seq_file *m, void *v) -+{ -+ struct vram_region *vr; -+ struct vram_alloc *va; -+ unsigned size; -+ -+ vr = list_entry(v, struct vram_region, list); -+ -+ size = vr->pages << PAGE_SHIFT; -+ -+ seq_printf(m, "%08lx-%08lx (%d bytes)\n", -+ vr->paddr, vr->paddr + size - 1, -+ size); -+ -+ list_for_each_entry(va, &vr->alloc_list, list) { -+ size = va->pages << PAGE_SHIFT; -+ seq_printf(m, " %08lx-%08lx (%d bytes)\n", -+ va->paddr, va->paddr + size - 1, -+ size); -+ } -+ -+ -+ -+ return 0; -+} -+ -+static const struct seq_operations resource_op = { -+ .start = r_start, -+ .next = r_next, -+ .stop = r_stop, -+ .show = r_show, -+}; -+ -+static int vram_open(struct inode *inode, struct file *file) -+{ -+ return seq_open(file, &resource_op); -+} -+ -+static const struct file_operations proc_vram_operations = { -+ .open = vram_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = seq_release, -+}; -+ -+static int __init omap_vram_create_proc(void) -+{ -+ proc_create("omap-vram", 0, NULL, &proc_vram_operations); -+ -+ return 0; -+} -+#endif -+ -+static __init int omap_vram_init(void) -+{ -+ int i, r; -+ -+ for (i = 0; i < postponed_cnt; i++) -+ omap_vram_add_region(postponed_regions[i].paddr, -+ postponed_regions[i].size); -+ -+#ifdef CONFIG_PROC_FS -+ r = omap_vram_create_proc(); -+ if (r) -+ return -ENOMEM; -+#endif -+ -+ return 0; -+} -+ -+arch_initcall(omap_vram_init); -+ -+/* boottime vram alloc stuff */ -+ -+/* set from board file */ -+static u32 omapfb_sram_vram_start __initdata; -+static u32 omapfb_sram_vram_size __initdata; -+ -+/* set from board file */ -+static u32 omapfb_sdram_vram_start __initdata; -+static u32 omapfb_sdram_vram_size __initdata; -+ -+/* set from kernel cmdline */ -+static u32 omapfb_def_sdram_vram_size __initdata; -+static u32 omapfb_def_sdram_vram_start __initdata; -+ -+static void __init omapfb_early_vram(char **p) -+{ -+ omapfb_def_sdram_vram_size = memparse(*p, p); -+ if (**p == ',') -+ omapfb_def_sdram_vram_start = simple_strtoul((*p) + 1, p, 16); -+ -+ printk("omapfb_early_vram, %d, 0x%x\n", -+ omapfb_def_sdram_vram_size, -+ omapfb_def_sdram_vram_start); -+} -+__early_param("vram=", omapfb_early_vram); -+ -+/* -+ * Called from map_io. We need to call to this early enough so that we -+ * can reserve the fixed SDRAM regions before VM could get hold of them. -+ */ -+void __init omapfb_reserve_sdram(void) -+{ -+ struct bootmem_data *bdata; -+ unsigned long sdram_start, sdram_size; -+ u32 paddr; -+ u32 size = 0; -+ -+ /* cmdline arg overrides the board file definition */ -+ if (omapfb_def_sdram_vram_size) { -+ size = omapfb_def_sdram_vram_size; -+ paddr = omapfb_def_sdram_vram_start; -+ } -+ -+ if (!size) { -+ size = omapfb_sdram_vram_size; -+ paddr = omapfb_sdram_vram_start; -+ } -+ -+#ifdef CONFIG_OMAP2_DSS_VRAM_SIZE -+ if (!size) { -+ size = CONFIG_OMAP2_DSS_VRAM_SIZE * 1024 * 1024; -+ paddr = 0; -+ } -+#endif -+ -+ if (!size) -+ return; -+ -+ size = PAGE_ALIGN(size); -+ -+ bdata = NODE_DATA(0)->bdata; -+ sdram_start = bdata->node_min_pfn << PAGE_SHIFT; -+ sdram_size = (bdata->node_low_pfn << PAGE_SHIFT) - sdram_start; -+ -+ if (paddr) { -+ if ((paddr & ~PAGE_MASK) || paddr < sdram_start || -+ paddr + size > sdram_start + sdram_size) { -+ printk(KERN_ERR "Illegal SDRAM region for VRAM\n"); -+ return; -+ } -+ -+ reserve_bootmem(paddr, size, BOOTMEM_DEFAULT); -+ } else { -+ if (size > sdram_size) { -+ printk(KERN_ERR "Illegal SDRAM size for VRAM\n"); -+ return; -+ } -+ -+ paddr = virt_to_phys(alloc_bootmem_pages(size)); -+ BUG_ON(paddr & ~PAGE_MASK); -+ } -+ -+ omap_vram_add_region_postponed(paddr, size); -+ -+ pr_info("Reserving %u bytes SDRAM for VRAM\n", size); -+} -+ -+/* -+ * Called at sram init time, before anything is pushed to the SRAM stack. -+ * Because of the stack scheme, we will allocate everything from the -+ * start of the lowest address region to the end of SRAM. This will also -+ * include padding for page alignment and possible holes between regions. -+ * -+ * As opposed to the SDRAM case, we'll also do any dynamic allocations at -+ * this point, since the driver built as a module would have problem with -+ * freeing / reallocating the regions. -+ */ -+unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, -+ unsigned long sram_vstart, -+ unsigned long sram_size, -+ unsigned long pstart_avail, -+ unsigned long size_avail) -+{ -+ unsigned long pend_avail; -+ unsigned long reserved; -+ u32 paddr; -+ u32 size; -+ -+ paddr = omapfb_sram_vram_start; -+ size = omapfb_sram_vram_size; -+ -+ if (!size) -+ return 0; -+ -+ reserved = 0; -+ pend_avail = pstart_avail + size_avail; -+ -+ if (!paddr) { -+ /* Dynamic allocation */ -+ if ((size_avail & PAGE_MASK) < size) { -+ printk(KERN_ERR "Not enough SRAM for VRAM\n"); -+ return 0; -+ } -+ size_avail = (size_avail - size) & PAGE_MASK; -+ paddr = pstart_avail + size_avail; -+ } -+ -+ if (paddr < sram_pstart || -+ paddr + size > sram_pstart + sram_size) { -+ printk(KERN_ERR "Illegal SRAM region for VRAM\n"); -+ return 0; -+ } -+ -+ /* Reserve everything above the start of the region. */ -+ if (pend_avail - paddr > reserved) -+ reserved = pend_avail - paddr; -+ size_avail = pend_avail - reserved - pstart_avail; -+ -+ omap_vram_add_region_postponed(paddr, size); -+ -+ if (reserved) -+ pr_info("Reserving %lu bytes SRAM for VRAM\n", reserved); -+ -+ return reserved; -+} -+ -+void __init omap2_set_sdram_vram(u32 size, u32 start) -+{ -+ omapfb_sdram_vram_start = start; -+ omapfb_sdram_vram_size = size; -+} -+ -+void __init omap2_set_sram_vram(u32 size, u32 start) -+{ -+ omapfb_sram_vram_start = start; -+ omapfb_sram_vram_size = size; -+} -+ -+#endif -+ -diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c -new file mode 100644 -index 0000000..7e0f8fc ---- /dev/null -+++ b/arch/arm/plat-omap/vrfb.c -@@ -0,0 +1,159 @@ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+/*#define DEBUG*/ -+ -+#ifdef DEBUG -+#define DBG(format, ...) printk(KERN_DEBUG "VRFB: " format, ## __VA_ARGS__) -+#else -+#define DBG(format, ...) -+#endif -+ -+#define SMS_ROT_VIRT_BASE(context, rot) \ -+ (((context >= 4) ? 0xD0000000 : 0x70000000) \ -+ | 0x4000000 * (context) \ -+ | 0x1000000 * (rot)) -+ -+#define OMAP_VRFB_SIZE (2048 * 2048 * 4) -+ -+#define VRFB_PAGE_WIDTH_EXP 5 /* Assuming SDRAM pagesize= 1024 */ -+#define VRFB_PAGE_HEIGHT_EXP 5 /* 1024 = 2^5 * 2^5 */ -+#define VRFB_PAGE_WIDTH (1 << VRFB_PAGE_WIDTH_EXP) -+#define VRFB_PAGE_HEIGHT (1 << VRFB_PAGE_HEIGHT_EXP) -+#define SMS_IMAGEHEIGHT_OFFSET 16 -+#define SMS_IMAGEWIDTH_OFFSET 0 -+#define SMS_PH_OFFSET 8 -+#define SMS_PW_OFFSET 4 -+#define SMS_PS_OFFSET 0 -+ -+#define OMAP_SMS_BASE 0x6C000000 -+#define SMS_ROT_CONTROL(context) (OMAP_SMS_BASE + 0x180 + 0x10 * context) -+#define SMS_ROT_SIZE(context) (OMAP_SMS_BASE + 0x184 + 0x10 * context) -+#define SMS_ROT_PHYSICAL_BA(context) (OMAP_SMS_BASE + 0x188 + 0x10 * context) -+ -+#define VRFB_NUM_CTXS 12 -+/* bitmap of reserved contexts */ -+static unsigned ctx_map; -+ -+void omap_vrfb_adjust_size(u16 *width, u16 *height, -+ u8 bytespp) -+{ -+ *width = ALIGN(*width * bytespp, VRFB_PAGE_WIDTH) / bytespp; -+ *height = ALIGN(*height, VRFB_PAGE_HEIGHT); -+} -+EXPORT_SYMBOL(omap_vrfb_adjust_size); -+ -+void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, -+ u16 width, u16 height, -+ u8 bytespp) -+{ -+ unsigned pixel_size_exp; -+ u16 vrfb_width; -+ u16 vrfb_height; -+ u8 ctx = vrfb->context; -+ -+ DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d)\n", ctx, paddr, -+ width, height, bytespp); -+ -+ if (bytespp == 4) -+ pixel_size_exp = 2; -+ else if (bytespp == 2) -+ pixel_size_exp = 1; -+ else -+ BUG(); -+ -+ vrfb_width = ALIGN(width * bytespp, VRFB_PAGE_WIDTH) / bytespp; -+ vrfb_height = ALIGN(height, VRFB_PAGE_HEIGHT); -+ -+ DBG("vrfb w %u, h %u\n", vrfb_width, vrfb_height); -+ -+ omap_writel(paddr, SMS_ROT_PHYSICAL_BA(ctx)); -+ omap_writel((vrfb_width << SMS_IMAGEWIDTH_OFFSET) | -+ (vrfb_height << SMS_IMAGEHEIGHT_OFFSET), -+ SMS_ROT_SIZE(ctx)); -+ -+ omap_writel(pixel_size_exp << SMS_PS_OFFSET | -+ VRFB_PAGE_WIDTH_EXP << SMS_PW_OFFSET | -+ VRFB_PAGE_HEIGHT_EXP << SMS_PH_OFFSET, -+ SMS_ROT_CONTROL(ctx)); -+ -+ DBG("vrfb offset pixels %d, %d\n", -+ vrfb_width - width, vrfb_height - height); -+ -+ vrfb->xoffset = vrfb_width - width; -+ vrfb->yoffset = vrfb_height - height; -+ vrfb->bytespp = bytespp; -+} -+EXPORT_SYMBOL(omap_vrfb_setup); -+ -+void omap_vrfb_release_ctx(struct vrfb *vrfb) -+{ -+ int rot; -+ -+ if (vrfb->context == 0xff) -+ return; -+ -+ DBG("release ctx %d\n", vrfb->context); -+ -+ ctx_map &= ~(1 << vrfb->context); -+ -+ for (rot = 0; rot < 4; ++rot) { -+ if(vrfb->paddr[rot]) { -+ release_mem_region(vrfb->paddr[rot], OMAP_VRFB_SIZE); -+ vrfb->paddr[rot] = 0; -+ } -+ } -+ -+ vrfb->context = 0xff; -+} -+EXPORT_SYMBOL(omap_vrfb_release_ctx); -+ -+int omap_vrfb_request_ctx(struct vrfb *vrfb) -+{ -+ int rot; -+ u32 paddr; -+ u8 ctx; -+ -+ DBG("request ctx\n"); -+ -+ for (ctx = 0; ctx < VRFB_NUM_CTXS; ++ctx) -+ if ((ctx_map & (1 << ctx)) == 0) -+ break; -+ -+ if (ctx == VRFB_NUM_CTXS) { -+ printk(KERN_ERR "vrfb: no free contexts\n"); -+ return -EBUSY; -+ } -+ -+ DBG("found free ctx %d\n", ctx); -+ -+ ctx_map |= 1 << ctx; -+ -+ memset(vrfb, 0, sizeof(*vrfb)); -+ -+ vrfb->context = ctx; -+ -+ for (rot = 0; rot < 4; ++rot) { -+ paddr = SMS_ROT_VIRT_BASE(ctx, rot); -+ if (!request_mem_region(paddr, OMAP_VRFB_SIZE, "vrfb")) { -+ printk(KERN_ERR "vrfb: failed to reserve VRFB " -+ "area for ctx %d, rotation %d\n", -+ ctx, rot * 90); -+ omap_vrfb_release_ctx(vrfb); -+ return -ENOMEM; -+ } -+ -+ vrfb->paddr[rot] = paddr; -+ -+ DBG("VRFB %d/%d: %lx\n", ctx, rot*90, vrfb->paddr[rot]); -+ } -+ -+ return 0; -+} -+EXPORT_SYMBOL(omap_vrfb_request_ctx); -+ -diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig -index fb19803..8b3752b 100644 ---- a/drivers/video/Kconfig -+++ b/drivers/video/Kconfig -@@ -2132,6 +2132,7 @@ config FB_MX3 - an LCD display with your i.MX31 system, say Y here. - - source "drivers/video/omap/Kconfig" -+source "drivers/video/omap2/Kconfig" - - source "drivers/video/backlight/Kconfig" - source "drivers/video/display/Kconfig" -diff --git a/drivers/video/Makefile b/drivers/video/Makefile -index 2a998ca..1db8dd4 100644 ---- a/drivers/video/Makefile -+++ b/drivers/video/Makefile -@@ -120,6 +120,7 @@ obj-$(CONFIG_FB_SM501) += sm501fb.o - obj-$(CONFIG_FB_XILINX) += xilinxfb.o - obj-$(CONFIG_FB_SH_MOBILE_LCDC) += sh_mobile_lcdcfb.o - obj-$(CONFIG_FB_OMAP) += omap/ -+obj-$(CONFIG_OMAP2_DSS) += omap2/ - obj-$(CONFIG_XEN_FBDEV_FRONTEND) += xen-fbfront.o - obj-$(CONFIG_FB_CARMINE) += carminefb.o - obj-$(CONFIG_FB_MB862XX) += mb862xx/ -diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig -index c355b59..a1c10de 100644 ---- a/drivers/video/omap/Kconfig -+++ b/drivers/video/omap/Kconfig -@@ -1,6 +1,7 @@ - config FB_OMAP - tristate "OMAP frame buffer support (EXPERIMENTAL)" -- depends on FB && ARCH_OMAP -+ depends on FB && ARCH_OMAP && (OMAP2_DSS = "n") -+ - select FB_CFB_FILLRECT - select FB_CFB_COPYAREA - select FB_CFB_IMAGEBLIT -@@ -72,7 +73,7 @@ config FB_OMAP_LCD_MIPID - - config FB_OMAP_BOOTLOADER_INIT - bool "Check bootloader initialization" -- depends on FB_OMAP -+ depends on FB_OMAP || FB_OMAP2 - help - Say Y here if you want to enable checking if the bootloader has - already initialized the display controller. In this case the -diff --git a/drivers/video/omap/blizzard.c b/drivers/video/omap/blizzard.c -index f60a233..8121c09 100644 ---- a/drivers/video/omap/blizzard.c -+++ b/drivers/video/omap/blizzard.c -@@ -25,9 +25,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #include "dispc.h" -diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c -index c140c21..1915af5 100644 ---- a/drivers/video/omap/dispc.c -+++ b/drivers/video/omap/dispc.c -@@ -24,9 +24,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #include "dispc.h" -diff --git a/drivers/video/omap/hwa742.c b/drivers/video/omap/hwa742.c -index f24df0b..9b4c506 100644 ---- a/drivers/video/omap/hwa742.c -+++ b/drivers/video/omap/hwa742.c -@@ -25,9 +25,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #define HWA742_REV_CODE_REG 0x0 -diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c -index a22b452..1252cc3 100644 ---- a/drivers/video/omap/lcd_2430sdp.c -+++ b/drivers/video/omap/lcd_2430sdp.c -@@ -26,9 +26,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 -diff --git a/drivers/video/omap/lcd_ams_delta.c b/drivers/video/omap/lcd_ams_delta.c -index 3fd5342..4d54725 100644 ---- a/drivers/video/omap/lcd_ams_delta.c -+++ b/drivers/video/omap/lcd_ams_delta.c -@@ -24,13 +24,13 @@ - - #include - #include -+#include - - #include - #include - - #include - #include --#include - - #define AMS_DELTA_DEFAULT_CONTRAST 112 - -diff --git a/drivers/video/omap/lcd_apollon.c b/drivers/video/omap/lcd_apollon.c -index beae5d9..e3b2224 100644 ---- a/drivers/video/omap/lcd_apollon.c -+++ b/drivers/video/omap/lcd_apollon.c -@@ -23,10 +23,10 @@ - - #include - #include -+#include - - #include - #include --#include - - /* #define USE_35INCH_LCD 1 */ - -diff --git a/drivers/video/omap/lcd_h3.c b/drivers/video/omap/lcd_h3.c -index 2486237..f7264ea 100644 ---- a/drivers/video/omap/lcd_h3.c -+++ b/drivers/video/omap/lcd_h3.c -@@ -22,9 +22,9 @@ - #include - #include - #include -+#include - - #include --#include - - #define MODULE_NAME "omapfb-lcd_h3" - -diff --git a/drivers/video/omap/lcd_h4.c b/drivers/video/omap/lcd_h4.c -index 6ff5643..d72df0c 100644 ---- a/drivers/video/omap/lcd_h4.c -+++ b/drivers/video/omap/lcd_h4.c -@@ -21,8 +21,7 @@ - - #include - #include -- --#include -+#include - - static int h4_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) - { -diff --git a/drivers/video/omap/lcd_inn1510.c b/drivers/video/omap/lcd_inn1510.c -index 6953ed4..f6e05d7 100644 ---- a/drivers/video/omap/lcd_inn1510.c -+++ b/drivers/video/omap/lcd_inn1510.c -@@ -22,9 +22,9 @@ - #include - #include - #include -+#include - - #include --#include - - static int innovator1510_panel_init(struct lcd_panel *panel, - struct omapfb_device *fbdev) -diff --git a/drivers/video/omap/lcd_inn1610.c b/drivers/video/omap/lcd_inn1610.c -index 4c4f7ee..c599e41 100644 ---- a/drivers/video/omap/lcd_inn1610.c -+++ b/drivers/video/omap/lcd_inn1610.c -@@ -21,9 +21,9 @@ - - #include - #include -+#include - - #include --#include - - #define MODULE_NAME "omapfb-lcd_h3" - -diff --git a/drivers/video/omap/lcd_ldp.c b/drivers/video/omap/lcd_ldp.c -index 8925230..1c25186 100644 ---- a/drivers/video/omap/lcd_ldp.c -+++ b/drivers/video/omap/lcd_ldp.c -@@ -25,10 +25,10 @@ - #include - #include - #include -+#include - - #include - #include --#include - #include - - #define LCD_PANEL_BACKLIGHT_GPIO (15 + OMAP_MAX_GPIO_LINES) -diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c -index 1895997..4b28005 100644 ---- a/drivers/video/omap/lcd_mipid.c -+++ b/drivers/video/omap/lcd_mipid.c -@@ -22,8 +22,8 @@ - #include - #include - #include -+#include - --#include - #include - - #include "../../cbus/tahvo.h" -diff --git a/drivers/video/omap/lcd_omap2evm.c b/drivers/video/omap/lcd_omap2evm.c -index 2fc46c2..1908a2b 100644 ---- a/drivers/video/omap/lcd_omap2evm.c -+++ b/drivers/video/omap/lcd_omap2evm.c -@@ -25,9 +25,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #define LCD_PANEL_ENABLE_GPIO 154 -diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c -index eae43e4..6be117e 100644 ---- a/drivers/video/omap/lcd_omap3beagle.c -+++ b/drivers/video/omap/lcd_omap3beagle.c -@@ -24,9 +24,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #define LCD_PANEL_ENABLE_GPIO 170 -diff --git a/drivers/video/omap/lcd_omap3evm.c b/drivers/video/omap/lcd_omap3evm.c -index 1c3d814..10ba48c 100644 ---- a/drivers/video/omap/lcd_omap3evm.c -+++ b/drivers/video/omap/lcd_omap3evm.c -@@ -24,9 +24,9 @@ - #include - #include - #include -+#include - - #include --#include - #include - - #define LCD_PANEL_ENABLE_GPIO 153 -diff --git a/drivers/video/omap/lcd_osk.c b/drivers/video/omap/lcd_osk.c -index 379c96d..d6b193e 100644 ---- a/drivers/video/omap/lcd_osk.c -+++ b/drivers/video/omap/lcd_osk.c -@@ -22,10 +22,10 @@ - - #include - #include -+#include - - #include - #include --#include - - static int osk_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) - { -diff --git a/drivers/video/omap/lcd_overo.c b/drivers/video/omap/lcd_overo.c -index 2bc5c92..40c2026 100644 ---- a/drivers/video/omap/lcd_overo.c -+++ b/drivers/video/omap/lcd_overo.c -@@ -22,10 +22,10 @@ - #include - #include - #include -+#include - - #include - #include --#include - #include - - #define LCD_ENABLE 144 -diff --git a/drivers/video/omap/lcd_p2.c b/drivers/video/omap/lcd_p2.c -index dd40fd7..bc5abef 100644 ---- a/drivers/video/omap/lcd_p2.c -+++ b/drivers/video/omap/lcd_p2.c -@@ -24,10 +24,10 @@ - #include - #include - #include -+#include - - #include - #include --#include - - /* - * File: epson-md-tft.h -diff --git a/drivers/video/omap/lcd_palmte.c b/drivers/video/omap/lcd_palmte.c -index 2183173..dcb456c 100644 ---- a/drivers/video/omap/lcd_palmte.c -+++ b/drivers/video/omap/lcd_palmte.c -@@ -22,9 +22,9 @@ - #include - #include - #include -+#include - - #include --#include - - static int palmte_panel_init(struct lcd_panel *panel, - struct omapfb_device *fbdev) -diff --git a/drivers/video/omap/lcd_palmtt.c b/drivers/video/omap/lcd_palmtt.c -index 57b0f6c..e8adab8 100644 ---- a/drivers/video/omap/lcd_palmtt.c -+++ b/drivers/video/omap/lcd_palmtt.c -@@ -28,9 +28,9 @@ GPIO13 - screen blanking - #include - #include - #include -+#include - - #include --#include - - static int palmtt_panel_init(struct lcd_panel *panel, - struct omapfb_device *fbdev) -diff --git a/drivers/video/omap/lcd_palmz71.c b/drivers/video/omap/lcd_palmz71.c -index d33d78b..d5b3f82 100644 ---- a/drivers/video/omap/lcd_palmz71.c -+++ b/drivers/video/omap/lcd_palmz71.c -@@ -23,8 +23,7 @@ - #include - #include - #include -- --#include -+#include - - static int palmz71_panel_init(struct lcd_panel *panel, - struct omapfb_device *fbdev) -diff --git a/drivers/video/omap/lcdc.c b/drivers/video/omap/lcdc.c -index ab39492..633e33c 100644 ---- a/drivers/video/omap/lcdc.c -+++ b/drivers/video/omap/lcdc.c -@@ -28,9 +28,9 @@ - #include - #include - #include -+#include - - #include --#include - - #include - -diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c -index 3bb4247..c6306af 100644 ---- a/drivers/video/omap/omapfb_main.c -+++ b/drivers/video/omap/omapfb_main.c -@@ -27,9 +27,9 @@ - #include - #include - #include -+#include - - #include --#include - - #include "lcdc.h" - #include "dispc.h" -diff --git a/drivers/video/omap/rfbi.c b/drivers/video/omap/rfbi.c -index 29fa368..118cfa9 100644 ---- a/drivers/video/omap/rfbi.c -+++ b/drivers/video/omap/rfbi.c -@@ -26,8 +26,7 @@ - #include - #include - #include -- --#include -+#include - - #include "dispc.h" - -diff --git a/drivers/video/omap/sossi.c b/drivers/video/omap/sossi.c -index cc697cc..ff9dd71 100644 ---- a/drivers/video/omap/sossi.c -+++ b/drivers/video/omap/sossi.c -@@ -23,9 +23,9 @@ - #include - #include - #include -+#include - - #include --#include - - #include "lcdc.h" - -diff --git a/drivers/video/omap2/Kconfig b/drivers/video/omap2/Kconfig -new file mode 100644 -index 0000000..89bf210 ---- /dev/null -+++ b/drivers/video/omap2/Kconfig -@@ -0,0 +1,3 @@ -+source "drivers/video/omap2/dss/Kconfig" -+source "drivers/video/omap2/displays/Kconfig" -+source "drivers/video/omap2/omapfb/Kconfig" -diff --git a/drivers/video/omap2/Makefile b/drivers/video/omap2/Makefile -new file mode 100644 -index 0000000..72134db ---- /dev/null -+++ b/drivers/video/omap2/Makefile -@@ -0,0 +1,4 @@ -+# OMAP2/3 Display Subsystem -+obj-y += dss/ -+obj-y += displays/ -+obj-y += omapfb/ -diff --git a/drivers/video/omap2/displays/Kconfig b/drivers/video/omap2/displays/Kconfig -new file mode 100644 -index 0000000..35e4bee ---- /dev/null -+++ b/drivers/video/omap2/displays/Kconfig -@@ -0,0 +1,32 @@ -+menu "OMAP2/3 Display Device Drivers" -+ depends on OMAP2_DSS -+ -+config PANEL_GENERIC -+ tristate "Generic Panel" -+ help -+ Generic panel driver. -+ Used for DVI output for Beagle and OMAP3 SDP. -+ -+config PANEL_SAMSUNG_LTE430WQ_F0C -+ tristate "Samsung LTE430WQ-F0C LCD Panel" -+ depends on OMAP2_DSS -+ help -+ LCD Panel used on Overo Palo43 -+ -+config PANEL_SHARP_LS037V7DW01 -+ tristate "Sharp LS037V7DW01 LCD Panel" -+ depends on OMAP2_DSS -+ help -+ LCD Panel used in TI's SDP3430 and EVM boards -+ -+config PANEL_N800 -+ tristate "Panel N8x0" -+ help -+ N8x0 LCD (hack) -+ -+config CTRL_BLIZZARD -+ tristate "Blizzard Controller" -+ help -+ Blizzard Controller (hack) -+ -+endmenu -diff --git a/drivers/video/omap2/displays/Makefile b/drivers/video/omap2/displays/Makefile -new file mode 100644 -index 0000000..1b74b7e ---- /dev/null -+++ b/drivers/video/omap2/displays/Makefile -@@ -0,0 +1,6 @@ -+obj-$(CONFIG_PANEL_GENERIC) += panel-generic.o -+obj-$(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C) += panel-samsung-lte430wq-f0c.o -+obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o -+ -+obj-$(CONFIG_CTRL_BLIZZARD) += ctrl-blizzard.o -+obj-$(CONFIG_PANEL_N800) += panel-n800.o -diff --git a/drivers/video/omap2/displays/ctrl-blizzard.c b/drivers/video/omap2/displays/ctrl-blizzard.c -new file mode 100644 -index 0000000..6698e4d ---- /dev/null -+++ b/drivers/video/omap2/displays/ctrl-blizzard.c -@@ -0,0 +1,279 @@ -+ -+//#define DEBUG -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#ifdef DEBUG -+#define DBG(format, ...) printk(KERN_DEBUG "Blizzard: " format, ## __VA_ARGS__) -+#else -+#define DBG(format, ...) -+#endif -+ -+#define BLIZZARD_REV_CODE 0x00 -+#define BLIZZARD_CONFIG 0x02 -+#define BLIZZARD_PLL_DIV 0x04 -+#define BLIZZARD_PLL_LOCK_RANGE 0x06 -+#define BLIZZARD_PLL_CLOCK_SYNTH_0 0x08 -+#define BLIZZARD_PLL_CLOCK_SYNTH_1 0x0a -+#define BLIZZARD_PLL_MODE 0x0c -+#define BLIZZARD_CLK_SRC 0x0e -+#define BLIZZARD_MEM_BANK0_ACTIVATE 0x10 -+#define BLIZZARD_MEM_BANK0_STATUS 0x14 -+#define BLIZZARD_PANEL_CONFIGURATION 0x28 -+#define BLIZZARD_HDISP 0x2a -+#define BLIZZARD_HNDP 0x2c -+#define BLIZZARD_VDISP0 0x2e -+#define BLIZZARD_VDISP1 0x30 -+#define BLIZZARD_VNDP 0x32 -+#define BLIZZARD_HSW 0x34 -+#define BLIZZARD_VSW 0x38 -+#define BLIZZARD_DISPLAY_MODE 0x68 -+#define BLIZZARD_INPUT_WIN_X_START_0 0x6c -+#define BLIZZARD_DATA_SOURCE_SELECT 0x8e -+#define BLIZZARD_DISP_MEM_DATA_PORT 0x90 -+#define BLIZZARD_DISP_MEM_READ_ADDR0 0x92 -+#define BLIZZARD_POWER_SAVE 0xE6 -+#define BLIZZARD_NDISP_CTRL_STATUS 0xE8 -+ -+/* Data source select */ -+/* For S1D13745 */ -+#define BLIZZARD_SRC_WRITE_LCD_BACKGROUND 0x00 -+#define BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE 0x01 -+#define BLIZZARD_SRC_WRITE_OVERLAY_ENABLE 0x04 -+#define BLIZZARD_SRC_DISABLE_OVERLAY 0x05 -+/* For S1D13744 */ -+#define BLIZZARD_SRC_WRITE_LCD 0x00 -+#define BLIZZARD_SRC_BLT_LCD 0x06 -+ -+#define BLIZZARD_COLOR_RGB565 0x01 -+#define BLIZZARD_COLOR_YUV420 0x09 -+ -+#define BLIZZARD_VERSION_S1D13745 0x01 /* Hailstorm */ -+#define BLIZZARD_VERSION_S1D13744 0x02 /* Blizzard */ -+ -+#define BLIZZARD_AUTO_UPDATE_TIME (HZ / 20) -+ -+ -+ -+static struct { -+ int version; -+} blizzard; -+ -+ -+static inline void blizzard_cmd(u8 cmd) -+{ -+ omap_rfbi_write_command(&cmd, 1); -+} -+ -+static inline void blizzard_write(u8 cmd, const u8 *buf, int len) -+{ -+ omap_rfbi_write_command(&cmd, 1); -+ omap_rfbi_write_data(buf, len); -+} -+ -+static inline void blizzard_read(u8 cmd, u8 *buf, int len) -+{ -+ omap_rfbi_write_command(&cmd, 1); -+ omap_rfbi_read_data(buf, len); -+} -+ -+static u8 blizzard_read_reg(u8 cmd) -+{ -+ u8 data; -+ blizzard_read(cmd, &data, 1); -+ return data; -+} -+ -+static int blizzard_ctrl_init(struct omap_display *display) -+{ -+ DBG("blizzard_ctrl_init\n"); -+ -+ return 0; -+} -+ -+ -+static int blizzard_ctrl_enable(struct omap_display *display) -+{ -+ int r = 0; -+ u8 rev, conf; -+ -+ DBG("blizzard_ctrl_enable\n"); -+ -+ if (display->hw_config.ctrl_enable) { -+ r = display->hw_config.ctrl_enable(display); -+ if (r) -+ return r; -+ } -+ -+ msleep(100); -+ -+ rev = blizzard_read_reg(BLIZZARD_CLK_SRC); -+ printk("CLK_SRC %x\n", rev); -+ -+ rev = blizzard_read_reg(BLIZZARD_PLL_DIV); -+ printk("PLLDIV %x\n", rev); -+ -+ rev = blizzard_read_reg(BLIZZARD_REV_CODE); -+ conf = blizzard_read_reg(BLIZZARD_CONFIG); -+ -+ printk("rev %x, conf %x\n", rev, conf); -+ -+ switch (rev & 0xfc) { -+ case 0x9c: -+ blizzard.version = BLIZZARD_VERSION_S1D13744; -+ pr_info("omapfb: s1d13744 LCD controller rev %d " -+ "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); -+ break; -+ case 0xa4: -+ blizzard.version = BLIZZARD_VERSION_S1D13745; -+ pr_info("omapfb: s1d13745 LCD controller rev %d " -+ "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); -+ break; -+ default: -+ printk("invalid s1d1374x revision %02x\n", -+ rev); -+ r = -ENODEV; -+ } -+ -+ return r; -+} -+ -+static void blizzard_ctrl_disable(struct omap_display *display) -+{ -+ DBG("blizzard_ctrl_disable\n"); -+ -+ if (display->hw_config.ctrl_disable) -+ display->hw_config.ctrl_disable(display); -+} -+ -+int rfbi_configure(int rfbi_module, int bpp, int lines); -+ -+static void blizzard_ctrl_setup_update(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h) -+{ -+ u8 tmp[18]; -+ int x_end, y_end; -+ -+ DBG("blizzard_ctrl_setup_update\n"); -+ -+ x_end = x + w - 1; -+ y_end = y + h - 1; -+ -+ tmp[0] = x; -+ tmp[1] = x >> 8; -+ tmp[2] = y; -+ tmp[3] = y >> 8; -+ tmp[4] = x_end; -+ tmp[5] = x_end >> 8; -+ tmp[6] = y_end; -+ tmp[7] = y_end >> 8; -+ -+ /* scaling? */ -+ tmp[8] = x; -+ tmp[9] = x >> 8; -+ tmp[10] = y; -+ tmp[11] = y >> 8; -+ tmp[12] = x_end; -+ tmp[13] = x_end >> 8; -+ tmp[14] = y_end; -+ tmp[15] = y_end >> 8; -+ -+ tmp[16] = BLIZZARD_COLOR_RGB565; //color_mode; -+ -+ if (blizzard.version == BLIZZARD_VERSION_S1D13745) -+ tmp[17] = BLIZZARD_SRC_WRITE_LCD_BACKGROUND; -+ else -+ tmp[17] = blizzard.version == BLIZZARD_VERSION_S1D13744 ? -+ BLIZZARD_SRC_WRITE_LCD : -+ BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE; -+ -+ rfbi_configure(display->hw_config.u.rfbi.channel, -+ 16, -+ 8); -+ -+ blizzard_write(BLIZZARD_INPUT_WIN_X_START_0, tmp, 18); -+ -+ rfbi_configure(display->hw_config.u.rfbi.channel, -+ 16, -+ 16); -+} -+ -+static int blizzard_ctrl_enable_te(struct omap_display *display, bool enable) -+{ -+ return 0; -+} -+ -+static int blizzard_ctrl_rotate(struct omap_display *display, u8 rotate) -+{ -+ return 0; -+} -+ -+static int blizzard_ctrl_mirror(struct omap_display *display, bool enable) -+{ -+ return 0; -+} -+ -+static int blizzard_run_test(struct omap_display *display, int test_num) -+{ -+ return 0; -+} -+ -+static struct omap_ctrl blizzard_ctrl = { -+ .owner = THIS_MODULE, -+ .name = "ctrl-blizzard", -+ .init = blizzard_ctrl_init, -+ .enable = blizzard_ctrl_enable, -+ .disable = blizzard_ctrl_disable, -+ .setup_update = blizzard_ctrl_setup_update, -+ .enable_te = blizzard_ctrl_enable_te, -+ .set_rotate = blizzard_ctrl_rotate, -+ .set_mirror = blizzard_ctrl_mirror, -+ .run_test = blizzard_run_test, -+ .pixel_size = 16, -+ -+ .timings = { -+ .cs_on_time = 0, -+ -+ .we_on_time = 9000, -+ .we_off_time = 18000, -+ .we_cycle_time = 36000, -+ -+ .re_on_time = 9000, -+ .re_off_time = 27000, -+ .re_cycle_time = 36000, -+ -+ .access_time = 27000, -+ .cs_off_time = 36000, -+ -+ .cs_pulse_width = 0, -+ }, -+}; -+ -+ -+static int __init blizzard_init(void) -+{ -+ DBG("blizzard_init\n"); -+ omap_dss_register_ctrl(&blizzard_ctrl); -+ return 0; -+} -+ -+static void __exit blizzard_exit(void) -+{ -+ DBG("blizzard_exit\n"); -+ -+ omap_dss_unregister_ctrl(&blizzard_ctrl); -+} -+ -+module_init(blizzard_init); -+module_exit(blizzard_exit); -+ -+MODULE_AUTHOR("Tomi Valkeinen "); -+MODULE_DESCRIPTION("Blizzard Driver"); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/video/omap2/displays/panel-generic.c b/drivers/video/omap2/displays/panel-generic.c -new file mode 100644 -index 0000000..8382acb ---- /dev/null -+++ b/drivers/video/omap2/displays/panel-generic.c -@@ -0,0 +1,96 @@ -+/* -+ * Generic panel support -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+ -+#include -+ -+static int generic_panel_init(struct omap_display *display) -+{ -+ return 0; -+} -+ -+static int generic_panel_enable(struct omap_display *display) -+{ -+ int r = 0; -+ -+ if (display->hw_config.panel_enable) -+ r = display->hw_config.panel_enable(display); -+ -+ return r; -+} -+ -+static void generic_panel_disable(struct omap_display *display) -+{ -+ if (display->hw_config.panel_disable) -+ display->hw_config.panel_disable(display); -+} -+ -+static int generic_panel_suspend(struct omap_display *display) -+{ -+ generic_panel_disable(display); -+ return 0; -+} -+ -+static int generic_panel_resume(struct omap_display *display) -+{ -+ return generic_panel_enable(display); -+} -+ -+static struct omap_panel generic_panel = { -+ .owner = THIS_MODULE, -+ .name = "panel-generic", -+ .init = generic_panel_init, -+ .enable = generic_panel_enable, -+ .disable = generic_panel_disable, -+ .suspend = generic_panel_suspend, -+ .resume = generic_panel_resume, -+ -+ .timings = { -+ /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */ -+ .x_res = 640, -+ .y_res = 480, -+ .pixel_clock = 23500, -+ .hfp = 48, -+ .hsw = 32, -+ .hbp = 80, -+ .vfp = 3, -+ .vsw = 4, -+ .vbp = 7, -+ }, -+ -+ .config = OMAP_DSS_LCD_TFT, -+}; -+ -+ -+static int __init generic_panel_drv_init(void) -+{ -+ omap_dss_register_panel(&generic_panel); -+ return 0; -+} -+ -+static void __exit generic_panel_drv_exit(void) -+{ -+ omap_dss_unregister_panel(&generic_panel); -+} -+ -+module_init(generic_panel_drv_init); -+module_exit(generic_panel_drv_exit); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/video/omap2/displays/panel-n800.c b/drivers/video/omap2/displays/panel-n800.c -new file mode 100644 -index 0000000..91d3e37 ---- /dev/null -+++ b/drivers/video/omap2/displays/panel-n800.c -@@ -0,0 +1,435 @@ -+ -+/*#define DEBUG*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define MIPID_CMD_READ_DISP_ID 0x04 -+#define MIPID_CMD_READ_RED 0x06 -+#define MIPID_CMD_READ_GREEN 0x07 -+#define MIPID_CMD_READ_BLUE 0x08 -+#define MIPID_CMD_READ_DISP_STATUS 0x09 -+#define MIPID_CMD_RDDSDR 0x0F -+#define MIPID_CMD_SLEEP_IN 0x10 -+#define MIPID_CMD_SLEEP_OUT 0x11 -+#define MIPID_CMD_DISP_OFF 0x28 -+#define MIPID_CMD_DISP_ON 0x29 -+ -+#define MIPID_VER_LPH8923 3 -+#define MIPID_VER_LS041Y3 4 -+ -+#define MIPID_ESD_CHECK_PERIOD msecs_to_jiffies(5000) -+ -+#ifdef DEBUG -+#define DBG(format, ...) printk(KERN_DEBUG "PN800: " format, ## __VA_ARGS__) -+#else -+#define DBG(format, ...) -+#endif -+ -+struct pn800_device { -+ struct backlight_device *bl_dev; -+ int enabled; -+ int model; -+ int revision; -+ u8 display_id[3]; -+ unsigned int saved_bklight_level; -+ unsigned long hw_guard_end; /* next value of jiffies -+ when we can issue the -+ next sleep in/out command */ -+ unsigned long hw_guard_wait; /* max guard time in jiffies */ -+ -+ struct spi_device *spi; -+ struct mutex mutex; -+ struct omap_panel panel; -+ struct omap_display *display; -+}; -+ -+ -+static void pn800_transfer(struct pn800_device *md, int cmd, -+ const u8 *wbuf, int wlen, u8 *rbuf, int rlen) -+{ -+ struct spi_message m; -+ struct spi_transfer *x, xfer[4]; -+ u16 w; -+ int r; -+ -+ BUG_ON(md->spi == NULL); -+ -+ spi_message_init(&m); -+ -+ memset(xfer, 0, sizeof(xfer)); -+ x = &xfer[0]; -+ -+ cmd &= 0xff; -+ x->tx_buf = &cmd; -+ x->bits_per_word = 9; -+ x->len = 2; -+ spi_message_add_tail(x, &m); -+ -+ if (wlen) { -+ x++; -+ x->tx_buf = wbuf; -+ x->len = wlen; -+ x->bits_per_word = 9; -+ spi_message_add_tail(x, &m); -+ } -+ -+ if (rlen) { -+ x++; -+ x->rx_buf = &w; -+ x->len = 1; -+ spi_message_add_tail(x, &m); -+ -+ if (rlen > 1) { -+ /* Arrange for the extra clock before the first -+ * data bit. -+ */ -+ x->bits_per_word = 9; -+ x->len = 2; -+ -+ x++; -+ x->rx_buf = &rbuf[1]; -+ x->len = rlen - 1; -+ spi_message_add_tail(x, &m); -+ } -+ } -+ -+ r = spi_sync(md->spi, &m); -+ if (r < 0) -+ dev_dbg(&md->spi->dev, "spi_sync %d\n", r); -+ -+ if (rlen) -+ rbuf[0] = w & 0xff; -+} -+ -+static inline void pn800_cmd(struct pn800_device *md, int cmd) -+{ -+ pn800_transfer(md, cmd, NULL, 0, NULL, 0); -+} -+ -+static inline void pn800_write(struct pn800_device *md, -+ int reg, const u8 *buf, int len) -+{ -+ pn800_transfer(md, reg, buf, len, NULL, 0); -+} -+ -+static inline void pn800_read(struct pn800_device *md, -+ int reg, u8 *buf, int len) -+{ -+ pn800_transfer(md, reg, NULL, 0, buf, len); -+} -+ -+static void set_data_lines(struct pn800_device *md, int data_lines) -+{ -+ u16 par; -+ -+ switch (data_lines) { -+ case 16: -+ par = 0x150; -+ break; -+ case 18: -+ par = 0x160; -+ break; -+ case 24: -+ par = 0x170; -+ break; -+ } -+ pn800_write(md, 0x3a, (u8 *)&par, 2); -+} -+ -+static void send_init_string(struct pn800_device *md) -+{ -+ u16 initpar[] = { 0x0102, 0x0100, 0x0100 }; -+ int data_lines; -+ -+ pn800_write(md, 0xc2, (u8 *)initpar, sizeof(initpar)); -+ -+ data_lines = (int)md->display->hw_config.panel_data; // XXX -+ -+ set_data_lines(md, data_lines); -+} -+ -+static void hw_guard_start(struct pn800_device *md, int guard_msec) -+{ -+ md->hw_guard_wait = msecs_to_jiffies(guard_msec); -+ md->hw_guard_end = jiffies + md->hw_guard_wait; -+} -+ -+static void hw_guard_wait(struct pn800_device *md) -+{ -+ unsigned long wait = md->hw_guard_end - jiffies; -+ -+ if ((long)wait > 0 && wait <= md->hw_guard_wait) { -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ schedule_timeout(wait); -+ } -+} -+ -+static void set_sleep_mode(struct pn800_device *md, int on) -+{ -+ int cmd, sleep_time = 50; -+ -+ if (on) -+ cmd = MIPID_CMD_SLEEP_IN; -+ else -+ cmd = MIPID_CMD_SLEEP_OUT; -+ hw_guard_wait(md); -+ pn800_cmd(md, cmd); -+ hw_guard_start(md, 120); -+ /* -+ * When we enable the panel, it seems we _have_ to sleep -+ * 120 ms before sending the init string. When disabling the -+ * panel we'll sleep for the duration of 2 frames, so that the -+ * controller can still provide the PCLK,HS,VS signals. */ -+ if (!on) -+ sleep_time = 120; -+ msleep(sleep_time); -+} -+ -+static void set_display_state(struct pn800_device *md, int enabled) -+{ -+ int cmd = enabled ? MIPID_CMD_DISP_ON : MIPID_CMD_DISP_OFF; -+ -+ pn800_cmd(md, cmd); -+} -+ -+static int panel_enabled(struct pn800_device *md) -+{ -+ u32 disp_status; -+ int enabled; -+ -+ pn800_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4); -+ disp_status = __be32_to_cpu(disp_status); -+ enabled = (disp_status & (1 << 17)) && (disp_status & (1 << 10)); -+ dev_dbg(&md->spi->dev, -+ "LCD panel %s enabled by bootloader (status 0x%04x)\n", -+ enabled ? "" : "not ", disp_status); -+ DBG("status %#08x\n", disp_status); -+ return enabled; -+} -+ -+static int panel_detect(struct pn800_device *md) -+{ -+ pn800_read(md, MIPID_CMD_READ_DISP_ID, md->display_id, 3); -+ dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", -+ md->display_id[0], md->display_id[1], md->display_id[2]); -+ -+ switch (md->display_id[0]) { -+ case 0x45: -+ md->model = MIPID_VER_LPH8923; -+ md->panel.name = "lph8923"; -+ break; -+ case 0x83: -+ md->model = MIPID_VER_LS041Y3; -+ md->panel.name = "ls041y3"; -+ //md->esd_check = ls041y3_esd_check; -+ break; -+ default: -+ md->panel.name = "unknown"; -+ dev_err(&md->spi->dev, "invalid display ID\n"); -+ return -ENODEV; -+ } -+ -+ md->revision = md->display_id[1]; -+ pr_info("omapfb: %s rev %02x LCD detected\n", -+ md->panel.name, md->revision); -+ -+ return 0; -+} -+ -+ -+ -+static int pn800_panel_enable(struct omap_display *display) -+{ -+ int r; -+ struct pn800_device *md = -+ (struct pn800_device *)display->panel->priv; -+ -+ DBG("pn800_panel_enable\n"); -+ -+ mutex_lock(&md->mutex); -+ -+ if (display->hw_config.panel_enable) -+ display->hw_config.panel_enable(display); -+ -+ msleep(50); // wait for power up -+ -+ r = panel_detect(md); -+ if (r) { -+ mutex_unlock(&md->mutex); -+ return r; -+ } -+ -+ md->enabled = panel_enabled(md); -+ -+ if (md->enabled) { -+ DBG("panel already enabled\n"); -+ ; /*pn800_esd_start_check(md);*/ -+ } else { -+ ; /*md->saved_bklight_level = pn800_get_bklight_level(panel);*/ -+ } -+ -+ -+ if (md->enabled) { -+ mutex_unlock(&md->mutex); -+ return 0; -+ } -+ -+ set_sleep_mode(md, 0); -+ md->enabled = 1; -+ send_init_string(md); -+ set_display_state(md, 1); -+ //mipid_set_bklight_level(panel, md->saved_bklight_level); -+ //mipid_esd_start_check(md); -+ -+ mutex_unlock(&md->mutex); -+ return 0; -+} -+ -+static void pn800_panel_disable(struct omap_display *display) -+{ -+ struct pn800_device *md = -+ (struct pn800_device *)display->panel->priv; -+ -+ DBG("pn800_panel_disable\n"); -+ -+ mutex_lock(&md->mutex); -+ -+ if (!md->enabled) { -+ mutex_unlock(&md->mutex); -+ return; -+ } -+ /*md->saved_bklight_level = pn800_get_bklight_level(panel);*/ -+ /*pn800_set_bklight_level(panel, 0);*/ -+ -+ set_display_state(md, 0); -+ set_sleep_mode(md, 1); -+ md->enabled = 0; -+ -+ -+ if (display->hw_config.panel_disable) -+ display->hw_config.panel_disable(display); -+ -+ mutex_unlock(&md->mutex); -+} -+ -+static int pn800_panel_init(struct omap_display *display) -+{ -+ struct pn800_device *md = -+ (struct pn800_device *)display->panel->priv; -+ -+ DBG("pn800_panel_init\n"); -+ -+ mutex_init(&md->mutex); -+ md->display = display; -+ -+ return 0; -+} -+ -+static int pn800_run_test(struct omap_display *display, int test_num) -+{ -+ return 0; -+} -+ -+static struct omap_panel pn800_panel = { -+ .owner = THIS_MODULE, -+ .name = "panel-pn800", -+ .init = pn800_panel_init, -+ /*.remove = pn800_cleanup,*/ -+ .enable = pn800_panel_enable, -+ .disable = pn800_panel_disable, -+ //.set_mode = pn800_set_mode, -+ .run_test = pn800_run_test, -+ -+ .timings = { -+ .x_res = 800, -+ .y_res = 480, -+ -+ .pixel_clock = 21940, -+ .hsw = 50, -+ .hfp = 20, -+ .hbp = 15, -+ -+ .vsw = 2, -+ .vfp = 1, -+ .vbp = 3, -+ }, -+ .config = OMAP_DSS_LCD_TFT, -+}; -+ -+static int pn800_spi_probe(struct spi_device *spi) -+{ -+ struct pn800_device *md; -+ -+ DBG("pn800_spi_probe\n"); -+ -+ md = kzalloc(sizeof(*md), GFP_KERNEL); -+ if (md == NULL) { -+ dev_err(&spi->dev, "out of memory\n"); -+ return -ENOMEM; -+ } -+ -+ spi->mode = SPI_MODE_0; -+ md->spi = spi; -+ dev_set_drvdata(&spi->dev, md); -+ md->panel = pn800_panel; -+ pn800_panel.priv = md; -+ -+ omap_dss_register_panel(&pn800_panel); -+ -+ return 0; -+} -+ -+static int pn800_spi_remove(struct spi_device *spi) -+{ -+ struct pn800_device *md = dev_get_drvdata(&spi->dev); -+ -+ DBG("pn800_spi_remove\n"); -+ -+ omap_dss_unregister_panel(&pn800_panel); -+ -+ /*pn800_disable(&md->panel);*/ -+ kfree(md); -+ -+ return 0; -+} -+ -+static struct spi_driver pn800_spi_driver = { -+ .driver = { -+ .name = "panel-n800", -+ .bus = &spi_bus_type, -+ .owner = THIS_MODULE, -+ }, -+ .probe = pn800_spi_probe, -+ .remove = __devexit_p(pn800_spi_remove), -+}; -+ -+static int __init pn800_init(void) -+{ -+ DBG("pn800_init\n"); -+ return spi_register_driver(&pn800_spi_driver); -+} -+ -+static void __exit pn800_exit(void) -+{ -+ DBG("pn800_exit\n"); -+ spi_unregister_driver(&pn800_spi_driver); -+} -+ -+module_init(pn800_init); -+module_exit(pn800_exit); -+ -+MODULE_AUTHOR("Tomi Valkeinen "); -+MODULE_DESCRIPTION("N800 LCD Driver"); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c -new file mode 100644 -index 0000000..e4bb781 ---- /dev/null -+++ b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c -@@ -0,0 +1,108 @@ -+/* -+ * LCD panel driver for Samsung LTE430WQ-F0C -+ * -+ * Author: Steve Sakoman -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+ -+#include -+ -+static int samsung_lte_panel_init(struct omap_display *display) -+{ -+ return 0; -+} -+ -+static void samsung_lte_panel_cleanup(struct omap_display *display) -+{ -+} -+ -+static int samsung_lte_panel_enable(struct omap_display *display) -+{ -+ int r = 0; -+ -+ /* wait couple of vsyncs until enabling the LCD */ -+ msleep(50); -+ -+ if (display->hw_config.panel_enable) -+ r = display->hw_config.panel_enable(display); -+ -+ return r; -+} -+ -+static void samsung_lte_panel_disable(struct omap_display *display) -+{ -+ if (display->hw_config.panel_disable) -+ display->hw_config.panel_disable(display); -+ -+ /* wait at least 5 vsyncs after disabling the LCD */ -+ msleep(100); -+} -+ -+static int samsung_lte_panel_suspend(struct omap_display *display) -+{ -+ samsung_lte_panel_disable(display); -+ return 0; -+} -+ -+static int samsung_lte_panel_resume(struct omap_display *display) -+{ -+ return samsung_lte_panel_enable(display); -+} -+ -+static struct omap_panel samsung_lte_panel = { -+ .owner = THIS_MODULE, -+ .name = "samsung-lte430wq-f0c", -+ .init = samsung_lte_panel_init, -+ .cleanup = samsung_lte_panel_cleanup, -+ .enable = samsung_lte_panel_enable, -+ .disable = samsung_lte_panel_disable, -+ .suspend = samsung_lte_panel_suspend, -+ .resume = samsung_lte_panel_resume, -+ -+ .timings = { -+ .x_res = 480, -+ .y_res = 272, -+ -+ .pixel_clock = 9200, -+ -+ .hsw = 41, -+ .hfp = 8, -+ .hbp = 45-41, -+ -+ .vsw = 10, -+ .vfp = 4, -+ .vbp = 12-10, -+ }, -+ -+ .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IVS, -+}; -+ -+ -+static int __init samsung_lte_panel_drv_init(void) -+{ -+ omap_dss_register_panel(&samsung_lte_panel); -+ return 0; -+} -+ -+static void __exit samsung_lte_panel_drv_exit(void) -+{ -+ omap_dss_unregister_panel(&samsung_lte_panel); -+} -+ -+module_init(samsung_lte_panel_drv_init); -+module_exit(samsung_lte_panel_drv_exit); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c -new file mode 100644 -index 0000000..1f99150 ---- /dev/null -+++ b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c -@@ -0,0 +1,112 @@ -+/* -+ * LCD panel driver for Sharp LS037V7DW01 -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+ -+#include -+ -+static int sharp_ls_panel_init(struct omap_display *display) -+{ -+ return 0; -+} -+ -+static void sharp_ls_panel_cleanup(struct omap_display *display) -+{ -+} -+ -+static int sharp_ls_panel_enable(struct omap_display *display) -+{ -+ int r = 0; -+ -+ /* wait couple of vsyncs until enabling the LCD */ -+ msleep(50); -+ -+ if (display->hw_config.panel_enable) -+ r = display->hw_config.panel_enable(display); -+ -+ return r; -+} -+ -+static void sharp_ls_panel_disable(struct omap_display *display) -+{ -+ if (display->hw_config.panel_disable) -+ display->hw_config.panel_disable(display); -+ -+ /* wait at least 5 vsyncs after disabling the LCD */ -+ -+ msleep(100); -+} -+ -+static int sharp_ls_panel_suspend(struct omap_display *display) -+{ -+ sharp_ls_panel_disable(display); -+ return 0; -+} -+ -+static int sharp_ls_panel_resume(struct omap_display *display) -+{ -+ return sharp_ls_panel_enable(display); -+} -+ -+static struct omap_panel sharp_ls_panel = { -+ .owner = THIS_MODULE, -+ .name = "sharp-ls037v7dw01", -+ .init = sharp_ls_panel_init, -+ .cleanup = sharp_ls_panel_cleanup, -+ .enable = sharp_ls_panel_enable, -+ .disable = sharp_ls_panel_disable, -+ .suspend = sharp_ls_panel_suspend, -+ .resume = sharp_ls_panel_resume, -+ -+ .timings = { -+ .x_res = 480, -+ .y_res = 640, -+ -+ .pixel_clock = 19200, -+ -+ .hsw = 2, -+ .hfp = 1, -+ .hbp = 28, -+ -+ .vsw = 1, -+ .vfp = 1, -+ .vbp = 1, -+ }, -+ -+ .acb = 0x28, -+ -+ .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS, -+}; -+ -+ -+static int __init sharp_ls_panel_drv_init(void) -+{ -+ omap_dss_register_panel(&sharp_ls_panel); -+ return 0; -+} -+ -+static void __exit sharp_ls_panel_drv_exit(void) -+{ -+ omap_dss_unregister_panel(&sharp_ls_panel); -+} -+ -+module_init(sharp_ls_panel_drv_init); -+module_exit(sharp_ls_panel_drv_exit); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/video/omap2/dss/Kconfig b/drivers/video/omap2/dss/Kconfig -new file mode 100644 -index 0000000..f2ce068 ---- /dev/null -+++ b/drivers/video/omap2/dss/Kconfig -@@ -0,0 +1,89 @@ -+menuconfig OMAP2_DSS -+ tristate "OMAP2/3 Display Subsystem support (EXPERIMENTAL)" -+ depends on ARCH_OMAP2 || ARCH_OMAP3 -+ help -+ OMAP2/3 Display Subsystem support. -+ -+if OMAP2_DSS -+ -+config OMAP2_DSS_VRAM_SIZE -+ int "VRAM size (MB)" -+ range 0 32 -+ default 4 -+ help -+ The amount of SDRAM to reserve at boot time for video RAM use. -+ This VRAM will be used by omapfb and other drivers that need -+ large continuous RAM area for video use. -+ -+ You can also set this with "vram=" kernel argument, or -+ in the board file. -+ -+config OMAP2_DSS_DEBUG_SUPPORT -+ bool "Debug support" -+ default y -+ help -+ This enables debug messages. You need to enable printing -+ with 'debug' module parameter. -+ -+config OMAP2_DSS_RFBI -+ bool "RFBI support" -+ default n -+ help -+ MIPI DBI, or RFBI (Remote Framebuffer Interface), support. -+ -+config OMAP2_DSS_VENC -+ bool "VENC support" -+ default y -+ help -+ OMAP Video Encoder support. -+ -+config OMAP2_DSS_SDI -+ bool "SDI support" -+ depends on ARCH_OMAP3 -+ default n -+ help -+ SDI (Serial Display Interface) support. -+ -+config OMAP2_DSS_DSI -+ bool "DSI support" -+ depends on ARCH_OMAP3 -+ default n -+ help -+ MIPI DSI support. -+ -+config OMAP2_DSS_USE_DSI_PLL -+ bool "Use DSI PLL for PCLK (EXPERIMENTAL)" -+ default n -+ depends on OMAP2_DSS_DSI -+ help -+ Use DSI PLL to generate pixel clock. Currently only for DPI output. -+ DSI PLL can be used to generate higher and more precise pixel clocks. -+ -+config OMAP2_DSS_FAKE_VSYNC -+ bool "Fake VSYNC irq from manual update displays" -+ default n -+ help -+ If this is selected, DSI will generate a fake DISPC VSYNC interrupt -+ when DSI has sent a frame. This is only needed with DSI or RFBI -+ displays using manual mode, and you want VSYNC to, for example, -+ time animation. -+ -+config OMAP2_DSS_MIN_FCK_PER_PCK -+ int "Minimum FCK/PCK ratio (for scaling)" -+ range 0 32 -+ default 0 -+ help -+ This can be used to adjust the minimum FCK/PCK ratio. -+ -+ With this you can make sure that DISPC FCK is at least -+ n x PCK. Video plane scaling requires higher FCK than -+ normally. -+ -+ If this is set to 0, there's no extra constraint on the -+ DISPC FCK. However, the FCK will at minimum be -+ 2xPCK (if active matrix) or 3xPCK (if passive matrix). -+ -+ Max FCK is 173MHz, so this doesn't work if your PCK -+ is very high. -+ -+endif -diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile -new file mode 100644 -index 0000000..980c72c ---- /dev/null -+++ b/drivers/video/omap2/dss/Makefile -@@ -0,0 +1,6 @@ -+obj-$(CONFIG_OMAP2_DSS) += omapdss.o -+omapdss-y := core.o dss.o dispc.o dpi.o display.o manager.o overlay.o -+omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o -+omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o -+omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o -+omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o -diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c -new file mode 100644 -index 0000000..ae7cd06 ---- /dev/null -+++ b/drivers/video/omap2/dss/core.c -@@ -0,0 +1,641 @@ -+/* -+ * linux/drivers/video/omap2/dss/core.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "CORE" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "dss.h" -+ -+static struct { -+ struct platform_device *pdev; -+ unsigned ctx_id; -+ -+ struct clk *dss_ick; -+ struct clk *dss1_fck; -+ struct clk *dss2_fck; -+ struct clk *dss_54m_fck; -+ struct clk *dss_96m_fck; -+ unsigned num_clks_enabled; -+} core; -+ -+static void dss_clk_enable_all_no_ctx(void); -+static void dss_clk_disable_all_no_ctx(void); -+static void dss_clk_enable_no_ctx(enum dss_clock clks); -+static void dss_clk_disable_no_ctx(enum dss_clock clks); -+ -+static char *def_disp_name; -+module_param_named(def_disp, def_disp_name, charp, 0); -+MODULE_PARM_DESC(def_disp_name, "default display name"); -+ -+#ifdef DEBUG -+unsigned int dss_debug; -+module_param_named(debug, dss_debug, bool, 0644); -+#endif -+ -+/* CONTEXT */ -+static unsigned dss_get_ctx_id(void) -+{ -+ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; -+ -+ if (!pdata->get_last_off_on_transaction_id) -+ return 0; -+ -+ return pdata->get_last_off_on_transaction_id(&core.pdev->dev); -+} -+ -+int dss_need_ctx_restore(void) -+{ -+ int id = dss_get_ctx_id(); -+ -+ if (id != core.ctx_id) { -+ DSSDBG("ctx id %u -> id %u\n", -+ core.ctx_id, id); -+ core.ctx_id = id; -+ return 1; -+ } else { -+ return 0; -+ } -+} -+ -+static void save_all_ctx(void) -+{ -+ DSSDBG("save context\n"); -+ -+ dss_clk_enable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ dss_save_context(); -+ dispc_save_context(); -+#ifdef CONFIG_OMAP2_DSS_DSI -+ dsi_save_context(); -+#endif -+ -+ dss_clk_disable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); -+} -+ -+static void restore_all_ctx(void) -+{ -+ DSSDBG("restore context\n"); -+ -+ dss_clk_enable_all_no_ctx(); -+ -+ dss_restore_context(); -+ dispc_restore_context(); -+#ifdef CONFIG_OMAP2_DSS_DSI -+ dsi_restore_context(); -+#endif -+ -+ dss_clk_disable_all_no_ctx(); -+} -+ -+/* CLOCKS */ -+void dss_dump_clocks(struct seq_file *s) -+{ -+ int i; -+ struct clk *clocks[5] = { -+ core.dss_ick, -+ core.dss1_fck, -+ core.dss2_fck, -+ core.dss_54m_fck, -+ core.dss_96m_fck -+ }; -+ -+ seq_printf(s, "- dss -\n"); -+ -+ seq_printf(s, "internal clk count\t%u\n", core.num_clks_enabled); -+ -+ for (i = 0; i < 5; i++) { -+ if (!clocks[i]) -+ continue; -+ seq_printf(s, "%-15s\t%lu\t%d\n", -+ clocks[i]->name, -+ clk_get_rate(clocks[i]), -+ clocks[i]->usecount); -+ } -+} -+ -+static int dss_get_clocks(void) -+{ -+ const struct { -+ struct clk **clock; -+ char *omap2_name; -+ char *omap3_name; -+ } clocks[5] = { -+ { &core.dss_ick, "dss_ick", "dss_ick" }, /* L3 & L4 ick */ -+ { &core.dss1_fck, "dss1_fck", "dss1_alwon_fck" }, -+ { &core.dss2_fck, "dss2_fck", "dss2_alwon_fck" }, -+ { &core.dss_54m_fck, "dss_54m_fck", "dss_tv_fck" }, -+ { &core.dss_96m_fck, NULL, "dss_96m_fck" }, -+ }; -+ -+ int r = 0; -+ int i; -+ const int num_clocks = 5; -+ -+ for (i = 0; i < num_clocks; i++) -+ *clocks[i].clock = NULL; -+ -+ for (i = 0; i < num_clocks; i++) { -+ struct clk *clk; -+ const char *clk_name; -+ -+ clk_name = cpu_is_omap34xx() ? clocks[i].omap3_name -+ : clocks[i].omap2_name; -+ -+ if (!clk_name) -+ continue; -+ -+ clk = clk_get(NULL, clk_name); -+ -+ if (IS_ERR(clk)) { -+ DSSERR("can't get clock %s", clk_name); -+ r = PTR_ERR(clk); -+ goto err; -+ } -+ -+ DSSDBG("clk %s, rate %ld\n", -+ clk_name, clk_get_rate(clk)); -+ -+ *clocks[i].clock = clk; -+ } -+ -+ return 0; -+ -+err: -+ for (i = 0; i < num_clocks; i++) { -+ if (!IS_ERR(*clocks[i].clock)) -+ clk_put(*clocks[i].clock); -+ } -+ -+ return r; -+} -+ -+static void dss_put_clocks(void) -+{ -+ if (core.dss_96m_fck) -+ clk_put(core.dss_96m_fck); -+ clk_put(core.dss_54m_fck); -+ clk_put(core.dss1_fck); -+ clk_put(core.dss2_fck); -+ clk_put(core.dss_ick); -+} -+ -+unsigned long dss_clk_get_rate(enum dss_clock clk) -+{ -+ switch (clk) { -+ case DSS_CLK_ICK: -+ return clk_get_rate(core.dss_ick); -+ case DSS_CLK_FCK1: -+ return clk_get_rate(core.dss1_fck); -+ case DSS_CLK_FCK2: -+ return clk_get_rate(core.dss2_fck); -+ case DSS_CLK_54M: -+ return clk_get_rate(core.dss_54m_fck); -+ case DSS_CLK_96M: -+ return clk_get_rate(core.dss_96m_fck); -+ } -+ -+ BUG(); -+ return 0; -+} -+ -+static unsigned count_clk_bits(enum dss_clock clks) -+{ -+ unsigned num_clks = 0; -+ -+ if (clks & DSS_CLK_ICK) -+ ++num_clks; -+ if (clks & DSS_CLK_FCK1) -+ ++num_clks; -+ if (clks & DSS_CLK_FCK2) -+ ++num_clks; -+ if (clks & DSS_CLK_54M) -+ ++num_clks; -+ if (clks & DSS_CLK_96M) -+ ++num_clks; -+ -+ return num_clks; -+} -+ -+static void dss_clk_enable_no_ctx(enum dss_clock clks) -+{ -+ unsigned num_clks = count_clk_bits(clks); -+ -+ if (clks & DSS_CLK_ICK) -+ clk_enable(core.dss_ick); -+ if (clks & DSS_CLK_FCK1) -+ clk_enable(core.dss1_fck); -+ if (clks & DSS_CLK_FCK2) -+ clk_enable(core.dss2_fck); -+ if (clks & DSS_CLK_54M) -+ clk_enable(core.dss_54m_fck); -+ if (clks & DSS_CLK_96M) -+ clk_enable(core.dss_96m_fck); -+ -+ core.num_clks_enabled += num_clks; -+} -+ -+void dss_clk_enable(enum dss_clock clks) -+{ -+ dss_clk_enable_no_ctx(clks); -+ -+ if (cpu_is_omap34xx() && dss_need_ctx_restore()) -+ restore_all_ctx(); -+} -+ -+static void dss_clk_disable_no_ctx(enum dss_clock clks) -+{ -+ unsigned num_clks = count_clk_bits(clks); -+ -+ if (clks & DSS_CLK_ICK) -+ clk_disable(core.dss_ick); -+ if (clks & DSS_CLK_FCK1) -+ clk_disable(core.dss1_fck); -+ if (clks & DSS_CLK_FCK2) -+ clk_disable(core.dss2_fck); -+ if (clks & DSS_CLK_54M) -+ clk_disable(core.dss_54m_fck); -+ if (clks & DSS_CLK_96M) -+ clk_disable(core.dss_96m_fck); -+ -+ core.num_clks_enabled -= num_clks; -+} -+ -+void dss_clk_disable(enum dss_clock clks) -+{ -+ if (cpu_is_omap34xx()) { -+ unsigned num_clks = count_clk_bits(clks); -+ -+ BUG_ON(core.num_clks_enabled < num_clks); -+ -+ if (core.num_clks_enabled == num_clks) -+ save_all_ctx(); -+ } -+ -+ dss_clk_disable_no_ctx(clks); -+} -+ -+static void dss_clk_enable_all_no_ctx(void) -+{ -+ enum dss_clock clks; -+ -+ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; -+ if (cpu_is_omap34xx()) -+ clks |= DSS_CLK_96M; -+ dss_clk_enable_no_ctx(clks); -+} -+ -+static void dss_clk_disable_all_no_ctx(void) -+{ -+ enum dss_clock clks; -+ -+ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; -+ if (cpu_is_omap34xx()) -+ clks |= DSS_CLK_96M; -+ dss_clk_disable_no_ctx(clks); -+} -+ -+static void dss_clk_disable_all(void) -+{ -+ enum dss_clock clks; -+ -+ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; -+ if (cpu_is_omap34xx()) -+ clks |= DSS_CLK_96M; -+ dss_clk_disable(clks); -+} -+ -+/* DEBUGFS */ -+#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) -+static void dss_debug_dump_clocks(struct seq_file *s) -+{ -+ dss_dump_clocks(s); -+ dispc_dump_clocks(s); -+#ifdef CONFIG_OMAP2_DSS_DSI -+ dsi_dump_clocks(s); -+#endif -+} -+ -+static int dss_debug_show(struct seq_file *s, void *unused) -+{ -+ void (*func)(struct seq_file *) = s->private; -+ func(s); -+ return 0; -+} -+ -+static int dss_debug_open(struct inode *inode, struct file *file) -+{ -+ return single_open(file, dss_debug_show, inode->i_private); -+} -+ -+static const struct file_operations dss_debug_fops = { -+ .open = dss_debug_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = single_release, -+}; -+ -+static struct dentry *dss_debugfs_dir; -+ -+static int dss_initialize_debugfs(void) -+{ -+ dss_debugfs_dir = debugfs_create_dir("omapdss", NULL); -+ if (IS_ERR(dss_debugfs_dir)) { -+ int err = PTR_ERR(dss_debugfs_dir); -+ dss_debugfs_dir = NULL; -+ return err; -+ } -+ -+ debugfs_create_file("clk", S_IRUGO, dss_debugfs_dir, -+ &dss_debug_dump_clocks, &dss_debug_fops); -+ -+ debugfs_create_file("dss", S_IRUGO, dss_debugfs_dir, -+ &dss_dump_regs, &dss_debug_fops); -+ debugfs_create_file("dispc", S_IRUGO, dss_debugfs_dir, -+ &dispc_dump_regs, &dss_debug_fops); -+#ifdef CONFIG_OMAP2_DSS_RFBI -+ debugfs_create_file("rfbi", S_IRUGO, dss_debugfs_dir, -+ &rfbi_dump_regs, &dss_debug_fops); -+#endif -+#ifdef CONFIG_OMAP2_DSS_DSI -+ debugfs_create_file("dsi", S_IRUGO, dss_debugfs_dir, -+ &dsi_dump_regs, &dss_debug_fops); -+#endif -+ return 0; -+} -+ -+static void dss_uninitialize_debugfs(void) -+{ -+ if (dss_debugfs_dir) -+ debugfs_remove_recursive(dss_debugfs_dir); -+} -+#endif /* CONFIG_DEBUG_FS && CONFIG_OMAP2_DSS_DEBUG_SUPPORT */ -+ -+ -+/* DSI powers */ -+int dss_dsi_power_up(void) -+{ -+ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; -+ -+ if (!pdata->dsi_power_up) -+ return 0; /* presume power is always on then */ -+ -+ return pdata->dsi_power_up(); -+} -+ -+void dss_dsi_power_down(void) -+{ -+ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; -+ -+ if (!pdata->dsi_power_down) -+ return; -+ -+ pdata->dsi_power_down(); -+} -+ -+ -+ -+/* PLATFORM DEVICE */ -+static int omap_dss_probe(struct platform_device *pdev) -+{ -+ int skip_init = 0; -+ int r; -+ -+ core.pdev = pdev; -+ -+ r = dss_get_clocks(); -+ if (r) -+ goto fail0; -+ -+ dss_clk_enable_all_no_ctx(); -+ -+ core.ctx_id = dss_get_ctx_id(); -+ DSSDBG("initial ctx id %u\n", core.ctx_id); -+ -+#ifdef CONFIG_FB_OMAP_BOOTLOADER_INIT -+ /* DISPC_CONTROL */ -+ if (omap_readl(0x48050440) & 1) /* LCD enabled? */ -+ skip_init = 1; -+#endif -+ -+ r = dss_init(skip_init); -+ if (r) { -+ DSSERR("Failed to initialize DSS\n"); -+ goto fail0; -+ } -+ -+#ifdef CONFIG_OMAP2_DSS_RFBI -+ r = rfbi_init(); -+ if (r) { -+ DSSERR("Failed to initialize rfbi\n"); -+ goto fail0; -+ } -+#endif -+ -+ r = dpi_init(); -+ if (r) { -+ DSSERR("Failed to initialize dpi\n"); -+ goto fail0; -+ } -+ -+ r = dispc_init(); -+ if (r) { -+ DSSERR("Failed to initialize dispc\n"); -+ goto fail0; -+ } -+#ifdef CONFIG_OMAP2_DSS_VENC -+ r = venc_init(); -+ if (r) { -+ DSSERR("Failed to initialize venc\n"); -+ goto fail0; -+ } -+#endif -+ if (cpu_is_omap34xx()) { -+#ifdef CONFIG_OMAP2_DSS_SDI -+ r = sdi_init(skip_init); -+ if (r) { -+ DSSERR("Failed to initialize SDI\n"); -+ goto fail0; -+ } -+#endif -+#ifdef CONFIG_OMAP2_DSS_DSI -+ r = dsi_init(); -+ if (r) { -+ DSSERR("Failed to initialize DSI\n"); -+ goto fail0; -+ } -+#endif -+ } -+ -+#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) -+ r = dss_initialize_debugfs(); -+ if (r) -+ goto fail0; -+#endif -+ -+ dss_init_displays(pdev); -+ dss_init_overlay_managers(pdev); -+ dss_init_overlays(pdev, def_disp_name); -+ -+ dss_clk_disable_all(); -+ -+ return 0; -+ -+ /* XXX fail correctly */ -+fail0: -+ return r; -+} -+ -+static int omap_dss_remove(struct platform_device *pdev) -+{ -+ int c; -+ -+ dss_uninit_overlays(pdev); -+ dss_uninit_overlay_managers(pdev); -+ dss_uninit_displays(pdev); -+ -+#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) -+ dss_uninitialize_debugfs(); -+#endif -+ -+#ifdef CONFIG_OMAP2_DSS_VENC -+ venc_exit(); -+#endif -+ dispc_exit(); -+ dpi_exit(); -+#ifdef CONFIG_OMAP2_DSS_RFBI -+ rfbi_exit(); -+#endif -+ if (cpu_is_omap34xx()) { -+#ifdef CONFIG_OMAP2_DSS_DSI -+ dsi_exit(); -+#endif -+#ifdef CONFIG_OMAP2_DSS_SDI -+ sdi_exit(); -+#endif -+ } -+ -+ dss_exit(); -+ -+ /* these should be removed at some point */ -+ c = core.dss_ick->usecount; -+ if (c > 0) { -+ DSSERR("warning: dss_ick usecount %d, disabling\n", c); -+ while (c-- > 0) -+ clk_disable(core.dss_ick); -+ } -+ -+ c = core.dss1_fck->usecount; -+ if (c > 0) { -+ DSSERR("warning: dss1_fck usecount %d, disabling\n", c); -+ while (c-- > 0) -+ clk_disable(core.dss1_fck); -+ } -+ -+ c = core.dss2_fck->usecount; -+ if (c > 0) { -+ DSSERR("warning: dss2_fck usecount %d, disabling\n", c); -+ while (c-- > 0) -+ clk_disable(core.dss2_fck); -+ } -+ -+ c = core.dss_54m_fck->usecount; -+ if (c > 0) { -+ DSSERR("warning: dss_54m_fck usecount %d, disabling\n", c); -+ while (c-- > 0) -+ clk_disable(core.dss_54m_fck); -+ } -+ -+ if (core.dss_96m_fck) { -+ c = core.dss_96m_fck->usecount; -+ if (c > 0) { -+ DSSERR("warning: dss_96m_fck usecount %d, disabling\n", -+ c); -+ while (c-- > 0) -+ clk_disable(core.dss_96m_fck); -+ } -+ } -+ -+ dss_put_clocks(); -+ -+ return 0; -+} -+ -+static void omap_dss_shutdown(struct platform_device *pdev) -+{ -+ DSSDBG("shutdown\n"); -+} -+ -+static int omap_dss_suspend(struct platform_device *pdev, pm_message_t state) -+{ -+ DSSDBG("suspend %d\n", state.event); -+ -+ return dss_suspend_all_displays(); -+} -+ -+static int omap_dss_resume(struct platform_device *pdev) -+{ -+ DSSDBG("resume\n"); -+ -+ return dss_resume_all_displays(); -+} -+ -+static struct platform_driver omap_dss_driver = { -+ .probe = omap_dss_probe, -+ .remove = omap_dss_remove, -+ .shutdown = omap_dss_shutdown, -+ .suspend = omap_dss_suspend, -+ .resume = omap_dss_resume, -+ .driver = { -+ .name = "omapdss", -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init omap_dss_init(void) -+{ -+ return platform_driver_register(&omap_dss_driver); -+} -+ -+static void __exit omap_dss_exit(void) -+{ -+ platform_driver_unregister(&omap_dss_driver); -+} -+ -+subsys_initcall(omap_dss_init); -+module_exit(omap_dss_exit); -+ -+ -+MODULE_AUTHOR("Tomi Valkeinen "); -+MODULE_DESCRIPTION("OMAP2/3 Display Subsystem"); -+MODULE_LICENSE("GPL v2"); -+ -diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c -new file mode 100644 -index 0000000..ae3e9d0 ---- /dev/null -+++ b/drivers/video/omap2/dss/dispc.c -@@ -0,0 +1,2781 @@ -+/* -+ * linux/drivers/video/omap2/dss/dispc.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "DISPC" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+ -+#include "dss.h" -+ -+/* DISPC */ -+#define DISPC_BASE 0x48050400 -+ -+#define DISPC_SZ_REGS SZ_1K -+ -+struct dispc_reg { u16 idx; }; -+ -+#define DISPC_REG(idx) ((const struct dispc_reg) { idx }) -+ -+/* DISPC common */ -+#define DISPC_REVISION DISPC_REG(0x0000) -+#define DISPC_SYSCONFIG DISPC_REG(0x0010) -+#define DISPC_SYSSTATUS DISPC_REG(0x0014) -+#define DISPC_IRQSTATUS DISPC_REG(0x0018) -+#define DISPC_IRQENABLE DISPC_REG(0x001C) -+#define DISPC_CONTROL DISPC_REG(0x0040) -+#define DISPC_CONFIG DISPC_REG(0x0044) -+#define DISPC_CAPABLE DISPC_REG(0x0048) -+#define DISPC_DEFAULT_COLOR0 DISPC_REG(0x004C) -+#define DISPC_DEFAULT_COLOR1 DISPC_REG(0x0050) -+#define DISPC_TRANS_COLOR0 DISPC_REG(0x0054) -+#define DISPC_TRANS_COLOR1 DISPC_REG(0x0058) -+#define DISPC_LINE_STATUS DISPC_REG(0x005C) -+#define DISPC_LINE_NUMBER DISPC_REG(0x0060) -+#define DISPC_TIMING_H DISPC_REG(0x0064) -+#define DISPC_TIMING_V DISPC_REG(0x0068) -+#define DISPC_POL_FREQ DISPC_REG(0x006C) -+#define DISPC_DIVISOR DISPC_REG(0x0070) -+#define DISPC_GLOBAL_ALPHA DISPC_REG(0x0074) -+#define DISPC_SIZE_DIG DISPC_REG(0x0078) -+#define DISPC_SIZE_LCD DISPC_REG(0x007C) -+ -+/* DISPC GFX plane */ -+#define DISPC_GFX_BA0 DISPC_REG(0x0080) -+#define DISPC_GFX_BA1 DISPC_REG(0x0084) -+#define DISPC_GFX_POSITION DISPC_REG(0x0088) -+#define DISPC_GFX_SIZE DISPC_REG(0x008C) -+#define DISPC_GFX_ATTRIBUTES DISPC_REG(0x00A0) -+#define DISPC_GFX_FIFO_THRESHOLD DISPC_REG(0x00A4) -+#define DISPC_GFX_FIFO_SIZE_STATUS DISPC_REG(0x00A8) -+#define DISPC_GFX_ROW_INC DISPC_REG(0x00AC) -+#define DISPC_GFX_PIXEL_INC DISPC_REG(0x00B0) -+#define DISPC_GFX_WINDOW_SKIP DISPC_REG(0x00B4) -+#define DISPC_GFX_TABLE_BA DISPC_REG(0x00B8) -+ -+#define DISPC_DATA_CYCLE1 DISPC_REG(0x01D4) -+#define DISPC_DATA_CYCLE2 DISPC_REG(0x01D8) -+#define DISPC_DATA_CYCLE3 DISPC_REG(0x01DC) -+ -+#define DISPC_CPR_COEF_R DISPC_REG(0x0220) -+#define DISPC_CPR_COEF_G DISPC_REG(0x0224) -+#define DISPC_CPR_COEF_B DISPC_REG(0x0228) -+ -+#define DISPC_GFX_PRELOAD DISPC_REG(0x022C) -+ -+/* DISPC Video plane, n = 0 for VID1 and n = 1 for VID2 */ -+#define DISPC_VID_REG(n, idx) DISPC_REG(0x00BC + (n)*0x90 + idx) -+ -+#define DISPC_VID_BA0(n) DISPC_VID_REG(n, 0x0000) -+#define DISPC_VID_BA1(n) DISPC_VID_REG(n, 0x0004) -+#define DISPC_VID_POSITION(n) DISPC_VID_REG(n, 0x0008) -+#define DISPC_VID_SIZE(n) DISPC_VID_REG(n, 0x000C) -+#define DISPC_VID_ATTRIBUTES(n) DISPC_VID_REG(n, 0x0010) -+#define DISPC_VID_FIFO_THRESHOLD(n) DISPC_VID_REG(n, 0x0014) -+#define DISPC_VID_FIFO_SIZE_STATUS(n) DISPC_VID_REG(n, 0x0018) -+#define DISPC_VID_ROW_INC(n) DISPC_VID_REG(n, 0x001C) -+#define DISPC_VID_PIXEL_INC(n) DISPC_VID_REG(n, 0x0020) -+#define DISPC_VID_FIR(n) DISPC_VID_REG(n, 0x0024) -+#define DISPC_VID_PICTURE_SIZE(n) DISPC_VID_REG(n, 0x0028) -+#define DISPC_VID_ACCU0(n) DISPC_VID_REG(n, 0x002C) -+#define DISPC_VID_ACCU1(n) DISPC_VID_REG(n, 0x0030) -+ -+/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ -+#define DISPC_VID_FIR_COEF_H(n, i) DISPC_REG(0x00F0 + (n)*0x90 + (i)*0x8) -+/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ -+#define DISPC_VID_FIR_COEF_HV(n, i) DISPC_REG(0x00F4 + (n)*0x90 + (i)*0x8) -+/* coef index i = {0, 1, 2, 3, 4} */ -+#define DISPC_VID_CONV_COEF(n, i) DISPC_REG(0x0130 + (n)*0x90 + (i)*0x4) -+/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ -+#define DISPC_VID_FIR_COEF_V(n, i) DISPC_REG(0x01E0 + (n)*0x20 + (i)*0x4) -+ -+#define DISPC_VID_PRELOAD(n) DISPC_REG(0x230 + (n)*0x04) -+ -+ -+#define DISPC_IRQ_MASK_ERROR (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \ -+ DISPC_IRQ_OCP_ERR | \ -+ DISPC_IRQ_VID1_FIFO_UNDERFLOW | \ -+ DISPC_IRQ_VID2_FIFO_UNDERFLOW | \ -+ DISPC_IRQ_SYNC_LOST | \ -+ DISPC_IRQ_SYNC_LOST_DIGIT) -+ -+#define DISPC_MAX_NR_ISRS 8 -+ -+struct omap_dispc_isr_data { -+ omap_dispc_isr_t isr; -+ void *arg; -+ u32 mask; -+}; -+ -+#define REG_GET(idx, start, end) \ -+ FLD_GET(dispc_read_reg(idx), start, end) -+ -+#define REG_FLD_MOD(idx, val, start, end) \ -+ dispc_write_reg(idx, FLD_MOD(dispc_read_reg(idx), val, start, end)) -+ -+static const struct dispc_reg dispc_reg_att[] = { DISPC_GFX_ATTRIBUTES, -+ DISPC_VID_ATTRIBUTES(0), -+ DISPC_VID_ATTRIBUTES(1) }; -+ -+static struct { -+ void __iomem *base; -+ -+ struct clk *dpll4_m4_ck; -+ -+ spinlock_t irq_lock; -+ -+ unsigned long cache_req_pck; -+ unsigned long cache_prate; -+ struct dispc_clock_info cache_cinfo; -+ -+ u32 irq_error_mask; -+ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; -+ -+ u32 ctx[DISPC_SZ_REGS / sizeof(u32)]; -+} dispc; -+ -+static void omap_dispc_set_irqs(void); -+ -+static inline void dispc_write_reg(const struct dispc_reg idx, u32 val) -+{ -+ __raw_writel(val, dispc.base + idx.idx); -+} -+ -+static inline u32 dispc_read_reg(const struct dispc_reg idx) -+{ -+ return __raw_readl(dispc.base + idx.idx); -+} -+ -+#define SR(reg) \ -+ dispc.ctx[(DISPC_##reg).idx / sizeof(u32)] = dispc_read_reg(DISPC_##reg) -+#define RR(reg) \ -+ dispc_write_reg(DISPC_##reg, dispc.ctx[(DISPC_##reg).idx / sizeof(u32)]) -+ -+void dispc_save_context(void) -+{ -+ if (cpu_is_omap24xx()) -+ return; -+ -+ SR(SYSCONFIG); -+ SR(IRQENABLE); -+ SR(CONTROL); -+ SR(CONFIG); -+ SR(DEFAULT_COLOR0); -+ SR(DEFAULT_COLOR1); -+ SR(TRANS_COLOR0); -+ SR(TRANS_COLOR1); -+ SR(LINE_NUMBER); -+ SR(TIMING_H); -+ SR(TIMING_V); -+ SR(POL_FREQ); -+ SR(DIVISOR); -+ SR(GLOBAL_ALPHA); -+ SR(SIZE_DIG); -+ SR(SIZE_LCD); -+ -+ SR(GFX_BA0); -+ SR(GFX_BA1); -+ SR(GFX_POSITION); -+ SR(GFX_SIZE); -+ SR(GFX_ATTRIBUTES); -+ SR(GFX_FIFO_THRESHOLD); -+ SR(GFX_ROW_INC); -+ SR(GFX_PIXEL_INC); -+ SR(GFX_WINDOW_SKIP); -+ SR(GFX_TABLE_BA); -+ -+ SR(DATA_CYCLE1); -+ SR(DATA_CYCLE2); -+ SR(DATA_CYCLE3); -+ -+ SR(CPR_COEF_R); -+ SR(CPR_COEF_G); -+ SR(CPR_COEF_B); -+ -+ SR(GFX_PRELOAD); -+ -+ /* VID1 */ -+ SR(VID_BA0(0)); -+ SR(VID_BA1(0)); -+ SR(VID_POSITION(0)); -+ SR(VID_SIZE(0)); -+ SR(VID_ATTRIBUTES(0)); -+ SR(VID_FIFO_THRESHOLD(0)); -+ SR(VID_ROW_INC(0)); -+ SR(VID_PIXEL_INC(0)); -+ SR(VID_FIR(0)); -+ SR(VID_PICTURE_SIZE(0)); -+ SR(VID_ACCU0(0)); -+ SR(VID_ACCU1(0)); -+ -+ SR(VID_FIR_COEF_H(0, 0)); -+ SR(VID_FIR_COEF_H(0, 1)); -+ SR(VID_FIR_COEF_H(0, 2)); -+ SR(VID_FIR_COEF_H(0, 3)); -+ SR(VID_FIR_COEF_H(0, 4)); -+ SR(VID_FIR_COEF_H(0, 5)); -+ SR(VID_FIR_COEF_H(0, 6)); -+ SR(VID_FIR_COEF_H(0, 7)); -+ -+ SR(VID_FIR_COEF_HV(0, 0)); -+ SR(VID_FIR_COEF_HV(0, 1)); -+ SR(VID_FIR_COEF_HV(0, 2)); -+ SR(VID_FIR_COEF_HV(0, 3)); -+ SR(VID_FIR_COEF_HV(0, 4)); -+ SR(VID_FIR_COEF_HV(0, 5)); -+ SR(VID_FIR_COEF_HV(0, 6)); -+ SR(VID_FIR_COEF_HV(0, 7)); -+ -+ SR(VID_CONV_COEF(0, 0)); -+ SR(VID_CONV_COEF(0, 1)); -+ SR(VID_CONV_COEF(0, 2)); -+ SR(VID_CONV_COEF(0, 3)); -+ SR(VID_CONV_COEF(0, 4)); -+ -+ SR(VID_FIR_COEF_V(0, 0)); -+ SR(VID_FIR_COEF_V(0, 1)); -+ SR(VID_FIR_COEF_V(0, 2)); -+ SR(VID_FIR_COEF_V(0, 3)); -+ SR(VID_FIR_COEF_V(0, 4)); -+ SR(VID_FIR_COEF_V(0, 5)); -+ SR(VID_FIR_COEF_V(0, 6)); -+ SR(VID_FIR_COEF_V(0, 7)); -+ -+ SR(VID_PRELOAD(0)); -+ -+ /* VID2 */ -+ SR(VID_BA0(1)); -+ SR(VID_BA1(1)); -+ SR(VID_POSITION(1)); -+ SR(VID_SIZE(1)); -+ SR(VID_ATTRIBUTES(1)); -+ SR(VID_FIFO_THRESHOLD(1)); -+ SR(VID_ROW_INC(1)); -+ SR(VID_PIXEL_INC(1)); -+ SR(VID_FIR(1)); -+ SR(VID_PICTURE_SIZE(1)); -+ SR(VID_ACCU0(1)); -+ SR(VID_ACCU1(1)); -+ -+ SR(VID_FIR_COEF_H(1, 0)); -+ SR(VID_FIR_COEF_H(1, 1)); -+ SR(VID_FIR_COEF_H(1, 2)); -+ SR(VID_FIR_COEF_H(1, 3)); -+ SR(VID_FIR_COEF_H(1, 4)); -+ SR(VID_FIR_COEF_H(1, 5)); -+ SR(VID_FIR_COEF_H(1, 6)); -+ SR(VID_FIR_COEF_H(1, 7)); -+ -+ SR(VID_FIR_COEF_HV(1, 0)); -+ SR(VID_FIR_COEF_HV(1, 1)); -+ SR(VID_FIR_COEF_HV(1, 2)); -+ SR(VID_FIR_COEF_HV(1, 3)); -+ SR(VID_FIR_COEF_HV(1, 4)); -+ SR(VID_FIR_COEF_HV(1, 5)); -+ SR(VID_FIR_COEF_HV(1, 6)); -+ SR(VID_FIR_COEF_HV(1, 7)); -+ -+ SR(VID_CONV_COEF(1, 0)); -+ SR(VID_CONV_COEF(1, 1)); -+ SR(VID_CONV_COEF(1, 2)); -+ SR(VID_CONV_COEF(1, 3)); -+ SR(VID_CONV_COEF(1, 4)); -+ -+ SR(VID_FIR_COEF_V(1, 0)); -+ SR(VID_FIR_COEF_V(1, 1)); -+ SR(VID_FIR_COEF_V(1, 2)); -+ SR(VID_FIR_COEF_V(1, 3)); -+ SR(VID_FIR_COEF_V(1, 4)); -+ SR(VID_FIR_COEF_V(1, 5)); -+ SR(VID_FIR_COEF_V(1, 6)); -+ SR(VID_FIR_COEF_V(1, 7)); -+ -+ SR(VID_PRELOAD(1)); -+} -+ -+void dispc_restore_context(void) -+{ -+ RR(SYSCONFIG); -+ RR(IRQENABLE); -+ /*RR(CONTROL);*/ -+ RR(CONFIG); -+ RR(DEFAULT_COLOR0); -+ RR(DEFAULT_COLOR1); -+ RR(TRANS_COLOR0); -+ RR(TRANS_COLOR1); -+ RR(LINE_NUMBER); -+ RR(TIMING_H); -+ RR(TIMING_V); -+ RR(POL_FREQ); -+ RR(DIVISOR); -+ RR(GLOBAL_ALPHA); -+ RR(SIZE_DIG); -+ RR(SIZE_LCD); -+ -+ RR(GFX_BA0); -+ RR(GFX_BA1); -+ RR(GFX_POSITION); -+ RR(GFX_SIZE); -+ RR(GFX_ATTRIBUTES); -+ RR(GFX_FIFO_THRESHOLD); -+ RR(GFX_ROW_INC); -+ RR(GFX_PIXEL_INC); -+ RR(GFX_WINDOW_SKIP); -+ RR(GFX_TABLE_BA); -+ -+ RR(DATA_CYCLE1); -+ RR(DATA_CYCLE2); -+ RR(DATA_CYCLE3); -+ -+ RR(CPR_COEF_R); -+ RR(CPR_COEF_G); -+ RR(CPR_COEF_B); -+ -+ RR(GFX_PRELOAD); -+ -+ /* VID1 */ -+ RR(VID_BA0(0)); -+ RR(VID_BA1(0)); -+ RR(VID_POSITION(0)); -+ RR(VID_SIZE(0)); -+ RR(VID_ATTRIBUTES(0)); -+ RR(VID_FIFO_THRESHOLD(0)); -+ RR(VID_ROW_INC(0)); -+ RR(VID_PIXEL_INC(0)); -+ RR(VID_FIR(0)); -+ RR(VID_PICTURE_SIZE(0)); -+ RR(VID_ACCU0(0)); -+ RR(VID_ACCU1(0)); -+ -+ RR(VID_FIR_COEF_H(0, 0)); -+ RR(VID_FIR_COEF_H(0, 1)); -+ RR(VID_FIR_COEF_H(0, 2)); -+ RR(VID_FIR_COEF_H(0, 3)); -+ RR(VID_FIR_COEF_H(0, 4)); -+ RR(VID_FIR_COEF_H(0, 5)); -+ RR(VID_FIR_COEF_H(0, 6)); -+ RR(VID_FIR_COEF_H(0, 7)); -+ -+ RR(VID_FIR_COEF_HV(0, 0)); -+ RR(VID_FIR_COEF_HV(0, 1)); -+ RR(VID_FIR_COEF_HV(0, 2)); -+ RR(VID_FIR_COEF_HV(0, 3)); -+ RR(VID_FIR_COEF_HV(0, 4)); -+ RR(VID_FIR_COEF_HV(0, 5)); -+ RR(VID_FIR_COEF_HV(0, 6)); -+ RR(VID_FIR_COEF_HV(0, 7)); -+ -+ RR(VID_CONV_COEF(0, 0)); -+ RR(VID_CONV_COEF(0, 1)); -+ RR(VID_CONV_COEF(0, 2)); -+ RR(VID_CONV_COEF(0, 3)); -+ RR(VID_CONV_COEF(0, 4)); -+ -+ RR(VID_FIR_COEF_V(0, 0)); -+ RR(VID_FIR_COEF_V(0, 1)); -+ RR(VID_FIR_COEF_V(0, 2)); -+ RR(VID_FIR_COEF_V(0, 3)); -+ RR(VID_FIR_COEF_V(0, 4)); -+ RR(VID_FIR_COEF_V(0, 5)); -+ RR(VID_FIR_COEF_V(0, 6)); -+ RR(VID_FIR_COEF_V(0, 7)); -+ -+ RR(VID_PRELOAD(0)); -+ -+ /* VID2 */ -+ RR(VID_BA0(1)); -+ RR(VID_BA1(1)); -+ RR(VID_POSITION(1)); -+ RR(VID_SIZE(1)); -+ RR(VID_ATTRIBUTES(1)); -+ RR(VID_FIFO_THRESHOLD(1)); -+ RR(VID_ROW_INC(1)); -+ RR(VID_PIXEL_INC(1)); -+ RR(VID_FIR(1)); -+ RR(VID_PICTURE_SIZE(1)); -+ RR(VID_ACCU0(1)); -+ RR(VID_ACCU1(1)); -+ -+ RR(VID_FIR_COEF_H(1, 0)); -+ RR(VID_FIR_COEF_H(1, 1)); -+ RR(VID_FIR_COEF_H(1, 2)); -+ RR(VID_FIR_COEF_H(1, 3)); -+ RR(VID_FIR_COEF_H(1, 4)); -+ RR(VID_FIR_COEF_H(1, 5)); -+ RR(VID_FIR_COEF_H(1, 6)); -+ RR(VID_FIR_COEF_H(1, 7)); -+ -+ RR(VID_FIR_COEF_HV(1, 0)); -+ RR(VID_FIR_COEF_HV(1, 1)); -+ RR(VID_FIR_COEF_HV(1, 2)); -+ RR(VID_FIR_COEF_HV(1, 3)); -+ RR(VID_FIR_COEF_HV(1, 4)); -+ RR(VID_FIR_COEF_HV(1, 5)); -+ RR(VID_FIR_COEF_HV(1, 6)); -+ RR(VID_FIR_COEF_HV(1, 7)); -+ -+ RR(VID_CONV_COEF(1, 0)); -+ RR(VID_CONV_COEF(1, 1)); -+ RR(VID_CONV_COEF(1, 2)); -+ RR(VID_CONV_COEF(1, 3)); -+ RR(VID_CONV_COEF(1, 4)); -+ -+ RR(VID_FIR_COEF_V(1, 0)); -+ RR(VID_FIR_COEF_V(1, 1)); -+ RR(VID_FIR_COEF_V(1, 2)); -+ RR(VID_FIR_COEF_V(1, 3)); -+ RR(VID_FIR_COEF_V(1, 4)); -+ RR(VID_FIR_COEF_V(1, 5)); -+ RR(VID_FIR_COEF_V(1, 6)); -+ RR(VID_FIR_COEF_V(1, 7)); -+ -+ RR(VID_PRELOAD(1)); -+ -+ /* enable last, because LCD & DIGIT enable are here */ -+ RR(CONTROL); -+} -+ -+#undef SR -+#undef RR -+ -+static inline void enable_clocks(bool enable) -+{ -+ if (enable) -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ else -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+} -+ -+void dispc_go(enum omap_channel channel) -+{ -+ int bit; -+ unsigned long tmo; -+ -+ enable_clocks(1); -+ -+ if (channel == OMAP_DSS_CHANNEL_LCD) -+ bit = 0; /* LCDENABLE */ -+ else -+ bit = 1; /* DIGITALENABLE */ -+ -+ /* if the channel is not enabled, we don't need GO */ -+ if (REG_GET(DISPC_CONTROL, bit, bit) == 0) -+ goto end; -+ -+ if (channel == OMAP_DSS_CHANNEL_LCD) -+ bit = 5; /* GOLCD */ -+ else -+ bit = 6; /* GODIGIT */ -+ -+ tmo = jiffies + msecs_to_jiffies(200); -+ while (REG_GET(DISPC_CONTROL, bit, bit) == 1) { -+ if (time_after(jiffies, tmo)) { -+ DSSERR("timeout waiting GO flag\n"); -+ goto end; -+ } -+ cpu_relax(); -+ } -+ -+ DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : "DIGIT"); -+ -+ REG_FLD_MOD(DISPC_CONTROL, 1, bit, bit); -+end: -+ enable_clocks(0); -+} -+ -+static void _dispc_write_firh_reg(enum omap_plane plane, int reg, u32 value) -+{ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ dispc_write_reg(DISPC_VID_FIR_COEF_H(plane-1, reg), value); -+} -+ -+static void _dispc_write_firhv_reg(enum omap_plane plane, int reg, u32 value) -+{ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ dispc_write_reg(DISPC_VID_FIR_COEF_HV(plane-1, reg), value); -+} -+ -+static void _dispc_write_firv_reg(enum omap_plane plane, int reg, u32 value) -+{ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ dispc_write_reg(DISPC_VID_FIR_COEF_V(plane-1, reg), value); -+} -+ -+static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, -+ int vscaleup, int five_taps) -+{ -+ /* Coefficients for horizontal up-sampling */ -+ static const u32 coef_hup[8] = { -+ 0x00800000, -+ 0x0D7CF800, -+ 0x1E70F5FF, -+ 0x335FF5FE, -+ 0xF74949F7, -+ 0xF55F33FB, -+ 0xF5701EFE, -+ 0xF87C0DFF, -+ }; -+ -+ /* Coefficients for horizontal down-sampling */ -+ static const u32 coef_hdown[8] = { -+ 0x24382400, -+ 0x28371FFE, -+ 0x2C361BFB, -+ 0x303516F9, -+ 0x11343311, -+ 0x1635300C, -+ 0x1B362C08, -+ 0x1F372804, -+ }; -+ -+ /* Coefficients for horizontal and vertical up-sampling */ -+ static const u32 coef_hvup[2][8] = { -+ { -+ 0x00800000, -+ 0x037B02FF, -+ 0x0C6F05FE, -+ 0x205907FB, -+ 0x00404000, -+ 0x075920FE, -+ 0x056F0CFF, -+ 0x027B0300, -+ }, -+ { -+ 0x00800000, -+ 0x0D7CF8FF, -+ 0x1E70F5FE, -+ 0x335FF5FB, -+ 0xF7404000, -+ 0xF55F33FE, -+ 0xF5701EFF, -+ 0xF87C0D00, -+ }, -+ }; -+ -+ /* Coefficients for horizontal and vertical down-sampling */ -+ static const u32 coef_hvdown[2][8] = { -+ { -+ 0x24382400, -+ 0x28391F04, -+ 0x2D381B08, -+ 0x3237170C, -+ 0x123737F7, -+ 0x173732F9, -+ 0x1B382DFB, -+ 0x1F3928FE, -+ }, -+ { -+ 0x24382400, -+ 0x28371F04, -+ 0x2C361B08, -+ 0x3035160C, -+ 0x113433F7, -+ 0x163530F9, -+ 0x1B362CFB, -+ 0x1F3728FE, -+ }, -+ }; -+ -+ /* Coefficients for vertical up-sampling */ -+ static const u32 coef_vup[8] = { -+ 0x00000000, -+ 0x0000FF00, -+ 0x0000FEFF, -+ 0x0000FBFE, -+ 0x000000F7, -+ 0x0000FEFB, -+ 0x0000FFFE, -+ 0x000000FF, -+ }; -+ -+ -+ /* Coefficients for vertical down-sampling */ -+ static const u32 coef_vdown[8] = { -+ 0x00000000, -+ 0x000004FE, -+ 0x000008FB, -+ 0x00000CF9, -+ 0x0000F711, -+ 0x0000F90C, -+ 0x0000FB08, -+ 0x0000FE04, -+ }; -+ -+ const u32 *h_coef; -+ const u32 *hv_coef; -+ const u32 *hv_coef_mod; -+ const u32 *v_coef; -+ int i; -+ -+ if (hscaleup) -+ h_coef = coef_hup; -+ else -+ h_coef = coef_hdown; -+ -+ if (vscaleup) { -+ hv_coef = coef_hvup[five_taps]; -+ v_coef = coef_vup; -+ -+ if (hscaleup) -+ hv_coef_mod = NULL; -+ else -+ hv_coef_mod = coef_hvdown[five_taps]; -+ } else { -+ hv_coef = coef_hvdown[five_taps]; -+ v_coef = coef_vdown; -+ -+ if (hscaleup) -+ hv_coef_mod = coef_hvup[five_taps]; -+ else -+ hv_coef_mod = NULL; -+ } -+ -+ for (i = 0; i < 8; i++) { -+ u32 h, hv; -+ -+ h = h_coef[i]; -+ -+ hv = hv_coef[i]; -+ -+ if (hv_coef_mod) { -+ hv &= 0xffffff00; -+ hv |= (hv_coef_mod[i] & 0xff); -+ } -+ -+ _dispc_write_firh_reg(plane, i, h); -+ _dispc_write_firhv_reg(plane, i, hv); -+ } -+ -+ if (!five_taps) -+ return; -+ -+ for (i = 0; i < 8; i++) { -+ u32 v; -+ v = v_coef[i]; -+ _dispc_write_firv_reg(plane, i, v); -+ } -+} -+ -+static void _dispc_setup_color_conv_coef(void) -+{ -+ const struct color_conv_coef { -+ int ry, rcr, rcb, gy, gcr, gcb, by, bcr, bcb; -+ int full_range; -+ } ctbl_bt601_5 = { -+ 298, 409, 0, 298, -208, -100, 298, 0, 517, 0, -+ }; -+ -+ const struct color_conv_coef *ct; -+ -+#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0)) -+ -+ ct = &ctbl_bt601_5; -+ -+ dispc_write_reg(DISPC_VID_CONV_COEF(0, 0), CVAL(ct->rcr, ct->ry)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(0, 1), CVAL(ct->gy, ct->rcb)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(0, 2), CVAL(ct->gcb, ct->gcr)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(0, 3), CVAL(ct->bcr, ct->by)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(0, 4), CVAL(0, ct->bcb)); -+ -+ dispc_write_reg(DISPC_VID_CONV_COEF(1, 0), CVAL(ct->rcr, ct->ry)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(1, 1), CVAL(ct->gy, ct->rcb)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(1, 2), CVAL(ct->gcb, ct->gcr)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(1, 3), CVAL(ct->bcr, ct->by)); -+ dispc_write_reg(DISPC_VID_CONV_COEF(1, 4), CVAL(0, ct->bcb)); -+ -+#undef CVAL -+ -+ REG_FLD_MOD(DISPC_VID_ATTRIBUTES(0), ct->full_range, 11, 11); -+ REG_FLD_MOD(DISPC_VID_ATTRIBUTES(1), ct->full_range, 11, 11); -+} -+ -+ -+static void _dispc_set_plane_ba0(enum omap_plane plane, u32 paddr) -+{ -+ const struct dispc_reg ba0_reg[] = { DISPC_GFX_BA0, -+ DISPC_VID_BA0(0), -+ DISPC_VID_BA0(1) }; -+ -+ dispc_write_reg(ba0_reg[plane], paddr); -+} -+ -+static void _dispc_set_plane_ba1(enum omap_plane plane, u32 paddr) -+{ -+ const struct dispc_reg ba1_reg[] = { DISPC_GFX_BA1, -+ DISPC_VID_BA1(0), -+ DISPC_VID_BA1(1) }; -+ -+ dispc_write_reg(ba1_reg[plane], paddr); -+} -+ -+static void _dispc_set_plane_pos(enum omap_plane plane, int x, int y) -+{ -+ const struct dispc_reg pos_reg[] = { DISPC_GFX_POSITION, -+ DISPC_VID_POSITION(0), -+ DISPC_VID_POSITION(1) }; -+ -+ u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0); -+ dispc_write_reg(pos_reg[plane], val); -+} -+ -+static void _dispc_set_pic_size(enum omap_plane plane, int width, int height) -+{ -+ const struct dispc_reg siz_reg[] = { DISPC_GFX_SIZE, -+ DISPC_VID_PICTURE_SIZE(0), -+ DISPC_VID_PICTURE_SIZE(1) }; -+ u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); -+ dispc_write_reg(siz_reg[plane], val); -+} -+ -+static void _dispc_set_vid_size(enum omap_plane plane, int width, int height) -+{ -+ u32 val; -+ const struct dispc_reg vsi_reg[] = { DISPC_VID_SIZE(0), -+ DISPC_VID_SIZE(1) }; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); -+ dispc_write_reg(vsi_reg[plane-1], val); -+} -+ -+static void _dispc_set_pix_inc(enum omap_plane plane, u16 inc) -+{ -+ const struct dispc_reg ri_reg[] = { DISPC_GFX_PIXEL_INC, -+ DISPC_VID_PIXEL_INC(0), -+ DISPC_VID_PIXEL_INC(1) }; -+ -+ dispc_write_reg(ri_reg[plane], inc); -+} -+ -+static void _dispc_set_row_inc(enum omap_plane plane, u16 inc) -+{ -+ const struct dispc_reg ri_reg[] = { DISPC_GFX_ROW_INC, -+ DISPC_VID_ROW_INC(0), -+ DISPC_VID_ROW_INC(1) }; -+ -+ dispc_write_reg(ri_reg[plane], inc); -+} -+ -+static void _dispc_set_color_mode(enum omap_plane plane, -+ enum omap_color_mode color_mode) -+{ -+ u32 m = 0; -+ -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_CLUT1: -+ m = 0x0; break; -+ case OMAP_DSS_COLOR_CLUT2: -+ m = 0x1; break; -+ case OMAP_DSS_COLOR_CLUT4: -+ m = 0x2; break; -+ case OMAP_DSS_COLOR_CLUT8: -+ m = 0x3; break; -+ case OMAP_DSS_COLOR_RGB12U: -+ m = 0x4; break; -+ case OMAP_DSS_COLOR_ARGB16: -+ m = 0x5; break; -+ case OMAP_DSS_COLOR_RGB16: -+ m = 0x6; break; -+ case OMAP_DSS_COLOR_RGB24U: -+ m = 0x8; break; -+ case OMAP_DSS_COLOR_RGB24P: -+ m = 0x9; break; -+ case OMAP_DSS_COLOR_YUV2: -+ m = 0xa; break; -+ case OMAP_DSS_COLOR_UYVY: -+ m = 0xb; break; -+ case OMAP_DSS_COLOR_ARGB32: -+ m = 0xc; break; -+ case OMAP_DSS_COLOR_RGBA32: -+ m = 0xd; break; -+ case OMAP_DSS_COLOR_RGBX32: -+ m = 0xe; break; -+ default: -+ BUG(); break; -+ } -+ -+ REG_FLD_MOD(dispc_reg_att[plane], m, 4, 1); -+} -+ -+static void _dispc_set_channel_out(enum omap_plane plane, -+ enum omap_channel channel) -+{ -+ int shift; -+ u32 val; -+ -+ switch (plane) { -+ case OMAP_DSS_GFX: -+ shift = 8; -+ break; -+ case OMAP_DSS_VIDEO1: -+ case OMAP_DSS_VIDEO2: -+ shift = 16; -+ break; -+ default: -+ BUG(); -+ return; -+ } -+ -+ val = dispc_read_reg(dispc_reg_att[plane]); -+ val = FLD_MOD(val, channel, shift, shift); -+ dispc_write_reg(dispc_reg_att[plane], val); -+} -+ -+void dispc_set_burst_size(enum omap_plane plane, -+ enum omap_burst_size burst_size) -+{ -+ int shift; -+ u32 val; -+ -+ enable_clocks(1); -+ -+ switch (plane) { -+ case OMAP_DSS_GFX: -+ shift = 6; -+ break; -+ case OMAP_DSS_VIDEO1: -+ case OMAP_DSS_VIDEO2: -+ shift = 14; -+ break; -+ default: -+ BUG(); -+ return; -+ } -+ -+ val = dispc_read_reg(dispc_reg_att[plane]); -+ val = FLD_MOD(val, burst_size, shift+1, shift); -+ dispc_write_reg(dispc_reg_att[plane], val); -+ -+ enable_clocks(0); -+} -+ -+static void _dispc_set_vid_color_conv(enum omap_plane plane, bool enable) -+{ -+ u32 val; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ val = dispc_read_reg(dispc_reg_att[plane]); -+ val = FLD_MOD(val, enable, 9, 9); -+ dispc_write_reg(dispc_reg_att[plane], val); -+} -+ -+void dispc_set_lcd_size(u16 width, u16 height) -+{ -+ u32 val; -+ BUG_ON((width > (1 << 11)) || (height > (1 << 11))); -+ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); -+ enable_clocks(1); -+ dispc_write_reg(DISPC_SIZE_LCD, val); -+ enable_clocks(0); -+} -+ -+void dispc_set_digit_size(u16 width, u16 height) -+{ -+ u32 val; -+ BUG_ON((width > (1 << 11)) || (height > (1 << 11))); -+ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); -+ enable_clocks(1); -+ dispc_write_reg(DISPC_SIZE_DIG, val); -+ enable_clocks(0); -+} -+ -+u32 dispc_get_plane_fifo_size(enum omap_plane plane) -+{ -+ const struct dispc_reg fsz_reg[] = { DISPC_GFX_FIFO_SIZE_STATUS, -+ DISPC_VID_FIFO_SIZE_STATUS(0), -+ DISPC_VID_FIFO_SIZE_STATUS(1) }; -+ u32 size; -+ -+ enable_clocks(1); -+ -+ if (cpu_is_omap24xx()) -+ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0); -+ else if (cpu_is_omap34xx()) -+ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0); -+ else -+ BUG(); -+ -+ if (cpu_is_omap34xx()) { -+ /* FIFOMERGE */ -+ if (REG_GET(DISPC_CONFIG, 14, 14)) -+ size *= 3; -+ } -+ -+ enable_clocks(0); -+ -+ return size; -+} -+ -+void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high) -+{ -+ const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD, -+ DISPC_VID_FIFO_THRESHOLD(0), -+ DISPC_VID_FIFO_THRESHOLD(1) }; -+ u32 size; -+ -+ enable_clocks(1); -+ -+ size = dispc_get_plane_fifo_size(plane); -+ -+ BUG_ON(low > size || high > size); -+ -+ DSSDBG("fifo(%d) size %d, low/high old %u/%u, new %u/%u\n", -+ plane, size, -+ REG_GET(ftrs_reg[plane], 11, 0), -+ REG_GET(ftrs_reg[plane], 27, 16), -+ low, high); -+ -+ if (cpu_is_omap24xx()) -+ dispc_write_reg(ftrs_reg[plane], -+ FLD_VAL(high, 24, 16) | FLD_VAL(low, 8, 0)); -+ else -+ dispc_write_reg(ftrs_reg[plane], -+ FLD_VAL(high, 27, 16) | FLD_VAL(low, 11, 0)); -+ -+ enable_clocks(0); -+} -+ -+void dispc_enable_fifomerge(bool enable) -+{ -+ enable_clocks(1); -+ -+ DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled"); -+ REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14); -+ -+ enable_clocks(0); -+} -+ -+static void _dispc_set_fir(enum omap_plane plane, int hinc, int vinc) -+{ -+ u32 val; -+ const struct dispc_reg fir_reg[] = { DISPC_VID_FIR(0), -+ DISPC_VID_FIR(1) }; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ val = FLD_VAL(vinc, 27, 16) | FLD_VAL(hinc, 11, 0); -+ dispc_write_reg(fir_reg[plane-1], val); -+} -+ -+static void _dispc_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu) -+{ -+ u32 val; -+ const struct dispc_reg ac0_reg[] = { DISPC_VID_ACCU0(0), -+ DISPC_VID_ACCU0(1) }; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); -+ dispc_write_reg(ac0_reg[plane-1], val); -+} -+ -+static void _dispc_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu) -+{ -+ u32 val; -+ const struct dispc_reg ac1_reg[] = { DISPC_VID_ACCU1(0), -+ DISPC_VID_ACCU1(1) }; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); -+ dispc_write_reg(ac1_reg[plane-1], val); -+} -+ -+ -+static void _dispc_set_scaling(enum omap_plane plane, -+ u16 orig_width, u16 orig_height, -+ u16 out_width, u16 out_height, -+ bool ilace) -+{ -+ int fir_hinc; -+ int fir_vinc; -+ int hscaleup, vscaleup, five_taps; -+ int fieldmode = 0; -+ int accu0 = 0; -+ int accu1 = 0; -+ u32 l; -+ -+ BUG_ON(plane == OMAP_DSS_GFX); -+ -+ hscaleup = orig_width <= out_width; -+ vscaleup = orig_height <= out_height; -+ five_taps = orig_height > out_height * 2; -+ -+ _dispc_set_scale_coef(plane, hscaleup, vscaleup, five_taps); -+ -+ if (!orig_width || orig_width == out_width) -+ fir_hinc = 0; -+ else -+ fir_hinc = 1024 * orig_width / out_width; -+ -+ if (!orig_height || orig_height == out_height) -+ fir_vinc = 0; -+ else -+ fir_vinc = 1024 * orig_height / out_height; -+ -+ _dispc_set_fir(plane, fir_hinc, fir_vinc); -+ -+ l = dispc_read_reg(dispc_reg_att[plane]); -+ l &= ~((0x0f << 5) | (0x3 << 21)); -+ -+ l |= fir_hinc ? (1 << 5) : 0; -+ l |= fir_vinc ? (1 << 6) : 0; -+ -+ l |= hscaleup ? 0 : (1 << 7); -+ l |= vscaleup ? 0 : (1 << 8); -+ -+ l |= five_taps ? (1 << 21) : 0; -+ l |= five_taps ? (1 << 22) : 0; -+ -+ dispc_write_reg(dispc_reg_att[plane], l); -+ -+ if (ilace) { -+ if (fieldmode) { -+ accu0 = fir_vinc / 2; -+ accu1 = 0; -+ } else { -+ accu0 = 0; -+ accu1 = fir_vinc / 2; -+ if (accu1 >= 1024/2) { -+ accu0 = 1024/2; -+ accu1 -= accu0; -+ } -+ } -+ } -+ -+ _dispc_set_vid_accu0(plane, 0, accu0); -+ _dispc_set_vid_accu1(plane, 0, accu1); -+} -+ -+static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation, -+ bool mirroring, enum omap_color_mode color_mode) -+{ -+ if (color_mode == OMAP_DSS_COLOR_YUV2 || -+ color_mode == OMAP_DSS_COLOR_UYVY) { -+ int vidrot = 0; -+ -+ if (mirroring) { -+ switch (rotation) { -+ case 0: vidrot = 2; break; -+ case 1: vidrot = 3; break; -+ case 2: vidrot = 0; break; -+ case 3: vidrot = 1; break; -+ } -+ } else { -+ switch (rotation) { -+ case 0: vidrot = 0; break; -+ case 1: vidrot = 1; break; -+ case 2: vidrot = 2; break; -+ case 3: vidrot = 1; break; -+ } -+ } -+ -+ REG_FLD_MOD(dispc_reg_att[plane], vidrot, 13, 12); -+ -+ if (rotation == 1 || rotation == 3) -+ REG_FLD_MOD(dispc_reg_att[plane], 0x1, 18, 18); -+ else -+ REG_FLD_MOD(dispc_reg_att[plane], 0x0, 18, 18); -+ } else { -+ REG_FLD_MOD(dispc_reg_att[plane], 0, 13, 12); -+ REG_FLD_MOD(dispc_reg_att[plane], 0, 18, 18); -+ } -+} -+ -+static int pixinc(int pixels, u8 ps) -+{ -+ if (pixels == 1) -+ return 1; -+ else if (pixels > 1) -+ return 1 + (pixels - 1) * ps; -+ else if (pixels < 0) -+ return 1 - (-pixels + 1) * ps; -+ else -+ BUG(); -+} -+ -+static void calc_rotation_offset(u8 rotation, bool mirror, -+ u16 screen_width, -+ u16 width, u16 height, -+ enum omap_color_mode color_mode, bool fieldmode, -+ unsigned *offset0, unsigned *offset1, -+ u16 *row_inc, u16 *pix_inc) -+{ -+ u8 ps; -+ u16 fbw, fbh; -+ -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_ARGB16: -+ ps = 2; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24P: -+ ps = 3; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_ARGB32: -+ case OMAP_DSS_COLOR_RGBA32: -+ case OMAP_DSS_COLOR_RGBX32: -+ ps = 4; -+ break; -+ -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ ps = 2; -+ break; -+ default: -+ BUG(); -+ return; -+ } -+ -+ DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, -+ width, height); -+ -+ /* width & height are overlay sizes, convert to fb sizes */ -+ -+ if (rotation == 0 || rotation == 2) { -+ fbw = width; -+ fbh = height; -+ } else { -+ fbw = height; -+ fbh = width; -+ } -+ -+ switch (rotation + mirror * 4) { -+ case 0: -+ *offset0 = 0; -+ if (fieldmode) -+ *offset1 = screen_width * ps; -+ else -+ *offset1 = 0; -+ *row_inc = pixinc(1 + (screen_width - fbw) + -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(1, ps); -+ break; -+ case 1: -+ *offset0 = screen_width * (fbh - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 + ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(screen_width * (fbh - 1) + 1 + -+ (fieldmode ? 1 : 0), ps); -+ *pix_inc = pixinc(-screen_width, ps); -+ break; -+ case 2: -+ *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 - screen_width * ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(-1 - -+ (screen_width - fbw) - -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(-1, ps); -+ break; -+ case 3: -+ *offset0 = (fbw - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 - ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(-screen_width * (fbh - 1) - 1 - -+ (fieldmode ? 1 : 0), ps); -+ *pix_inc = pixinc(screen_width, ps); -+ break; -+ -+ /* mirroring */ -+ case 0 + 4: -+ *offset0 = (fbw - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 + screen_width * ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(screen_width * 2 - 1 + -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(-1, ps); -+ break; -+ -+ case 1 + 4: -+ *offset0 = 0; -+ if (fieldmode) -+ *offset1 = *offset0 + screen_width * ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(-screen_width * (fbh - 1) + 1 + -+ (fieldmode ? 1 : 0), -+ ps); -+ *pix_inc = pixinc(screen_width, ps); -+ break; -+ -+ case 2 + 4: -+ *offset0 = screen_width * (fbh - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 + screen_width * ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(1 - screen_width * 2 - -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(1, ps); -+ break; -+ -+ case 3 + 4: -+ *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; -+ if (fieldmode) -+ *offset1 = *offset0 + screen_width * ps; -+ else -+ *offset1 = *offset0; -+ *row_inc = pixinc(screen_width * (fbh - 1) - 1 - -+ (fieldmode ? 1 : 0), -+ ps); -+ *pix_inc = pixinc(-screen_width, ps); -+ break; -+ -+ default: -+ BUG(); -+ } -+} -+ -+static int _dispc_setup_plane(enum omap_plane plane, -+ enum omap_channel channel_out, -+ u32 paddr, u16 screen_width, -+ u16 pos_x, u16 pos_y, -+ u16 width, u16 height, -+ u16 out_width, u16 out_height, -+ enum omap_color_mode color_mode, -+ bool ilace, -+ u8 rotation, int mirror) -+{ -+ const int maxdownscale = cpu_is_omap34xx() ? 4 : 2; -+ bool five_taps = height > out_height * 2; -+ bool fieldmode = 0; -+ int cconv; -+ unsigned offset0, offset1; -+ u16 row_inc; -+ u16 pix_inc; -+ -+ if (plane == OMAP_DSS_GFX) { -+ if (width != out_width || height != out_height) -+ return -EINVAL; -+ } else { -+ /* video plane */ -+ if (width > (2048 >> five_taps)) -+ return -EINVAL; -+ -+ if (out_width < width / maxdownscale || -+ out_width > width * 8) -+ return -EINVAL; -+ -+ if (out_height < height / maxdownscale || -+ out_height > height * 8) -+ return -EINVAL; -+ -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ } -+ -+ -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_ARGB16: -+ case OMAP_DSS_COLOR_RGB24P: -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_ARGB32: -+ case OMAP_DSS_COLOR_RGBA32: -+ case OMAP_DSS_COLOR_RGBX32: -+ cconv = 0; -+ break; -+ -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ BUG_ON(plane == OMAP_DSS_GFX); -+ cconv = 1; -+ break; -+ -+ default: -+ BUG(); -+ return 1; -+ } -+ -+ if (ilace && height >= out_height) -+ fieldmode = 1; -+ -+ calc_rotation_offset(rotation, mirror, -+ screen_width, width, height, color_mode, -+ fieldmode, -+ &offset0, &offset1, &row_inc, &pix_inc); -+ -+ DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", -+ offset0, offset1, row_inc, pix_inc); -+ -+ if (ilace) { -+ if (fieldmode) -+ height /= 2; -+ pos_y /= 2; -+ out_height /= 2; -+ -+ DSSDBG("adjusting for ilace: height %d, pos_y %d, " -+ "out_height %d\n", -+ height, pos_y, out_height); -+ } -+ -+ _dispc_set_channel_out(plane, channel_out); -+ _dispc_set_color_mode(plane, color_mode); -+ -+ _dispc_set_plane_ba0(plane, paddr + offset0); -+ _dispc_set_plane_ba1(plane, paddr + offset1); -+ -+ _dispc_set_row_inc(plane, row_inc); -+ _dispc_set_pix_inc(plane, pix_inc); -+ -+ DSSDBG("%d,%d %dx%d -> %dx%d\n", pos_x, pos_y, width, height, -+ out_width, out_height); -+ -+ _dispc_set_plane_pos(plane, pos_x, pos_y); -+ -+ _dispc_set_pic_size(plane, width, height); -+ -+ if (plane != OMAP_DSS_GFX) { -+ _dispc_set_scaling(plane, width, height, -+ out_width, out_height, -+ ilace); -+ _dispc_set_vid_size(plane, out_width, out_height); -+ _dispc_set_vid_color_conv(plane, cconv); -+ } -+ -+ _dispc_set_rotation_attrs(plane, rotation, mirror, color_mode); -+ -+ return 0; -+} -+ -+static void _dispc_enable_plane(enum omap_plane plane, bool enable) -+{ -+ REG_FLD_MOD(dispc_reg_att[plane], enable ? 1 : 0, 0, 0); -+} -+ -+static void dispc_disable_isr(void *data, u32 mask) -+{ -+ struct completion *compl = data; -+ complete(compl); -+} -+ -+static void _enable_lcd_out(bool enable) -+{ -+ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0); -+} -+ -+void dispc_enable_lcd_out(bool enable) -+{ -+ struct completion frame_done_completion; -+ bool is_on; -+ int r; -+ -+ enable_clocks(1); -+ -+ /* When we disable LCD output, we need to wait until frame is done. -+ * Otherwise the DSS is still working, and turning off the clocks -+ * prevents DSS from going to OFF mode */ -+ is_on = REG_GET(DISPC_CONTROL, 0, 0); -+ -+ if (!enable && is_on) { -+ init_completion(&frame_done_completion); -+ -+ r = omap_dispc_register_isr(dispc_disable_isr, -+ &frame_done_completion, -+ DISPC_IRQ_FRAMEDONE); -+ -+ if (r) -+ DSSERR("failed to register FRAMEDONE isr\n"); -+ } -+ -+ _enable_lcd_out(enable); -+ -+ if (!enable && is_on) { -+ if (!wait_for_completion_timeout(&frame_done_completion, -+ msecs_to_jiffies(100))) -+ DSSERR("timeout waiting for FRAME DONE\n"); -+ -+ r = omap_dispc_unregister_isr(dispc_disable_isr, -+ &frame_done_completion, -+ DISPC_IRQ_FRAMEDONE); -+ -+ if (r) -+ DSSERR("failed to unregister FRAMEDONE isr\n"); -+ } -+ -+ enable_clocks(0); -+} -+ -+static void _enable_digit_out(bool enable) -+{ -+ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1); -+} -+ -+void dispc_enable_digit_out(bool enable) -+{ -+ struct completion frame_done_completion; -+ int r; -+ -+ enable_clocks(1); -+ -+ if (REG_GET(DISPC_CONTROL, 1, 1) == enable) { -+ enable_clocks(0); -+ return; -+ } -+ -+ if (enable) { -+ /* When we enable digit output, we'll get an extra digit -+ * sync lost interrupt, that we need to ignore */ -+ dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT; -+ omap_dispc_set_irqs(); -+ } -+ -+ /* When we disable digit output, we need to wait until fields are done. -+ * Otherwise the DSS is still working, and turning off the clocks -+ * prevents DSS from going to OFF mode. And when enabling, we need to -+ * wait for the extra sync losts */ -+ init_completion(&frame_done_completion); -+ -+ r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion, -+ DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD); -+ if (r) -+ DSSERR("failed to register EVSYNC isr\n"); -+ -+ _enable_digit_out(enable); -+ -+ /* XXX I understand from TRM that we should only wait for the -+ * current field to complete. But it seems we have to wait -+ * for both fields */ -+ if (!wait_for_completion_timeout(&frame_done_completion, -+ msecs_to_jiffies(100))) -+ DSSERR("timeout waiting for EVSYNC\n"); -+ -+ if (!wait_for_completion_timeout(&frame_done_completion, -+ msecs_to_jiffies(100))) -+ DSSERR("timeout waiting for EVSYNC\n"); -+ -+ r = omap_dispc_unregister_isr(dispc_disable_isr, -+ &frame_done_completion, -+ DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD); -+ if (r) -+ DSSERR("failed to unregister EVSYNC isr\n"); -+ -+ if (enable) { -+ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; -+ dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); -+ omap_dispc_set_irqs(); -+ } -+ -+ enable_clocks(0); -+} -+ -+void dispc_lcd_enable_signal_polarity(bool act_high) -+{ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29); -+ enable_clocks(0); -+} -+ -+void dispc_lcd_enable_signal(bool enable) -+{ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28); -+ enable_clocks(0); -+} -+ -+void dispc_pck_free_enable(bool enable) -+{ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27); -+ enable_clocks(0); -+} -+ -+void dispc_enable_fifohandcheck(bool enable) -+{ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16); -+ enable_clocks(0); -+} -+ -+ -+void dispc_set_lcd_display_type(enum omap_lcd_display_type type) -+{ -+ int mode; -+ -+ switch (type) { -+ case OMAP_DSS_LCD_DISPLAY_STN: -+ mode = 0; -+ break; -+ -+ case OMAP_DSS_LCD_DISPLAY_TFT: -+ mode = 1; -+ break; -+ -+ default: -+ BUG(); -+ return; -+ } -+ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3); -+ enable_clocks(0); -+} -+ -+void dispc_set_loadmode(enum omap_dss_load_mode mode) -+{ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1); -+ enable_clocks(0); -+} -+ -+ -+void dispc_set_default_color(enum omap_channel channel, u32 color) -+{ -+ const struct dispc_reg def_reg[] = { DISPC_DEFAULT_COLOR0, -+ DISPC_DEFAULT_COLOR1 }; -+ -+ enable_clocks(1); -+ dispc_write_reg(def_reg[channel], color); -+ enable_clocks(0); -+} -+ -+void dispc_set_trans_key(enum omap_channel ch, -+ enum omap_dss_color_key_type type, -+ u32 trans_key) -+{ -+ const struct dispc_reg tr_reg[] = { -+ DISPC_TRANS_COLOR0, DISPC_TRANS_COLOR1 }; -+ -+ enable_clocks(1); -+ if (ch == OMAP_DSS_CHANNEL_LCD) -+ REG_FLD_MOD(DISPC_CONFIG, type, 11, 11); -+ else /* OMAP_DSS_CHANNEL_DIGIT */ -+ REG_FLD_MOD(DISPC_CONFIG, type, 13, 13); -+ -+ dispc_write_reg(tr_reg[ch], trans_key); -+ enable_clocks(0); -+} -+ -+void dispc_enable_trans_key(enum omap_channel ch, bool enable) -+{ -+ enable_clocks(1); -+ if (ch == OMAP_DSS_CHANNEL_LCD) -+ REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10); -+ else /* OMAP_DSS_CHANNEL_DIGIT */ -+ REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12); -+ enable_clocks(0); -+} -+ -+void dispc_set_tft_data_lines(u8 data_lines) -+{ -+ int code; -+ -+ switch (data_lines) { -+ case 12: -+ code = 0; -+ break; -+ case 16: -+ code = 1; -+ break; -+ case 18: -+ code = 2; -+ break; -+ case 24: -+ code = 3; -+ break; -+ default: -+ BUG(); -+ return; -+ } -+ -+ enable_clocks(1); -+ REG_FLD_MOD(DISPC_CONTROL, code, 9, 8); -+ enable_clocks(0); -+} -+ -+void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode) -+{ -+ u32 l; -+ int stallmode; -+ int gpout0 = 1; -+ int gpout1; -+ -+ switch (mode) { -+ case OMAP_DSS_PARALLELMODE_BYPASS: -+ stallmode = 0; -+ gpout1 = 1; -+ break; -+ -+ case OMAP_DSS_PARALLELMODE_RFBI: -+ stallmode = 1; -+ gpout1 = 0; -+ break; -+ -+ case OMAP_DSS_PARALLELMODE_DSI: -+ stallmode = 1; -+ gpout1 = 1; -+ break; -+ -+ default: -+ BUG(); -+ return; -+ } -+ -+ enable_clocks(1); -+ -+ l = dispc_read_reg(DISPC_CONTROL); -+ -+ l = FLD_MOD(l, stallmode, 11, 11); -+ l = FLD_MOD(l, gpout0, 15, 15); -+ l = FLD_MOD(l, gpout1, 16, 16); -+ -+ dispc_write_reg(DISPC_CONTROL, l); -+ -+ enable_clocks(0); -+} -+ -+static void _dispc_set_lcd_timings(int hsw, int hfp, int hbp, -+ int vsw, int vfp, int vbp) -+{ -+ u32 timing_h, timing_v; -+ -+ BUG_ON(hsw < 1 || hsw > 64); -+ BUG_ON(hfp < 1 || hfp > 256); -+ BUG_ON(hbp < 1 || hbp > 256); -+ -+ BUG_ON(vsw < 1 || vsw > 64); -+ BUG_ON(vfp < 0 || vfp > 255); -+ BUG_ON(vbp < 0 || vbp > 255); -+ -+ timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) | -+ FLD_VAL(hbp-1, 27, 20); -+ -+ timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) | -+ FLD_VAL(vbp, 27, 20); -+ -+ enable_clocks(1); -+ dispc_write_reg(DISPC_TIMING_H, timing_h); -+ dispc_write_reg(DISPC_TIMING_V, timing_v); -+ enable_clocks(0); -+} -+ -+/* change name to mode? */ -+void dispc_set_lcd_timings(struct omap_video_timings *timings) -+{ -+ unsigned xtot, ytot; -+ unsigned long ht, vt; -+ -+ _dispc_set_lcd_timings(timings->hsw, timings->hfp, timings->hbp, -+ timings->vsw, timings->vfp, timings->vbp); -+ -+ dispc_set_lcd_size(timings->x_res, timings->y_res); -+ -+ xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp; -+ ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp; -+ -+ ht = (timings->pixel_clock * 1000) / xtot; -+ vt = (timings->pixel_clock * 1000) / xtot / ytot; -+ -+ DSSDBG("xres %u yres %u\n", timings->x_res, timings->y_res); -+ DSSDBG("pck %u\n", timings->pixel_clock); -+ DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", -+ timings->hsw, timings->hfp, timings->hbp, -+ timings->vsw, timings->vfp, timings->vbp); -+ -+ DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt); -+} -+ -+void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div) -+{ -+ BUG_ON(lck_div < 1); -+ BUG_ON(pck_div < 2); -+ -+ enable_clocks(1); -+ dispc_write_reg(DISPC_DIVISOR, -+ FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0)); -+ enable_clocks(0); -+} -+ -+static void dispc_get_lcd_divisor(int *lck_div, int *pck_div) -+{ -+ u32 l; -+ l = dispc_read_reg(DISPC_DIVISOR); -+ *lck_div = FLD_GET(l, 23, 16); -+ *pck_div = FLD_GET(l, 7, 0); -+} -+ -+unsigned long dispc_fclk_rate(void) -+{ -+ unsigned long r = 0; -+ -+ if (dss_get_dispc_clk_source() == 0) -+ r = dss_clk_get_rate(DSS_CLK_FCK1); -+ else -+#ifdef CONFIG_OMAP2_DSS_DSI -+ r = dsi_get_dsi1_pll_rate(); -+#else -+ BUG(); -+#endif -+ return r; -+} -+ -+unsigned long dispc_pclk_rate(void) -+{ -+ int lcd, pcd; -+ unsigned long r; -+ u32 l; -+ -+ l = dispc_read_reg(DISPC_DIVISOR); -+ -+ lcd = FLD_GET(l, 23, 16); -+ pcd = FLD_GET(l, 7, 0); -+ -+ r = dispc_fclk_rate(); -+ -+ return r / lcd / pcd; -+} -+ -+void dispc_dump_clocks(struct seq_file *s) -+{ -+ int lcd, pcd; -+ -+ enable_clocks(1); -+ -+ dispc_get_lcd_divisor(&lcd, &pcd); -+ -+ seq_printf(s, "- dispc -\n"); -+ -+ seq_printf(s, "dispc fclk source = %s\n", -+ dss_get_dispc_clk_source() == 0 ? -+ "dss1_alwon_fclk" : "dsi1_pll_fclk"); -+ -+ seq_printf(s, "pixel clk = %lu / %d / %d = %lu\n", -+ dispc_fclk_rate(), -+ lcd, pcd, -+ dispc_pclk_rate()); -+ -+ enable_clocks(0); -+} -+ -+void dispc_dump_regs(struct seq_file *s) -+{ -+#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dispc_read_reg(r)) -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ DUMPREG(DISPC_REVISION); -+ DUMPREG(DISPC_SYSCONFIG); -+ DUMPREG(DISPC_SYSSTATUS); -+ DUMPREG(DISPC_IRQSTATUS); -+ DUMPREG(DISPC_IRQENABLE); -+ DUMPREG(DISPC_CONTROL); -+ DUMPREG(DISPC_CONFIG); -+ DUMPREG(DISPC_CAPABLE); -+ DUMPREG(DISPC_DEFAULT_COLOR0); -+ DUMPREG(DISPC_DEFAULT_COLOR1); -+ DUMPREG(DISPC_TRANS_COLOR0); -+ DUMPREG(DISPC_TRANS_COLOR1); -+ DUMPREG(DISPC_LINE_STATUS); -+ DUMPREG(DISPC_LINE_NUMBER); -+ DUMPREG(DISPC_TIMING_H); -+ DUMPREG(DISPC_TIMING_V); -+ DUMPREG(DISPC_POL_FREQ); -+ DUMPREG(DISPC_DIVISOR); -+ DUMPREG(DISPC_GLOBAL_ALPHA); -+ DUMPREG(DISPC_SIZE_DIG); -+ DUMPREG(DISPC_SIZE_LCD); -+ -+ DUMPREG(DISPC_GFX_BA0); -+ DUMPREG(DISPC_GFX_BA1); -+ DUMPREG(DISPC_GFX_POSITION); -+ DUMPREG(DISPC_GFX_SIZE); -+ DUMPREG(DISPC_GFX_ATTRIBUTES); -+ DUMPREG(DISPC_GFX_FIFO_THRESHOLD); -+ DUMPREG(DISPC_GFX_FIFO_SIZE_STATUS); -+ DUMPREG(DISPC_GFX_ROW_INC); -+ DUMPREG(DISPC_GFX_PIXEL_INC); -+ DUMPREG(DISPC_GFX_WINDOW_SKIP); -+ DUMPREG(DISPC_GFX_TABLE_BA); -+ -+ DUMPREG(DISPC_DATA_CYCLE1); -+ DUMPREG(DISPC_DATA_CYCLE2); -+ DUMPREG(DISPC_DATA_CYCLE3); -+ -+ DUMPREG(DISPC_CPR_COEF_R); -+ DUMPREG(DISPC_CPR_COEF_G); -+ DUMPREG(DISPC_CPR_COEF_B); -+ -+ DUMPREG(DISPC_GFX_PRELOAD); -+ -+ DUMPREG(DISPC_VID_BA0(0)); -+ DUMPREG(DISPC_VID_BA1(0)); -+ DUMPREG(DISPC_VID_POSITION(0)); -+ DUMPREG(DISPC_VID_SIZE(0)); -+ DUMPREG(DISPC_VID_ATTRIBUTES(0)); -+ DUMPREG(DISPC_VID_FIFO_THRESHOLD(0)); -+ DUMPREG(DISPC_VID_FIFO_SIZE_STATUS(0)); -+ DUMPREG(DISPC_VID_ROW_INC(0)); -+ DUMPREG(DISPC_VID_PIXEL_INC(0)); -+ DUMPREG(DISPC_VID_FIR(0)); -+ DUMPREG(DISPC_VID_PICTURE_SIZE(0)); -+ DUMPREG(DISPC_VID_ACCU0(0)); -+ DUMPREG(DISPC_VID_ACCU1(0)); -+ -+ DUMPREG(DISPC_VID_BA0(1)); -+ DUMPREG(DISPC_VID_BA1(1)); -+ DUMPREG(DISPC_VID_POSITION(1)); -+ DUMPREG(DISPC_VID_SIZE(1)); -+ DUMPREG(DISPC_VID_ATTRIBUTES(1)); -+ DUMPREG(DISPC_VID_FIFO_THRESHOLD(1)); -+ DUMPREG(DISPC_VID_FIFO_SIZE_STATUS(1)); -+ DUMPREG(DISPC_VID_ROW_INC(1)); -+ DUMPREG(DISPC_VID_PIXEL_INC(1)); -+ DUMPREG(DISPC_VID_FIR(1)); -+ DUMPREG(DISPC_VID_PICTURE_SIZE(1)); -+ DUMPREG(DISPC_VID_ACCU0(1)); -+ DUMPREG(DISPC_VID_ACCU1(1)); -+ -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(0, 7)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 7)); -+ DUMPREG(DISPC_VID_CONV_COEF(0, 0)); -+ DUMPREG(DISPC_VID_CONV_COEF(0, 1)); -+ DUMPREG(DISPC_VID_CONV_COEF(0, 2)); -+ DUMPREG(DISPC_VID_CONV_COEF(0, 3)); -+ DUMPREG(DISPC_VID_CONV_COEF(0, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(0, 7)); -+ -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_H(1, 7)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 7)); -+ DUMPREG(DISPC_VID_CONV_COEF(1, 0)); -+ DUMPREG(DISPC_VID_CONV_COEF(1, 1)); -+ DUMPREG(DISPC_VID_CONV_COEF(1, 2)); -+ DUMPREG(DISPC_VID_CONV_COEF(1, 3)); -+ DUMPREG(DISPC_VID_CONV_COEF(1, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 0)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 1)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 2)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 3)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 4)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 5)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 6)); -+ DUMPREG(DISPC_VID_FIR_COEF_V(1, 7)); -+ -+ DUMPREG(DISPC_VID_PRELOAD(0)); -+ DUMPREG(DISPC_VID_PRELOAD(1)); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+#undef DUMPREG -+} -+ -+static void _dispc_set_pol_freq(bool onoff, bool rf, bool ieo, bool ipc, -+ bool ihs, bool ivs, u8 acbi, u8 acb) -+{ -+ u32 l = 0; -+ -+ DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n", -+ onoff, rf, ieo, ipc, ihs, ivs, acbi, acb); -+ -+ l |= FLD_VAL(onoff, 17, 17); -+ l |= FLD_VAL(rf, 16, 16); -+ l |= FLD_VAL(ieo, 15, 15); -+ l |= FLD_VAL(ipc, 14, 14); -+ l |= FLD_VAL(ihs, 13, 13); -+ l |= FLD_VAL(ivs, 12, 12); -+ l |= FLD_VAL(acbi, 11, 8); -+ l |= FLD_VAL(acb, 7, 0); -+ -+ enable_clocks(1); -+ dispc_write_reg(DISPC_POL_FREQ, l); -+ enable_clocks(0); -+} -+ -+void dispc_set_pol_freq(struct omap_panel *panel) -+{ -+ _dispc_set_pol_freq((panel->config & OMAP_DSS_LCD_ONOFF) != 0, -+ (panel->config & OMAP_DSS_LCD_RF) != 0, -+ (panel->config & OMAP_DSS_LCD_IEO) != 0, -+ (panel->config & OMAP_DSS_LCD_IPC) != 0, -+ (panel->config & OMAP_DSS_LCD_IHS) != 0, -+ (panel->config & OMAP_DSS_LCD_IVS) != 0, -+ panel->acbi, panel->acb); -+} -+ -+void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck, -+ u16 *lck_div, u16 *pck_div) -+{ -+ u16 pcd_min = is_tft ? 2 : 3; -+ unsigned long best_pck; -+ u16 best_ld, cur_ld; -+ u16 best_pd, cur_pd; -+ -+ best_pck = 0; -+ best_ld = 0; -+ best_pd = 0; -+ -+ for (cur_ld = 1; cur_ld <= 255; ++cur_ld) { -+ unsigned long lck = fck / cur_ld; -+ -+ for (cur_pd = pcd_min; cur_pd <= 255; ++cur_pd) { -+ unsigned long pck = lck / cur_pd; -+ long old_delta = abs(best_pck - req_pck); -+ long new_delta = abs(pck - req_pck); -+ -+ if (best_pck == 0 || new_delta < old_delta) { -+ best_pck = pck; -+ best_ld = cur_ld; -+ best_pd = cur_pd; -+ -+ if (pck == req_pck) -+ goto found; -+ } -+ -+ if (pck < req_pck) -+ break; -+ } -+ -+ if (lck / pcd_min < req_pck) -+ break; -+ } -+ -+found: -+ *lck_div = best_ld; -+ *pck_div = best_pd; -+} -+ -+int dispc_calc_clock_div(bool is_tft, unsigned long req_pck, -+ struct dispc_clock_info *cinfo) -+{ -+ unsigned long prate; -+ struct dispc_clock_info cur, best; -+ int match = 0; -+ int min_fck_per_pck; -+ unsigned long fck_rate = dss_clk_get_rate(DSS_CLK_FCK1); -+ -+ if (cpu_is_omap34xx()) -+ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); -+ else -+ prate = 0; -+ -+ if (req_pck == dispc.cache_req_pck && -+ ((cpu_is_omap34xx() && prate == dispc.cache_prate) || -+ dispc.cache_cinfo.fck == fck_rate)) { -+ DSSDBG("dispc clock info found from cache.\n"); -+ *cinfo = dispc.cache_cinfo; -+ return 0; -+ } -+ -+ min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; -+ -+ if (min_fck_per_pck && -+ req_pck * min_fck_per_pck > DISPC_MAX_FCK) { -+ DSSERR("Requested pixel clock not possible with the current " -+ "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " -+ "the constraint off.\n"); -+ min_fck_per_pck = 0; -+ } -+ -+retry: -+ memset(&cur, 0, sizeof(cur)); -+ memset(&best, 0, sizeof(best)); -+ -+ if (cpu_is_omap24xx()) { -+ /* XXX can we change the clock on omap2? */ -+ cur.fck = dss_clk_get_rate(DSS_CLK_FCK1); -+ cur.fck_div = 1; -+ -+ match = 1; -+ -+ find_lck_pck_divs(is_tft, req_pck, cur.fck, -+ &cur.lck_div, &cur.pck_div); -+ -+ cur.lck = cur.fck / cur.lck_div; -+ cur.pck = cur.lck / cur.pck_div; -+ -+ best = cur; -+ -+ goto found; -+ } else if (cpu_is_omap34xx()) { -+ for (cur.fck_div = 16; cur.fck_div > 0; --cur.fck_div) { -+ cur.fck = prate / cur.fck_div * 2; -+ -+ if (cur.fck > DISPC_MAX_FCK) -+ continue; -+ -+ if (min_fck_per_pck && -+ cur.fck < req_pck * min_fck_per_pck) -+ continue; -+ -+ match = 1; -+ -+ find_lck_pck_divs(is_tft, req_pck, cur.fck, -+ &cur.lck_div, &cur.pck_div); -+ -+ cur.lck = cur.fck / cur.lck_div; -+ cur.pck = cur.lck / cur.pck_div; -+ -+ if (abs(cur.pck - req_pck) < abs(best.pck - req_pck)) { -+ best = cur; -+ -+ if (cur.pck == req_pck) -+ goto found; -+ } -+ } -+ } else { -+ BUG(); -+ } -+ -+found: -+ if (!match) { -+ if (min_fck_per_pck) { -+ DSSERR("Could not find suitable clock settings.\n" -+ "Turning FCK/PCK constraint off and" -+ "trying again.\n"); -+ min_fck_per_pck = 0; -+ goto retry; -+ } -+ -+ DSSERR("Could not find suitable clock settings.\n"); -+ -+ return -EINVAL; -+ } -+ -+ if (cinfo) -+ *cinfo = best; -+ -+ dispc.cache_req_pck = req_pck; -+ dispc.cache_prate = prate; -+ dispc.cache_cinfo = best; -+ -+ return 0; -+} -+ -+int dispc_set_clock_div(struct dispc_clock_info *cinfo) -+{ -+ unsigned long prate; -+ int r; -+ -+ if (cpu_is_omap34xx()) { -+ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); -+ DSSDBG("dpll4_m4 = %ld\n", prate); -+ } -+ -+ DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div); -+ DSSDBG("lck = %ld (%d)\n", cinfo->lck, cinfo->lck_div); -+ DSSDBG("pck = %ld (%d)\n", cinfo->pck, cinfo->pck_div); -+ -+ if (cpu_is_omap34xx()) { -+ r = clk_set_rate(dispc.dpll4_m4_ck, prate / cinfo->fck_div); -+ if (r) -+ return r; -+ } -+ -+ dispc_set_lcd_divisor(cinfo->lck_div, cinfo->pck_div); -+ -+ return 0; -+} -+ -+int dispc_get_clock_div(struct dispc_clock_info *cinfo) -+{ -+ cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK1); -+ -+ if (cpu_is_omap34xx()) { -+ unsigned long prate; -+ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); -+ cinfo->fck_div = prate / (cinfo->fck / 2); -+ } else { -+ cinfo->fck_div = 0; -+ } -+ -+ cinfo->lck_div = REG_GET(DISPC_DIVISOR, 23, 16); -+ cinfo->pck_div = REG_GET(DISPC_DIVISOR, 7, 0); -+ -+ cinfo->lck = cinfo->fck / cinfo->lck_div; -+ cinfo->pck = cinfo->lck / cinfo->pck_div; -+ -+ return 0; -+} -+ -+static void omap_dispc_set_irqs(void) -+{ -+ unsigned long flags; -+ u32 mask = dispc.irq_error_mask | DISPC_IRQ_WAKEUP; -+ int i; -+ struct omap_dispc_isr_data *isr_data; -+ -+ spin_lock_irqsave(&dispc.irq_lock, flags); -+ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ isr_data = &dispc.registered_isr[i]; -+ -+ if (isr_data->isr == NULL) -+ continue; -+ -+ mask |= isr_data->mask; -+ } -+ -+ enable_clocks(1); -+ dispc_write_reg(DISPC_IRQENABLE, mask); -+ enable_clocks(0); -+ -+ spin_unlock_irqrestore(&dispc.irq_lock, flags); -+} -+ -+int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask) -+{ -+ int i; -+ int ret; -+ unsigned long flags; -+ struct omap_dispc_isr_data *isr_data; -+ -+ if (isr == NULL) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&dispc.irq_lock, flags); -+ -+ /* check for duplicate entry */ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ isr_data = &dispc.registered_isr[i]; -+ if (isr_data->isr == isr && isr_data->arg == arg && -+ isr_data->mask == mask) { -+ ret = -EINVAL; -+ goto err; -+ } -+ } -+ -+ isr_data = NULL; -+ ret = -EBUSY; -+ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ isr_data = &dispc.registered_isr[i]; -+ -+ if (isr_data->isr != NULL) -+ continue; -+ -+ isr_data->isr = isr; -+ isr_data->arg = arg; -+ isr_data->mask = mask; -+ ret = 0; -+ -+ break; -+ } -+err: -+ spin_unlock_irqrestore(&dispc.irq_lock, flags); -+ -+ if (ret == 0) -+ omap_dispc_set_irqs(); -+ -+ return ret; -+} -+EXPORT_SYMBOL(omap_dispc_register_isr); -+ -+int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask) -+{ -+ int i; -+ unsigned long flags; -+ int ret = -EINVAL; -+ struct omap_dispc_isr_data *isr_data; -+ -+ spin_lock_irqsave(&dispc.irq_lock, flags); -+ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ isr_data = &dispc.registered_isr[i]; -+ if (isr_data->isr != isr || isr_data->arg != arg || -+ isr_data->mask != mask) -+ continue; -+ -+ /* found the correct isr */ -+ -+ isr_data->isr = NULL; -+ isr_data->arg = NULL; -+ isr_data->mask = 0; -+ -+ ret = 0; -+ break; -+ } -+ -+ spin_unlock_irqrestore(&dispc.irq_lock, flags); -+ -+ if (ret == 0) -+ omap_dispc_set_irqs(); -+ -+ return ret; -+} -+EXPORT_SYMBOL(omap_dispc_unregister_isr); -+ -+#ifdef DEBUG -+static void print_irq_status(u32 status) -+{ -+ if ((status & dispc.irq_error_mask) == 0) -+ return; -+ -+ printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status); -+ -+#define PIS(x) \ -+ if (status & DISPC_IRQ_##x) \ -+ printk(#x " "); -+ PIS(GFX_FIFO_UNDERFLOW); -+ PIS(OCP_ERR); -+ PIS(VID1_FIFO_UNDERFLOW); -+ PIS(VID2_FIFO_UNDERFLOW); -+ PIS(SYNC_LOST); -+ PIS(SYNC_LOST_DIGIT); -+#undef PIS -+ -+ printk("\n"); -+} -+#endif -+ -+/* Called from dss.c. Note that we don't touch clocks here, -+ * but we presume they are on because we got an IRQ. However, -+ * an irq handler may turn the clocks off, so we may not have -+ * clock later in the function. */ -+void dispc_irq_handler(void) -+{ -+ int i; -+ u32 irqstatus = dispc_read_reg(DISPC_IRQSTATUS); -+ static int errors; -+ u32 handledirqs = 0; -+ struct omap_dispc_isr_data *isr_data; -+ -+#ifdef DEBUG -+ if (dss_debug) -+ print_irq_status(irqstatus); -+#endif -+ /* Ack the interrupt. Do it here before clocks are possibly turned -+ * off */ -+ dispc_write_reg(DISPC_IRQSTATUS, irqstatus); -+ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ isr_data = &dispc.registered_isr[i]; -+ -+ if (!isr_data->isr) -+ continue; -+ -+ if (isr_data->mask & irqstatus) { -+ isr_data->isr(isr_data->arg, irqstatus); -+ handledirqs |= isr_data->mask; -+ } -+ } -+ -+ if (irqstatus & ~handledirqs & dispc.irq_error_mask) { -+ if (printk_ratelimit()) { -+ DSSERR("dispc irq error status %04x\n", -+ irqstatus); -+ } -+ if (errors++ > 100) { -+ DSSERR("Excessive DISPC errors\n" -+ "Turning off lcd and digit\n"); -+ _enable_lcd_out(0); -+ _enable_digit_out(0); -+ } -+ } -+ -+} -+ -+int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout) -+{ -+ void dispc_irq_wait_handler(void *data, u32 mask) -+ { -+ complete((struct completion *)data); -+ } -+ -+ int r; -+ DECLARE_COMPLETION_ONSTACK(completion); -+ -+ r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, -+ irqmask); -+ -+ if (r) -+ return r; -+ -+ timeout = wait_for_completion_timeout(&completion, timeout); -+ -+ omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); -+ -+ if (timeout == 0) -+ return -ETIMEDOUT; -+ -+ if (timeout == -ERESTARTSYS) -+ return -ERESTARTSYS; -+ -+ return 0; -+} -+ -+int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, -+ unsigned long timeout) -+{ -+ void dispc_irq_wait_handler(void *data, u32 mask) -+ { -+ complete((struct completion *)data); -+ } -+ -+ int r; -+ DECLARE_COMPLETION_ONSTACK(completion); -+ -+ r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, -+ irqmask); -+ -+ if (r) -+ return r; -+ -+ timeout = wait_for_completion_interruptible_timeout(&completion, -+ timeout); -+ -+ omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); -+ -+ if (timeout == 0) -+ return -ETIMEDOUT; -+ -+ if (timeout == -ERESTARTSYS) -+ return -ERESTARTSYS; -+ -+ return 0; -+} -+ -+#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC -+void dispc_fake_vsync_irq(void) -+{ -+ u32 irqstatus = DISPC_IRQ_VSYNC; -+ int i; -+ -+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { -+ struct omap_dispc_isr_data *isr_data; -+ isr_data = &dispc.registered_isr[i]; -+ -+ if (!isr_data->isr) -+ continue; -+ -+ if (isr_data->mask & irqstatus) -+ isr_data->isr(isr_data->arg, irqstatus); -+ } -+} -+#endif -+ -+static void _omap_dispc_initialize_irq(void) -+{ -+ memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr)); -+ -+ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; -+ -+ /* there's SYNC_LOST_DIGIT waiting after enabling the DSS, -+ * so clear it */ -+ dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS)); -+ -+ omap_dispc_set_irqs(); -+} -+ -+static void _omap_dispc_initial_config(void) -+{ -+ u32 l; -+ -+ l = dispc_read_reg(DISPC_SYSCONFIG); -+ l = FLD_MOD(l, 2, 13, 12); /* MIDLEMODE: smart standby */ -+ l = FLD_MOD(l, 2, 4, 3); /* SIDLEMODE: smart idle */ -+ l = FLD_MOD(l, 1, 2, 2); /* ENWAKEUP */ -+ l = FLD_MOD(l, 1, 0, 0); /* AUTOIDLE */ -+ dispc_write_reg(DISPC_SYSCONFIG, l); -+ -+ /* FUNCGATED */ -+ REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9); -+ -+ /* L3 firewall setting: enable access to OCM RAM */ -+ if (cpu_is_omap24xx()) -+ __raw_writel(0x402000b0, IO_ADDRESS(0x680050a0)); -+ -+ _dispc_setup_color_conv_coef(); -+ -+ dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY); -+} -+ -+int dispc_init(void) -+{ -+ u32 rev; -+ -+ spin_lock_init(&dispc.irq_lock); -+ -+ dispc.base = ioremap(DISPC_BASE, DISPC_SZ_REGS); -+ if (!dispc.base) { -+ DSSERR("can't ioremap DISPC\n"); -+ return -ENOMEM; -+ } -+ -+ if (cpu_is_omap34xx()) { -+ dispc.dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck"); -+ if (IS_ERR(dispc.dpll4_m4_ck)) { -+ DSSERR("Failed to get dpll4_m4_ck\n"); -+ return -ENODEV; -+ } -+ } -+ -+ enable_clocks(1); -+ -+ _omap_dispc_initial_config(); -+ -+ _omap_dispc_initialize_irq(); -+ -+ dispc_save_context(); -+ -+ rev = dispc_read_reg(DISPC_REVISION); -+ printk(KERN_INFO "OMAP DISPC rev %d.%d\n", -+ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); -+ -+ enable_clocks(0); -+ -+ return 0; -+} -+ -+void dispc_exit(void) -+{ -+ if (cpu_is_omap34xx()) -+ clk_put(dispc.dpll4_m4_ck); -+ iounmap(dispc.base); -+} -+ -+int dispc_enable_plane(enum omap_plane plane, bool enable) -+{ -+ DSSDBG("dispc_enable_plane %d, %d\n", plane, enable); -+ -+ enable_clocks(1); -+ _dispc_enable_plane(plane, enable); -+ enable_clocks(0); -+ -+ return 0; -+} -+ -+int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, -+ u32 paddr, u16 screen_width, -+ u16 pos_x, u16 pos_y, -+ u16 width, u16 height, -+ u16 out_width, u16 out_height, -+ enum omap_color_mode color_mode, -+ bool ilace, -+ u8 rotation, bool mirror) -+{ -+ int r = 0; -+ -+ DSSDBG("dispc_setup_plane %d, ch %d, pa %x, sw %d, %d,%d, %dx%d -> " -+ "%dx%d, ilace %d, cmode %x, rot %d, mir %d\n", -+ plane, channel_out, paddr, screen_width, pos_x, pos_y, -+ width, height, -+ out_width, out_height, -+ ilace, color_mode, -+ rotation, mirror); -+ -+ enable_clocks(1); -+ -+ r = _dispc_setup_plane(plane, channel_out, -+ paddr, screen_width, -+ pos_x, pos_y, -+ width, height, -+ out_width, out_height, -+ color_mode, ilace, -+ rotation, mirror); -+ -+ enable_clocks(0); -+ -+ return r; -+} -+ -+static int dispc_is_intersecting(int x1, int y1, int w1, int h1, -+ int x2, int y2, int w2, int h2) -+{ -+ if (x1 >= (x2+w2)) -+ return 0; -+ -+ if ((x1+w1) <= x2) -+ return 0; -+ -+ if (y1 >= (y2+h2)) -+ return 0; -+ -+ if ((y1+h1) <= y2) -+ return 0; -+ -+ return 1; -+} -+ -+static int dispc_is_overlay_scaled(struct omap_overlay_info *pi) -+{ -+ if (pi->width != pi->out_width) -+ return 1; -+ -+ if (pi->height != pi->out_height) -+ return 1; -+ -+ return 0; -+} -+ -+/* returns the area that needs updating */ -+void dispc_setup_partial_planes(struct omap_display *display, -+ u16 *xi, u16 *yi, u16 *wi, u16 *hi) -+{ -+ struct omap_overlay_manager *mgr; -+ int i; -+ -+ int x, y, w, h; -+ -+ x = *xi; -+ y = *yi; -+ w = *wi; -+ h = *hi; -+ -+ DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n", -+ *xi, *yi, *wi, *hi); -+ -+ -+ mgr = display->manager; -+ -+ if (!mgr) { -+ DSSDBG("no manager\n"); -+ return; -+ } -+ -+ for (i = 0; i < mgr->num_overlays; i++) { -+ struct omap_overlay *ovl; -+ struct omap_overlay_info *pi; -+ ovl = mgr->overlays[i]; -+ -+ if (ovl->manager != mgr) -+ continue; -+ -+ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) -+ continue; -+ -+ pi = &ovl->info; -+ -+ if (!pi->enabled) -+ continue; -+ /* -+ * If the plane is intersecting and scaled, we -+ * enlarge the update region to accomodate the -+ * whole area -+ */ -+ -+ if (dispc_is_intersecting(x, y, w, h, -+ pi->pos_x, pi->pos_y, -+ pi->out_width, pi->out_height)) { -+ if (dispc_is_overlay_scaled(pi)) { -+ -+ int x1, y1, x2, y2; -+ -+ if (x > pi->pos_x) -+ x1 = pi->pos_x; -+ else -+ x1 = x; -+ -+ if (y > pi->pos_y) -+ y1 = pi->pos_y; -+ else -+ y1 = y; -+ -+ if ((x + w) < (pi->pos_x + pi->out_width)) -+ x2 = pi->pos_x + pi->out_width; -+ else -+ x2 = x + w; -+ -+ if ((y + h) < (pi->pos_y + pi->out_height)) -+ y2 = pi->pos_y + pi->out_height; -+ else -+ y2 = y + h; -+ -+ x = x1; -+ y = y1; -+ w = x2 - x1; -+ h = y2 - y1; -+ -+ DSSDBG("Update area after enlarge due to " -+ "scaling %d, %d %dx%d\n", -+ x, y, w, h); -+ } -+ } -+ } -+ -+ for (i = 0; i < mgr->num_overlays; i++) { -+ struct omap_overlay *ovl = mgr->overlays[i]; -+ struct omap_overlay_info *pi = &ovl->info; -+ -+ int px = pi->pos_x; -+ int py = pi->pos_y; -+ int pw = pi->width; -+ int ph = pi->height; -+ int pow = pi->out_width; -+ int poh = pi->out_height; -+ u32 pa = pi->paddr; -+ int psw = pi->screen_width; -+ int bpp; -+ -+ if (ovl->manager != mgr) -+ continue; -+ -+ /* -+ * If plane is not enabled or the update region -+ * does not intersect with the plane in question, -+ * we really disable the plane from hardware -+ */ -+ -+ if (!pi->enabled || -+ !dispc_is_intersecting(x, y, w, h, -+ px, py, pow, poh)) { -+ dispc_enable_plane(ovl->id, 0); -+ continue; -+ } -+ -+ switch (pi->color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_ARGB16: -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ bpp = 16; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24P: -+ bpp = 24; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_ARGB32: -+ case OMAP_DSS_COLOR_RGBA32: -+ case OMAP_DSS_COLOR_RGBX32: -+ bpp = 32; -+ break; -+ -+ default: -+ BUG(); -+ return; -+ } -+ -+ if (x > pi->pos_x) { -+ px = 0; -+ pw -= (x - pi->pos_x); -+ pa += (x - pi->pos_x) * bpp / 8; -+ } else { -+ px = pi->pos_x - x; -+ } -+ -+ if (y > pi->pos_y) { -+ py = 0; -+ ph -= (y - pi->pos_y); -+ pa += (y - pi->pos_y) * psw * bpp / 8; -+ } else { -+ py = pi->pos_y - y; -+ } -+ -+ if (w < (px+pw)) -+ pw -= (px+pw) - (w); -+ -+ if (h < (py+ph)) -+ ph -= (py+ph) - (h); -+ -+ /* Can't scale the GFX plane */ -+ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0 || -+ dispc_is_overlay_scaled(pi) == 0) { -+ pow = pw; -+ poh = ph; -+ } -+ -+ DSSDBG("calc plane %d, %x, sw %d, %d,%d, %dx%d -> %dx%d\n", -+ ovl->id, pa, psw, px, py, pw, ph, pow, poh); -+ -+ dispc_setup_plane(ovl->id, mgr->id, -+ pa, psw, -+ px, py, -+ pw, ph, -+ pow, poh, -+ pi->color_mode, 0, -+ pi->rotation, // XXX rotation probably wrong -+ pi->mirror); -+ -+ dispc_enable_plane(ovl->id, 1); -+ } -+ -+ *xi = x; -+ *yi = y; -+ *wi = w; -+ *hi = h; -+ -+} -+ -diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c -new file mode 100644 -index 0000000..1a55010 ---- /dev/null -+++ b/drivers/video/omap2/dss/display.c -@@ -0,0 +1,687 @@ -+/* -+ * linux/drivers/video/omap2/dss/display.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "DISPLAY" -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include "dss.h" -+ -+static int num_displays; -+static LIST_HEAD(display_list); -+ -+static ssize_t display_name_show(struct omap_display *display, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", display->name); -+} -+ -+static ssize_t display_enabled_show(struct omap_display *display, char *buf) -+{ -+ bool enabled = display->state != OMAP_DSS_DISPLAY_DISABLED; -+ -+ return snprintf(buf, PAGE_SIZE, "%d\n", enabled); -+} -+ -+static ssize_t display_enabled_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ bool enabled, r; -+ -+ enabled = simple_strtoul(buf, NULL, 10); -+ -+ if (enabled != (display->state != OMAP_DSS_DISPLAY_DISABLED)) { -+ if (enabled) { -+ r = display->enable(display); -+ if (r) -+ return r; -+ } else { -+ display->disable(display); -+ } -+ } -+ -+ return size; -+} -+ -+static ssize_t display_upd_mode_show(struct omap_display *display, char *buf) -+{ -+ enum omap_dss_update_mode mode = OMAP_DSS_UPDATE_AUTO; -+ if (display->get_update_mode) -+ mode = display->get_update_mode(display); -+ return snprintf(buf, PAGE_SIZE, "%d\n", mode); -+} -+ -+static ssize_t display_upd_mode_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ int val, r; -+ enum omap_dss_update_mode mode; -+ -+ val = simple_strtoul(buf, NULL, 10); -+ -+ switch (val) { -+ case OMAP_DSS_UPDATE_DISABLED: -+ case OMAP_DSS_UPDATE_AUTO: -+ case OMAP_DSS_UPDATE_MANUAL: -+ mode = (enum omap_dss_update_mode)val; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ if ((r = display->set_update_mode(display, mode))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t display_tear_show(struct omap_display *display, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d\n", -+ display->get_te ? display->get_te(display) : 0); -+} -+ -+static ssize_t display_tear_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ unsigned long te; -+ int r; -+ -+ if (!display->enable_te || !display->get_te) -+ return -ENOENT; -+ -+ te = simple_strtoul(buf, NULL, 0); -+ -+ if ((r = display->enable_te(display, te))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t display_timings_show(struct omap_display *display, char *buf) -+{ -+ struct omap_video_timings t; -+ -+ if (!display->get_timings) -+ return -ENOENT; -+ -+ display->get_timings(display, &t); -+ -+ return snprintf(buf, PAGE_SIZE, "%u,%u/%u/%u/%u,%u/%u/%u/%u\n", -+ t.pixel_clock, -+ t.x_res, t.hsw, t.hfp, t.hbp, -+ t.y_res, t.vsw, t.vfp, t.vbp); -+} -+ -+static ssize_t display_timings_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ struct omap_video_timings t; -+ int r; -+ -+ if (!display->set_timings || !display->check_timings) -+ return -ENOENT; -+ -+ if (strncmp("pal", buf, 3) == 0) { -+ t = omap_dss_pal_timings; -+ } else if (strncmp("ntsc", buf, 4) == 0) { -+ t = omap_dss_ntsc_timings; -+ } else if (sscanf(buf, "%u,%hu/%hu/%hu/%hu,%hu/%hu/%hu/%hu", -+ &t.pixel_clock, -+ &t.x_res, &t.hsw, &t.hfp, &t.hbp, -+ &t.y_res, &t.vsw, &t.vfp, &t.vbp) != 9) -+ return -EINVAL; -+ -+ if ((r = display->check_timings(display, &t))) -+ return r; -+ -+ display->set_timings(display, &t); -+ -+ return size; -+} -+ -+static ssize_t display_rotate_show(struct omap_display *display, char *buf) -+{ -+ int rotate; -+ if (!display->get_rotate) -+ return -ENOENT; -+ rotate = display->get_rotate(display); -+ return snprintf(buf, PAGE_SIZE, "%u\n", rotate); -+} -+ -+static ssize_t display_rotate_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ unsigned long rot; -+ int r; -+ -+ if (!display->set_rotate || !display->get_rotate) -+ return -ENOENT; -+ -+ rot = simple_strtoul(buf, NULL, 0); -+ -+ if ((r = display->set_rotate(display, rot))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t display_mirror_show(struct omap_display *display, char *buf) -+{ -+ int mirror; -+ if (!display->get_mirror) -+ return -ENOENT; -+ mirror = display->get_mirror(display); -+ return snprintf(buf, PAGE_SIZE, "%u\n", mirror); -+} -+ -+static ssize_t display_mirror_store(struct omap_display *display, -+ const char *buf, size_t size) -+{ -+ unsigned long mirror; -+ int r; -+ -+ if (!display->set_mirror || !display->get_mirror) -+ return -ENOENT; -+ -+ mirror = simple_strtoul(buf, NULL, 0); -+ -+ if ((r = display->set_mirror(display, mirror))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t display_panel_name_show(struct omap_display *display, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ display->panel ? display->panel->name : ""); -+} -+ -+static ssize_t display_ctrl_name_show(struct omap_display *display, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ display->ctrl ? display->ctrl->name : ""); -+} -+ -+struct display_attribute { -+ struct attribute attr; -+ ssize_t (*show)(struct omap_display *, char *); -+ ssize_t (*store)(struct omap_display *, const char *, size_t); -+}; -+ -+#define DISPLAY_ATTR(_name, _mode, _show, _store) \ -+ struct display_attribute display_attr_##_name = \ -+ __ATTR(_name, _mode, _show, _store) -+ -+static DISPLAY_ATTR(name, S_IRUGO, display_name_show, NULL); -+static DISPLAY_ATTR(enabled, S_IRUGO|S_IWUSR, -+ display_enabled_show, display_enabled_store); -+static DISPLAY_ATTR(update_mode, S_IRUGO|S_IWUSR, -+ display_upd_mode_show, display_upd_mode_store); -+static DISPLAY_ATTR(tear_elim, S_IRUGO|S_IWUSR, -+ display_tear_show, display_tear_store); -+static DISPLAY_ATTR(timings, S_IRUGO|S_IWUSR, -+ display_timings_show, display_timings_store); -+static DISPLAY_ATTR(rotate, S_IRUGO|S_IWUSR, -+ display_rotate_show, display_rotate_store); -+static DISPLAY_ATTR(mirror, S_IRUGO|S_IWUSR, -+ display_mirror_show, display_mirror_store); -+static DISPLAY_ATTR(panel_name, S_IRUGO, display_panel_name_show, NULL); -+static DISPLAY_ATTR(ctrl_name, S_IRUGO, display_ctrl_name_show, NULL); -+ -+static struct attribute *display_sysfs_attrs[] = { -+ &display_attr_name.attr, -+ &display_attr_enabled.attr, -+ &display_attr_update_mode.attr, -+ &display_attr_tear_elim.attr, -+ &display_attr_timings.attr, -+ &display_attr_rotate.attr, -+ &display_attr_mirror.attr, -+ &display_attr_panel_name.attr, -+ &display_attr_ctrl_name.attr, -+ NULL -+}; -+ -+static ssize_t display_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) -+{ -+ struct omap_display *display; -+ struct display_attribute *display_attr; -+ -+ display = container_of(kobj, struct omap_display, kobj); -+ display_attr = container_of(attr, struct display_attribute, attr); -+ -+ if (!display_attr->show) -+ return -ENOENT; -+ -+ return display_attr->show(display, buf); -+} -+ -+static ssize_t display_attr_store(struct kobject *kobj, struct attribute *attr, -+ const char *buf, size_t size) -+{ -+ struct omap_display *display; -+ struct display_attribute *display_attr; -+ -+ display = container_of(kobj, struct omap_display, kobj); -+ display_attr = container_of(attr, struct display_attribute, attr); -+ -+ if (!display_attr->store) -+ return -ENOENT; -+ -+ return display_attr->store(display, buf, size); -+} -+ -+static struct sysfs_ops display_sysfs_ops = { -+ .show = display_attr_show, -+ .store = display_attr_store, -+}; -+ -+static struct kobj_type display_ktype = { -+ .sysfs_ops = &display_sysfs_ops, -+ .default_attrs = display_sysfs_attrs, -+}; -+ -+static void default_get_resolution(struct omap_display *display, -+ u16 *xres, u16 *yres) -+{ -+ *xres = display->panel->timings.x_res; -+ *yres = display->panel->timings.y_res; -+} -+ -+static void default_configure_overlay(struct omap_overlay *ovl) -+{ -+ unsigned low, high, size; -+ enum omap_burst_size burst; -+ enum omap_plane plane = ovl->id; -+ -+ burst = OMAP_DSS_BURST_16x32; -+ size = 16 * 32 / 8; -+ -+ dispc_set_burst_size(plane, burst); -+ -+ high = dispc_get_plane_fifo_size(plane) - 1; -+ low = dispc_get_plane_fifo_size(plane) - size; -+ -+ dispc_setup_plane_fifo(plane, low, high); -+} -+ -+static int default_wait_vsync(struct omap_display *display) -+{ -+ unsigned long timeout = msecs_to_jiffies(500); -+ u32 irq; -+ -+ if (display->type == OMAP_DISPLAY_TYPE_VENC) -+ irq = DISPC_IRQ_EVSYNC_ODD; -+ else -+ irq = DISPC_IRQ_VSYNC; -+ -+ return omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); -+} -+ -+static int default_get_recommended_bpp(struct omap_display *display) -+{ -+ if (display->panel->recommended_bpp) -+ return display->panel->recommended_bpp; -+ -+ switch (display->type) { -+ case OMAP_DISPLAY_TYPE_DPI: -+ if (display->hw_config.u.dpi.data_lines == 24) -+ return 24; -+ else -+ return 16; -+ -+ case OMAP_DISPLAY_TYPE_DBI: -+ case OMAP_DISPLAY_TYPE_DSI: -+ if (display->ctrl->pixel_size == 24) -+ return 24; -+ else -+ return 16; -+ case OMAP_DISPLAY_TYPE_VENC: -+ case OMAP_DISPLAY_TYPE_SDI: -+ return 24; -+ return 24; -+ default: -+ BUG(); -+ } -+} -+ -+void dss_init_displays(struct platform_device *pdev) -+{ -+ struct omap_dss_board_info *pdata = pdev->dev.platform_data; -+ int i, r; -+ -+ INIT_LIST_HEAD(&display_list); -+ -+ num_displays = 0; -+ -+ for (i = 0; i < pdata->num_displays; ++i) { -+ struct omap_display *display; -+ -+ switch (pdata->displays[i]->type) { -+ case OMAP_DISPLAY_TYPE_DPI: -+#ifdef CONFIG_OMAP2_DSS_RFBI -+ case OMAP_DISPLAY_TYPE_DBI: -+#endif -+#ifdef CONFIG_OMAP2_DSS_SDI -+ case OMAP_DISPLAY_TYPE_SDI: -+#endif -+#ifdef CONFIG_OMAP2_DSS_DSI -+ case OMAP_DISPLAY_TYPE_DSI: -+#endif -+#ifdef CONFIG_OMAP2_DSS_VENC -+ case OMAP_DISPLAY_TYPE_VENC: -+#endif -+ break; -+ default: -+ DSSERR("Support for display '%s' not compiled in.\n", -+ pdata->displays[i]->name); -+ continue; -+ } -+ -+ display = kzalloc(sizeof(*display), GFP_KERNEL); -+ -+ /*atomic_set(&display->ref_count, 0);*/ -+ display->ref_count = 0; -+ -+ display->hw_config = *pdata->displays[i]; -+ display->type = pdata->displays[i]->type; -+ display->name = pdata->displays[i]->name; -+ -+ display->get_resolution = default_get_resolution; -+ display->get_recommended_bpp = default_get_recommended_bpp; -+ display->configure_overlay = default_configure_overlay; -+ display->wait_vsync = default_wait_vsync; -+ -+ switch (display->type) { -+ case OMAP_DISPLAY_TYPE_DPI: -+ dpi_init_display(display); -+ break; -+#ifdef CONFIG_OMAP2_DSS_RFBI -+ case OMAP_DISPLAY_TYPE_DBI: -+ rfbi_init_display(display); -+ break; -+#endif -+#ifdef CONFIG_OMAP2_DSS_VENC -+ case OMAP_DISPLAY_TYPE_VENC: -+ venc_init_display(display); -+ break; -+#endif -+#ifdef CONFIG_OMAP2_DSS_SDI -+ case OMAP_DISPLAY_TYPE_SDI: -+ sdi_init_display(display); -+ break; -+#endif -+#ifdef CONFIG_OMAP2_DSS_DSI -+ case OMAP_DISPLAY_TYPE_DSI: -+ dsi_init_display(display); -+ break; -+#endif -+ default: -+ BUG(); -+ } -+ -+ r = kobject_init_and_add(&display->kobj, &display_ktype, -+ &pdev->dev.kobj, "display%d", num_displays); -+ -+ if (r) { -+ DSSERR("failed to create sysfs file\n"); -+ continue; -+ } -+ -+ num_displays++; -+ -+ list_add_tail(&display->list, &display_list); -+ } -+} -+ -+void dss_uninit_displays(struct platform_device *pdev) -+{ -+ struct omap_display *display; -+ -+ while (!list_empty(&display_list)) { -+ display = list_first_entry(&display_list, -+ struct omap_display, list); -+ list_del(&display->list); -+ kobject_del(&display->kobj); -+ kobject_put(&display->kobj); -+ kfree(display); -+ } -+ -+ num_displays = 0; -+} -+ -+int dss_suspend_all_displays(void) -+{ -+ int r; -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) { -+ display->activate_after_resume = 0; -+ continue; -+ } -+ -+ if (!display->suspend) { -+ DSSERR("display '%s' doesn't implement suspend\n", -+ display->name); -+ r = -ENOSYS; -+ goto err; -+ } -+ -+ r = display->suspend(display); -+ -+ if (r) -+ goto err; -+ -+ display->activate_after_resume = 1; -+ } -+ -+ return 0; -+err: -+ /* resume all displays that were suspended */ -+ dss_resume_all_displays(); -+ return r; -+} -+ -+int dss_resume_all_displays(void) -+{ -+ int r; -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->activate_after_resume && display->resume) { -+ r = display->resume(display); -+ if (r) -+ return r; -+ } -+ -+ display->activate_after_resume = 0; -+ } -+ -+ return 0; -+} -+ -+int omap_dss_get_num_displays(void) -+{ -+ return num_displays; -+} -+EXPORT_SYMBOL(omap_dss_get_num_displays); -+ -+struct omap_display *dss_get_display(int no) -+{ -+ int i = 0; -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (i++ == no) -+ return display; -+ } -+ -+ return NULL; -+} -+ -+struct omap_display *omap_dss_get_display(int no) -+{ -+ struct omap_display *display; -+ -+ display = dss_get_display(no); -+ -+ if (!display) -+ return NULL; -+ -+ switch (display->type) { -+ case OMAP_DISPLAY_TYPE_VENC: -+ break; -+ -+ case OMAP_DISPLAY_TYPE_DPI: -+ case OMAP_DISPLAY_TYPE_SDI: -+ if (display->panel == NULL) -+ return NULL; -+ break; -+ -+ case OMAP_DISPLAY_TYPE_DBI: -+ case OMAP_DISPLAY_TYPE_DSI: -+ if (display->panel == NULL || display->ctrl == NULL) -+ return NULL; -+ break; -+ -+ default: -+ return NULL; -+ } -+ -+ if (display->ctrl) { -+ if (!try_module_get(display->ctrl->owner)) -+ goto err0; -+ -+ if (display->ctrl->init) -+ if (display->ctrl->init(display) != 0) -+ goto err1; -+ } -+ -+ if (display->panel) { -+ if (!try_module_get(display->panel->owner)) -+ goto err2; -+ -+ if (display->panel->init) -+ if (display->panel->init(display) != 0) -+ goto err3; -+ } -+ -+ display->ref_count++; -+ /* -+ if (atomic_cmpxchg(&display->ref_count, 0, 1) != 0) -+ return 0; -+*/ -+ -+ return display; -+err3: -+ if (display->panel) -+ module_put(display->panel->owner); -+err2: -+ if (display->ctrl && display->ctrl->cleanup) -+ display->ctrl->cleanup(display); -+err1: -+ if (display->ctrl) -+ module_put(display->ctrl->owner); -+err0: -+ return NULL; -+} -+EXPORT_SYMBOL(omap_dss_get_display); -+ -+void omap_dss_put_display(struct omap_display *display) -+{ -+ if (--display->ref_count > 0) -+ return; -+/* -+ if (atomic_cmpxchg(&display->ref_count, 1, 0) != 1) -+ return; -+*/ -+ if (display->ctrl) { -+ if (display->ctrl->cleanup) -+ display->ctrl->cleanup(display); -+ module_put(display->ctrl->owner); -+ } -+ -+ if (display->panel) { -+ if (display->panel->cleanup) -+ display->panel->cleanup(display); -+ module_put(display->panel->owner); -+ } -+} -+EXPORT_SYMBOL(omap_dss_put_display); -+ -+void omap_dss_register_ctrl(struct omap_ctrl *ctrl) -+{ -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->hw_config.ctrl_name && -+ strcmp(display->hw_config.ctrl_name, ctrl->name) == 0) { -+ display->ctrl = ctrl; -+ DSSDBG("ctrl '%s' registered\n", ctrl->name); -+ } -+ } -+} -+EXPORT_SYMBOL(omap_dss_register_ctrl); -+ -+void omap_dss_register_panel(struct omap_panel *panel) -+{ -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->hw_config.panel_name && -+ strcmp(display->hw_config.panel_name, panel->name) == 0) { -+ display->panel = panel; -+ DSSDBG("panel '%s' registered\n", panel->name); -+ } -+ } -+} -+EXPORT_SYMBOL(omap_dss_register_panel); -+ -+void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl) -+{ -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->hw_config.ctrl_name && -+ strcmp(display->hw_config.ctrl_name, ctrl->name) == 0) -+ display->ctrl = NULL; -+ } -+} -+EXPORT_SYMBOL(omap_dss_unregister_ctrl); -+ -+void omap_dss_unregister_panel(struct omap_panel *panel) -+{ -+ struct omap_display *display; -+ -+ list_for_each_entry(display, &display_list, list) { -+ if (display->hw_config.panel_name && -+ strcmp(display->hw_config.panel_name, panel->name) == 0) -+ display->panel = NULL; -+ } -+} -+EXPORT_SYMBOL(omap_dss_unregister_panel); -diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c -new file mode 100644 -index 0000000..b41b07e ---- /dev/null -+++ b/drivers/video/omap2/dss/dpi.c -@@ -0,0 +1,379 @@ -+/* -+ * linux/drivers/video/omap2/dss/dpi.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include "dss.h" -+ -+ -+static struct { -+ int update_enabled; -+} dpi; -+ -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+static int dpi_set_dsi_clk(bool is_tft, unsigned long pck_req, -+ unsigned long *fck, int *lck_div, int *pck_div) -+{ -+ struct dsi_clock_info cinfo; -+ int r; -+ -+ r = dsi_pll_calc_pck(is_tft, pck_req, &cinfo); -+ if (r) -+ return r; -+ -+ r = dsi_pll_program(&cinfo); -+ if (r) -+ return r; -+ -+ dss_select_clk_source(0, 1); -+ -+ dispc_set_lcd_divisor(cinfo.lck_div, cinfo.pck_div); -+ -+ *fck = cinfo.dsi1_pll_fclk; -+ *lck_div = cinfo.lck_div; -+ *pck_div = cinfo.pck_div; -+ -+ return 0; -+} -+#else -+static int dpi_set_dispc_clk(bool is_tft, unsigned long pck_req, -+ unsigned long *fck, int *lck_div, int *pck_div) -+{ -+ struct dispc_clock_info cinfo; -+ int r; -+ -+ r = dispc_calc_clock_div(is_tft, pck_req, &cinfo); -+ if (r) -+ return r; -+ -+ r = dispc_set_clock_div(&cinfo); -+ if (r) -+ return r; -+ -+ *fck = cinfo.fck; -+ *lck_div = cinfo.lck_div; -+ *pck_div = cinfo.pck_div; -+ -+ return 0; -+} -+#endif -+ -+static int dpi_set_mode(struct omap_display *display) -+{ -+ struct omap_panel *panel = display->panel; -+ int lck_div, pck_div; -+ unsigned long fck; -+ unsigned long pck; -+ bool is_tft; -+ int r = 0; -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ dispc_set_pol_freq(panel); -+ -+ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; -+ -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+ r = dpi_set_dsi_clk(is_tft, panel->timings.pixel_clock * 1000, -+ &fck, &lck_div, &pck_div); -+#else -+ r = dpi_set_dispc_clk(is_tft, panel->timings.pixel_clock * 1000, -+ &fck, &lck_div, &pck_div); -+#endif -+ if (r) -+ goto err0; -+ -+ pck = fck / lck_div / pck_div / 1000; -+ -+ if (pck != panel->timings.pixel_clock) { -+ DSSWARN("Could not find exact pixel clock. " -+ "Requested %d kHz, got %lu kHz\n", -+ panel->timings.pixel_clock, pck); -+ -+ panel->timings.pixel_clock = pck; -+ } -+ -+ dispc_set_lcd_timings(&panel->timings); -+ -+err0: -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ return r; -+} -+ -+static int dpi_basic_init(struct omap_display *display) -+{ -+ bool is_tft; -+ -+ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; -+ -+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS); -+ dispc_set_lcd_display_type(is_tft ? OMAP_DSS_LCD_DISPLAY_TFT : -+ OMAP_DSS_LCD_DISPLAY_STN); -+ dispc_set_tft_data_lines(display->hw_config.u.dpi.data_lines); -+ -+ return 0; -+} -+ -+static int dpi_display_enable(struct omap_display *display) -+{ -+ struct omap_panel *panel = display->panel; -+ int r; -+ -+ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { -+ DSSERR("display already enabled\n"); -+ return -EINVAL; -+ } -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ r = dpi_basic_init(display); -+ if (r) -+ goto err0; -+ -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+ dss_clk_enable(DSS_CLK_FCK2); -+ r = dsi_pll_init(0, 1); -+ if (r) -+ goto err1; -+#endif -+ r = dpi_set_mode(display); -+ if (r) -+ goto err2; -+ -+ mdelay(2); -+ -+ dispc_enable_lcd_out(1); -+ -+ r = panel->enable(display); -+ if (r) -+ goto err3; -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+ -+ return 0; -+ -+err3: -+ dispc_enable_lcd_out(0); -+err2: -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+ dsi_pll_uninit(); -+err1: -+ dss_clk_disable(DSS_CLK_FCK2); -+#endif -+err0: -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ return r; -+} -+ -+static int dpi_display_resume(struct omap_display *display); -+ -+static void dpi_display_disable(struct omap_display *display) -+{ -+ if (display->state == OMAP_DSS_DISPLAY_DISABLED) -+ return; -+ -+ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) -+ dpi_display_resume(display); -+ -+ display->panel->disable(display); -+ -+ dispc_enable_lcd_out(0); -+ -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+ dss_select_clk_source(0, 0); -+ dsi_pll_uninit(); -+ dss_clk_disable(DSS_CLK_FCK2); -+#endif -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+} -+ -+static int dpi_display_suspend(struct omap_display *display) -+{ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return -EINVAL; -+ -+ DSSDBG("dpi_display_suspend\n"); -+ -+ if (display->panel->suspend) -+ display->panel->suspend(display); -+ -+ dispc_enable_lcd_out(0); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ display->state = OMAP_DSS_DISPLAY_SUSPENDED; -+ -+ return 0; -+} -+ -+static int dpi_display_resume(struct omap_display *display) -+{ -+ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) -+ return -EINVAL; -+ -+ DSSDBG("dpi_display_resume\n"); -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ dispc_enable_lcd_out(1); -+ -+ if (display->panel->resume) -+ display->panel->resume(display); -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+ -+ return 0; -+} -+ -+static void dpi_set_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ DSSDBG("dpi_set_timings\n"); -+ display->panel->timings = *timings; -+ if (display->state == OMAP_DSS_DISPLAY_ACTIVE) { -+ dpi_set_mode(display); -+ dispc_go(OMAP_DSS_CHANNEL_LCD); -+ } -+} -+ -+static int dpi_check_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ bool is_tft; -+ int r; -+ int lck_div, pck_div; -+ unsigned long fck; -+ unsigned long pck; -+ -+ if (timings->hsw < 1 || timings->hsw > 64 || -+ timings->hfp < 1 || timings->hfp > 256 || -+ timings->hbp < 1 || timings->hbp > 256) { -+ return -EINVAL; -+ } -+ -+ if (timings->vsw < 1 || timings->vsw > 64 || -+ timings->vfp > 256 || timings->vbp > 256) { -+ return -EINVAL; -+ } -+ -+ if (timings->pixel_clock == 0) -+ return -EINVAL; -+ -+ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; -+ -+#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL -+ { -+ struct dsi_clock_info cinfo; -+ r = dsi_pll_calc_pck(is_tft, timings->pixel_clock * 1000, -+ &cinfo); -+ -+ if (r) -+ return r; -+ -+ fck = cinfo.dsi1_pll_fclk; -+ lck_div = cinfo.lck_div; -+ pck_div = cinfo.pck_div; -+ } -+#else -+ { -+ struct dispc_clock_info cinfo; -+ r = dispc_calc_clock_div(is_tft, timings->pixel_clock * 1000, -+ &cinfo); -+ -+ if (r) -+ return r; -+ -+ fck = cinfo.fck; -+ lck_div = cinfo.lck_div; -+ pck_div = cinfo.pck_div; -+ } -+#endif -+ -+ pck = fck / lck_div / pck_div / 1000; -+ -+ timings->pixel_clock = pck; -+ -+ return 0; -+} -+ -+static void dpi_get_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ *timings = display->panel->timings; -+} -+ -+static int dpi_display_set_update_mode(struct omap_display *display, -+ enum omap_dss_update_mode mode) -+{ -+ if (mode == OMAP_DSS_UPDATE_MANUAL) -+ return -EINVAL; -+ -+ if (mode == OMAP_DSS_UPDATE_DISABLED) { -+ dispc_enable_lcd_out(0); -+ dpi.update_enabled = 0; -+ } else { -+ dispc_enable_lcd_out(1); -+ dpi.update_enabled = 1; -+ } -+ -+ return 0; -+} -+ -+static enum omap_dss_update_mode dpi_display_get_update_mode( -+ struct omap_display *display) -+{ -+ return dpi.update_enabled ? OMAP_DSS_UPDATE_AUTO : -+ OMAP_DSS_UPDATE_DISABLED; -+} -+ -+void dpi_init_display(struct omap_display *display) -+{ -+ DSSDBG("DPI init_display\n"); -+ -+ display->enable = dpi_display_enable; -+ display->disable = dpi_display_disable; -+ display->suspend = dpi_display_suspend; -+ display->resume = dpi_display_resume; -+ display->set_timings = dpi_set_timings; -+ display->check_timings = dpi_check_timings; -+ display->get_timings = dpi_get_timings; -+ display->set_update_mode = dpi_display_set_update_mode; -+ display->get_update_mode = dpi_display_get_update_mode; -+} -+ -+int dpi_init(void) -+{ -+ return 0; -+} -+ -+void dpi_exit(void) -+{ -+} -+ -diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c -new file mode 100644 -index 0000000..ea5a58e ---- /dev/null -+++ b/drivers/video/omap2/dss/dsi.c -@@ -0,0 +1,3693 @@ -+/* -+ * linux/drivers/video/omap2/dss/dsi.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "DSI" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "dss.h" -+ -+/*#define VERBOSE_IRQ*/ -+ -+#define DSI_BASE 0x4804FC00 -+ -+struct dsi_reg { u16 idx; }; -+ -+#define DSI_REG(idx) ((const struct dsi_reg) { idx }) -+ -+#define DSI_SZ_REGS SZ_1K -+/* DSI Protocol Engine */ -+ -+#define DSI_REVISION DSI_REG(0x0000) -+#define DSI_SYSCONFIG DSI_REG(0x0010) -+#define DSI_SYSSTATUS DSI_REG(0x0014) -+#define DSI_IRQSTATUS DSI_REG(0x0018) -+#define DSI_IRQENABLE DSI_REG(0x001C) -+#define DSI_CTRL DSI_REG(0x0040) -+#define DSI_COMPLEXIO_CFG1 DSI_REG(0x0048) -+#define DSI_COMPLEXIO_IRQ_STATUS DSI_REG(0x004C) -+#define DSI_COMPLEXIO_IRQ_ENABLE DSI_REG(0x0050) -+#define DSI_CLK_CTRL DSI_REG(0x0054) -+#define DSI_TIMING1 DSI_REG(0x0058) -+#define DSI_TIMING2 DSI_REG(0x005C) -+#define DSI_VM_TIMING1 DSI_REG(0x0060) -+#define DSI_VM_TIMING2 DSI_REG(0x0064) -+#define DSI_VM_TIMING3 DSI_REG(0x0068) -+#define DSI_CLK_TIMING DSI_REG(0x006C) -+#define DSI_TX_FIFO_VC_SIZE DSI_REG(0x0070) -+#define DSI_RX_FIFO_VC_SIZE DSI_REG(0x0074) -+#define DSI_COMPLEXIO_CFG2 DSI_REG(0x0078) -+#define DSI_RX_FIFO_VC_FULLNESS DSI_REG(0x007C) -+#define DSI_VM_TIMING4 DSI_REG(0x0080) -+#define DSI_TX_FIFO_VC_EMPTINESS DSI_REG(0x0084) -+#define DSI_VM_TIMING5 DSI_REG(0x0088) -+#define DSI_VM_TIMING6 DSI_REG(0x008C) -+#define DSI_VM_TIMING7 DSI_REG(0x0090) -+#define DSI_STOPCLK_TIMING DSI_REG(0x0094) -+#define DSI_VC_CTRL(n) DSI_REG(0x0100 + (n * 0x20)) -+#define DSI_VC_TE(n) DSI_REG(0x0104 + (n * 0x20)) -+#define DSI_VC_LONG_PACKET_HEADER(n) DSI_REG(0x0108 + (n * 0x20)) -+#define DSI_VC_LONG_PACKET_PAYLOAD(n) DSI_REG(0x010C + (n * 0x20)) -+#define DSI_VC_SHORT_PACKET_HEADER(n) DSI_REG(0x0110 + (n * 0x20)) -+#define DSI_VC_IRQSTATUS(n) DSI_REG(0x0118 + (n * 0x20)) -+#define DSI_VC_IRQENABLE(n) DSI_REG(0x011C + (n * 0x20)) -+ -+/* DSIPHY_SCP */ -+ -+#define DSI_DSIPHY_CFG0 DSI_REG(0x200 + 0x0000) -+#define DSI_DSIPHY_CFG1 DSI_REG(0x200 + 0x0004) -+#define DSI_DSIPHY_CFG2 DSI_REG(0x200 + 0x0008) -+#define DSI_DSIPHY_CFG5 DSI_REG(0x200 + 0x0014) -+ -+/* DSI_PLL_CTRL_SCP */ -+ -+#define DSI_PLL_CONTROL DSI_REG(0x300 + 0x0000) -+#define DSI_PLL_STATUS DSI_REG(0x300 + 0x0004) -+#define DSI_PLL_GO DSI_REG(0x300 + 0x0008) -+#define DSI_PLL_CONFIGURATION1 DSI_REG(0x300 + 0x000C) -+#define DSI_PLL_CONFIGURATION2 DSI_REG(0x300 + 0x0010) -+ -+#define REG_GET(idx, start, end) \ -+ FLD_GET(dsi_read_reg(idx), start, end) -+ -+#define REG_FLD_MOD(idx, val, start, end) \ -+ dsi_write_reg(idx, FLD_MOD(dsi_read_reg(idx), val, start, end)) -+ -+/* Global interrupts */ -+#define DSI_IRQ_VC0 (1 << 0) -+#define DSI_IRQ_VC1 (1 << 1) -+#define DSI_IRQ_VC2 (1 << 2) -+#define DSI_IRQ_VC3 (1 << 3) -+#define DSI_IRQ_WAKEUP (1 << 4) -+#define DSI_IRQ_RESYNC (1 << 5) -+#define DSI_IRQ_PLL_LOCK (1 << 7) -+#define DSI_IRQ_PLL_UNLOCK (1 << 8) -+#define DSI_IRQ_PLL_RECALL (1 << 9) -+#define DSI_IRQ_COMPLEXIO_ERR (1 << 10) -+#define DSI_IRQ_HS_TX_TIMEOUT (1 << 14) -+#define DSI_IRQ_LP_RX_TIMEOUT (1 << 15) -+#define DSI_IRQ_TE_TRIGGER (1 << 16) -+#define DSI_IRQ_ACK_TRIGGER (1 << 17) -+#define DSI_IRQ_SYNC_LOST (1 << 18) -+#define DSI_IRQ_LDO_POWER_GOOD (1 << 19) -+#define DSI_IRQ_TA_TIMEOUT (1 << 20) -+#define DSI_IRQ_ERROR_MASK \ -+ (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \ -+ DSI_IRQ_TA_TIMEOUT) -+#define DSI_IRQ_CHANNEL_MASK 0xf -+ -+/* Virtual channel interrupts */ -+#define DSI_VC_IRQ_CS (1 << 0) -+#define DSI_VC_IRQ_ECC_CORR (1 << 1) -+#define DSI_VC_IRQ_PACKET_SENT (1 << 2) -+#define DSI_VC_IRQ_FIFO_TX_OVF (1 << 3) -+#define DSI_VC_IRQ_FIFO_RX_OVF (1 << 4) -+#define DSI_VC_IRQ_BTA (1 << 5) -+#define DSI_VC_IRQ_ECC_NO_CORR (1 << 6) -+#define DSI_VC_IRQ_FIFO_TX_UDF (1 << 7) -+#define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8) -+#define DSI_VC_IRQ_ERROR_MASK \ -+ (DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \ -+ DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \ -+ DSI_VC_IRQ_FIFO_TX_UDF) -+ -+/* ComplexIO interrupts */ -+#define DSI_CIO_IRQ_ERRSYNCESC1 (1 << 0) -+#define DSI_CIO_IRQ_ERRSYNCESC2 (1 << 1) -+#define DSI_CIO_IRQ_ERRSYNCESC3 (1 << 2) -+#define DSI_CIO_IRQ_ERRESC1 (1 << 5) -+#define DSI_CIO_IRQ_ERRESC2 (1 << 6) -+#define DSI_CIO_IRQ_ERRESC3 (1 << 7) -+#define DSI_CIO_IRQ_ERRCONTROL1 (1 << 10) -+#define DSI_CIO_IRQ_ERRCONTROL2 (1 << 11) -+#define DSI_CIO_IRQ_ERRCONTROL3 (1 << 12) -+#define DSI_CIO_IRQ_STATEULPS1 (1 << 15) -+#define DSI_CIO_IRQ_STATEULPS2 (1 << 16) -+#define DSI_CIO_IRQ_STATEULPS3 (1 << 17) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP0_1 (1 << 20) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP1_1 (1 << 21) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP0_2 (1 << 22) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP1_2 (1 << 23) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP0_3 (1 << 24) -+#define DSI_CIO_IRQ_ERRCONTENTIONLP1_3 (1 << 25) -+#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0 (1 << 30) -+#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1 (1 << 31) -+ -+#define DSI_DT_DCS_SHORT_WRITE_0 0x05 -+#define DSI_DT_DCS_SHORT_WRITE_1 0x15 -+#define DSI_DT_DCS_READ 0x06 -+#define DSI_DT_SET_MAX_RET_PKG_SIZE 0x37 -+#define DSI_DT_NULL_PACKET 0x09 -+#define DSI_DT_DCS_LONG_WRITE 0x39 -+ -+#define DSI_DT_RX_ACK_WITH_ERR 0x02 -+#define DSI_DT_RX_DCS_LONG_READ 0x1c -+#define DSI_DT_RX_SHORT_READ_1 0x21 -+#define DSI_DT_RX_SHORT_READ_2 0x22 -+ -+#define FINT_MAX 2100000 -+#define FINT_MIN 750000 -+#define REGN_MAX (1 << 7) -+#define REGM_MAX ((1 << 11) - 1) -+#define REGM3_MAX (1 << 4) -+#define REGM4_MAX (1 << 4) -+ -+enum fifo_size { -+ DSI_FIFO_SIZE_0 = 0, -+ DSI_FIFO_SIZE_32 = 1, -+ DSI_FIFO_SIZE_64 = 2, -+ DSI_FIFO_SIZE_96 = 3, -+ DSI_FIFO_SIZE_128 = 4, -+}; -+ -+#define DSI_CMD_FIFO_LEN_BYTES (16 * sizeof(struct dsi_cmd_item)) -+ -+struct dsi_cmd_update { -+ int bytespp; -+ u16 x; -+ u16 y; -+ u16 w; -+ u16 h; -+}; -+ -+struct dsi_cmd_mem_read { -+ void *buf; -+ size_t size; -+ u16 x; -+ u16 y; -+ u16 w; -+ u16 h; -+ size_t *ret_size; -+ struct completion *completion; -+}; -+ -+struct dsi_cmd_test { -+ int test_num; -+ int *result; -+ struct completion *completion; -+}; -+ -+enum dsi_cmd { -+ DSI_CMD_UPDATE, -+ DSI_CMD_SYNC, -+ DSI_CMD_MEM_READ, -+ DSI_CMD_TEST, -+ DSI_CMD_SET_TE, -+ DSI_CMD_SET_UPDATE_MODE, -+ DSI_CMD_SET_ROTATE, -+ DSI_CMD_SET_MIRROR, -+}; -+ -+struct dsi_cmd_item { -+ struct omap_display *display; -+ -+ enum dsi_cmd cmd; -+ -+ union { -+ struct dsi_cmd_update r; -+ struct completion *sync; -+ struct dsi_cmd_mem_read mem_read; -+ struct dsi_cmd_test test; -+ int te; -+ enum omap_dss_update_mode update_mode; -+ int rotate; -+ int mirror; -+ } u; -+}; -+ -+static struct -+{ -+ void __iomem *base; -+ -+ unsigned long dsi1_pll_fclk; /* Hz */ -+ unsigned long dsi2_pll_fclk; /* Hz */ -+ unsigned long dsiphy; /* Hz */ -+ unsigned long ddr_clk; /* Hz */ -+ -+ struct { -+ enum fifo_size fifo_size; -+ int dest_per; /* destination peripheral 0-3 */ -+ } vc[4]; -+ -+ struct mutex lock; -+ -+ unsigned pll_locked; -+ -+ struct completion bta_completion; -+ -+ struct work_struct framedone_work; -+ struct workqueue_struct *framedone_workqueue; -+ -+ enum omap_dss_update_mode user_update_mode; -+ enum omap_dss_update_mode target_update_mode; -+ enum omap_dss_update_mode update_mode; -+ int use_te; -+ int framedone_scheduled; /* helps to catch strange framedone bugs */ -+ -+ -+ struct { -+ struct omap_display *display; -+ int x, y, w, h; -+ int bytespp; -+ } update_region; -+ -+ unsigned long cache_req_pck; -+ unsigned long cache_clk_freq; -+ struct dsi_clock_info cache_cinfo; -+ -+ struct kfifo *cmd_fifo; -+ spinlock_t cmd_lock; -+ struct completion cmd_done; -+ atomic_t cmd_fifo_full; -+ atomic_t cmd_pending; -+ -+#ifdef DEBUG -+ ktime_t perf_setup_time; -+ ktime_t perf_start_time; -+ int perf_measure_frames; -+#endif -+ int debug_process; -+ int debug_read; -+ int debug_write; -+} dsi; -+ -+#ifdef DEBUG -+static unsigned int dsi_perf; -+module_param_named(dsi_perf, dsi_perf, bool, 0644); -+#endif -+ -+static void dsi_process_cmd_fifo(void); -+static void dsi_push_update(struct omap_display *display, -+ int x, int y, int w, int h); -+ -+static inline void dsi_write_reg(const struct dsi_reg idx, u32 val) -+{ -+ __raw_writel(val, dsi.base + idx.idx); -+} -+ -+static inline u32 dsi_read_reg(const struct dsi_reg idx) -+{ -+ return __raw_readl(dsi.base + idx.idx); -+} -+ -+ -+void dsi_save_context(void) -+{ -+} -+ -+void dsi_restore_context(void) -+{ -+} -+ -+static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum, -+ int value) -+{ -+ int t = 100000; -+ -+ while (REG_GET(idx, bitnum, bitnum) != value) { -+ if (--t == 0) -+ return !value; -+ } -+ -+ return value; -+} -+ -+#ifdef DEBUG -+static void perf_mark_setup(void) -+{ -+ dsi.perf_setup_time = ktime_get(); -+} -+ -+static void perf_mark_start(void) -+{ -+ dsi.perf_start_time = ktime_get(); -+} -+ -+static void perf_show(const char *name) -+{ -+ ktime_t t, setup_time, trans_time; -+ u32 total_bytes; -+ u32 setup_us, trans_us, total_us; -+ const int numframes = 100; -+ static u32 s_trans_us, s_min_us = 0xffffffff, s_max_us; -+ -+ if (!dsi_perf) -+ return; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED) -+ return; -+ -+ t = ktime_get(); -+ -+ setup_time = ktime_sub(dsi.perf_start_time, dsi.perf_setup_time); -+ setup_us = (u32)ktime_to_us(setup_time); -+ if (setup_us == 0) -+ setup_us = 1; -+ -+ trans_time = ktime_sub(t, dsi.perf_start_time); -+ trans_us = (u32)ktime_to_us(trans_time); -+ if (trans_us == 0) -+ trans_us = 1; -+ -+ total_us = setup_us + trans_us; -+ -+ total_bytes = dsi.update_region.w * -+ dsi.update_region.h * -+ dsi.update_region.bytespp; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) { -+ dsi.perf_measure_frames++; -+ -+ if (trans_us < s_min_us) -+ s_min_us = trans_us; -+ -+ if (trans_us > s_max_us) -+ s_max_us = trans_us; -+ -+ s_trans_us += trans_us; -+ -+ if (dsi.perf_measure_frames < numframes) -+ return; -+ -+ DSSINFO("%s update: %d frames in %u us " -+ "(min/max/avg %u/%u/%u), %u fps\n", -+ name, numframes, -+ s_trans_us, -+ s_min_us, -+ s_max_us, -+ s_trans_us / numframes, -+ 1000*1000 / (s_trans_us / numframes)); -+ -+ dsi.perf_measure_frames = 0; -+ s_trans_us = 0; -+ s_min_us = 0xffffffff; -+ s_max_us = 0; -+ } else { -+ DSSINFO("%s update %u us + %u us = %u us (%uHz), %u bytes, " -+ "%u kbytes/sec\n", -+ name, -+ setup_us, -+ trans_us, -+ total_us, -+ 1000*1000 / total_us, -+ total_bytes, -+ total_bytes * 1000 / total_us); -+ } -+} -+#else -+#define perf_mark_setup() -+#define perf_mark_start() -+#define perf_show(x) -+#endif -+ -+static void print_irq_status(u32 status) -+{ -+#ifndef VERBOSE_IRQ -+ if ((status & ~DSI_IRQ_CHANNEL_MASK) == 0) -+ return; -+#endif -+ printk(KERN_DEBUG "DSI IRQ: 0x%x: ", status); -+ -+#define PIS(x) \ -+ if (status & DSI_IRQ_##x) \ -+ printk(#x " "); -+#ifdef VERBOSE_IRQ -+ PIS(VC0); -+ PIS(VC1); -+ PIS(VC2); -+ PIS(VC3); -+#endif -+ PIS(WAKEUP); -+ PIS(RESYNC); -+ PIS(PLL_LOCK); -+ PIS(PLL_UNLOCK); -+ PIS(PLL_RECALL); -+ PIS(COMPLEXIO_ERR); -+ PIS(HS_TX_TIMEOUT); -+ PIS(LP_RX_TIMEOUT); -+ PIS(TE_TRIGGER); -+ PIS(ACK_TRIGGER); -+ PIS(SYNC_LOST); -+ PIS(LDO_POWER_GOOD); -+ PIS(TA_TIMEOUT); -+#undef PIS -+ -+ printk("\n"); -+} -+ -+static void print_irq_status_vc(int channel, u32 status) -+{ -+#ifndef VERBOSE_IRQ -+ if ((status & ~DSI_VC_IRQ_PACKET_SENT) == 0) -+ return; -+#endif -+ printk(KERN_DEBUG "DSI VC(%d) IRQ 0x%x: ", channel, status); -+ -+#define PIS(x) \ -+ if (status & DSI_VC_IRQ_##x) \ -+ printk(#x " "); -+ PIS(CS); -+ PIS(ECC_CORR); -+#ifdef VERBOSE_IRQ -+ PIS(PACKET_SENT); -+#endif -+ PIS(FIFO_TX_OVF); -+ PIS(FIFO_RX_OVF); -+ PIS(BTA); -+ PIS(ECC_NO_CORR); -+ PIS(FIFO_TX_UDF); -+ PIS(PP_BUSY_CHANGE); -+#undef PIS -+ printk("\n"); -+} -+ -+static void print_irq_status_cio(u32 status) -+{ -+ printk(KERN_DEBUG "DSI CIO IRQ 0x%x: ", status); -+ -+#define PIS(x) \ -+ if (status & DSI_CIO_IRQ_##x) \ -+ printk(#x " "); -+ PIS(ERRSYNCESC1); -+ PIS(ERRSYNCESC2); -+ PIS(ERRSYNCESC3); -+ PIS(ERRESC1); -+ PIS(ERRESC2); -+ PIS(ERRESC3); -+ PIS(ERRCONTROL1); -+ PIS(ERRCONTROL2); -+ PIS(ERRCONTROL3); -+ PIS(STATEULPS1); -+ PIS(STATEULPS2); -+ PIS(STATEULPS3); -+ PIS(ERRCONTENTIONLP0_1); -+ PIS(ERRCONTENTIONLP1_1); -+ PIS(ERRCONTENTIONLP0_2); -+ PIS(ERRCONTENTIONLP1_2); -+ PIS(ERRCONTENTIONLP0_3); -+ PIS(ERRCONTENTIONLP1_3); -+ PIS(ULPSACTIVENOT_ALL0); -+ PIS(ULPSACTIVENOT_ALL1); -+#undef PIS -+ -+ printk("\n"); -+} -+ -+static int debug_irq; -+ -+/* called from dss */ -+void dsi_irq_handler(void) -+{ -+ u32 irqstatus, vcstatus, ciostatus; -+ int i; -+ -+ irqstatus = dsi_read_reg(DSI_IRQSTATUS); -+ -+ if (irqstatus & DSI_IRQ_ERROR_MASK) { -+ DSSERR("DSI error, irqstatus %x\n", irqstatus); -+ print_irq_status(irqstatus); -+ } else if (debug_irq) { -+ print_irq_status(irqstatus); -+ } -+ -+ for (i = 0; i < 4; ++i) { -+ if ((irqstatus & (1< 30*1000*1000) -+ REG_FLD_MOD(DSI_CLK_CTRL, 1, 21, 21); /* LP_RX_SYNCHRO_ENABLE */ -+ -+ return 0; -+} -+ -+ -+enum dsi_pll_power_state { -+ DSI_PLL_POWER_OFF = 0x0, -+ DSI_PLL_POWER_ON_HSCLK = 0x1, -+ DSI_PLL_POWER_ON_ALL = 0x2, -+ DSI_PLL_POWER_ON_DIV = 0x3, -+}; -+ -+static int dsi_pll_power(enum dsi_pll_power_state state) -+{ -+ int t = 0; -+ -+ REG_FLD_MOD(DSI_CLK_CTRL, state, 31, 30); /* PLL_PWR_CMD */ -+ -+ /* PLL_PWR_STATUS */ -+ while (FLD_GET(dsi_read_reg(DSI_CLK_CTRL), 29, 28) != state) { -+ udelay(1); -+ if (t++ > 1000) { -+ DSSERR("Failed to set DSI PLL power mode to %d\n", -+ state); -+ return -ENODEV; -+ } -+ } -+ -+ return 0; -+} -+ -+int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck, -+ struct dsi_clock_info *cinfo) -+{ -+ struct dsi_clock_info cur, best; -+ int min_fck_per_pck; -+ int match = 0; -+ -+ if (req_pck == dsi.cache_req_pck && -+ dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) { -+ DSSDBG("DSI clock info found from cache\n"); -+ *cinfo = dsi.cache_cinfo; -+ return 0; -+ } -+ -+ min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; -+ -+ if (min_fck_per_pck && -+ req_pck * min_fck_per_pck > DISPC_MAX_FCK) { -+ DSSERR("Requested pixel clock not possible with the current " -+ "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " -+ "the constraint off.\n"); -+ min_fck_per_pck = 0; -+ } -+ -+ DSSDBG("dsi_pll_calc\n"); -+ -+retry: -+ memset(&best, 0, sizeof(best)); -+ -+ memset(&cur, 0, sizeof(cur)); -+ cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2); -+ cur.use_dss2_fck = 1; -+ cur.highfreq = 0; -+ -+ /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ -+ /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ -+ /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ -+ for (cur.regn = 1; cur.regn < REGN_MAX; ++cur.regn) { -+ if (cur.highfreq == 0) -+ cur.fint = cur.clkin / cur.regn; -+ else -+ cur.fint = cur.clkin / (2 * cur.regn); -+ -+ if (cur.fint > FINT_MAX || cur.fint < FINT_MIN) -+ continue; -+ -+ /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ -+ for (cur.regm = 1; cur.regm < REGM_MAX; ++cur.regm) { -+ unsigned long a, b; -+ -+ a = 2 * cur.regm * (cur.clkin/1000); -+ b = cur.regn * (cur.highfreq + 1); -+ cur.dsiphy = a / b * 1000; -+ -+ if (cur.dsiphy > 1800 * 1000 * 1000) -+ break; -+ -+ /* DSI1_PLL_FCLK(MHz) = DSIPHY(MHz) / regm3 < 173MHz */ -+ for (cur.regm3 = 1; cur.regm3 < REGM3_MAX; -+ ++cur.regm3) { -+ cur.dsi1_pll_fclk = cur.dsiphy / cur.regm3; -+ -+ /* this will narrow down the search a bit, -+ * but still give pixclocks below what was -+ * requested */ -+ if (cur.dsi1_pll_fclk < req_pck) -+ break; -+ -+ if (cur.dsi1_pll_fclk > DISPC_MAX_FCK) -+ continue; -+ -+ if (min_fck_per_pck && -+ cur.dsi1_pll_fclk < -+ req_pck * min_fck_per_pck) -+ continue; -+ -+ match = 1; -+ -+ find_lck_pck_divs(is_tft, req_pck, -+ cur.dsi1_pll_fclk, -+ &cur.lck_div, -+ &cur.pck_div); -+ -+ cur.lck = cur.dsi1_pll_fclk / cur.lck_div; -+ cur.pck = cur.lck / cur.pck_div; -+ -+ if (abs(cur.pck - req_pck) < -+ abs(best.pck - req_pck)) { -+ best = cur; -+ -+ if (cur.pck == req_pck) -+ goto found; -+ } -+ } -+ } -+ } -+found: -+ if (!match) { -+ if (min_fck_per_pck) { -+ DSSERR("Could not find suitable clock settings.\n" -+ "Turning FCK/PCK constraint off and" -+ "trying again.\n"); -+ min_fck_per_pck = 0; -+ goto retry; -+ } -+ -+ DSSERR("Could not find suitable clock settings.\n"); -+ -+ return -EINVAL; -+ } -+ -+ /* DSI2_PLL_FCLK (regm4) is not used. Set it to something sane. */ -+ best.regm4 = best.dsiphy / 48000000; -+ if (best.regm4 > REGM4_MAX) -+ best.regm4 = REGM4_MAX; -+ else if (best.regm4 == 0) -+ best.regm4 = 1; -+ best.dsi2_pll_fclk = best.dsiphy / best.regm4; -+ -+ if (cinfo) -+ *cinfo = best; -+ -+ dsi.cache_req_pck = req_pck; -+ dsi.cache_clk_freq = 0; -+ dsi.cache_cinfo = best; -+ -+ return 0; -+} -+ -+static int dsi_pll_calc_ddrfreq(unsigned long clk_freq, -+ struct dsi_clock_info *cinfo) -+{ -+ struct dsi_clock_info cur, best; -+ const bool use_dss2_fck = 1; -+ unsigned long datafreq; -+ -+ DSSDBG("dsi_pll_calc_ddrfreq\n"); -+ -+ if (clk_freq == dsi.cache_clk_freq && -+ dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) { -+ DSSDBG("DSI clock info found from cache\n"); -+ *cinfo = dsi.cache_cinfo; -+ return 0; -+ } -+ -+ datafreq = clk_freq * 4; -+ -+ memset(&best, 0, sizeof(best)); -+ -+ memset(&cur, 0, sizeof(cur)); -+ cur.use_dss2_fck = use_dss2_fck; -+ if (use_dss2_fck) { -+ cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2); -+ cur.highfreq = 0; -+ } else { -+ cur.clkin = dispc_pclk_rate(); -+ if (cur.clkin < 32000000) -+ cur.highfreq = 0; -+ else -+ cur.highfreq = 1; -+ } -+ -+ /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ -+ /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ -+ /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ -+ for (cur.regn = 1; cur.regn < REGN_MAX; ++cur.regn) { -+ if (cur.highfreq == 0) -+ cur.fint = cur.clkin / cur.regn; -+ else -+ cur.fint = cur.clkin / (2 * cur.regn); -+ -+ if (cur.fint > FINT_MAX || cur.fint < FINT_MIN) -+ continue; -+ -+ /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ -+ for (cur.regm = 1; cur.regm < REGM_MAX; ++cur.regm) { -+ unsigned long a, b; -+ -+ a = 2 * cur.regm * (cur.clkin/1000); -+ b = cur.regn * (cur.highfreq + 1); -+ cur.dsiphy = a / b * 1000; -+ -+ if (cur.dsiphy > 1800 * 1000 * 1000) -+ break; -+ -+ if (abs(cur.dsiphy - datafreq) < -+ abs(best.dsiphy - datafreq)) { -+ best = cur; -+ /* DSSDBG("best %ld\n", best.dsiphy); */ -+ } -+ -+ if (cur.dsiphy == datafreq) -+ goto found; -+ } -+ } -+found: -+ /* DSI1_PLL_FCLK (regm3) is not used. Set it to something sane. */ -+ best.regm3 = best.dsiphy / 48000000; -+ if (best.regm3 > REGM3_MAX) -+ best.regm3 = REGM3_MAX; -+ else if (best.regm3 == 0) -+ best.regm3 = 1; -+ best.dsi1_pll_fclk = best.dsiphy / best.regm3; -+ -+ /* DSI2_PLL_FCLK (regm4) is not used. Set it to something sane. */ -+ best.regm4 = best.dsiphy / 48000000; -+ if (best.regm4 > REGM4_MAX) -+ best.regm4 = REGM4_MAX; -+ else if (best.regm4 == 0) -+ best.regm4 = 1; -+ best.dsi2_pll_fclk = best.dsiphy / best.regm4; -+ -+ if (cinfo) -+ *cinfo = best; -+ -+ dsi.cache_clk_freq = clk_freq; -+ dsi.cache_req_pck = 0; -+ dsi.cache_cinfo = best; -+ -+ return 0; -+} -+ -+int dsi_pll_program(struct dsi_clock_info *cinfo) -+{ -+ int r = 0; -+ u32 l; -+ -+ DSSDBG("dsi_pll_program\n"); -+ -+ dsi.dsiphy = cinfo->dsiphy; -+ dsi.ddr_clk = dsi.dsiphy / 4; -+ dsi.dsi1_pll_fclk = cinfo->dsi1_pll_fclk; -+ dsi.dsi2_pll_fclk = cinfo->dsi2_pll_fclk; -+ -+ DSSDBG("DSI Fint %ld\n", cinfo->fint); -+ -+ DSSDBG("clkin (%s) rate %ld, highfreq %d\n", -+ cinfo->use_dss2_fck ? "dss2_fck" : "pclkfree", -+ cinfo->clkin, -+ cinfo->highfreq); -+ -+ /* DSIPHY == CLKIN4DDR */ -+ DSSDBG("DSIPHY = 2 * %d / %d * %lu / %d = %lu\n", -+ cinfo->regm, -+ cinfo->regn, -+ cinfo->clkin, -+ cinfo->highfreq + 1, -+ cinfo->dsiphy); -+ -+ DSSDBG("Data rate on 1 DSI lane %ld Mbps\n", -+ dsi.dsiphy / 1000 / 1000 / 2); -+ -+ DSSDBG("Clock lane freq %ld Hz\n", dsi.ddr_clk); -+ -+ DSSDBG("regm3 = %d, dsi1_pll_fclk = %lu\n", -+ cinfo->regm3, cinfo->dsi1_pll_fclk); -+ DSSDBG("regm4 = %d, dsi2_pll_fclk = %lu\n", -+ cinfo->regm4, cinfo->dsi2_pll_fclk); -+ -+ REG_FLD_MOD(DSI_PLL_CONTROL, 0, 0, 0); /* DSI_PLL_AUTOMODE = manual */ -+ -+ l = dsi_read_reg(DSI_PLL_CONFIGURATION1); -+ l = FLD_MOD(l, 1, 0, 0); /* DSI_PLL_STOPMODE */ -+ l = FLD_MOD(l, cinfo->regn - 1, 7, 1); /* DSI_PLL_REGN */ -+ l = FLD_MOD(l, cinfo->regm, 18, 8); /* DSI_PLL_REGM */ -+ l = FLD_MOD(l, cinfo->regm3 - 1, 22, 19); /* DSI_CLOCK_DIV */ -+ l = FLD_MOD(l, cinfo->regm4 - 1, 26, 23); /* DSIPROTO_CLOCK_DIV */ -+ dsi_write_reg(DSI_PLL_CONFIGURATION1, l); -+ -+ l = dsi_read_reg(DSI_PLL_CONFIGURATION2); -+ l = FLD_MOD(l, 7, 4, 1); /* DSI_PLL_FREQSEL */ -+ /* DSI_PLL_CLKSEL */ -+ l = FLD_MOD(l, cinfo->use_dss2_fck ? 0 : 1, 11, 11); -+ l = FLD_MOD(l, cinfo->highfreq, 12, 12); /* DSI_PLL_HIGHFREQ */ -+ l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ -+ l = FLD_MOD(l, 0, 14, 14); /* DSIPHY_CLKINEN */ -+ l = FLD_MOD(l, 1, 20, 20); /* DSI_HSDIVBYPASS */ -+ dsi_write_reg(DSI_PLL_CONFIGURATION2, l); -+ -+ REG_FLD_MOD(DSI_PLL_GO, 1, 0, 0); /* DSI_PLL_GO */ -+ -+ if (wait_for_bit_change(DSI_PLL_GO, 0, 0) != 0) { -+ DSSERR("dsi pll go bit not going down.\n"); -+ r = -EIO; -+ goto err; -+ } -+ -+ if (wait_for_bit_change(DSI_PLL_STATUS, 1, 1) != 1) { -+ DSSERR("cannot lock PLL\n"); -+ r = -EIO; -+ goto err; -+ } -+ -+ dsi.pll_locked = 1; -+ -+ l = dsi_read_reg(DSI_PLL_CONFIGURATION2); -+ l = FLD_MOD(l, 0, 0, 0); /* DSI_PLL_IDLE */ -+ l = FLD_MOD(l, 0, 5, 5); /* DSI_PLL_PLLLPMODE */ -+ l = FLD_MOD(l, 0, 6, 6); /* DSI_PLL_LOWCURRSTBY */ -+ l = FLD_MOD(l, 0, 7, 7); /* DSI_PLL_TIGHTPHASELOCK */ -+ l = FLD_MOD(l, 0, 8, 8); /* DSI_PLL_DRIFTGUARDEN */ -+ l = FLD_MOD(l, 0, 10, 9); /* DSI_PLL_LOCKSEL */ -+ l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ -+ l = FLD_MOD(l, 1, 14, 14); /* DSIPHY_CLKINEN */ -+ l = FLD_MOD(l, 0, 15, 15); /* DSI_BYPASSEN */ -+ l = FLD_MOD(l, 1, 16, 16); /* DSS_CLOCK_EN */ -+ l = FLD_MOD(l, 0, 17, 17); /* DSS_CLOCK_PWDN */ -+ l = FLD_MOD(l, 1, 18, 18); /* DSI_PROTO_CLOCK_EN */ -+ l = FLD_MOD(l, 0, 19, 19); /* DSI_PROTO_CLOCK_PWDN */ -+ l = FLD_MOD(l, 0, 20, 20); /* DSI_HSDIVBYPASS */ -+ dsi_write_reg(DSI_PLL_CONFIGURATION2, l); -+ -+ DSSDBG("PLL config done\n"); -+err: -+ return r; -+} -+ -+int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv) -+{ -+ int r = 0; -+ enum dsi_pll_power_state pwstate; -+ struct dispc_clock_info cinfo; -+ -+ DSSDBG("PLL init\n"); -+ -+ enable_clocks(1); -+ dsi_enable_pll_clock(1); -+ -+ /* configure dispc fck and pixel clock to something sane */ -+ r = dispc_calc_clock_div(1, 48 * 1000 * 1000, &cinfo); -+ if (r) -+ goto err0; -+ -+ r = dispc_set_clock_div(&cinfo); -+ if (r) { -+ DSSERR("Failed to set basic clocks\n"); -+ goto err0; -+ } -+ -+ r = dss_dsi_power_up(); -+ if (r) -+ goto err0; -+ -+ /* PLL does not come out of reset without this... */ -+ dispc_pck_free_enable(1); -+ -+ if (wait_for_bit_change(DSI_PLL_STATUS, 0, 1) != 1) { -+ DSSERR("PLL not coming out of reset.\n"); -+ r = -ENODEV; -+ goto err1; -+ } -+ -+ /* ... but if left on, we get problems when planes do not -+ * fill the whole display. No idea about this XXX */ -+ dispc_pck_free_enable(0); -+ -+ if (enable_hsclk && enable_hsdiv) -+ pwstate = DSI_PLL_POWER_ON_ALL; -+ else if (enable_hsclk) -+ pwstate = DSI_PLL_POWER_ON_HSCLK; -+ else if (enable_hsdiv) -+ pwstate = DSI_PLL_POWER_ON_DIV; -+ else -+ pwstate = DSI_PLL_POWER_OFF; -+ -+ r = dsi_pll_power(pwstate); -+ -+ if (r) -+ goto err1; -+ -+ DSSDBG("PLL init done\n"); -+ -+ return 0; -+err1: -+ dss_dsi_power_down(); -+err0: -+ enable_clocks(0); -+ dsi_enable_pll_clock(0); -+ return r; -+} -+ -+void dsi_pll_uninit(void) -+{ -+ enable_clocks(0); -+ dsi_enable_pll_clock(0); -+ -+ dsi.pll_locked = 0; -+ dsi_pll_power(DSI_PLL_POWER_OFF); -+ dss_dsi_power_down(); -+ DSSDBG("PLL uninit done\n"); -+} -+ -+unsigned long dsi_get_dsi1_pll_rate(void) -+{ -+ return dsi.dsi1_pll_fclk; -+} -+ -+unsigned long dsi_get_dsi2_pll_rate(void) -+{ -+ return dsi.dsi2_pll_fclk; -+} -+ -+void dsi_dump_clocks(struct seq_file *s) -+{ -+ int clksel; -+ -+ enable_clocks(1); -+ -+ clksel = REG_GET(DSI_PLL_CONFIGURATION2, 11, 11); -+ -+ seq_printf(s, "- dsi -\n"); -+ -+ seq_printf(s, "dsi fclk source = %s\n", -+ dss_get_dsi_clk_source() == 0 ? -+ "dss1_alwon_fclk" : "dsi2_pll_fclk"); -+ -+ seq_printf(s, "dsi pll source = %s\n", -+ clksel == 0 ? -+ "dss2_alwon_fclk" : "pclkfree"); -+ -+ seq_printf(s, "DSIPHY\t\t%lu\nDDR_CLK\t\t%lu\n", -+ dsi.dsiphy, dsi.ddr_clk); -+ -+ seq_printf(s, "dsi1_pll_fck\t%lu (%s)\n" -+ "dsi2_pll_fck\t%lu (%s)\n", -+ dsi.dsi1_pll_fclk, -+ dss_get_dispc_clk_source() == 0 ? "off" : "on", -+ dsi.dsi2_pll_fclk, -+ dss_get_dsi_clk_source() == 0 ? "off" : "on"); -+ -+ enable_clocks(0); -+} -+ -+void dsi_dump_regs(struct seq_file *s) -+{ -+#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(r)) -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ DUMPREG(DSI_REVISION); -+ DUMPREG(DSI_SYSCONFIG); -+ DUMPREG(DSI_SYSSTATUS); -+ DUMPREG(DSI_IRQSTATUS); -+ DUMPREG(DSI_IRQENABLE); -+ DUMPREG(DSI_CTRL); -+ DUMPREG(DSI_COMPLEXIO_CFG1); -+ DUMPREG(DSI_COMPLEXIO_IRQ_STATUS); -+ DUMPREG(DSI_COMPLEXIO_IRQ_ENABLE); -+ DUMPREG(DSI_CLK_CTRL); -+ DUMPREG(DSI_TIMING1); -+ DUMPREG(DSI_TIMING2); -+ DUMPREG(DSI_VM_TIMING1); -+ DUMPREG(DSI_VM_TIMING2); -+ DUMPREG(DSI_VM_TIMING3); -+ DUMPREG(DSI_CLK_TIMING); -+ DUMPREG(DSI_TX_FIFO_VC_SIZE); -+ DUMPREG(DSI_RX_FIFO_VC_SIZE); -+ DUMPREG(DSI_COMPLEXIO_CFG2); -+ DUMPREG(DSI_RX_FIFO_VC_FULLNESS); -+ DUMPREG(DSI_VM_TIMING4); -+ DUMPREG(DSI_TX_FIFO_VC_EMPTINESS); -+ DUMPREG(DSI_VM_TIMING5); -+ DUMPREG(DSI_VM_TIMING6); -+ DUMPREG(DSI_VM_TIMING7); -+ DUMPREG(DSI_STOPCLK_TIMING); -+ -+ DUMPREG(DSI_VC_CTRL(0)); -+ DUMPREG(DSI_VC_TE(0)); -+ DUMPREG(DSI_VC_LONG_PACKET_HEADER(0)); -+ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(0)); -+ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(0)); -+ DUMPREG(DSI_VC_IRQSTATUS(0)); -+ DUMPREG(DSI_VC_IRQENABLE(0)); -+ -+ DUMPREG(DSI_VC_CTRL(1)); -+ DUMPREG(DSI_VC_TE(1)); -+ DUMPREG(DSI_VC_LONG_PACKET_HEADER(1)); -+ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(1)); -+ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(1)); -+ DUMPREG(DSI_VC_IRQSTATUS(1)); -+ DUMPREG(DSI_VC_IRQENABLE(1)); -+ -+ DUMPREG(DSI_VC_CTRL(2)); -+ DUMPREG(DSI_VC_TE(2)); -+ DUMPREG(DSI_VC_LONG_PACKET_HEADER(2)); -+ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(2)); -+ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(2)); -+ DUMPREG(DSI_VC_IRQSTATUS(2)); -+ DUMPREG(DSI_VC_IRQENABLE(2)); -+ -+ DUMPREG(DSI_VC_CTRL(3)); -+ DUMPREG(DSI_VC_TE(3)); -+ DUMPREG(DSI_VC_LONG_PACKET_HEADER(3)); -+ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(3)); -+ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(3)); -+ DUMPREG(DSI_VC_IRQSTATUS(3)); -+ DUMPREG(DSI_VC_IRQENABLE(3)); -+ -+ DUMPREG(DSI_DSIPHY_CFG0); -+ DUMPREG(DSI_DSIPHY_CFG1); -+ DUMPREG(DSI_DSIPHY_CFG2); -+ DUMPREG(DSI_DSIPHY_CFG5); -+ -+ DUMPREG(DSI_PLL_CONTROL); -+ DUMPREG(DSI_PLL_STATUS); -+ DUMPREG(DSI_PLL_GO); -+ DUMPREG(DSI_PLL_CONFIGURATION1); -+ DUMPREG(DSI_PLL_CONFIGURATION2); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+#undef DUMPREG -+} -+ -+enum dsi_complexio_power_state { -+ DSI_COMPLEXIO_POWER_OFF = 0x0, -+ DSI_COMPLEXIO_POWER_ON = 0x1, -+ DSI_COMPLEXIO_POWER_ULPS = 0x2, -+}; -+ -+static int dsi_complexio_power(enum dsi_complexio_power_state state) -+{ -+ int t = 0; -+ -+ /* PWR_CMD */ -+ REG_FLD_MOD(DSI_COMPLEXIO_CFG1, state, 28, 27); -+ -+ /* PWR_STATUS */ -+ while (FLD_GET(dsi_read_reg(DSI_COMPLEXIO_CFG1), 26, 25) != state) { -+ udelay(1); -+ if (t++ > 1000) { -+ DSSERR("failed to set complexio power state to " -+ "%d\n", state); -+ return -ENODEV; -+ } -+ } -+ -+ return 0; -+} -+ -+static void dsi_complexio_config(struct omap_display *display) -+{ -+ u32 r; -+ -+ int clk_lane = display->hw_config.u.dsi.clk_lane; -+ int data1_lane = display->hw_config.u.dsi.data1_lane; -+ int data2_lane = display->hw_config.u.dsi.data2_lane; -+ int clk_pol = display->hw_config.u.dsi.clk_pol; -+ int data1_pol = display->hw_config.u.dsi.data1_pol; -+ int data2_pol = display->hw_config.u.dsi.data2_pol; -+ -+ r = dsi_read_reg(DSI_COMPLEXIO_CFG1); -+ r = FLD_MOD(r, clk_lane, 2, 0); -+ r = FLD_MOD(r, clk_pol, 3, 3); -+ r = FLD_MOD(r, data1_lane, 6, 4); -+ r = FLD_MOD(r, data1_pol, 7, 7); -+ r = FLD_MOD(r, data2_lane, 10, 8); -+ r = FLD_MOD(r, data2_pol, 11, 11); -+ dsi_write_reg(DSI_COMPLEXIO_CFG1, r); -+ -+ /* The configuration of the DSI complex I/O (number of data lanes, -+ position, differential order) should not be changed while -+ DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. In order for -+ the hardware to take into account a new configuration of the complex -+ I/O (done in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to -+ follow this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1, -+ then reset the DSS.DSI_CTRL[0] IF_EN to 0, then set -+ DSS.DSI_CLK_CTRL[20] LP_CLK_ENABLE to 1 and finally set again the -+ DSS.DSI_CTRL[0] IF_EN bit to 1. If the sequence is not followed, the -+ DSI complex I/O configuration is unknown. */ -+ -+ /* -+ REG_FLD_MOD(DSI_CTRL, 1, 0, 0); -+ REG_FLD_MOD(DSI_CTRL, 0, 0, 0); -+ REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20); -+ REG_FLD_MOD(DSI_CTRL, 1, 0, 0); -+ */ -+} -+ -+static inline unsigned ns2ddr(unsigned ns) -+{ -+ /* convert time in ns to ddr ticks, rounding up */ -+ return (ns * (dsi.ddr_clk/1000/1000) + 999) / 1000; -+} -+ -+static inline unsigned ddr2ns(unsigned ddr) -+{ -+ return ddr * 1000 * 1000 / (dsi.ddr_clk / 1000); -+} -+ -+static void dsi_complexio_timings(void) -+{ -+ u32 r; -+ u32 ths_prepare, ths_prepare_ths_zero, ths_trail, ths_exit; -+ u32 tlpx_half, tclk_trail, tclk_zero; -+ u32 tclk_prepare; -+ -+ /* calculate timings */ -+ -+ /* 1 * DDR_CLK = 2 * UI */ -+ -+ /* min 40ns + 4*UI max 85ns + 6*UI */ -+ ths_prepare = ns2ddr(59) + 2; -+ -+ /* min 145ns + 10*UI */ -+ ths_prepare_ths_zero = ns2ddr(145) + 5; -+ -+ /* min max(8*UI, 60ns+4*UI) */ -+ ths_trail = max((unsigned)4, ns2ddr(60) + 2); -+ -+ /* min 100ns */ -+ ths_exit = ns2ddr(100); -+ -+ /* tlpx min 50n */ -+ tlpx_half = ns2ddr(25); -+ -+ /* min 60ns */ -+ tclk_trail = ns2ddr(60); -+ -+ /* min 38ns, max 95ns */ -+ tclk_prepare = ns2ddr(38); -+ -+ /* min tclk-prepare + tclk-zero = 300ns */ -+ tclk_zero = ns2ddr(300 - 38); -+ -+ DSSDBG("ths_prepare %u (%uns), ths_prepare_ths_zero %u (%uns)\n", -+ ths_prepare, ddr2ns(ths_prepare), -+ ths_prepare_ths_zero, ddr2ns(ths_prepare_ths_zero)); -+ DSSDBG("ths_trail %u (%uns), ths_exit %u (%uns)\n", -+ ths_trail, ddr2ns(ths_trail), -+ ths_exit, ddr2ns(ths_exit)); -+ -+ DSSDBG("tlpx_half %u (%uns), tclk_trail %u (%uns), " -+ "tclk_zero %u (%uns)\n", -+ tlpx_half, ddr2ns(tlpx_half), -+ tclk_trail, ddr2ns(tclk_trail), -+ tclk_zero, ddr2ns(tclk_zero)); -+ DSSDBG("tclk_prepare %u (%uns)\n", -+ tclk_prepare, ddr2ns(tclk_prepare)); -+ -+ /* program timings */ -+ -+ r = dsi_read_reg(DSI_DSIPHY_CFG0); -+ r = FLD_MOD(r, ths_prepare, 31, 24); -+ r = FLD_MOD(r, ths_prepare_ths_zero, 23, 16); -+ r = FLD_MOD(r, ths_trail, 15, 8); -+ r = FLD_MOD(r, ths_exit, 7, 0); -+ dsi_write_reg(DSI_DSIPHY_CFG0, r); -+ -+ r = dsi_read_reg(DSI_DSIPHY_CFG1); -+ r = FLD_MOD(r, tlpx_half, 22, 16); -+ r = FLD_MOD(r, tclk_trail, 15, 8); -+ r = FLD_MOD(r, tclk_zero, 7, 0); -+ dsi_write_reg(DSI_DSIPHY_CFG1, r); -+ -+ r = dsi_read_reg(DSI_DSIPHY_CFG2); -+ r = FLD_MOD(r, tclk_prepare, 7, 0); -+ dsi_write_reg(DSI_DSIPHY_CFG2, r); -+} -+ -+ -+static int dsi_complexio_init(struct omap_display *display) -+{ -+ int r = 0; -+ -+ DSSDBG("dsi_complexio_init\n"); -+ -+ /* CIO_CLK_ICG, enable L3 clk to CIO */ -+ REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14); -+ -+ /* A dummy read using the SCP interface to any DSIPHY register is -+ * required after DSIPHY reset to complete the reset of the DSI complex -+ * I/O. */ -+ dsi_read_reg(DSI_DSIPHY_CFG5); -+ -+ if (wait_for_bit_change(DSI_DSIPHY_CFG5, 30, 1) != 1) { -+ DSSERR("ComplexIO PHY not coming out of reset.\n"); -+ r = -ENODEV; -+ goto err; -+ } -+ -+ dsi_complexio_config(display); -+ -+ r = dsi_complexio_power(DSI_COMPLEXIO_POWER_ON); -+ -+ if (r) -+ goto err; -+ -+ if (wait_for_bit_change(DSI_COMPLEXIO_CFG1, 29, 1) != 1) { -+ DSSERR("ComplexIO not coming out of reset.\n"); -+ r = -ENODEV; -+ goto err; -+ } -+ -+ if (wait_for_bit_change(DSI_COMPLEXIO_CFG1, 21, 1) != 1) { -+ DSSERR("ComplexIO LDO power down.\n"); -+ r = -ENODEV; -+ goto err; -+ } -+ -+ dsi_complexio_timings(); -+ -+ /* -+ The configuration of the DSI complex I/O (number of data lanes, -+ position, differential order) should not be changed while -+ DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. For the -+ hardware to recognize a new configuration of the complex I/O (done -+ in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to follow -+ this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1, next -+ reset the DSS.DSI_CTRL[0] IF_EN to 0, then set DSS.DSI_CLK_CTRL[20] -+ LP_CLK_ENABLE to 1, and finally, set again the DSS.DSI_CTRL[0] IF_EN -+ bit to 1. If the sequence is not followed, the DSi complex I/O -+ configuration is undetermined. -+ */ -+ dsi_if_enable(1); -+ dsi_if_enable(0); -+ REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */ -+ dsi_if_enable(1); -+ dsi_if_enable(0); -+ -+ DSSDBG("CIO init done\n"); -+err: -+ return r; -+} -+ -+static void dsi_complexio_uninit(void) -+{ -+ dsi_complexio_power(DSI_COMPLEXIO_POWER_OFF); -+} -+ -+static int _dsi_wait_reset(void) -+{ -+ int i = 0; -+ -+ while (REG_GET(DSI_SYSSTATUS, 0, 0) == 0) { -+ if (i++ > 5) { -+ DSSERR("soft reset failed\n"); -+ return -ENODEV; -+ } -+ udelay(1); -+ } -+ -+ return 0; -+} -+ -+static int _dsi_reset(void) -+{ -+ /* Soft reset */ -+ REG_FLD_MOD(DSI_SYSCONFIG, 1, 1, 1); -+ return _dsi_wait_reset(); -+} -+ -+ -+static void dsi_config_tx_fifo(enum fifo_size size1, enum fifo_size size2, -+ enum fifo_size size3, enum fifo_size size4) -+{ -+ u32 r = 0; -+ int add = 0; -+ int i; -+ -+ dsi.vc[0].fifo_size = size1; -+ dsi.vc[1].fifo_size = size2; -+ dsi.vc[2].fifo_size = size3; -+ dsi.vc[3].fifo_size = size4; -+ -+ for (i = 0; i < 4; i++) { -+ u8 v; -+ int size = dsi.vc[i].fifo_size; -+ -+ if (add + size > 4) { -+ DSSERR("Illegal FIFO configuration\n"); -+ BUG(); -+ } -+ -+ v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); -+ r |= v << (8 * i); -+ /*DSSDBG("TX FIFO vc %d: size %d, add %d\n", i, size, add); */ -+ add += size; -+ } -+ -+ dsi_write_reg(DSI_TX_FIFO_VC_SIZE, r); -+} -+ -+static void dsi_config_rx_fifo(enum fifo_size size1, enum fifo_size size2, -+ enum fifo_size size3, enum fifo_size size4) -+{ -+ u32 r = 0; -+ int add = 0; -+ int i; -+ -+ dsi.vc[0].fifo_size = size1; -+ dsi.vc[1].fifo_size = size2; -+ dsi.vc[2].fifo_size = size3; -+ dsi.vc[3].fifo_size = size4; -+ -+ for (i = 0; i < 4; i++) { -+ u8 v; -+ int size = dsi.vc[i].fifo_size; -+ -+ if (add + size > 4) { -+ DSSERR("Illegal FIFO configuration\n"); -+ BUG(); -+ } -+ -+ v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); -+ r |= v << (8 * i); -+ /*DSSDBG("RX FIFO vc %d: size %d, add %d\n", i, size, add); */ -+ add += size; -+ } -+ -+ dsi_write_reg(DSI_RX_FIFO_VC_SIZE, r); -+} -+ -+static int dsi_force_tx_stop_mode_io(void) -+{ -+ u32 r; -+ -+ r = dsi_read_reg(DSI_TIMING1); -+ r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ -+ dsi_write_reg(DSI_TIMING1, r); -+ -+ if (wait_for_bit_change(DSI_TIMING1, 15, 0) != 0) { -+ DSSERR("TX_STOP bit not going down\n"); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static void dsi_vc_print_status(int channel) -+{ -+ u32 r; -+ -+ r = dsi_read_reg(DSI_VC_CTRL(channel)); -+ DSSDBG("vc %d: TX_FIFO_NOT_EMPTY %d, BTA_EN %d, VC_BUSY %d, " -+ "TX_FIFO_FULL %d, RX_FIFO_NOT_EMPTY %d, ", -+ channel, -+ FLD_GET(r, 5, 5), -+ FLD_GET(r, 6, 6), -+ FLD_GET(r, 15, 15), -+ FLD_GET(r, 16, 16), -+ FLD_GET(r, 20, 20)); -+ -+ r = dsi_read_reg(DSI_TX_FIFO_VC_EMPTINESS); -+ DSSDBG("EMPTINESS %d\n", (r >> (8 * channel)) & 0xff); -+} -+ -+static void dsi_vc_config(int channel) -+{ -+ u32 r; -+ -+ DSSDBG("dsi_vc_config %d\n", channel); -+ -+ r = dsi_read_reg(DSI_VC_CTRL(channel)); -+ -+ r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */ -+ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ -+ r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */ -+ r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */ -+ r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */ -+ r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */ -+ r = FLD_MOD(r, 0, 9, 9); /* MODE_SPEED, high speed on/off */ -+ -+ r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ -+ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ -+ -+ dsi_write_reg(DSI_VC_CTRL(channel), r); -+} -+ -+static void dsi_vc_config_vp(int channel) -+{ -+ u32 r; -+ -+ DSSDBG("dsi_vc_config_vp\n"); -+ -+ r = dsi_read_reg(DSI_VC_CTRL(channel)); -+ -+ r = FLD_MOD(r, 1, 1, 1); /* SOURCE, 1 = video port */ -+ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ -+ r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */ -+ r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */ -+ r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */ -+ r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */ -+ r = FLD_MOD(r, 1, 9, 9); /* MODE_SPEED, high speed on/off */ -+ -+ r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ -+ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ -+ -+ dsi_write_reg(DSI_VC_CTRL(channel), r); -+} -+ -+ -+static int dsi_vc_enable(int channel, bool enable) -+{ -+ DSSDBG("dsi_vc_enable channel %d, enable %d\n", channel, enable); -+ -+ enable = enable ? 1 : 0; -+ -+ REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 0, 0); -+ -+ if (wait_for_bit_change(DSI_VC_CTRL(channel), 0, enable) != enable) { -+ DSSERR("Failed to set dsi_vc_enable to %d\n", enable); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static void dsi_vc_enable_hs(int channel, bool enable) -+{ -+ DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable); -+ -+ dsi_vc_enable(channel, 0); -+ dsi_if_enable(0); -+ -+ REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 9, 9); -+ -+ dsi_vc_enable(channel, 1); -+ dsi_if_enable(1); -+ -+ dsi_force_tx_stop_mode_io(); -+} -+ -+static void dsi_vc_flush_long_data(int channel) -+{ -+ while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { -+ u32 val; -+ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); -+ DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n", -+ (val >> 0) & 0xff, -+ (val >> 8) & 0xff, -+ (val >> 16) & 0xff, -+ (val >> 24) & 0xff); -+ } -+} -+ -+static void dsi_show_rx_ack_with_err(u16 err) -+{ -+ DSSERR("\tACK with ERROR (%#x):\n", err); -+ if (err & (1 << 0)) -+ DSSERR("\t\tSoT Error\n"); -+ if (err & (1 << 1)) -+ DSSERR("\t\tSoT Sync Error\n"); -+ if (err & (1 << 2)) -+ DSSERR("\t\tEoT Sync Error\n"); -+ if (err & (1 << 3)) -+ DSSERR("\t\tEscape Mode Entry Command Error\n"); -+ if (err & (1 << 4)) -+ DSSERR("\t\tLP Transmit Sync Error\n"); -+ if (err & (1 << 5)) -+ DSSERR("\t\tHS Receive Timeout Error\n"); -+ if (err & (1 << 6)) -+ DSSERR("\t\tFalse Control Error\n"); -+ if (err & (1 << 7)) -+ DSSERR("\t\t(reserved7)\n"); -+ if (err & (1 << 8)) -+ DSSERR("\t\tECC Error, single-bit (corrected)\n"); -+ if (err & (1 << 9)) -+ DSSERR("\t\tECC Error, multi-bit (not corrected)\n"); -+ if (err & (1 << 10)) -+ DSSERR("\t\tChecksum Error\n"); -+ if (err & (1 << 11)) -+ DSSERR("\t\tData type not recognized\n"); -+ if (err & (1 << 12)) -+ DSSERR("\t\tInvalid VC ID\n"); -+ if (err & (1 << 13)) -+ DSSERR("\t\tInvalid Transmission Length\n"); -+ if (err & (1 << 14)) -+ DSSERR("\t\t(reserved14)\n"); -+ if (err & (1 << 15)) -+ DSSERR("\t\tDSI Protocol Violation\n"); -+} -+ -+static u16 dsi_vc_flush_receive_data(int channel) -+{ -+ /* RX_FIFO_NOT_EMPTY */ -+ while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { -+ u32 val; -+ u8 dt; -+ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); -+ DSSDBG("\trawval %#08x\n", val); -+ dt = FLD_GET(val, 5, 0); -+ if (dt == DSI_DT_RX_ACK_WITH_ERR) { -+ u16 err = FLD_GET(val, 23, 8); -+ dsi_show_rx_ack_with_err(err); -+ } else if (dt == DSI_DT_RX_SHORT_READ_1) { -+ DSSDBG("\tDCS short response, 1 byte: %#x\n", -+ FLD_GET(val, 23, 8)); -+ } else if (dt == DSI_DT_RX_SHORT_READ_2) { -+ DSSDBG("\tDCS short response, 2 byte: %#x\n", -+ FLD_GET(val, 23, 8)); -+ } else if (dt == DSI_DT_RX_DCS_LONG_READ) { -+ DSSDBG("\tDCS long response, len %d\n", -+ FLD_GET(val, 23, 8)); -+ dsi_vc_flush_long_data(channel); -+ } else { -+ DSSERR("\tunknown datatype 0x%02x\n", dt); -+ } -+ } -+ return 0; -+} -+ -+static int dsi_vc_send_bta(int channel) -+{ -+ unsigned long tmo; -+ -+ /*DSSDBG("dsi_vc_send_bta_sync %d\n", channel); */ -+ -+ if (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { /* RX_FIFO_NOT_EMPTY */ -+ DSSERR("rx fifo not empty when sending BTA, dumping data:\n"); -+ dsi_vc_flush_receive_data(channel); -+ } -+ -+ REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */ -+ -+ tmo = jiffies + msecs_to_jiffies(10); -+ while (REG_GET(DSI_VC_CTRL(channel), 6, 6) == 1) { -+ if (time_after(jiffies, tmo)) { -+ DSSERR("Failed to send BTA\n"); -+ return -EIO; -+ } -+ } -+ -+ return 0; -+} -+ -+static int dsi_vc_send_bta_sync(int channel) -+{ -+ int r = 0; -+ -+ init_completion(&dsi.bta_completion); -+ -+ dsi_vc_enable_bta_irq(channel); -+ -+ r = dsi_vc_send_bta(channel); -+ if (r) -+ goto err; -+ -+ if (wait_for_completion_timeout(&dsi.bta_completion, -+ msecs_to_jiffies(500)) == 0) { -+ DSSERR("Failed to receive BTA\n"); -+ r = -EIO; -+ goto err; -+ } -+err: -+ dsi_vc_disable_bta_irq(channel); -+ -+ return r; -+} -+ -+static inline void dsi_vc_write_long_header(int channel, u8 data_type, -+ u16 len, u8 ecc) -+{ -+ u32 val; -+ u8 data_id; -+ -+ /*data_id = data_type | channel << 6; */ -+ data_id = data_type | dsi.vc[channel].dest_per << 6; -+ -+ val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) | -+ FLD_VAL(ecc, 31, 24); -+ -+ dsi_write_reg(DSI_VC_LONG_PACKET_HEADER(channel), val); -+} -+ -+static inline void dsi_vc_write_long_payload(int channel, -+ u8 b1, u8 b2, u8 b3, u8 b4) -+{ -+ u32 val; -+ -+ val = b4 << 24 | b3 << 16 | b2 << 8 | b1 << 0; -+ -+/* DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n", -+ b1, b2, b3, b4, val); */ -+ -+ dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(channel), val); -+} -+ -+static int dsi_vc_send_long(int channel, u8 data_type, u8 *data, u16 len, -+ u8 ecc) -+{ -+ /*u32 val; */ -+ int i; -+ u8 *p; -+ int r = 0; -+ u8 b1, b2, b3, b4; -+ -+ if (dsi.debug_write) -+ DSSDBG("dsi_vc_send_long, %d bytes\n", len); -+ -+ /* len + header */ -+ if (dsi.vc[channel].fifo_size * 32 * 4 < len + 4) { -+ DSSERR("unable to send long packet: packet too long.\n"); -+ return -EINVAL; -+ } -+ -+ dsi_vc_write_long_header(channel, data_type, len, ecc); -+ -+ /*dsi_vc_print_status(0); */ -+ -+ p = data; -+ for (i = 0; i < len >> 2; i++) { -+ if (dsi.debug_write) -+ DSSDBG("\tsending full packet %d\n", i); -+ /*dsi_vc_print_status(0); */ -+ -+ b1 = *p++; -+ b2 = *p++; -+ b3 = *p++; -+ b4 = *p++; -+ -+ dsi_vc_write_long_payload(channel, b1, b2, b3, b4); -+ } -+ -+ i = len % 4; -+ if (i) { -+ b1 = 0; b2 = 0; b3 = 0; -+ -+ if (dsi.debug_write) -+ DSSDBG("\tsending remainder bytes %d\n", i); -+ -+ switch (i) { -+ case 3: -+ b1 = *p++; -+ b2 = *p++; -+ b3 = *p++; -+ break; -+ case 2: -+ b1 = *p++; -+ b2 = *p++; -+ break; -+ case 1: -+ b1 = *p++; -+ break; -+ } -+ -+ dsi_vc_write_long_payload(channel, b1, b2, b3, 0); -+ } -+ -+ return r; -+} -+ -+static int dsi_vc_send_short(int channel, u8 data_type, u16 data, u8 ecc) -+{ -+ u32 r; -+ u8 data_id; -+ -+ if (dsi.debug_write) -+ DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n", -+ channel, -+ data_type, data & 0xff, (data >> 8) & 0xff); -+ -+ if (FLD_GET(dsi_read_reg(DSI_VC_CTRL(channel)), 16, 16)) { -+ DSSERR("ERROR FIFO FULL, aborting transfer\n"); -+ return -EINVAL; -+ } -+ -+ data_id = data_type | channel << 6; -+ -+ r = (data_id << 0) | (data << 8) | (ecc << 24); -+ -+ dsi_write_reg(DSI_VC_SHORT_PACKET_HEADER(channel), r); -+ -+ return 0; -+} -+ -+int dsi_vc_send_null(int channel) -+{ -+ u8 nullpkg[] = {0, 0, 0, 0}; -+ return dsi_vc_send_long(0, DSI_DT_NULL_PACKET, nullpkg, 4, 0); -+} -+EXPORT_SYMBOL(dsi_vc_send_null); -+ -+int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len) -+{ -+ int r; -+ -+ BUG_ON(len == 0); -+ -+ if (len == 1) { -+ r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_0, -+ data[0], 0); -+ } else if (len == 2) { -+ r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_1, -+ data[0] | (data[1] << 8), 0); -+ } else { -+ /* 0x39 = DCS Long Write */ -+ r = dsi_vc_send_long(channel, DSI_DT_DCS_LONG_WRITE, -+ data, len, 0); -+ } -+ -+ return r; -+} -+EXPORT_SYMBOL(dsi_vc_dcs_write_nosync); -+ -+int dsi_vc_dcs_write(int channel, u8 *data, int len) -+{ -+ int r; -+ -+ r = dsi_vc_dcs_write_nosync(channel, data, len); -+ if (r) -+ return r; -+ -+ /* Some devices need time to process the msg in low power mode. -+ This also makes the write synchronous, and checks that -+ the peripheral is still alive */ -+ r = dsi_vc_send_bta_sync(channel); -+ -+ return r; -+} -+EXPORT_SYMBOL(dsi_vc_dcs_write); -+ -+int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen) -+{ -+ u32 val; -+ u8 dt; -+ int r; -+ -+ if (dsi.debug_read) -+ DSSDBG("dsi_vc_dcs_read\n"); -+ -+ r = dsi_vc_send_short(channel, DSI_DT_DCS_READ, dcs_cmd, 0); -+ if (r) -+ return r; -+ -+ r = dsi_vc_send_bta_sync(channel); -+ if (r) -+ return r; -+ -+ if (REG_GET(DSI_VC_CTRL(channel), 20, 20) == 0) { /* RX_FIFO_NOT_EMPTY */ -+ DSSERR("RX fifo empty when trying to read.\n"); -+ return -EIO; -+ } -+ -+ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); -+ if (dsi.debug_read) -+ DSSDBG("\theader: %08x\n", val); -+ dt = FLD_GET(val, 5, 0); -+ if (dt == DSI_DT_RX_ACK_WITH_ERR) { -+ u16 err = FLD_GET(val, 23, 8); -+ dsi_show_rx_ack_with_err(err); -+ return -1; -+ -+ } else if (dt == DSI_DT_RX_SHORT_READ_1) { -+ u8 data = FLD_GET(val, 15, 8); -+ if (dsi.debug_read) -+ DSSDBG("\tDCS short response, 1 byte: %02x\n", data); -+ -+ if (buflen < 1) -+ return -1; -+ -+ buf[0] = data; -+ -+ return 1; -+ } else if (dt == DSI_DT_RX_SHORT_READ_2) { -+ u16 data = FLD_GET(val, 23, 8); -+ if (dsi.debug_read) -+ DSSDBG("\tDCS short response, 2 byte: %04x\n", data); -+ -+ if (buflen < 2) -+ return -1; -+ -+ buf[0] = data & 0xff; -+ buf[1] = (data >> 8) & 0xff; -+ -+ return 2; -+ } else if (dt == DSI_DT_RX_DCS_LONG_READ) { -+ int w; -+ int len = FLD_GET(val, 23, 8); -+ if (dsi.debug_read) -+ DSSDBG("\tDCS long response, len %d\n", len); -+ -+ if (len > buflen) -+ return -1; -+ -+ /* two byte checksum ends the packet, not included in len */ -+ for (w = 0; w < len + 2;) { -+ int b; -+ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); -+ if (dsi.debug_read) -+ DSSDBG("\t\t%02x %02x %02x %02x\n", -+ (val >> 0) & 0xff, -+ (val >> 8) & 0xff, -+ (val >> 16) & 0xff, -+ (val >> 24) & 0xff); -+ -+ for (b = 0; b < 4; ++b) { -+ if (w < len) -+ buf[w] = (val >> (b * 8)) & 0xff; -+ /* we discard the 2 byte checksum */ -+ ++w; -+ } -+ } -+ -+ return len; -+ -+ } else { -+ DSSERR("\tunknown datatype 0x%02x\n", dt); -+ return -1; -+ } -+} -+EXPORT_SYMBOL(dsi_vc_dcs_read); -+ -+ -+int dsi_vc_set_max_rx_packet_size(int channel, u16 len) -+{ -+ return dsi_vc_send_short(channel, DSI_DT_SET_MAX_RET_PKG_SIZE, -+ len, 0); -+} -+EXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size); -+ -+ -+static int dsi_set_lp_rx_timeout(int ns, int x4, int x16) -+{ -+ u32 r; -+ unsigned long fck; -+ int ticks; -+ -+ /* ticks in DSI_FCK */ -+ -+ fck = dsi_fclk_rate(); -+ ticks = (fck / 1000 / 1000) * ns / 1000; -+ -+ if (ticks > 0x1fff) { -+ DSSERR("LP_TX_TO too high\n"); -+ return -EINVAL; -+ } -+ -+ r = dsi_read_reg(DSI_TIMING2); -+ r = FLD_MOD(r, 1, 15, 15); /* LP_RX_TO */ -+ r = FLD_MOD(r, x16, 14, 14); /* LP_RX_TO_X16 */ -+ r = FLD_MOD(r, x4, 13, 13); /* LP_RX_TO_X4 */ -+ r = FLD_MOD(r, ticks, 12, 0); /* LP_RX_COUNTER */ -+ dsi_write_reg(DSI_TIMING2, r); -+ -+ DSSDBG("LP_RX_TO %ld ns (%#x ticks)\n", -+ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / -+ (fck / 1000 / 1000), -+ ticks); -+ -+ return 0; -+} -+ -+static int dsi_set_ta_timeout(int ns, int x8, int x16) -+{ -+ u32 r; -+ unsigned long fck; -+ int ticks; -+ -+ /* ticks in DSI_FCK */ -+ -+ fck = dsi_fclk_rate(); -+ ticks = (fck / 1000 / 1000) * ns / 1000; -+ -+ if (ticks > 0x1fff) { -+ DSSERR("TA_TO too high\n"); -+ return -EINVAL; -+ } -+ -+ r = dsi_read_reg(DSI_TIMING1); -+ r = FLD_MOD(r, 1, 31, 31); /* TA_TO */ -+ r = FLD_MOD(r, x16, 30, 30); /* TA_TO_X16 */ -+ r = FLD_MOD(r, x8, 29, 29); /* TA_TO_X8 */ -+ r = FLD_MOD(r, ticks, 28, 16); /* TA_TO_COUNTER */ -+ dsi_write_reg(DSI_TIMING1, r); -+ -+ DSSDBG("TA_TO %ld ns (%#x ticks)\n", -+ (ticks * (x16 ? 16 : 1) * (x8 ? 8 : 1) * 1000) / -+ (fck / 1000 / 1000), -+ ticks); -+ -+ return 0; -+} -+ -+static int dsi_set_stop_state_counter(int ns, int x4, int x16) -+{ -+ u32 r; -+ unsigned long fck; -+ int ticks; -+ -+ /* ticks in DSI_FCK */ -+ -+ fck = dsi_fclk_rate(); -+ ticks = (fck / 1000 / 1000) * ns / 1000; -+ -+ if (ticks > 0x1fff) { -+ DSSERR("STOP_STATE_COUNTER_IO too high\n"); -+ return -EINVAL; -+ } -+ -+ r = dsi_read_reg(DSI_TIMING1); -+ r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ -+ r = FLD_MOD(r, x16, 14, 14); /* STOP_STATE_X16_IO */ -+ r = FLD_MOD(r, x4, 13, 13); /* STOP_STATE_X4_IO */ -+ r = FLD_MOD(r, ticks, 12, 0); /* STOP_STATE_COUNTER_IO */ -+ dsi_write_reg(DSI_TIMING1, r); -+ -+ DSSDBG("STOP_STATE_COUNTER %ld ns (%#x ticks)\n", -+ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / -+ (fck / 1000 / 1000), -+ ticks); -+ -+ return 0; -+} -+ -+static int dsi_set_hs_tx_timeout(int ns, int x4, int x16) -+{ -+ u32 r; -+ unsigned long fck; -+ int ticks; -+ -+ /* ticks in TxByteClkHS */ -+ -+ fck = dsi.ddr_clk / 4; -+ ticks = (fck / 1000 / 1000) * ns / 1000; -+ -+ if (ticks > 0x1fff) { -+ DSSERR("HS_TX_TO too high\n"); -+ return -EINVAL; -+ } -+ -+ r = dsi_read_reg(DSI_TIMING2); -+ r = FLD_MOD(r, 1, 31, 31); /* HS_TX_TO */ -+ r = FLD_MOD(r, x16, 30, 30); /* HS_TX_TO_X16 */ -+ r = FLD_MOD(r, x4, 29, 29); /* HS_TX_TO_X8 (4 really) */ -+ r = FLD_MOD(r, ticks, 28, 16); /* HS_TX_TO_COUNTER */ -+ dsi_write_reg(DSI_TIMING2, r); -+ -+ DSSDBG("HS_TX_TO %ld ns (%#x ticks)\n", -+ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / -+ (fck / 1000 / 1000), -+ ticks); -+ -+ return 0; -+} -+static int dsi_proto_config(struct omap_display *display) -+{ -+ u32 r; -+ int buswidth = 0; -+ -+ dsi_config_tx_fifo(DSI_FIFO_SIZE_128, -+ DSI_FIFO_SIZE_0, -+ DSI_FIFO_SIZE_0, -+ DSI_FIFO_SIZE_0); -+ -+ dsi_config_rx_fifo(DSI_FIFO_SIZE_128, -+ DSI_FIFO_SIZE_0, -+ DSI_FIFO_SIZE_0, -+ DSI_FIFO_SIZE_0); -+ -+ /* XXX what values for the timeouts? */ -+ dsi_set_stop_state_counter(1000, 0, 0); -+ -+ dsi_set_ta_timeout(50000, 1, 1); -+ -+ /* 3000ns * 16 */ -+ dsi_set_lp_rx_timeout(3000, 0, 1); -+ -+ /* 10000ns * 4 */ -+ dsi_set_hs_tx_timeout(10000, 1, 0); -+ -+ switch (display->ctrl->pixel_size) { -+ case 16: -+ buswidth = 0; -+ break; -+ case 18: -+ buswidth = 1; -+ break; -+ case 24: -+ buswidth = 2; -+ break; -+ default: -+ BUG(); -+ } -+ -+ r = dsi_read_reg(DSI_CTRL); -+ r = FLD_MOD(r, 1, 1, 1); /* CS_RX_EN */ -+ r = FLD_MOD(r, 1, 2, 2); /* ECC_RX_EN */ -+ r = FLD_MOD(r, 1, 3, 3); /* TX_FIFO_ARBITRATION */ -+ /* XXX what should the ratio be */ -+ r = FLD_MOD(r, 0, 4, 4); /* VP_CLK_RATIO, VP_PCLK = VP_CLK/2 */ -+ r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */ -+ r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */ -+ r = FLD_MOD(r, 2, 13, 12); /* LINE_BUFFER, 2 lines */ -+ r = FLD_MOD(r, 1, 14, 14); /* TRIGGER_RESET_MODE */ -+ r = FLD_MOD(r, 1, 19, 19); /* EOT_ENABLE */ -+ r = FLD_MOD(r, 1, 24, 24); /* DCS_CMD_ENABLE */ -+ r = FLD_MOD(r, 0, 25, 25); /* DCS_CMD_CODE, 1=start, 0=continue */ -+ -+ dsi_write_reg(DSI_CTRL, r); -+ -+ /* we configure vc0 for L4 communication, and -+ * vc1 for dispc */ -+ dsi_vc_config(0); -+ dsi_vc_config_vp(1); -+ -+ /* set all vc targets to peripheral 0 */ -+ dsi.vc[0].dest_per = 0; -+ dsi.vc[1].dest_per = 0; -+ dsi.vc[2].dest_per = 0; -+ dsi.vc[3].dest_per = 0; -+ -+ return 0; -+} -+ -+static void dsi_proto_timings(void) -+{ -+ int tlpx_half, tclk_zero, tclk_prepare, tclk_trail; -+ int tclk_pre, tclk_post; -+ int ddr_clk_pre, ddr_clk_post; -+ u32 r; -+ -+ r = dsi_read_reg(DSI_DSIPHY_CFG1); -+ tlpx_half = FLD_GET(r, 22, 16); -+ tclk_trail = FLD_GET(r, 15, 8); -+ tclk_zero = FLD_GET(r, 7, 0); -+ -+ r = dsi_read_reg(DSI_DSIPHY_CFG2); -+ tclk_prepare = FLD_GET(r, 7, 0); -+ -+ /* min 8*UI */ -+ tclk_pre = 20; -+ /* min 60ns + 52*UI */ -+ tclk_post = ns2ddr(60) + 26; -+ -+ ddr_clk_pre = (tclk_pre + tlpx_half*2 + tclk_zero + tclk_prepare) / 4; -+ ddr_clk_post = (tclk_post + tclk_trail) / 4; -+ -+ r = dsi_read_reg(DSI_CLK_TIMING); -+ r = FLD_MOD(r, ddr_clk_pre, 15, 8); -+ r = FLD_MOD(r, ddr_clk_post, 7, 0); -+ dsi_write_reg(DSI_CLK_TIMING, r); -+ -+ DSSDBG("ddr_clk_pre %d, ddr_clk_post %d\n", -+ ddr_clk_pre, -+ ddr_clk_post); -+} -+ -+ -+#define DSI_DECL_VARS \ -+ int __dsi_cb = 0; u32 __dsi_cv = 0; -+ -+#define DSI_FLUSH(ch) \ -+ if (__dsi_cb > 0) { \ -+ /*DSSDBG("sending long packet %#010x\n", __dsi_cv);*/ \ -+ dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(ch), __dsi_cv); \ -+ __dsi_cb = __dsi_cv = 0; \ -+ } -+ -+#define DSI_PUSH(ch, data) \ -+ do { \ -+ __dsi_cv |= (data) << (__dsi_cb * 8); \ -+ /*DSSDBG("cv = %#010x, cb = %d\n", __dsi_cv, __dsi_cb);*/ \ -+ if (++__dsi_cb > 3) \ -+ DSI_FLUSH(ch); \ -+ } while (0) -+ -+static int dsi_update_screen_l4(struct omap_display *display, -+ int x, int y, int w, int h) -+{ -+ /* Note: supports only 24bit colors in 32bit container */ -+ int first = 1; -+ int fifo_stalls = 0; -+ int max_dsi_packet_size; -+ int max_data_per_packet; -+ int max_pixels_per_packet; -+ int pixels_left; -+ int bytespp = 3; -+ int scr_width; -+ u32 __iomem *data; -+ int start_offset; -+ int horiz_inc; -+ int current_x; -+ struct omap_overlay *ovl; -+ -+ debug_irq = 0; -+ -+ DSSDBG("dsi_update_screen_l4 (%d,%d %dx%d)\n", -+ x, y, w, h); -+ -+ ovl = display->manager->overlays[0]; -+ -+ if (ovl->info.color_mode != OMAP_DSS_COLOR_RGB24U) -+ return -EINVAL; -+ -+ if (display->ctrl->pixel_size != 24) -+ return -EINVAL; -+ -+ scr_width = ovl->info.screen_width; -+ data = ovl->info.vaddr; -+ -+ start_offset = scr_width * y + x; -+ horiz_inc = scr_width - w; -+ current_x = x; -+ -+ /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp) bytes -+ * in fifo */ -+ -+ /* When using CPU, max long packet size is TX buffer size */ -+ max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4; -+ -+ /* we seem to get better perf if we divide the tx fifo to half, -+ and while the other half is being sent, we fill the other half -+ max_dsi_packet_size /= 2; */ -+ -+ max_data_per_packet = max_dsi_packet_size - 4 - 1; -+ -+ max_pixels_per_packet = max_data_per_packet / bytespp; -+ -+ DSSDBG("max_pixels_per_packet %d\n", max_pixels_per_packet); -+ -+ display->ctrl->setup_update(display, x, y, w, h); -+ -+ pixels_left = w * h; -+ -+ DSSDBG("total pixels %d\n", pixels_left); -+ -+ data += start_offset; -+ -+ dsi.update_region.x = x; -+ dsi.update_region.y = y; -+ dsi.update_region.w = w; -+ dsi.update_region.h = h; -+ dsi.update_region.bytespp = bytespp; -+ -+ perf_mark_start(); -+ -+ while (pixels_left > 0) { -+ /* 0x2c = write_memory_start */ -+ /* 0x3c = write_memory_continue */ -+ u8 dcs_cmd = first ? 0x2c : 0x3c; -+ int pixels; -+ DSI_DECL_VARS; -+ first = 0; -+ -+#if 1 -+ /* using fifo not empty */ -+ /* TX_FIFO_NOT_EMPTY */ -+ while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) { -+ udelay(1); -+ fifo_stalls++; -+ if (fifo_stalls > 0xfffff) { -+ DSSERR("fifo stalls overflow, pixels left %d\n", -+ pixels_left); -+ dsi_if_enable(0); -+ return -EIO; -+ } -+ } -+#elif 1 -+ /* using fifo emptiness */ -+ while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 < -+ max_dsi_packet_size) { -+ fifo_stalls++; -+ if (fifo_stalls > 0xfffff) { -+ DSSERR("fifo stalls overflow, pixels left %d\n", -+ pixels_left); -+ dsi_if_enable(0); -+ return -EIO; -+ } -+ } -+#else -+ while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 == 0) { -+ fifo_stalls++; -+ if (fifo_stalls > 0xfffff) { -+ DSSERR("fifo stalls overflow, pixels left %d\n", -+ pixels_left); -+ dsi_if_enable(0); -+ return -EIO; -+ } -+ } -+#endif -+ pixels = min(max_pixels_per_packet, pixels_left); -+ -+ pixels_left -= pixels; -+ -+ dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE, -+ 1 + pixels * bytespp, 0); -+ -+ DSI_PUSH(0, dcs_cmd); -+ -+ while (pixels-- > 0) { -+ u32 pix = __raw_readl(data++); -+ -+ DSI_PUSH(0, (pix >> 16) & 0xff); -+ DSI_PUSH(0, (pix >> 8) & 0xff); -+ DSI_PUSH(0, (pix >> 0) & 0xff); -+ -+ current_x++; -+ if (current_x == x+w) { -+ current_x = x; -+ data += horiz_inc; -+ } -+ } -+ -+ DSI_FLUSH(0); -+ } -+ -+ perf_show("L4"); -+ -+ return 0; -+} -+ -+#if 0 -+static void dsi_clear_screen_l4(struct omap_display *display, -+ int x, int y, int w, int h) -+{ -+ int first = 1; -+ int fifo_stalls = 0; -+ int max_dsi_packet_size; -+ int max_data_per_packet; -+ int max_pixels_per_packet; -+ int pixels_left; -+ int bytespp = 3; -+ int pixnum; -+ -+ debug_irq = 0; -+ -+ DSSDBG("dsi_clear_screen_l4 (%d,%d %dx%d)\n", -+ x, y, w, h); -+ -+ if (display->ctrl->bpp != 24) -+ return -EINVAL; -+ -+ /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp) -+ * bytes in fifo */ -+ -+ /* When using CPU, max long packet size is TX buffer size */ -+ max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4; -+ -+ max_data_per_packet = max_dsi_packet_size - 4 - 1; -+ -+ max_pixels_per_packet = max_data_per_packet / bytespp; -+ -+ enable_clocks(1); -+ -+ display->ctrl->setup_update(display, x, y, w, h); -+ -+ pixels_left = w * h; -+ -+ dsi.update_region.x = x; -+ dsi.update_region.y = y; -+ dsi.update_region.w = w; -+ dsi.update_region.h = h; -+ dsi.update_region.bytespp = bytespp; -+ -+ start_measuring(); -+ -+ pixnum = 0; -+ -+ while (pixels_left > 0) { -+ /* 0x2c = write_memory_start */ -+ /* 0x3c = write_memory_continue */ -+ u8 dcs_cmd = first ? 0x2c : 0x3c; -+ int pixels; -+ DSI_DECL_VARS; -+ first = 0; -+ -+ /* TX_FIFO_NOT_EMPTY */ -+ while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) { -+ fifo_stalls++; -+ if (fifo_stalls > 0xfffff) { -+ DSSERR("fifo stalls overflow\n"); -+ dsi_if_enable(0); -+ enable_clocks(0); -+ return; -+ } -+ } -+ -+ pixels = min(max_pixels_per_packet, pixels_left); -+ -+ pixels_left -= pixels; -+ -+ dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE, -+ 1 + pixels * bytespp, 0); -+ -+ DSI_PUSH(0, dcs_cmd); -+ -+ while (pixels-- > 0) { -+ u32 pix; -+ -+ pix = 0x000000; -+ -+ DSI_PUSH(0, (pix >> 16) & 0xff); -+ DSI_PUSH(0, (pix >> 8) & 0xff); -+ DSI_PUSH(0, (pix >> 0) & 0xff); -+ } -+ -+ DSI_FLUSH(0); -+ } -+ -+ enable_clocks(0); -+ -+ end_measuring("L4 CLEAR"); -+} -+#endif -+ -+static void dsi_setup_update_dispc(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h) -+{ -+ int bytespp = 3; -+ -+ DSSDBG("dsi_setup_update_dispc(%d,%d %dx%d)\n", -+ x, y, w, h); -+ -+ dsi.update_region.display = display; -+ dsi.update_region.x = x; -+ dsi.update_region.y = y; -+ dsi.update_region.w = w; -+ dsi.update_region.h = h; -+ dsi.update_region.bytespp = bytespp; -+ -+ dispc_setup_partial_planes(display, &x, &y, &w, &h); -+ -+ dispc_set_lcd_size(w, h); -+} -+ -+static void dsi_update_screen_dispc(struct omap_display *display) -+{ -+ int bytespp = 3; -+ int total_len; -+ int line_packet_len; -+ u16 x, y, w, h; -+ u32 l; -+ -+ x = dsi.update_region.x; -+ y = dsi.update_region.y; -+ w = dsi.update_region.w; -+ h = dsi.update_region.h; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) -+ DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n", -+ x, y, w, h); -+ -+ /* TODO: one packet could be longer, I think? Max is the line buffer */ -+ line_packet_len = w * bytespp + 1; /* 1 byte for DCS cmd */ -+ total_len = line_packet_len * h; -+ -+ display->ctrl->setup_update(display, x, y, w, h); -+ -+ if (0) -+ dsi_vc_print_status(1); -+ -+ perf_mark_start(); -+ -+ l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */ -+ dsi_write_reg(DSI_VC_TE(1), l); -+ -+ dsi_vc_write_long_header(1, DSI_DT_DCS_LONG_WRITE, line_packet_len, 0); -+ -+ if (dsi.use_te) -+ l = FLD_MOD(l, 1, 30, 30); /* TE_EN */ -+ else -+ l = FLD_MOD(l, 1, 31, 31); /* TE_START */ -+ dsi_write_reg(DSI_VC_TE(1), l); -+ -+ dispc_enable_lcd_out(1); -+ -+ if (dsi.use_te) -+ dsi_vc_send_bta(1); -+} -+ -+static void framedone_callback(void *data, u32 mask) -+{ -+ if (dsi.framedone_scheduled) { -+ DSSERR("Framedone already scheduled. Bogus FRAMEDONE IRQ?\n"); -+ return; -+ } -+ -+ dsi.framedone_scheduled = 1; -+ -+ /* We get FRAMEDONE when DISPC has finished sending pixels and turns -+ * itself off. However, DSI still has the pixels in its buffers, and -+ * is sending the data. Thus we have to wait until we can do a new -+ * transfer or turn the clocks off. We do that in a separate work -+ * func. */ -+ queue_work(dsi.framedone_workqueue, &dsi.framedone_work); -+} -+ -+static void framedone_worker(struct work_struct *work) -+{ -+ u32 l; -+ unsigned long tmo; -+ int i = 0; -+ -+ l = REG_GET(DSI_VC_TE(1), 23, 0); /* TE_SIZE */ -+ -+ /* There shouldn't be much stuff in DSI buffers, if any, so we'll -+ * just busyloop */ -+ if (l > 0) { -+ tmo = jiffies + msecs_to_jiffies(50); -+ while (REG_GET(DSI_VC_TE(1), 23, 0) > 0) { /* TE_SIZE */ -+ i++; -+ if (time_after(jiffies, tmo)) { -+ DSSERR("timeout waiting TE_SIZE to zero\n"); -+ break; -+ } -+ cpu_relax(); -+ } -+ } -+ -+ if (REG_GET(DSI_VC_TE(1), 30, 30)) -+ DSSERR("TE_EN not zero\n"); -+ -+ if (REG_GET(DSI_VC_TE(1), 31, 31)) -+ DSSERR("TE_START not zero\n"); -+ -+ perf_show("DISPC"); -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) -+ DSSDBG("FRAMEDONE\n"); -+ -+#if 0 -+ if (l) -+ DSSWARN("FRAMEDONE irq too early, %d bytes, %d loops\n", l, i); -+#else -+ if (l > 1024*3) -+ DSSWARN("FRAMEDONE irq too early, %d bytes, %d loops\n", l, i); -+#endif -+ -+#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC -+ dispc_fake_vsync_irq(); -+#endif -+ dsi.framedone_scheduled = 0; -+ -+ /* XXX check that fifo is not full. otherwise we would sleep and never -+ * get to process_cmd_fifo below */ -+ /* We check for target_update_mode, not update_mode. No reason to push -+ * new updates if we're turning auto update off */ -+ if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO) -+ dsi_push_update(dsi.update_region.display, -+ dsi.update_region.x, -+ dsi.update_region.y, -+ dsi.update_region.w, -+ dsi.update_region.h); -+ -+ atomic_set(&dsi.cmd_pending, 0); -+ dsi_process_cmd_fifo(); -+} -+ -+static void dsi_start_auto_update(struct omap_display *display) -+{ -+ int bytespp = 3; -+ u16 w, h; -+ -+ DSSDBG("starting auto update\n"); -+ -+ display->get_resolution(display, &w, &h); -+ -+ dsi.update_region.display = display; -+ dsi.update_region.x = 0; -+ dsi.update_region.y = 0; -+ dsi.update_region.w = w; -+ dsi.update_region.h = h; -+ dsi.update_region.bytespp = bytespp; -+ -+ /* the overlay settings may not have been applied, if we were in manual -+ * mode earlier, so do it here */ -+ display->manager->apply(display->manager); -+ -+ dispc_set_lcd_size(w, h); -+ -+ dsi_push_update(dsi.update_region.display, -+ dsi.update_region.x, -+ dsi.update_region.y, -+ dsi.update_region.w, -+ dsi.update_region.h); -+} -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+/* FIFO functions */ -+ -+static void dsi_signal_fifo_waiters(void) -+{ -+ if (atomic_read(&dsi.cmd_fifo_full) > 0) { -+ DSSDBG("SIGNALING: Fifo not full for waiter!\n"); -+ complete(&dsi.cmd_done); -+ atomic_dec(&dsi.cmd_fifo_full); -+ } -+} -+ -+/* returns 1 for async op, and 0 for sync op */ -+static int dsi_do_update(struct omap_display *display, -+ struct dsi_cmd_update *upd) -+{ -+ int r; -+ u16 x = upd->x, y = upd->y, w = upd->w, h = upd->h; -+ u16 dw, dh; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED) -+ return 0; -+ -+ display->get_resolution(display, &dw, &dh); -+ if (x > dw || y > dh) -+ return 0; -+ -+ if (x + w > dw) -+ w = dw - x; -+ -+ if (y + h > dh) -+ h = dh - y; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) -+ DSSDBGF("%d,%d %dx%d", x, y, w, h); -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return 0; -+ -+ perf_mark_setup(); -+ -+ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { -+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) -+ dsi_setup_update_dispc(display, x, y, w, h); -+ dsi_update_screen_dispc(display); -+ return 1; -+ } else { -+ r = dsi_update_screen_l4(display, x, y, w, h); -+ if (r) -+ DSSERR("L4 update failed\n"); -+ return 0; -+ } -+} -+ -+static void dsi_do_cmd_mem_read(struct omap_display *display, -+ struct dsi_cmd_mem_read *mem_read) -+{ -+ int r; -+ r = display->ctrl->memory_read(display, -+ mem_read->buf, -+ mem_read->size, -+ mem_read->x, -+ mem_read->y, -+ mem_read->w, -+ mem_read->h); -+ -+ *mem_read->ret_size = (size_t)r; -+ complete(mem_read->completion); -+} -+ -+static void dsi_do_cmd_test(struct omap_display *display, -+ struct dsi_cmd_test *test) -+{ -+ int r = 0; -+ -+ DSSDBGF(""); -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return; -+ -+ /* run test first in low speed mode */ -+ dsi_vc_enable_hs(0, 0); -+ -+ if (display->ctrl->run_test) { -+ r = display->ctrl->run_test(display, test->test_num); -+ if (r) -+ goto end; -+ } -+ -+ if (display->panel->run_test) { -+ r = display->panel->run_test(display, test->test_num); -+ if (r) -+ goto end; -+ } -+ -+ /* then in high speed */ -+ dsi_vc_enable_hs(0, 1); -+ -+ if (display->ctrl->run_test) { -+ r = display->ctrl->run_test(display, test->test_num); -+ if (r) -+ goto end; -+ } -+ -+ if (display->panel->run_test) -+ r = display->panel->run_test(display, test->test_num); -+ -+end: -+ dsi_vc_enable_hs(0, 1); -+ -+ *test->result = r; -+ complete(test->completion); -+ -+ DSSDBG("test end\n"); -+} -+ -+static void dsi_do_cmd_set_te(struct omap_display *display, bool enable) -+{ -+ dsi.use_te = enable; -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return; -+ -+ display->ctrl->enable_te(display, enable); -+ -+ if (enable) { -+ /* disable LP_RX_TO, so that we can receive TE. -+ * Time to wait for TE is longer than the timer allows */ -+ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ -+ } else { -+ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */ -+ } -+} -+ -+static void dsi_do_cmd_set_update_mode(struct omap_display *display, -+ enum omap_dss_update_mode mode) -+{ -+ dsi.update_mode = mode; -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return; -+ -+ if (mode == OMAP_DSS_UPDATE_AUTO) -+ dsi_start_auto_update(display); -+} -+ -+static void dsi_process_cmd_fifo(void) -+{ -+ int len; -+ struct dsi_cmd_item p; -+ unsigned long flags; -+ struct omap_display *display; -+ int exit = 0; -+ -+ if (dsi.debug_process) -+ DSSDBGF(""); -+ -+ if (atomic_cmpxchg(&dsi.cmd_pending, 0, 1) == 1) { -+ if (dsi.debug_process) -+ DSSDBG("cmd pending, skip process\n"); -+ return; -+ } -+ -+ while (!exit) { -+ spin_lock_irqsave(dsi.cmd_fifo->lock, flags); -+ -+ len = __kfifo_get(dsi.cmd_fifo, (unsigned char *)&p, -+ sizeof(p)); -+ if (len == 0) { -+ if (dsi.debug_process) -+ DSSDBG("nothing more in fifo, atomic clear\n"); -+ atomic_set(&dsi.cmd_pending, 0); -+ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); -+ break; -+ } -+ -+ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); -+ -+ BUG_ON(len != sizeof(p)); -+ -+ display = p.display; -+ -+ switch (p.cmd) { -+ case DSI_CMD_UPDATE: -+ if (dsi_do_update(display, &p.u.r)) { -+ if (dsi.debug_process) -+ DSSDBG("async update\n"); -+ exit = 1; -+ } else { -+ if (dsi.debug_process) -+ DSSDBG("sync update\n"); -+ } -+ break; -+ -+ case DSI_CMD_SYNC: -+ if (dsi.debug_process) -+ DSSDBG("Signaling SYNC done!\n"); -+ complete(p.u.sync); -+ break; -+ -+ case DSI_CMD_MEM_READ: -+ dsi_do_cmd_mem_read(display, &p.u.mem_read); -+ break; -+ -+ case DSI_CMD_TEST: -+ dsi_do_cmd_test(display, &p.u.test); -+ break; -+ -+ case DSI_CMD_SET_TE: -+ dsi_do_cmd_set_te(display, p.u.te); -+ break; -+ -+ case DSI_CMD_SET_UPDATE_MODE: -+ dsi_do_cmd_set_update_mode(display, p.u.update_mode); -+ break; -+ -+ case DSI_CMD_SET_ROTATE: -+ display->ctrl->set_rotate(display, p.u.rotate); -+ break; -+ -+ case DSI_CMD_SET_MIRROR: -+ display->ctrl->set_mirror(display, p.u.mirror); -+ break; -+ -+ default: -+ BUG(); -+ } -+ } -+ -+ if (dsi.debug_process) -+ DSSDBG("exit dsi_process_cmd_fifo\n"); -+ -+ dsi_signal_fifo_waiters(); -+} -+ -+static void dsi_push_cmd(struct dsi_cmd_item *p) -+{ -+ int ret; -+ -+ if (dsi.debug_process) -+ DSSDBGF(""); -+ -+ while (1) { -+ unsigned long flags; -+ int available; -+ -+ spin_lock_irqsave(dsi.cmd_fifo->lock, flags); -+ available = DSI_CMD_FIFO_LEN_BYTES - __kfifo_len(dsi.cmd_fifo); -+ -+ if (dsi.debug_process) -+ DSSDBG("%d items left in fifo\n", -+ available / sizeof(*p)); -+ if (available < sizeof(*p)) { -+ if (dsi.debug_process) -+ DSSDBG("cmd fifo full, waiting...\n"); -+ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); -+ atomic_inc(&dsi.cmd_fifo_full); -+ wait_for_completion(&dsi.cmd_done); -+ if (dsi.debug_process) -+ DSSDBG("cmd fifo not full, woke up\n"); -+ continue; -+ } -+ -+ ret = __kfifo_put(dsi.cmd_fifo, (unsigned char *)p, -+ sizeof(*p)); -+ -+ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); -+ -+ BUG_ON(ret != sizeof(*p)); -+ -+ break; -+ } -+ -+ dsi_process_cmd_fifo(); -+} -+ -+static void dsi_push_update(struct omap_display *display, -+ int x, int y, int w, int h) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_UPDATE; -+ -+ p.u.r.x = x; -+ p.u.r.y = y; -+ p.u.r.w = w; -+ p.u.r.h = h; -+ -+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) -+ DSSDBG("pushing UPDATE %d,%d %dx%d\n", x, y, w, h); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_sync(struct omap_display *display, -+ struct completion *sync_comp) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_SYNC; -+ p.u.sync = sync_comp; -+ -+ DSSDBG("pushing SYNC\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_mem_read(struct omap_display *display, -+ struct dsi_cmd_mem_read *mem_read) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_MEM_READ; -+ p.u.mem_read = *mem_read; -+ -+ DSSDBG("pushing MEM_READ\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_test(struct omap_display *display, int test_num, -+ int *result, struct completion *completion) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_TEST; -+ p.u.test.test_num = test_num; -+ p.u.test.result = result; -+ p.u.test.completion = completion; -+ -+ DSSDBG("pushing TEST\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_set_te(struct omap_display *display, bool enable) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_SET_TE; -+ p.u.te = enable; -+ -+ DSSDBG("pushing SET_TE\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_set_update_mode(struct omap_display *display, -+ enum omap_dss_update_mode mode) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_SET_UPDATE_MODE; -+ p.u.update_mode = mode; -+ -+ DSSDBG("pushing SET_UPDATE_MODE\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_set_rotate(struct omap_display *display, int rotate) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_SET_ROTATE; -+ p.u.rotate = rotate; -+ -+ DSSDBG("pushing SET_ROTATE\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static void dsi_push_set_mirror(struct omap_display *display, int mirror) -+{ -+ struct dsi_cmd_item p; -+ -+ p.display = display; -+ p.cmd = DSI_CMD_SET_MIRROR; -+ p.u.mirror = mirror; -+ -+ DSSDBG("pushing SET_MIRROR\n"); -+ -+ dsi_push_cmd(&p); -+} -+ -+static int dsi_wait_sync(struct omap_display *display) -+{ -+ long wait = msecs_to_jiffies(60000); -+ struct completion compl; -+ -+ DSSDBGF(""); -+ -+ init_completion(&compl); -+ dsi_push_sync(display, &compl); -+ -+ DSSDBG("Waiting for SYNC to happen...\n"); -+ wait = wait_for_completion_timeout(&compl, wait); -+ DSSDBG("Released from SYNC\n"); -+ -+ if (wait == 0) { -+ DSSERR("timeout waiting sync\n"); -+ return -ETIME; -+ } -+ -+ return 0; -+} -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+/* Display funcs */ -+ -+static int dsi_display_init_dispc(struct omap_display *display) -+{ -+ int r; -+ -+ r = omap_dispc_register_isr(framedone_callback, NULL, -+ DISPC_IRQ_FRAMEDONE); -+ if (r) { -+ DSSERR("can't get FRAMEDONE irq\n"); -+ return r; -+ } -+ -+ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); -+ -+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_DSI); -+ dispc_enable_fifohandcheck(1); -+ -+ dispc_set_tft_data_lines(display->ctrl->pixel_size); -+ -+ { -+ struct omap_video_timings timings = { -+ .hsw = 1, -+ .hfp = 1, -+ .hbp = 1, -+ .vsw = 1, -+ .vfp = 0, -+ .vbp = 0, -+ }; -+ -+ dispc_set_lcd_timings(&timings); -+ } -+ -+ return 0; -+} -+ -+static void dsi_display_uninit_dispc(struct omap_display *display) -+{ -+ omap_dispc_unregister_isr(framedone_callback, NULL, -+ DISPC_IRQ_FRAMEDONE); -+} -+ -+static int dsi_display_init_dsi(struct omap_display *display) -+{ -+ struct dsi_clock_info cinfo; -+ int r; -+ -+ _dsi_print_reset_status(); -+ -+ r = dsi_pll_init(1, 0); -+ if (r) -+ goto err0; -+ -+ r = dsi_pll_calc_ddrfreq(display->hw_config.u.dsi.ddr_clk_hz, &cinfo); -+ if (r) -+ goto err1; -+ -+ r = dsi_pll_program(&cinfo); -+ if (r) -+ goto err1; -+ -+ DSSDBG("PLL OK\n"); -+ -+ r = dsi_complexio_init(display); -+ if (r) -+ goto err1; -+ -+ _dsi_print_reset_status(); -+ -+ dsi_proto_timings(); -+ dsi_set_lp_clk_divisor(); -+ -+ if (1) -+ _dsi_print_reset_status(); -+ -+ r = dsi_proto_config(display); -+ if (r) -+ goto err2; -+ -+ /* enable interface */ -+ dsi_vc_enable(0, 1); -+ dsi_vc_enable(1, 1); -+ dsi_if_enable(1); -+ dsi_force_tx_stop_mode_io(); -+ -+ if (display->ctrl && display->ctrl->enable) { -+ r = display->ctrl->enable(display); -+ if (r) -+ goto err3; -+ } -+ -+ if (display->panel && display->panel->enable) { -+ r = display->panel->enable(display); -+ if (r) -+ goto err4; -+ } -+ -+ /* enable high-speed after initial config */ -+ dsi_vc_enable_hs(0, 1); -+ -+ return 0; -+err4: -+ if (display->ctrl && display->ctrl->disable) -+ display->ctrl->disable(display); -+err3: -+ dsi_if_enable(0); -+err2: -+ dsi_complexio_uninit(); -+err1: -+ dsi_pll_uninit(); -+err0: -+ return r; -+} -+ -+static void dsi_display_uninit_dsi(struct omap_display *display) -+{ -+ if (display->panel && display->panel->disable) -+ display->panel->disable(display); -+ if (display->ctrl && display->ctrl->disable) -+ display->ctrl->disable(display); -+ -+ dsi_complexio_uninit(); -+ dsi_pll_uninit(); -+} -+ -+static int dsi_core_init(void) -+{ -+ /* Autoidle */ -+ REG_FLD_MOD(DSI_SYSCONFIG, 1, 0, 0); -+ -+ /* ENWAKEUP */ -+ REG_FLD_MOD(DSI_SYSCONFIG, 1, 2, 2); -+ -+ /* SIDLEMODE smart-idle */ -+ REG_FLD_MOD(DSI_SYSCONFIG, 2, 4, 3); -+ -+ _dsi_initialize_irq(); -+ -+ return 0; -+} -+ -+static int dsi_display_enable(struct omap_display *display) -+{ -+ int r = 0; -+ -+ DSSDBG("dsi_display_enable\n"); -+ -+ mutex_lock(&dsi.lock); -+ -+ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { -+ DSSERR("display already enabled\n"); -+ r = -EINVAL; -+ goto err0; -+ } -+ -+ enable_clocks(1); -+ dsi_enable_pll_clock(1); -+ -+ r = _dsi_reset(); -+ if (r) -+ return r; -+ -+ dsi_core_init(); -+ -+ r = dsi_display_init_dispc(display); -+ if (r) -+ goto err1; -+ -+ r = dsi_display_init_dsi(display); -+ if (r) -+ goto err2; -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+ -+ if (dsi.use_te) -+ dsi_push_set_te(display, 1); -+ -+ dsi_push_set_update_mode(display, dsi.user_update_mode); -+ dsi.target_update_mode = dsi.user_update_mode; -+ -+ mutex_unlock(&dsi.lock); -+ -+ return 0; -+ -+err2: -+ dsi_display_uninit_dispc(display); -+err1: -+ enable_clocks(0); -+ dsi_enable_pll_clock(0); -+err0: -+ mutex_unlock(&dsi.lock); -+ DSSDBG("dsi_display_enable FAILED\n"); -+ return r; -+} -+ -+static void dsi_display_disable(struct omap_display *display) -+{ -+ DSSDBG("dsi_display_disable\n"); -+ -+ mutex_lock(&dsi.lock); -+ -+ if (display->state == OMAP_DSS_DISPLAY_DISABLED || -+ display->state == OMAP_DSS_DISPLAY_SUSPENDED) -+ goto end; -+ -+ if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) { -+ dsi_push_set_update_mode(display, OMAP_DSS_UPDATE_DISABLED); -+ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED; -+ } -+ -+ dsi_wait_sync(display); -+ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+ -+ dsi_display_uninit_dispc(display); -+ -+ dsi_display_uninit_dsi(display); -+ -+ enable_clocks(0); -+ dsi_enable_pll_clock(0); -+end: -+ mutex_unlock(&dsi.lock); -+} -+ -+static int dsi_display_suspend(struct omap_display *display) -+{ -+ DSSDBG("dsi_display_suspend\n"); -+ -+ dsi_display_disable(display); -+ -+ display->state = OMAP_DSS_DISPLAY_SUSPENDED; -+ -+ return 0; -+} -+ -+static int dsi_display_resume(struct omap_display *display) -+{ -+ DSSDBG("dsi_display_resume\n"); -+ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+ return dsi_display_enable(display); -+} -+ -+static int dsi_display_update(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h) -+{ -+ DSSDBG("dsi_display_update(%d,%d %dx%d)\n", x, y, w, h); -+ -+ if (w == 0 || h == 0) -+ return 0; -+ -+ mutex_lock(&dsi.lock); -+ -+ if (dsi.target_update_mode == OMAP_DSS_UPDATE_MANUAL) -+ dsi_push_update(display, x, y, w, h); -+ /* XXX else return error? */ -+ -+ mutex_unlock(&dsi.lock); -+ -+ return 0; -+} -+ -+static int dsi_display_sync(struct omap_display *display) -+{ -+ DSSDBGF(""); -+ return dsi_wait_sync(display); -+} -+ -+static int dsi_display_set_update_mode(struct omap_display *display, -+ enum omap_dss_update_mode mode) -+{ -+ DSSDBGF("%d", mode); -+ -+ mutex_lock(&dsi.lock); -+ -+ if (dsi.target_update_mode != mode) { -+ dsi_push_set_update_mode(display, mode); -+ -+ dsi.target_update_mode = mode; -+ dsi.user_update_mode = mode; -+ } -+ -+ mutex_unlock(&dsi.lock); -+ -+ return 0; -+} -+ -+static enum omap_dss_update_mode dsi_display_get_update_mode( -+ struct omap_display *display) -+{ -+ return dsi.update_mode; -+} -+ -+static int dsi_display_enable_te(struct omap_display *display, bool enable) -+{ -+ DSSDBGF("%d", enable); -+ -+ if (!display->ctrl->enable_te) -+ return -ENOENT; -+ -+ dsi_push_set_te(display, enable); -+ -+ return 0; -+} -+ -+static int dsi_display_get_te(struct omap_display *display) -+{ -+ return dsi.use_te; -+} -+ -+ -+ -+static int dsi_display_set_rotate(struct omap_display *display, u8 rotate) -+{ -+ DSSDBGF("%d", rotate); -+ -+ if (!display->ctrl->set_rotate || !display->ctrl->get_rotate) -+ return -EINVAL; -+ -+ dsi_push_set_rotate(display, rotate); -+ -+ return 0; -+} -+ -+static u8 dsi_display_get_rotate(struct omap_display *display) -+{ -+ if (!display->ctrl->set_rotate || !display->ctrl->get_rotate) -+ return 0; -+ -+ return display->ctrl->get_rotate(display); -+} -+ -+static int dsi_display_set_mirror(struct omap_display *display, bool mirror) -+{ -+ DSSDBGF("%d", mirror); -+ -+ if (!display->ctrl->set_mirror || !display->ctrl->get_mirror) -+ return -EINVAL; -+ -+ dsi_push_set_mirror(display, mirror); -+ -+ return 0; -+} -+ -+static bool dsi_display_get_mirror(struct omap_display *display) -+{ -+ if (!display->ctrl->set_mirror || !display->ctrl->get_mirror) -+ return 0; -+ -+ return display->ctrl->get_mirror(display); -+} -+ -+static int dsi_display_run_test(struct omap_display *display, int test_num) -+{ -+ long wait = msecs_to_jiffies(60000); -+ struct completion compl; -+ int result; -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return -EIO; -+ -+ DSSDBGF("%d", test_num); -+ -+ init_completion(&compl); -+ -+ dsi_push_test(display, test_num, &result, &compl); -+ -+ DSSDBG("Waiting for SYNC to happen...\n"); -+ wait = wait_for_completion_timeout(&compl, wait); -+ DSSDBG("Released from SYNC\n"); -+ -+ if (wait == 0) { -+ DSSERR("timeout waiting test sync\n"); -+ return -ETIME; -+ } -+ -+ return result; -+} -+ -+static int dsi_display_memory_read(struct omap_display *display, -+ void *buf, size_t size, -+ u16 x, u16 y, u16 w, u16 h) -+{ -+ long wait = msecs_to_jiffies(60000); -+ struct completion compl; -+ struct dsi_cmd_mem_read mem_read; -+ size_t ret_size; -+ -+ DSSDBGF(""); -+ -+ if (!display->ctrl->memory_read) -+ return -EINVAL; -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return -EIO; -+ -+ init_completion(&compl); -+ -+ mem_read.x = x; -+ mem_read.y = y; -+ mem_read.w = w; -+ mem_read.h = h; -+ mem_read.buf = buf; -+ mem_read.size = size; -+ mem_read.ret_size = &ret_size; -+ mem_read.completion = &compl; -+ -+ dsi_push_mem_read(display, &mem_read); -+ -+ DSSDBG("Waiting for SYNC to happen...\n"); -+ wait = wait_for_completion_timeout(&compl, wait); -+ DSSDBG("Released from SYNC\n"); -+ -+ if (wait == 0) { -+ DSSERR("timeout waiting mem read sync\n"); -+ return -ETIME; -+ } -+ -+ return ret_size; -+} -+ -+static void dsi_configure_overlay(struct omap_overlay *ovl) -+{ -+ unsigned low, high, size; -+ enum omap_burst_size burst; -+ enum omap_plane plane = ovl->id; -+ -+ burst = OMAP_DSS_BURST_16x32; -+ size = 16 * 32 / 8; -+ -+ dispc_set_burst_size(plane, burst); -+ -+ high = dispc_get_plane_fifo_size(plane) - size; -+ low = 0; -+ dispc_setup_plane_fifo(plane, low, high); -+} -+ -+void dsi_init_display(struct omap_display *display) -+{ -+ DSSDBG("DSI init\n"); -+ -+ display->enable = dsi_display_enable; -+ display->disable = dsi_display_disable; -+ display->suspend = dsi_display_suspend; -+ display->resume = dsi_display_resume; -+ display->update = dsi_display_update; -+ display->sync = dsi_display_sync; -+ display->set_update_mode = dsi_display_set_update_mode; -+ display->get_update_mode = dsi_display_get_update_mode; -+ display->enable_te = dsi_display_enable_te; -+ display->get_te = dsi_display_get_te; -+ -+ display->get_rotate = dsi_display_get_rotate; -+ display->set_rotate = dsi_display_set_rotate; -+ -+ display->get_mirror = dsi_display_get_mirror; -+ display->set_mirror = dsi_display_set_mirror; -+ -+ display->run_test = dsi_display_run_test; -+ display->memory_read = dsi_display_memory_read; -+ -+ display->configure_overlay = dsi_configure_overlay; -+ -+ display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; -+} -+ -+int dsi_init(void) -+{ -+ u32 rev; -+ -+ spin_lock_init(&dsi.cmd_lock); -+ dsi.cmd_fifo = kfifo_alloc(DSI_CMD_FIFO_LEN_BYTES, GFP_KERNEL, -+ &dsi.cmd_lock); -+ -+ init_completion(&dsi.cmd_done); -+ atomic_set(&dsi.cmd_fifo_full, 0); -+ atomic_set(&dsi.cmd_pending, 0); -+ -+ init_completion(&dsi.bta_completion); -+ -+ dsi.framedone_workqueue = create_singlethread_workqueue("dsi"); -+ INIT_WORK(&dsi.framedone_work, framedone_worker); -+ -+ mutex_init(&dsi.lock); -+ -+ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED; -+ dsi.user_update_mode = OMAP_DSS_UPDATE_DISABLED; -+ -+ dsi.base = ioremap(DSI_BASE, DSI_SZ_REGS); -+ if (!dsi.base) { -+ DSSERR("can't ioremap DSI\n"); -+ return -ENOMEM; -+ } -+ -+ enable_clocks(1); -+ -+ rev = dsi_read_reg(DSI_REVISION); -+ printk(KERN_INFO "OMAP DSI rev %d.%d\n", -+ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); -+ -+ enable_clocks(0); -+ -+ return 0; -+} -+ -+void dsi_exit(void) -+{ -+ flush_workqueue(dsi.framedone_workqueue); -+ destroy_workqueue(dsi.framedone_workqueue); -+ -+ iounmap(dsi.base); -+ -+ kfifo_free(dsi.cmd_fifo); -+ -+ DSSDBG("omap_dsi_exit\n"); -+} -+ -diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c -new file mode 100644 -index 0000000..adc1f34 ---- /dev/null -+++ b/drivers/video/omap2/dss/dss.c -@@ -0,0 +1,345 @@ -+/* -+ * linux/drivers/video/omap2/dss/dss.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "DSS" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include "dss.h" -+ -+#define DSS_BASE 0x48050000 -+ -+#define DSS_SZ_REGS SZ_512 -+ -+struct dss_reg { -+ u16 idx; -+}; -+ -+#define DSS_REG(idx) ((const struct dss_reg) { idx }) -+ -+#define DSS_REVISION DSS_REG(0x0000) -+#define DSS_SYSCONFIG DSS_REG(0x0010) -+#define DSS_SYSSTATUS DSS_REG(0x0014) -+#define DSS_IRQSTATUS DSS_REG(0x0018) -+#define DSS_CONTROL DSS_REG(0x0040) -+#define DSS_SDI_CONTROL DSS_REG(0x0044) -+#define DSS_PLL_CONTROL DSS_REG(0x0048) -+#define DSS_SDI_STATUS DSS_REG(0x005C) -+ -+#define REG_GET(idx, start, end) \ -+ FLD_GET(dss_read_reg(idx), start, end) -+ -+#define REG_FLD_MOD(idx, val, start, end) \ -+ dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) -+ -+static struct { -+ void __iomem *base; -+ -+ u32 ctx[DSS_SZ_REGS / sizeof(u32)]; -+} dss; -+ -+static int _omap_dss_wait_reset(void); -+ -+static inline void dss_write_reg(const struct dss_reg idx, u32 val) -+{ -+ __raw_writel(val, dss.base + idx.idx); -+} -+ -+static inline u32 dss_read_reg(const struct dss_reg idx) -+{ -+ return __raw_readl(dss.base + idx.idx); -+} -+ -+#define SR(reg) \ -+ dss.ctx[(DSS_##reg).idx / sizeof(u32)] = dss_read_reg(DSS_##reg) -+#define RR(reg) \ -+ dss_write_reg(DSS_##reg, dss.ctx[(DSS_##reg).idx / sizeof(u32)]) -+ -+void dss_save_context(void) -+{ -+ if (cpu_is_omap24xx()) -+ return; -+ -+ SR(SYSCONFIG); -+ SR(CONTROL); -+ -+#ifdef CONFIG_OMAP2_DSS_SDI -+ SR(SDI_CONTROL); -+ SR(PLL_CONTROL); -+#endif -+} -+ -+void dss_restore_context(void) -+{ -+ if (_omap_dss_wait_reset()) -+ DSSERR("DSS not coming out of reset after sleep\n"); -+ -+ RR(SYSCONFIG); -+ RR(CONTROL); -+ -+#ifdef CONFIG_OMAP2_DSS_SDI -+ RR(SDI_CONTROL); -+ RR(PLL_CONTROL); -+#endif -+} -+ -+#undef SR -+#undef RR -+ -+void dss_sdi_init(u8 datapairs) -+{ -+ u32 l; -+ -+ BUG_ON(datapairs > 3 || datapairs < 1); -+ -+ l = dss_read_reg(DSS_SDI_CONTROL); -+ l = FLD_MOD(l, 0xf, 19, 15); /* SDI_PDIV */ -+ l = FLD_MOD(l, datapairs-1, 3, 2); /* SDI_PRSEL */ -+ l = FLD_MOD(l, 2, 1, 0); /* SDI_BWSEL */ -+ dss_write_reg(DSS_SDI_CONTROL, l); -+ -+ l = dss_read_reg(DSS_PLL_CONTROL); -+ l = FLD_MOD(l, 0x7, 25, 22); /* SDI_PLL_FREQSEL */ -+ l = FLD_MOD(l, 0xb, 16, 11); /* SDI_PLL_REGN */ -+ l = FLD_MOD(l, 0xb4, 10, 1); /* SDI_PLL_REGM */ -+ dss_write_reg(DSS_PLL_CONTROL, l); -+} -+ -+void dss_sdi_enable(void) -+{ -+ dispc_pck_free_enable(1); -+ -+ /* Reset SDI PLL */ -+ REG_FLD_MOD(DSS_PLL_CONTROL, 1, 18, 18); /* SDI_PLL_SYSRESET */ -+ udelay(1); /* wait 2x PCLK */ -+ -+ /* Lock SDI PLL */ -+ REG_FLD_MOD(DSS_PLL_CONTROL, 1, 28, 28); /* SDI_PLL_GOBIT */ -+ -+ /* Waiting for PLL lock request to complete */ -+ while (dss_read_reg(DSS_SDI_STATUS) & (1 << 6)) -+ ; -+ -+ /* Clearing PLL_GO bit */ -+ REG_FLD_MOD(DSS_PLL_CONTROL, 0, 28, 28); -+ -+ /* Waiting for PLL to lock */ -+ while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 5))) -+ ; -+ -+ dispc_lcd_enable_signal(1); -+ -+ /* Waiting for SDI reset to complete */ -+ while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 2))) -+ ; -+} -+ -+void dss_sdi_disable(void) -+{ -+ dispc_lcd_enable_signal(0); -+ -+ dispc_pck_free_enable(0); -+ -+ /* Reset SDI PLL */ -+ REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ -+} -+ -+void dss_dump_regs(struct seq_file *s) -+{ -+#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ DUMPREG(DSS_REVISION); -+ DUMPREG(DSS_SYSCONFIG); -+ DUMPREG(DSS_SYSSTATUS); -+ DUMPREG(DSS_IRQSTATUS); -+ DUMPREG(DSS_CONTROL); -+ DUMPREG(DSS_SDI_CONTROL); -+ DUMPREG(DSS_PLL_CONTROL); -+ DUMPREG(DSS_SDI_STATUS); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+#undef DUMPREG -+} -+ -+void dss_select_clk_source(bool dsi, bool dispc) -+{ -+ u32 r; -+ r = dss_read_reg(DSS_CONTROL); -+ r = FLD_MOD(r, dsi, 1, 1); /* DSI_CLK_SWITCH */ -+ r = FLD_MOD(r, dispc, 0, 0); /* DISPC_CLK_SWITCH */ -+ dss_write_reg(DSS_CONTROL, r); -+} -+ -+int dss_get_dsi_clk_source(void) -+{ -+ return FLD_GET(dss_read_reg(DSS_CONTROL), 1, 1); -+} -+ -+int dss_get_dispc_clk_source(void) -+{ -+ return FLD_GET(dss_read_reg(DSS_CONTROL), 0, 0); -+} -+ -+static irqreturn_t dss_irq_handler_omap2(int irq, void *arg) -+{ -+ dispc_irq_handler(); -+ -+ return IRQ_HANDLED; -+} -+ -+static irqreturn_t dss_irq_handler_omap3(int irq, void *arg) -+{ -+ u32 irqstatus; -+ -+ irqstatus = dss_read_reg(DSS_IRQSTATUS); -+ -+ if (irqstatus & (1<<0)) /* DISPC_IRQ */ -+ dispc_irq_handler(); -+#ifdef CONFIG_OMAP2_DSS_DSI -+ if (irqstatus & (1<<1)) /* DSI_IRQ */ -+ dsi_irq_handler(); -+#endif -+ -+ return IRQ_HANDLED; -+} -+ -+static int _omap_dss_wait_reset(void) -+{ -+ unsigned timeout = 1000; -+ -+ while (REG_GET(DSS_SYSSTATUS, 0, 0) == 0) { -+ udelay(1); -+ if (!--timeout) { -+ DSSERR("soft reset failed\n"); -+ return -ENODEV; -+ } -+ } -+ -+ return 0; -+} -+ -+static int _omap_dss_reset(void) -+{ -+ /* Soft reset */ -+ REG_FLD_MOD(DSS_SYSCONFIG, 1, 1, 1); -+ return _omap_dss_wait_reset(); -+} -+ -+void dss_set_venc_output(enum omap_dss_venc_type type) -+{ -+ int l = 0; -+ -+ if (type == OMAP_DSS_VENC_TYPE_COMPOSITE) -+ l = 0; -+ else if (type == OMAP_DSS_VENC_TYPE_SVIDEO) -+ l = 1; -+ else -+ BUG(); -+ -+ /* venc out selection. 0 = comp, 1 = svideo */ -+ REG_FLD_MOD(DSS_CONTROL, l, 6, 6); -+} -+ -+void dss_set_dac_pwrdn_bgz(bool enable) -+{ -+ REG_FLD_MOD(DSS_CONTROL, enable, 5, 5); /* DAC Power-Down Control */ -+} -+ -+int dss_init(bool skip_init) -+{ -+ int r; -+ u32 rev; -+ -+ dss.base = ioremap(DSS_BASE, DSS_SZ_REGS); -+ if (!dss.base) { -+ DSSERR("can't ioremap DSS\n"); -+ r = -ENOMEM; -+ goto fail0; -+ } -+ -+ if (!skip_init) { -+ /* We need to wait here a bit, otherwise we sometimes start to -+ * get synclost errors, and after that only power cycle will -+ * restore DSS functionality. I have no idea why this happens. -+ * And we have to wait _before_ resetting the DSS, but after -+ * enabling clocks. -+ */ -+ msleep(50); -+ -+ _omap_dss_reset(); -+ -+ } -+ else -+ printk("DSS SKIP RESET\n"); -+ -+ /* autoidle */ -+ REG_FLD_MOD(DSS_SYSCONFIG, 1, 0, 0); -+ -+ /* Select DPLL */ -+ REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); -+ -+#ifdef CONFIG_OMAP2_DSS_VENC -+ REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ -+ REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ -+ REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ -+#endif -+ -+ r = request_irq(INT_24XX_DSS_IRQ, -+ cpu_is_omap24xx() -+ ? dss_irq_handler_omap2 -+ : dss_irq_handler_omap3, -+ 0, "OMAP DSS", NULL); -+ -+ if (r < 0) { -+ DSSERR("omap2 dss: request_irq failed\n"); -+ goto fail1; -+ } -+ -+ dss_save_context(); -+ -+ rev = dss_read_reg(DSS_REVISION); -+ printk(KERN_INFO "OMAP DSS rev %d.%d\n", -+ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); -+ -+ return 0; -+ -+fail1: -+ iounmap(dss.base); -+fail0: -+ return r; -+} -+ -+void dss_exit(void) -+{ -+ free_irq(INT_24XX_DSS_IRQ, NULL); -+ -+ iounmap(dss.base); -+} -+ -diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h -new file mode 100644 -index 0000000..2013ae4 ---- /dev/null -+++ b/drivers/video/omap2/dss/dss.h -@@ -0,0 +1,326 @@ -+/* -+ * linux/drivers/video/omap2/dss/dss.h -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#ifndef __OMAP2_DSS_H -+#define __OMAP2_DSS_H -+ -+#ifdef CONFIG_OMAP2_DSS_DEBUG_SUPPORT -+#define DEBUG -+#endif -+ -+#ifdef DEBUG -+extern unsigned int dss_debug; -+#ifdef DSS_SUBSYS_NAME -+#define DSSDBG(format, ...) \ -+ if (dss_debug) \ -+ printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME ": " format, \ -+ ## __VA_ARGS__) -+#else -+#define DSSDBG(format, ...) \ -+ if (dss_debug) \ -+ printk(KERN_DEBUG "omapdss: " format, ## __VA_ARGS__) -+#endif -+ -+#ifdef DSS_SUBSYS_NAME -+#define DSSDBGF(format, ...) \ -+ if (dss_debug) \ -+ printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME \ -+ ": %s(" format ")\n", \ -+ __func__, \ -+ ## __VA_ARGS__) -+#else -+#define DSSDBGF(format, ...) \ -+ if (dss_debug) \ -+ printk(KERN_DEBUG "omapdss: " \ -+ ": %s(" format ")\n", \ -+ __func__, \ -+ ## __VA_ARGS__) -+#endif -+ -+#else /* DEBUG */ -+#define DSSDBG(format, ...) -+#define DSSDBGF(format, ...) -+#endif -+ -+ -+#ifdef DSS_SUBSYS_NAME -+#define DSSERR(format, ...) \ -+ printk(KERN_ERR "omapdss " DSS_SUBSYS_NAME " error: " format, \ -+ ## __VA_ARGS__) -+#else -+#define DSSERR(format, ...) \ -+ printk(KERN_ERR "omapdss error: " format, ## __VA_ARGS__) -+#endif -+ -+#ifdef DSS_SUBSYS_NAME -+#define DSSINFO(format, ...) \ -+ printk(KERN_INFO "omapdss " DSS_SUBSYS_NAME ": " format, \ -+ ## __VA_ARGS__) -+#else -+#define DSSINFO(format, ...) \ -+ printk(KERN_INFO "omapdss: " format, ## __VA_ARGS__) -+#endif -+ -+#ifdef DSS_SUBSYS_NAME -+#define DSSWARN(format, ...) \ -+ printk(KERN_WARNING "omapdss " DSS_SUBSYS_NAME ": " format, \ -+ ## __VA_ARGS__) -+#else -+#define DSSWARN(format, ...) \ -+ printk(KERN_WARNING "omapdss: " format, ## __VA_ARGS__) -+#endif -+ -+/* OMAP TRM gives bitfields as start:end, where start is the higher bit -+ number. For example 7:0 */ -+#define FLD_MASK(start, end) (((1 << (start - end + 1)) - 1) << (end)) -+#define FLD_VAL(val, start, end) (((val) << end) & FLD_MASK(start, end)) -+#define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end)) -+#define FLD_MOD(orig, val, start, end) \ -+ (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) -+ -+#define DISPC_MAX_FCK 173000000 -+ -+enum omap_burst_size { -+ OMAP_DSS_BURST_4x32 = 0, -+ OMAP_DSS_BURST_8x32 = 1, -+ OMAP_DSS_BURST_16x32 = 2, -+}; -+ -+enum omap_parallel_interface_mode { -+ OMAP_DSS_PARALLELMODE_BYPASS, /* MIPI DPI */ -+ OMAP_DSS_PARALLELMODE_RFBI, /* MIPI DBI */ -+ OMAP_DSS_PARALLELMODE_DSI, -+}; -+ -+enum dss_clock { -+ DSS_CLK_ICK = 1 << 0, -+ DSS_CLK_FCK1 = 1 << 1, -+ DSS_CLK_FCK2 = 1 << 2, -+ DSS_CLK_54M = 1 << 3, -+ DSS_CLK_96M = 1 << 4, -+}; -+ -+struct dispc_clock_info { -+ /* rates that we get with dividers below */ -+ unsigned long fck; -+ unsigned long lck; -+ unsigned long pck; -+ -+ /* dividers */ -+ u16 fck_div; -+ u16 lck_div; -+ u16 pck_div; -+}; -+ -+struct dsi_clock_info { -+ /* rates that we get with dividers below */ -+ unsigned long fint; -+ unsigned long dsiphy; -+ unsigned long clkin; -+ unsigned long dsi1_pll_fclk; -+ unsigned long dsi2_pll_fclk; -+ unsigned long lck; -+ unsigned long pck; -+ -+ /* dividers */ -+ u16 regn; -+ u16 regm; -+ u16 regm3; -+ u16 regm4; -+ -+ u16 lck_div; -+ u16 pck_div; -+ -+ u8 highfreq; -+ bool use_dss2_fck; -+}; -+ -+struct seq_file; -+struct platform_device; -+ -+/* core */ -+void dss_clk_enable(enum dss_clock clks); -+void dss_clk_disable(enum dss_clock clks); -+unsigned long dss_clk_get_rate(enum dss_clock clk); -+int dss_need_ctx_restore(void); -+void dss_dump_clocks(struct seq_file *s); -+ -+int dss_dsi_power_up(void); -+void dss_dsi_power_down(void); -+ -+/* display */ -+void dss_init_displays(struct platform_device *pdev); -+void dss_uninit_displays(struct platform_device *pdev); -+int dss_suspend_all_displays(void); -+int dss_resume_all_displays(void); -+struct omap_display *dss_get_display(int no); -+ -+/* manager */ -+int dss_init_overlay_managers(struct platform_device *pdev); -+void dss_uninit_overlay_managers(struct platform_device *pdev); -+ -+/* overlay */ -+void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name); -+void dss_uninit_overlays(struct platform_device *pdev); -+int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display); -+void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr); -+ -+/* DSS */ -+int dss_init(bool skip_init); -+void dss_exit(void); -+ -+void dss_save_context(void); -+void dss_restore_context(void); -+ -+void dss_dump_regs(struct seq_file *s); -+ -+void dss_sdi_init(u8 datapairs); -+void dss_sdi_enable(void); -+void dss_sdi_disable(void); -+ -+void dss_select_clk_source(bool dsi, bool dispc); -+int dss_get_dsi_clk_source(void); -+int dss_get_dispc_clk_source(void); -+void dss_set_venc_output(enum omap_dss_venc_type type); -+void dss_set_dac_pwrdn_bgz(bool enable); -+ -+/* SDI */ -+int sdi_init(bool skip_init); -+void sdi_exit(void); -+void sdi_init_display(struct omap_display *display); -+ -+/* DSI */ -+int dsi_init(void); -+void dsi_exit(void); -+ -+void dsi_dump_clocks(struct seq_file *s); -+void dsi_dump_regs(struct seq_file *s); -+ -+void dsi_save_context(void); -+void dsi_restore_context(void); -+ -+void dsi_init_display(struct omap_display *display); -+void dsi_irq_handler(void); -+unsigned long dsi_get_dsi1_pll_rate(void); -+unsigned long dsi_get_dsi2_pll_rate(void); -+int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck, -+ struct dsi_clock_info *cinfo); -+int dsi_pll_program(struct dsi_clock_info *cinfo); -+int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv); -+void dsi_pll_uninit(void); -+ -+/* DPI */ -+int dpi_init(void); -+void dpi_exit(void); -+void dpi_init_display(struct omap_display *display); -+ -+/* DISPC */ -+int dispc_init(void); -+void dispc_exit(void); -+void dispc_dump_clocks(struct seq_file *s); -+void dispc_dump_regs(struct seq_file *s); -+void dispc_irq_handler(void); -+void dispc_fake_vsync_irq(void); -+ -+void dispc_save_context(void); -+void dispc_restore_context(void); -+ -+void dispc_lcd_enable_signal_polarity(bool act_high); -+void dispc_lcd_enable_signal(bool enable); -+void dispc_pck_free_enable(bool enable); -+void dispc_enable_fifohandcheck(bool enable); -+ -+void dispc_set_lcd_size(u16 width, u16 height); -+void dispc_set_digit_size(u16 width, u16 height); -+u32 dispc_get_plane_fifo_size(enum omap_plane plane); -+void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high); -+void dispc_enable_fifomerge(bool enable); -+void dispc_set_burst_size(enum omap_plane plane, -+ enum omap_burst_size burst_size); -+ -+void dispc_set_plane_ba0(enum omap_plane plane, u32 paddr); -+void dispc_set_plane_ba1(enum omap_plane plane, u32 paddr); -+void dispc_set_plane_pos(enum omap_plane plane, u16 x, u16 y); -+void dispc_set_plane_size(enum omap_plane plane, u16 width, u16 height); -+ -+int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, -+ u32 paddr, u16 screen_width, -+ u16 pos_x, u16 pos_y, -+ u16 width, u16 height, -+ u16 out_width, u16 out_height, -+ enum omap_color_mode color_mode, -+ bool ilace, -+ u8 rotation, bool mirror); -+ -+void dispc_go(enum omap_channel channel); -+void dispc_enable_lcd_out(bool enable); -+void dispc_enable_digit_out(bool enable); -+int dispc_enable_plane(enum omap_plane plane, bool enable); -+ -+void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode); -+void dispc_set_tft_data_lines(u8 data_lines); -+void dispc_set_lcd_display_type(enum omap_lcd_display_type type); -+void dispc_set_loadmode(enum omap_dss_load_mode mode); -+ -+void dispc_set_default_color(enum omap_channel channel, u32 color); -+void dispc_set_trans_key(enum omap_channel ch, -+ enum omap_dss_color_key_type type, -+ u32 trans_key); -+void dispc_enable_trans_key(enum omap_channel ch, bool enable); -+ -+void dispc_set_lcd_timings(struct omap_video_timings *timings); -+unsigned long dispc_fclk_rate(void); -+unsigned long dispc_pclk_rate(void); -+void dispc_set_pol_freq(struct omap_panel *panel); -+void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck, -+ u16 *lck_div, u16 *pck_div); -+int dispc_calc_clock_div(bool is_tft, unsigned long req_pck, -+ struct dispc_clock_info *cinfo); -+int dispc_set_clock_div(struct dispc_clock_info *cinfo); -+int dispc_get_clock_div(struct dispc_clock_info *cinfo); -+void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div); -+ -+void dispc_setup_partial_planes(struct omap_display *display, -+ u16 *x, u16 *y, u16 *w, u16 *h); -+void dispc_draw_partial_planes(struct omap_display *display); -+ -+ -+/* VENC */ -+int venc_init(void); -+void venc_exit(void); -+void venc_dump_regs(struct seq_file *s); -+void venc_init_display(struct omap_display *display); -+ -+/* RFBI */ -+int rfbi_init(void); -+void rfbi_exit(void); -+void rfbi_dump_regs(struct seq_file *s); -+ -+int rfbi_configure(int rfbi_module, int bpp, int lines); -+void rfbi_enable_rfbi(bool enable); -+void rfbi_transfer_area(u16 width, u16 height, -+ void (callback)(void *data), void *data); -+void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t); -+unsigned long rfbi_get_max_tx_rate(void); -+void rfbi_init_display(struct omap_display *display); -+ -+#endif -diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c -new file mode 100644 -index 0000000..7c25146 ---- /dev/null -+++ b/drivers/video/omap2/dss/manager.c -@@ -0,0 +1,463 @@ -+/* -+ * linux/drivers/video/omap2/dss/manager.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "MANAGER" -+ -+#include -+#include -+#include -+ -+#include -+ -+#include "dss.h" -+ -+static int num_managers; -+static struct list_head manager_list; -+ -+static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", mgr->name); -+} -+ -+static ssize_t manager_display_show(struct omap_overlay_manager *mgr, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ mgr->display ? mgr->display->name : ""); -+} -+ -+static ssize_t manager_display_store(struct omap_overlay_manager *mgr, const char *buf, size_t size) -+{ -+ int r, i; -+ int len = size; -+ struct omap_display *display = NULL; -+ -+ if (buf[size-1] == '\n') -+ --len; -+ -+ if (len > 0) { -+ for (i = 0; i < omap_dss_get_num_displays(); ++i) { -+ display = dss_get_display(i); -+ -+ if (strncmp(buf, display->name, len) == 0) -+ break; -+ -+ display = NULL; -+ } -+ } -+ -+ if (len > 0 && display == NULL) -+ return -EINVAL; -+ -+ if (display) -+ DSSDBG("display %s found\n", display->name); -+ -+ if (mgr->display) { -+ r = mgr->unset_display(mgr); -+ if (r) { -+ DSSERR("failed to unset display\n"); -+ return r; -+ } -+ } -+ -+ if (display) { -+ r = mgr->set_display(mgr, display); -+ if (r) { -+ DSSERR("failed to set manager\n"); -+ return r; -+ } -+ -+ r = mgr->apply(mgr); -+ if (r) { -+ DSSERR("failed to apply dispc config\n"); -+ return r; -+ } -+ } -+ -+ return size; -+} -+ -+struct manager_attribute { -+ struct attribute attr; -+ ssize_t (*show)(struct omap_overlay_manager *, char *); -+ ssize_t (*store)(struct omap_overlay_manager *, const char *, size_t); -+}; -+ -+#define OVERLAY_ATTR(_name, _mode, _show, _store) \ -+ struct manager_attribute manager_attr_##_name = \ -+ __ATTR(_name, _mode, _show, _store) -+ -+static OVERLAY_ATTR(name, S_IRUGO, manager_name_show, NULL); -+static OVERLAY_ATTR(display, S_IRUGO|S_IWUSR, -+ manager_display_show, manager_display_store); -+ -+static struct attribute *manager_sysfs_attrs[] = { -+ &manager_attr_name.attr, -+ &manager_attr_display.attr, -+ NULL -+}; -+ -+static ssize_t manager_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) -+{ -+ struct omap_overlay_manager *manager; -+ struct manager_attribute *manager_attr; -+ -+ manager = container_of(kobj, struct omap_overlay_manager, kobj); -+ manager_attr = container_of(attr, struct manager_attribute, attr); -+ -+ if (!manager_attr->show) -+ return -ENOENT; -+ -+ return manager_attr->show(manager, buf); -+} -+ -+static ssize_t manager_attr_store(struct kobject *kobj, struct attribute *attr, -+ const char *buf, size_t size) -+{ -+ struct omap_overlay_manager *manager; -+ struct manager_attribute *manager_attr; -+ -+ manager = container_of(kobj, struct omap_overlay_manager, kobj); -+ manager_attr = container_of(attr, struct manager_attribute, attr); -+ -+ if (!manager_attr->store) -+ return -ENOENT; -+ -+ return manager_attr->store(manager, buf, size); -+} -+ -+static struct sysfs_ops manager_sysfs_ops = { -+ .show = manager_attr_show, -+ .store = manager_attr_store, -+}; -+ -+static struct kobj_type manager_ktype = { -+ .sysfs_ops = &manager_sysfs_ops, -+ .default_attrs = manager_sysfs_attrs, -+}; -+ -+static int omap_dss_set_display(struct omap_overlay_manager *mgr, -+ struct omap_display *display) -+{ -+ int i; -+ int r; -+ -+ if (display->manager) { -+ DSSERR("display '%s' already has a manager '%s'\n", -+ display->name, display->manager->name); -+ return -EINVAL; -+ } -+ -+ if ((mgr->supported_displays & display->type) == 0) { -+ DSSERR("display '%s' does not support manager '%s'\n", -+ display->name, mgr->name); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < mgr->num_overlays; i++) { -+ struct omap_overlay *ovl = mgr->overlays[i]; -+ -+ if (ovl->manager != mgr || !ovl->info.enabled) -+ continue; -+ -+ r = dss_check_overlay(ovl, display); -+ if (r) -+ return r; -+ } -+ -+ display->manager = mgr; -+ mgr->display = display; -+ -+ return 0; -+} -+ -+static int omap_dss_unset_display(struct omap_overlay_manager *mgr) -+{ -+ if (!mgr->display) { -+ DSSERR("failed to unset display, display not set.\n"); -+ return -EINVAL; -+ } -+ -+ mgr->display->manager = NULL; -+ mgr->display = NULL; -+ -+ return 0; -+} -+ -+ -+static int overlay_enabled(struct omap_overlay *ovl) -+{ -+ return ovl->info.enabled && ovl->manager && ovl->manager->display; -+} -+ -+/* We apply settings to both managers here so that we can use optimizations -+ * like fifomerge. Shadow registers can be changed first and the non-shadowed -+ * should be changed last, at the same time with GO */ -+static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) -+{ -+ int i; -+ int ret = 0; -+ enum omap_dss_update_mode mode; -+ struct omap_display *display; -+ struct omap_overlay *ovl; -+ bool ilace = 0; -+ int outw, outh; -+ int r; -+ int num_planes_enabled = 0; -+ -+ DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ /* Configure normal overlay parameters and disable unused overlays */ -+ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { -+ ovl = omap_dss_get_overlay(i); -+ -+ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) -+ continue; -+ -+ if (!overlay_enabled(ovl)) { -+ dispc_enable_plane(ovl->id, 0); -+ continue; -+ } -+ -+ display = ovl->manager->display; -+ -+ if (dss_check_overlay(ovl, display)) { -+ dispc_enable_plane(ovl->id, 0); -+ continue; -+ } -+ -+ ++num_planes_enabled; -+ -+ /* On a manual update display, in manual update mode, update() -+ * handles configuring planes */ -+ mode = OMAP_DSS_UPDATE_AUTO; -+ if (display->get_update_mode) -+ mode = display->get_update_mode(mgr->display); -+ -+ if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE && -+ mode != OMAP_DSS_UPDATE_AUTO) -+ continue; -+ -+ if (display->type == OMAP_DISPLAY_TYPE_VENC) -+ ilace = 1; -+ -+ if (ovl->info.out_width == 0) -+ outw = ovl->info.width; -+ else -+ outw = ovl->info.out_width; -+ -+ if (ovl->info.out_height == 0) -+ outh = ovl->info.height; -+ else -+ outh = ovl->info.out_height; -+ -+ r = dispc_setup_plane(ovl->id, ovl->manager->id, -+ ovl->info.paddr, -+ ovl->info.screen_width, -+ ovl->info.pos_x, -+ ovl->info.pos_y, -+ ovl->info.width, -+ ovl->info.height, -+ outw, -+ outh, -+ ovl->info.color_mode, -+ ilace, -+ ovl->info.rotation, -+ ovl->info.mirror); -+ -+ if (r) { -+ DSSERR("dispc_setup_plane failed for ovl %d\n", -+ ovl->id); -+ dispc_enable_plane(ovl->id, 0); -+ continue; -+ } -+ -+ dispc_enable_plane(ovl->id, 1); -+ } -+ -+ /* Enable fifo merge if possible */ -+ dispc_enable_fifomerge(num_planes_enabled == 1); -+ -+ /* Go through overlays again. This time we configure fifos. We have to -+ * do this after enabling/disabling fifomerge so that we have correct -+ * knowledge of fifo sizes */ -+ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { -+ ovl = omap_dss_get_overlay(i); -+ -+ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) -+ continue; -+ -+ if (!overlay_enabled(ovl)) { -+ continue; -+ } -+ -+ ovl->manager->display->configure_overlay(ovl); -+ } -+ -+ /* Issue GO for managers */ -+ list_for_each_entry(mgr, &manager_list, list) { -+ if (!(mgr->caps & OMAP_DSS_OVL_MGR_CAP_DISPC)) -+ continue; -+ -+ display = mgr->display; -+ -+ if (!display) -+ continue; -+ -+ /* We don't need GO with manual update display. LCD iface will -+ * always be turned off after frame, and new settings will -+ * be taken in to use at next update */ -+ if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) -+ continue; -+ -+ dispc_go(mgr->id); -+ } -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ return ret; -+} -+ -+static void omap_dss_mgr_set_def_color(struct omap_overlay_manager *mgr, -+ u32 color) -+{ -+ dispc_set_default_color(mgr->id, color); -+} -+ -+static void omap_dss_mgr_set_trans_key(struct omap_overlay_manager *mgr, -+ enum omap_dss_color_key_type type, -+ u32 trans_key) -+{ -+ dispc_set_trans_key(mgr->id, type, trans_key); -+} -+ -+static void omap_dss_mgr_enable_trans_key(struct omap_overlay_manager *mgr, -+ bool enable) -+{ -+ dispc_enable_trans_key(mgr->id, enable); -+} -+ -+static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager) -+{ -+ ++num_managers; -+ list_add_tail(&manager->list, &manager_list); -+} -+ -+int dss_init_overlay_managers(struct platform_device *pdev) -+{ -+ int i, r; -+ -+ INIT_LIST_HEAD(&manager_list); -+ -+ num_managers = 0; -+ -+ for (i = 0; i < 2; ++i) { -+ struct omap_overlay_manager *mgr; -+ mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); -+ -+ BUG_ON(mgr == NULL); -+ -+ switch (i) { -+ case 0: -+ mgr->name = "lcd"; -+ mgr->id = OMAP_DSS_CHANNEL_LCD; -+ mgr->supported_displays = -+ OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | -+ OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI; -+ break; -+ case 1: -+ mgr->name = "tv"; -+ mgr->id = OMAP_DSS_CHANNEL_DIGIT; -+ mgr->supported_displays = OMAP_DISPLAY_TYPE_VENC; -+ break; -+ } -+ -+ mgr->set_display = &omap_dss_set_display, -+ mgr->unset_display = &omap_dss_unset_display, -+ mgr->apply = &omap_dss_mgr_apply, -+ mgr->set_default_color = &omap_dss_mgr_set_def_color, -+ mgr->set_trans_key = &omap_dss_mgr_set_trans_key, -+ mgr->enable_trans_key = &omap_dss_mgr_enable_trans_key, -+ mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC, -+ -+ dss_overlay_setup_dispc_manager(mgr); -+ -+ omap_dss_add_overlay_manager(mgr); -+ -+ r = kobject_init_and_add(&mgr->kobj, &manager_ktype, -+ &pdev->dev.kobj, "manager%d", i); -+ -+ if (r) { -+ DSSERR("failed to create sysfs file\n"); -+ continue; -+ } -+ } -+ -+ return 0; -+} -+ -+void dss_uninit_overlay_managers(struct platform_device *pdev) -+{ -+ struct omap_overlay_manager *mgr; -+ -+ while (!list_empty(&manager_list)) { -+ mgr = list_first_entry(&manager_list, -+ struct omap_overlay_manager, list); -+ list_del(&mgr->list); -+ kobject_del(&mgr->kobj); -+ kobject_put(&mgr->kobj); -+ kfree(mgr); -+ } -+ -+ num_managers = 0; -+} -+ -+int omap_dss_get_num_overlay_managers(void) -+{ -+ return num_managers; -+} -+EXPORT_SYMBOL(omap_dss_get_num_overlay_managers); -+ -+struct omap_overlay_manager *omap_dss_get_overlay_manager(int num) -+{ -+ int i = 0; -+ struct omap_overlay_manager *mgr; -+ -+ list_for_each_entry(mgr, &manager_list, list) { -+ if (i++ == num) -+ return mgr; -+ } -+ -+ return NULL; -+} -+EXPORT_SYMBOL(omap_dss_get_overlay_manager); -+ -+#ifdef L4_EXAMPLE -+static int ovl_mgr_apply_l4(struct omap_overlay_manager *mgr) -+{ -+ DSSDBG("omap_dss_mgr_apply_l4(%s)\n", mgr->name); -+ -+ return 0; -+} -+#endif -+ -diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c -new file mode 100644 -index 0000000..968edbe ---- /dev/null -+++ b/drivers/video/omap2/dss/overlay.c -@@ -0,0 +1,587 @@ -+/* -+ * linux/drivers/video/omap2/dss/overlay.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "OVERLAY" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "dss.h" -+ -+static int num_overlays; -+static struct list_head overlay_list; -+ -+static ssize_t overlay_name_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", ovl->name); -+} -+ -+static ssize_t overlay_manager_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ ovl->manager ? ovl->manager->name : ""); -+} -+ -+static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf, size_t size) -+{ -+ int i, r; -+ struct omap_overlay_manager *mgr = NULL; -+ int len = size; -+ -+ if (buf[size-1] == '\n') -+ --len; -+ -+ if (len > 0) { -+ for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { -+ mgr = omap_dss_get_overlay_manager(i); -+ -+ if (strncmp(buf, mgr->name, len) == 0) -+ break; -+ -+ mgr = NULL; -+ } -+ } -+ -+ if (len > 0 && mgr == NULL) -+ return -EINVAL; -+ -+ if (mgr) -+ DSSDBG("manager %s found\n", mgr->name); -+ -+ if (mgr != ovl->manager) { -+ /* detach old manager */ -+ if (ovl->manager) { -+ r = ovl->unset_manager(ovl); -+ if (r) { -+ DSSERR("detach failed\n"); -+ return r; -+ } -+ } -+ -+ if (mgr) { -+ r = ovl->set_manager(ovl, mgr); -+ if (r) { -+ DSSERR("Failed to attach overlay\n"); -+ return r; -+ } -+ } -+ } -+ -+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t overlay_input_size_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d,%d\n", -+ ovl->info.width, ovl->info.height); -+} -+ -+static ssize_t overlay_screen_width_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d\n", ovl->info.screen_width); -+} -+ -+static ssize_t overlay_position_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d,%d\n", -+ ovl->info.pos_x, ovl->info.pos_y); -+} -+ -+static ssize_t overlay_position_store(struct omap_overlay *ovl, -+ const char *buf, size_t size) -+{ -+ int r; -+ char *last; -+ struct omap_overlay_info info; -+ -+ ovl->get_overlay_info(ovl, &info); -+ -+ info.pos_x = simple_strtoul(buf, &last, 10); -+ ++last; -+ if (last - buf >= size) -+ return -EINVAL; -+ -+ info.pos_y = simple_strtoul(last, &last, 10); -+ -+ if ((r = ovl->set_overlay_info(ovl, &info))) -+ return r; -+ -+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t overlay_output_size_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d,%d\n", -+ ovl->info.out_width, ovl->info.out_height); -+} -+ -+static ssize_t overlay_output_size_store(struct omap_overlay *ovl, -+ const char *buf, size_t size) -+{ -+ int r; -+ char *last; -+ struct omap_overlay_info info; -+ -+ ovl->get_overlay_info(ovl, &info); -+ -+ info.out_width = simple_strtoul(buf, &last, 10); -+ ++last; -+ if (last - buf >= size) -+ return -EINVAL; -+ -+ info.out_height = simple_strtoul(last, &last, 10); -+ -+ if ((r = ovl->set_overlay_info(ovl, &info))) -+ return r; -+ -+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) -+ return r; -+ -+ return size; -+} -+ -+static ssize_t overlay_enabled_show(struct omap_overlay *ovl, char *buf) -+{ -+ return snprintf(buf, PAGE_SIZE, "%d\n", ovl->info.enabled); -+} -+ -+static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf, size_t size) -+{ -+ int r; -+ struct omap_overlay_info info; -+ -+ ovl->get_overlay_info(ovl, &info); -+ -+ info.enabled = simple_strtoul(buf, NULL, 10); -+ -+ if ((r = ovl->set_overlay_info(ovl, &info))) -+ return r; -+ -+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) -+ return r; -+ -+ return size; -+} -+ -+struct overlay_attribute { -+ struct attribute attr; -+ ssize_t (*show)(struct omap_overlay *, char *); -+ ssize_t (*store)(struct omap_overlay *, const char *, size_t); -+}; -+ -+#define OVERLAY_ATTR(_name, _mode, _show, _store) \ -+ struct overlay_attribute overlay_attr_##_name = \ -+ __ATTR(_name, _mode, _show, _store) -+ -+static OVERLAY_ATTR(name, S_IRUGO, overlay_name_show, NULL); -+static OVERLAY_ATTR(manager, S_IRUGO|S_IWUSR, -+ overlay_manager_show, overlay_manager_store); -+static OVERLAY_ATTR(input_size, S_IRUGO, overlay_input_size_show, NULL); -+static OVERLAY_ATTR(screen_width, S_IRUGO, overlay_screen_width_show, NULL); -+static OVERLAY_ATTR(position, S_IRUGO|S_IWUSR, -+ overlay_position_show, overlay_position_store); -+static OVERLAY_ATTR(output_size, S_IRUGO|S_IWUSR, -+ overlay_output_size_show, overlay_output_size_store); -+static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR, -+ overlay_enabled_show, overlay_enabled_store); -+ -+static struct attribute *overlay_sysfs_attrs[] = { -+ &overlay_attr_name.attr, -+ &overlay_attr_manager.attr, -+ &overlay_attr_input_size.attr, -+ &overlay_attr_screen_width.attr, -+ &overlay_attr_position.attr, -+ &overlay_attr_output_size.attr, -+ &overlay_attr_enabled.attr, -+ NULL -+}; -+ -+static ssize_t overlay_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) -+{ -+ struct omap_overlay *overlay; -+ struct overlay_attribute *overlay_attr; -+ -+ overlay = container_of(kobj, struct omap_overlay, kobj); -+ overlay_attr = container_of(attr, struct overlay_attribute, attr); -+ -+ if (!overlay_attr->show) -+ return -ENOENT; -+ -+ return overlay_attr->show(overlay, buf); -+} -+ -+static ssize_t overlay_attr_store(struct kobject *kobj, struct attribute *attr, -+ const char *buf, size_t size) -+{ -+ struct omap_overlay *overlay; -+ struct overlay_attribute *overlay_attr; -+ -+ overlay = container_of(kobj, struct omap_overlay, kobj); -+ overlay_attr = container_of(attr, struct overlay_attribute, attr); -+ -+ if (!overlay_attr->store) -+ return -ENOENT; -+ -+ return overlay_attr->store(overlay, buf, size); -+} -+ -+static struct sysfs_ops overlay_sysfs_ops = { -+ .show = overlay_attr_show, -+ .store = overlay_attr_store, -+}; -+ -+static struct kobj_type overlay_ktype = { -+ .sysfs_ops = &overlay_sysfs_ops, -+ .default_attrs = overlay_sysfs_attrs, -+}; -+ -+/* Check if overlay parameters are compatible with display */ -+int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display) -+{ -+ struct omap_overlay_info *info; -+ u16 outw, outh; -+ u16 dw, dh; -+ -+ if (!display) -+ return 0; -+ -+ if (!ovl->info.enabled) -+ return 0; -+ -+ info = &ovl->info; -+ -+ display->get_resolution(display, &dw, &dh); -+ -+ DSSDBG("check_overlay %d: (%d,%d %dx%d -> %dx%d) disp (%dx%d)\n", -+ ovl->id, -+ info->pos_x, info->pos_y, -+ info->width, info->height, -+ info->out_width, info->out_height, -+ dw, dh); -+ -+ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { -+ outw = info->width; -+ outh = info->height; -+ } else { -+ if (info->out_width == 0) -+ outw = info->width; -+ else -+ outw = info->out_width; -+ -+ if (info->out_height == 0) -+ outh = info->height; -+ else -+ outh = info->out_height; -+ } -+ -+ if (dw < info->pos_x + outw) { -+ DSSDBG("check_overlay failed 1: %d < %d + %d\n", -+ dw, info->pos_x, outw); -+ return -EINVAL; -+ } -+ -+ if (dh < info->pos_y + outh) { -+ DSSDBG("check_overlay failed 2: %d < %d + %d\n", -+ dh, info->pos_y, outh); -+ return -EINVAL; -+ } -+ -+ if ((ovl->supported_modes & info->color_mode) == 0) { -+ DSSERR("overlay doesn't support mode %d\n", info->color_mode); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int dss_ovl_set_overlay_info(struct omap_overlay *ovl, -+ struct omap_overlay_info *info) -+{ -+ int r; -+ struct omap_overlay_info old_info; -+ -+ old_info = ovl->info; -+ ovl->info = *info; -+ -+ if (ovl->manager) { -+ r = dss_check_overlay(ovl, ovl->manager->display); -+ if (r) { -+ ovl->info = old_info; -+ return r; -+ } -+ } -+ -+ return 0; -+} -+ -+static void dss_ovl_get_overlay_info(struct omap_overlay *ovl, -+ struct omap_overlay_info *info) -+{ -+ *info = ovl->info; -+} -+ -+static int omap_dss_set_manager(struct omap_overlay *ovl, -+ struct omap_overlay_manager *mgr) -+{ -+ int r; -+ -+ if (ovl->manager) { -+ DSSERR("overlay '%s' already has a manager '%s'\n", -+ ovl->name, ovl->manager->name); -+ } -+ -+ r = dss_check_overlay(ovl, mgr->display); -+ if (r) -+ return r; -+ -+ ovl->manager = mgr; -+ -+ return 0; -+} -+ -+static int omap_dss_unset_manager(struct omap_overlay *ovl) -+{ -+ if (!ovl->manager) { -+ DSSERR("failed to detach overlay: manager not set\n"); -+ return -EINVAL; -+ } -+ -+ ovl->manager = NULL; -+ -+ return 0; -+} -+ -+int omap_dss_get_num_overlays(void) -+{ -+ return num_overlays; -+} -+EXPORT_SYMBOL(omap_dss_get_num_overlays); -+ -+struct omap_overlay *omap_dss_get_overlay(int num) -+{ -+ int i = 0; -+ struct omap_overlay *ovl; -+ -+ list_for_each_entry(ovl, &overlay_list, list) { -+ if (i++ == num) -+ return ovl; -+ } -+ -+ return NULL; -+} -+EXPORT_SYMBOL(omap_dss_get_overlay); -+ -+static void omap_dss_add_overlay(struct omap_overlay *overlay) -+{ -+ ++num_overlays; -+ list_add_tail(&overlay->list, &overlay_list); -+} -+ -+static struct omap_overlay *dispc_overlays[3]; -+ -+void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr) -+{ -+ mgr->num_overlays = 3; -+ mgr->overlays = dispc_overlays; -+} -+ -+void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name) -+{ -+ int i, r; -+ struct omap_overlay_manager *lcd_mgr; -+ struct omap_overlay_manager *tv_mgr; -+ struct omap_overlay_manager *def_mgr = NULL; -+ -+ INIT_LIST_HEAD(&overlay_list); -+ -+ num_overlays = 0; -+ -+ for (i = 0; i < 3; ++i) { -+ struct omap_overlay *ovl; -+ ovl = kzalloc(sizeof(*ovl), GFP_KERNEL); -+ -+ BUG_ON(ovl == NULL); -+ -+ switch (i) { -+ case 0: -+ ovl->name = "gfx"; -+ ovl->id = OMAP_DSS_GFX; -+ ovl->supported_modes = OMAP_DSS_COLOR_GFX_OMAP3; -+ ovl->caps = OMAP_DSS_OVL_CAP_DISPC; -+ break; -+ case 1: -+ ovl->name = "vid1"; -+ ovl->id = OMAP_DSS_VIDEO1; -+ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3; -+ ovl->caps = OMAP_DSS_OVL_CAP_SCALE | -+ OMAP_DSS_OVL_CAP_DISPC; -+ break; -+ case 2: -+ ovl->name = "vid2"; -+ ovl->id = OMAP_DSS_VIDEO2; -+ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3; -+ ovl->caps = OMAP_DSS_OVL_CAP_SCALE | -+ OMAP_DSS_OVL_CAP_DISPC; -+ break; -+ } -+ -+ ovl->set_manager = &omap_dss_set_manager; -+ ovl->unset_manager = &omap_dss_unset_manager; -+ ovl->set_overlay_info = &dss_ovl_set_overlay_info; -+ ovl->get_overlay_info = &dss_ovl_get_overlay_info; -+ -+ omap_dss_add_overlay(ovl); -+ -+ r = kobject_init_and_add(&ovl->kobj, &overlay_ktype, -+ &pdev->dev.kobj, "overlay%d", i); -+ -+ if (r) { -+ DSSERR("failed to create sysfs file\n"); -+ continue; -+ } -+ -+ dispc_overlays[i] = ovl; -+ } -+ -+ lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD); -+ tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV); -+ -+ if (def_disp_name) { -+ for (i = 0; i < omap_dss_get_num_displays() ; i++) { -+ struct omap_display *display = dss_get_display(i); -+ -+ if (strcmp(display->name, def_disp_name) == 0) { -+ if (display->type != OMAP_DISPLAY_TYPE_VENC) { -+ lcd_mgr->set_display(lcd_mgr, display); -+ def_mgr = lcd_mgr; -+ } else { -+ lcd_mgr->set_display(tv_mgr, display); -+ def_mgr = tv_mgr; -+ } -+ -+ break; -+ } -+ } -+ -+ if (!def_mgr) -+ DSSWARN("default display %s not found\n", -+ def_disp_name); -+ } -+ -+ if (def_mgr != lcd_mgr) { -+ /* connect lcd manager to first non-VENC display found */ -+ for (i = 0; i < omap_dss_get_num_displays(); i++) { -+ struct omap_display *display = dss_get_display(i); -+ if (display->type != OMAP_DISPLAY_TYPE_VENC) { -+ lcd_mgr->set_display(lcd_mgr, display); -+ -+ if (!def_mgr) -+ def_mgr = lcd_mgr; -+ -+ break; -+ } -+ } -+ } -+ -+ if (def_mgr != tv_mgr) { -+ /* connect tv manager to first VENC display found */ -+ for (i = 0; i < omap_dss_get_num_displays(); i++) { -+ struct omap_display *display = dss_get_display(i); -+ if (display->type == OMAP_DISPLAY_TYPE_VENC) { -+ tv_mgr->set_display(tv_mgr, display); -+ -+ if (!def_mgr) -+ def_mgr = tv_mgr; -+ -+ break; -+ } -+ } -+ } -+ -+ /* connect all dispc overlays to def_mgr */ -+ if (def_mgr) { -+ for (i = 0; i < 3; i++) { -+ struct omap_overlay *ovl; -+ ovl = omap_dss_get_overlay(i); -+ omap_dss_set_manager(ovl, def_mgr); -+ } -+ } -+ -+#ifdef L4_EXAMPLE -+ /* setup L4 overlay as an example */ -+ { -+ static struct omap_overlay ovl = { -+ .name = "l4-ovl", -+ .supported_modes = OMAP_DSS_COLOR_RGB24U, -+ .set_manager = &omap_dss_set_manager, -+ .unset_manager = &omap_dss_unset_manager, -+ .setup_input = &omap_dss_setup_overlay_input, -+ .setup_output = &omap_dss_setup_overlay_output, -+ .enable = &omap_dss_enable_overlay, -+ }; -+ -+ static struct omap_overlay_manager mgr = { -+ .name = "l4", -+ .num_overlays = 1, -+ .overlays = &ovl, -+ .set_display = &omap_dss_set_display, -+ .unset_display = &omap_dss_unset_display, -+ .apply = &ovl_mgr_apply_l4, -+ .supported_displays = -+ OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI, -+ }; -+ -+ omap_dss_add_overlay(&ovl); -+ omap_dss_add_overlay_manager(&mgr); -+ omap_dss_set_manager(&ovl, &mgr); -+ } -+#endif -+} -+ -+void dss_uninit_overlays(struct platform_device *pdev) -+{ -+ struct omap_overlay *ovl; -+ -+ while (!list_empty(&overlay_list)) { -+ ovl = list_first_entry(&overlay_list, -+ struct omap_overlay, list); -+ list_del(&ovl->list); -+ kobject_del(&ovl->kobj); -+ kobject_put(&ovl->kobj); -+ kfree(ovl); -+ } -+ -+ num_overlays = 0; -+} -+ -diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c -new file mode 100644 -index 0000000..3e9ae1e ---- /dev/null -+++ b/drivers/video/omap2/dss/rfbi.c -@@ -0,0 +1,1304 @@ -+/* -+ * linux/drivers/video/omap2/dss/rfbi.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "RFBI" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include "dss.h" -+ -+/*#define MEASURE_PERF*/ -+ -+#define RFBI_BASE 0x48050800 -+ -+struct rfbi_reg { u16 idx; }; -+ -+#define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) -+ -+#define RFBI_REVISION RFBI_REG(0x0000) -+#define RFBI_SYSCONFIG RFBI_REG(0x0010) -+#define RFBI_SYSSTATUS RFBI_REG(0x0014) -+#define RFBI_CONTROL RFBI_REG(0x0040) -+#define RFBI_PIXEL_CNT RFBI_REG(0x0044) -+#define RFBI_LINE_NUMBER RFBI_REG(0x0048) -+#define RFBI_CMD RFBI_REG(0x004c) -+#define RFBI_PARAM RFBI_REG(0x0050) -+#define RFBI_DATA RFBI_REG(0x0054) -+#define RFBI_READ RFBI_REG(0x0058) -+#define RFBI_STATUS RFBI_REG(0x005c) -+ -+#define RFBI_CONFIG(n) RFBI_REG(0x0060 + (n)*0x18) -+#define RFBI_ONOFF_TIME(n) RFBI_REG(0x0064 + (n)*0x18) -+#define RFBI_CYCLE_TIME(n) RFBI_REG(0x0068 + (n)*0x18) -+#define RFBI_DATA_CYCLE1(n) RFBI_REG(0x006c + (n)*0x18) -+#define RFBI_DATA_CYCLE2(n) RFBI_REG(0x0070 + (n)*0x18) -+#define RFBI_DATA_CYCLE3(n) RFBI_REG(0x0074 + (n)*0x18) -+ -+#define RFBI_VSYNC_WIDTH RFBI_REG(0x0090) -+#define RFBI_HSYNC_WIDTH RFBI_REG(0x0094) -+ -+#define RFBI_CMD_FIFO_LEN_BYTES (16 * sizeof(struct update_param)) -+ -+#define REG_FLD_MOD(idx, val, start, end) \ -+ rfbi_write_reg(idx, FLD_MOD(rfbi_read_reg(idx), val, start, end)) -+ -+/* To work around an RFBI transfer rate limitation */ -+#define OMAP_RFBI_RATE_LIMIT 1 -+ -+enum omap_rfbi_cycleformat { -+ OMAP_DSS_RFBI_CYCLEFORMAT_1_1 = 0, -+ OMAP_DSS_RFBI_CYCLEFORMAT_2_1 = 1, -+ OMAP_DSS_RFBI_CYCLEFORMAT_3_1 = 2, -+ OMAP_DSS_RFBI_CYCLEFORMAT_3_2 = 3, -+}; -+ -+enum omap_rfbi_datatype { -+ OMAP_DSS_RFBI_DATATYPE_12 = 0, -+ OMAP_DSS_RFBI_DATATYPE_16 = 1, -+ OMAP_DSS_RFBI_DATATYPE_18 = 2, -+ OMAP_DSS_RFBI_DATATYPE_24 = 3, -+}; -+ -+enum omap_rfbi_parallelmode { -+ OMAP_DSS_RFBI_PARALLELMODE_8 = 0, -+ OMAP_DSS_RFBI_PARALLELMODE_9 = 1, -+ OMAP_DSS_RFBI_PARALLELMODE_12 = 2, -+ OMAP_DSS_RFBI_PARALLELMODE_16 = 3, -+}; -+ -+enum update_cmd { -+ RFBI_CMD_UPDATE = 0, -+ RFBI_CMD_SYNC = 1, -+}; -+ -+static int rfbi_convert_timings(struct rfbi_timings *t); -+static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); -+static void process_cmd_fifo(void); -+ -+static struct { -+ void __iomem *base; -+ -+ unsigned long l4_khz; -+ -+ enum omap_rfbi_datatype datatype; -+ enum omap_rfbi_parallelmode parallelmode; -+ -+ enum omap_rfbi_te_mode te_mode; -+ int te_enabled; -+ -+ void (*framedone_callback)(void *data); -+ void *framedone_callback_data; -+ -+ struct omap_display *display[2]; -+ -+ struct kfifo *cmd_fifo; -+ spinlock_t cmd_lock; -+ struct completion cmd_done; -+ atomic_t cmd_fifo_full; -+ atomic_t cmd_pending; -+#ifdef MEASURE_PERF -+ unsigned perf_bytes; -+ ktime_t perf_setup_time; -+ ktime_t perf_start_time; -+#endif -+} rfbi; -+ -+struct update_region { -+ u16 x; -+ u16 y; -+ u16 w; -+ u16 h; -+}; -+ -+struct update_param { -+ u8 rfbi_module; -+ u8 cmd; -+ -+ union { -+ struct update_region r; -+ struct completion *sync; -+ } par; -+}; -+ -+static inline void rfbi_write_reg(const struct rfbi_reg idx, u32 val) -+{ -+ __raw_writel(val, rfbi.base + idx.idx); -+} -+ -+static inline u32 rfbi_read_reg(const struct rfbi_reg idx) -+{ -+ return __raw_readl(rfbi.base + idx.idx); -+} -+ -+static void rfbi_enable_clocks(bool enable) -+{ -+ if (enable) -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ else -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+} -+ -+void omap_rfbi_write_command(const void *buf, u32 len) -+{ -+ rfbi_enable_clocks(1); -+ switch (rfbi.parallelmode) { -+ case OMAP_DSS_RFBI_PARALLELMODE_8: -+ { -+ const u8 *b = buf; -+ for (; len; len--) -+ rfbi_write_reg(RFBI_CMD, *b++); -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_16: -+ { -+ const u16 *w = buf; -+ BUG_ON(len & 1); -+ for (; len; len -= 2) -+ rfbi_write_reg(RFBI_CMD, *w++); -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_9: -+ case OMAP_DSS_RFBI_PARALLELMODE_12: -+ default: -+ BUG(); -+ } -+ rfbi_enable_clocks(0); -+} -+EXPORT_SYMBOL(omap_rfbi_write_command); -+ -+void omap_rfbi_read_data(void *buf, u32 len) -+{ -+ rfbi_enable_clocks(1); -+ switch (rfbi.parallelmode) { -+ case OMAP_DSS_RFBI_PARALLELMODE_8: -+ { -+ u8 *b = buf; -+ for (; len; len--) { -+ rfbi_write_reg(RFBI_READ, 0); -+ *b++ = rfbi_read_reg(RFBI_READ); -+ } -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_16: -+ { -+ u16 *w = buf; -+ BUG_ON(len & ~1); -+ for (; len; len -= 2) { -+ rfbi_write_reg(RFBI_READ, 0); -+ *w++ = rfbi_read_reg(RFBI_READ); -+ } -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_9: -+ case OMAP_DSS_RFBI_PARALLELMODE_12: -+ default: -+ BUG(); -+ } -+ rfbi_enable_clocks(0); -+} -+EXPORT_SYMBOL(omap_rfbi_read_data); -+ -+void omap_rfbi_write_data(const void *buf, u32 len) -+{ -+ rfbi_enable_clocks(1); -+ switch (rfbi.parallelmode) { -+ case OMAP_DSS_RFBI_PARALLELMODE_8: -+ { -+ const u8 *b = buf; -+ for (; len; len--) -+ rfbi_write_reg(RFBI_PARAM, *b++); -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_16: -+ { -+ const u16 *w = buf; -+ BUG_ON(len & 1); -+ for (; len; len -= 2) -+ rfbi_write_reg(RFBI_PARAM, *w++); -+ break; -+ } -+ -+ case OMAP_DSS_RFBI_PARALLELMODE_9: -+ case OMAP_DSS_RFBI_PARALLELMODE_12: -+ default: -+ BUG(); -+ -+ } -+ rfbi_enable_clocks(0); -+} -+EXPORT_SYMBOL(omap_rfbi_write_data); -+ -+void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, -+ u16 x, u16 y, -+ u16 w, u16 h) -+{ -+ int start_offset = scr_width * y + x; -+ int horiz_offset = scr_width - w; -+ int i; -+ -+ rfbi_enable_clocks(1); -+ -+ if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && -+ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { -+ const u16 __iomem *pd = buf; -+ pd += start_offset; -+ -+ for (; h; --h) { -+ for (i = 0; i < w; ++i) { -+ const u8 __iomem *b = (const u8 __iomem *)pd; -+ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); -+ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); -+ ++pd; -+ } -+ pd += horiz_offset; -+ } -+ } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_24 && -+ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { -+ const u32 __iomem *pd = buf; -+ pd += start_offset; -+ -+ for (; h; --h) { -+ for (i = 0; i < w; ++i) { -+ const u8 __iomem *b = (const u8 __iomem *)pd; -+ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+2)); -+ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); -+ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); -+ ++pd; -+ } -+ pd += horiz_offset; -+ } -+ } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && -+ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_16) { -+ const u16 __iomem *pd = buf; -+ pd += start_offset; -+ -+ for (; h; --h) { -+ for (i = 0; i < w; ++i) { -+ rfbi_write_reg(RFBI_PARAM, __raw_readw(pd)); -+ ++pd; -+ } -+ pd += horiz_offset; -+ } -+ } else { -+ BUG(); -+ } -+ -+ rfbi_enable_clocks(0); -+} -+EXPORT_SYMBOL(omap_rfbi_write_pixels); -+ -+#ifdef MEASURE_PERF -+static void perf_mark_setup(void) -+{ -+ rfbi.perf_setup_time = ktime_get(); -+} -+ -+static void perf_mark_start(void) -+{ -+ rfbi.perf_start_time = ktime_get(); -+} -+ -+static void perf_show(const char *name) -+{ -+ ktime_t t, setup_time, trans_time; -+ u32 total_bytes; -+ u32 setup_us, trans_us, total_us; -+ -+ t = ktime_get(); -+ -+ setup_time = ktime_sub(rfbi.perf_start_time, rfbi.perf_setup_time); -+ setup_us = (u32)ktime_to_us(setup_time); -+ if (setup_us == 0) -+ setup_us = 1; -+ -+ trans_time = ktime_sub(t, rfbi.perf_start_time); -+ trans_us = (u32)ktime_to_us(trans_time); -+ if (trans_us == 0) -+ trans_us = 1; -+ -+ total_us = setup_us + trans_us; -+ -+ total_bytes = rfbi.perf_bytes; -+ -+ DSSINFO("%s update %u us + %u us = %u us (%uHz), %u bytes, " -+ "%u kbytes/sec\n", -+ name, -+ setup_us, -+ trans_us, -+ total_us, -+ 1000*1000 / total_us, -+ total_bytes, -+ total_bytes * 1000 / total_us); -+} -+#else -+#define perf_mark_setup() -+#define perf_mark_start() -+#define perf_show(x) -+#endif -+ -+void rfbi_transfer_area(u16 width, u16 height, -+ void (callback)(void *data), void *data) -+{ -+ u32 l; -+ -+ /*BUG_ON(callback == 0);*/ -+ BUG_ON(rfbi.framedone_callback != NULL); -+ -+ DSSDBG("rfbi_transfer_area %dx%d\n", width, height); -+ -+ dispc_set_lcd_size(width, height); -+ -+ dispc_enable_lcd_out(1); -+ -+ rfbi.framedone_callback = callback; -+ rfbi.framedone_callback_data = data; -+ -+ rfbi_enable_clocks(1); -+ -+ rfbi_write_reg(RFBI_PIXEL_CNT, width * height); -+ -+ l = rfbi_read_reg(RFBI_CONTROL); -+ l = FLD_MOD(l, 1, 0, 0); /* enable */ -+ if (!rfbi.te_enabled) -+ l = FLD_MOD(l, 1, 4, 4); /* ITE */ -+ -+ perf_mark_start(); -+ -+ rfbi_write_reg(RFBI_CONTROL, l); -+} -+ -+static void framedone_callback(void *data, u32 mask) -+{ -+ void (*callback)(void *data); -+ -+ DSSDBG("FRAMEDONE\n"); -+ -+ perf_show("DISPC"); -+ -+ REG_FLD_MOD(RFBI_CONTROL, 0, 0, 0); -+ -+ rfbi_enable_clocks(0); -+ -+ callback = rfbi.framedone_callback; -+ rfbi.framedone_callback = NULL; -+ -+ /*callback(rfbi.framedone_callback_data);*/ -+ -+ atomic_set(&rfbi.cmd_pending, 0); -+ -+ process_cmd_fifo(); -+} -+ -+#if 1 /* VERBOSE */ -+static void rfbi_print_timings(void) -+{ -+ u32 l; -+ u32 time; -+ -+ l = rfbi_read_reg(RFBI_CONFIG(0)); -+ time = 1000000000 / rfbi.l4_khz; -+ if (l & (1 << 4)) -+ time *= 2; -+ -+ DSSDBG("Tick time %u ps\n", time); -+ l = rfbi_read_reg(RFBI_ONOFF_TIME(0)); -+ DSSDBG("CSONTIME %d, CSOFFTIME %d, WEONTIME %d, WEOFFTIME %d, " -+ "REONTIME %d, REOFFTIME %d\n", -+ l & 0x0f, (l >> 4) & 0x3f, (l >> 10) & 0x0f, (l >> 14) & 0x3f, -+ (l >> 20) & 0x0f, (l >> 24) & 0x3f); -+ -+ l = rfbi_read_reg(RFBI_CYCLE_TIME(0)); -+ DSSDBG("WECYCLETIME %d, RECYCLETIME %d, CSPULSEWIDTH %d, " -+ "ACCESSTIME %d\n", -+ (l & 0x3f), (l >> 6) & 0x3f, (l >> 12) & 0x3f, -+ (l >> 22) & 0x3f); -+} -+#else -+static void rfbi_print_timings(void) {} -+#endif -+ -+ -+ -+ -+static u32 extif_clk_period; -+ -+static inline unsigned long round_to_extif_ticks(unsigned long ps, int div) -+{ -+ int bus_tick = extif_clk_period * div; -+ return (ps + bus_tick - 1) / bus_tick * bus_tick; -+} -+ -+static int calc_reg_timing(struct rfbi_timings *t, int div) -+{ -+ t->clk_div = div; -+ -+ t->cs_on_time = round_to_extif_ticks(t->cs_on_time, div); -+ -+ t->we_on_time = round_to_extif_ticks(t->we_on_time, div); -+ t->we_off_time = round_to_extif_ticks(t->we_off_time, div); -+ t->we_cycle_time = round_to_extif_ticks(t->we_cycle_time, div); -+ -+ t->re_on_time = round_to_extif_ticks(t->re_on_time, div); -+ t->re_off_time = round_to_extif_ticks(t->re_off_time, div); -+ t->re_cycle_time = round_to_extif_ticks(t->re_cycle_time, div); -+ -+ t->access_time = round_to_extif_ticks(t->access_time, div); -+ t->cs_off_time = round_to_extif_ticks(t->cs_off_time, div); -+ t->cs_pulse_width = round_to_extif_ticks(t->cs_pulse_width, div); -+ -+ DSSDBG("[reg]cson %d csoff %d reon %d reoff %d\n", -+ t->cs_on_time, t->cs_off_time, t->re_on_time, t->re_off_time); -+ DSSDBG("[reg]weon %d weoff %d recyc %d wecyc %d\n", -+ t->we_on_time, t->we_off_time, t->re_cycle_time, -+ t->we_cycle_time); -+ DSSDBG("[reg]rdaccess %d cspulse %d\n", -+ t->access_time, t->cs_pulse_width); -+ -+ return rfbi_convert_timings(t); -+} -+ -+static int calc_extif_timings(struct rfbi_timings *t) -+{ -+ u32 max_clk_div; -+ int div; -+ -+ rfbi_get_clk_info(&extif_clk_period, &max_clk_div); -+ for (div = 1; div <= max_clk_div; div++) { -+ if (calc_reg_timing(t, div) == 0) -+ break; -+ } -+ -+ if (div <= max_clk_div) -+ return 0; -+ -+ DSSERR("can't setup timings\n"); -+ return -1; -+} -+ -+ -+void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t) -+{ -+ int r; -+ -+ if (!t->converted) { -+ r = calc_extif_timings(t); -+ if (r < 0) -+ DSSERR("Failed to calc timings\n"); -+ } -+ -+ BUG_ON(!t->converted); -+ -+ rfbi_enable_clocks(1); -+ rfbi_write_reg(RFBI_ONOFF_TIME(rfbi_module), t->tim[0]); -+ rfbi_write_reg(RFBI_CYCLE_TIME(rfbi_module), t->tim[1]); -+ -+ /* TIMEGRANULARITY */ -+ REG_FLD_MOD(RFBI_CONFIG(rfbi_module), -+ (t->tim[2] ? 1 : 0), 4, 4); -+ -+ rfbi_print_timings(); -+ rfbi_enable_clocks(0); -+} -+ -+static int ps_to_rfbi_ticks(int time, int div) -+{ -+ unsigned long tick_ps; -+ int ret; -+ -+ /* Calculate in picosecs to yield more exact results */ -+ tick_ps = 1000000000 / (rfbi.l4_khz) * div; -+ -+ ret = (time + tick_ps - 1) / tick_ps; -+ -+ return ret; -+} -+ -+#ifdef OMAP_RFBI_RATE_LIMIT -+unsigned long rfbi_get_max_tx_rate(void) -+{ -+ unsigned long l4_rate, dss1_rate; -+ int min_l4_ticks = 0; -+ int i; -+ -+ /* According to TI this can't be calculated so make the -+ * adjustments for a couple of known frequencies and warn for -+ * others. -+ */ -+ static const struct { -+ unsigned long l4_clk; /* HZ */ -+ unsigned long dss1_clk; /* HZ */ -+ unsigned long min_l4_ticks; -+ } ftab[] = { -+ { 55, 132, 7, }, /* 7.86 MPix/s */ -+ { 110, 110, 12, }, /* 9.16 MPix/s */ -+ { 110, 132, 10, }, /* 11 Mpix/s */ -+ { 120, 120, 10, }, /* 12 Mpix/s */ -+ { 133, 133, 10, }, /* 13.3 Mpix/s */ -+ }; -+ -+ l4_rate = rfbi.l4_khz / 1000; -+ dss1_rate = dss_clk_get_rate(DSS_CLK_FCK1) / 1000000; -+ -+ for (i = 0; i < ARRAY_SIZE(ftab); i++) { -+ /* Use a window instead of an exact match, to account -+ * for different DPLL multiplier / divider pairs. -+ */ -+ if (abs(ftab[i].l4_clk - l4_rate) < 3 && -+ abs(ftab[i].dss1_clk - dss1_rate) < 3) { -+ min_l4_ticks = ftab[i].min_l4_ticks; -+ break; -+ } -+ } -+ if (i == ARRAY_SIZE(ftab)) { -+ /* Can't be sure, return anyway the maximum not -+ * rate-limited. This might cause a problem only for the -+ * tearing synchronisation. -+ */ -+ DSSERR("can't determine maximum RFBI transfer rate\n"); -+ return rfbi.l4_khz * 1000; -+ } -+ return rfbi.l4_khz * 1000 / min_l4_ticks; -+} -+#else -+int rfbi_get_max_tx_rate(void) -+{ -+ return rfbi.l4_khz * 1000; -+} -+#endif -+ -+static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div) -+{ -+ *clk_period = 1000000000 / rfbi.l4_khz; -+ *max_clk_div = 2; -+} -+ -+static int rfbi_convert_timings(struct rfbi_timings *t) -+{ -+ u32 l; -+ int reon, reoff, weon, weoff, cson, csoff, cs_pulse; -+ int actim, recyc, wecyc; -+ int div = t->clk_div; -+ -+ if (div <= 0 || div > 2) -+ return -1; -+ -+ /* Make sure that after conversion it still holds that: -+ * weoff > weon, reoff > reon, recyc >= reoff, wecyc >= weoff, -+ * csoff > cson, csoff >= max(weoff, reoff), actim > reon -+ */ -+ weon = ps_to_rfbi_ticks(t->we_on_time, div); -+ weoff = ps_to_rfbi_ticks(t->we_off_time, div); -+ if (weoff <= weon) -+ weoff = weon + 1; -+ if (weon > 0x0f) -+ return -1; -+ if (weoff > 0x3f) -+ return -1; -+ -+ reon = ps_to_rfbi_ticks(t->re_on_time, div); -+ reoff = ps_to_rfbi_ticks(t->re_off_time, div); -+ if (reoff <= reon) -+ reoff = reon + 1; -+ if (reon > 0x0f) -+ return -1; -+ if (reoff > 0x3f) -+ return -1; -+ -+ cson = ps_to_rfbi_ticks(t->cs_on_time, div); -+ csoff = ps_to_rfbi_ticks(t->cs_off_time, div); -+ if (csoff <= cson) -+ csoff = cson + 1; -+ if (csoff < max(weoff, reoff)) -+ csoff = max(weoff, reoff); -+ if (cson > 0x0f) -+ return -1; -+ if (csoff > 0x3f) -+ return -1; -+ -+ l = cson; -+ l |= csoff << 4; -+ l |= weon << 10; -+ l |= weoff << 14; -+ l |= reon << 20; -+ l |= reoff << 24; -+ -+ t->tim[0] = l; -+ -+ actim = ps_to_rfbi_ticks(t->access_time, div); -+ if (actim <= reon) -+ actim = reon + 1; -+ if (actim > 0x3f) -+ return -1; -+ -+ wecyc = ps_to_rfbi_ticks(t->we_cycle_time, div); -+ if (wecyc < weoff) -+ wecyc = weoff; -+ if (wecyc > 0x3f) -+ return -1; -+ -+ recyc = ps_to_rfbi_ticks(t->re_cycle_time, div); -+ if (recyc < reoff) -+ recyc = reoff; -+ if (recyc > 0x3f) -+ return -1; -+ -+ cs_pulse = ps_to_rfbi_ticks(t->cs_pulse_width, div); -+ if (cs_pulse > 0x3f) -+ return -1; -+ -+ l = wecyc; -+ l |= recyc << 6; -+ l |= cs_pulse << 12; -+ l |= actim << 22; -+ -+ t->tim[1] = l; -+ -+ t->tim[2] = div - 1; -+ -+ t->converted = 1; -+ -+ return 0; -+} -+ -+/* xxx FIX module selection missing */ -+int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, -+ unsigned hs_pulse_time, unsigned vs_pulse_time, -+ int hs_pol_inv, int vs_pol_inv, int extif_div) -+{ -+ int hs, vs; -+ int min; -+ u32 l; -+ -+ hs = ps_to_rfbi_ticks(hs_pulse_time, 1); -+ vs = ps_to_rfbi_ticks(vs_pulse_time, 1); -+ if (hs < 2) -+ return -EDOM; -+ if (mode == OMAP_DSS_RFBI_TE_MODE_2) -+ min = 2; -+ else /* OMAP_DSS_RFBI_TE_MODE_1 */ -+ min = 4; -+ if (vs < min) -+ return -EDOM; -+ if (vs == hs) -+ return -EINVAL; -+ rfbi.te_mode = mode; -+ DSSDBG("setup_te: mode %d hs %d vs %d hs_inv %d vs_inv %d\n", -+ mode, hs, vs, hs_pol_inv, vs_pol_inv); -+ -+ rfbi_enable_clocks(1); -+ rfbi_write_reg(RFBI_HSYNC_WIDTH, hs); -+ rfbi_write_reg(RFBI_VSYNC_WIDTH, vs); -+ -+ l = rfbi_read_reg(RFBI_CONFIG(0)); -+ if (hs_pol_inv) -+ l &= ~(1 << 21); -+ else -+ l |= 1 << 21; -+ if (vs_pol_inv) -+ l &= ~(1 << 20); -+ else -+ l |= 1 << 20; -+ rfbi_enable_clocks(0); -+ -+ return 0; -+} -+EXPORT_SYMBOL(omap_rfbi_setup_te); -+ -+/* xxx FIX module selection missing */ -+int omap_rfbi_enable_te(bool enable, unsigned line) -+{ -+ u32 l; -+ -+ DSSDBG("te %d line %d mode %d\n", enable, line, rfbi.te_mode); -+ if (line > (1 << 11) - 1) -+ return -EINVAL; -+ -+ rfbi_enable_clocks(1); -+ l = rfbi_read_reg(RFBI_CONFIG(0)); -+ l &= ~(0x3 << 2); -+ if (enable) { -+ rfbi.te_enabled = 1; -+ l |= rfbi.te_mode << 2; -+ } else -+ rfbi.te_enabled = 0; -+ rfbi_write_reg(RFBI_CONFIG(0), l); -+ rfbi_write_reg(RFBI_LINE_NUMBER, line); -+ rfbi_enable_clocks(0); -+ -+ return 0; -+} -+EXPORT_SYMBOL(omap_rfbi_enable_te); -+ -+#if 0 -+static void rfbi_enable_config(int enable1, int enable2) -+{ -+ u32 l; -+ int cs = 0; -+ -+ if (enable1) -+ cs |= 1<<0; -+ if (enable2) -+ cs |= 1<<1; -+ -+ rfbi_enable_clocks(1); -+ -+ l = rfbi_read_reg(RFBI_CONTROL); -+ -+ l = FLD_MOD(l, cs, 3, 2); -+ l = FLD_MOD(l, 0, 1, 1); -+ -+ rfbi_write_reg(RFBI_CONTROL, l); -+ -+ -+ l = rfbi_read_reg(RFBI_CONFIG(0)); -+ l = FLD_MOD(l, 0, 3, 2); /* TRIGGERMODE: ITE */ -+ /*l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ -+ /*l |= FLD_VAL(0, 8, 7); */ /* L4FORMAT, 1pix/L4 */ -+ -+ l = FLD_MOD(l, 0, 16, 16); /* A0POLARITY */ -+ l = FLD_MOD(l, 1, 20, 20); /* TE_VSYNC_POLARITY */ -+ l = FLD_MOD(l, 1, 21, 21); /* HSYNCPOLARITY */ -+ -+ l = FLD_MOD(l, OMAP_DSS_RFBI_PARALLELMODE_8, 1, 0); -+ rfbi_write_reg(RFBI_CONFIG(0), l); -+ -+ rfbi_enable_clocks(0); -+} -+#endif -+ -+int rfbi_configure(int rfbi_module, int bpp, int lines) -+{ -+ u32 l; -+ int cycle1 = 0, cycle2 = 0, cycle3 = 0; -+ enum omap_rfbi_cycleformat cycleformat; -+ enum omap_rfbi_datatype datatype; -+ enum omap_rfbi_parallelmode parallelmode; -+ -+ switch (bpp) { -+ case 12: -+ datatype = OMAP_DSS_RFBI_DATATYPE_12; -+ break; -+ case 16: -+ datatype = OMAP_DSS_RFBI_DATATYPE_16; -+ break; -+ case 18: -+ datatype = OMAP_DSS_RFBI_DATATYPE_18; -+ break; -+ case 24: -+ datatype = OMAP_DSS_RFBI_DATATYPE_24; -+ break; -+ default: -+ BUG(); -+ return 1; -+ } -+ rfbi.datatype = datatype; -+ -+ switch (lines) { -+ case 8: -+ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_8; -+ break; -+ case 9: -+ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_9; -+ break; -+ case 12: -+ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_12; -+ break; -+ case 16: -+ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_16; -+ break; -+ default: -+ BUG(); -+ return 1; -+ } -+ rfbi.parallelmode = parallelmode; -+ -+ if ((bpp % lines) == 0) { -+ switch (bpp / lines) { -+ case 1: -+ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_1_1; -+ break; -+ case 2: -+ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_2_1; -+ break; -+ case 3: -+ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_1; -+ break; -+ default: -+ BUG(); -+ return 1; -+ } -+ } else if ((2 * bpp % lines) == 0) { -+ if ((2 * bpp / lines) == 3) -+ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_2; -+ else { -+ BUG(); -+ return 1; -+ } -+ } else { -+ BUG(); -+ return 1; -+ } -+ -+ switch (cycleformat) { -+ case OMAP_DSS_RFBI_CYCLEFORMAT_1_1: -+ cycle1 = lines; -+ break; -+ -+ case OMAP_DSS_RFBI_CYCLEFORMAT_2_1: -+ cycle1 = lines; -+ cycle2 = lines; -+ break; -+ -+ case OMAP_DSS_RFBI_CYCLEFORMAT_3_1: -+ cycle1 = lines; -+ cycle2 = lines; -+ cycle3 = lines; -+ break; -+ -+ case OMAP_DSS_RFBI_CYCLEFORMAT_3_2: -+ cycle1 = lines; -+ cycle2 = (lines / 2) | ((lines / 2) << 16); -+ cycle3 = (lines << 16); -+ break; -+ } -+ -+ rfbi_enable_clocks(1); -+ -+ REG_FLD_MOD(RFBI_CONTROL, 0, 3, 2); /* clear CS */ -+ -+ l = 0; -+ l |= FLD_VAL(parallelmode, 1, 0); -+ l |= FLD_VAL(0, 3, 2); /* TRIGGERMODE: ITE */ -+ l |= FLD_VAL(0, 4, 4); /* TIMEGRANULARITY */ -+ l |= FLD_VAL(datatype, 6, 5); -+ /* l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ -+ l |= FLD_VAL(0, 8, 7); /* L4FORMAT, 1pix/L4 */ -+ l |= FLD_VAL(cycleformat, 10, 9); -+ l |= FLD_VAL(0, 12, 11); /* UNUSEDBITS */ -+ l |= FLD_VAL(0, 16, 16); /* A0POLARITY */ -+ l |= FLD_VAL(0, 17, 17); /* REPOLARITY */ -+ l |= FLD_VAL(0, 18, 18); /* WEPOLARITY */ -+ l |= FLD_VAL(0, 19, 19); /* CSPOLARITY */ -+ l |= FLD_VAL(1, 20, 20); /* TE_VSYNC_POLARITY */ -+ l |= FLD_VAL(1, 21, 21); /* HSYNCPOLARITY */ -+ rfbi_write_reg(RFBI_CONFIG(rfbi_module), l); -+ -+ rfbi_write_reg(RFBI_DATA_CYCLE1(rfbi_module), cycle1); -+ rfbi_write_reg(RFBI_DATA_CYCLE2(rfbi_module), cycle2); -+ rfbi_write_reg(RFBI_DATA_CYCLE3(rfbi_module), cycle3); -+ -+ -+ l = rfbi_read_reg(RFBI_CONTROL); -+ l = FLD_MOD(l, rfbi_module+1, 3, 2); /* Select CSx */ -+ l = FLD_MOD(l, 0, 1, 1); /* clear bypass */ -+ rfbi_write_reg(RFBI_CONTROL, l); -+ -+ -+ DSSDBG("RFBI config: bpp %d, lines %d, cycles: 0x%x 0x%x 0x%x\n", -+ bpp, lines, cycle1, cycle2, cycle3); -+ -+ rfbi_enable_clocks(0); -+ -+ return 0; -+} -+EXPORT_SYMBOL(rfbi_configure); -+ -+static int rfbi_find_display(struct omap_display *disp) -+{ -+ if (disp == rfbi.display[0]) -+ return 0; -+ -+ if (disp == rfbi.display[1]) -+ return 1; -+ -+ BUG(); -+ return -1; -+} -+ -+ -+static void signal_fifo_waiters(void) -+{ -+ if (atomic_read(&rfbi.cmd_fifo_full) > 0) { -+ /* DSSDBG("SIGNALING: Fifo not full for waiter!\n"); */ -+ complete(&rfbi.cmd_done); -+ atomic_dec(&rfbi.cmd_fifo_full); -+ } -+} -+ -+/* returns 1 for async op, and 0 for sync op */ -+static int do_update(struct omap_display *display, struct update_region *upd) -+{ -+ u16 x = upd->x; -+ u16 y = upd->y; -+ u16 w = upd->w; -+ u16 h = upd->h; -+ -+ perf_mark_setup(); -+ -+ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { -+ /*display->ctrl->enable_te(display, 1); */ -+ dispc_setup_partial_planes(display, &x, &y, &w, &h); -+ } -+ -+#ifdef MEASURE_PERF -+ rfbi.perf_bytes = w * h * 2; /* XXX always 16bit */ -+#endif -+ -+ display->ctrl->setup_update(display, x, y, w, h); -+ -+ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { -+ rfbi_transfer_area(w, h, NULL, NULL); -+ return 1; -+ } else { -+ struct omap_overlay *ovl; -+ void __iomem *addr; -+ int scr_width; -+ -+ ovl = display->manager->overlays[0]; -+ scr_width = ovl->info.screen_width; -+ addr = ovl->info.vaddr; -+ -+ omap_rfbi_write_pixels(addr, scr_width, x, y, w, h); -+ -+ perf_show("L4"); -+ -+ return 0; -+ } -+} -+ -+static void process_cmd_fifo(void) -+{ -+ int len; -+ struct update_param p; -+ struct omap_display *display; -+ unsigned long flags; -+ -+ if (atomic_inc_return(&rfbi.cmd_pending) != 1) -+ return; -+ -+ while (true) { -+ spin_lock_irqsave(rfbi.cmd_fifo->lock, flags); -+ -+ len = __kfifo_get(rfbi.cmd_fifo, (unsigned char *)&p, -+ sizeof(struct update_param)); -+ if (len == 0) { -+ DSSDBG("nothing more in fifo\n"); -+ atomic_set(&rfbi.cmd_pending, 0); -+ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); -+ break; -+ } -+ -+ /* DSSDBG("fifo full %d\n", rfbi.cmd_fifo_full.counter);*/ -+ -+ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); -+ -+ BUG_ON(len != sizeof(struct update_param)); -+ BUG_ON(p.rfbi_module > 1); -+ -+ display = rfbi.display[p.rfbi_module]; -+ -+ if (p.cmd == RFBI_CMD_UPDATE) { -+ if (do_update(display, &p.par.r)) -+ break; /* async op */ -+ } else if (p.cmd == RFBI_CMD_SYNC) { -+ DSSDBG("Signaling SYNC done!\n"); -+ complete(p.par.sync); -+ } else -+ BUG(); -+ } -+ -+ signal_fifo_waiters(); -+} -+ -+static void rfbi_push_cmd(struct update_param *p) -+{ -+ int ret; -+ -+ while (1) { -+ unsigned long flags; -+ int available; -+ -+ spin_lock_irqsave(rfbi.cmd_fifo->lock, flags); -+ available = RFBI_CMD_FIFO_LEN_BYTES - -+ __kfifo_len(rfbi.cmd_fifo); -+ -+/* DSSDBG("%d bytes left in fifo\n", available); */ -+ if (available < sizeof(struct update_param)) { -+ DSSDBG("Going to wait because FIFO FULL..\n"); -+ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); -+ atomic_inc(&rfbi.cmd_fifo_full); -+ wait_for_completion(&rfbi.cmd_done); -+ /*DSSDBG("Woke up because fifo not full anymore\n");*/ -+ continue; -+ } -+ -+ ret = __kfifo_put(rfbi.cmd_fifo, (unsigned char *)p, -+ sizeof(struct update_param)); -+/* DSSDBG("pushed %d bytes\n", ret);*/ -+ -+ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); -+ -+ BUG_ON(ret != sizeof(struct update_param)); -+ -+ break; -+ } -+} -+ -+static void rfbi_push_update(int rfbi_module, int x, int y, int w, int h) -+{ -+ struct update_param p; -+ -+ p.rfbi_module = rfbi_module; -+ p.cmd = RFBI_CMD_UPDATE; -+ -+ p.par.r.x = x; -+ p.par.r.y = y; -+ p.par.r.w = w; -+ p.par.r.h = h; -+ -+ DSSDBG("RFBI pushed %d,%d %dx%d\n", x, y, w, h); -+ -+ rfbi_push_cmd(&p); -+ -+ process_cmd_fifo(); -+} -+ -+static void rfbi_push_sync(int rfbi_module, struct completion *sync_comp) -+{ -+ struct update_param p; -+ -+ p.rfbi_module = rfbi_module; -+ p.cmd = RFBI_CMD_SYNC; -+ p.par.sync = sync_comp; -+ -+ rfbi_push_cmd(&p); -+ -+ DSSDBG("RFBI sync pushed to cmd fifo\n"); -+ -+ process_cmd_fifo(); -+} -+ -+void rfbi_dump_regs(struct seq_file *s) -+{ -+#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ DUMPREG(RFBI_REVISION); -+ DUMPREG(RFBI_SYSCONFIG); -+ DUMPREG(RFBI_SYSSTATUS); -+ DUMPREG(RFBI_CONTROL); -+ DUMPREG(RFBI_PIXEL_CNT); -+ DUMPREG(RFBI_LINE_NUMBER); -+ DUMPREG(RFBI_CMD); -+ DUMPREG(RFBI_PARAM); -+ DUMPREG(RFBI_DATA); -+ DUMPREG(RFBI_READ); -+ DUMPREG(RFBI_STATUS); -+ -+ DUMPREG(RFBI_CONFIG(0)); -+ DUMPREG(RFBI_ONOFF_TIME(0)); -+ DUMPREG(RFBI_CYCLE_TIME(0)); -+ DUMPREG(RFBI_DATA_CYCLE1(0)); -+ DUMPREG(RFBI_DATA_CYCLE2(0)); -+ DUMPREG(RFBI_DATA_CYCLE3(0)); -+ -+ DUMPREG(RFBI_CONFIG(1)); -+ DUMPREG(RFBI_ONOFF_TIME(1)); -+ DUMPREG(RFBI_CYCLE_TIME(1)); -+ DUMPREG(RFBI_DATA_CYCLE1(1)); -+ DUMPREG(RFBI_DATA_CYCLE2(1)); -+ DUMPREG(RFBI_DATA_CYCLE3(1)); -+ -+ DUMPREG(RFBI_VSYNC_WIDTH); -+ DUMPREG(RFBI_HSYNC_WIDTH); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+#undef DUMPREG -+} -+ -+int rfbi_init(void) -+{ -+ u32 rev; -+ u32 l; -+ -+ spin_lock_init(&rfbi.cmd_lock); -+ rfbi.cmd_fifo = kfifo_alloc(RFBI_CMD_FIFO_LEN_BYTES, GFP_KERNEL, -+ &rfbi.cmd_lock); -+ if (IS_ERR(rfbi.cmd_fifo)) -+ return -ENOMEM; -+ -+ init_completion(&rfbi.cmd_done); -+ atomic_set(&rfbi.cmd_fifo_full, 0); -+ atomic_set(&rfbi.cmd_pending, 0); -+ -+ rfbi.base = ioremap(RFBI_BASE, SZ_256); -+ if (!rfbi.base) { -+ DSSERR("can't ioremap RFBI\n"); -+ return -ENOMEM; -+ } -+ -+ rfbi_enable_clocks(1); -+ -+ msleep(10); -+ -+ rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; -+ -+ /* Enable autoidle and smart-idle */ -+ l = rfbi_read_reg(RFBI_SYSCONFIG); -+ l |= (1 << 0) | (2 << 3); -+ rfbi_write_reg(RFBI_SYSCONFIG, l); -+ -+ rev = rfbi_read_reg(RFBI_REVISION); -+ printk(KERN_INFO "OMAP RFBI rev %d.%d\n", -+ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); -+ -+ rfbi_enable_clocks(0); -+ -+ return 0; -+} -+ -+void rfbi_exit(void) -+{ -+ DSSDBG("rfbi_exit\n"); -+ -+ kfifo_free(rfbi.cmd_fifo); -+ -+ iounmap(rfbi.base); -+} -+ -+/* struct omap_display support */ -+static int rfbi_display_update(struct omap_display *display, -+ u16 x, u16 y, u16 w, u16 h) -+{ -+ int rfbi_module; -+ -+ if (w == 0 || h == 0) -+ return 0; -+ -+ rfbi_module = rfbi_find_display(display); -+ -+ rfbi_push_update(rfbi_module, x, y, w, h); -+ -+ return 0; -+} -+ -+static int rfbi_display_sync(struct omap_display *display) -+{ -+ struct completion sync_comp; -+ int rfbi_module; -+ -+ rfbi_module = rfbi_find_display(display); -+ -+ init_completion(&sync_comp); -+ rfbi_push_sync(rfbi_module, &sync_comp); -+ DSSDBG("Waiting for SYNC to happen...\n"); -+ wait_for_completion(&sync_comp); -+ DSSDBG("Released from SYNC\n"); -+ return 0; -+} -+ -+static int rfbi_display_enable_te(struct omap_display *display, bool enable) -+{ -+ display->ctrl->enable_te(display, enable); -+ return 0; -+} -+ -+static int rfbi_display_enable(struct omap_display *display) -+{ -+ int r; -+ -+ BUG_ON(display->panel == NULL || display->ctrl == NULL); -+ -+ r = omap_dispc_register_isr(framedone_callback, NULL, -+ DISPC_IRQ_FRAMEDONE); -+ if (r) { -+ DSSERR("can't get FRAMEDONE irq\n"); -+ return r; -+ } -+ -+ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); -+ -+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_RFBI); -+ -+ dispc_set_tft_data_lines(display->ctrl->pixel_size); -+ -+ rfbi_configure(display->hw_config.u.rfbi.channel, -+ display->ctrl->pixel_size, -+ display->hw_config.u.rfbi.data_lines); -+ -+ rfbi_set_timings(display->hw_config.u.rfbi.channel, -+ &display->ctrl->timings); -+ -+ -+ if (display->ctrl && display->ctrl->enable) { -+ r = display->ctrl->enable(display); -+ if (r) -+ goto err; -+ } -+ -+ if (display->panel && display->panel->enable) { -+ r = display->panel->enable(display); -+ if (r) -+ goto err; -+ } -+ -+ return 0; -+err: -+ return -ENODEV; -+} -+ -+static void rfbi_display_disable(struct omap_display *display) -+{ -+ display->ctrl->disable(display); -+ omap_dispc_unregister_isr(framedone_callback, NULL, -+ DISPC_IRQ_FRAMEDONE); -+} -+ -+void rfbi_init_display(struct omap_display *display) -+{ -+ display->enable = rfbi_display_enable; -+ display->disable = rfbi_display_disable; -+ display->update = rfbi_display_update; -+ display->sync = rfbi_display_sync; -+ display->enable_te = rfbi_display_enable_te; -+ -+ rfbi.display[display->hw_config.u.rfbi.channel] = display; -+ -+ display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; -+} -diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c -new file mode 100644 -index 0000000..fbff2b2 ---- /dev/null -+++ b/drivers/video/omap2/dss/sdi.c -@@ -0,0 +1,245 @@ -+/* -+ * linux/drivers/video/omap2/dss/sdi.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "SDI" -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include "dss.h" -+ -+ -+static struct { -+ bool skip_init; -+ bool update_enabled; -+} sdi; -+ -+static void sdi_basic_init(void) -+{ -+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS); -+ -+ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); -+ dispc_set_tft_data_lines(24); -+ dispc_lcd_enable_signal_polarity(1); -+} -+ -+static int sdi_display_enable(struct omap_display *display) -+{ -+ struct dispc_clock_info cinfo; -+ u16 lck_div, pck_div; -+ unsigned long fck; -+ struct omap_panel *panel = display->panel; -+ unsigned long pck; -+ int r; -+ -+ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { -+ DSSERR("display already enabled\n"); -+ return -EINVAL; -+ } -+ -+ /* In case of skip_init sdi_init has already enabled the clocks */ -+ if (!sdi.skip_init) -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ sdi_basic_init(); -+ -+ /* 15.5.9.1.2 */ -+ panel->config |= OMAP_DSS_LCD_RF | OMAP_DSS_LCD_ONOFF; -+ -+ dispc_set_pol_freq(panel); -+ -+ if (!sdi.skip_init) -+ r = dispc_calc_clock_div(1, panel->timings.pixel_clock * 1000, -+ &cinfo); -+ else -+ r = dispc_get_clock_div(&cinfo); -+ -+ if (r) -+ goto err0; -+ -+ fck = cinfo.fck; -+ lck_div = cinfo.lck_div; -+ pck_div = cinfo.pck_div; -+ -+ pck = fck / lck_div / pck_div / 1000; -+ -+ if (pck != panel->timings.pixel_clock) { -+ DSSWARN("Could not find exact pixel clock. Requested %d kHz, " -+ "got %lu kHz\n", -+ panel->timings.pixel_clock, pck); -+ -+ panel->timings.pixel_clock = pck; -+ } -+ -+ -+ dispc_set_lcd_timings(&panel->timings); -+ -+ r = dispc_set_clock_div(&cinfo); -+ if (r) -+ goto err1; -+ -+ if (!sdi.skip_init) { -+ dss_sdi_init(display->hw_config.u.sdi.datapairs); -+ dss_sdi_enable(); -+ mdelay(2); -+ } -+ -+ dispc_enable_lcd_out(1); -+ -+ r = panel->enable(display); -+ if (r) -+ goto err2; -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+ -+ sdi.skip_init = 0; -+ -+ return 0; -+err2: -+ dispc_enable_lcd_out(0); -+err1: -+err0: -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ return r; -+} -+ -+static int sdi_display_resume(struct omap_display *display); -+ -+static void sdi_display_disable(struct omap_display *display) -+{ -+ if (display->state == OMAP_DSS_DISPLAY_DISABLED) -+ return; -+ -+ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) -+ sdi_display_resume(display); -+ -+ display->panel->disable(display); -+ -+ dispc_enable_lcd_out(0); -+ -+ dss_sdi_disable(); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+} -+ -+static int sdi_display_suspend(struct omap_display *display) -+{ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ return -EINVAL; -+ -+ if (display->panel->suspend) -+ display->panel->suspend(display); -+ -+ dispc_enable_lcd_out(0); -+ -+ dss_sdi_disable(); -+ -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ display->state = OMAP_DSS_DISPLAY_SUSPENDED; -+ -+ return 0; -+} -+ -+static int sdi_display_resume(struct omap_display *display) -+{ -+ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) -+ return -EINVAL; -+ -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ -+ dss_sdi_enable(); -+ mdelay(2); -+ -+ dispc_enable_lcd_out(1); -+ -+ if (display->panel->resume) -+ display->panel->resume(display); -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+ -+ return 0; -+} -+ -+static int sdi_display_set_update_mode(struct omap_display *display, -+ enum omap_dss_update_mode mode) -+{ -+ if (mode == OMAP_DSS_UPDATE_MANUAL) -+ return -EINVAL; -+ -+ if (mode == OMAP_DSS_UPDATE_DISABLED) { -+ dispc_enable_lcd_out(0); -+ sdi.update_enabled = 0; -+ } else { -+ dispc_enable_lcd_out(1); -+ sdi.update_enabled = 1; -+ } -+ -+ return 0; -+} -+ -+static enum omap_dss_update_mode sdi_display_get_update_mode( -+ struct omap_display *display) -+{ -+ return sdi.update_enabled ? OMAP_DSS_UPDATE_AUTO : -+ OMAP_DSS_UPDATE_DISABLED; -+} -+ -+static void sdi_get_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ *timings = display->panel->timings; -+} -+ -+void sdi_init_display(struct omap_display *display) -+{ -+ DSSDBG("SDI init\n"); -+ -+ display->enable = sdi_display_enable; -+ display->disable = sdi_display_disable; -+ display->suspend = sdi_display_suspend; -+ display->resume = sdi_display_resume; -+ display->set_update_mode = sdi_display_set_update_mode; -+ display->get_update_mode = sdi_display_get_update_mode; -+ display->get_timings = sdi_get_timings; -+} -+ -+int sdi_init(bool skip_init) -+{ -+ /* we store this for first display enable, then clear it */ -+ sdi.skip_init = skip_init; -+ -+ /* -+ * Enable clocks already here, otherwise there would be a toggle -+ * of them until sdi_display_enable is called. -+ */ -+ if (skip_init) -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); -+ return 0; -+} -+ -+void sdi_exit(void) -+{ -+} -diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c -new file mode 100644 -index 0000000..aceed9f ---- /dev/null -+++ b/drivers/video/omap2/dss/venc.c -@@ -0,0 +1,600 @@ -+/* -+ * linux/drivers/video/omap2/dss/venc.c -+ * -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * VENC settings from TI's DSS driver -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#define DSS_SUBSYS_NAME "VENC" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "dss.h" -+ -+#define VENC_BASE 0x48050C00 -+ -+/* Venc registers */ -+#define VENC_REV_ID 0x00 -+#define VENC_STATUS 0x04 -+#define VENC_F_CONTROL 0x08 -+#define VENC_VIDOUT_CTRL 0x10 -+#define VENC_SYNC_CTRL 0x14 -+#define VENC_LLEN 0x1C -+#define VENC_FLENS 0x20 -+#define VENC_HFLTR_CTRL 0x24 -+#define VENC_CC_CARR_WSS_CARR 0x28 -+#define VENC_C_PHASE 0x2C -+#define VENC_GAIN_U 0x30 -+#define VENC_GAIN_V 0x34 -+#define VENC_GAIN_Y 0x38 -+#define VENC_BLACK_LEVEL 0x3C -+#define VENC_BLANK_LEVEL 0x40 -+#define VENC_X_COLOR 0x44 -+#define VENC_M_CONTROL 0x48 -+#define VENC_BSTAMP_WSS_DATA 0x4C -+#define VENC_S_CARR 0x50 -+#define VENC_LINE21 0x54 -+#define VENC_LN_SEL 0x58 -+#define VENC_L21__WC_CTL 0x5C -+#define VENC_HTRIGGER_VTRIGGER 0x60 -+#define VENC_SAVID__EAVID 0x64 -+#define VENC_FLEN__FAL 0x68 -+#define VENC_LAL__PHASE_RESET 0x6C -+#define VENC_HS_INT_START_STOP_X 0x70 -+#define VENC_HS_EXT_START_STOP_X 0x74 -+#define VENC_VS_INT_START_X 0x78 -+#define VENC_VS_INT_STOP_X__VS_INT_START_Y 0x7C -+#define VENC_VS_INT_STOP_Y__VS_EXT_START_X 0x80 -+#define VENC_VS_EXT_STOP_X__VS_EXT_START_Y 0x84 -+#define VENC_VS_EXT_STOP_Y 0x88 -+#define VENC_AVID_START_STOP_X 0x90 -+#define VENC_AVID_START_STOP_Y 0x94 -+#define VENC_FID_INT_START_X__FID_INT_START_Y 0xA0 -+#define VENC_FID_INT_OFFSET_Y__FID_EXT_START_X 0xA4 -+#define VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y 0xA8 -+#define VENC_TVDETGP_INT_START_STOP_X 0xB0 -+#define VENC_TVDETGP_INT_START_STOP_Y 0xB4 -+#define VENC_GEN_CTRL 0xB8 -+#define VENC_OUTPUT_CONTROL 0xC4 -+#define VENC_DAC_B__DAC_C 0xC8 -+ -+struct venc_config { -+ u32 f_control; -+ u32 vidout_ctrl; -+ u32 sync_ctrl; -+ u32 llen; -+ u32 flens; -+ u32 hfltr_ctrl; -+ u32 cc_carr_wss_carr; -+ u32 c_phase; -+ u32 gain_u; -+ u32 gain_v; -+ u32 gain_y; -+ u32 black_level; -+ u32 blank_level; -+ u32 x_color; -+ u32 m_control; -+ u32 bstamp_wss_data; -+ u32 s_carr; -+ u32 line21; -+ u32 ln_sel; -+ u32 l21__wc_ctl; -+ u32 htrigger_vtrigger; -+ u32 savid__eavid; -+ u32 flen__fal; -+ u32 lal__phase_reset; -+ u32 hs_int_start_stop_x; -+ u32 hs_ext_start_stop_x; -+ u32 vs_int_start_x; -+ u32 vs_int_stop_x__vs_int_start_y; -+ u32 vs_int_stop_y__vs_ext_start_x; -+ u32 vs_ext_stop_x__vs_ext_start_y; -+ u32 vs_ext_stop_y; -+ u32 avid_start_stop_x; -+ u32 avid_start_stop_y; -+ u32 fid_int_start_x__fid_int_start_y; -+ u32 fid_int_offset_y__fid_ext_start_x; -+ u32 fid_ext_start_y__fid_ext_offset_y; -+ u32 tvdetgp_int_start_stop_x; -+ u32 tvdetgp_int_start_stop_y; -+ u32 gen_ctrl; -+}; -+ -+/* from TRM */ -+static const struct venc_config venc_config_pal_trm = { -+ .f_control = 0, -+ .vidout_ctrl = 1, -+ .sync_ctrl = 0x40, -+ .llen = 0x35F, /* 863 */ -+ .flens = 0x270, /* 624 */ -+ .hfltr_ctrl = 0, -+ .cc_carr_wss_carr = 0x2F7225ED, -+ .c_phase = 0, -+ .gain_u = 0x111, -+ .gain_v = 0x181, -+ .gain_y = 0x140, -+ .black_level = 0x3B, -+ .blank_level = 0x3B, -+ .x_color = 0x7, -+ .m_control = 0x2, -+ .bstamp_wss_data = 0x3F, -+ .s_carr = 0x2A098ACB, -+ .line21 = 0, -+ .ln_sel = 0x01290015, -+ .l21__wc_ctl = 0x0000F603, -+ .htrigger_vtrigger = 0, -+ -+ .savid__eavid = 0x06A70108, -+ .flen__fal = 0x00180270, -+ .lal__phase_reset = 0x00040135, -+ .hs_int_start_stop_x = 0x00880358, -+ .hs_ext_start_stop_x = 0x000F035F, -+ .vs_int_start_x = 0x01A70000, -+ .vs_int_stop_x__vs_int_start_y = 0x000001A7, -+ .vs_int_stop_y__vs_ext_start_x = 0x01AF0000, -+ .vs_ext_stop_x__vs_ext_start_y = 0x000101AF, -+ .vs_ext_stop_y = 0x00000025, -+ .avid_start_stop_x = 0x03530083, -+ .avid_start_stop_y = 0x026C002E, -+ .fid_int_start_x__fid_int_start_y = 0x0001008A, -+ .fid_int_offset_y__fid_ext_start_x = 0x002E0138, -+ .fid_ext_start_y__fid_ext_offset_y = 0x01380001, -+ -+ .tvdetgp_int_start_stop_x = 0x00140001, -+ .tvdetgp_int_start_stop_y = 0x00010001, -+ .gen_ctrl = 0x00FF0000, -+}; -+ -+/* from TRM */ -+static const struct venc_config venc_config_ntsc_trm = { -+ .f_control = 0, -+ .vidout_ctrl = 1, -+ .sync_ctrl = 0x8040, -+ .llen = 0x359, -+ .flens = 0x20C, -+ .hfltr_ctrl = 0, -+ .cc_carr_wss_carr = 0x043F2631, -+ .c_phase = 0, -+ .gain_u = 0x102, -+ .gain_v = 0x16C, -+ .gain_y = 0x12F, -+ .black_level = 0x43, -+ .blank_level = 0x38, -+ .x_color = 0x7, -+ .m_control = 0x1, -+ .bstamp_wss_data = 0x38, -+ .s_carr = 0x21F07C1F, -+ .line21 = 0, -+ .ln_sel = 0x01310011, -+ .l21__wc_ctl = 0x0000F003, -+ .htrigger_vtrigger = 0, -+ -+ .savid__eavid = 0x069300F4, -+ .flen__fal = 0x0016020C, -+ .lal__phase_reset = 0x00060107, -+ .hs_int_start_stop_x = 0x008E0350, -+ .hs_ext_start_stop_x = 0x000F0359, -+ .vs_int_start_x = 0x01A00000, -+ .vs_int_stop_x__vs_int_start_y = 0x020701A0, -+ .vs_int_stop_y__vs_ext_start_x = 0x01AC0024, -+ .vs_ext_stop_x__vs_ext_start_y = 0x020D01AC, -+ .vs_ext_stop_y = 0x00000006, -+ .avid_start_stop_x = 0x03480078, -+ .avid_start_stop_y = 0x02060024, -+ .fid_int_start_x__fid_int_start_y = 0x0001008A, -+ .fid_int_offset_y__fid_ext_start_x = 0x01AC0106, -+ .fid_ext_start_y__fid_ext_offset_y = 0x01060006, -+ -+ .tvdetgp_int_start_stop_x = 0x00140001, -+ .tvdetgp_int_start_stop_y = 0x00010001, -+ .gen_ctrl = 0x00F90000, -+}; -+ -+static const struct venc_config venc_config_pal_bdghi = { -+ .f_control = 0, -+ .vidout_ctrl = 0, -+ .sync_ctrl = 0, -+ .hfltr_ctrl = 0, -+ .x_color = 0, -+ .line21 = 0, -+ .ln_sel = 21, -+ .htrigger_vtrigger = 0, -+ .tvdetgp_int_start_stop_x = 0x00140001, -+ .tvdetgp_int_start_stop_y = 0x00010001, -+ .gen_ctrl = 0x00FB0000, -+ -+ .llen = 864-1, -+ .flens = 625-1, -+ .cc_carr_wss_carr = 0x2F7625ED, -+ .c_phase = 0xDF, -+ .gain_u = 0x111, -+ .gain_v = 0x181, -+ .gain_y = 0x140, -+ .black_level = 0x3e, -+ .blank_level = 0x3e, -+ .m_control = 0<<2 | 1<<1, -+ .bstamp_wss_data = 0x42, -+ .s_carr = 0x2a098acb, -+ .l21__wc_ctl = 0<<13 | 0x16<<8 | 0<<0, -+ .savid__eavid = 0x06A70108, -+ .flen__fal = 23<<16 | 624<<0, -+ .lal__phase_reset = 2<<17 | 310<<0, -+ .hs_int_start_stop_x = 0x00920358, -+ .hs_ext_start_stop_x = 0x000F035F, -+ .vs_int_start_x = 0x1a7<<16, -+ .vs_int_stop_x__vs_int_start_y = 0x000601A7, -+ .vs_int_stop_y__vs_ext_start_x = 0x01AF0036, -+ .vs_ext_stop_x__vs_ext_start_y = 0x27101af, -+ .vs_ext_stop_y = 0x05, -+ .avid_start_stop_x = 0x03530082, -+ .avid_start_stop_y = 0x0270002E, -+ .fid_int_start_x__fid_int_start_y = 0x0005008A, -+ .fid_int_offset_y__fid_ext_start_x = 0x002E0138, -+ .fid_ext_start_y__fid_ext_offset_y = 0x01380005, -+}; -+ -+const struct omap_video_timings omap_dss_pal_timings = { -+ .x_res = 720, -+ .y_res = 574, -+ .pixel_clock = 26181, -+ .hsw = 32, -+ .hfp = 80, -+ .hbp = 48, -+ .vsw = 7, -+ .vfp = 3, -+ .vbp = 6, -+}; -+EXPORT_SYMBOL(omap_dss_pal_timings); -+ -+const struct omap_video_timings omap_dss_ntsc_timings = { -+ .x_res = 720, -+ .y_res = 482, -+ .pixel_clock = 22153, -+ .hsw = 32, -+ .hfp = 80, -+ .hbp = 48, -+ .vsw = 10, -+ .vfp = 3, -+ .vbp = 6, -+}; -+EXPORT_SYMBOL(omap_dss_ntsc_timings); -+ -+static struct { -+ void __iomem *base; -+ struct mutex venc_lock; -+} venc; -+ -+static struct omap_panel venc_panel = { -+ .name = "tv-out", -+}; -+ -+static inline void venc_write_reg(int idx, u32 val) -+{ -+ __raw_writel(val, venc.base + idx); -+} -+ -+static inline u32 venc_read_reg(int idx) -+{ -+ u32 l = __raw_readl(venc.base + idx); -+ return l; -+} -+ -+static void venc_write_config(const struct venc_config *config) -+{ -+ DSSDBG("write venc conf\n"); -+ -+ venc_write_reg(VENC_LLEN, config->llen); -+ venc_write_reg(VENC_FLENS, config->flens); -+ venc_write_reg(VENC_CC_CARR_WSS_CARR, config->cc_carr_wss_carr); -+ venc_write_reg(VENC_C_PHASE, config->c_phase); -+ venc_write_reg(VENC_GAIN_U, config->gain_u); -+ venc_write_reg(VENC_GAIN_V, config->gain_v); -+ venc_write_reg(VENC_GAIN_Y, config->gain_y); -+ venc_write_reg(VENC_BLACK_LEVEL, config->black_level); -+ venc_write_reg(VENC_BLANK_LEVEL, config->blank_level); -+ venc_write_reg(VENC_M_CONTROL, config->m_control); -+ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data); -+ venc_write_reg(VENC_S_CARR, config->s_carr); -+ venc_write_reg(VENC_L21__WC_CTL, config->l21__wc_ctl); -+ venc_write_reg(VENC_SAVID__EAVID, config->savid__eavid); -+ venc_write_reg(VENC_FLEN__FAL, config->flen__fal); -+ venc_write_reg(VENC_LAL__PHASE_RESET, config->lal__phase_reset); -+ venc_write_reg(VENC_HS_INT_START_STOP_X, config->hs_int_start_stop_x); -+ venc_write_reg(VENC_HS_EXT_START_STOP_X, config->hs_ext_start_stop_x); -+ venc_write_reg(VENC_VS_INT_START_X, config->vs_int_start_x); -+ venc_write_reg(VENC_VS_INT_STOP_X__VS_INT_START_Y, -+ config->vs_int_stop_x__vs_int_start_y); -+ venc_write_reg(VENC_VS_INT_STOP_Y__VS_EXT_START_X, -+ config->vs_int_stop_y__vs_ext_start_x); -+ venc_write_reg(VENC_VS_EXT_STOP_X__VS_EXT_START_Y, -+ config->vs_ext_stop_x__vs_ext_start_y); -+ venc_write_reg(VENC_VS_EXT_STOP_Y, config->vs_ext_stop_y); -+ venc_write_reg(VENC_AVID_START_STOP_X, config->avid_start_stop_x); -+ venc_write_reg(VENC_AVID_START_STOP_Y, config->avid_start_stop_y); -+ venc_write_reg(VENC_FID_INT_START_X__FID_INT_START_Y, -+ config->fid_int_start_x__fid_int_start_y); -+ venc_write_reg(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X, -+ config->fid_int_offset_y__fid_ext_start_x); -+ venc_write_reg(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y, -+ config->fid_ext_start_y__fid_ext_offset_y); -+ -+ venc_write_reg(VENC_DAC_B__DAC_C, venc_read_reg(VENC_DAC_B__DAC_C)); -+ venc_write_reg(VENC_VIDOUT_CTRL, config->vidout_ctrl); -+ venc_write_reg(VENC_HFLTR_CTRL, config->hfltr_ctrl); -+ venc_write_reg(VENC_X_COLOR, config->x_color); -+ venc_write_reg(VENC_LINE21, config->line21); -+ venc_write_reg(VENC_LN_SEL, config->ln_sel); -+ venc_write_reg(VENC_HTRIGGER_VTRIGGER, config->htrigger_vtrigger); -+ venc_write_reg(VENC_TVDETGP_INT_START_STOP_X, -+ config->tvdetgp_int_start_stop_x); -+ venc_write_reg(VENC_TVDETGP_INT_START_STOP_Y, -+ config->tvdetgp_int_start_stop_y); -+ venc_write_reg(VENC_GEN_CTRL, config->gen_ctrl); -+ venc_write_reg(VENC_F_CONTROL, config->f_control); -+ venc_write_reg(VENC_SYNC_CTRL, config->sync_ctrl); -+} -+ -+static void venc_reset(void) -+{ -+ int t = 1000; -+ -+ venc_write_reg(VENC_F_CONTROL, 1<<8); -+ while (venc_read_reg(VENC_F_CONTROL) & (1<<8)) { -+ if (--t == 0) { -+ DSSERR("Failed to reset venc\n"); -+ return; -+ } -+ } -+ -+ /* the magical sleep that makes things work */ -+ msleep(20); -+} -+ -+static void venc_enable_clocks(int enable) -+{ -+ if (enable) -+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | -+ DSS_CLK_96M); -+ else -+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | -+ DSS_CLK_96M); -+} -+ -+static const struct venc_config *venc_timings_to_config( -+ struct omap_video_timings *timings) -+{ -+ if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) -+ return &venc_config_pal_trm; -+ -+ if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) -+ return &venc_config_ntsc_trm; -+ -+ BUG(); -+} -+ -+int venc_init(void) -+{ -+ u8 rev_id; -+ -+ mutex_init(&venc.venc_lock); -+ -+ venc_panel.timings = omap_dss_pal_timings; -+ -+ venc.base = ioremap(VENC_BASE, SZ_1K); -+ if (!venc.base) { -+ DSSERR("can't ioremap VENC\n"); -+ return -ENOMEM; -+ } -+ -+ venc_enable_clocks(1); -+ -+ rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); -+ printk(KERN_INFO "OMAP VENC rev %d\n", rev_id); -+ -+ venc_enable_clocks(0); -+ -+ return 0; -+} -+ -+void venc_exit(void) -+{ -+ iounmap(venc.base); -+} -+ -+static void venc_power_on(struct omap_display *display) -+{ -+ venc_enable_clocks(1); -+ -+ venc_reset(); -+ venc_write_config(venc_timings_to_config(&display->panel->timings)); -+ -+ dss_set_venc_output(display->hw_config.u.venc.type); -+ dss_set_dac_pwrdn_bgz(1); -+ -+ if (display->hw_config.u.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE) { -+ if (cpu_is_omap24xx()) -+ venc_write_reg(VENC_OUTPUT_CONTROL, 0x2); -+ else -+ venc_write_reg(VENC_OUTPUT_CONTROL, 0xa); -+ } else { /* S-Video */ -+ venc_write_reg(VENC_OUTPUT_CONTROL, 0xd); -+ } -+ -+ dispc_set_digit_size(display->panel->timings.x_res, -+ display->panel->timings.y_res/2); -+ -+ if (display->hw_config.panel_enable) -+ display->hw_config.panel_enable(display); -+ -+ dispc_enable_digit_out(1); -+} -+ -+static void venc_power_off(struct omap_display *display) -+{ -+ venc_write_reg(VENC_OUTPUT_CONTROL, 0); -+ dss_set_dac_pwrdn_bgz(0); -+ -+ dispc_enable_digit_out(0); -+ -+ if (display->hw_config.panel_disable) -+ display->hw_config.panel_disable(display); -+ -+ venc_enable_clocks(0); -+} -+ -+static int venc_enable_display(struct omap_display *display) -+{ -+ int r = 0; -+ -+ DSSDBG("venc_enable_display\n"); -+ -+ mutex_lock(&venc.venc_lock); -+ -+ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { -+ r = -EINVAL; -+ goto err; -+ } -+ -+ venc_power_on(display); -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+err: -+ mutex_unlock(&venc.venc_lock); -+ -+ return r; -+} -+ -+static void venc_disable_display(struct omap_display *display) -+{ -+ DSSDBG("venc_disable_display\n"); -+ -+ mutex_lock(&venc.venc_lock); -+ -+ if (display->state == OMAP_DSS_DISPLAY_DISABLED) -+ goto end; -+ -+ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) { -+ /* suspended is the same as disabled with venc */ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+ goto end; -+ } -+ -+ venc_power_off(display); -+ -+ display->state = OMAP_DSS_DISPLAY_DISABLED; -+end: -+ mutex_unlock(&venc.venc_lock); -+} -+ -+static int venc_display_suspend(struct omap_display *display) -+{ -+ int r = 0; -+ -+ DSSDBG("venc_display_suspend\n"); -+ -+ mutex_lock(&venc.venc_lock); -+ -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) { -+ r = -EINVAL; -+ goto err; -+ } -+ -+ venc_power_off(display); -+ -+ display->state = OMAP_DSS_DISPLAY_SUSPENDED; -+err: -+ mutex_unlock(&venc.venc_lock); -+ -+ return r; -+} -+ -+static int venc_display_resume(struct omap_display *display) -+{ -+ int r = 0; -+ -+ DSSDBG("venc_display_resume\n"); -+ -+ mutex_lock(&venc.venc_lock); -+ -+ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) { -+ r = -EINVAL; -+ goto err; -+ } -+ -+ venc_power_on(display); -+ -+ display->state = OMAP_DSS_DISPLAY_ACTIVE; -+err: -+ mutex_unlock(&venc.venc_lock); -+ -+ return r; -+} -+ -+static void venc_get_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ *timings = venc_panel.timings; -+} -+ -+static void venc_set_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ DSSDBG("venc_set_timings\n"); -+ display->panel->timings = *timings; -+ if (display->state == OMAP_DSS_DISPLAY_ACTIVE) { -+ /* turn the venc off and on to get new timings to use */ -+ venc_disable_display(display); -+ venc_enable_display(display); -+ } -+} -+ -+static int venc_check_timings(struct omap_display *display, -+ struct omap_video_timings *timings) -+{ -+ DSSDBG("venc_check_timings\n"); -+ -+ if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) -+ return 0; -+ -+ if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) -+ return 0; -+ -+ return -EINVAL; -+} -+ -+void venc_init_display(struct omap_display *display) -+{ -+ display->panel = &venc_panel; -+ display->enable = venc_enable_display; -+ display->disable = venc_disable_display; -+ display->suspend = venc_display_suspend; -+ display->resume = venc_display_resume; -+ display->get_timings = venc_get_timings; -+ display->set_timings = venc_set_timings; -+ display->check_timings = venc_check_timings; -+} -diff --git a/drivers/video/omap2/omapfb/Kconfig b/drivers/video/omap2/omapfb/Kconfig -new file mode 100644 -index 0000000..4f66033 ---- /dev/null -+++ b/drivers/video/omap2/omapfb/Kconfig -@@ -0,0 +1,35 @@ -+menuconfig FB_OMAP2 -+ tristate "OMAP2/3 frame buffer support (EXPERIMENTAL)" -+ depends on FB && OMAP2_DSS -+ -+ select FB_CFB_FILLRECT -+ select FB_CFB_COPYAREA -+ select FB_CFB_IMAGEBLIT -+ help -+ Frame buffer driver for OMAP2/3 based boards. -+ -+config FB_OMAP2_DEBUG_SUPPORT -+ bool "Debug support for OMAP2/3 FB" -+ default y -+ depends on FB_OMAP2 -+ help -+ Support for debug output. You have to enable the actual printing -+ with debug module parameter. -+ -+config FB_OMAP2_FORCE_AUTO_UPDATE -+ bool "Force main display to automatic update mode" -+ depends on FB_OMAP2 -+ help -+ Forces main display to automatic update mode (if possible), -+ and also enables tearsync (if possible). By default -+ displays that support manual update are started in manual -+ update mode. -+ -+config FB_OMAP2_NUM_FBS -+ int "Number of framebuffers" -+ range 1 10 -+ default 3 -+ depends on FB_OMAP2 -+ help -+ Select the number of framebuffers created. OMAP2/3 has 3 overlays -+ so normally this would be 3. -diff --git a/drivers/video/omap2/omapfb/Makefile b/drivers/video/omap2/omapfb/Makefile -new file mode 100644 -index 0000000..51c2e00 ---- /dev/null -+++ b/drivers/video/omap2/omapfb/Makefile -@@ -0,0 +1,2 @@ -+obj-$(CONFIG_FB_OMAP2) += omapfb.o -+omapfb-y := omapfb-main.o omapfb-sysfs.o omapfb-ioctl.o -diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c -new file mode 100644 -index 0000000..7f18d2a ---- /dev/null -+++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c -@@ -0,0 +1,656 @@ -+/* -+ * linux/drivers/video/omap2/omapfb-ioctl.c -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "omapfb.h" -+ -+static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ struct omap_overlay *ovl; -+ struct omap_overlay_info info; -+ int r = 0; -+ -+ DBG("omapfb_setup_plane\n"); -+ -+ omapfb_lock(fbdev); -+ -+ if (ofbi->num_overlays != 1) { -+ r = -EINVAL; -+ goto out; -+ } -+ -+ /* XXX uses only the first overlay */ -+ ovl = ofbi->overlays[0]; -+ -+ if (pi->enabled && !ofbi->region.size) { -+ /* -+ * This plane's memory was freed, can't enable it -+ * until it's reallocated. -+ */ -+ r = -EINVAL; -+ goto out; -+ } -+ -+ ovl->get_overlay_info(ovl, &info); -+ -+ info.pos_x = pi->pos_x; -+ info.pos_y = pi->pos_y; -+ info.out_width = pi->out_width; -+ info.out_height = pi->out_height; -+ info.enabled = pi->enabled; -+ -+ r = ovl->set_overlay_info(ovl, &info); -+ if (r) -+ goto out; -+ -+ if (ovl->manager) { -+ r = ovl->manager->apply(ovl->manager); -+ if (r) -+ goto out; -+ } -+ -+ if (display) { -+ u16 w, h; -+ -+ if (display->sync) -+ display->sync(display); -+ -+ display->get_resolution(display, &w, &h); -+ -+ if (display->update) -+ display->update(display, 0, 0, w, h); -+ } -+ -+out: -+ omapfb_unlock(fbdev); -+ if (r) -+ dev_err(fbdev->dev, "setup_plane failed\n"); -+ return r; -+} -+ -+static int omapfb_query_plane(struct fb_info *fbi, struct omapfb_plane_info *pi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ -+ omapfb_lock(fbdev); -+ -+ if (ofbi->num_overlays != 1) { -+ memset(pi, 0, sizeof(*pi)); -+ } else { -+ struct omap_overlay_info *ovli; -+ struct omap_overlay *ovl; -+ -+ ovl = ofbi->overlays[0]; -+ ovli = &ovl->info; -+ -+ pi->pos_x = ovli->pos_x; -+ pi->pos_y = ovli->pos_y; -+ pi->enabled = ovli->enabled; -+ pi->channel_out = 0; /* xxx */ -+ pi->mirror = 0; -+ pi->out_width = ovli->out_width; -+ pi->out_height = ovli->out_height; -+ } -+ -+ omapfb_unlock(fbdev); -+ -+ return 0; -+} -+ -+static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omapfb2_mem_region *rg; -+ int r, i; -+ size_t size; -+ -+ if (mi->type > OMAPFB_MEMTYPE_MAX) -+ return -EINVAL; -+ -+ size = PAGE_ALIGN(mi->size); -+ -+ rg = &ofbi->region; -+ -+ omapfb_lock(fbdev); -+ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ if (ofbi->overlays[i]->info.enabled) { -+ r = -EBUSY; -+ goto out; -+ } -+ } -+ -+ if (rg->size != size || rg->type != mi->type) { -+ r = omapfb_realloc_fbmem(fbi, size, mi->type); -+ if (r) { -+ dev_err(fbdev->dev, "realloc fbmem failed\n"); -+ goto out; -+ } -+ } -+ -+ r = 0; -+out: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static int omapfb_query_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omapfb2_mem_region *rg; -+ -+ rg = &ofbi->region; -+ memset(mi, 0, sizeof(*mi)); -+ -+ omapfb_lock(fbdev); -+ mi->size = rg->size; -+ mi->type = rg->type; -+ omapfb_unlock(fbdev); -+ -+ return 0; -+} -+ -+static int omapfb_update_window(struct fb_info *fbi, -+ u32 x, u32 y, u32 w, u32 h) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ u16 dw, dh; -+ -+ if (!display) -+ return 0; -+ -+ if (w == 0 || h == 0) -+ return 0; -+ -+ display->get_resolution(display, &dw, &dh); -+ -+ if (x + w > dw || y + h > dh) -+ return -EINVAL; -+ -+ omapfb_lock(fbdev); -+ display->update(display, x, y, w, h); -+ omapfb_unlock(fbdev); -+ -+ return 0; -+} -+ -+static int omapfb_set_update_mode(struct fb_info *fbi, -+ enum omapfb_update_mode mode) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ enum omap_dss_update_mode um; -+ int r; -+ -+ if (!display || !display->set_update_mode) -+ return -EINVAL; -+ -+ switch (mode) { -+ case OMAPFB_UPDATE_DISABLED: -+ um = OMAP_DSS_UPDATE_DISABLED; -+ break; -+ -+ case OMAPFB_AUTO_UPDATE: -+ um = OMAP_DSS_UPDATE_AUTO; -+ break; -+ -+ case OMAPFB_MANUAL_UPDATE: -+ um = OMAP_DSS_UPDATE_MANUAL; -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ omapfb_lock(fbdev); -+ r = display->set_update_mode(display, um); -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static int omapfb_get_update_mode(struct fb_info *fbi, -+ enum omapfb_update_mode *mode) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ enum omap_dss_update_mode m; -+ -+ if (!display || !display->get_update_mode) -+ return -EINVAL; -+ -+ omapfb_lock(fbdev); -+ m = display->get_update_mode(display); -+ omapfb_unlock(fbdev); -+ -+ switch (m) { -+ case OMAP_DSS_UPDATE_DISABLED: -+ *mode = OMAPFB_UPDATE_DISABLED; -+ break; -+ case OMAP_DSS_UPDATE_AUTO: -+ *mode = OMAPFB_AUTO_UPDATE; -+ break; -+ case OMAP_DSS_UPDATE_MANUAL: -+ *mode = OMAPFB_MANUAL_UPDATE; -+ break; -+ default: -+ BUG(); -+ } -+ -+ return 0; -+} -+ -+/* XXX this color key handling is a hack... */ -+static struct omapfb_color_key omapfb_color_keys[2]; -+ -+static int _omapfb_set_color_key(struct omap_overlay_manager *mgr, -+ struct omapfb_color_key *ck) -+{ -+ enum omap_dss_color_key_type kt; -+ -+ if(!mgr->set_default_color || !mgr->set_trans_key || -+ !mgr->enable_trans_key) -+ return 0; -+ -+ if (ck->key_type == OMAPFB_COLOR_KEY_DISABLED) { -+ mgr->enable_trans_key(mgr, 0); -+ omapfb_color_keys[mgr->id] = *ck; -+ return 0; -+ } -+ -+ switch(ck->key_type) { -+ case OMAPFB_COLOR_KEY_GFX_DST: -+ kt = OMAP_DSS_COLOR_KEY_GFX_DST; -+ break; -+ case OMAPFB_COLOR_KEY_VID_SRC: -+ kt = OMAP_DSS_COLOR_KEY_VID_SRC; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ mgr->set_default_color(mgr, ck->background); -+ mgr->set_trans_key(mgr, kt, ck->trans_key); -+ mgr->enable_trans_key(mgr, 1); -+ -+ omapfb_color_keys[mgr->id] = *ck; -+ -+ return 0; -+} -+ -+static int omapfb_set_color_key(struct fb_info *fbi, -+ struct omapfb_color_key *ck) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ int r; -+ int i; -+ struct omap_overlay_manager *mgr = NULL; -+ -+ omapfb_lock(fbdev); -+ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ if (ofbi->overlays[i]->manager) { -+ mgr = ofbi->overlays[i]->manager; -+ break; -+ } -+ } -+ -+ if (!mgr) { -+ r = -EINVAL; -+ goto err; -+ } -+ -+ if(!mgr->set_default_color || !mgr->set_trans_key || -+ !mgr->enable_trans_key) { -+ r = -ENODEV; -+ goto err; -+ } -+ -+ r = _omapfb_set_color_key(mgr, ck); -+err: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static int omapfb_get_color_key(struct fb_info *fbi, -+ struct omapfb_color_key *ck) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_overlay_manager *mgr = NULL; -+ int r = 0; -+ int i; -+ -+ omapfb_lock(fbdev); -+ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ if (ofbi->overlays[i]->manager) { -+ mgr = ofbi->overlays[i]->manager; -+ break; -+ } -+ } -+ -+ if (!mgr) { -+ r = -EINVAL; -+ goto err; -+ } -+ -+ if(!mgr->set_default_color || !mgr->set_trans_key || -+ !mgr->enable_trans_key) { -+ r = -ENODEV; -+ goto err; -+ } -+ -+ *ck = omapfb_color_keys[mgr->id]; -+err: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static int omapfb_memory_read(struct fb_info *fbi, -+ struct omapfb_memory_read *mr) -+{ -+ struct omap_display *display = fb2display(fbi); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ void *buf; -+ int r; -+ -+ if (!display || !display->memory_read) -+ return -ENOENT; -+ -+ if (!access_ok(VERIFY_WRITE, mr->buffer, mr->buffer_size)) -+ return -EFAULT; -+ -+ if (mr->w * mr->h * 3 > mr->buffer_size) -+ return -EINVAL; -+ -+ buf = vmalloc(mr->buffer_size); -+ if (!buf) { -+ DBG("vmalloc failed\n"); -+ return -ENOMEM; -+ } -+ -+ omapfb_lock(fbdev); -+ -+ r = display->memory_read(display, buf, mr->buffer_size, -+ mr->x, mr->y, mr->w, mr->h); -+ -+ if (r > 0) { -+ if (copy_to_user(mr->buffer, buf, mr->buffer_size)) -+ r = -EFAULT; -+ } -+ -+ vfree(buf); -+ -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ -+ union { -+ struct omapfb_update_window_old uwnd_o; -+ struct omapfb_update_window uwnd; -+ struct omapfb_plane_info plane_info; -+ struct omapfb_caps caps; -+ struct omapfb_mem_info mem_info; -+ struct omapfb_color_key color_key; -+ enum omapfb_update_mode update_mode; -+ int test_num; -+ struct omapfb_memory_read memory_read; -+ } p; -+ -+ int r = 0; -+ -+ switch (cmd) { -+ case OMAPFB_SYNC_GFX: -+ DBG("ioctl SYNC_GFX\n"); -+ if (!display || !display->sync) { -+ /* DSS1 never returns an error here, so we neither */ -+ /*r = -EINVAL;*/ -+ break; -+ } -+ -+ omapfb_lock(fbdev); -+ r = display->sync(display); -+ omapfb_unlock(fbdev); -+ break; -+ -+ case OMAPFB_UPDATE_WINDOW_OLD: -+ DBG("ioctl UPDATE_WINDOW_OLD\n"); -+ if (!display || !display->update) { -+ r = -EINVAL; -+ break; -+ } -+ -+ if (copy_from_user(&p.uwnd_o, -+ (void __user *)arg, -+ sizeof(p.uwnd_o))) { -+ r = -EFAULT; -+ break; -+ } -+ -+ r = omapfb_update_window(fbi, p.uwnd_o.x, p.uwnd_o.y, -+ p.uwnd_o.width, p.uwnd_o.height); -+ break; -+ -+ case OMAPFB_UPDATE_WINDOW: -+ DBG("ioctl UPDATE_WINDOW\n"); -+ if (!display || !display->update) { -+ r = -EINVAL; -+ break; -+ } -+ -+ if (copy_from_user(&p.uwnd, (void __user *)arg, -+ sizeof(p.uwnd))) { -+ r = -EFAULT; -+ break; -+ } -+ -+ r = omapfb_update_window(fbi, p.uwnd.x, p.uwnd.y, -+ p.uwnd.width, p.uwnd.height); -+ break; -+ -+ case OMAPFB_SETUP_PLANE: -+ DBG("ioctl SETUP_PLANE\n"); -+ if (copy_from_user(&p.plane_info, (void __user *)arg, -+ sizeof(p.plane_info))) -+ r = -EFAULT; -+ else -+ r = omapfb_setup_plane(fbi, &p.plane_info); -+ break; -+ -+ case OMAPFB_QUERY_PLANE: -+ DBG("ioctl QUERY_PLANE\n"); -+ r = omapfb_query_plane(fbi, &p.plane_info); -+ if (r < 0) -+ break; -+ if (copy_to_user((void __user *)arg, &p.plane_info, -+ sizeof(p.plane_info))) -+ r = -EFAULT; -+ break; -+ -+ case OMAPFB_SETUP_MEM: -+ DBG("ioctl SETUP_MEM\n"); -+ if (copy_from_user(&p.mem_info, (void __user *)arg, -+ sizeof(p.mem_info))) -+ r = -EFAULT; -+ else -+ r = omapfb_setup_mem(fbi, &p.mem_info); -+ break; -+ -+ case OMAPFB_QUERY_MEM: -+ DBG("ioctl QUERY_MEM\n"); -+ r = omapfb_query_mem(fbi, &p.mem_info); -+ if (r < 0) -+ break; -+ if (copy_to_user((void __user *)arg, &p.mem_info, -+ sizeof(p.mem_info))) -+ r = -EFAULT; -+ break; -+ -+ case OMAPFB_GET_CAPS: -+ DBG("ioctl GET_CAPS\n"); -+ if (!display) { -+ r = -EINVAL; -+ break; -+ } -+ -+ p.caps.ctrl = display->caps; -+ -+ if (copy_to_user((void __user *)arg, &p.caps, sizeof(p.caps))) -+ r = -EFAULT; -+ break; -+ -+ case OMAPFB_SET_UPDATE_MODE: -+ DBG("ioctl SET_UPDATE_MODE\n"); -+ if (get_user(p.update_mode, (int __user *)arg)) -+ r = -EFAULT; -+ else -+ r = omapfb_set_update_mode(fbi, p.update_mode); -+ break; -+ -+ case OMAPFB_GET_UPDATE_MODE: -+ DBG("ioctl GET_UPDATE_MODE\n"); -+ r = omapfb_get_update_mode(fbi, &p.update_mode); -+ if (r) -+ break; -+ if (put_user(p.update_mode, -+ (enum omapfb_update_mode __user *)arg)) -+ r = -EFAULT; -+ break; -+ -+ case OMAPFB_SET_COLOR_KEY: -+ DBG("ioctl SET_COLOR_KEY\n"); -+ if (copy_from_user(&p.color_key, (void __user *)arg, -+ sizeof(p.color_key))) -+ r = -EFAULT; -+ else -+ r = omapfb_set_color_key(fbi, &p.color_key); -+ break; -+ -+ case OMAPFB_GET_COLOR_KEY: -+ DBG("ioctl GET_COLOR_KEY\n"); -+ if ((r = omapfb_get_color_key(fbi, &p.color_key)) < 0) -+ break; -+ if (copy_to_user((void __user *)arg, &p.color_key, -+ sizeof(p.color_key))) -+ r = -EFAULT; -+ break; -+ -+ case OMAPFB_WAITFORVSYNC: -+ DBG("ioctl WAITFORVSYNC\n"); -+ if (!display) { -+ r = -EINVAL; -+ break; -+ } -+ -+ r = display->wait_vsync(display); -+ break; -+ -+ /* LCD and CTRL tests do the same thing for backward -+ * compatibility */ -+ case OMAPFB_LCD_TEST: -+ DBG("ioctl LCD_TEST\n"); -+ if (get_user(p.test_num, (int __user *)arg)) { -+ r = -EFAULT; -+ break; -+ } -+ if (!display || !display->run_test) { -+ r = -EINVAL; -+ break; -+ } -+ -+ r = display->run_test(display, p.test_num); -+ -+ break; -+ -+ case OMAPFB_CTRL_TEST: -+ DBG("ioctl CTRL_TEST\n"); -+ if (get_user(p.test_num, (int __user *)arg)) { -+ r = -EFAULT; -+ break; -+ } -+ if (!display || !display->run_test) { -+ r = -EINVAL; -+ break; -+ } -+ -+ r = display->run_test(display, p.test_num); -+ -+ break; -+ -+ case OMAPFB_MEMORY_READ: -+ DBG("ioctl MEMORY_READ\n"); -+ -+ if (copy_from_user(&p.memory_read, (void __user *)arg, -+ sizeof(p.memory_read))) { -+ r = -EFAULT; -+ break; -+ } -+ -+ r = omapfb_memory_read(fbi, &p.memory_read); -+ -+ break; -+ -+ default: -+ dev_err(fbdev->dev, "Unknown ioctl 0x%x\n", cmd); -+ r = -EINVAL; -+ } -+ -+ if (r < 0) -+ DBG("ioctl failed: %d\n", r); -+ -+ return r; -+} -+ -+ -diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c -new file mode 100644 -index 0000000..e4186ec ---- /dev/null -+++ b/drivers/video/omap2/omapfb/omapfb-main.c -@@ -0,0 +1,1944 @@ -+/* -+ * linux/drivers/video/omap2/omapfb-main.c -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "omapfb.h" -+ -+#define MODULE_NAME "omapfb" -+ -+static char *def_mode; -+static char *def_vram; -+static int def_vrfb; -+static int def_rotate; -+static int def_mirror; -+ -+#ifdef DEBUG -+unsigned int omapfb_debug; -+module_param_named(debug, omapfb_debug, bool, 0644); -+static unsigned int omapfb_test_pattern; -+module_param_named(test, omapfb_test_pattern, bool, 0644); -+#endif -+ -+#ifdef DEBUG -+static void draw_pixel(struct fb_info *fbi, int x, int y, unsigned color) -+{ -+ struct fb_var_screeninfo *var = &fbi->var; -+ struct fb_fix_screeninfo *fix = &fbi->fix; -+ void __iomem *addr = fbi->screen_base; -+ const unsigned bytespp = var->bits_per_pixel >> 3; -+ const unsigned line_len = fix->line_length / bytespp; -+ -+ int r = (color >> 16) & 0xff; -+ int g = (color >> 8) & 0xff; -+ int b = (color >> 0) & 0xff; -+ -+ if (var->bits_per_pixel == 16) { -+ u16 __iomem *p = (u16 __iomem *)addr; -+ p += y * line_len + x; -+ -+ r = r * 32 / 256; -+ g = g * 64 / 256; -+ b = b * 32 / 256; -+ -+ __raw_writew((r << 11) | (g << 5) | (b << 0), p); -+ } else if (var->bits_per_pixel == 24) { -+ u8 __iomem *p = (u8 __iomem *)addr; -+ p += (y * line_len + x) * 3; -+ -+ __raw_writeb(b, p + 0); -+ __raw_writeb(g, p + 1); -+ __raw_writeb(r, p + 2); -+ } else if (var->bits_per_pixel == 32) { -+ u32 __iomem *p = (u32 __iomem *)addr; -+ p += y * line_len + x; -+ __raw_writel(color, p); -+ } -+} -+ -+static void fill_fb(struct fb_info *fbi) -+{ -+ struct fb_var_screeninfo *var = &fbi->var; -+ const short w = var->xres_virtual; -+ const short h = var->yres_virtual; -+ void __iomem *addr = fbi->screen_base; -+ int y, x; -+ -+ if (!addr) -+ return; -+ -+ DBG("fill_fb %dx%d, line_len %d bytes\n", w, h, fbi->fix.line_length); -+ -+ for (y = 0; y < h; y++) { -+ for (x = 0; x < w; x++) { -+ if (x < 20 && y < 20) -+ draw_pixel(fbi, x, y, 0xffffff); -+ else if (x < 20 && (y > 20 && y < h - 20)) -+ draw_pixel(fbi, x, y, 0xff); -+ else if (y < 20 && (x > 20 && x < w - 20)) -+ draw_pixel(fbi, x, y, 0xff00); -+ else if (x > w - 20 && (y > 20 && y < h - 20)) -+ draw_pixel(fbi, x, y, 0xff0000); -+ else if (y > h - 20 && (x > 20 && x < w - 20)) -+ draw_pixel(fbi, x, y, 0xffff00); -+ else if (x == 20 || x == w - 20 || -+ y == 20 || y == h - 20) -+ draw_pixel(fbi, x, y, 0xffffff); -+ else if (x == y || w - x == h - y) -+ draw_pixel(fbi, x, y, 0xff00ff); -+ else if (w - x == y || x == h - y) -+ draw_pixel(fbi, x, y, 0x00ffff); -+ else if (x > 20 && y > 20 && x < w - 20 && y < h - 20) { -+ int t = x * 3 / w; -+ unsigned r = 0, g = 0, b = 0; -+ unsigned c; -+ if (var->bits_per_pixel == 16) { -+ if (t == 0) -+ b = (y % 32) * 256 / 32; -+ else if (t == 1) -+ g = (y % 64) * 256 / 64; -+ else if (t == 2) -+ r = (y % 32) * 256 / 32; -+ } else { -+ if (t == 0) -+ b = (y % 256); -+ else if (t == 1) -+ g = (y % 256); -+ else if (t == 2) -+ r = (y % 256); -+ } -+ c = (r << 16) | (g << 8) | (b << 0); -+ draw_pixel(fbi, x, y, c); -+ } else { -+ draw_pixel(fbi, x, y, 0); -+ } -+ } -+ } -+} -+#endif -+ -+static unsigned omapfb_get_vrfb_offset(struct omapfb_info *ofbi, int rot) -+{ -+ struct vrfb *vrfb = &ofbi->region.vrfb; -+ unsigned offset; -+ -+ switch (rot) { -+ case FB_ROTATE_UR: -+ offset = 0; -+ break; -+ case FB_ROTATE_CW: -+ offset = vrfb->yoffset; -+ break; -+ case FB_ROTATE_UD: -+ offset = vrfb->yoffset * OMAP_VRFB_LINE_LEN + vrfb->xoffset; -+ break; -+ case FB_ROTATE_CCW: -+ offset = vrfb->xoffset * OMAP_VRFB_LINE_LEN; -+ break; -+ default: -+ BUG(); -+ } -+ -+ offset *= vrfb->bytespp; -+ -+ return offset; -+} -+ -+static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi) -+{ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { -+ unsigned offset; -+ int rot; -+ -+ rot = ofbi->rotation; -+ -+ offset = omapfb_get_vrfb_offset(ofbi, rot); -+ -+ return ofbi->region.vrfb.paddr[rot] + offset; -+ } else { -+ return ofbi->region.paddr; -+ } -+} -+ -+u32 omapfb_get_region_paddr(struct omapfb_info *ofbi) -+{ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ return ofbi->region.vrfb.paddr[0]; -+ else -+ return ofbi->region.paddr; -+} -+ -+void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi) -+{ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ return ofbi->region.vrfb.vaddr[0]; -+ else -+ return ofbi->region.vaddr; -+} -+ -+static enum omap_color_mode fb_mode_to_dss_mode(struct fb_var_screeninfo *var) -+{ -+ switch (var->nonstd) { -+ case 0: -+ break; -+ case OMAPFB_COLOR_YUV422: -+ return OMAP_DSS_COLOR_UYVY; -+ -+ case OMAPFB_COLOR_YUY422: -+ return OMAP_DSS_COLOR_YUV2; -+ -+ case OMAPFB_COLOR_ARGB16: -+ return OMAP_DSS_COLOR_ARGB16; -+ -+ case OMAPFB_COLOR_ARGB32: -+ return OMAP_DSS_COLOR_ARGB32; -+ -+ case OMAPFB_COLOR_RGBA32: -+ return OMAP_DSS_COLOR_RGBA32; -+ -+ case OMAPFB_COLOR_RGBX32: -+ return OMAP_DSS_COLOR_RGBX32; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ switch (var->bits_per_pixel) { -+ case 1: -+ return OMAP_DSS_COLOR_CLUT1; -+ case 2: -+ return OMAP_DSS_COLOR_CLUT2; -+ case 4: -+ return OMAP_DSS_COLOR_CLUT4; -+ case 8: -+ return OMAP_DSS_COLOR_CLUT8; -+ case 12: -+ return OMAP_DSS_COLOR_RGB12U; -+ case 16: -+ return OMAP_DSS_COLOR_RGB16; -+ case 24: -+ return OMAP_DSS_COLOR_RGB24P; -+ case 32: -+ return OMAP_DSS_COLOR_RGB24U; -+ default: -+ return -EINVAL; -+ } -+ -+ return -EINVAL; -+} -+ -+void set_fb_fix(struct fb_info *fbi) -+{ -+ struct fb_fix_screeninfo *fix = &fbi->fix; -+ struct fb_var_screeninfo *var = &fbi->var; -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_mem_region *rg = &ofbi->region; -+ -+ DBG("set_fb_fix\n"); -+ -+ /* used by open/write in fbmem.c */ -+ fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi); -+ -+ /* used by mmap in fbmem.c */ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ fix->line_length = -+ (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3; -+ else -+ fix->line_length = -+ (var->xres_virtual * var->bits_per_pixel) >> 3; -+ fix->smem_start = omapfb_get_region_paddr(ofbi); -+ fix->smem_len = rg->size; -+ -+ fix->type = FB_TYPE_PACKED_PIXELS; -+ -+ if (var->nonstd) -+ fix->visual = FB_VISUAL_PSEUDOCOLOR; -+ else { -+ switch (var->bits_per_pixel) { -+ case 32: -+ case 24: -+ case 16: -+ case 12: -+ fix->visual = FB_VISUAL_TRUECOLOR; -+ /* 12bpp is stored in 16 bits */ -+ break; -+ case 1: -+ case 2: -+ case 4: -+ case 8: -+ fix->visual = FB_VISUAL_PSEUDOCOLOR; -+ break; -+ } -+ } -+ -+ fix->accel = FB_ACCEL_NONE; -+ -+ fix->xpanstep = 1; -+ fix->ypanstep = 1; -+ -+ if (rg->size) { -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ omap_vrfb_setup(&rg->vrfb, rg->paddr, -+ var->xres_virtual, var->yres_virtual, -+ var->bits_per_pixel >> 3); -+ } -+} -+ -+/* check new var and possibly modify it to be ok */ -+int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omap_display *display = fb2display(fbi); -+ unsigned long max_frame_size; -+ unsigned long line_size; -+ int xres_min, yres_min; -+ int xres_max, yres_max; -+ enum omap_color_mode mode = 0; -+ int i; -+ int bytespp; -+ -+ DBG("check_fb_var %d\n", ofbi->id); -+ -+ if (ofbi->region.size == 0) -+ return 0; -+ -+ /* if we are using non standard mode, fix the bpp first */ -+ switch (var->nonstd) { -+ case 0: -+ break; -+ case OMAPFB_COLOR_YUV422: -+ case OMAPFB_COLOR_YUY422: -+ case OMAPFB_COLOR_ARGB16: -+ var->bits_per_pixel = 16; -+ break; -+ case OMAPFB_COLOR_ARGB32: -+ case OMAPFB_COLOR_RGBA32: -+ case OMAPFB_COLOR_RGBX32: -+ var->bits_per_pixel = 32; -+ break; -+ default: -+ DBG("invalid nonstd mode\n"); -+ return -EINVAL; -+ } -+ -+ mode = fb_mode_to_dss_mode(var); -+ if (mode < 0) { -+ DBG("cannot convert var to omap dss mode\n"); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < ofbi->num_overlays; ++i) { -+ if ((ofbi->overlays[i]->supported_modes & mode) == 0) { -+ DBG("invalid mode\n"); -+ return -EINVAL; -+ } -+ } -+ -+ if (var->rotate < 0 || var->rotate > 3) -+ return -EINVAL; -+ -+ if (var->rotate != fbi->var.rotate) { -+ DBG("rotation changing\n"); -+ -+ ofbi->rotation = var->rotate; -+ -+ if (abs(var->rotate - fbi->var.rotate) != 2) { -+ int tmp; -+ DBG("rotate changing 90/270 degrees. " -+ "swapping x/y res\n"); -+ -+ tmp = var->yres; -+ var->yres = var->xres; -+ var->xres = tmp; -+ -+ tmp = var->yres_virtual; -+ var->yres_virtual = var->xres_virtual; -+ var->xres_virtual = tmp; -+ } -+ } -+ -+ xres_min = OMAPFB_PLANE_XRES_MIN; -+ xres_max = 2048; -+ yres_min = OMAPFB_PLANE_YRES_MIN; -+ yres_max = 2048; -+ -+ bytespp = var->bits_per_pixel >> 3; -+ -+ /* XXX: some applications seem to set virtual res to 0. */ -+ if (var->xres_virtual == 0) -+ var->xres_virtual = var->xres; -+ -+ if (var->yres_virtual == 0) -+ var->yres_virtual = var->yres; -+ -+ if (var->xres_virtual < xres_min || var->yres_virtual < yres_min) -+ return -EINVAL; -+ -+ if (var->xres < xres_min) -+ var->xres = xres_min; -+ if (var->yres < yres_min) -+ var->yres = yres_min; -+ if (var->xres > xres_max) -+ var->xres = xres_max; -+ if (var->yres > yres_max) -+ var->yres = yres_max; -+ -+ if (var->xres > var->xres_virtual) -+ var->xres = var->xres_virtual; -+ if (var->yres > var->yres_virtual) -+ var->yres = var->yres_virtual; -+ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ line_size = OMAP_VRFB_LINE_LEN * bytespp; -+ else -+ line_size = var->xres_virtual * bytespp; -+ -+ max_frame_size = ofbi->region.size; -+ -+ DBG("max frame size %lu, line size %lu\n", max_frame_size, line_size); -+ -+ if (line_size * var->yres_virtual > max_frame_size) { -+ DBG("can't fit FB into memory, reducing y\n"); -+ var->yres_virtual = max_frame_size / line_size; -+ -+ if (var->yres_virtual < yres_min) -+ var->yres_virtual = yres_min; -+ -+ if (var->yres > var->yres_virtual) -+ var->yres = var->yres_virtual; -+ } -+ -+ if (line_size * var->yres_virtual > max_frame_size) { -+ DBG("can't fit FB into memory, reducing x\n"); -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) -+ return -EINVAL; -+ -+ var->xres_virtual = max_frame_size / var->yres_virtual / -+ bytespp; -+ -+ if (var->xres_virtual < xres_min) -+ var->xres_virtual = xres_min; -+ -+ if (var->xres > var->xres_virtual) -+ var->xres = var->xres_virtual; -+ -+ line_size = var->xres_virtual * bytespp; -+ } -+ -+ if (line_size * var->yres_virtual > max_frame_size) { -+ DBG("cannot fit FB to memory\n"); -+ return -EINVAL; -+ } -+ -+ if (var->xres + var->xoffset > var->xres_virtual) -+ var->xoffset = var->xres_virtual - var->xres; -+ if (var->yres + var->yoffset > var->yres_virtual) -+ var->yoffset = var->yres_virtual - var->yres; -+ -+ if (var->bits_per_pixel == 16) { -+ var->red.offset = 11; var->red.length = 5; -+ var->red.msb_right = 0; -+ var->green.offset = 5; var->green.length = 6; -+ var->green.msb_right = 0; -+ var->blue.offset = 0; var->blue.length = 5; -+ var->blue.msb_right = 0; -+ } else if (var->bits_per_pixel == 24) { -+ var->red.offset = 16; var->red.length = 8; -+ var->red.msb_right = 0; -+ var->green.offset = 8; var->green.length = 8; -+ var->green.msb_right = 0; -+ var->blue.offset = 0; var->blue.length = 8; -+ var->blue.msb_right = 0; -+ var->transp.offset = 0; var->transp.length = 0; -+ } else if (var->bits_per_pixel == 32) { -+ var->red.offset = 16; var->red.length = 8; -+ var->red.msb_right = 0; -+ var->green.offset = 8; var->green.length = 8; -+ var->green.msb_right = 0; -+ var->blue.offset = 0; var->blue.length = 8; -+ var->blue.msb_right = 0; -+ var->transp.offset = 0; var->transp.length = 0; -+ } else { -+ DBG("failed to setup fb color mask\n"); -+ return -EINVAL; -+ } -+ -+ DBG("xres = %d, yres = %d, vxres = %d, vyres = %d\n", -+ var->xres, var->yres, -+ var->xres_virtual, var->yres_virtual); -+ -+ var->height = -1; -+ var->width = -1; -+ var->grayscale = 0; -+ -+ if (display && display->get_timings) { -+ struct omap_video_timings timings; -+ display->get_timings(display, &timings); -+ -+ /* pixclock in ps, the rest in pixclock */ -+ var->pixclock = timings.pixel_clock != 0 ? -+ KHZ2PICOS(timings.pixel_clock) : -+ 0; -+ var->left_margin = timings.hfp; -+ var->right_margin = timings.hbp; -+ var->upper_margin = timings.vfp; -+ var->lower_margin = timings.vbp; -+ var->hsync_len = timings.hsw; -+ var->vsync_len = timings.vsw; -+ } else { -+ var->pixclock = 0; -+ var->left_margin = 0; -+ var->right_margin = 0; -+ var->upper_margin = 0; -+ var->lower_margin = 0; -+ var->hsync_len = 0; -+ var->vsync_len = 0; -+ } -+ -+ /* TODO: get these from panel->config */ -+ var->vmode = FB_VMODE_NONINTERLACED; -+ var->sync = 0; -+ -+ return 0; -+} -+ -+/* -+ * --------------------------------------------------------------------------- -+ * fbdev framework callbacks -+ * --------------------------------------------------------------------------- -+ */ -+static int omapfb_open(struct fb_info *fbi, int user) -+{ -+ return 0; -+} -+ -+static int omapfb_release(struct fb_info *fbi, int user) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ -+ DBG("Closing fb with plane index %d\n", ofbi->id); -+ -+ omapfb_lock(fbdev); -+#if 1 -+ if (display && display->get_update_mode && display->update) { -+ /* XXX this update should be removed, I think. But it's -+ * good for debugging */ -+ if (display->get_update_mode(display) == -+ OMAP_DSS_UPDATE_MANUAL) { -+ u16 w, h; -+ -+ if (display->sync) -+ display->sync(display); -+ -+ display->get_resolution(display, &w, &h); -+ display->update(display, 0, 0, w, h); -+ } -+ } -+#endif -+ -+ if (display && display->sync) -+ display->sync(display); -+ -+ omapfb_unlock(fbdev); -+ -+ return 0; -+} -+ -+/* setup overlay according to the fb */ -+static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, -+ u16 posx, u16 posy, u16 outw, u16 outh) -+{ -+ int r = 0; -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct fb_var_screeninfo *var = &fbi->var; -+ struct fb_fix_screeninfo *fix = &fbi->fix; -+ enum omap_color_mode mode = 0; -+ int offset; -+ u32 data_start_p; -+ void __iomem *data_start_v; -+ struct omap_overlay_info info; -+ int xres, yres; -+ int screen_width; -+ int rot, mirror; -+ -+ DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id, -+ posx, posy, outw, outh); -+ -+ if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_CCW) { -+ xres = var->yres; -+ yres = var->xres; -+ } else { -+ xres = var->xres; -+ yres = var->yres; -+ } -+ -+ offset = ((var->yoffset * var->xres_virtual + -+ var->xoffset) * var->bits_per_pixel) >> 3; -+ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { -+ data_start_p = omapfb_get_region_rot_paddr(ofbi); -+ data_start_v = NULL; -+ } else { -+ data_start_p = omapfb_get_region_paddr(ofbi); -+ data_start_v = omapfb_get_region_vaddr(ofbi); -+ } -+ -+ data_start_p += offset; -+ data_start_v += offset; -+ -+ mode = fb_mode_to_dss_mode(var); -+ -+ if (mode == -EINVAL) { -+ DBG("fb_mode_to_dss_mode failed"); -+ r = -EINVAL; -+ goto err; -+ } -+ -+ screen_width = fix->line_length / (var->bits_per_pixel >> 3); -+ -+ ovl->get_overlay_info(ovl, &info); -+ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { -+ rot = 0; -+ mirror = 0; -+ } else { -+ rot = ofbi->rotation; -+ mirror = ofbi->mirror; -+ } -+ -+ info.paddr = data_start_p; -+ info.vaddr = data_start_v; -+ info.screen_width = screen_width; -+ info.width = xres; -+ info.height = yres; -+ info.color_mode = mode; -+ info.rotation = rot; -+ info.mirror = mirror; -+ -+ info.pos_x = posx; -+ info.pos_y = posy; -+ info.out_width = outw; -+ info.out_height = outh; -+ -+ r = ovl->set_overlay_info(ovl, &info); -+ if (r) { -+ DBG("ovl->setup_overlay_info failed\n"); -+ goto err; -+ } -+ -+ return 0; -+ -+err: -+ DBG("setup_overlay failed\n"); -+ return r; -+} -+ -+/* apply var to the overlay */ -+int omapfb_apply_changes(struct fb_info *fbi, int init) -+{ -+ int r = 0; -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct fb_var_screeninfo *var = &fbi->var; -+ struct omap_overlay *ovl; -+ u16 posx, posy; -+ u16 outw, outh; -+ int i; -+ -+#ifdef DEBUG -+ if (omapfb_test_pattern) -+ fill_fb(fbi); -+#endif -+ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ ovl = ofbi->overlays[i]; -+ -+ DBG("apply_changes, fb %d, ovl %d\n", ofbi->id, ovl->id); -+ -+ if (ofbi->region.size == 0) { -+ /* the fb is not available. disable the overlay */ -+ omapfb_overlay_enable(ovl, 0); -+ if (!init && ovl->manager) -+ ovl->manager->apply(ovl->manager); -+ continue; -+ } -+ -+ if (init || (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { -+ if (ofbi->rotation == FB_ROTATE_CW || -+ ofbi->rotation == FB_ROTATE_CCW) { -+ outw = var->yres; -+ outh = var->xres; -+ } else { -+ outw = var->xres; -+ outh = var->yres; -+ } -+ } else { -+ outw = ovl->info.out_width; -+ outh = ovl->info.out_height; -+ } -+ -+ if (init) { -+ posx = 0; -+ posy = 0; -+ } else { -+ posx = ovl->info.pos_x; -+ posy = ovl->info.pos_y; -+ } -+ -+ r = omapfb_setup_overlay(fbi, ovl, posx, posy, outw, outh); -+ if (r) -+ goto err; -+ -+ if (!init && ovl->manager) -+ ovl->manager->apply(ovl->manager); -+ } -+ return 0; -+err: -+ DBG("apply_changes failed\n"); -+ return r; -+} -+ -+/* checks var and eventually tweaks it to something supported, -+ * DO NOT MODIFY PAR */ -+static int omapfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fbi) -+{ -+ int r; -+ -+ DBG("check_var(%d)\n", FB2OFB(fbi)->id); -+ -+ r = check_fb_var(fbi, var); -+ -+ return r; -+} -+ -+/* set the video mode according to info->var */ -+static int omapfb_set_par(struct fb_info *fbi) -+{ -+ int r; -+ -+ DBG("set_par(%d)\n", FB2OFB(fbi)->id); -+ -+ set_fb_fix(fbi); -+ r = omapfb_apply_changes(fbi, 0); -+ -+ return r; -+} -+ -+static int omapfb_pan_display(struct fb_var_screeninfo *var, -+ struct fb_info *fbi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ int r = 0; -+ -+ DBG("pan_display(%d)\n", ofbi->id); -+ -+ omapfb_lock(fbdev); -+ -+ if (var->xoffset != fbi->var.xoffset || -+ var->yoffset != fbi->var.yoffset) { -+ struct fb_var_screeninfo new_var; -+ -+ new_var = fbi->var; -+ new_var.xoffset = var->xoffset; -+ new_var.yoffset = var->yoffset; -+ -+ r = check_fb_var(fbi, &new_var); -+ -+ if (r == 0) { -+ fbi->var = new_var; -+ set_fb_fix(fbi); -+ r = omapfb_apply_changes(fbi, 0); -+ } -+ } -+ -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static void mmap_user_open(struct vm_area_struct *vma) -+{ -+ struct omapfb_info *ofbi = (struct omapfb_info *)vma->vm_private_data; -+ -+ atomic_inc(&ofbi->map_count); -+} -+ -+static void mmap_user_close(struct vm_area_struct *vma) -+{ -+ struct omapfb_info *ofbi = (struct omapfb_info *)vma->vm_private_data; -+ -+ atomic_dec(&ofbi->map_count); -+} -+ -+static struct vm_operations_struct mmap_user_ops = { -+ .open = mmap_user_open, -+ .close = mmap_user_close, -+}; -+ -+static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct fb_fix_screeninfo *fix = &fbi->fix; -+ unsigned long off; -+ unsigned long start; -+ u32 len; -+ -+ if (vma->vm_end - vma->vm_start == 0) -+ return 0; -+ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) -+ return -EINVAL; -+ off = vma->vm_pgoff << PAGE_SHIFT; -+ -+ start = omapfb_get_region_paddr(ofbi); -+ len = fix->smem_len; -+ if (off >= len) -+ return -EINVAL; -+ if ((vma->vm_end - vma->vm_start + off) > len) -+ return -EINVAL; -+ -+ off += start; -+ -+ DBG("user mmap region start %lx, len %d, off %lx\n", start, len, off); -+ -+ vma->vm_pgoff = off >> PAGE_SHIFT; -+ vma->vm_flags |= VM_IO | VM_RESERVED; -+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); -+ vma->vm_ops = &mmap_user_ops; -+ vma->vm_private_data = ofbi; -+ if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, -+ vma->vm_end - vma->vm_start, vma->vm_page_prot)) -+ return -EAGAIN; -+ /* vm_ops.open won't be called for mmap itself. */ -+ atomic_inc(&ofbi->map_count); -+ return 0; -+} -+ -+/* Store a single color palette entry into a pseudo palette or the hardware -+ * palette if one is available. For now we support only 16bpp and thus store -+ * the entry only to the pseudo palette. -+ */ -+static int _setcolreg(struct fb_info *fbi, u_int regno, u_int red, u_int green, -+ u_int blue, u_int transp, int update_hw_pal) -+{ -+ /*struct omapfb_info *ofbi = FB2OFB(fbi);*/ -+ /*struct omapfb2_device *fbdev = ofbi->fbdev;*/ -+ struct fb_var_screeninfo *var = &fbi->var; -+ int r = 0; -+ -+ enum omapfb_color_format mode = OMAPFB_COLOR_RGB24U; /* XXX */ -+ -+ /*switch (plane->color_mode) {*/ -+ switch (mode) { -+ case OMAPFB_COLOR_YUV422: -+ case OMAPFB_COLOR_YUV420: -+ case OMAPFB_COLOR_YUY422: -+ r = -EINVAL; -+ break; -+ case OMAPFB_COLOR_CLUT_8BPP: -+ case OMAPFB_COLOR_CLUT_4BPP: -+ case OMAPFB_COLOR_CLUT_2BPP: -+ case OMAPFB_COLOR_CLUT_1BPP: -+ /* -+ if (fbdev->ctrl->setcolreg) -+ r = fbdev->ctrl->setcolreg(regno, red, green, blue, -+ transp, update_hw_pal); -+ */ -+ /* Fallthrough */ -+ r = -EINVAL; -+ break; -+ case OMAPFB_COLOR_RGB565: -+ case OMAPFB_COLOR_RGB444: -+ case OMAPFB_COLOR_RGB24P: -+ case OMAPFB_COLOR_RGB24U: -+ if (r != 0) -+ break; -+ -+ if (regno < 0) { -+ r = -EINVAL; -+ break; -+ } -+ -+ if (regno < 16) { -+ u16 pal; -+ pal = ((red >> (16 - var->red.length)) << -+ var->red.offset) | -+ ((green >> (16 - var->green.length)) << -+ var->green.offset) | -+ (blue >> (16 - var->blue.length)); -+ ((u32 *)(fbi->pseudo_palette))[regno] = pal; -+ } -+ break; -+ default: -+ BUG(); -+ } -+ return r; -+} -+ -+static int omapfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, -+ u_int transp, struct fb_info *info) -+{ -+ DBG("setcolreg\n"); -+ -+ return _setcolreg(info, regno, red, green, blue, transp, 1); -+} -+ -+static int omapfb_setcmap(struct fb_cmap *cmap, struct fb_info *info) -+{ -+ int count, index, r; -+ u16 *red, *green, *blue, *transp; -+ u16 trans = 0xffff; -+ -+ DBG("setcmap\n"); -+ -+ red = cmap->red; -+ green = cmap->green; -+ blue = cmap->blue; -+ transp = cmap->transp; -+ index = cmap->start; -+ -+ for (count = 0; count < cmap->len; count++) { -+ if (transp) -+ trans = *transp++; -+ r = _setcolreg(info, index++, *red++, *green++, *blue++, trans, -+ count == cmap->len - 1); -+ if (r != 0) -+ return r; -+ } -+ -+ return 0; -+} -+ -+static int omapfb_blank(int blank, struct fb_info *fbi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ int do_update = 0; -+ int r = 0; -+ -+ omapfb_lock(fbdev); -+ -+ switch (blank) { -+ case FB_BLANK_UNBLANK: -+ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) -+ goto exit; -+ -+ if (display->resume) -+ r = display->resume(display); -+ -+ if (r == 0 && display->get_update_mode && -+ display->get_update_mode(display) == -+ OMAP_DSS_UPDATE_MANUAL) -+ do_update = 1; -+ -+ break; -+ -+ case FB_BLANK_NORMAL: -+ /* FB_BLANK_NORMAL could be implemented. -+ * Needs DSS additions. */ -+ case FB_BLANK_VSYNC_SUSPEND: -+ case FB_BLANK_HSYNC_SUSPEND: -+ case FB_BLANK_POWERDOWN: -+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) -+ goto exit; -+ -+ if (display->suspend) -+ r = display->suspend(display); -+ -+ break; -+ -+ default: -+ r = -EINVAL; -+ } -+ -+exit: -+ omapfb_unlock(fbdev); -+ -+ if (r == 0 && do_update && display->update) { -+ u16 w, h; -+ display->get_resolution(display, &w, &h); -+ -+ r = display->update(display, 0, 0, w, h); -+ } -+ -+ return r; -+} -+ -+#if 0 -+/* XXX fb_read and fb_write are needed for VRFB */ -+ssize_t omapfb_write(struct fb_info *info, const char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ DBG("omapfb_write %d, %lu\n", count, (unsigned long)*ppos); -+ // XXX needed for VRFB -+ return count; -+} -+#endif -+ -+static struct fb_ops omapfb_ops = { -+ .owner = THIS_MODULE, -+ .fb_open = omapfb_open, -+ .fb_release = omapfb_release, -+ .fb_fillrect = cfb_fillrect, -+ .fb_copyarea = cfb_copyarea, -+ .fb_imageblit = cfb_imageblit, -+ .fb_blank = omapfb_blank, -+ .fb_ioctl = omapfb_ioctl, -+ .fb_check_var = omapfb_check_var, -+ .fb_set_par = omapfb_set_par, -+ .fb_pan_display = omapfb_pan_display, -+ .fb_mmap = omapfb_mmap, -+ .fb_setcolreg = omapfb_setcolreg, -+ .fb_setcmap = omapfb_setcmap, -+ //.fb_write = omapfb_write, -+}; -+ -+static void omapfb_free_fbmem(struct fb_info *fbi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omapfb2_mem_region *rg; -+ -+ rg = &ofbi->region; -+ -+ if (rg->paddr) -+ if (omap_vram_free(rg->paddr, rg->size)) -+ dev_err(fbdev->dev, "VRAM FREE failed\n"); -+ -+ if (rg->vaddr) -+ iounmap(rg->vaddr); -+ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { -+ /* unmap the 0 angle rotation */ -+ if (rg->vrfb.vaddr[0]) { -+ iounmap(rg->vrfb.vaddr[0]); -+ omap_vrfb_release_ctx(&rg->vrfb); -+ } -+ } -+ -+ rg->vaddr = NULL; -+ rg->paddr = 0; -+ rg->alloc = 0; -+ rg->size = 0; -+} -+ -+static int omapfb_free_all_fbmem(struct omapfb2_device *fbdev) -+{ -+ int i; -+ -+ DBG("free all fbmem\n"); -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ struct fb_info *fbi = fbdev->fbs[i]; -+ omapfb_free_fbmem(fbi); -+ memset(&fbi->fix, 0, sizeof(fbi->fix)); -+ memset(&fbi->var, 0, sizeof(fbi->var)); -+ } -+ -+ return 0; -+} -+ -+static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, -+ unsigned long paddr) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omapfb2_mem_region *rg; -+ void __iomem *vaddr; -+ int r; -+ int clear = 0; -+ -+ rg = &ofbi->region; -+ memset(rg, 0, sizeof(*rg)); -+ -+ size = PAGE_ALIGN(size); -+ -+ if (!paddr) { -+ DBG("allocating %lu bytes for fb %d\n", size, ofbi->id); -+ r = omap_vram_alloc(OMAPFB_MEMTYPE_SDRAM, size, &paddr); -+ clear = 1; -+ } else { -+ DBG("reserving %lu bytes at %lx for fb %d\n", size, paddr, -+ ofbi->id); -+ r = omap_vram_reserve(paddr, size); -+ } -+ -+ if (r) { -+ dev_err(fbdev->dev, "failed to allocate framebuffer\n"); -+ return -ENOMEM; -+ } -+ -+ if (ofbi->rotation_type != OMAPFB_ROT_VRFB) { -+ vaddr = ioremap_wc(paddr, size); -+ -+ if (!vaddr) { -+ dev_err(fbdev->dev, "failed to ioremap framebuffer\n"); -+ omap_vram_free(paddr, size); -+ return -ENOMEM; -+ } -+ -+ DBG("allocated VRAM paddr %lx, vaddr %p\n", paddr, vaddr); -+ -+ if (clear) -+ memset_io(vaddr, 0, size); -+ } else { -+ void __iomem *va; -+ -+ r = omap_vrfb_request_ctx(&rg->vrfb); -+ if (r) { -+ dev_err(fbdev->dev, "vrfb create ctx failed\n"); -+ return r; -+ } -+ -+ /* only ioremap the 0 angle view */ -+ va = ioremap_wc(rg->vrfb.paddr[0], size); -+ -+ if(!va) { -+ printk(KERN_ERR "vrfb: ioremap failed\n"); -+ return -ENOMEM; -+ } -+ -+ DBG("ioremapped vrfb area 0 to %p\n", va); -+ -+ rg->vrfb.vaddr[0] = va; -+ -+ vaddr = NULL; -+ -+ if (clear) -+ memset_io(va, 0, size); -+ } -+ -+ rg->paddr = paddr; -+ rg->vaddr = vaddr; -+ rg->size = size; -+ rg->alloc = 1; -+ -+ return 0; -+} -+ -+/* allocate fbmem using display resolution as reference */ -+static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size, -+ unsigned long paddr) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omap_display *display; -+ int bytespp; -+ -+ display = fb2display(fbi); -+ -+ if (!display) -+ return 0; -+ -+ switch (display->get_recommended_bpp(display)) { -+ case 16: -+ bytespp = 2; -+ break; -+ case 24: -+ bytespp = 4; -+ break; -+ default: -+ bytespp = 4; -+ break; -+ } -+ -+ if (!size) { -+ u16 w, h; -+ -+ display->get_resolution(display, &w, &h); -+ -+ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { -+ int oldw = w, oldh = h; -+ -+ omap_vrfb_adjust_size(&w, &h, bytespp); -+ -+ /* Because we change the resolution of the 0 degree view, -+ * we need to alloc max(w, h) for height */ -+ h = max(w, h); -+ w = OMAP_VRFB_LINE_LEN; -+ -+ DBG("adjusting fb mem size for VRFB, %dx%d -> %dx%d\n", -+ oldw, oldh, w, h); -+ } -+ -+ size = w * h * bytespp; -+ } -+ -+ return omapfb_alloc_fbmem(fbi, size, paddr); -+} -+ -+static int omapfb_parse_vram_param(const char *param, int max_entries, -+ unsigned long *sizes, unsigned long *paddrs) -+{ -+ int fbnum; -+ unsigned long size; -+ unsigned long paddr = 0; -+ char *p, *start; -+ -+ start = (char *)param; -+ -+ while (1) { -+ p = start; -+ -+ fbnum = simple_strtoul(p, &p, 10); -+ -+ if (p == param) -+ return -EINVAL; -+ -+ if (*p != ':') -+ return -EINVAL; -+ -+ if (fbnum >= max_entries) -+ return -EINVAL; -+ -+ size = memparse(p + 1, &p); -+ -+ if (!size) -+ return -EINVAL; -+ -+ paddr = 0; -+ -+ if (*p == '@') { -+ paddr = simple_strtoul(p + 1, &p, 16); -+ -+ if (!paddr) -+ return -EINVAL; -+ -+ } -+ -+ paddrs[fbnum] = paddr; -+ sizes[fbnum] = size; -+ -+ if (*p == 0) -+ break; -+ -+ if (*p != ',') -+ return -EINVAL; -+ -+ ++p; -+ -+ start = p; -+ } -+ -+ return 0; -+} -+ -+static int omapfb_allocate_all_fbs(struct omapfb2_device *fbdev) -+{ -+ int i, r; -+ unsigned long vram_sizes[10]; -+ unsigned long vram_paddrs[10]; -+ -+ memset(&vram_sizes, 0, sizeof(vram_sizes)); -+ memset(&vram_paddrs, 0, sizeof(vram_paddrs)); -+ -+ if (def_vram && omapfb_parse_vram_param(def_vram, 10, -+ vram_sizes, vram_paddrs)) { -+ dev_err(fbdev->dev, "failed to parse vram parameter\n"); -+ -+ memset(&vram_sizes, 0, sizeof(vram_sizes)); -+ memset(&vram_paddrs, 0, sizeof(vram_paddrs)); -+ } -+ -+ if (fbdev->dev->platform_data) { -+ struct omapfb_platform_data *opd; -+ opd = fbdev->dev->platform_data; -+ for (i = 0; i < opd->mem_desc.region_cnt; ++i) { -+ if (!vram_sizes[i]) { -+ unsigned long size; -+ unsigned long paddr; -+ -+ size = opd->mem_desc.region[i].size; -+ paddr = opd->mem_desc.region[i].paddr; -+ -+ vram_sizes[i] = size; -+ vram_paddrs[i] = paddr; -+ } -+ } -+ } -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ /* allocate memory automatically only for fb0, or if -+ * excplicitly defined with vram or plat data option */ -+ if (i == 0 || vram_sizes[i] != 0) { -+ r = omapfb_alloc_fbmem_display(fbdev->fbs[i], -+ vram_sizes[i], vram_paddrs[i]); -+ -+ if (r) -+ return r; -+ } -+ } -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); -+ struct omapfb2_mem_region *rg; -+ rg = &ofbi->region; -+ -+ DBG("region%d phys %08x virt %p size=%lu\n", -+ i, -+ rg->paddr, -+ rg->vaddr, -+ rg->size); -+ } -+ -+ return 0; -+} -+ -+int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_display *display = fb2display(fbi); -+ struct omapfb2_mem_region *rg = &ofbi->region; -+ unsigned long old_size = rg->size; -+ unsigned long old_paddr = rg->paddr; -+ int old_type = rg->type; -+ int r; -+ -+ if (type > OMAPFB_MEMTYPE_MAX) -+ return -EINVAL; -+ -+ size = PAGE_ALIGN(size); -+ -+ if (old_size == size && old_type == type) -+ return 0; -+ -+ if (display && display->sync) -+ display->sync(display); -+ -+ omapfb_free_fbmem(fbi); -+ -+ if (size == 0) { -+ memset(&fbi->fix, 0, sizeof(fbi->fix)); -+ memset(&fbi->var, 0, sizeof(fbi->var)); -+ return 0; -+ } -+ -+ r = omapfb_alloc_fbmem(fbi, size, 0); -+ -+ if (r) { -+ if (old_size) -+ omapfb_alloc_fbmem(fbi, old_size, old_paddr); -+ -+ if (rg->size == 0) { -+ memset(&fbi->fix, 0, sizeof(fbi->fix)); -+ memset(&fbi->var, 0, sizeof(fbi->var)); -+ } -+ -+ return r; -+ } -+ -+ if (old_size == size) -+ return 0; -+ -+ if (old_size == 0) { -+ DBG("initializing fb %d\n", ofbi->id); -+ r = omapfb_fb_init(fbdev, fbi); -+ if (r) { -+ DBG("omapfb_fb_init failed\n"); -+ goto err; -+ } -+ r = omapfb_apply_changes(fbi, 1); -+ if (r) { -+ DBG("omapfb_apply_changes failed\n"); -+ goto err; -+ } -+ } else { -+ struct fb_var_screeninfo new_var; -+ memcpy(&new_var, &fbi->var, sizeof(new_var)); -+ r = check_fb_var(fbi, &new_var); -+ if (r) -+ goto err; -+ memcpy(&fbi->var, &new_var, sizeof(fbi->var)); -+ set_fb_fix(fbi); -+ } -+ -+ return 0; -+err: -+ omapfb_free_fbmem(fbi); -+ memset(&fbi->fix, 0, sizeof(fbi->fix)); -+ memset(&fbi->var, 0, sizeof(fbi->var)); -+ return r; -+} -+ -+/* initialize fb_info, var, fix to something sane based on the display */ -+int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi) -+{ -+ struct fb_var_screeninfo *var = &fbi->var; -+ struct fb_fix_screeninfo *fix = &fbi->fix; -+ struct omap_display *display = fb2display(fbi); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ int r = 0; -+ -+ fbi->fbops = &omapfb_ops; -+ fbi->flags = FBINFO_FLAG_DEFAULT; -+ fbi->pseudo_palette = fbdev->pseudo_palette; -+ -+ strncpy(fix->id, MODULE_NAME, sizeof(fix->id)); -+ -+ if (ofbi->region.size == 0) { -+ memset(&fbi->fix, 0, sizeof(fbi->fix)); -+ memset(&fbi->var, 0, sizeof(fbi->var)); -+ return 0; -+ } -+ -+ var->nonstd = 0; -+ -+ var->rotate = ofbi->rotation; -+ -+ if (display) { -+ u16 w, h; -+ display->get_resolution(display, &w, &h); -+ -+ if (ofbi->rotation == FB_ROTATE_CW || -+ ofbi->rotation == FB_ROTATE_CCW) { -+ var->xres = h; -+ var->yres = w; -+ } else { -+ var->xres = w; -+ var->yres = h; -+ } -+ -+ var->xres_virtual = var->xres; -+ var->yres_virtual = var->yres; -+ -+ switch (display->get_recommended_bpp(display)) { -+ case 16: -+ var->bits_per_pixel = 16; -+ break; -+ case 24: -+ var->bits_per_pixel = 32; -+ break; -+ default: -+ dev_err(fbdev->dev, "illegal display bpp\n"); -+ return -EINVAL; -+ } -+ } else { -+ /* if there's no display, let's just guess some basic values */ -+ var->xres = 320; -+ var->yres = 240; -+ var->xres_virtual = var->xres; -+ var->yres_virtual = var->yres; -+ var->bits_per_pixel = 16; -+ } -+ -+ r = check_fb_var(fbi, var); -+ if (r) -+ goto err; -+ -+ set_fb_fix(fbi); -+err: -+ return r; -+} -+ -+static void fbinfo_cleanup(struct omapfb2_device *fbdev, struct fb_info *fbi) -+{ -+ fb_dealloc_cmap(&fbi->cmap); -+} -+ -+ -+static void omapfb_free_resources(struct omapfb2_device *fbdev) -+{ -+ int i; -+ -+ DBG("free_resources\n"); -+ -+ if (fbdev == NULL) -+ return; -+ -+ for (i = 0; i < fbdev->num_fbs; i++) -+ unregister_framebuffer(fbdev->fbs[i]); -+ -+ /* free the reserved fbmem */ -+ omapfb_free_all_fbmem(fbdev); -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ fbinfo_cleanup(fbdev, fbdev->fbs[i]); -+ framebuffer_release(fbdev->fbs[i]); -+ } -+ -+ for (i = 0; i < fbdev->num_displays; i++) { -+ if (fbdev->displays[i]->state != OMAP_DSS_DISPLAY_DISABLED) -+ fbdev->displays[i]->disable(fbdev->displays[i]); -+ -+ omap_dss_put_display(fbdev->displays[i]); -+ } -+ -+ dev_set_drvdata(fbdev->dev, NULL); -+ kfree(fbdev); -+} -+ -+static int omapfb_create_framebuffers(struct omapfb2_device *fbdev) -+{ -+ int r, i; -+ -+ fbdev->num_fbs = 0; -+ -+ DBG("create %d framebuffers\n", CONFIG_FB_OMAP2_NUM_FBS); -+ -+ /* allocate fb_infos */ -+ for (i = 0; i < CONFIG_FB_OMAP2_NUM_FBS; i++) { -+ struct fb_info *fbi; -+ struct omapfb_info *ofbi; -+ -+ fbi = framebuffer_alloc(sizeof(struct omapfb_info), -+ fbdev->dev); -+ -+ if (fbi == NULL) { -+ dev_err(fbdev->dev, -+ "unable to allocate memory for plane info\n"); -+ return -ENOMEM; -+ } -+ -+ fbdev->fbs[i] = fbi; -+ -+ ofbi = FB2OFB(fbi); -+ ofbi->fbdev = fbdev; -+ ofbi->id = i; -+ -+ /* assign these early, so that fb alloc can use them */ -+ ofbi->rotation_type = def_vrfb ? OMAPFB_ROT_VRFB : -+ OMAPFB_ROT_DMA; -+ ofbi->rotation = def_rotate; -+ ofbi->mirror = def_mirror; -+ -+ fbdev->num_fbs++; -+ } -+ -+ DBG("fb_infos allocated\n"); -+ -+ /* assign overlays for the fbs */ -+ for (i = 0; i < min(fbdev->num_fbs, fbdev->num_overlays); i++) { -+ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); -+ -+ ofbi->overlays[0] = fbdev->overlays[i]; -+ ofbi->num_overlays = 1; -+ } -+ -+ /* allocate fb memories */ -+ r = omapfb_allocate_all_fbs(fbdev); -+ if (r) { -+ dev_err(fbdev->dev, "failed to allocate fbmem\n"); -+ return r; -+ } -+ -+ DBG("fbmems allocated\n"); -+ -+ /* setup fb_infos */ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ r = omapfb_fb_init(fbdev, fbdev->fbs[i]); -+ if (r) { -+ dev_err(fbdev->dev, "failed to setup fb_info\n"); -+ return r; -+ } -+ } -+ -+ DBG("fb_infos initialized\n"); -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ r = register_framebuffer(fbdev->fbs[i]); -+ if (r != 0) { -+ dev_err(fbdev->dev, -+ "registering framebuffer %d failed\n", i); -+ return r; -+ } -+ } -+ -+ DBG("framebuffers registered\n"); -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ r = omapfb_apply_changes(fbdev->fbs[i], 1); -+ if (r) { -+ dev_err(fbdev->dev, "failed to change mode\n"); -+ return r; -+ } -+ } -+ -+ DBG("create sysfs for fbs\n"); -+ r = omapfb_create_sysfs(fbdev); -+ if (r) { -+ dev_err(fbdev->dev, "failed to create sysfs entries\n"); -+ return r; -+ } -+ -+ /* Enable fb0 */ -+ if (fbdev->num_fbs > 0) { -+ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[0]); -+ -+ if (ofbi->num_overlays > 0 ) { -+ struct omap_overlay *ovl = ofbi->overlays[0]; -+ -+ r = omapfb_overlay_enable(ovl, 1); -+ -+ if (r) { -+ dev_err(fbdev->dev, -+ "failed to enable overlay\n"); -+ return r; -+ } -+ } -+ } -+ -+ DBG("create_framebuffers done\n"); -+ -+ return 0; -+} -+ -+int omapfb_mode_to_timings(const char *mode_str, -+ struct omap_video_timings *timings, u8 *bpp) -+{ -+ struct fb_info fbi; -+ struct fb_var_screeninfo var; -+ struct fb_ops fbops; -+ int r; -+ -+#ifdef CONFIG_OMAP2_DSS_VENC -+ if (strcmp(mode_str, "pal") == 0) { -+ *timings = omap_dss_pal_timings; -+ *bpp = 0; -+ return 0; -+ } else if (strcmp(mode_str, "ntsc") == 0) { -+ *timings = omap_dss_ntsc_timings; -+ *bpp = 0; -+ return 0; -+ } -+#endif -+ -+ /* this is quite a hack, but I wanted to use the modedb and for -+ * that we need fb_info and var, so we create dummy ones */ -+ -+ memset(&fbi, 0, sizeof(fbi)); -+ memset(&var, 0, sizeof(var)); -+ memset(&fbops, 0, sizeof(fbops)); -+ fbi.fbops = &fbops; -+ -+ r = fb_find_mode(&var, &fbi, mode_str, NULL, 0, NULL, 24); -+ -+ if (r != 0) { -+ timings->pixel_clock = PICOS2KHZ(var.pixclock); -+ timings->hfp = var.left_margin; -+ timings->hbp = var.right_margin; -+ timings->vfp = var.upper_margin; -+ timings->vbp = var.lower_margin; -+ timings->hsw = var.hsync_len; -+ timings->vsw = var.vsync_len; -+ timings->x_res = var.xres; -+ timings->y_res = var.yres; -+ -+ switch (var.bits_per_pixel) { -+ case 16: -+ *bpp = 16; -+ break; -+ case 24: -+ case 32: -+ default: -+ *bpp = 24; -+ break; -+ } -+ -+ return 0; -+ } else { -+ return -EINVAL; -+ } -+} -+ -+static int omapfb_set_def_mode(struct omap_display *display, char *mode_str) -+{ -+ int r; -+ u8 bpp; -+ struct omap_video_timings timings; -+ -+ r = omapfb_mode_to_timings(mode_str, &timings, &bpp); -+ if (r) -+ return r; -+ -+ display->panel->recommended_bpp = bpp; -+ -+ if (!display->check_timings || !display->set_timings) -+ return -EINVAL; -+ -+ r = display->check_timings(display, &timings); -+ if (r) -+ return r; -+ -+ display->set_timings(display, &timings); -+ -+ return 0; -+} -+ -+static int omapfb_parse_def_modes(struct omapfb2_device *fbdev) -+{ -+ char *str, *options, *this_opt; -+ int r = 0; -+ -+ str = kmalloc(strlen(def_mode) + 1, GFP_KERNEL); -+ strcpy(str, def_mode); -+ options = str; -+ -+ while (!r && (this_opt = strsep(&options, ",")) != NULL) { -+ char *p, *display_str, *mode_str; -+ struct omap_display *display; -+ int i; -+ -+ p = strchr(this_opt, ':'); -+ if (!p) { -+ r = -EINVAL; -+ break; -+ } -+ -+ *p = 0; -+ display_str = this_opt; -+ mode_str = p + 1; -+ -+ display = NULL; -+ for (i = 0; i < fbdev->num_displays; ++i) { -+ if (strcmp(fbdev->displays[i]->name, -+ display_str) == 0) { -+ display = fbdev->displays[i]; -+ break; -+ } -+ } -+ -+ if (!display) { -+ r = -EINVAL; -+ break; -+ } -+ -+ r = omapfb_set_def_mode(display, mode_str); -+ if (r) -+ break; -+ } -+ -+ kfree(str); -+ -+ return r; -+} -+ -+static int omapfb_probe(struct platform_device *pdev) -+{ -+ struct omapfb2_device *fbdev = NULL; -+ int r = 0; -+ int i, t; -+ struct omap_overlay *ovl; -+ struct omap_display *def_display; -+ -+ DBG("omapfb_probe\n"); -+ -+ if (pdev->num_resources != 0) { -+ dev_err(&pdev->dev, "probed for an unknown device\n"); -+ r = -ENODEV; -+ goto err0; -+ } -+ -+ fbdev = kzalloc(sizeof(struct omapfb2_device), GFP_KERNEL); -+ if (fbdev == NULL) { -+ r = -ENOMEM; -+ goto err0; -+ } -+ -+ mutex_init(&fbdev->mtx); -+ -+ fbdev->dev = &pdev->dev; -+ platform_set_drvdata(pdev, fbdev); -+ -+ fbdev->num_displays = 0; -+ t = omap_dss_get_num_displays(); -+ for (i = 0; i < t; i++) { -+ struct omap_display *display; -+ display = omap_dss_get_display(i); -+ if (!display) { -+ dev_err(&pdev->dev, "can't get display %d\n", i); -+ r = -EINVAL; -+ goto cleanup; -+ } -+ -+ fbdev->displays[fbdev->num_displays++] = display; -+ } -+ -+ if (fbdev->num_displays == 0) { -+ dev_err(&pdev->dev, "no displays\n"); -+ r = -EINVAL; -+ goto cleanup; -+ } -+ -+ fbdev->num_overlays = omap_dss_get_num_overlays(); -+ for (i = 0; i < fbdev->num_overlays; i++) -+ fbdev->overlays[i] = omap_dss_get_overlay(i); -+ -+ fbdev->num_managers = omap_dss_get_num_overlay_managers(); -+ for (i = 0; i < fbdev->num_managers; i++) -+ fbdev->managers[i] = omap_dss_get_overlay_manager(i); -+ -+ -+ /* gfx overlay should be the default one. find a display -+ * connected to that, and use it as default display */ -+ ovl = omap_dss_get_overlay(0); -+ if (ovl->manager && ovl->manager->display) { -+ def_display = ovl->manager->display; -+ } else { -+ dev_err(&pdev->dev, "cannot find default display\n"); -+ r = -EINVAL; -+ goto cleanup; -+ } -+ -+ if (def_mode && strlen(def_mode) > 0) { -+ if (omapfb_parse_def_modes(fbdev)) -+ dev_err(&pdev->dev, "cannot parse default modes\n"); -+ } -+ -+ r = omapfb_create_framebuffers(fbdev); -+ if (r) -+ goto cleanup; -+ -+ for (i = 0; i < fbdev->num_managers; i++) { -+ struct omap_overlay_manager *mgr; -+ mgr = fbdev->managers[i]; -+ r = mgr->apply(mgr); -+ if (r) { -+ dev_err(fbdev->dev, "failed to apply dispc config\n"); -+ goto cleanup; -+ } -+ } -+ -+ DBG("mgr->apply'ed\n"); -+ -+ r = def_display->enable(def_display); -+ if (r) { -+ dev_err(fbdev->dev, "Failed to enable display '%s'\n", -+ def_display->name); -+ goto cleanup; -+ } -+ -+ /* set the update mode */ -+ if (def_display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { -+#ifdef CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE -+ if (def_display->set_update_mode) -+ def_display->set_update_mode(def_display, -+ OMAP_DSS_UPDATE_AUTO); -+ if (def_display->enable_te) -+ def_display->enable_te(def_display, 1); -+#else -+ if (def_display->set_update_mode) -+ def_display->set_update_mode(def_display, -+ OMAP_DSS_UPDATE_MANUAL); -+ if (def_display->enable_te) -+ def_display->enable_te(def_display, 0); -+#endif -+ } else { -+ if (def_display->set_update_mode) -+ def_display->set_update_mode(def_display, -+ OMAP_DSS_UPDATE_AUTO); -+ } -+ -+ for (i = 0; i < fbdev->num_displays; i++) { -+ struct omap_display *display = fbdev->displays[i]; -+ u16 w, h; -+ -+ if (!display->get_update_mode || !display->update) -+ continue; -+ -+ if (display->get_update_mode(display) == -+ OMAP_DSS_UPDATE_MANUAL) { -+ -+ display->get_resolution(display, &w, &h); -+ display->update(display, 0, 0, w, h); -+ } -+ } -+ -+ DBG("display->updated\n"); -+ -+ return 0; -+ -+cleanup: -+ omapfb_free_resources(fbdev); -+err0: -+ dev_err(&pdev->dev, "failed to setup omapfb\n"); -+ return r; -+} -+ -+static int omapfb_remove(struct platform_device *pdev) -+{ -+ struct omapfb2_device *fbdev = platform_get_drvdata(pdev); -+ -+ /* FIXME: wait till completion of pending events */ -+ -+ omapfb_remove_sysfs(fbdev); -+ -+ omapfb_free_resources(fbdev); -+ -+ return 0; -+} -+ -+static struct platform_driver omapfb_driver = { -+ .probe = omapfb_probe, -+ .remove = omapfb_remove, -+ .driver = { -+ .name = "omapfb", -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init omapfb_init(void) -+{ -+ DBG("omapfb_init\n"); -+ -+ if (platform_driver_register(&omapfb_driver)) { -+ printk(KERN_ERR "failed to register omapfb driver\n"); -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ -+static void __exit omapfb_exit(void) -+{ -+ DBG("omapfb_exit\n"); -+ platform_driver_unregister(&omapfb_driver); -+} -+ -+module_param_named(mode, def_mode, charp, 0); -+module_param_named(vram, def_vram, charp, 0); -+module_param_named(rotate, def_rotate, int, 0); -+module_param_named(vrfb, def_vrfb, bool, 0); -+module_param_named(mirror, def_mirror, bool, 0); -+ -+/* late_initcall to let panel/ctrl drivers loaded first. -+ * I guess better option would be a more dynamic approach, -+ * so that omapfb reacts to new panels when they are loaded */ -+late_initcall(omapfb_init); -+/*module_init(omapfb_init);*/ -+module_exit(omapfb_exit); -+ -+MODULE_AUTHOR("Tomi Valkeinen "); -+MODULE_DESCRIPTION("OMAP2/3 Framebuffer"); -+MODULE_LICENSE("GPL v2"); -diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c -new file mode 100644 -index 0000000..2c88718 ---- /dev/null -+++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c -@@ -0,0 +1,371 @@ -+/* -+ * linux/drivers/video/omap2/omapfb-sysfs.c -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "omapfb.h" -+ -+static ssize_t show_rotate_type(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ -+ return snprintf(buf, PAGE_SIZE, "%d\n", ofbi->rotation_type); -+} -+ -+static ssize_t show_mirror(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ -+ return snprintf(buf, PAGE_SIZE, "%d\n", ofbi->mirror); -+} -+ -+static ssize_t store_mirror(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ bool mirror; -+ int r; -+ struct fb_var_screeninfo new_var; -+ -+ mirror = simple_strtoul(buf, NULL, 0); -+ -+ if (mirror != 0 && mirror != 1) -+ return -EINVAL; -+ -+ omapfb_lock(fbdev); -+ -+ ofbi->mirror = mirror; -+ -+ memcpy(&new_var, &fbi->var, sizeof(new_var)); -+ r = check_fb_var(fbi, &new_var); -+ if (r) -+ goto out; -+ memcpy(&fbi->var, &new_var, sizeof(fbi->var)); -+ -+ set_fb_fix(fbi); -+ -+ r = omapfb_apply_changes(fbi, 0); -+ if (r) -+ goto out; -+ -+ r = count; -+out: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static ssize_t show_overlays(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ ssize_t l = 0; -+ int t; -+ -+ for (t = 0; t < ofbi->num_overlays; t++) { -+ struct omap_overlay *ovl = ofbi->overlays[t]; -+ int ovlnum; -+ -+ for (ovlnum = 0; ovlnum < fbdev->num_overlays; ++ovlnum) -+ if (ovl == fbdev->overlays[ovlnum]) -+ break; -+ -+ l += snprintf(buf + l, PAGE_SIZE - l, "%s%d", -+ t == 0 ? "" : ",", ovlnum); -+ } -+ -+ l += snprintf(buf + l, PAGE_SIZE - l, "\n"); -+ -+ return l; -+} -+ -+static struct omapfb_info *get_overlay_fb(struct omapfb2_device *fbdev, -+ struct omap_overlay *ovl) -+{ -+ int i, t; -+ -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); -+ -+ for (t = 0; t < ofbi->num_overlays; t++) { -+ if (ofbi->overlays[t] == ovl) -+ return ofbi; -+ } -+ } -+ -+ return NULL; -+} -+ -+static ssize_t store_overlays(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ struct omap_overlay *ovls[OMAPFB_MAX_OVL_PER_FB]; -+ struct omap_overlay *ovl; -+ int num_ovls, r, i; -+ int len; -+ -+ num_ovls = 0; -+ -+ len = strlen(buf); -+ if (buf[len - 1] == '\n') -+ len = len - 1; -+ -+ omapfb_lock(fbdev); -+ -+ if (len > 0) { -+ char *p = (char *)buf; -+ int ovlnum; -+ -+ while (p < buf + len) { -+ int found; -+ if (num_ovls == OMAPFB_MAX_OVL_PER_FB) { -+ r = -EINVAL; -+ goto out; -+ } -+ -+ ovlnum = simple_strtoul(p, &p, 0); -+ if (ovlnum > fbdev->num_overlays) { -+ r = -EINVAL; -+ goto out; -+ } -+ -+ found = 0; -+ for (i = 0; i < num_ovls; ++i) { -+ if (ovls[i] == fbdev->overlays[ovlnum]) { -+ found = 1; -+ break; -+ } -+ } -+ -+ if (!found) -+ ovls[num_ovls++] = fbdev->overlays[ovlnum]; -+ -+ p++; -+ } -+ } -+ -+ for (i = 0; i < num_ovls; ++i) { -+ struct omapfb_info *ofbi2 = get_overlay_fb(fbdev, ovls[i]); -+ if (ofbi2 && ofbi2 != ofbi) { -+ dev_err(fbdev->dev, "overlay already in use\n"); -+ r = -EINVAL; -+ goto out; -+ } -+ } -+ -+ /* detach unused overlays */ -+ for (i = 0; i < ofbi->num_overlays; ++i) { -+ int t, found; -+ -+ ovl = ofbi->overlays[i]; -+ -+ found = 0; -+ -+ for (t = 0; t < num_ovls; ++t) { -+ if (ovl == ovls[t]) { -+ found = 1; -+ break; -+ } -+ } -+ -+ if (found) -+ continue; -+ -+ DBG("detaching %d\n", ofbi->overlays[i]->id); -+ -+ omapfb_overlay_enable(ovl, 0); -+ -+ if (ovl->manager) -+ ovl->manager->apply(ovl->manager); -+ -+ for (t = i + 1; t < ofbi->num_overlays; t++) -+ ofbi->overlays[t-1] = ofbi->overlays[t]; -+ -+ ofbi->num_overlays--; -+ i--; -+ } -+ -+ for (i = 0; i < num_ovls; ++i) { -+ int t, found; -+ -+ ovl = ovls[i]; -+ -+ found = 0; -+ -+ for (t = 0; t < ofbi->num_overlays; ++t) { -+ if (ovl == ofbi->overlays[t]) { -+ found = 1; -+ break; -+ } -+ } -+ -+ if (found) -+ continue; -+ -+ ofbi->overlays[ofbi->num_overlays++] = ovl; -+ -+ r = omapfb_apply_changes(fbi, 1); -+ if (r) -+ goto out; -+ -+ if (ovl->manager) { -+ r = ovl->manager->apply(ovl->manager); -+ if (r) -+ goto out; -+ } -+ } -+ -+ r = count; -+out: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static ssize_t show_size(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ -+ return snprintf(buf, PAGE_SIZE, "%lu\n", ofbi->region.size); -+} -+ -+static ssize_t store_size(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ struct omapfb2_device *fbdev = ofbi->fbdev; -+ unsigned long size; -+ int r; -+ int i; -+ -+ size = PAGE_ALIGN(simple_strtoul(buf, NULL, 0)); -+ -+ omapfb_lock(fbdev); -+ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ if (ofbi->overlays[i]->info.enabled) { -+ r = -EBUSY; -+ goto out; -+ } -+ } -+ -+ if (size != ofbi->region.size) { -+ r = omapfb_realloc_fbmem(fbi, size, ofbi->region.type); -+ if (r) { -+ dev_err(dev, "realloc fbmem failed\n"); -+ goto out; -+ } -+ } -+ -+ r = count; -+out: -+ omapfb_unlock(fbdev); -+ -+ return r; -+} -+ -+static ssize_t show_phys(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ -+ return snprintf(buf, PAGE_SIZE, "%0x\n", ofbi->region.paddr); -+} -+ -+static ssize_t show_virt(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct fb_info *fbi = dev_get_drvdata(dev); -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ -+ return snprintf(buf, PAGE_SIZE, "%p\n", ofbi->region.vaddr); -+} -+ -+static struct device_attribute omapfb_attrs[] = { -+ __ATTR(rotate_type, S_IRUGO, show_rotate_type, NULL), -+ __ATTR(mirror, S_IRUGO | S_IWUSR, show_mirror, store_mirror), -+ __ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size), -+ __ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays), -+ __ATTR(phys_addr, S_IRUGO, show_phys, NULL), -+ __ATTR(virt_addr, S_IRUGO, show_virt, NULL), -+}; -+ -+int omapfb_create_sysfs(struct omapfb2_device *fbdev) -+{ -+ int i; -+ int r; -+ -+ DBG("create sysfs for fbs\n"); -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ int t; -+ for (t = 0; t < ARRAY_SIZE(omapfb_attrs); t++) { -+ r = device_create_file(fbdev->fbs[i]->dev, -+ &omapfb_attrs[t]); -+ -+ if (r) { -+ dev_err(fbdev->dev, "failed to create sysfs file\n"); -+ return r; -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+void omapfb_remove_sysfs(struct omapfb2_device *fbdev) -+{ -+ int i, t; -+ -+ DBG("remove sysfs for fbs\n"); -+ for (i = 0; i < fbdev->num_fbs; i++) { -+ for (t = 0; t < ARRAY_SIZE(omapfb_attrs); t++) -+ device_remove_file(fbdev->fbs[i]->dev, -+ &omapfb_attrs[t]); -+ } -+} -+ -diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h -new file mode 100644 -index 0000000..d130e48 ---- /dev/null -+++ b/drivers/video/omap2/omapfb/omapfb.h -@@ -0,0 +1,143 @@ -+/* -+ * linux/drivers/video/omap2/omapfb.h -+ * -+ * Copyright (C) 2008 Nokia Corporation -+ * Author: Tomi Valkeinen -+ * -+ * Some code and ideas taken from drivers/video/omap/ driver -+ * by Imre Deak. -+ * -+ * 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 published by -+ * the Free Software Foundation. -+ * -+ * 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, see . -+ */ -+ -+#ifndef __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ -+#define __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ -+ -+#ifdef CONFIG_FB_OMAP2_DEBUG_SUPPORT -+#define DEBUG -+#endif -+ -+#ifdef DEBUG -+extern unsigned int omapfb_debug; -+#define DBG(format, ...) \ -+ if (omapfb_debug) \ -+ printk(KERN_DEBUG "OMAPFB: " format, ## __VA_ARGS__) -+#else -+#define DBG(format, ...) -+#endif -+ -+#define FB2OFB(fb_info) ((struct omapfb_info *)(fb_info->par)) -+ -+/* max number of overlays to which a framebuffer data can be direct */ -+#define OMAPFB_MAX_OVL_PER_FB 3 -+ -+struct omapfb2_mem_region { -+ u32 paddr; -+ void __iomem *vaddr; -+ struct vrfb vrfb; -+ unsigned long size; -+ u8 type; /* OMAPFB_PLANE_MEM_* */ -+ bool alloc; /* allocated by the driver */ -+ bool map; /* kernel mapped by the driver */ -+}; -+ -+enum omapfb_rotation_type { -+ OMAPFB_ROT_DMA = 0, -+ OMAPFB_ROT_VRFB = 1, -+}; -+ -+/* appended to fb_info */ -+struct omapfb_info { -+ int id; -+ struct omapfb2_mem_region region; -+ atomic_t map_count; -+ int num_overlays; -+ struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB]; -+ struct omapfb2_device *fbdev; -+ enum omapfb_rotation_type rotation_type; -+ u8 rotation; -+ bool mirror; -+}; -+ -+struct omapfb2_device { -+ struct device *dev; -+ struct mutex mtx; -+ -+ u32 pseudo_palette[17]; -+ -+ int state; -+ -+ unsigned num_fbs; -+ struct fb_info *fbs[10]; -+ -+ unsigned num_displays; -+ struct omap_display *displays[10]; -+ unsigned num_overlays; -+ struct omap_overlay *overlays[10]; -+ unsigned num_managers; -+ struct omap_overlay_manager *managers[10]; -+}; -+ -+u32 omapfb_get_region_paddr(struct omapfb_info *ofbi); -+void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi); -+ -+void set_fb_fix(struct fb_info *fbi); -+int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var); -+int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type); -+int omapfb_apply_changes(struct fb_info *fbi, int init); -+int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi); -+ -+int omapfb_create_sysfs(struct omapfb2_device *fbdev); -+void omapfb_remove_sysfs(struct omapfb2_device *fbdev); -+ -+int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg); -+ -+int omapfb_mode_to_timings(const char *mode_str, -+ struct omap_video_timings *timings, u8 *bpp); -+ -+/* find the display connected to this fb, if any */ -+static inline struct omap_display *fb2display(struct fb_info *fbi) -+{ -+ struct omapfb_info *ofbi = FB2OFB(fbi); -+ int i; -+ -+ /* XXX: returns the display connected to first attached overlay */ -+ for (i = 0; i < ofbi->num_overlays; i++) { -+ if (ofbi->overlays[i]->manager) -+ return ofbi->overlays[i]->manager->display; -+ } -+ -+ return NULL; -+} -+ -+static inline void omapfb_lock(struct omapfb2_device *fbdev) -+{ -+ mutex_lock(&fbdev->mtx); -+} -+ -+static inline void omapfb_unlock(struct omapfb2_device *fbdev) -+{ -+ mutex_unlock(&fbdev->mtx); -+} -+ -+static inline int omapfb_overlay_enable(struct omap_overlay *ovl, -+ int enable) -+{ -+ struct omap_overlay_info info; -+ -+ ovl->get_overlay_info(ovl, &info); -+ info.enabled = enable; -+ return ovl->set_overlay_info(ovl, &info); -+} -+ -+#endif -diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h -new file mode 100644 -index 0000000..96190b2 ---- /dev/null -+++ b/include/linux/omapfb.h -@@ -0,0 +1,418 @@ -+/* -+ * File: arch/arm/plat-omap/include/mach/omapfb.h -+ * -+ * Framebuffer driver for TI OMAP boards -+ * -+ * Copyright (C) 2004 Nokia Corporation -+ * Author: Imre Deak -+ * -+ * 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. -+ */ -+ -+#ifndef __OMAPFB_H -+#define __OMAPFB_H -+ -+#include -+#include -+ -+/* IOCTL commands. */ -+ -+#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) -+#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) -+#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) -+#define OMAP_IO(num) _IO('O', num) -+ -+#define OMAPFB_MIRROR OMAP_IOW(31, int) -+#define OMAPFB_SYNC_GFX OMAP_IO(37) -+#define OMAPFB_VSYNC OMAP_IO(38) -+#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) -+#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) -+#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) -+#define OMAPFB_LCD_TEST OMAP_IOW(45, int) -+#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) -+#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) -+#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) -+#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) -+#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) -+#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) -+#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) -+#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) -+#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) -+#define OMAPFB_WAITFORVSYNC OMAP_IO(57) -+#define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read) -+ -+#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff -+#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 -+#define OMAPFB_CAPS_PANEL_MASK 0xff000000 -+ -+#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 -+#define OMAPFB_CAPS_TEARSYNC 0x00002000 -+#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 -+#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 -+#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 -+#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 -+#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 -+#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 -+#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 -+ -+/* Values from DSP must map to lower 16-bits */ -+#define OMAPFB_FORMAT_MASK 0x00ff -+#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 -+#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 -+#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 -+#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 -+#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 -+ -+#define OMAPFB_EVENT_READY 1 -+#define OMAPFB_EVENT_DISABLED 2 -+ -+#define OMAPFB_MEMTYPE_SDRAM 0 -+#define OMAPFB_MEMTYPE_SRAM 1 -+#define OMAPFB_MEMTYPE_MAX 1 -+ -+enum omapfb_color_format { -+ OMAPFB_COLOR_RGB565 = 0, -+ OMAPFB_COLOR_YUV422, -+ OMAPFB_COLOR_YUV420, -+ OMAPFB_COLOR_CLUT_8BPP, -+ OMAPFB_COLOR_CLUT_4BPP, -+ OMAPFB_COLOR_CLUT_2BPP, -+ OMAPFB_COLOR_CLUT_1BPP, -+ OMAPFB_COLOR_RGB444, -+ OMAPFB_COLOR_YUY422, -+ -+ OMAPFB_COLOR_ARGB16, -+ OMAPFB_COLOR_RGB24U, /* RGB24, 32-bit container */ -+ OMAPFB_COLOR_RGB24P, /* RGB24, 24-bit container */ -+ OMAPFB_COLOR_ARGB32, -+ OMAPFB_COLOR_RGBA32, -+ OMAPFB_COLOR_RGBX32, -+}; -+ -+struct omapfb_update_window { -+ __u32 x, y; -+ __u32 width, height; -+ __u32 format; -+ __u32 out_x, out_y; -+ __u32 out_width, out_height; -+ __u32 reserved[8]; -+}; -+ -+struct omapfb_update_window_old { -+ __u32 x, y; -+ __u32 width, height; -+ __u32 format; -+}; -+ -+enum omapfb_plane { -+ OMAPFB_PLANE_GFX = 0, -+ OMAPFB_PLANE_VID1, -+ OMAPFB_PLANE_VID2, -+}; -+ -+enum omapfb_channel_out { -+ OMAPFB_CHANNEL_OUT_LCD = 0, -+ OMAPFB_CHANNEL_OUT_DIGIT, -+}; -+ -+struct omapfb_plane_info { -+ __u32 pos_x; -+ __u32 pos_y; -+ __u8 enabled; -+ __u8 channel_out; -+ __u8 mirror; -+ __u8 reserved1; -+ __u32 out_width; -+ __u32 out_height; -+ __u32 reserved2[12]; -+}; -+ -+struct omapfb_mem_info { -+ __u32 size; -+ __u8 type; -+ __u8 reserved[3]; -+}; -+ -+struct omapfb_caps { -+ __u32 ctrl; -+ __u32 plane_color; -+ __u32 wnd_color; -+}; -+ -+enum omapfb_color_key_type { -+ OMAPFB_COLOR_KEY_DISABLED = 0, -+ OMAPFB_COLOR_KEY_GFX_DST, -+ OMAPFB_COLOR_KEY_VID_SRC, -+}; -+ -+struct omapfb_color_key { -+ __u8 channel_out; -+ __u32 background; -+ __u32 trans_key; -+ __u8 key_type; -+}; -+ -+enum omapfb_update_mode { -+ OMAPFB_UPDATE_DISABLED = 0, -+ OMAPFB_AUTO_UPDATE, -+ OMAPFB_MANUAL_UPDATE -+}; -+ -+struct omapfb_memory_read { -+ __u16 x; -+ __u16 y; -+ __u16 w; -+ __u16 h; -+ size_t buffer_size; -+ void __user *buffer; -+}; -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+#include -+ -+#define OMAP_LCDC_INV_VSYNC 0x0001 -+#define OMAP_LCDC_INV_HSYNC 0x0002 -+#define OMAP_LCDC_INV_PIX_CLOCK 0x0004 -+#define OMAP_LCDC_INV_OUTPUT_EN 0x0008 -+#define OMAP_LCDC_HSVS_RISING_EDGE 0x0010 -+#define OMAP_LCDC_HSVS_OPPOSITE 0x0020 -+ -+#define OMAP_LCDC_SIGNAL_MASK 0x003f -+ -+#define OMAP_LCDC_PANEL_TFT 0x0100 -+ -+#define OMAPFB_PLANE_XRES_MIN 8 -+#define OMAPFB_PLANE_YRES_MIN 8 -+ -+#ifdef CONFIG_ARCH_OMAP1 -+#define OMAPFB_PLANE_NUM 1 -+#else -+#define OMAPFB_PLANE_NUM 3 -+#endif -+ -+struct omapfb_device; -+ -+struct lcd_panel { -+ const char *name; -+ int config; /* TFT/STN, signal inversion */ -+ int bpp; /* Pixel format in fb mem */ -+ int data_lines; /* Lines on LCD HW interface */ -+ -+ int x_res, y_res; -+ int pixel_clock; /* In kHz */ -+ int hsw; /* Horizontal synchronization -+ pulse width */ -+ int hfp; /* Horizontal front porch */ -+ int hbp; /* Horizontal back porch */ -+ int vsw; /* Vertical synchronization -+ pulse width */ -+ int vfp; /* Vertical front porch */ -+ int vbp; /* Vertical back porch */ -+ int acb; /* ac-bias pin frequency */ -+ int pcd; /* pixel clock divider. -+ Obsolete use pixel_clock instead */ -+ -+ int (*init) (struct lcd_panel *panel, -+ struct omapfb_device *fbdev); -+ void (*cleanup) (struct lcd_panel *panel); -+ int (*enable) (struct lcd_panel *panel); -+ void (*disable) (struct lcd_panel *panel); -+ unsigned long (*get_caps) (struct lcd_panel *panel); -+ int (*set_bklight_level)(struct lcd_panel *panel, -+ unsigned int level); -+ unsigned int (*get_bklight_level)(struct lcd_panel *panel); -+ unsigned int (*get_bklight_max) (struct lcd_panel *panel); -+ int (*run_test) (struct lcd_panel *panel, int test_num); -+}; -+ -+struct extif_timings { -+ int cs_on_time; -+ int cs_off_time; -+ int we_on_time; -+ int we_off_time; -+ int re_on_time; -+ int re_off_time; -+ int we_cycle_time; -+ int re_cycle_time; -+ int cs_pulse_width; -+ int access_time; -+ -+ int clk_div; -+ -+ u32 tim[5]; /* set by extif->convert_timings */ -+ -+ int converted; -+}; -+ -+struct lcd_ctrl_extif { -+ int (*init) (struct omapfb_device *fbdev); -+ void (*cleanup) (void); -+ void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div); -+ unsigned long (*get_max_tx_rate)(void); -+ int (*convert_timings) (struct extif_timings *timings); -+ void (*set_timings) (const struct extif_timings *timings); -+ void (*set_bits_per_cycle)(int bpc); -+ void (*write_command) (const void *buf, unsigned int len); -+ void (*read_data) (void *buf, unsigned int len); -+ void (*write_data) (const void *buf, unsigned int len); -+ void (*transfer_area) (int width, int height, -+ void (callback)(void * data), void *data); -+ int (*setup_tearsync) (unsigned pin_cnt, -+ unsigned hs_pulse_time, unsigned vs_pulse_time, -+ int hs_pol_inv, int vs_pol_inv, int div); -+ int (*enable_tearsync) (int enable, unsigned line); -+ -+ unsigned long max_transmit_size; -+}; -+ -+struct omapfb_notifier_block { -+ struct notifier_block nb; -+ void *data; -+ int plane_idx; -+}; -+ -+typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, -+ unsigned long event, -+ void *fbi); -+ -+struct omapfb_mem_region { -+ u32 paddr; -+ void __iomem *vaddr; -+ unsigned long size; -+ u8 type; /* OMAPFB_PLANE_MEM_* */ -+ unsigned alloc:1; /* allocated by the driver */ -+ unsigned map:1; /* kernel mapped by the driver */ -+}; -+ -+struct omapfb_mem_desc { -+ int region_cnt; -+ struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; -+}; -+ -+struct lcd_ctrl { -+ const char *name; -+ void *data; -+ -+ int (*init) (struct omapfb_device *fbdev, -+ int ext_mode, -+ struct omapfb_mem_desc *req_md); -+ void (*cleanup) (void); -+ void (*bind_client) (struct omapfb_notifier_block *nb); -+ void (*get_caps) (int plane, struct omapfb_caps *caps); -+ int (*set_update_mode)(enum omapfb_update_mode mode); -+ enum omapfb_update_mode (*get_update_mode)(void); -+ int (*setup_plane) (int plane, int channel_out, -+ unsigned long offset, -+ int screen_width, -+ int pos_x, int pos_y, int width, -+ int height, int color_mode); -+ int (*set_rotate) (int angle); -+ int (*setup_mem) (int plane, size_t size, -+ int mem_type, unsigned long *paddr); -+ int (*mmap) (struct fb_info *info, -+ struct vm_area_struct *vma); -+ int (*set_scale) (int plane, -+ int orig_width, int orig_height, -+ int out_width, int out_height); -+ int (*enable_plane) (int plane, int enable); -+ int (*update_window) (struct fb_info *fbi, -+ struct omapfb_update_window *win, -+ void (*callback)(void *), -+ void *callback_data); -+ void (*sync) (void); -+ void (*suspend) (void); -+ void (*resume) (void); -+ int (*run_test) (int test_num); -+ int (*setcolreg) (u_int regno, u16 red, u16 green, -+ u16 blue, u16 transp, -+ int update_hw_mem); -+ int (*set_color_key) (struct omapfb_color_key *ck); -+ int (*get_color_key) (struct omapfb_color_key *ck); -+}; -+ -+enum omapfb_state { -+ OMAPFB_DISABLED = 0, -+ OMAPFB_SUSPENDED= 99, -+ OMAPFB_ACTIVE = 100 -+}; -+ -+struct omapfb_plane_struct { -+ int idx; -+ struct omapfb_plane_info info; -+ enum omapfb_color_format color_mode; -+ struct omapfb_device *fbdev; -+}; -+ -+struct omapfb_device { -+ int state; -+ int ext_lcdc; /* Using external -+ LCD controller */ -+ struct mutex rqueue_mutex; -+ -+ int palette_size; -+ u32 pseudo_palette[17]; -+ -+ struct lcd_panel *panel; /* LCD panel */ -+ const struct lcd_ctrl *ctrl; /* LCD controller */ -+ const struct lcd_ctrl *int_ctrl; /* internal LCD ctrl */ -+ struct lcd_ctrl_extif *ext_if; /* LCD ctrl external -+ interface */ -+ struct device *dev; -+ struct fb_var_screeninfo new_var; /* for mode changes */ -+ -+ struct omapfb_mem_desc mem_desc; -+ struct fb_info *fb_info[OMAPFB_PLANE_NUM]; -+}; -+ -+struct omapfb_platform_data { -+ struct omap_lcd_config lcd; -+ struct omapfb_mem_desc mem_desc; -+ void *ctrl_platform_data; -+}; -+ -+#ifdef CONFIG_ARCH_OMAP1 -+extern struct lcd_ctrl omap1_lcd_ctrl; -+#else -+extern struct lcd_ctrl omap2_disp_ctrl; -+#endif -+ -+extern void omapfb_set_platform_data(struct omapfb_platform_data *data); -+ -+extern void omapfb_reserve_sdram(void); -+extern void omapfb_register_panel(struct lcd_panel *panel); -+extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); -+extern void omapfb_notify_clients(struct omapfb_device *fbdev, -+ unsigned long event); -+extern int omapfb_register_client(struct omapfb_notifier_block *nb, -+ omapfb_notifier_callback_t callback, -+ void *callback_data); -+extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); -+extern int omapfb_update_window_async(struct fb_info *fbi, -+ struct omapfb_update_window *win, -+ void (*callback)(void *), -+ void *callback_data); -+ -+/* in arch/arm/plat-omap/fb.c */ -+extern void omapfb_set_ctrl_platform_data(void *pdata); -+ -+#endif /* __KERNEL__ */ -+ -+#endif /* __OMAPFB_H */ diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch b/recipes/linux/linux-omap-2.6.29/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch new file mode 100644 index 0000000000..aeab62f105 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch @@ -0,0 +1,39 @@ +From 26abf45ac80be4c54a63fecf1c3c1e1efb416e0a Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Wed, 1 Apr 2009 18:27:09 +0300 +Subject: [PATCH] Revert "gro: Fix legacy path napi_complete crash" + +This reverts commit 303c6a0251852ecbdc5c15e466dcaff5971f7517. + +Fixes USB network problems +--- + net/core/dev.c | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/net/core/dev.c b/net/core/dev.c +index e3fe5c7..c1e9dc0 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -2588,9 +2588,9 @@ static int process_backlog(struct napi_struct *napi, int quota) + local_irq_disable(); + skb = __skb_dequeue(&queue->input_pkt_queue); + if (!skb) { ++ __napi_complete(napi); + local_irq_enable(); +- napi_complete(napi); +- goto out; ++ break; + } + local_irq_enable(); + +@@ -2599,7 +2599,6 @@ static int process_backlog(struct napi_struct *napi, int quota) + + napi_gro_flush(napi); + +-out: + return work; + } + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch b/recipes/linux/linux-omap-2.6.29/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch new file mode 100644 index 0000000000..04ac6a9ce8 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch @@ -0,0 +1,1316 @@ +From 02243f13eec816e11d16676a131bc04b8a0666ab Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Wed, 11 Feb 2009 16:33:02 +0200 +Subject: [PATCH] OMAPFB: move omapfb.h to include/linux/ + +This is needed so that omapfb.h is automatically exported to user space. + +omapfb.h should be cleaned up later. Some stuff can probably be moved +to omapfb's private include file. + +Signed-off-by: Tomi Valkeinen +--- + arch/arm/mach-omap1/board-nokia770.c | 2 +- + arch/arm/mach-omap2/board-n800.c | 2 +- + arch/arm/mach-omap2/io.c | 2 +- + arch/arm/plat-omap/fb.c | 2 +- + arch/arm/plat-omap/include/mach/omapfb.h | 398 ------------------------------ + drivers/video/omap/blizzard.c | 2 +- + drivers/video/omap/dispc.c | 2 +- + drivers/video/omap/hwa742.c | 2 +- + drivers/video/omap/lcd_2430sdp.c | 2 +- + drivers/video/omap/lcd_ams_delta.c | 2 +- + drivers/video/omap/lcd_apollon.c | 2 +- + drivers/video/omap/lcd_h3.c | 2 +- + drivers/video/omap/lcd_h4.c | 3 +- + drivers/video/omap/lcd_inn1510.c | 2 +- + drivers/video/omap/lcd_inn1610.c | 2 +- + drivers/video/omap/lcd_ldp.c | 2 +- + drivers/video/omap/lcd_mipid.c | 2 +- + drivers/video/omap/lcd_omap2evm.c | 2 +- + drivers/video/omap/lcd_omap3beagle.c | 2 +- + drivers/video/omap/lcd_omap3evm.c | 2 +- + drivers/video/omap/lcd_osk.c | 2 +- + drivers/video/omap/lcd_overo.c | 2 +- + drivers/video/omap/lcd_p2.c | 2 +- + drivers/video/omap/lcd_palmte.c | 2 +- + drivers/video/omap/lcd_palmtt.c | 2 +- + drivers/video/omap/lcd_palmz71.c | 3 +- + drivers/video/omap/lcdc.c | 2 +- + drivers/video/omap/omapfb_main.c | 2 +- + drivers/video/omap/rfbi.c | 3 +- + drivers/video/omap/sossi.c | 2 +- + include/linux/omapfb.h | 398 ++++++++++++++++++++++++++++++ + 31 files changed, 427 insertions(+), 430 deletions(-) + delete mode 100644 arch/arm/plat-omap/include/mach/omapfb.h + create mode 100644 include/linux/omapfb.h + +diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c +index 8780ca6..ca4680a 100644 +--- a/arch/arm/mach-omap1/board-nokia770.c ++++ b/arch/arm/mach-omap1/board-nokia770.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -32,7 +33,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c +index cb32b61..f6f6571 100644 +--- a/arch/arm/mach-omap2/board-n800.c ++++ b/arch/arm/mach-omap2/board-n800.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -39,7 +40,6 @@ + #include + #include + #include +-#include + #include + + #include <../drivers/cbus/tahvo.h> +diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c +index adbe21f..a04e3ee 100644 +--- a/arch/arm/mach-omap2/io.c ++++ b/arch/arm/mach-omap2/io.c +@@ -18,13 +18,13 @@ + #include + #include + #include ++#include + #include + + #include + + #include + #include +-#include + #include + #include + #include +diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c +index 3746222..40615a6 100644 +--- a/arch/arm/plat-omap/fb.c ++++ b/arch/arm/plat-omap/fb.c +@@ -28,13 +28,13 @@ + #include + #include + #include ++#include + + #include + #include + + #include + #include +-#include + + #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) + +diff --git a/arch/arm/plat-omap/include/mach/omapfb.h b/arch/arm/plat-omap/include/mach/omapfb.h +deleted file mode 100644 +index b226bdf..0000000 +--- a/arch/arm/plat-omap/include/mach/omapfb.h ++++ /dev/null +@@ -1,398 +0,0 @@ +-/* +- * File: arch/arm/plat-omap/include/mach/omapfb.h +- * +- * Framebuffer driver for TI OMAP boards +- * +- * Copyright (C) 2004 Nokia Corporation +- * Author: Imre Deak +- * +- * 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. +- */ +- +-#ifndef __OMAPFB_H +-#define __OMAPFB_H +- +-#include +-#include +- +-/* IOCTL commands. */ +- +-#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) +-#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) +-#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) +-#define OMAP_IO(num) _IO('O', num) +- +-#define OMAPFB_MIRROR OMAP_IOW(31, int) +-#define OMAPFB_SYNC_GFX OMAP_IO(37) +-#define OMAPFB_VSYNC OMAP_IO(38) +-#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) +-#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) +-#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) +-#define OMAPFB_LCD_TEST OMAP_IOW(45, int) +-#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) +-#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) +-#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) +-#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) +-#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) +-#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) +-#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) +-#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) +-#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) +- +-#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff +-#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 +-#define OMAPFB_CAPS_PANEL_MASK 0xff000000 +- +-#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 +-#define OMAPFB_CAPS_TEARSYNC 0x00002000 +-#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 +-#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 +-#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 +-#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 +-#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 +-#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 +-#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 +- +-/* Values from DSP must map to lower 16-bits */ +-#define OMAPFB_FORMAT_MASK 0x00ff +-#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 +-#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 +-#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 +-#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 +-#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 +- +-#define OMAPFB_EVENT_READY 1 +-#define OMAPFB_EVENT_DISABLED 2 +- +-#define OMAPFB_MEMTYPE_SDRAM 0 +-#define OMAPFB_MEMTYPE_SRAM 1 +-#define OMAPFB_MEMTYPE_MAX 1 +- +-enum omapfb_color_format { +- OMAPFB_COLOR_RGB565 = 0, +- OMAPFB_COLOR_YUV422, +- OMAPFB_COLOR_YUV420, +- OMAPFB_COLOR_CLUT_8BPP, +- OMAPFB_COLOR_CLUT_4BPP, +- OMAPFB_COLOR_CLUT_2BPP, +- OMAPFB_COLOR_CLUT_1BPP, +- OMAPFB_COLOR_RGB444, +- OMAPFB_COLOR_YUY422, +-}; +- +-struct omapfb_update_window { +- __u32 x, y; +- __u32 width, height; +- __u32 format; +- __u32 out_x, out_y; +- __u32 out_width, out_height; +- __u32 reserved[8]; +-}; +- +-struct omapfb_update_window_old { +- __u32 x, y; +- __u32 width, height; +- __u32 format; +-}; +- +-enum omapfb_plane { +- OMAPFB_PLANE_GFX = 0, +- OMAPFB_PLANE_VID1, +- OMAPFB_PLANE_VID2, +-}; +- +-enum omapfb_channel_out { +- OMAPFB_CHANNEL_OUT_LCD = 0, +- OMAPFB_CHANNEL_OUT_DIGIT, +-}; +- +-struct omapfb_plane_info { +- __u32 pos_x; +- __u32 pos_y; +- __u8 enabled; +- __u8 channel_out; +- __u8 mirror; +- __u8 reserved1; +- __u32 out_width; +- __u32 out_height; +- __u32 reserved2[12]; +-}; +- +-struct omapfb_mem_info { +- __u32 size; +- __u8 type; +- __u8 reserved[3]; +-}; +- +-struct omapfb_caps { +- __u32 ctrl; +- __u32 plane_color; +- __u32 wnd_color; +-}; +- +-enum omapfb_color_key_type { +- OMAPFB_COLOR_KEY_DISABLED = 0, +- OMAPFB_COLOR_KEY_GFX_DST, +- OMAPFB_COLOR_KEY_VID_SRC, +-}; +- +-struct omapfb_color_key { +- __u8 channel_out; +- __u32 background; +- __u32 trans_key; +- __u8 key_type; +-}; +- +-enum omapfb_update_mode { +- OMAPFB_UPDATE_DISABLED = 0, +- OMAPFB_AUTO_UPDATE, +- OMAPFB_MANUAL_UPDATE +-}; +- +-#ifdef __KERNEL__ +- +-#include +-#include +-#include +-#include +- +-#include +- +-#define OMAP_LCDC_INV_VSYNC 0x0001 +-#define OMAP_LCDC_INV_HSYNC 0x0002 +-#define OMAP_LCDC_INV_PIX_CLOCK 0x0004 +-#define OMAP_LCDC_INV_OUTPUT_EN 0x0008 +-#define OMAP_LCDC_HSVS_RISING_EDGE 0x0010 +-#define OMAP_LCDC_HSVS_OPPOSITE 0x0020 +- +-#define OMAP_LCDC_SIGNAL_MASK 0x003f +- +-#define OMAP_LCDC_PANEL_TFT 0x0100 +- +-#define OMAPFB_PLANE_XRES_MIN 8 +-#define OMAPFB_PLANE_YRES_MIN 8 +- +-#ifdef CONFIG_ARCH_OMAP1 +-#define OMAPFB_PLANE_NUM 1 +-#else +-#define OMAPFB_PLANE_NUM 3 +-#endif +- +-struct omapfb_device; +- +-struct lcd_panel { +- const char *name; +- int config; /* TFT/STN, signal inversion */ +- int bpp; /* Pixel format in fb mem */ +- int data_lines; /* Lines on LCD HW interface */ +- +- int x_res, y_res; +- int pixel_clock; /* In kHz */ +- int hsw; /* Horizontal synchronization +- pulse width */ +- int hfp; /* Horizontal front porch */ +- int hbp; /* Horizontal back porch */ +- int vsw; /* Vertical synchronization +- pulse width */ +- int vfp; /* Vertical front porch */ +- int vbp; /* Vertical back porch */ +- int acb; /* ac-bias pin frequency */ +- int pcd; /* pixel clock divider. +- Obsolete use pixel_clock instead */ +- +- int (*init) (struct lcd_panel *panel, +- struct omapfb_device *fbdev); +- void (*cleanup) (struct lcd_panel *panel); +- int (*enable) (struct lcd_panel *panel); +- void (*disable) (struct lcd_panel *panel); +- unsigned long (*get_caps) (struct lcd_panel *panel); +- int (*set_bklight_level)(struct lcd_panel *panel, +- unsigned int level); +- unsigned int (*get_bklight_level)(struct lcd_panel *panel); +- unsigned int (*get_bklight_max) (struct lcd_panel *panel); +- int (*run_test) (struct lcd_panel *panel, int test_num); +-}; +- +-struct extif_timings { +- int cs_on_time; +- int cs_off_time; +- int we_on_time; +- int we_off_time; +- int re_on_time; +- int re_off_time; +- int we_cycle_time; +- int re_cycle_time; +- int cs_pulse_width; +- int access_time; +- +- int clk_div; +- +- u32 tim[5]; /* set by extif->convert_timings */ +- +- int converted; +-}; +- +-struct lcd_ctrl_extif { +- int (*init) (struct omapfb_device *fbdev); +- void (*cleanup) (void); +- void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div); +- unsigned long (*get_max_tx_rate)(void); +- int (*convert_timings) (struct extif_timings *timings); +- void (*set_timings) (const struct extif_timings *timings); +- void (*set_bits_per_cycle)(int bpc); +- void (*write_command) (const void *buf, unsigned int len); +- void (*read_data) (void *buf, unsigned int len); +- void (*write_data) (const void *buf, unsigned int len); +- void (*transfer_area) (int width, int height, +- void (callback)(void * data), void *data); +- int (*setup_tearsync) (unsigned pin_cnt, +- unsigned hs_pulse_time, unsigned vs_pulse_time, +- int hs_pol_inv, int vs_pol_inv, int div); +- int (*enable_tearsync) (int enable, unsigned line); +- +- unsigned long max_transmit_size; +-}; +- +-struct omapfb_notifier_block { +- struct notifier_block nb; +- void *data; +- int plane_idx; +-}; +- +-typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, +- unsigned long event, +- void *fbi); +- +-struct omapfb_mem_region { +- u32 paddr; +- void __iomem *vaddr; +- unsigned long size; +- u8 type; /* OMAPFB_PLANE_MEM_* */ +- unsigned alloc:1; /* allocated by the driver */ +- unsigned map:1; /* kernel mapped by the driver */ +-}; +- +-struct omapfb_mem_desc { +- int region_cnt; +- struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; +-}; +- +-struct lcd_ctrl { +- const char *name; +- void *data; +- +- int (*init) (struct omapfb_device *fbdev, +- int ext_mode, +- struct omapfb_mem_desc *req_md); +- void (*cleanup) (void); +- void (*bind_client) (struct omapfb_notifier_block *nb); +- void (*get_caps) (int plane, struct omapfb_caps *caps); +- int (*set_update_mode)(enum omapfb_update_mode mode); +- enum omapfb_update_mode (*get_update_mode)(void); +- int (*setup_plane) (int plane, int channel_out, +- unsigned long offset, +- int screen_width, +- int pos_x, int pos_y, int width, +- int height, int color_mode); +- int (*set_rotate) (int angle); +- int (*setup_mem) (int plane, size_t size, +- int mem_type, unsigned long *paddr); +- int (*mmap) (struct fb_info *info, +- struct vm_area_struct *vma); +- int (*set_scale) (int plane, +- int orig_width, int orig_height, +- int out_width, int out_height); +- int (*enable_plane) (int plane, int enable); +- int (*update_window) (struct fb_info *fbi, +- struct omapfb_update_window *win, +- void (*callback)(void *), +- void *callback_data); +- void (*sync) (void); +- void (*suspend) (void); +- void (*resume) (void); +- int (*run_test) (int test_num); +- int (*setcolreg) (u_int regno, u16 red, u16 green, +- u16 blue, u16 transp, +- int update_hw_mem); +- int (*set_color_key) (struct omapfb_color_key *ck); +- int (*get_color_key) (struct omapfb_color_key *ck); +-}; +- +-enum omapfb_state { +- OMAPFB_DISABLED = 0, +- OMAPFB_SUSPENDED= 99, +- OMAPFB_ACTIVE = 100 +-}; +- +-struct omapfb_plane_struct { +- int idx; +- struct omapfb_plane_info info; +- enum omapfb_color_format color_mode; +- struct omapfb_device *fbdev; +-}; +- +-struct omapfb_device { +- int state; +- int ext_lcdc; /* Using external +- LCD controller */ +- struct mutex rqueue_mutex; +- +- int palette_size; +- u32 pseudo_palette[17]; +- +- struct lcd_panel *panel; /* LCD panel */ +- const struct lcd_ctrl *ctrl; /* LCD controller */ +- const struct lcd_ctrl *int_ctrl; /* internal LCD ctrl */ +- struct lcd_ctrl_extif *ext_if; /* LCD ctrl external +- interface */ +- struct device *dev; +- struct fb_var_screeninfo new_var; /* for mode changes */ +- +- struct omapfb_mem_desc mem_desc; +- struct fb_info *fb_info[OMAPFB_PLANE_NUM]; +-}; +- +-struct omapfb_platform_data { +- struct omap_lcd_config lcd; +- struct omapfb_mem_desc mem_desc; +- void *ctrl_platform_data; +-}; +- +-#ifdef CONFIG_ARCH_OMAP1 +-extern struct lcd_ctrl omap1_lcd_ctrl; +-#else +-extern struct lcd_ctrl omap2_disp_ctrl; +-#endif +- +-extern void omapfb_reserve_sdram(void); +-extern void omapfb_register_panel(struct lcd_panel *panel); +-extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); +-extern void omapfb_notify_clients(struct omapfb_device *fbdev, +- unsigned long event); +-extern int omapfb_register_client(struct omapfb_notifier_block *nb, +- omapfb_notifier_callback_t callback, +- void *callback_data); +-extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); +-extern int omapfb_update_window_async(struct fb_info *fbi, +- struct omapfb_update_window *win, +- void (*callback)(void *), +- void *callback_data); +- +-/* in arch/arm/plat-omap/fb.c */ +-extern void omapfb_set_ctrl_platform_data(void *pdata); +- +-#endif /* __KERNEL__ */ +- +-#endif /* __OMAPFB_H */ +diff --git a/drivers/video/omap/blizzard.c b/drivers/video/omap/blizzard.c +index f60a233..8121c09 100644 +--- a/drivers/video/omap/blizzard.c ++++ b/drivers/video/omap/blizzard.c +@@ -25,9 +25,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #include "dispc.h" +diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c +index c140c21..1915af5 100644 +--- a/drivers/video/omap/dispc.c ++++ b/drivers/video/omap/dispc.c +@@ -24,9 +24,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #include "dispc.h" +diff --git a/drivers/video/omap/hwa742.c b/drivers/video/omap/hwa742.c +index f24df0b..9b4c506 100644 +--- a/drivers/video/omap/hwa742.c ++++ b/drivers/video/omap/hwa742.c +@@ -25,9 +25,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #define HWA742_REV_CODE_REG 0x0 +diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c +index a22b452..1252cc3 100644 +--- a/drivers/video/omap/lcd_2430sdp.c ++++ b/drivers/video/omap/lcd_2430sdp.c +@@ -26,9 +26,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 +diff --git a/drivers/video/omap/lcd_ams_delta.c b/drivers/video/omap/lcd_ams_delta.c +index 3fd5342..4d54725 100644 +--- a/drivers/video/omap/lcd_ams_delta.c ++++ b/drivers/video/omap/lcd_ams_delta.c +@@ -24,13 +24,13 @@ + + #include + #include ++#include + + #include + #include + + #include + #include +-#include + + #define AMS_DELTA_DEFAULT_CONTRAST 112 + +diff --git a/drivers/video/omap/lcd_apollon.c b/drivers/video/omap/lcd_apollon.c +index beae5d9..e3b2224 100644 +--- a/drivers/video/omap/lcd_apollon.c ++++ b/drivers/video/omap/lcd_apollon.c +@@ -23,10 +23,10 @@ + + #include + #include ++#include + + #include + #include +-#include + + /* #define USE_35INCH_LCD 1 */ + +diff --git a/drivers/video/omap/lcd_h3.c b/drivers/video/omap/lcd_h3.c +index 2486237..f7264ea 100644 +--- a/drivers/video/omap/lcd_h3.c ++++ b/drivers/video/omap/lcd_h3.c +@@ -22,9 +22,9 @@ + #include + #include + #include ++#include + + #include +-#include + + #define MODULE_NAME "omapfb-lcd_h3" + +diff --git a/drivers/video/omap/lcd_h4.c b/drivers/video/omap/lcd_h4.c +index 6ff5643..d72df0c 100644 +--- a/drivers/video/omap/lcd_h4.c ++++ b/drivers/video/omap/lcd_h4.c +@@ -21,8 +21,7 @@ + + #include + #include +- +-#include ++#include + + static int h4_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) + { +diff --git a/drivers/video/omap/lcd_inn1510.c b/drivers/video/omap/lcd_inn1510.c +index 6953ed4..f6e05d7 100644 +--- a/drivers/video/omap/lcd_inn1510.c ++++ b/drivers/video/omap/lcd_inn1510.c +@@ -22,9 +22,9 @@ + #include + #include + #include ++#include + + #include +-#include + + static int innovator1510_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +diff --git a/drivers/video/omap/lcd_inn1610.c b/drivers/video/omap/lcd_inn1610.c +index 4c4f7ee..c599e41 100644 +--- a/drivers/video/omap/lcd_inn1610.c ++++ b/drivers/video/omap/lcd_inn1610.c +@@ -21,9 +21,9 @@ + + #include + #include ++#include + + #include +-#include + + #define MODULE_NAME "omapfb-lcd_h3" + +diff --git a/drivers/video/omap/lcd_ldp.c b/drivers/video/omap/lcd_ldp.c +index 8925230..1c25186 100644 +--- a/drivers/video/omap/lcd_ldp.c ++++ b/drivers/video/omap/lcd_ldp.c +@@ -25,10 +25,10 @@ + #include + #include + #include ++#include + + #include + #include +-#include + #include + + #define LCD_PANEL_BACKLIGHT_GPIO (15 + OMAP_MAX_GPIO_LINES) +diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c +index 1895997..4b28005 100644 +--- a/drivers/video/omap/lcd_mipid.c ++++ b/drivers/video/omap/lcd_mipid.c +@@ -22,8 +22,8 @@ + #include + #include + #include ++#include + +-#include + #include + + #include "../../cbus/tahvo.h" +diff --git a/drivers/video/omap/lcd_omap2evm.c b/drivers/video/omap/lcd_omap2evm.c +index 2fc46c2..1908a2b 100644 +--- a/drivers/video/omap/lcd_omap2evm.c ++++ b/drivers/video/omap/lcd_omap2evm.c +@@ -25,9 +25,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #define LCD_PANEL_ENABLE_GPIO 154 +diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c +index eae43e4..6be117e 100644 +--- a/drivers/video/omap/lcd_omap3beagle.c ++++ b/drivers/video/omap/lcd_omap3beagle.c +@@ -24,9 +24,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #define LCD_PANEL_ENABLE_GPIO 170 +diff --git a/drivers/video/omap/lcd_omap3evm.c b/drivers/video/omap/lcd_omap3evm.c +index 1c3d814..10ba48c 100644 +--- a/drivers/video/omap/lcd_omap3evm.c ++++ b/drivers/video/omap/lcd_omap3evm.c +@@ -24,9 +24,9 @@ + #include + #include + #include ++#include + + #include +-#include + #include + + #define LCD_PANEL_ENABLE_GPIO 153 +diff --git a/drivers/video/omap/lcd_osk.c b/drivers/video/omap/lcd_osk.c +index 379c96d..d6b193e 100644 +--- a/drivers/video/omap/lcd_osk.c ++++ b/drivers/video/omap/lcd_osk.c +@@ -22,10 +22,10 @@ + + #include + #include ++#include + + #include + #include +-#include + + static int osk_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) + { +diff --git a/drivers/video/omap/lcd_overo.c b/drivers/video/omap/lcd_overo.c +index 2bc5c92..40c2026 100644 +--- a/drivers/video/omap/lcd_overo.c ++++ b/drivers/video/omap/lcd_overo.c +@@ -22,10 +22,10 @@ + #include + #include + #include ++#include + + #include + #include +-#include + #include + + #define LCD_ENABLE 144 +diff --git a/drivers/video/omap/lcd_p2.c b/drivers/video/omap/lcd_p2.c +index dd40fd7..bc5abef 100644 +--- a/drivers/video/omap/lcd_p2.c ++++ b/drivers/video/omap/lcd_p2.c +@@ -24,10 +24,10 @@ + #include + #include + #include ++#include + + #include + #include +-#include + + /* + * File: epson-md-tft.h +diff --git a/drivers/video/omap/lcd_palmte.c b/drivers/video/omap/lcd_palmte.c +index 2183173..dcb456c 100644 +--- a/drivers/video/omap/lcd_palmte.c ++++ b/drivers/video/omap/lcd_palmte.c +@@ -22,9 +22,9 @@ + #include + #include + #include ++#include + + #include +-#include + + static int palmte_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +diff --git a/drivers/video/omap/lcd_palmtt.c b/drivers/video/omap/lcd_palmtt.c +index 57b0f6c..e8adab8 100644 +--- a/drivers/video/omap/lcd_palmtt.c ++++ b/drivers/video/omap/lcd_palmtt.c +@@ -28,9 +28,9 @@ GPIO13 - screen blanking + #include + #include + #include ++#include + + #include +-#include + + static int palmtt_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +diff --git a/drivers/video/omap/lcd_palmz71.c b/drivers/video/omap/lcd_palmz71.c +index d33d78b..d5b3f82 100644 +--- a/drivers/video/omap/lcd_palmz71.c ++++ b/drivers/video/omap/lcd_palmz71.c +@@ -23,8 +23,7 @@ + #include + #include + #include +- +-#include ++#include + + static int palmz71_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +diff --git a/drivers/video/omap/lcdc.c b/drivers/video/omap/lcdc.c +index ab39492..633e33c 100644 +--- a/drivers/video/omap/lcdc.c ++++ b/drivers/video/omap/lcdc.c +@@ -28,9 +28,9 @@ + #include + #include + #include ++#include + + #include +-#include + + #include + +diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c +index 3bb4247..c6306af 100644 +--- a/drivers/video/omap/omapfb_main.c ++++ b/drivers/video/omap/omapfb_main.c +@@ -27,9 +27,9 @@ + #include + #include + #include ++#include + + #include +-#include + + #include "lcdc.h" + #include "dispc.h" +diff --git a/drivers/video/omap/rfbi.c b/drivers/video/omap/rfbi.c +index 29fa368..118cfa9 100644 +--- a/drivers/video/omap/rfbi.c ++++ b/drivers/video/omap/rfbi.c +@@ -26,8 +26,7 @@ + #include + #include + #include +- +-#include ++#include + + #include "dispc.h" + +diff --git a/drivers/video/omap/sossi.c b/drivers/video/omap/sossi.c +index cc697cc..ff9dd71 100644 +--- a/drivers/video/omap/sossi.c ++++ b/drivers/video/omap/sossi.c +@@ -23,9 +23,9 @@ + #include + #include + #include ++#include + + #include +-#include + + #include "lcdc.h" + +diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h +new file mode 100644 +index 0000000..b226bdf +--- /dev/null ++++ b/include/linux/omapfb.h +@@ -0,0 +1,398 @@ ++/* ++ * File: arch/arm/plat-omap/include/mach/omapfb.h ++ * ++ * Framebuffer driver for TI OMAP boards ++ * ++ * Copyright (C) 2004 Nokia Corporation ++ * Author: Imre Deak ++ * ++ * 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. ++ */ ++ ++#ifndef __OMAPFB_H ++#define __OMAPFB_H ++ ++#include ++#include ++ ++/* IOCTL commands. */ ++ ++#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) ++#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) ++#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) ++#define OMAP_IO(num) _IO('O', num) ++ ++#define OMAPFB_MIRROR OMAP_IOW(31, int) ++#define OMAPFB_SYNC_GFX OMAP_IO(37) ++#define OMAPFB_VSYNC OMAP_IO(38) ++#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) ++#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) ++#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) ++#define OMAPFB_LCD_TEST OMAP_IOW(45, int) ++#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) ++#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) ++#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) ++#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) ++#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) ++#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) ++#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) ++#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) ++#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) ++ ++#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff ++#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 ++#define OMAPFB_CAPS_PANEL_MASK 0xff000000 ++ ++#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 ++#define OMAPFB_CAPS_TEARSYNC 0x00002000 ++#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 ++#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 ++#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 ++#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 ++#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 ++#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 ++#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 ++ ++/* Values from DSP must map to lower 16-bits */ ++#define OMAPFB_FORMAT_MASK 0x00ff ++#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 ++#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 ++#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 ++#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 ++#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 ++ ++#define OMAPFB_EVENT_READY 1 ++#define OMAPFB_EVENT_DISABLED 2 ++ ++#define OMAPFB_MEMTYPE_SDRAM 0 ++#define OMAPFB_MEMTYPE_SRAM 1 ++#define OMAPFB_MEMTYPE_MAX 1 ++ ++enum omapfb_color_format { ++ OMAPFB_COLOR_RGB565 = 0, ++ OMAPFB_COLOR_YUV422, ++ OMAPFB_COLOR_YUV420, ++ OMAPFB_COLOR_CLUT_8BPP, ++ OMAPFB_COLOR_CLUT_4BPP, ++ OMAPFB_COLOR_CLUT_2BPP, ++ OMAPFB_COLOR_CLUT_1BPP, ++ OMAPFB_COLOR_RGB444, ++ OMAPFB_COLOR_YUY422, ++}; ++ ++struct omapfb_update_window { ++ __u32 x, y; ++ __u32 width, height; ++ __u32 format; ++ __u32 out_x, out_y; ++ __u32 out_width, out_height; ++ __u32 reserved[8]; ++}; ++ ++struct omapfb_update_window_old { ++ __u32 x, y; ++ __u32 width, height; ++ __u32 format; ++}; ++ ++enum omapfb_plane { ++ OMAPFB_PLANE_GFX = 0, ++ OMAPFB_PLANE_VID1, ++ OMAPFB_PLANE_VID2, ++}; ++ ++enum omapfb_channel_out { ++ OMAPFB_CHANNEL_OUT_LCD = 0, ++ OMAPFB_CHANNEL_OUT_DIGIT, ++}; ++ ++struct omapfb_plane_info { ++ __u32 pos_x; ++ __u32 pos_y; ++ __u8 enabled; ++ __u8 channel_out; ++ __u8 mirror; ++ __u8 reserved1; ++ __u32 out_width; ++ __u32 out_height; ++ __u32 reserved2[12]; ++}; ++ ++struct omapfb_mem_info { ++ __u32 size; ++ __u8 type; ++ __u8 reserved[3]; ++}; ++ ++struct omapfb_caps { ++ __u32 ctrl; ++ __u32 plane_color; ++ __u32 wnd_color; ++}; ++ ++enum omapfb_color_key_type { ++ OMAPFB_COLOR_KEY_DISABLED = 0, ++ OMAPFB_COLOR_KEY_GFX_DST, ++ OMAPFB_COLOR_KEY_VID_SRC, ++}; ++ ++struct omapfb_color_key { ++ __u8 channel_out; ++ __u32 background; ++ __u32 trans_key; ++ __u8 key_type; ++}; ++ ++enum omapfb_update_mode { ++ OMAPFB_UPDATE_DISABLED = 0, ++ OMAPFB_AUTO_UPDATE, ++ OMAPFB_MANUAL_UPDATE ++}; ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#define OMAP_LCDC_INV_VSYNC 0x0001 ++#define OMAP_LCDC_INV_HSYNC 0x0002 ++#define OMAP_LCDC_INV_PIX_CLOCK 0x0004 ++#define OMAP_LCDC_INV_OUTPUT_EN 0x0008 ++#define OMAP_LCDC_HSVS_RISING_EDGE 0x0010 ++#define OMAP_LCDC_HSVS_OPPOSITE 0x0020 ++ ++#define OMAP_LCDC_SIGNAL_MASK 0x003f ++ ++#define OMAP_LCDC_PANEL_TFT 0x0100 ++ ++#define OMAPFB_PLANE_XRES_MIN 8 ++#define OMAPFB_PLANE_YRES_MIN 8 ++ ++#ifdef CONFIG_ARCH_OMAP1 ++#define OMAPFB_PLANE_NUM 1 ++#else ++#define OMAPFB_PLANE_NUM 3 ++#endif ++ ++struct omapfb_device; ++ ++struct lcd_panel { ++ const char *name; ++ int config; /* TFT/STN, signal inversion */ ++ int bpp; /* Pixel format in fb mem */ ++ int data_lines; /* Lines on LCD HW interface */ ++ ++ int x_res, y_res; ++ int pixel_clock; /* In kHz */ ++ int hsw; /* Horizontal synchronization ++ pulse width */ ++ int hfp; /* Horizontal front porch */ ++ int hbp; /* Horizontal back porch */ ++ int vsw; /* Vertical synchronization ++ pulse width */ ++ int vfp; /* Vertical front porch */ ++ int vbp; /* Vertical back porch */ ++ int acb; /* ac-bias pin frequency */ ++ int pcd; /* pixel clock divider. ++ Obsolete use pixel_clock instead */ ++ ++ int (*init) (struct lcd_panel *panel, ++ struct omapfb_device *fbdev); ++ void (*cleanup) (struct lcd_panel *panel); ++ int (*enable) (struct lcd_panel *panel); ++ void (*disable) (struct lcd_panel *panel); ++ unsigned long (*get_caps) (struct lcd_panel *panel); ++ int (*set_bklight_level)(struct lcd_panel *panel, ++ unsigned int level); ++ unsigned int (*get_bklight_level)(struct lcd_panel *panel); ++ unsigned int (*get_bklight_max) (struct lcd_panel *panel); ++ int (*run_test) (struct lcd_panel *panel, int test_num); ++}; ++ ++struct extif_timings { ++ int cs_on_time; ++ int cs_off_time; ++ int we_on_time; ++ int we_off_time; ++ int re_on_time; ++ int re_off_time; ++ int we_cycle_time; ++ int re_cycle_time; ++ int cs_pulse_width; ++ int access_time; ++ ++ int clk_div; ++ ++ u32 tim[5]; /* set by extif->convert_timings */ ++ ++ int converted; ++}; ++ ++struct lcd_ctrl_extif { ++ int (*init) (struct omapfb_device *fbdev); ++ void (*cleanup) (void); ++ void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div); ++ unsigned long (*get_max_tx_rate)(void); ++ int (*convert_timings) (struct extif_timings *timings); ++ void (*set_timings) (const struct extif_timings *timings); ++ void (*set_bits_per_cycle)(int bpc); ++ void (*write_command) (const void *buf, unsigned int len); ++ void (*read_data) (void *buf, unsigned int len); ++ void (*write_data) (const void *buf, unsigned int len); ++ void (*transfer_area) (int width, int height, ++ void (callback)(void * data), void *data); ++ int (*setup_tearsync) (unsigned pin_cnt, ++ unsigned hs_pulse_time, unsigned vs_pulse_time, ++ int hs_pol_inv, int vs_pol_inv, int div); ++ int (*enable_tearsync) (int enable, unsigned line); ++ ++ unsigned long max_transmit_size; ++}; ++ ++struct omapfb_notifier_block { ++ struct notifier_block nb; ++ void *data; ++ int plane_idx; ++}; ++ ++typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, ++ unsigned long event, ++ void *fbi); ++ ++struct omapfb_mem_region { ++ u32 paddr; ++ void __iomem *vaddr; ++ unsigned long size; ++ u8 type; /* OMAPFB_PLANE_MEM_* */ ++ unsigned alloc:1; /* allocated by the driver */ ++ unsigned map:1; /* kernel mapped by the driver */ ++}; ++ ++struct omapfb_mem_desc { ++ int region_cnt; ++ struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; ++}; ++ ++struct lcd_ctrl { ++ const char *name; ++ void *data; ++ ++ int (*init) (struct omapfb_device *fbdev, ++ int ext_mode, ++ struct omapfb_mem_desc *req_md); ++ void (*cleanup) (void); ++ void (*bind_client) (struct omapfb_notifier_block *nb); ++ void (*get_caps) (int plane, struct omapfb_caps *caps); ++ int (*set_update_mode)(enum omapfb_update_mode mode); ++ enum omapfb_update_mode (*get_update_mode)(void); ++ int (*setup_plane) (int plane, int channel_out, ++ unsigned long offset, ++ int screen_width, ++ int pos_x, int pos_y, int width, ++ int height, int color_mode); ++ int (*set_rotate) (int angle); ++ int (*setup_mem) (int plane, size_t size, ++ int mem_type, unsigned long *paddr); ++ int (*mmap) (struct fb_info *info, ++ struct vm_area_struct *vma); ++ int (*set_scale) (int plane, ++ int orig_width, int orig_height, ++ int out_width, int out_height); ++ int (*enable_plane) (int plane, int enable); ++ int (*update_window) (struct fb_info *fbi, ++ struct omapfb_update_window *win, ++ void (*callback)(void *), ++ void *callback_data); ++ void (*sync) (void); ++ void (*suspend) (void); ++ void (*resume) (void); ++ int (*run_test) (int test_num); ++ int (*setcolreg) (u_int regno, u16 red, u16 green, ++ u16 blue, u16 transp, ++ int update_hw_mem); ++ int (*set_color_key) (struct omapfb_color_key *ck); ++ int (*get_color_key) (struct omapfb_color_key *ck); ++}; ++ ++enum omapfb_state { ++ OMAPFB_DISABLED = 0, ++ OMAPFB_SUSPENDED= 99, ++ OMAPFB_ACTIVE = 100 ++}; ++ ++struct omapfb_plane_struct { ++ int idx; ++ struct omapfb_plane_info info; ++ enum omapfb_color_format color_mode; ++ struct omapfb_device *fbdev; ++}; ++ ++struct omapfb_device { ++ int state; ++ int ext_lcdc; /* Using external ++ LCD controller */ ++ struct mutex rqueue_mutex; ++ ++ int palette_size; ++ u32 pseudo_palette[17]; ++ ++ struct lcd_panel *panel; /* LCD panel */ ++ const struct lcd_ctrl *ctrl; /* LCD controller */ ++ const struct lcd_ctrl *int_ctrl; /* internal LCD ctrl */ ++ struct lcd_ctrl_extif *ext_if; /* LCD ctrl external ++ interface */ ++ struct device *dev; ++ struct fb_var_screeninfo new_var; /* for mode changes */ ++ ++ struct omapfb_mem_desc mem_desc; ++ struct fb_info *fb_info[OMAPFB_PLANE_NUM]; ++}; ++ ++struct omapfb_platform_data { ++ struct omap_lcd_config lcd; ++ struct omapfb_mem_desc mem_desc; ++ void *ctrl_platform_data; ++}; ++ ++#ifdef CONFIG_ARCH_OMAP1 ++extern struct lcd_ctrl omap1_lcd_ctrl; ++#else ++extern struct lcd_ctrl omap2_disp_ctrl; ++#endif ++ ++extern void omapfb_reserve_sdram(void); ++extern void omapfb_register_panel(struct lcd_panel *panel); ++extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); ++extern void omapfb_notify_clients(struct omapfb_device *fbdev, ++ unsigned long event); ++extern int omapfb_register_client(struct omapfb_notifier_block *nb, ++ omapfb_notifier_callback_t callback, ++ void *callback_data); ++extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); ++extern int omapfb_update_window_async(struct fb_info *fbi, ++ struct omapfb_update_window *win, ++ void (*callback)(void *), ++ void *callback_data); ++ ++/* in arch/arm/plat-omap/fb.c */ ++extern void omapfb_set_ctrl_platform_data(void *pdata); ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* __OMAPFB_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch b/recipes/linux/linux-omap-2.6.29/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch new file mode 100644 index 0000000000..c3523362c6 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch @@ -0,0 +1,14450 @@ +From 284deec412f9c6f15c971d8eaf4d0156a51a2f3b Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 10:23:42 +0300 +Subject: [PATCH] DSS2: OMAP2/3 Display Subsystem driver + +Signed-off-by: Tomi Valkeinen +--- + Documentation/arm/OMAP/DSS | 311 +++ + arch/arm/plat-omap/Makefile | 2 +- + arch/arm/plat-omap/include/mach/display.h | 520 ++++ + arch/arm/plat-omap/include/mach/vram.h | 33 + + arch/arm/plat-omap/include/mach/vrfb.h | 47 + + arch/arm/plat-omap/vram.c | 615 +++++ + arch/arm/plat-omap/vrfb.c | 159 ++ + drivers/video/Kconfig | 1 + + drivers/video/Makefile | 1 + + drivers/video/omap2/Kconfig | 3 + + drivers/video/omap2/Makefile | 4 + + drivers/video/omap2/dss/Kconfig | 89 + + drivers/video/omap2/dss/Makefile | 6 + + drivers/video/omap2/dss/core.c | 641 +++++ + drivers/video/omap2/dss/dispc.c | 2968 +++++++++++++++++++++++ + drivers/video/omap2/dss/display.c | 693 ++++++ + drivers/video/omap2/dss/dpi.c | 393 +++ + drivers/video/omap2/dss/dsi.c | 3752 +++++++++++++++++++++++++++++ + drivers/video/omap2/dss/dss.c | 345 +++ + drivers/video/omap2/dss/dss.h | 331 +++ + drivers/video/omap2/dss/manager.c | 576 +++++ + drivers/video/omap2/dss/overlay.c | 587 +++++ + drivers/video/omap2/dss/rfbi.c | 1304 ++++++++++ + drivers/video/omap2/dss/sdi.c | 245 ++ + drivers/video/omap2/dss/venc.c | 600 +++++ + 25 files changed, 14225 insertions(+), 1 deletions(-) + create mode 100644 Documentation/arm/OMAP/DSS + create mode 100644 arch/arm/plat-omap/include/mach/display.h + create mode 100644 arch/arm/plat-omap/include/mach/vram.h + create mode 100644 arch/arm/plat-omap/include/mach/vrfb.h + create mode 100644 arch/arm/plat-omap/vram.c + create mode 100644 arch/arm/plat-omap/vrfb.c + create mode 100644 drivers/video/omap2/Kconfig + create mode 100644 drivers/video/omap2/Makefile + create mode 100644 drivers/video/omap2/dss/Kconfig + create mode 100644 drivers/video/omap2/dss/Makefile + create mode 100644 drivers/video/omap2/dss/core.c + create mode 100644 drivers/video/omap2/dss/dispc.c + create mode 100644 drivers/video/omap2/dss/display.c + create mode 100644 drivers/video/omap2/dss/dpi.c + create mode 100644 drivers/video/omap2/dss/dsi.c + create mode 100644 drivers/video/omap2/dss/dss.c + create mode 100644 drivers/video/omap2/dss/dss.h + create mode 100644 drivers/video/omap2/dss/manager.c + create mode 100644 drivers/video/omap2/dss/overlay.c + create mode 100644 drivers/video/omap2/dss/rfbi.c + create mode 100644 drivers/video/omap2/dss/sdi.c + create mode 100644 drivers/video/omap2/dss/venc.c + +diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS +new file mode 100644 +index 0000000..9e902a2 +--- /dev/null ++++ b/Documentation/arm/OMAP/DSS +@@ -0,0 +1,311 @@ ++OMAP2/3 Display Subsystem ++------------------------- ++ ++This is an almost total rewrite of the OMAP FB driver in drivers/video/omap ++(let's call it DSS1). The main differences between DSS1 and DSS2 are DSI, ++TV-out and multiple display support, but there are lots of small improvements ++also. ++ ++The DSS2 driver (omapdss module) is in arch/arm/plat-omap/dss/, and the FB, ++panel and controller drivers are in drivers/video/omap2/. DSS1 and DSS2 live ++currently side by side, you can choose which one to use. ++ ++Features ++-------- ++ ++Working and tested features include: ++ ++- MIPI DPI (parallel) output ++- MIPI DSI output in command mode ++- MIPI DBI (RFBI) output ++- SDI output ++- TV output ++- All pieces can be compiled as a module or inside kernel ++- Use DISPC to update any of the outputs ++- Use CPU to update RFBI or DSI output ++- OMAP DISPC planes ++- RGB16, RGB24 packed, RGB24 unpacked ++- YUV2, UYVY ++- Scaling ++- Adjusting DSS FCK to find a good pixel clock ++- Use DSI DPLL to create DSS FCK ++ ++Tested boards include: ++- OMAP3 SDP board ++- Beagle board ++- N810 ++ ++omapdss driver ++-------------- ++ ++The DSS driver does not itself have any support for Linux framebuffer, V4L or ++such like the current ones, but it has an internal kernel API that upper level ++drivers can use. ++ ++The DSS driver models OMAP's overlays, overlay managers and displays in a ++flexible way to enable non-common multi-display configuration. In addition to ++modelling the hardware overlays, omapdss supports virtual overlays and overlay ++managers. These can be used when updating a display with CPU or system DMA. ++ ++Panel and controller drivers ++---------------------------- ++ ++The drivers implement panel or controller specific functionality and are not ++usually visible to users except through omapfb driver. They register ++themselves to the DSS driver. ++ ++omapfb driver ++------------- ++ ++The omapfb driver implements arbitrary number of standard linux framebuffers. ++These framebuffers can be routed flexibly to any overlays, thus allowing very ++dynamic display architecture. ++ ++The driver exports some omapfb specific ioctls, which are compatible with the ++ioctls in the old driver. ++ ++The rest of the non standard features are exported via sysfs. Whether the final ++implementation will use sysfs, or ioctls, is still open. ++ ++V4L2 drivers ++------------ ++ ++V4L2 is being implemented in TI. ++ ++From omapdss point of view the V4L2 drivers should be similar to framebuffer ++driver. ++ ++Architecture ++-------------------- ++ ++Some clarification what the different components do: ++ ++ - Framebuffer is a memory area inside OMAP's SRAM/SDRAM that contains the ++ pixel data for the image. Framebuffer has width and height and color ++ depth. ++ - Overlay defines where the pixels are read from and where they go on the ++ screen. The overlay may be smaller than framebuffer, thus displaying only ++ part of the framebuffer. The position of the overlay may be changed if ++ the overlay is smaller than the display. ++ - Overlay manager combines the overlays in to one image and feeds them to ++ display. ++ - Display is the actual physical display device. ++ ++A framebuffer can be connected to multiple overlays to show the same pixel data ++on all of the overlays. Note that in this case the overlay input sizes must be ++the same, but, in case of video overlays, the output size can be different. Any ++framebuffer can be connected to any overlay. ++ ++An overlay can be connected to one overlay manager. Also DISPC overlays can be ++connected only to DISPC overlay managers, and virtual overlays can be only ++connected to virtual overlays. ++ ++An overlay manager can be connected to one display. There are certain ++restrictions which kinds of displays an overlay manager can be connected: ++ ++ - DISPC TV overlay manager can be only connected to TV display. ++ - Virtual overlay managers can only be connected to DBI or DSI displays. ++ - DISPC LCD overlay manager can be connected to all displays, except TV ++ display. ++ ++Sysfs ++----- ++The sysfs interface is mainly used for testing. I don't think sysfs ++interface is the best for this in the final version, but I don't quite know ++what would be the best interfaces for these things. ++ ++The sysfs interface is divided to two parts: DSS and FB. ++ ++/sys/class/graphics/fb? directory: ++mirror 0=off, 1=on ++rotate Rotation 0-3 for 0, 90, 180, 270 degrees ++rotate_type 0 = DMA rotation, 1 = VRFB rotation ++overlays List of overlay numbers to which framebuffer pixels go ++phys_addr Physical address of the framebuffer ++virt_addr Virtual address of the framebuffer ++size Size of the framebuffer ++ ++/sys/devices/platform/omapdss/overlay? directory: ++enabled 0=off, 1=on ++input_size width,height (ie. the framebuffer size) ++manager Destination overlay manager name ++name ++output_size width,height ++position x,y ++screen_width width ++ ++/sys/devices/platform/omapdss/manager? directory: ++display Destination display ++name ++ ++/sys/devices/platform/omapdss/display? directory: ++ctrl_name Controller name ++mirror 0=off, 1=on ++update_mode 0=off, 1=auto, 2=manual ++enabled 0=off, 1=on ++name ++rotate Rotation 0-3 for 0, 90, 180, 270 degrees ++timings Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw) ++ When writing, two special timings are accepted for tv-out: ++ "pal" and "ntsc" ++panel_name ++tear_elim Tearing elimination 0=off, 1=on ++ ++There are also some debugfs files at /omapdss/ which show information ++about clocks and registers. ++ ++Examples ++-------- ++ ++The following definitions have been made for the examples below: ++ ++ovl0=/sys/devices/platform/omapdss/overlay0 ++ovl1=/sys/devices/platform/omapdss/overlay1 ++ovl2=/sys/devices/platform/omapdss/overlay2 ++ ++mgr0=/sys/devices/platform/omapdss/manager0 ++mgr1=/sys/devices/platform/omapdss/manager1 ++ ++lcd=/sys/devices/platform/omapdss/display0 ++dvi=/sys/devices/platform/omapdss/display1 ++tv=/sys/devices/platform/omapdss/display2 ++ ++fb0=/sys/class/graphics/fb0 ++fb1=/sys/class/graphics/fb1 ++fb2=/sys/class/graphics/fb2 ++ ++Default setup on OMAP3 SDP ++-------------------------- ++ ++Here's the default setup on OMAP3 SDP board. All planes go to LCD. DVI ++and TV-out are not in use. The columns from left to right are: ++framebuffers, overlays, overlay managers, displays. Framebuffers are ++handled by omapfb, and the rest by the DSS. ++ ++FB0 --- GFX -\ DVI ++FB1 --- VID1 --+- LCD ---- LCD ++FB2 --- VID2 -/ TV ----- TV ++ ++Example: Switch from LCD to DVI ++---------------------- ++ ++w=`cat $dvi/horizontal | cut -d "," -f 1` ++h=`cat $dvi/vertical | cut -d "," -f 1` ++ ++echo "0" > $lcd/enabled ++echo "" > $mgr0/display ++fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h ++# at this point you have to switch the dvi/lcd dip-switch from the omap board ++echo "dvi" > $mgr0/display ++echo "1" > $dvi/enabled ++ ++After this the configuration looks like: ++ ++FB0 --- GFX -\ -- DVI ++FB1 --- VID1 --+- LCD -/ LCD ++FB2 --- VID2 -/ TV ----- TV ++ ++Example: Clone GFX overlay to LCD and TV ++------------------------------- ++ ++w=`cat $tv/horizontal | cut -d "," -f 1` ++h=`cat $tv/vertical | cut -d "," -f 1` ++ ++echo "0" > $ovl0/enabled ++echo "0" > $ovl1/enabled ++ ++echo "" > $fb1/overlays ++echo "0,1" > $fb0/overlays ++ ++echo "$w,$h" > $ovl1/output_size ++echo "tv" > $ovl1/manager ++ ++echo "1" > $ovl0/enabled ++echo "1" > $ovl1/enabled ++ ++echo "1" > $tv/enabled ++ ++After this the configuration looks like (only relevant parts shown): ++ ++FB0 +-- GFX ---- LCD ---- LCD ++ \- VID1 ---- TV ---- TV ++ ++Misc notes ++---------- ++ ++OMAP FB allocates the framebuffer memory using the OMAP VRAM allocator. ++ ++Using DSI DPLL to generate pixel clock it is possible produce the pixel clock ++of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI. ++ ++Rotation and mirroring currently only supports RGB565 and RGB8888 modes. VRFB ++does not support mirroring. ++ ++VRFB rotation requires much more memory than non-rotated framebuffer, so you ++probably need to increase your vram setting before using VRFB rotation. Also, ++many applications may not work with VRFB if they do not pay attention to all ++framebuffer parameters. ++ ++Kernel boot arguments ++--------------------- ++ ++vram= ++ - Amount of total VRAM to preallocate. For example, "10M". omapfb ++ allocates memory for framebuffers from VRAM. ++ ++omapfb.mode=:[,...] ++ - Default video mode for specified displays. For example, ++ "dvi:800x400MR-24@60". See drivers/video/modedb.c. ++ There are also two special modes: "pal" and "ntsc" that ++ can be used to tv out. ++ ++omapfb.vram=:[@][,...] ++ - VRAM allocated for a framebuffer. Normally omapfb allocates vram ++ depending on the display size. With this you can manually allocate ++ more or define the physical address of each framebuffer. For example, ++ "1:4M" to allocate 4M for fb1. ++ ++omapfb.debug= ++ - Enable debug printing. You have to have OMAPFB debug support enabled ++ in kernel config. ++ ++omapfb.test= ++ - Draw test pattern to framebuffer whenever framebuffer settings change. ++ You need to have OMAPFB debug support enabled in kernel config. ++ ++omapfb.vrfb= ++ - Use VRFB rotation for all framebuffers. ++ ++omapfb.rotate= ++ - Default rotation applied to all framebuffers. ++ 0 - 0 degree rotation ++ 1 - 90 degree rotation ++ 2 - 180 degree rotation ++ 3 - 270 degree rotation ++ ++omapfb.mirror= ++ - Default mirror for all framebuffers. Only works with DMA rotation. ++ ++omapdss.def_disp= ++ - Name of default display, to which all overlays will be connected. ++ Common examples are "lcd" or "tv". ++ ++omapdss.debug= ++ - Enable debug printing. You have to have DSS debug support enabled in ++ kernel config. ++ ++TODO ++---- ++ ++DSS locking ++ ++Error checking ++- Lots of checks are missing or implemented just as BUG() ++ ++System DMA update for DSI ++- Can be used for RGB16 and RGB24P modes. Probably not for RGB24U (how ++ to skip the empty byte?) ++ ++OMAP1 support ++- Not sure if needed ++ +diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile +index 3ebc09e..e6146b2 100644 +--- a/arch/arm/plat-omap/Makefile ++++ b/arch/arm/plat-omap/Makefile +@@ -4,7 +4,7 @@ + + # Common support + obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \ +- usb.o fb.o io.o ++ usb.o fb.o vram.o vrfb.o io.o + obj-m := + obj-n := + obj- := +diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h +new file mode 100644 +index 0000000..6288353 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/display.h +@@ -0,0 +1,520 @@ ++/* ++ * linux/include/asm-arm/arch-omap/display.h ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#ifndef __ASM_ARCH_OMAP_DISPLAY_H ++#define __ASM_ARCH_OMAP_DISPLAY_H ++ ++#include ++#include ++#include ++ ++#define DISPC_IRQ_FRAMEDONE (1 << 0) ++#define DISPC_IRQ_VSYNC (1 << 1) ++#define DISPC_IRQ_EVSYNC_EVEN (1 << 2) ++#define DISPC_IRQ_EVSYNC_ODD (1 << 3) ++#define DISPC_IRQ_ACBIAS_COUNT_STAT (1 << 4) ++#define DISPC_IRQ_PROG_LINE_NUM (1 << 5) ++#define DISPC_IRQ_GFX_FIFO_UNDERFLOW (1 << 6) ++#define DISPC_IRQ_GFX_END_WIN (1 << 7) ++#define DISPC_IRQ_PAL_GAMMA_MASK (1 << 8) ++#define DISPC_IRQ_OCP_ERR (1 << 9) ++#define DISPC_IRQ_VID1_FIFO_UNDERFLOW (1 << 10) ++#define DISPC_IRQ_VID1_END_WIN (1 << 11) ++#define DISPC_IRQ_VID2_FIFO_UNDERFLOW (1 << 12) ++#define DISPC_IRQ_VID2_END_WIN (1 << 13) ++#define DISPC_IRQ_SYNC_LOST (1 << 14) ++#define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15) ++#define DISPC_IRQ_WAKEUP (1 << 16) ++ ++enum omap_display_type { ++ OMAP_DISPLAY_TYPE_NONE = 0, ++ OMAP_DISPLAY_TYPE_DPI = 1 << 0, ++ OMAP_DISPLAY_TYPE_DBI = 1 << 1, ++ OMAP_DISPLAY_TYPE_SDI = 1 << 2, ++ OMAP_DISPLAY_TYPE_DSI = 1 << 3, ++ OMAP_DISPLAY_TYPE_VENC = 1 << 4, ++}; ++ ++enum omap_plane { ++ OMAP_DSS_GFX = 0, ++ OMAP_DSS_VIDEO1 = 1, ++ OMAP_DSS_VIDEO2 = 2 ++}; ++ ++enum omap_channel { ++ OMAP_DSS_CHANNEL_LCD = 0, ++ OMAP_DSS_CHANNEL_DIGIT = 1, ++}; ++ ++enum omap_color_mode { ++ OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */ ++ OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */ ++ OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */ ++ OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */ ++ OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */ ++ OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */ ++ OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */ ++ OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */ ++ OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */ ++ OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */ ++ OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */ ++ OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ ++ OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ ++ OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ ++ ++ OMAP_DSS_COLOR_GFX_OMAP3 = ++ OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | ++ OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | ++ OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | ++ OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | ++ OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | ++ OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, ++ ++ OMAP_DSS_COLOR_VID_OMAP3 = ++ OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | ++ OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | ++ OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | ++ OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 | ++ OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY, ++}; ++ ++enum omap_lcd_display_type { ++ OMAP_DSS_LCD_DISPLAY_STN, ++ OMAP_DSS_LCD_DISPLAY_TFT, ++}; ++ ++enum omap_dss_load_mode { ++ OMAP_DSS_LOAD_CLUT_AND_FRAME = 0, ++ OMAP_DSS_LOAD_CLUT_ONLY = 1, ++ OMAP_DSS_LOAD_FRAME_ONLY = 2, ++ OMAP_DSS_LOAD_CLUT_ONCE_FRAME = 3, ++}; ++ ++enum omap_dss_color_key_type { ++ OMAP_DSS_COLOR_KEY_GFX_DST = 0, ++ OMAP_DSS_COLOR_KEY_VID_SRC = 1, ++}; ++ ++enum omap_rfbi_te_mode { ++ OMAP_DSS_RFBI_TE_MODE_1 = 1, ++ OMAP_DSS_RFBI_TE_MODE_2 = 2, ++}; ++ ++enum omap_panel_config { ++ OMAP_DSS_LCD_IVS = 1<<0, ++ OMAP_DSS_LCD_IHS = 1<<1, ++ OMAP_DSS_LCD_IPC = 1<<2, ++ OMAP_DSS_LCD_IEO = 1<<3, ++ OMAP_DSS_LCD_RF = 1<<4, ++ OMAP_DSS_LCD_ONOFF = 1<<5, ++ ++ OMAP_DSS_LCD_TFT = 1<<20, ++}; ++ ++enum omap_dss_venc_type { ++ OMAP_DSS_VENC_TYPE_COMPOSITE, ++ OMAP_DSS_VENC_TYPE_SVIDEO, ++}; ++ ++struct omap_display; ++struct omap_panel; ++struct omap_ctrl; ++ ++/* RFBI */ ++ ++struct rfbi_timings { ++ int cs_on_time; ++ int cs_off_time; ++ int we_on_time; ++ int we_off_time; ++ int re_on_time; ++ int re_off_time; ++ int we_cycle_time; ++ int re_cycle_time; ++ int cs_pulse_width; ++ int access_time; ++ ++ int clk_div; ++ ++ u32 tim[5]; /* set by rfbi_convert_timings() */ ++ ++ int converted; ++}; ++ ++void omap_rfbi_write_command(const void *buf, u32 len); ++void omap_rfbi_read_data(void *buf, u32 len); ++void omap_rfbi_write_data(const void *buf, u32 len); ++void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, ++ u16 x, u16 y, ++ u16 w, u16 h); ++int omap_rfbi_enable_te(bool enable, unsigned line); ++int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, ++ unsigned hs_pulse_time, unsigned vs_pulse_time, ++ int hs_pol_inv, int vs_pol_inv, int extif_div); ++ ++/* DSI */ ++int dsi_vc_dcs_write(int channel, u8 *data, int len); ++int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len); ++int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen); ++int dsi_vc_set_max_rx_packet_size(int channel, u16 len); ++int dsi_vc_send_null(int channel); ++ ++/* Board specific data */ ++struct omap_dss_display_config { ++ enum omap_display_type type; ++ ++ union { ++ struct { ++ u8 data_lines; ++ } dpi; ++ ++ struct { ++ u8 channel; ++ u8 data_lines; ++ } rfbi; ++ ++ struct { ++ u8 datapairs; ++ } sdi; ++ ++ struct { ++ u8 clk_lane; ++ u8 clk_pol; ++ u8 data1_lane; ++ u8 data1_pol; ++ u8 data2_lane; ++ u8 data2_pol; ++ unsigned long ddr_clk_hz; ++ } dsi; ++ ++ struct { ++ enum omap_dss_venc_type type; ++ } venc; ++ } u; ++ ++ int panel_reset_gpio; ++ int ctrl_reset_gpio; ++ ++ const char *name; /* for debug */ ++ const char *ctrl_name; ++ const char *panel_name; ++ ++ void *panel_data; ++ void *ctrl_data; ++ ++ /* platform specific enable/disable */ ++ int (*panel_enable)(struct omap_display *display); ++ void (*panel_disable)(struct omap_display *display); ++ int (*ctrl_enable)(struct omap_display *display); ++ void (*ctrl_disable)(struct omap_display *display); ++ int (*set_backlight)(struct omap_display *display, ++ int level); ++}; ++ ++struct device; ++ ++/* Board specific data */ ++struct omap_dss_board_info { ++ unsigned (*get_last_off_on_transaction_id)(struct device *dev); ++ int (*dsi_power_up)(void); ++ void (*dsi_power_down)(void); ++ int num_displays; ++ struct omap_dss_display_config *displays[]; ++}; ++ ++struct omap_ctrl { ++ struct module *owner; ++ ++ const char *name; ++ ++ int (*init)(struct omap_display *display); ++ void (*cleanup)(struct omap_display *display); ++ int (*enable)(struct omap_display *display); ++ void (*disable)(struct omap_display *display); ++ int (*suspend)(struct omap_display *display); ++ int (*resume)(struct omap_display *display); ++ void (*setup_update)(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h); ++ ++ int (*enable_te)(struct omap_display *display, bool enable); ++ ++ u8 (*get_rotate)(struct omap_display *display); ++ int (*set_rotate)(struct omap_display *display, u8 rotate); ++ ++ bool (*get_mirror)(struct omap_display *display); ++ int (*set_mirror)(struct omap_display *display, bool enable); ++ ++ int (*run_test)(struct omap_display *display, int test); ++ int (*memory_read)(struct omap_display *display, ++ void *buf, size_t size, ++ u16 x, u16 y, u16 w, u16 h); ++ ++ u8 pixel_size; ++ ++ struct rfbi_timings timings; ++ ++ void *priv; ++}; ++ ++struct omap_video_timings { ++ /* Unit: pixels */ ++ u16 x_res; ++ /* Unit: pixels */ ++ u16 y_res; ++ /* Unit: KHz */ ++ u32 pixel_clock; ++ /* Unit: pixel clocks */ ++ u16 hsw; /* Horizontal synchronization pulse width */ ++ /* Unit: pixel clocks */ ++ u16 hfp; /* Horizontal front porch */ ++ /* Unit: pixel clocks */ ++ u16 hbp; /* Horizontal back porch */ ++ /* Unit: line clocks */ ++ u16 vsw; /* Vertical synchronization pulse width */ ++ /* Unit: line clocks */ ++ u16 vfp; /* Vertical front porch */ ++ /* Unit: line clocks */ ++ u16 vbp; /* Vertical back porch */ ++ ++}; ++ ++#ifdef CONFIG_OMAP2_DSS_VENC ++/* Hardcoded timings for tv modes. Venc only uses these to ++ * identify the mode, and does not actually use the configs ++ * itself. However, the configs should be something that ++ * a normal monitor can also show */ ++const extern struct omap_video_timings omap_dss_pal_timings; ++const extern struct omap_video_timings omap_dss_ntsc_timings; ++#endif ++ ++struct omap_panel { ++ struct module *owner; ++ ++ const char *name; ++ ++ int (*init)(struct omap_display *display); ++ void (*cleanup)(struct omap_display *display); ++ int (*remove)(struct omap_display *display); ++ int (*enable)(struct omap_display *display); ++ void (*disable)(struct omap_display *display); ++ int (*suspend)(struct omap_display *display); ++ int (*resume)(struct omap_display *display); ++ int (*run_test)(struct omap_display *display, int test); ++ ++ struct omap_video_timings timings; ++ ++ int acbi; /* ac-bias pin transitions per interrupt */ ++ /* Unit: line clocks */ ++ int acb; /* ac-bias pin frequency */ ++ ++ enum omap_panel_config config; ++ ++ u8 recommended_bpp; ++ ++ void *priv; ++}; ++ ++/* XXX perhaps this should be removed */ ++enum omap_dss_overlay_managers { ++ OMAP_DSS_OVL_MGR_LCD, ++ OMAP_DSS_OVL_MGR_TV, ++}; ++ ++struct omap_overlay_manager; ++ ++struct omap_overlay_info { ++ bool enabled; ++ ++ u32 paddr; ++ void __iomem *vaddr; ++ u16 screen_width; ++ u16 width; ++ u16 height; ++ enum omap_color_mode color_mode; ++ u8 rotation; ++ bool mirror; ++ ++ u16 pos_x; ++ u16 pos_y; ++ u16 out_width; /* if 0, out_width == width */ ++ u16 out_height; /* if 0, out_height == height */ ++}; ++ ++enum omap_overlay_caps { ++ OMAP_DSS_OVL_CAP_SCALE = 1 << 0, ++ OMAP_DSS_OVL_CAP_DISPC = 1 << 1, ++}; ++ ++struct omap_overlay { ++ struct kobject kobj; ++ struct list_head list; ++ ++ const char *name; ++ int id; ++ struct omap_overlay_manager *manager; ++ enum omap_color_mode supported_modes; ++ struct omap_overlay_info info; ++ enum omap_overlay_caps caps; ++ ++ int (*set_manager)(struct omap_overlay *ovl, ++ struct omap_overlay_manager *mgr); ++ int (*unset_manager)(struct omap_overlay *ovl); ++ ++ int (*set_overlay_info)(struct omap_overlay *ovl, ++ struct omap_overlay_info *info); ++ void (*get_overlay_info)(struct omap_overlay *ovl, ++ struct omap_overlay_info *info); ++}; ++ ++enum omap_overlay_manager_caps { ++ OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0, ++}; ++ ++struct omap_overlay_manager { ++ struct kobject kobj; ++ struct list_head list; ++ ++ const char *name; ++ int id; ++ enum omap_overlay_manager_caps caps; ++ struct omap_display *display; ++ int num_overlays; ++ struct omap_overlay **overlays; ++ enum omap_display_type supported_displays; ++ ++ int (*set_display)(struct omap_overlay_manager *mgr, ++ struct omap_display *display); ++ int (*unset_display)(struct omap_overlay_manager *mgr); ++ ++ int (*apply)(struct omap_overlay_manager *mgr); ++ ++ void (*set_default_color)(struct omap_overlay_manager *mgr, u32 color); ++ void (*set_trans_key)(struct omap_overlay_manager *mgr, ++ enum omap_dss_color_key_type type, ++ u32 trans_key); ++ void (*enable_trans_key)(struct omap_overlay_manager *mgr, ++ bool enable); ++}; ++ ++enum omap_display_caps { ++ OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0, ++}; ++ ++enum omap_dss_update_mode { ++ OMAP_DSS_UPDATE_DISABLED = 0, ++ OMAP_DSS_UPDATE_AUTO, ++ OMAP_DSS_UPDATE_MANUAL, ++}; ++ ++enum omap_dss_display_state { ++ OMAP_DSS_DISPLAY_DISABLED = 0, ++ OMAP_DSS_DISPLAY_ACTIVE, ++ OMAP_DSS_DISPLAY_SUSPENDED, ++}; ++ ++struct omap_display { ++ struct kobject kobj; ++ struct list_head list; ++ ++ /*atomic_t ref_count;*/ ++ int ref_count; ++ /* helper variable for driver suspend/resume */ ++ int activate_after_resume; ++ ++ enum omap_display_type type; ++ const char *name; ++ ++ enum omap_display_caps caps; ++ ++ struct omap_overlay_manager *manager; ++ ++ enum omap_dss_display_state state; ++ ++ struct omap_dss_display_config hw_config; /* board specific data */ ++ struct omap_ctrl *ctrl; /* static common data */ ++ struct omap_panel *panel; /* static common data */ ++ ++ int (*enable)(struct omap_display *display); ++ void (*disable)(struct omap_display *display); ++ ++ int (*suspend)(struct omap_display *display); ++ int (*resume)(struct omap_display *display); ++ ++ void (*get_resolution)(struct omap_display *display, ++ u16 *xres, u16 *yres); ++ int (*get_recommended_bpp)(struct omap_display *display); ++ ++ int (*check_timings)(struct omap_display *display, ++ struct omap_video_timings *timings); ++ void (*set_timings)(struct omap_display *display, ++ struct omap_video_timings *timings); ++ void (*get_timings)(struct omap_display *display, ++ struct omap_video_timings *timings); ++ int (*update)(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h); ++ int (*sync)(struct omap_display *display); ++ int (*wait_vsync)(struct omap_display *display); ++ ++ int (*set_update_mode)(struct omap_display *display, ++ enum omap_dss_update_mode); ++ enum omap_dss_update_mode (*get_update_mode) ++ (struct omap_display *display); ++ ++ int (*enable_te)(struct omap_display *display, bool enable); ++ int (*get_te)(struct omap_display *display); ++ ++ u8 (*get_rotate)(struct omap_display *display); ++ int (*set_rotate)(struct omap_display *display, u8 rotate); ++ ++ bool (*get_mirror)(struct omap_display *display); ++ int (*set_mirror)(struct omap_display *display, bool enable); ++ ++ int (*run_test)(struct omap_display *display, int test); ++ int (*memory_read)(struct omap_display *display, ++ void *buf, size_t size, ++ u16 x, u16 y, u16 w, u16 h); ++ ++ void (*configure_overlay)(struct omap_overlay *overlay); ++}; ++ ++int omap_dss_get_num_displays(void); ++struct omap_display *omap_dss_get_display(int no); ++void omap_dss_put_display(struct omap_display *display); ++ ++void omap_dss_register_ctrl(struct omap_ctrl *ctrl); ++void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl); ++ ++void omap_dss_register_panel(struct omap_panel *panel); ++void omap_dss_unregister_panel(struct omap_panel *panel); ++ ++int omap_dss_get_num_overlay_managers(void); ++struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); ++ ++int omap_dss_get_num_overlays(void); ++struct omap_overlay *omap_dss_get_overlay(int num); ++ ++typedef void (*omap_dispc_isr_t) (void *arg, u32 mask); ++int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); ++int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); ++ ++int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout); ++int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, ++ unsigned long timeout); ++ ++#endif +diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h +new file mode 100644 +index 0000000..f176562 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/vram.h +@@ -0,0 +1,33 @@ ++/* ++ * File: arch/arm/plat-omap/include/mach/vram.h ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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. ++ */ ++ ++#ifndef __OMAPVRAM_H ++#define __OMAPVRAM_H ++ ++#include ++ ++extern int omap_vram_free(unsigned long paddr, size_t size); ++extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr); ++extern int omap_vram_reserve(unsigned long paddr, size_t size); ++extern void omap2_set_sdram_vram(u32 size, u32 start); ++extern void omap2_set_sram_vram(u32 size, u32 start); ++ ++#endif +diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h +new file mode 100644 +index 0000000..2047862 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/vrfb.h +@@ -0,0 +1,47 @@ ++/* ++ * File: arch/arm/plat-omap/include/mach/vrfb.h ++ * ++ * VRFB ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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. ++ */ ++ ++#ifndef __VRFB_H ++#define __VRFB_H ++ ++#define OMAP_VRFB_LINE_LEN 2048 ++ ++struct vrfb ++{ ++ u8 context; ++ void __iomem *vaddr[4]; ++ unsigned long paddr[4]; ++ u16 xoffset; ++ u16 yoffset; ++ u8 bytespp; ++}; ++ ++extern int omap_vrfb_request_ctx(struct vrfb *vrfb); ++extern void omap_vrfb_release_ctx(struct vrfb *vrfb); ++extern void omap_vrfb_adjust_size(u16 *width, u16 *height, ++ u8 bytespp); ++extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, ++ u16 width, u16 height, ++ u8 bytespp); ++ ++#endif /* __VRFB_H */ +diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c +new file mode 100644 +index 0000000..f24a110 +--- /dev/null ++++ b/arch/arm/plat-omap/vram.c +@@ -0,0 +1,615 @@ ++/* ++ * linux/arch/arm/plat-omap/vram.c ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++/*#define DEBUG*/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#ifdef DEBUG ++#define DBG(format, ...) printk(KERN_DEBUG "VRAM: " format, ## __VA_ARGS__) ++#else ++#define DBG(format, ...) ++#endif ++ ++#define OMAP2_SRAM_START 0x40200000 ++/* Maximum size, in reality this is smaller if SRAM is partially locked. */ ++#define OMAP2_SRAM_SIZE 0xa0000 /* 640k */ ++ ++#define REG_MAP_SIZE(_page_cnt) \ ++ ((_page_cnt + (sizeof(unsigned long) * 8) - 1) / 8) ++#define REG_MAP_PTR(_rg, _page_nr) \ ++ (((_rg)->map) + (_page_nr) / (sizeof(unsigned long) * 8)) ++#define REG_MAP_MASK(_page_nr) \ ++ (1 << ((_page_nr) & (sizeof(unsigned long) * 8 - 1))) ++ ++#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) ++ ++/* postponed regions are used to temporarily store region information at boot ++ * time when we cannot yet allocate the region list */ ++#define MAX_POSTPONED_REGIONS 10 ++ ++static int postponed_cnt __initdata; ++static struct { ++ unsigned long paddr; ++ size_t size; ++} postponed_regions[MAX_POSTPONED_REGIONS] __initdata; ++ ++struct vram_alloc { ++ struct list_head list; ++ unsigned long paddr; ++ unsigned pages; ++}; ++ ++struct vram_region { ++ struct list_head list; ++ struct list_head alloc_list; ++ unsigned long paddr; ++ unsigned pages; ++}; ++ ++static DEFINE_MUTEX(region_mutex); ++static LIST_HEAD(region_list); ++ ++static inline int region_mem_type(unsigned long paddr) ++{ ++ if (paddr >= OMAP2_SRAM_START && ++ paddr < OMAP2_SRAM_START + OMAP2_SRAM_SIZE) ++ return OMAPFB_MEMTYPE_SRAM; ++ else ++ return OMAPFB_MEMTYPE_SDRAM; ++} ++ ++static struct vram_region *omap_vram_create_region(unsigned long paddr, ++ unsigned pages) ++{ ++ struct vram_region *rm; ++ ++ rm = kzalloc(sizeof(*rm), GFP_KERNEL); ++ ++ if (rm) { ++ INIT_LIST_HEAD(&rm->alloc_list); ++ rm->paddr = paddr; ++ rm->pages = pages; ++ } ++ ++ return rm; ++} ++ ++#if 0 ++static void omap_vram_free_region(struct vram_region *vr) ++{ ++ list_del(&vr->list); ++ kfree(vr); ++} ++#endif ++ ++static struct vram_alloc *omap_vram_create_allocation(struct vram_region *vr, ++ unsigned long paddr, unsigned pages) ++{ ++ struct vram_alloc *va; ++ struct vram_alloc *new; ++ ++ new = kzalloc(sizeof(*va), GFP_KERNEL); ++ ++ if (!new) ++ return NULL; ++ ++ new->paddr = paddr; ++ new->pages = pages; ++ ++ list_for_each_entry(va, &vr->alloc_list, list) { ++ if (va->paddr > new->paddr) ++ break; ++ } ++ ++ list_add_tail(&new->list, &va->list); ++ ++ return new; ++} ++ ++static void omap_vram_free_allocation(struct vram_alloc *va) ++{ ++ list_del(&va->list); ++ kfree(va); ++} ++ ++static __init int omap_vram_add_region_postponed(unsigned long paddr, ++ size_t size) ++{ ++ if (postponed_cnt == MAX_POSTPONED_REGIONS) ++ return -ENOMEM; ++ ++ postponed_regions[postponed_cnt].paddr = paddr; ++ postponed_regions[postponed_cnt].size = size; ++ ++ ++postponed_cnt; ++ ++ return 0; ++} ++ ++/* add/remove_region can be exported if there's need to add/remove regions ++ * runtime */ ++static int omap_vram_add_region(unsigned long paddr, size_t size) ++{ ++ struct vram_region *rm; ++ unsigned pages; ++ ++ DBG("adding region paddr %08lx size %d\n", ++ paddr, size); ++ ++ size &= PAGE_MASK; ++ pages = size >> PAGE_SHIFT; ++ ++ rm = omap_vram_create_region(paddr, pages); ++ if (rm == NULL) ++ return -ENOMEM; ++ ++ list_add(&rm->list, ®ion_list); ++ ++ return 0; ++} ++ ++int omap_vram_free(unsigned long paddr, size_t size) ++{ ++ struct vram_region *rm; ++ struct vram_alloc *alloc; ++ unsigned start, end; ++ ++ DBG("free mem paddr %08lx size %d\n", paddr, size); ++ ++ size = PAGE_ALIGN(size); ++ ++ mutex_lock(®ion_mutex); ++ ++ list_for_each_entry(rm, ®ion_list, list) { ++ list_for_each_entry(alloc, &rm->alloc_list, list) { ++ start = alloc->paddr; ++ end = alloc->paddr + (alloc->pages >> PAGE_SHIFT); ++ ++ if (start >= paddr && end < paddr + size) ++ goto found; ++ } ++ } ++ ++ mutex_unlock(®ion_mutex); ++ return -EINVAL; ++ ++found: ++ omap_vram_free_allocation(alloc); ++ ++ mutex_unlock(®ion_mutex); ++ return 0; ++} ++EXPORT_SYMBOL(omap_vram_free); ++ ++static int _omap_vram_reserve(unsigned long paddr, unsigned pages) ++{ ++ struct vram_region *rm; ++ struct vram_alloc *alloc; ++ size_t size; ++ ++ size = pages << PAGE_SHIFT; ++ ++ list_for_each_entry(rm, ®ion_list, list) { ++ unsigned long start, end; ++ ++ DBG("checking region %lx %d\n", rm->paddr, rm->pages); ++ ++ if (region_mem_type(rm->paddr) != region_mem_type(paddr)) ++ continue; ++ ++ start = rm->paddr; ++ end = start + (rm->pages << PAGE_SHIFT) - 1; ++ if (start > paddr || end < paddr + size - 1) ++ continue; ++ ++ DBG("block ok, checking allocs\n"); ++ ++ list_for_each_entry(alloc, &rm->alloc_list, list) { ++ end = alloc->paddr - 1; ++ ++ if (start <= paddr && end >= paddr + size - 1) ++ goto found; ++ ++ start = alloc->paddr + (alloc->pages << PAGE_SHIFT); ++ } ++ ++ end = rm->paddr + (rm->pages << PAGE_SHIFT) - 1; ++ ++ if (!(start <= paddr && end >= paddr + size - 1)) ++ continue; ++found: ++ DBG("FOUND area start %lx, end %lx\n", start, end); ++ ++ if (omap_vram_create_allocation(rm, paddr, pages) == NULL) ++ return -ENOMEM; ++ ++ return 0; ++ } ++ ++ return -ENOMEM; ++} ++ ++int omap_vram_reserve(unsigned long paddr, size_t size) ++{ ++ unsigned pages; ++ int r; ++ ++ DBG("reserve mem paddr %08lx size %d\n", paddr, size); ++ ++ size = PAGE_ALIGN(size); ++ pages = size >> PAGE_SHIFT; ++ ++ mutex_lock(®ion_mutex); ++ ++ r = _omap_vram_reserve(paddr, pages); ++ ++ mutex_unlock(®ion_mutex); ++ ++ return r; ++} ++EXPORT_SYMBOL(omap_vram_reserve); ++ ++static int _omap_vram_alloc(int mtype, unsigned pages, unsigned long *paddr) ++{ ++ struct vram_region *rm; ++ struct vram_alloc *alloc; ++ ++ list_for_each_entry(rm, ®ion_list, list) { ++ unsigned long start, end; ++ ++ DBG("checking region %lx %d\n", rm->paddr, rm->pages); ++ ++ if (region_mem_type(rm->paddr) != mtype) ++ continue; ++ ++ start = rm->paddr; ++ ++ list_for_each_entry(alloc, &rm->alloc_list, list) { ++ end = alloc->paddr; ++ ++ if (end - start >= pages << PAGE_SHIFT) ++ goto found; ++ ++ start = alloc->paddr + (alloc->pages << PAGE_SHIFT); ++ } ++ ++ end = rm->paddr + (rm->pages << PAGE_SHIFT); ++found: ++ if (end - start < pages << PAGE_SHIFT) ++ continue; ++ ++ DBG("FOUND %lx, end %lx\n", start, end); ++ ++ alloc = omap_vram_create_allocation(rm, start, pages); ++ if (alloc == NULL) ++ return -ENOMEM; ++ ++ *paddr = start; ++ ++ return 0; ++ } ++ ++ return -ENOMEM; ++} ++ ++int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr) ++{ ++ unsigned pages; ++ int r; ++ ++ BUG_ON(mtype > OMAPFB_MEMTYPE_MAX || !size); ++ ++ DBG("alloc mem type %d size %d\n", mtype, size); ++ ++ size = PAGE_ALIGN(size); ++ pages = size >> PAGE_SHIFT; ++ ++ mutex_lock(®ion_mutex); ++ ++ r = _omap_vram_alloc(mtype, pages, paddr); ++ ++ mutex_unlock(®ion_mutex); ++ ++ return r; ++} ++EXPORT_SYMBOL(omap_vram_alloc); ++ ++#ifdef CONFIG_PROC_FS ++static void *r_next(struct seq_file *m, void *v, loff_t *pos) ++{ ++ struct list_head *l = v; ++ ++ (*pos)++; ++ ++ if (list_is_last(l, ®ion_list)) ++ return NULL; ++ ++ return l->next; ++} ++ ++static void *r_start(struct seq_file *m, loff_t *pos) ++{ ++ loff_t p = *pos; ++ struct list_head *l = ®ion_list; ++ ++ mutex_lock(®ion_mutex); ++ ++ do { ++ l = l->next; ++ if (l == ®ion_list) ++ return NULL; ++ } while (p--); ++ ++ return l; ++} ++ ++static void r_stop(struct seq_file *m, void *v) ++{ ++ mutex_unlock(®ion_mutex); ++} ++ ++static int r_show(struct seq_file *m, void *v) ++{ ++ struct vram_region *vr; ++ struct vram_alloc *va; ++ unsigned size; ++ ++ vr = list_entry(v, struct vram_region, list); ++ ++ size = vr->pages << PAGE_SHIFT; ++ ++ seq_printf(m, "%08lx-%08lx (%d bytes)\n", ++ vr->paddr, vr->paddr + size - 1, ++ size); ++ ++ list_for_each_entry(va, &vr->alloc_list, list) { ++ size = va->pages << PAGE_SHIFT; ++ seq_printf(m, " %08lx-%08lx (%d bytes)\n", ++ va->paddr, va->paddr + size - 1, ++ size); ++ } ++ ++ ++ ++ return 0; ++} ++ ++static const struct seq_operations resource_op = { ++ .start = r_start, ++ .next = r_next, ++ .stop = r_stop, ++ .show = r_show, ++}; ++ ++static int vram_open(struct inode *inode, struct file *file) ++{ ++ return seq_open(file, &resource_op); ++} ++ ++static const struct file_operations proc_vram_operations = { ++ .open = vram_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = seq_release, ++}; ++ ++static int __init omap_vram_create_proc(void) ++{ ++ proc_create("omap-vram", 0, NULL, &proc_vram_operations); ++ ++ return 0; ++} ++#endif ++ ++static __init int omap_vram_init(void) ++{ ++ int i, r; ++ ++ for (i = 0; i < postponed_cnt; i++) ++ omap_vram_add_region(postponed_regions[i].paddr, ++ postponed_regions[i].size); ++ ++#ifdef CONFIG_PROC_FS ++ r = omap_vram_create_proc(); ++ if (r) ++ return -ENOMEM; ++#endif ++ ++ return 0; ++} ++ ++arch_initcall(omap_vram_init); ++ ++/* boottime vram alloc stuff */ ++ ++/* set from board file */ ++static u32 omapfb_sram_vram_start __initdata; ++static u32 omapfb_sram_vram_size __initdata; ++ ++/* set from board file */ ++static u32 omapfb_sdram_vram_start __initdata; ++static u32 omapfb_sdram_vram_size __initdata; ++ ++/* set from kernel cmdline */ ++static u32 omapfb_def_sdram_vram_size __initdata; ++static u32 omapfb_def_sdram_vram_start __initdata; ++ ++static void __init omapfb_early_vram(char **p) ++{ ++ omapfb_def_sdram_vram_size = memparse(*p, p); ++ if (**p == ',') ++ omapfb_def_sdram_vram_start = simple_strtoul((*p) + 1, p, 16); ++ ++ printk("omapfb_early_vram, %d, 0x%x\n", ++ omapfb_def_sdram_vram_size, ++ omapfb_def_sdram_vram_start); ++} ++__early_param("vram=", omapfb_early_vram); ++ ++/* ++ * Called from map_io. We need to call to this early enough so that we ++ * can reserve the fixed SDRAM regions before VM could get hold of them. ++ */ ++void __init omapfb_reserve_sdram(void) ++{ ++ struct bootmem_data *bdata; ++ unsigned long sdram_start, sdram_size; ++ u32 paddr; ++ u32 size = 0; ++ ++ /* cmdline arg overrides the board file definition */ ++ if (omapfb_def_sdram_vram_size) { ++ size = omapfb_def_sdram_vram_size; ++ paddr = omapfb_def_sdram_vram_start; ++ } ++ ++ if (!size) { ++ size = omapfb_sdram_vram_size; ++ paddr = omapfb_sdram_vram_start; ++ } ++ ++#ifdef CONFIG_OMAP2_DSS_VRAM_SIZE ++ if (!size) { ++ size = CONFIG_OMAP2_DSS_VRAM_SIZE * 1024 * 1024; ++ paddr = 0; ++ } ++#endif ++ ++ if (!size) ++ return; ++ ++ size = PAGE_ALIGN(size); ++ ++ bdata = NODE_DATA(0)->bdata; ++ sdram_start = bdata->node_min_pfn << PAGE_SHIFT; ++ sdram_size = (bdata->node_low_pfn << PAGE_SHIFT) - sdram_start; ++ ++ if (paddr) { ++ if ((paddr & ~PAGE_MASK) || paddr < sdram_start || ++ paddr + size > sdram_start + sdram_size) { ++ printk(KERN_ERR "Illegal SDRAM region for VRAM\n"); ++ return; ++ } ++ ++ reserve_bootmem(paddr, size, BOOTMEM_DEFAULT); ++ } else { ++ if (size > sdram_size) { ++ printk(KERN_ERR "Illegal SDRAM size for VRAM\n"); ++ return; ++ } ++ ++ paddr = virt_to_phys(alloc_bootmem_pages(size)); ++ BUG_ON(paddr & ~PAGE_MASK); ++ } ++ ++ omap_vram_add_region_postponed(paddr, size); ++ ++ pr_info("Reserving %u bytes SDRAM for VRAM\n", size); ++} ++ ++/* ++ * Called at sram init time, before anything is pushed to the SRAM stack. ++ * Because of the stack scheme, we will allocate everything from the ++ * start of the lowest address region to the end of SRAM. This will also ++ * include padding for page alignment and possible holes between regions. ++ * ++ * As opposed to the SDRAM case, we'll also do any dynamic allocations at ++ * this point, since the driver built as a module would have problem with ++ * freeing / reallocating the regions. ++ */ ++unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, ++ unsigned long sram_vstart, ++ unsigned long sram_size, ++ unsigned long pstart_avail, ++ unsigned long size_avail) ++{ ++ unsigned long pend_avail; ++ unsigned long reserved; ++ u32 paddr; ++ u32 size; ++ ++ paddr = omapfb_sram_vram_start; ++ size = omapfb_sram_vram_size; ++ ++ if (!size) ++ return 0; ++ ++ reserved = 0; ++ pend_avail = pstart_avail + size_avail; ++ ++ if (!paddr) { ++ /* Dynamic allocation */ ++ if ((size_avail & PAGE_MASK) < size) { ++ printk(KERN_ERR "Not enough SRAM for VRAM\n"); ++ return 0; ++ } ++ size_avail = (size_avail - size) & PAGE_MASK; ++ paddr = pstart_avail + size_avail; ++ } ++ ++ if (paddr < sram_pstart || ++ paddr + size > sram_pstart + sram_size) { ++ printk(KERN_ERR "Illegal SRAM region for VRAM\n"); ++ return 0; ++ } ++ ++ /* Reserve everything above the start of the region. */ ++ if (pend_avail - paddr > reserved) ++ reserved = pend_avail - paddr; ++ size_avail = pend_avail - reserved - pstart_avail; ++ ++ omap_vram_add_region_postponed(paddr, size); ++ ++ if (reserved) ++ pr_info("Reserving %lu bytes SRAM for VRAM\n", reserved); ++ ++ return reserved; ++} ++ ++void __init omap2_set_sdram_vram(u32 size, u32 start) ++{ ++ omapfb_sdram_vram_start = start; ++ omapfb_sdram_vram_size = size; ++} ++ ++void __init omap2_set_sram_vram(u32 size, u32 start) ++{ ++ omapfb_sram_vram_start = start; ++ omapfb_sram_vram_size = size; ++} ++ ++#endif ++ +diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c +new file mode 100644 +index 0000000..7e0f8fc +--- /dev/null ++++ b/arch/arm/plat-omap/vrfb.c +@@ -0,0 +1,159 @@ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++/*#define DEBUG*/ ++ ++#ifdef DEBUG ++#define DBG(format, ...) printk(KERN_DEBUG "VRFB: " format, ## __VA_ARGS__) ++#else ++#define DBG(format, ...) ++#endif ++ ++#define SMS_ROT_VIRT_BASE(context, rot) \ ++ (((context >= 4) ? 0xD0000000 : 0x70000000) \ ++ | 0x4000000 * (context) \ ++ | 0x1000000 * (rot)) ++ ++#define OMAP_VRFB_SIZE (2048 * 2048 * 4) ++ ++#define VRFB_PAGE_WIDTH_EXP 5 /* Assuming SDRAM pagesize= 1024 */ ++#define VRFB_PAGE_HEIGHT_EXP 5 /* 1024 = 2^5 * 2^5 */ ++#define VRFB_PAGE_WIDTH (1 << VRFB_PAGE_WIDTH_EXP) ++#define VRFB_PAGE_HEIGHT (1 << VRFB_PAGE_HEIGHT_EXP) ++#define SMS_IMAGEHEIGHT_OFFSET 16 ++#define SMS_IMAGEWIDTH_OFFSET 0 ++#define SMS_PH_OFFSET 8 ++#define SMS_PW_OFFSET 4 ++#define SMS_PS_OFFSET 0 ++ ++#define OMAP_SMS_BASE 0x6C000000 ++#define SMS_ROT_CONTROL(context) (OMAP_SMS_BASE + 0x180 + 0x10 * context) ++#define SMS_ROT_SIZE(context) (OMAP_SMS_BASE + 0x184 + 0x10 * context) ++#define SMS_ROT_PHYSICAL_BA(context) (OMAP_SMS_BASE + 0x188 + 0x10 * context) ++ ++#define VRFB_NUM_CTXS 12 ++/* bitmap of reserved contexts */ ++static unsigned ctx_map; ++ ++void omap_vrfb_adjust_size(u16 *width, u16 *height, ++ u8 bytespp) ++{ ++ *width = ALIGN(*width * bytespp, VRFB_PAGE_WIDTH) / bytespp; ++ *height = ALIGN(*height, VRFB_PAGE_HEIGHT); ++} ++EXPORT_SYMBOL(omap_vrfb_adjust_size); ++ ++void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, ++ u16 width, u16 height, ++ u8 bytespp) ++{ ++ unsigned pixel_size_exp; ++ u16 vrfb_width; ++ u16 vrfb_height; ++ u8 ctx = vrfb->context; ++ ++ DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d)\n", ctx, paddr, ++ width, height, bytespp); ++ ++ if (bytespp == 4) ++ pixel_size_exp = 2; ++ else if (bytespp == 2) ++ pixel_size_exp = 1; ++ else ++ BUG(); ++ ++ vrfb_width = ALIGN(width * bytespp, VRFB_PAGE_WIDTH) / bytespp; ++ vrfb_height = ALIGN(height, VRFB_PAGE_HEIGHT); ++ ++ DBG("vrfb w %u, h %u\n", vrfb_width, vrfb_height); ++ ++ omap_writel(paddr, SMS_ROT_PHYSICAL_BA(ctx)); ++ omap_writel((vrfb_width << SMS_IMAGEWIDTH_OFFSET) | ++ (vrfb_height << SMS_IMAGEHEIGHT_OFFSET), ++ SMS_ROT_SIZE(ctx)); ++ ++ omap_writel(pixel_size_exp << SMS_PS_OFFSET | ++ VRFB_PAGE_WIDTH_EXP << SMS_PW_OFFSET | ++ VRFB_PAGE_HEIGHT_EXP << SMS_PH_OFFSET, ++ SMS_ROT_CONTROL(ctx)); ++ ++ DBG("vrfb offset pixels %d, %d\n", ++ vrfb_width - width, vrfb_height - height); ++ ++ vrfb->xoffset = vrfb_width - width; ++ vrfb->yoffset = vrfb_height - height; ++ vrfb->bytespp = bytespp; ++} ++EXPORT_SYMBOL(omap_vrfb_setup); ++ ++void omap_vrfb_release_ctx(struct vrfb *vrfb) ++{ ++ int rot; ++ ++ if (vrfb->context == 0xff) ++ return; ++ ++ DBG("release ctx %d\n", vrfb->context); ++ ++ ctx_map &= ~(1 << vrfb->context); ++ ++ for (rot = 0; rot < 4; ++rot) { ++ if(vrfb->paddr[rot]) { ++ release_mem_region(vrfb->paddr[rot], OMAP_VRFB_SIZE); ++ vrfb->paddr[rot] = 0; ++ } ++ } ++ ++ vrfb->context = 0xff; ++} ++EXPORT_SYMBOL(omap_vrfb_release_ctx); ++ ++int omap_vrfb_request_ctx(struct vrfb *vrfb) ++{ ++ int rot; ++ u32 paddr; ++ u8 ctx; ++ ++ DBG("request ctx\n"); ++ ++ for (ctx = 0; ctx < VRFB_NUM_CTXS; ++ctx) ++ if ((ctx_map & (1 << ctx)) == 0) ++ break; ++ ++ if (ctx == VRFB_NUM_CTXS) { ++ printk(KERN_ERR "vrfb: no free contexts\n"); ++ return -EBUSY; ++ } ++ ++ DBG("found free ctx %d\n", ctx); ++ ++ ctx_map |= 1 << ctx; ++ ++ memset(vrfb, 0, sizeof(*vrfb)); ++ ++ vrfb->context = ctx; ++ ++ for (rot = 0; rot < 4; ++rot) { ++ paddr = SMS_ROT_VIRT_BASE(ctx, rot); ++ if (!request_mem_region(paddr, OMAP_VRFB_SIZE, "vrfb")) { ++ printk(KERN_ERR "vrfb: failed to reserve VRFB " ++ "area for ctx %d, rotation %d\n", ++ ctx, rot * 90); ++ omap_vrfb_release_ctx(vrfb); ++ return -ENOMEM; ++ } ++ ++ vrfb->paddr[rot] = paddr; ++ ++ DBG("VRFB %d/%d: %lx\n", ctx, rot*90, vrfb->paddr[rot]); ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL(omap_vrfb_request_ctx); ++ +diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig +index fb19803..8b3752b 100644 +--- a/drivers/video/Kconfig ++++ b/drivers/video/Kconfig +@@ -2132,6 +2132,7 @@ config FB_MX3 + an LCD display with your i.MX31 system, say Y here. + + source "drivers/video/omap/Kconfig" ++source "drivers/video/omap2/Kconfig" + + source "drivers/video/backlight/Kconfig" + source "drivers/video/display/Kconfig" +diff --git a/drivers/video/Makefile b/drivers/video/Makefile +index 2a998ca..1db8dd4 100644 +--- a/drivers/video/Makefile ++++ b/drivers/video/Makefile +@@ -120,6 +120,7 @@ obj-$(CONFIG_FB_SM501) += sm501fb.o + obj-$(CONFIG_FB_XILINX) += xilinxfb.o + obj-$(CONFIG_FB_SH_MOBILE_LCDC) += sh_mobile_lcdcfb.o + obj-$(CONFIG_FB_OMAP) += omap/ ++obj-$(CONFIG_OMAP2_DSS) += omap2/ + obj-$(CONFIG_XEN_FBDEV_FRONTEND) += xen-fbfront.o + obj-$(CONFIG_FB_CARMINE) += carminefb.o + obj-$(CONFIG_FB_MB862XX) += mb862xx/ +diff --git a/drivers/video/omap2/Kconfig b/drivers/video/omap2/Kconfig +new file mode 100644 +index 0000000..89bf210 +--- /dev/null ++++ b/drivers/video/omap2/Kconfig +@@ -0,0 +1,3 @@ ++source "drivers/video/omap2/dss/Kconfig" ++source "drivers/video/omap2/displays/Kconfig" ++source "drivers/video/omap2/omapfb/Kconfig" +diff --git a/drivers/video/omap2/Makefile b/drivers/video/omap2/Makefile +new file mode 100644 +index 0000000..72134db +--- /dev/null ++++ b/drivers/video/omap2/Makefile +@@ -0,0 +1,4 @@ ++# OMAP2/3 Display Subsystem ++obj-y += dss/ ++obj-y += displays/ ++obj-y += omapfb/ +diff --git a/drivers/video/omap2/dss/Kconfig b/drivers/video/omap2/dss/Kconfig +new file mode 100644 +index 0000000..f2ce068 +--- /dev/null ++++ b/drivers/video/omap2/dss/Kconfig +@@ -0,0 +1,89 @@ ++menuconfig OMAP2_DSS ++ tristate "OMAP2/3 Display Subsystem support (EXPERIMENTAL)" ++ depends on ARCH_OMAP2 || ARCH_OMAP3 ++ help ++ OMAP2/3 Display Subsystem support. ++ ++if OMAP2_DSS ++ ++config OMAP2_DSS_VRAM_SIZE ++ int "VRAM size (MB)" ++ range 0 32 ++ default 4 ++ help ++ The amount of SDRAM to reserve at boot time for video RAM use. ++ This VRAM will be used by omapfb and other drivers that need ++ large continuous RAM area for video use. ++ ++ You can also set this with "vram=" kernel argument, or ++ in the board file. ++ ++config OMAP2_DSS_DEBUG_SUPPORT ++ bool "Debug support" ++ default y ++ help ++ This enables debug messages. You need to enable printing ++ with 'debug' module parameter. ++ ++config OMAP2_DSS_RFBI ++ bool "RFBI support" ++ default n ++ help ++ MIPI DBI, or RFBI (Remote Framebuffer Interface), support. ++ ++config OMAP2_DSS_VENC ++ bool "VENC support" ++ default y ++ help ++ OMAP Video Encoder support. ++ ++config OMAP2_DSS_SDI ++ bool "SDI support" ++ depends on ARCH_OMAP3 ++ default n ++ help ++ SDI (Serial Display Interface) support. ++ ++config OMAP2_DSS_DSI ++ bool "DSI support" ++ depends on ARCH_OMAP3 ++ default n ++ help ++ MIPI DSI support. ++ ++config OMAP2_DSS_USE_DSI_PLL ++ bool "Use DSI PLL for PCLK (EXPERIMENTAL)" ++ default n ++ depends on OMAP2_DSS_DSI ++ help ++ Use DSI PLL to generate pixel clock. Currently only for DPI output. ++ DSI PLL can be used to generate higher and more precise pixel clocks. ++ ++config OMAP2_DSS_FAKE_VSYNC ++ bool "Fake VSYNC irq from manual update displays" ++ default n ++ help ++ If this is selected, DSI will generate a fake DISPC VSYNC interrupt ++ when DSI has sent a frame. This is only needed with DSI or RFBI ++ displays using manual mode, and you want VSYNC to, for example, ++ time animation. ++ ++config OMAP2_DSS_MIN_FCK_PER_PCK ++ int "Minimum FCK/PCK ratio (for scaling)" ++ range 0 32 ++ default 0 ++ help ++ This can be used to adjust the minimum FCK/PCK ratio. ++ ++ With this you can make sure that DISPC FCK is at least ++ n x PCK. Video plane scaling requires higher FCK than ++ normally. ++ ++ If this is set to 0, there's no extra constraint on the ++ DISPC FCK. However, the FCK will at minimum be ++ 2xPCK (if active matrix) or 3xPCK (if passive matrix). ++ ++ Max FCK is 173MHz, so this doesn't work if your PCK ++ is very high. ++ ++endif +diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile +new file mode 100644 +index 0000000..980c72c +--- /dev/null ++++ b/drivers/video/omap2/dss/Makefile +@@ -0,0 +1,6 @@ ++obj-$(CONFIG_OMAP2_DSS) += omapdss.o ++omapdss-y := core.o dss.o dispc.o dpi.o display.o manager.o overlay.o ++omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o ++omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o ++omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o ++omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o +diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c +new file mode 100644 +index 0000000..ae7cd06 +--- /dev/null ++++ b/drivers/video/omap2/dss/core.c +@@ -0,0 +1,641 @@ ++/* ++ * linux/drivers/video/omap2/dss/core.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "CORE" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "dss.h" ++ ++static struct { ++ struct platform_device *pdev; ++ unsigned ctx_id; ++ ++ struct clk *dss_ick; ++ struct clk *dss1_fck; ++ struct clk *dss2_fck; ++ struct clk *dss_54m_fck; ++ struct clk *dss_96m_fck; ++ unsigned num_clks_enabled; ++} core; ++ ++static void dss_clk_enable_all_no_ctx(void); ++static void dss_clk_disable_all_no_ctx(void); ++static void dss_clk_enable_no_ctx(enum dss_clock clks); ++static void dss_clk_disable_no_ctx(enum dss_clock clks); ++ ++static char *def_disp_name; ++module_param_named(def_disp, def_disp_name, charp, 0); ++MODULE_PARM_DESC(def_disp_name, "default display name"); ++ ++#ifdef DEBUG ++unsigned int dss_debug; ++module_param_named(debug, dss_debug, bool, 0644); ++#endif ++ ++/* CONTEXT */ ++static unsigned dss_get_ctx_id(void) ++{ ++ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; ++ ++ if (!pdata->get_last_off_on_transaction_id) ++ return 0; ++ ++ return pdata->get_last_off_on_transaction_id(&core.pdev->dev); ++} ++ ++int dss_need_ctx_restore(void) ++{ ++ int id = dss_get_ctx_id(); ++ ++ if (id != core.ctx_id) { ++ DSSDBG("ctx id %u -> id %u\n", ++ core.ctx_id, id); ++ core.ctx_id = id; ++ return 1; ++ } else { ++ return 0; ++ } ++} ++ ++static void save_all_ctx(void) ++{ ++ DSSDBG("save context\n"); ++ ++ dss_clk_enable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ dss_save_context(); ++ dispc_save_context(); ++#ifdef CONFIG_OMAP2_DSS_DSI ++ dsi_save_context(); ++#endif ++ ++ dss_clk_disable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); ++} ++ ++static void restore_all_ctx(void) ++{ ++ DSSDBG("restore context\n"); ++ ++ dss_clk_enable_all_no_ctx(); ++ ++ dss_restore_context(); ++ dispc_restore_context(); ++#ifdef CONFIG_OMAP2_DSS_DSI ++ dsi_restore_context(); ++#endif ++ ++ dss_clk_disable_all_no_ctx(); ++} ++ ++/* CLOCKS */ ++void dss_dump_clocks(struct seq_file *s) ++{ ++ int i; ++ struct clk *clocks[5] = { ++ core.dss_ick, ++ core.dss1_fck, ++ core.dss2_fck, ++ core.dss_54m_fck, ++ core.dss_96m_fck ++ }; ++ ++ seq_printf(s, "- dss -\n"); ++ ++ seq_printf(s, "internal clk count\t%u\n", core.num_clks_enabled); ++ ++ for (i = 0; i < 5; i++) { ++ if (!clocks[i]) ++ continue; ++ seq_printf(s, "%-15s\t%lu\t%d\n", ++ clocks[i]->name, ++ clk_get_rate(clocks[i]), ++ clocks[i]->usecount); ++ } ++} ++ ++static int dss_get_clocks(void) ++{ ++ const struct { ++ struct clk **clock; ++ char *omap2_name; ++ char *omap3_name; ++ } clocks[5] = { ++ { &core.dss_ick, "dss_ick", "dss_ick" }, /* L3 & L4 ick */ ++ { &core.dss1_fck, "dss1_fck", "dss1_alwon_fck" }, ++ { &core.dss2_fck, "dss2_fck", "dss2_alwon_fck" }, ++ { &core.dss_54m_fck, "dss_54m_fck", "dss_tv_fck" }, ++ { &core.dss_96m_fck, NULL, "dss_96m_fck" }, ++ }; ++ ++ int r = 0; ++ int i; ++ const int num_clocks = 5; ++ ++ for (i = 0; i < num_clocks; i++) ++ *clocks[i].clock = NULL; ++ ++ for (i = 0; i < num_clocks; i++) { ++ struct clk *clk; ++ const char *clk_name; ++ ++ clk_name = cpu_is_omap34xx() ? clocks[i].omap3_name ++ : clocks[i].omap2_name; ++ ++ if (!clk_name) ++ continue; ++ ++ clk = clk_get(NULL, clk_name); ++ ++ if (IS_ERR(clk)) { ++ DSSERR("can't get clock %s", clk_name); ++ r = PTR_ERR(clk); ++ goto err; ++ } ++ ++ DSSDBG("clk %s, rate %ld\n", ++ clk_name, clk_get_rate(clk)); ++ ++ *clocks[i].clock = clk; ++ } ++ ++ return 0; ++ ++err: ++ for (i = 0; i < num_clocks; i++) { ++ if (!IS_ERR(*clocks[i].clock)) ++ clk_put(*clocks[i].clock); ++ } ++ ++ return r; ++} ++ ++static void dss_put_clocks(void) ++{ ++ if (core.dss_96m_fck) ++ clk_put(core.dss_96m_fck); ++ clk_put(core.dss_54m_fck); ++ clk_put(core.dss1_fck); ++ clk_put(core.dss2_fck); ++ clk_put(core.dss_ick); ++} ++ ++unsigned long dss_clk_get_rate(enum dss_clock clk) ++{ ++ switch (clk) { ++ case DSS_CLK_ICK: ++ return clk_get_rate(core.dss_ick); ++ case DSS_CLK_FCK1: ++ return clk_get_rate(core.dss1_fck); ++ case DSS_CLK_FCK2: ++ return clk_get_rate(core.dss2_fck); ++ case DSS_CLK_54M: ++ return clk_get_rate(core.dss_54m_fck); ++ case DSS_CLK_96M: ++ return clk_get_rate(core.dss_96m_fck); ++ } ++ ++ BUG(); ++ return 0; ++} ++ ++static unsigned count_clk_bits(enum dss_clock clks) ++{ ++ unsigned num_clks = 0; ++ ++ if (clks & DSS_CLK_ICK) ++ ++num_clks; ++ if (clks & DSS_CLK_FCK1) ++ ++num_clks; ++ if (clks & DSS_CLK_FCK2) ++ ++num_clks; ++ if (clks & DSS_CLK_54M) ++ ++num_clks; ++ if (clks & DSS_CLK_96M) ++ ++num_clks; ++ ++ return num_clks; ++} ++ ++static void dss_clk_enable_no_ctx(enum dss_clock clks) ++{ ++ unsigned num_clks = count_clk_bits(clks); ++ ++ if (clks & DSS_CLK_ICK) ++ clk_enable(core.dss_ick); ++ if (clks & DSS_CLK_FCK1) ++ clk_enable(core.dss1_fck); ++ if (clks & DSS_CLK_FCK2) ++ clk_enable(core.dss2_fck); ++ if (clks & DSS_CLK_54M) ++ clk_enable(core.dss_54m_fck); ++ if (clks & DSS_CLK_96M) ++ clk_enable(core.dss_96m_fck); ++ ++ core.num_clks_enabled += num_clks; ++} ++ ++void dss_clk_enable(enum dss_clock clks) ++{ ++ dss_clk_enable_no_ctx(clks); ++ ++ if (cpu_is_omap34xx() && dss_need_ctx_restore()) ++ restore_all_ctx(); ++} ++ ++static void dss_clk_disable_no_ctx(enum dss_clock clks) ++{ ++ unsigned num_clks = count_clk_bits(clks); ++ ++ if (clks & DSS_CLK_ICK) ++ clk_disable(core.dss_ick); ++ if (clks & DSS_CLK_FCK1) ++ clk_disable(core.dss1_fck); ++ if (clks & DSS_CLK_FCK2) ++ clk_disable(core.dss2_fck); ++ if (clks & DSS_CLK_54M) ++ clk_disable(core.dss_54m_fck); ++ if (clks & DSS_CLK_96M) ++ clk_disable(core.dss_96m_fck); ++ ++ core.num_clks_enabled -= num_clks; ++} ++ ++void dss_clk_disable(enum dss_clock clks) ++{ ++ if (cpu_is_omap34xx()) { ++ unsigned num_clks = count_clk_bits(clks); ++ ++ BUG_ON(core.num_clks_enabled < num_clks); ++ ++ if (core.num_clks_enabled == num_clks) ++ save_all_ctx(); ++ } ++ ++ dss_clk_disable_no_ctx(clks); ++} ++ ++static void dss_clk_enable_all_no_ctx(void) ++{ ++ enum dss_clock clks; ++ ++ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; ++ if (cpu_is_omap34xx()) ++ clks |= DSS_CLK_96M; ++ dss_clk_enable_no_ctx(clks); ++} ++ ++static void dss_clk_disable_all_no_ctx(void) ++{ ++ enum dss_clock clks; ++ ++ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; ++ if (cpu_is_omap34xx()) ++ clks |= DSS_CLK_96M; ++ dss_clk_disable_no_ctx(clks); ++} ++ ++static void dss_clk_disable_all(void) ++{ ++ enum dss_clock clks; ++ ++ clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; ++ if (cpu_is_omap34xx()) ++ clks |= DSS_CLK_96M; ++ dss_clk_disable(clks); ++} ++ ++/* DEBUGFS */ ++#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) ++static void dss_debug_dump_clocks(struct seq_file *s) ++{ ++ dss_dump_clocks(s); ++ dispc_dump_clocks(s); ++#ifdef CONFIG_OMAP2_DSS_DSI ++ dsi_dump_clocks(s); ++#endif ++} ++ ++static int dss_debug_show(struct seq_file *s, void *unused) ++{ ++ void (*func)(struct seq_file *) = s->private; ++ func(s); ++ return 0; ++} ++ ++static int dss_debug_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, dss_debug_show, inode->i_private); ++} ++ ++static const struct file_operations dss_debug_fops = { ++ .open = dss_debug_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static struct dentry *dss_debugfs_dir; ++ ++static int dss_initialize_debugfs(void) ++{ ++ dss_debugfs_dir = debugfs_create_dir("omapdss", NULL); ++ if (IS_ERR(dss_debugfs_dir)) { ++ int err = PTR_ERR(dss_debugfs_dir); ++ dss_debugfs_dir = NULL; ++ return err; ++ } ++ ++ debugfs_create_file("clk", S_IRUGO, dss_debugfs_dir, ++ &dss_debug_dump_clocks, &dss_debug_fops); ++ ++ debugfs_create_file("dss", S_IRUGO, dss_debugfs_dir, ++ &dss_dump_regs, &dss_debug_fops); ++ debugfs_create_file("dispc", S_IRUGO, dss_debugfs_dir, ++ &dispc_dump_regs, &dss_debug_fops); ++#ifdef CONFIG_OMAP2_DSS_RFBI ++ debugfs_create_file("rfbi", S_IRUGO, dss_debugfs_dir, ++ &rfbi_dump_regs, &dss_debug_fops); ++#endif ++#ifdef CONFIG_OMAP2_DSS_DSI ++ debugfs_create_file("dsi", S_IRUGO, dss_debugfs_dir, ++ &dsi_dump_regs, &dss_debug_fops); ++#endif ++ return 0; ++} ++ ++static void dss_uninitialize_debugfs(void) ++{ ++ if (dss_debugfs_dir) ++ debugfs_remove_recursive(dss_debugfs_dir); ++} ++#endif /* CONFIG_DEBUG_FS && CONFIG_OMAP2_DSS_DEBUG_SUPPORT */ ++ ++ ++/* DSI powers */ ++int dss_dsi_power_up(void) ++{ ++ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; ++ ++ if (!pdata->dsi_power_up) ++ return 0; /* presume power is always on then */ ++ ++ return pdata->dsi_power_up(); ++} ++ ++void dss_dsi_power_down(void) ++{ ++ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; ++ ++ if (!pdata->dsi_power_down) ++ return; ++ ++ pdata->dsi_power_down(); ++} ++ ++ ++ ++/* PLATFORM DEVICE */ ++static int omap_dss_probe(struct platform_device *pdev) ++{ ++ int skip_init = 0; ++ int r; ++ ++ core.pdev = pdev; ++ ++ r = dss_get_clocks(); ++ if (r) ++ goto fail0; ++ ++ dss_clk_enable_all_no_ctx(); ++ ++ core.ctx_id = dss_get_ctx_id(); ++ DSSDBG("initial ctx id %u\n", core.ctx_id); ++ ++#ifdef CONFIG_FB_OMAP_BOOTLOADER_INIT ++ /* DISPC_CONTROL */ ++ if (omap_readl(0x48050440) & 1) /* LCD enabled? */ ++ skip_init = 1; ++#endif ++ ++ r = dss_init(skip_init); ++ if (r) { ++ DSSERR("Failed to initialize DSS\n"); ++ goto fail0; ++ } ++ ++#ifdef CONFIG_OMAP2_DSS_RFBI ++ r = rfbi_init(); ++ if (r) { ++ DSSERR("Failed to initialize rfbi\n"); ++ goto fail0; ++ } ++#endif ++ ++ r = dpi_init(); ++ if (r) { ++ DSSERR("Failed to initialize dpi\n"); ++ goto fail0; ++ } ++ ++ r = dispc_init(); ++ if (r) { ++ DSSERR("Failed to initialize dispc\n"); ++ goto fail0; ++ } ++#ifdef CONFIG_OMAP2_DSS_VENC ++ r = venc_init(); ++ if (r) { ++ DSSERR("Failed to initialize venc\n"); ++ goto fail0; ++ } ++#endif ++ if (cpu_is_omap34xx()) { ++#ifdef CONFIG_OMAP2_DSS_SDI ++ r = sdi_init(skip_init); ++ if (r) { ++ DSSERR("Failed to initialize SDI\n"); ++ goto fail0; ++ } ++#endif ++#ifdef CONFIG_OMAP2_DSS_DSI ++ r = dsi_init(); ++ if (r) { ++ DSSERR("Failed to initialize DSI\n"); ++ goto fail0; ++ } ++#endif ++ } ++ ++#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) ++ r = dss_initialize_debugfs(); ++ if (r) ++ goto fail0; ++#endif ++ ++ dss_init_displays(pdev); ++ dss_init_overlay_managers(pdev); ++ dss_init_overlays(pdev, def_disp_name); ++ ++ dss_clk_disable_all(); ++ ++ return 0; ++ ++ /* XXX fail correctly */ ++fail0: ++ return r; ++} ++ ++static int omap_dss_remove(struct platform_device *pdev) ++{ ++ int c; ++ ++ dss_uninit_overlays(pdev); ++ dss_uninit_overlay_managers(pdev); ++ dss_uninit_displays(pdev); ++ ++#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) ++ dss_uninitialize_debugfs(); ++#endif ++ ++#ifdef CONFIG_OMAP2_DSS_VENC ++ venc_exit(); ++#endif ++ dispc_exit(); ++ dpi_exit(); ++#ifdef CONFIG_OMAP2_DSS_RFBI ++ rfbi_exit(); ++#endif ++ if (cpu_is_omap34xx()) { ++#ifdef CONFIG_OMAP2_DSS_DSI ++ dsi_exit(); ++#endif ++#ifdef CONFIG_OMAP2_DSS_SDI ++ sdi_exit(); ++#endif ++ } ++ ++ dss_exit(); ++ ++ /* these should be removed at some point */ ++ c = core.dss_ick->usecount; ++ if (c > 0) { ++ DSSERR("warning: dss_ick usecount %d, disabling\n", c); ++ while (c-- > 0) ++ clk_disable(core.dss_ick); ++ } ++ ++ c = core.dss1_fck->usecount; ++ if (c > 0) { ++ DSSERR("warning: dss1_fck usecount %d, disabling\n", c); ++ while (c-- > 0) ++ clk_disable(core.dss1_fck); ++ } ++ ++ c = core.dss2_fck->usecount; ++ if (c > 0) { ++ DSSERR("warning: dss2_fck usecount %d, disabling\n", c); ++ while (c-- > 0) ++ clk_disable(core.dss2_fck); ++ } ++ ++ c = core.dss_54m_fck->usecount; ++ if (c > 0) { ++ DSSERR("warning: dss_54m_fck usecount %d, disabling\n", c); ++ while (c-- > 0) ++ clk_disable(core.dss_54m_fck); ++ } ++ ++ if (core.dss_96m_fck) { ++ c = core.dss_96m_fck->usecount; ++ if (c > 0) { ++ DSSERR("warning: dss_96m_fck usecount %d, disabling\n", ++ c); ++ while (c-- > 0) ++ clk_disable(core.dss_96m_fck); ++ } ++ } ++ ++ dss_put_clocks(); ++ ++ return 0; ++} ++ ++static void omap_dss_shutdown(struct platform_device *pdev) ++{ ++ DSSDBG("shutdown\n"); ++} ++ ++static int omap_dss_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ DSSDBG("suspend %d\n", state.event); ++ ++ return dss_suspend_all_displays(); ++} ++ ++static int omap_dss_resume(struct platform_device *pdev) ++{ ++ DSSDBG("resume\n"); ++ ++ return dss_resume_all_displays(); ++} ++ ++static struct platform_driver omap_dss_driver = { ++ .probe = omap_dss_probe, ++ .remove = omap_dss_remove, ++ .shutdown = omap_dss_shutdown, ++ .suspend = omap_dss_suspend, ++ .resume = omap_dss_resume, ++ .driver = { ++ .name = "omapdss", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init omap_dss_init(void) ++{ ++ return platform_driver_register(&omap_dss_driver); ++} ++ ++static void __exit omap_dss_exit(void) ++{ ++ platform_driver_unregister(&omap_dss_driver); ++} ++ ++subsys_initcall(omap_dss_init); ++module_exit(omap_dss_exit); ++ ++ ++MODULE_AUTHOR("Tomi Valkeinen "); ++MODULE_DESCRIPTION("OMAP2/3 Display Subsystem"); ++MODULE_LICENSE("GPL v2"); ++ +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +new file mode 100644 +index 0000000..ffb5648 +--- /dev/null ++++ b/drivers/video/omap2/dss/dispc.c +@@ -0,0 +1,2968 @@ ++/* ++ * linux/drivers/video/omap2/dss/dispc.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "DISPC" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#include "dss.h" ++ ++/* DISPC */ ++#define DISPC_BASE 0x48050400 ++ ++#define DISPC_SZ_REGS SZ_1K ++ ++struct dispc_reg { u16 idx; }; ++ ++#define DISPC_REG(idx) ((const struct dispc_reg) { idx }) ++ ++/* DISPC common */ ++#define DISPC_REVISION DISPC_REG(0x0000) ++#define DISPC_SYSCONFIG DISPC_REG(0x0010) ++#define DISPC_SYSSTATUS DISPC_REG(0x0014) ++#define DISPC_IRQSTATUS DISPC_REG(0x0018) ++#define DISPC_IRQENABLE DISPC_REG(0x001C) ++#define DISPC_CONTROL DISPC_REG(0x0040) ++#define DISPC_CONFIG DISPC_REG(0x0044) ++#define DISPC_CAPABLE DISPC_REG(0x0048) ++#define DISPC_DEFAULT_COLOR0 DISPC_REG(0x004C) ++#define DISPC_DEFAULT_COLOR1 DISPC_REG(0x0050) ++#define DISPC_TRANS_COLOR0 DISPC_REG(0x0054) ++#define DISPC_TRANS_COLOR1 DISPC_REG(0x0058) ++#define DISPC_LINE_STATUS DISPC_REG(0x005C) ++#define DISPC_LINE_NUMBER DISPC_REG(0x0060) ++#define DISPC_TIMING_H DISPC_REG(0x0064) ++#define DISPC_TIMING_V DISPC_REG(0x0068) ++#define DISPC_POL_FREQ DISPC_REG(0x006C) ++#define DISPC_DIVISOR DISPC_REG(0x0070) ++#define DISPC_GLOBAL_ALPHA DISPC_REG(0x0074) ++#define DISPC_SIZE_DIG DISPC_REG(0x0078) ++#define DISPC_SIZE_LCD DISPC_REG(0x007C) ++ ++/* DISPC GFX plane */ ++#define DISPC_GFX_BA0 DISPC_REG(0x0080) ++#define DISPC_GFX_BA1 DISPC_REG(0x0084) ++#define DISPC_GFX_POSITION DISPC_REG(0x0088) ++#define DISPC_GFX_SIZE DISPC_REG(0x008C) ++#define DISPC_GFX_ATTRIBUTES DISPC_REG(0x00A0) ++#define DISPC_GFX_FIFO_THRESHOLD DISPC_REG(0x00A4) ++#define DISPC_GFX_FIFO_SIZE_STATUS DISPC_REG(0x00A8) ++#define DISPC_GFX_ROW_INC DISPC_REG(0x00AC) ++#define DISPC_GFX_PIXEL_INC DISPC_REG(0x00B0) ++#define DISPC_GFX_WINDOW_SKIP DISPC_REG(0x00B4) ++#define DISPC_GFX_TABLE_BA DISPC_REG(0x00B8) ++ ++#define DISPC_DATA_CYCLE1 DISPC_REG(0x01D4) ++#define DISPC_DATA_CYCLE2 DISPC_REG(0x01D8) ++#define DISPC_DATA_CYCLE3 DISPC_REG(0x01DC) ++ ++#define DISPC_CPR_COEF_R DISPC_REG(0x0220) ++#define DISPC_CPR_COEF_G DISPC_REG(0x0224) ++#define DISPC_CPR_COEF_B DISPC_REG(0x0228) ++ ++#define DISPC_GFX_PRELOAD DISPC_REG(0x022C) ++ ++/* DISPC Video plane, n = 0 for VID1 and n = 1 for VID2 */ ++#define DISPC_VID_REG(n, idx) DISPC_REG(0x00BC + (n)*0x90 + idx) ++ ++#define DISPC_VID_BA0(n) DISPC_VID_REG(n, 0x0000) ++#define DISPC_VID_BA1(n) DISPC_VID_REG(n, 0x0004) ++#define DISPC_VID_POSITION(n) DISPC_VID_REG(n, 0x0008) ++#define DISPC_VID_SIZE(n) DISPC_VID_REG(n, 0x000C) ++#define DISPC_VID_ATTRIBUTES(n) DISPC_VID_REG(n, 0x0010) ++#define DISPC_VID_FIFO_THRESHOLD(n) DISPC_VID_REG(n, 0x0014) ++#define DISPC_VID_FIFO_SIZE_STATUS(n) DISPC_VID_REG(n, 0x0018) ++#define DISPC_VID_ROW_INC(n) DISPC_VID_REG(n, 0x001C) ++#define DISPC_VID_PIXEL_INC(n) DISPC_VID_REG(n, 0x0020) ++#define DISPC_VID_FIR(n) DISPC_VID_REG(n, 0x0024) ++#define DISPC_VID_PICTURE_SIZE(n) DISPC_VID_REG(n, 0x0028) ++#define DISPC_VID_ACCU0(n) DISPC_VID_REG(n, 0x002C) ++#define DISPC_VID_ACCU1(n) DISPC_VID_REG(n, 0x0030) ++ ++/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ ++#define DISPC_VID_FIR_COEF_H(n, i) DISPC_REG(0x00F0 + (n)*0x90 + (i)*0x8) ++/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ ++#define DISPC_VID_FIR_COEF_HV(n, i) DISPC_REG(0x00F4 + (n)*0x90 + (i)*0x8) ++/* coef index i = {0, 1, 2, 3, 4} */ ++#define DISPC_VID_CONV_COEF(n, i) DISPC_REG(0x0130 + (n)*0x90 + (i)*0x4) ++/* coef index i = {0, 1, 2, 3, 4, 5, 6, 7} */ ++#define DISPC_VID_FIR_COEF_V(n, i) DISPC_REG(0x01E0 + (n)*0x20 + (i)*0x4) ++ ++#define DISPC_VID_PRELOAD(n) DISPC_REG(0x230 + (n)*0x04) ++ ++ ++#define DISPC_IRQ_MASK_ERROR (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \ ++ DISPC_IRQ_OCP_ERR | \ ++ DISPC_IRQ_VID1_FIFO_UNDERFLOW | \ ++ DISPC_IRQ_VID2_FIFO_UNDERFLOW | \ ++ DISPC_IRQ_SYNC_LOST | \ ++ DISPC_IRQ_SYNC_LOST_DIGIT) ++ ++#define DISPC_MAX_NR_ISRS 8 ++ ++struct omap_dispc_isr_data { ++ omap_dispc_isr_t isr; ++ void *arg; ++ u32 mask; ++}; ++ ++#define REG_GET(idx, start, end) \ ++ FLD_GET(dispc_read_reg(idx), start, end) ++ ++#define REG_FLD_MOD(idx, val, start, end) \ ++ dispc_write_reg(idx, FLD_MOD(dispc_read_reg(idx), val, start, end)) ++ ++static const struct dispc_reg dispc_reg_att[] = { DISPC_GFX_ATTRIBUTES, ++ DISPC_VID_ATTRIBUTES(0), ++ DISPC_VID_ATTRIBUTES(1) }; ++ ++static struct { ++ void __iomem *base; ++ ++ struct clk *dpll4_m4_ck; ++ ++ spinlock_t irq_lock; ++ ++ unsigned long cache_req_pck; ++ unsigned long cache_prate; ++ struct dispc_clock_info cache_cinfo; ++ ++ u32 irq_error_mask; ++ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; ++ ++ spinlock_t error_lock; ++ u32 error_irqs; ++ struct work_struct error_work; ++ ++ u32 ctx[DISPC_SZ_REGS / sizeof(u32)]; ++} dispc; ++ ++static void omap_dispc_set_irqs(void); ++ ++static inline void dispc_write_reg(const struct dispc_reg idx, u32 val) ++{ ++ __raw_writel(val, dispc.base + idx.idx); ++} ++ ++static inline u32 dispc_read_reg(const struct dispc_reg idx) ++{ ++ return __raw_readl(dispc.base + idx.idx); ++} ++ ++#define SR(reg) \ ++ dispc.ctx[(DISPC_##reg).idx / sizeof(u32)] = dispc_read_reg(DISPC_##reg) ++#define RR(reg) \ ++ dispc_write_reg(DISPC_##reg, dispc.ctx[(DISPC_##reg).idx / sizeof(u32)]) ++ ++void dispc_save_context(void) ++{ ++ if (cpu_is_omap24xx()) ++ return; ++ ++ SR(SYSCONFIG); ++ SR(IRQENABLE); ++ SR(CONTROL); ++ SR(CONFIG); ++ SR(DEFAULT_COLOR0); ++ SR(DEFAULT_COLOR1); ++ SR(TRANS_COLOR0); ++ SR(TRANS_COLOR1); ++ SR(LINE_NUMBER); ++ SR(TIMING_H); ++ SR(TIMING_V); ++ SR(POL_FREQ); ++ SR(DIVISOR); ++ SR(GLOBAL_ALPHA); ++ SR(SIZE_DIG); ++ SR(SIZE_LCD); ++ ++ SR(GFX_BA0); ++ SR(GFX_BA1); ++ SR(GFX_POSITION); ++ SR(GFX_SIZE); ++ SR(GFX_ATTRIBUTES); ++ SR(GFX_FIFO_THRESHOLD); ++ SR(GFX_ROW_INC); ++ SR(GFX_PIXEL_INC); ++ SR(GFX_WINDOW_SKIP); ++ SR(GFX_TABLE_BA); ++ ++ SR(DATA_CYCLE1); ++ SR(DATA_CYCLE2); ++ SR(DATA_CYCLE3); ++ ++ SR(CPR_COEF_R); ++ SR(CPR_COEF_G); ++ SR(CPR_COEF_B); ++ ++ SR(GFX_PRELOAD); ++ ++ /* VID1 */ ++ SR(VID_BA0(0)); ++ SR(VID_BA1(0)); ++ SR(VID_POSITION(0)); ++ SR(VID_SIZE(0)); ++ SR(VID_ATTRIBUTES(0)); ++ SR(VID_FIFO_THRESHOLD(0)); ++ SR(VID_ROW_INC(0)); ++ SR(VID_PIXEL_INC(0)); ++ SR(VID_FIR(0)); ++ SR(VID_PICTURE_SIZE(0)); ++ SR(VID_ACCU0(0)); ++ SR(VID_ACCU1(0)); ++ ++ SR(VID_FIR_COEF_H(0, 0)); ++ SR(VID_FIR_COEF_H(0, 1)); ++ SR(VID_FIR_COEF_H(0, 2)); ++ SR(VID_FIR_COEF_H(0, 3)); ++ SR(VID_FIR_COEF_H(0, 4)); ++ SR(VID_FIR_COEF_H(0, 5)); ++ SR(VID_FIR_COEF_H(0, 6)); ++ SR(VID_FIR_COEF_H(0, 7)); ++ ++ SR(VID_FIR_COEF_HV(0, 0)); ++ SR(VID_FIR_COEF_HV(0, 1)); ++ SR(VID_FIR_COEF_HV(0, 2)); ++ SR(VID_FIR_COEF_HV(0, 3)); ++ SR(VID_FIR_COEF_HV(0, 4)); ++ SR(VID_FIR_COEF_HV(0, 5)); ++ SR(VID_FIR_COEF_HV(0, 6)); ++ SR(VID_FIR_COEF_HV(0, 7)); ++ ++ SR(VID_CONV_COEF(0, 0)); ++ SR(VID_CONV_COEF(0, 1)); ++ SR(VID_CONV_COEF(0, 2)); ++ SR(VID_CONV_COEF(0, 3)); ++ SR(VID_CONV_COEF(0, 4)); ++ ++ SR(VID_FIR_COEF_V(0, 0)); ++ SR(VID_FIR_COEF_V(0, 1)); ++ SR(VID_FIR_COEF_V(0, 2)); ++ SR(VID_FIR_COEF_V(0, 3)); ++ SR(VID_FIR_COEF_V(0, 4)); ++ SR(VID_FIR_COEF_V(0, 5)); ++ SR(VID_FIR_COEF_V(0, 6)); ++ SR(VID_FIR_COEF_V(0, 7)); ++ ++ SR(VID_PRELOAD(0)); ++ ++ /* VID2 */ ++ SR(VID_BA0(1)); ++ SR(VID_BA1(1)); ++ SR(VID_POSITION(1)); ++ SR(VID_SIZE(1)); ++ SR(VID_ATTRIBUTES(1)); ++ SR(VID_FIFO_THRESHOLD(1)); ++ SR(VID_ROW_INC(1)); ++ SR(VID_PIXEL_INC(1)); ++ SR(VID_FIR(1)); ++ SR(VID_PICTURE_SIZE(1)); ++ SR(VID_ACCU0(1)); ++ SR(VID_ACCU1(1)); ++ ++ SR(VID_FIR_COEF_H(1, 0)); ++ SR(VID_FIR_COEF_H(1, 1)); ++ SR(VID_FIR_COEF_H(1, 2)); ++ SR(VID_FIR_COEF_H(1, 3)); ++ SR(VID_FIR_COEF_H(1, 4)); ++ SR(VID_FIR_COEF_H(1, 5)); ++ SR(VID_FIR_COEF_H(1, 6)); ++ SR(VID_FIR_COEF_H(1, 7)); ++ ++ SR(VID_FIR_COEF_HV(1, 0)); ++ SR(VID_FIR_COEF_HV(1, 1)); ++ SR(VID_FIR_COEF_HV(1, 2)); ++ SR(VID_FIR_COEF_HV(1, 3)); ++ SR(VID_FIR_COEF_HV(1, 4)); ++ SR(VID_FIR_COEF_HV(1, 5)); ++ SR(VID_FIR_COEF_HV(1, 6)); ++ SR(VID_FIR_COEF_HV(1, 7)); ++ ++ SR(VID_CONV_COEF(1, 0)); ++ SR(VID_CONV_COEF(1, 1)); ++ SR(VID_CONV_COEF(1, 2)); ++ SR(VID_CONV_COEF(1, 3)); ++ SR(VID_CONV_COEF(1, 4)); ++ ++ SR(VID_FIR_COEF_V(1, 0)); ++ SR(VID_FIR_COEF_V(1, 1)); ++ SR(VID_FIR_COEF_V(1, 2)); ++ SR(VID_FIR_COEF_V(1, 3)); ++ SR(VID_FIR_COEF_V(1, 4)); ++ SR(VID_FIR_COEF_V(1, 5)); ++ SR(VID_FIR_COEF_V(1, 6)); ++ SR(VID_FIR_COEF_V(1, 7)); ++ ++ SR(VID_PRELOAD(1)); ++} ++ ++void dispc_restore_context(void) ++{ ++ RR(SYSCONFIG); ++ RR(IRQENABLE); ++ /*RR(CONTROL);*/ ++ RR(CONFIG); ++ RR(DEFAULT_COLOR0); ++ RR(DEFAULT_COLOR1); ++ RR(TRANS_COLOR0); ++ RR(TRANS_COLOR1); ++ RR(LINE_NUMBER); ++ RR(TIMING_H); ++ RR(TIMING_V); ++ RR(POL_FREQ); ++ RR(DIVISOR); ++ RR(GLOBAL_ALPHA); ++ RR(SIZE_DIG); ++ RR(SIZE_LCD); ++ ++ RR(GFX_BA0); ++ RR(GFX_BA1); ++ RR(GFX_POSITION); ++ RR(GFX_SIZE); ++ RR(GFX_ATTRIBUTES); ++ RR(GFX_FIFO_THRESHOLD); ++ RR(GFX_ROW_INC); ++ RR(GFX_PIXEL_INC); ++ RR(GFX_WINDOW_SKIP); ++ RR(GFX_TABLE_BA); ++ ++ RR(DATA_CYCLE1); ++ RR(DATA_CYCLE2); ++ RR(DATA_CYCLE3); ++ ++ RR(CPR_COEF_R); ++ RR(CPR_COEF_G); ++ RR(CPR_COEF_B); ++ ++ RR(GFX_PRELOAD); ++ ++ /* VID1 */ ++ RR(VID_BA0(0)); ++ RR(VID_BA1(0)); ++ RR(VID_POSITION(0)); ++ RR(VID_SIZE(0)); ++ RR(VID_ATTRIBUTES(0)); ++ RR(VID_FIFO_THRESHOLD(0)); ++ RR(VID_ROW_INC(0)); ++ RR(VID_PIXEL_INC(0)); ++ RR(VID_FIR(0)); ++ RR(VID_PICTURE_SIZE(0)); ++ RR(VID_ACCU0(0)); ++ RR(VID_ACCU1(0)); ++ ++ RR(VID_FIR_COEF_H(0, 0)); ++ RR(VID_FIR_COEF_H(0, 1)); ++ RR(VID_FIR_COEF_H(0, 2)); ++ RR(VID_FIR_COEF_H(0, 3)); ++ RR(VID_FIR_COEF_H(0, 4)); ++ RR(VID_FIR_COEF_H(0, 5)); ++ RR(VID_FIR_COEF_H(0, 6)); ++ RR(VID_FIR_COEF_H(0, 7)); ++ ++ RR(VID_FIR_COEF_HV(0, 0)); ++ RR(VID_FIR_COEF_HV(0, 1)); ++ RR(VID_FIR_COEF_HV(0, 2)); ++ RR(VID_FIR_COEF_HV(0, 3)); ++ RR(VID_FIR_COEF_HV(0, 4)); ++ RR(VID_FIR_COEF_HV(0, 5)); ++ RR(VID_FIR_COEF_HV(0, 6)); ++ RR(VID_FIR_COEF_HV(0, 7)); ++ ++ RR(VID_CONV_COEF(0, 0)); ++ RR(VID_CONV_COEF(0, 1)); ++ RR(VID_CONV_COEF(0, 2)); ++ RR(VID_CONV_COEF(0, 3)); ++ RR(VID_CONV_COEF(0, 4)); ++ ++ RR(VID_FIR_COEF_V(0, 0)); ++ RR(VID_FIR_COEF_V(0, 1)); ++ RR(VID_FIR_COEF_V(0, 2)); ++ RR(VID_FIR_COEF_V(0, 3)); ++ RR(VID_FIR_COEF_V(0, 4)); ++ RR(VID_FIR_COEF_V(0, 5)); ++ RR(VID_FIR_COEF_V(0, 6)); ++ RR(VID_FIR_COEF_V(0, 7)); ++ ++ RR(VID_PRELOAD(0)); ++ ++ /* VID2 */ ++ RR(VID_BA0(1)); ++ RR(VID_BA1(1)); ++ RR(VID_POSITION(1)); ++ RR(VID_SIZE(1)); ++ RR(VID_ATTRIBUTES(1)); ++ RR(VID_FIFO_THRESHOLD(1)); ++ RR(VID_ROW_INC(1)); ++ RR(VID_PIXEL_INC(1)); ++ RR(VID_FIR(1)); ++ RR(VID_PICTURE_SIZE(1)); ++ RR(VID_ACCU0(1)); ++ RR(VID_ACCU1(1)); ++ ++ RR(VID_FIR_COEF_H(1, 0)); ++ RR(VID_FIR_COEF_H(1, 1)); ++ RR(VID_FIR_COEF_H(1, 2)); ++ RR(VID_FIR_COEF_H(1, 3)); ++ RR(VID_FIR_COEF_H(1, 4)); ++ RR(VID_FIR_COEF_H(1, 5)); ++ RR(VID_FIR_COEF_H(1, 6)); ++ RR(VID_FIR_COEF_H(1, 7)); ++ ++ RR(VID_FIR_COEF_HV(1, 0)); ++ RR(VID_FIR_COEF_HV(1, 1)); ++ RR(VID_FIR_COEF_HV(1, 2)); ++ RR(VID_FIR_COEF_HV(1, 3)); ++ RR(VID_FIR_COEF_HV(1, 4)); ++ RR(VID_FIR_COEF_HV(1, 5)); ++ RR(VID_FIR_COEF_HV(1, 6)); ++ RR(VID_FIR_COEF_HV(1, 7)); ++ ++ RR(VID_CONV_COEF(1, 0)); ++ RR(VID_CONV_COEF(1, 1)); ++ RR(VID_CONV_COEF(1, 2)); ++ RR(VID_CONV_COEF(1, 3)); ++ RR(VID_CONV_COEF(1, 4)); ++ ++ RR(VID_FIR_COEF_V(1, 0)); ++ RR(VID_FIR_COEF_V(1, 1)); ++ RR(VID_FIR_COEF_V(1, 2)); ++ RR(VID_FIR_COEF_V(1, 3)); ++ RR(VID_FIR_COEF_V(1, 4)); ++ RR(VID_FIR_COEF_V(1, 5)); ++ RR(VID_FIR_COEF_V(1, 6)); ++ RR(VID_FIR_COEF_V(1, 7)); ++ ++ RR(VID_PRELOAD(1)); ++ ++ /* enable last, because LCD & DIGIT enable are here */ ++ RR(CONTROL); ++} ++ ++#undef SR ++#undef RR ++ ++static inline void enable_clocks(bool enable) ++{ ++ if (enable) ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ else ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++} ++ ++void dispc_go(enum omap_channel channel) ++{ ++ int bit; ++ unsigned long tmo; ++ ++ enable_clocks(1); ++ ++ if (channel == OMAP_DSS_CHANNEL_LCD) ++ bit = 0; /* LCDENABLE */ ++ else ++ bit = 1; /* DIGITALENABLE */ ++ ++ /* if the channel is not enabled, we don't need GO */ ++ if (REG_GET(DISPC_CONTROL, bit, bit) == 0) ++ goto end; ++ ++ if (channel == OMAP_DSS_CHANNEL_LCD) ++ bit = 5; /* GOLCD */ ++ else ++ bit = 6; /* GODIGIT */ ++ ++ tmo = jiffies + msecs_to_jiffies(200); ++ while (REG_GET(DISPC_CONTROL, bit, bit) == 1) { ++ if (time_after(jiffies, tmo)) { ++ DSSERR("timeout waiting GO flag\n"); ++ goto end; ++ } ++ cpu_relax(); ++ } ++ ++ DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : "DIGIT"); ++ ++ REG_FLD_MOD(DISPC_CONTROL, 1, bit, bit); ++end: ++ enable_clocks(0); ++} ++ ++static void _dispc_write_firh_reg(enum omap_plane plane, int reg, u32 value) ++{ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ dispc_write_reg(DISPC_VID_FIR_COEF_H(plane-1, reg), value); ++} ++ ++static void _dispc_write_firhv_reg(enum omap_plane plane, int reg, u32 value) ++{ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ dispc_write_reg(DISPC_VID_FIR_COEF_HV(plane-1, reg), value); ++} ++ ++static void _dispc_write_firv_reg(enum omap_plane plane, int reg, u32 value) ++{ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ dispc_write_reg(DISPC_VID_FIR_COEF_V(plane-1, reg), value); ++} ++ ++static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, ++ int vscaleup, int five_taps) ++{ ++ /* Coefficients for horizontal up-sampling */ ++ static const u32 coef_hup[8] = { ++ 0x00800000, ++ 0x0D7CF800, ++ 0x1E70F5FF, ++ 0x335FF5FE, ++ 0xF74949F7, ++ 0xF55F33FB, ++ 0xF5701EFE, ++ 0xF87C0DFF, ++ }; ++ ++ /* Coefficients for horizontal down-sampling */ ++ static const u32 coef_hdown[8] = { ++ 0x24382400, ++ 0x28371FFE, ++ 0x2C361BFB, ++ 0x303516F9, ++ 0x11343311, ++ 0x1635300C, ++ 0x1B362C08, ++ 0x1F372804, ++ }; ++ ++ /* Coefficients for horizontal and vertical up-sampling */ ++ static const u32 coef_hvup[2][8] = { ++ { ++ 0x00800000, ++ 0x037B02FF, ++ 0x0C6F05FE, ++ 0x205907FB, ++ 0x00404000, ++ 0x075920FE, ++ 0x056F0CFF, ++ 0x027B0300, ++ }, ++ { ++ 0x00800000, ++ 0x0D7CF8FF, ++ 0x1E70F5FE, ++ 0x335FF5FB, ++ 0xF7404000, ++ 0xF55F33FE, ++ 0xF5701EFF, ++ 0xF87C0D00, ++ }, ++ }; ++ ++ /* Coefficients for horizontal and vertical down-sampling */ ++ static const u32 coef_hvdown[2][8] = { ++ { ++ 0x24382400, ++ 0x28391F04, ++ 0x2D381B08, ++ 0x3237170C, ++ 0x123737F7, ++ 0x173732F9, ++ 0x1B382DFB, ++ 0x1F3928FE, ++ }, ++ { ++ 0x24382400, ++ 0x28371F04, ++ 0x2C361B08, ++ 0x3035160C, ++ 0x113433F7, ++ 0x163530F9, ++ 0x1B362CFB, ++ 0x1F3728FE, ++ }, ++ }; ++ ++ /* Coefficients for vertical up-sampling */ ++ static const u32 coef_vup[8] = { ++ 0x00000000, ++ 0x0000FF00, ++ 0x0000FEFF, ++ 0x0000FBFE, ++ 0x000000F7, ++ 0x0000FEFB, ++ 0x0000FFFE, ++ 0x000000FF, ++ }; ++ ++ ++ /* Coefficients for vertical down-sampling */ ++ static const u32 coef_vdown[8] = { ++ 0x00000000, ++ 0x000004FE, ++ 0x000008FB, ++ 0x00000CF9, ++ 0x0000F711, ++ 0x0000F90C, ++ 0x0000FB08, ++ 0x0000FE04, ++ }; ++ ++ const u32 *h_coef; ++ const u32 *hv_coef; ++ const u32 *hv_coef_mod; ++ const u32 *v_coef; ++ int i; ++ ++ if (hscaleup) ++ h_coef = coef_hup; ++ else ++ h_coef = coef_hdown; ++ ++ if (vscaleup) { ++ hv_coef = coef_hvup[five_taps]; ++ v_coef = coef_vup; ++ ++ if (hscaleup) ++ hv_coef_mod = NULL; ++ else ++ hv_coef_mod = coef_hvdown[five_taps]; ++ } else { ++ hv_coef = coef_hvdown[five_taps]; ++ v_coef = coef_vdown; ++ ++ if (hscaleup) ++ hv_coef_mod = coef_hvup[five_taps]; ++ else ++ hv_coef_mod = NULL; ++ } ++ ++ for (i = 0; i < 8; i++) { ++ u32 h, hv; ++ ++ h = h_coef[i]; ++ ++ hv = hv_coef[i]; ++ ++ if (hv_coef_mod) { ++ hv &= 0xffffff00; ++ hv |= (hv_coef_mod[i] & 0xff); ++ } ++ ++ _dispc_write_firh_reg(plane, i, h); ++ _dispc_write_firhv_reg(plane, i, hv); ++ } ++ ++ if (!five_taps) ++ return; ++ ++ for (i = 0; i < 8; i++) { ++ u32 v; ++ v = v_coef[i]; ++ _dispc_write_firv_reg(plane, i, v); ++ } ++} ++ ++static void _dispc_setup_color_conv_coef(void) ++{ ++ const struct color_conv_coef { ++ int ry, rcr, rcb, gy, gcr, gcb, by, bcr, bcb; ++ int full_range; ++ } ctbl_bt601_5 = { ++ 298, 409, 0, 298, -208, -100, 298, 0, 517, 0, ++ }; ++ ++ const struct color_conv_coef *ct; ++ ++#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0)) ++ ++ ct = &ctbl_bt601_5; ++ ++ dispc_write_reg(DISPC_VID_CONV_COEF(0, 0), CVAL(ct->rcr, ct->ry)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(0, 1), CVAL(ct->gy, ct->rcb)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(0, 2), CVAL(ct->gcb, ct->gcr)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(0, 3), CVAL(ct->bcr, ct->by)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(0, 4), CVAL(0, ct->bcb)); ++ ++ dispc_write_reg(DISPC_VID_CONV_COEF(1, 0), CVAL(ct->rcr, ct->ry)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(1, 1), CVAL(ct->gy, ct->rcb)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(1, 2), CVAL(ct->gcb, ct->gcr)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(1, 3), CVAL(ct->bcr, ct->by)); ++ dispc_write_reg(DISPC_VID_CONV_COEF(1, 4), CVAL(0, ct->bcb)); ++ ++#undef CVAL ++ ++ REG_FLD_MOD(DISPC_VID_ATTRIBUTES(0), ct->full_range, 11, 11); ++ REG_FLD_MOD(DISPC_VID_ATTRIBUTES(1), ct->full_range, 11, 11); ++} ++ ++ ++static void _dispc_set_plane_ba0(enum omap_plane plane, u32 paddr) ++{ ++ const struct dispc_reg ba0_reg[] = { DISPC_GFX_BA0, ++ DISPC_VID_BA0(0), ++ DISPC_VID_BA0(1) }; ++ ++ dispc_write_reg(ba0_reg[plane], paddr); ++} ++ ++static void _dispc_set_plane_ba1(enum omap_plane plane, u32 paddr) ++{ ++ const struct dispc_reg ba1_reg[] = { DISPC_GFX_BA1, ++ DISPC_VID_BA1(0), ++ DISPC_VID_BA1(1) }; ++ ++ dispc_write_reg(ba1_reg[plane], paddr); ++} ++ ++static void _dispc_set_plane_pos(enum omap_plane plane, int x, int y) ++{ ++ const struct dispc_reg pos_reg[] = { DISPC_GFX_POSITION, ++ DISPC_VID_POSITION(0), ++ DISPC_VID_POSITION(1) }; ++ ++ u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0); ++ dispc_write_reg(pos_reg[plane], val); ++} ++ ++static void _dispc_set_pic_size(enum omap_plane plane, int width, int height) ++{ ++ const struct dispc_reg siz_reg[] = { DISPC_GFX_SIZE, ++ DISPC_VID_PICTURE_SIZE(0), ++ DISPC_VID_PICTURE_SIZE(1) }; ++ u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); ++ dispc_write_reg(siz_reg[plane], val); ++} ++ ++static void _dispc_set_vid_size(enum omap_plane plane, int width, int height) ++{ ++ u32 val; ++ const struct dispc_reg vsi_reg[] = { DISPC_VID_SIZE(0), ++ DISPC_VID_SIZE(1) }; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); ++ dispc_write_reg(vsi_reg[plane-1], val); ++} ++ ++static void _dispc_set_pix_inc(enum omap_plane plane, u16 inc) ++{ ++ const struct dispc_reg ri_reg[] = { DISPC_GFX_PIXEL_INC, ++ DISPC_VID_PIXEL_INC(0), ++ DISPC_VID_PIXEL_INC(1) }; ++ ++ dispc_write_reg(ri_reg[plane], inc); ++} ++ ++static void _dispc_set_row_inc(enum omap_plane plane, u16 inc) ++{ ++ const struct dispc_reg ri_reg[] = { DISPC_GFX_ROW_INC, ++ DISPC_VID_ROW_INC(0), ++ DISPC_VID_ROW_INC(1) }; ++ ++ dispc_write_reg(ri_reg[plane], inc); ++} ++ ++static void _dispc_set_color_mode(enum omap_plane plane, ++ enum omap_color_mode color_mode) ++{ ++ u32 m = 0; ++ ++ switch (color_mode) { ++ case OMAP_DSS_COLOR_CLUT1: ++ m = 0x0; break; ++ case OMAP_DSS_COLOR_CLUT2: ++ m = 0x1; break; ++ case OMAP_DSS_COLOR_CLUT4: ++ m = 0x2; break; ++ case OMAP_DSS_COLOR_CLUT8: ++ m = 0x3; break; ++ case OMAP_DSS_COLOR_RGB12U: ++ m = 0x4; break; ++ case OMAP_DSS_COLOR_ARGB16: ++ m = 0x5; break; ++ case OMAP_DSS_COLOR_RGB16: ++ m = 0x6; break; ++ case OMAP_DSS_COLOR_RGB24U: ++ m = 0x8; break; ++ case OMAP_DSS_COLOR_RGB24P: ++ m = 0x9; break; ++ case OMAP_DSS_COLOR_YUV2: ++ m = 0xa; break; ++ case OMAP_DSS_COLOR_UYVY: ++ m = 0xb; break; ++ case OMAP_DSS_COLOR_ARGB32: ++ m = 0xc; break; ++ case OMAP_DSS_COLOR_RGBA32: ++ m = 0xd; break; ++ case OMAP_DSS_COLOR_RGBX32: ++ m = 0xe; break; ++ default: ++ BUG(); break; ++ } ++ ++ REG_FLD_MOD(dispc_reg_att[plane], m, 4, 1); ++} ++ ++static void _dispc_set_channel_out(enum omap_plane plane, ++ enum omap_channel channel) ++{ ++ int shift; ++ u32 val; ++ ++ switch (plane) { ++ case OMAP_DSS_GFX: ++ shift = 8; ++ break; ++ case OMAP_DSS_VIDEO1: ++ case OMAP_DSS_VIDEO2: ++ shift = 16; ++ break; ++ default: ++ BUG(); ++ return; ++ } ++ ++ val = dispc_read_reg(dispc_reg_att[plane]); ++ val = FLD_MOD(val, channel, shift, shift); ++ dispc_write_reg(dispc_reg_att[plane], val); ++} ++ ++void dispc_set_burst_size(enum omap_plane plane, ++ enum omap_burst_size burst_size) ++{ ++ int shift; ++ u32 val; ++ ++ enable_clocks(1); ++ ++ switch (plane) { ++ case OMAP_DSS_GFX: ++ shift = 6; ++ break; ++ case OMAP_DSS_VIDEO1: ++ case OMAP_DSS_VIDEO2: ++ shift = 14; ++ break; ++ default: ++ BUG(); ++ return; ++ } ++ ++ val = dispc_read_reg(dispc_reg_att[plane]); ++ val = FLD_MOD(val, burst_size, shift+1, shift); ++ dispc_write_reg(dispc_reg_att[plane], val); ++ ++ enable_clocks(0); ++} ++ ++static void _dispc_set_vid_color_conv(enum omap_plane plane, bool enable) ++{ ++ u32 val; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ val = dispc_read_reg(dispc_reg_att[plane]); ++ val = FLD_MOD(val, enable, 9, 9); ++ dispc_write_reg(dispc_reg_att[plane], val); ++} ++ ++void dispc_set_lcd_size(u16 width, u16 height) ++{ ++ u32 val; ++ BUG_ON((width > (1 << 11)) || (height > (1 << 11))); ++ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); ++ enable_clocks(1); ++ dispc_write_reg(DISPC_SIZE_LCD, val); ++ enable_clocks(0); ++} ++ ++void dispc_set_digit_size(u16 width, u16 height) ++{ ++ u32 val; ++ BUG_ON((width > (1 << 11)) || (height > (1 << 11))); ++ val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); ++ enable_clocks(1); ++ dispc_write_reg(DISPC_SIZE_DIG, val); ++ enable_clocks(0); ++} ++ ++u32 dispc_get_plane_fifo_size(enum omap_plane plane) ++{ ++ const struct dispc_reg fsz_reg[] = { DISPC_GFX_FIFO_SIZE_STATUS, ++ DISPC_VID_FIFO_SIZE_STATUS(0), ++ DISPC_VID_FIFO_SIZE_STATUS(1) }; ++ u32 size; ++ ++ enable_clocks(1); ++ ++ if (cpu_is_omap24xx()) ++ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0); ++ else if (cpu_is_omap34xx()) ++ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0); ++ else ++ BUG(); ++ ++ if (cpu_is_omap34xx()) { ++ /* FIFOMERGE */ ++ if (REG_GET(DISPC_CONFIG, 14, 14)) ++ size *= 3; ++ } ++ ++ enable_clocks(0); ++ ++ return size; ++} ++ ++void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high) ++{ ++ const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD, ++ DISPC_VID_FIFO_THRESHOLD(0), ++ DISPC_VID_FIFO_THRESHOLD(1) }; ++ u32 size; ++ ++ enable_clocks(1); ++ ++ size = dispc_get_plane_fifo_size(plane); ++ ++ BUG_ON(low > size || high > size); ++ ++ DSSDBG("fifo(%d) size %d, low/high old %u/%u, new %u/%u\n", ++ plane, size, ++ REG_GET(ftrs_reg[plane], 11, 0), ++ REG_GET(ftrs_reg[plane], 27, 16), ++ low, high); ++ ++ if (cpu_is_omap24xx()) ++ dispc_write_reg(ftrs_reg[plane], ++ FLD_VAL(high, 24, 16) | FLD_VAL(low, 8, 0)); ++ else ++ dispc_write_reg(ftrs_reg[plane], ++ FLD_VAL(high, 27, 16) | FLD_VAL(low, 11, 0)); ++ ++ enable_clocks(0); ++} ++ ++void dispc_enable_fifomerge(bool enable) ++{ ++ enable_clocks(1); ++ ++ DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled"); ++ REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14); ++ ++ enable_clocks(0); ++} ++ ++static void _dispc_set_fir(enum omap_plane plane, int hinc, int vinc) ++{ ++ u32 val; ++ const struct dispc_reg fir_reg[] = { DISPC_VID_FIR(0), ++ DISPC_VID_FIR(1) }; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ val = FLD_VAL(vinc, 27, 16) | FLD_VAL(hinc, 11, 0); ++ dispc_write_reg(fir_reg[plane-1], val); ++} ++ ++static void _dispc_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu) ++{ ++ u32 val; ++ const struct dispc_reg ac0_reg[] = { DISPC_VID_ACCU0(0), ++ DISPC_VID_ACCU0(1) }; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); ++ dispc_write_reg(ac0_reg[plane-1], val); ++} ++ ++static void _dispc_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu) ++{ ++ u32 val; ++ const struct dispc_reg ac1_reg[] = { DISPC_VID_ACCU1(0), ++ DISPC_VID_ACCU1(1) }; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); ++ dispc_write_reg(ac1_reg[plane-1], val); ++} ++ ++ ++static void _dispc_set_scaling(enum omap_plane plane, ++ u16 orig_width, u16 orig_height, ++ u16 out_width, u16 out_height, ++ bool ilace) ++{ ++ int fir_hinc; ++ int fir_vinc; ++ int hscaleup, vscaleup, five_taps; ++ int fieldmode = 0; ++ int accu0 = 0; ++ int accu1 = 0; ++ u32 l; ++ ++ BUG_ON(plane == OMAP_DSS_GFX); ++ ++ hscaleup = orig_width <= out_width; ++ vscaleup = orig_height <= out_height; ++ five_taps = orig_height > out_height * 2; ++ ++ _dispc_set_scale_coef(plane, hscaleup, vscaleup, five_taps); ++ ++ if (!orig_width || orig_width == out_width) ++ fir_hinc = 0; ++ else ++ fir_hinc = 1024 * orig_width / out_width; ++ ++ if (!orig_height || orig_height == out_height) ++ fir_vinc = 0; ++ else ++ fir_vinc = 1024 * orig_height / out_height; ++ ++ _dispc_set_fir(plane, fir_hinc, fir_vinc); ++ ++ l = dispc_read_reg(dispc_reg_att[plane]); ++ l &= ~((0x0f << 5) | (0x3 << 21)); ++ ++ l |= fir_hinc ? (1 << 5) : 0; ++ l |= fir_vinc ? (1 << 6) : 0; ++ ++ l |= hscaleup ? 0 : (1 << 7); ++ l |= vscaleup ? 0 : (1 << 8); ++ ++ l |= five_taps ? (1 << 21) : 0; ++ l |= five_taps ? (1 << 22) : 0; ++ ++ dispc_write_reg(dispc_reg_att[plane], l); ++ ++ if (ilace) { ++ if (fieldmode) { ++ accu0 = fir_vinc / 2; ++ accu1 = 0; ++ } else { ++ accu0 = 0; ++ accu1 = fir_vinc / 2; ++ if (accu1 >= 1024/2) { ++ accu0 = 1024/2; ++ accu1 -= accu0; ++ } ++ } ++ } ++ ++ _dispc_set_vid_accu0(plane, 0, accu0); ++ _dispc_set_vid_accu1(plane, 0, accu1); ++} ++ ++static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation, ++ bool mirroring, enum omap_color_mode color_mode) ++{ ++ if (color_mode == OMAP_DSS_COLOR_YUV2 || ++ color_mode == OMAP_DSS_COLOR_UYVY) { ++ int vidrot = 0; ++ ++ if (mirroring) { ++ switch (rotation) { ++ case 0: vidrot = 2; break; ++ case 1: vidrot = 3; break; ++ case 2: vidrot = 0; break; ++ case 3: vidrot = 1; break; ++ } ++ } else { ++ switch (rotation) { ++ case 0: vidrot = 0; break; ++ case 1: vidrot = 1; break; ++ case 2: vidrot = 2; break; ++ case 3: vidrot = 1; break; ++ } ++ } ++ ++ REG_FLD_MOD(dispc_reg_att[plane], vidrot, 13, 12); ++ ++ if (rotation == 1 || rotation == 3) ++ REG_FLD_MOD(dispc_reg_att[plane], 0x1, 18, 18); ++ else ++ REG_FLD_MOD(dispc_reg_att[plane], 0x0, 18, 18); ++ } else { ++ REG_FLD_MOD(dispc_reg_att[plane], 0, 13, 12); ++ REG_FLD_MOD(dispc_reg_att[plane], 0, 18, 18); ++ } ++} ++ ++static int pixinc(int pixels, u8 ps) ++{ ++ if (pixels == 1) ++ return 1; ++ else if (pixels > 1) ++ return 1 + (pixels - 1) * ps; ++ else if (pixels < 0) ++ return 1 - (-pixels + 1) * ps; ++ else ++ BUG(); ++} ++ ++static void calc_rotation_offset(u8 rotation, bool mirror, ++ u16 screen_width, ++ u16 width, u16 height, ++ enum omap_color_mode color_mode, bool fieldmode, ++ unsigned *offset0, unsigned *offset1, ++ u16 *row_inc, u16 *pix_inc) ++{ ++ u8 ps; ++ u16 fbw, fbh; ++ ++ switch (color_mode) { ++ case OMAP_DSS_COLOR_RGB16: ++ case OMAP_DSS_COLOR_ARGB16: ++ ps = 2; ++ break; ++ ++ case OMAP_DSS_COLOR_RGB24P: ++ ps = 3; ++ break; ++ ++ case OMAP_DSS_COLOR_RGB24U: ++ case OMAP_DSS_COLOR_ARGB32: ++ case OMAP_DSS_COLOR_RGBA32: ++ case OMAP_DSS_COLOR_RGBX32: ++ ps = 4; ++ break; ++ ++ case OMAP_DSS_COLOR_YUV2: ++ case OMAP_DSS_COLOR_UYVY: ++ ps = 2; ++ break; ++ default: ++ BUG(); ++ return; ++ } ++ ++ DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, ++ width, height); ++ ++ /* width & height are overlay sizes, convert to fb sizes */ ++ ++ if (rotation == 0 || rotation == 2) { ++ fbw = width; ++ fbh = height; ++ } else { ++ fbw = height; ++ fbh = width; ++ } ++ ++ switch (rotation + mirror * 4) { ++ case 0: ++ *offset0 = 0; ++ if (fieldmode) ++ *offset1 = screen_width * ps; ++ else ++ *offset1 = 0; ++ *row_inc = pixinc(1 + (screen_width - fbw) + ++ (fieldmode ? screen_width : 0), ++ ps); ++ *pix_inc = pixinc(1, ps); ++ break; ++ case 1: ++ *offset0 = screen_width * (fbh - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 + ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(screen_width * (fbh - 1) + 1 + ++ (fieldmode ? 1 : 0), ps); ++ *pix_inc = pixinc(-screen_width, ps); ++ break; ++ case 2: ++ *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 - screen_width * ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(-1 - ++ (screen_width - fbw) - ++ (fieldmode ? screen_width : 0), ++ ps); ++ *pix_inc = pixinc(-1, ps); ++ break; ++ case 3: ++ *offset0 = (fbw - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 - ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(-screen_width * (fbh - 1) - 1 - ++ (fieldmode ? 1 : 0), ps); ++ *pix_inc = pixinc(screen_width, ps); ++ break; ++ ++ /* mirroring */ ++ case 0 + 4: ++ *offset0 = (fbw - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 + screen_width * ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(screen_width * 2 - 1 + ++ (fieldmode ? screen_width : 0), ++ ps); ++ *pix_inc = pixinc(-1, ps); ++ break; ++ ++ case 1 + 4: ++ *offset0 = 0; ++ if (fieldmode) ++ *offset1 = *offset0 + screen_width * ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(-screen_width * (fbh - 1) + 1 + ++ (fieldmode ? 1 : 0), ++ ps); ++ *pix_inc = pixinc(screen_width, ps); ++ break; ++ ++ case 2 + 4: ++ *offset0 = screen_width * (fbh - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 + screen_width * ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(1 - screen_width * 2 - ++ (fieldmode ? screen_width : 0), ++ ps); ++ *pix_inc = pixinc(1, ps); ++ break; ++ ++ case 3 + 4: ++ *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; ++ if (fieldmode) ++ *offset1 = *offset0 + screen_width * ps; ++ else ++ *offset1 = *offset0; ++ *row_inc = pixinc(screen_width * (fbh - 1) - 1 - ++ (fieldmode ? 1 : 0), ++ ps); ++ *pix_inc = pixinc(-screen_width, ps); ++ break; ++ ++ default: ++ BUG(); ++ } ++} ++ ++static int _dispc_setup_plane(enum omap_plane plane, ++ enum omap_channel channel_out, ++ u32 paddr, u16 screen_width, ++ u16 pos_x, u16 pos_y, ++ u16 width, u16 height, ++ u16 out_width, u16 out_height, ++ enum omap_color_mode color_mode, ++ bool ilace, ++ u8 rotation, int mirror) ++{ ++ const int maxdownscale = cpu_is_omap34xx() ? 4 : 2; ++ bool five_taps = height > out_height * 2; ++ bool fieldmode = 0; ++ int cconv = 0; ++ unsigned offset0, offset1; ++ u16 row_inc; ++ u16 pix_inc; ++ ++ if (plane == OMAP_DSS_GFX) { ++ if (width != out_width || height != out_height) ++ return -EINVAL; ++ ++ switch (color_mode) { ++ case OMAP_DSS_COLOR_ARGB16: ++ case OMAP_DSS_COLOR_RGB16: ++ case OMAP_DSS_COLOR_RGB24P: ++ case OMAP_DSS_COLOR_RGB24U: ++ case OMAP_DSS_COLOR_ARGB32: ++ case OMAP_DSS_COLOR_RGBA32: ++ case OMAP_DSS_COLOR_RGBX32: ++ break; ++ ++ default: ++ return -EINVAL; ++ } ++ } else { ++ /* video plane */ ++ if (width > (2048 >> five_taps)) ++ return -EINVAL; ++ ++ if (out_width < width / maxdownscale || ++ out_width > width * 8) ++ return -EINVAL; ++ ++ if (out_height < height / maxdownscale || ++ out_height > height * 8) ++ return -EINVAL; ++ ++ switch (color_mode) { ++ case OMAP_DSS_COLOR_RGB16: ++ case OMAP_DSS_COLOR_RGB24P: ++ case OMAP_DSS_COLOR_RGB24U: ++ case OMAP_DSS_COLOR_RGBX32: ++ break; ++ ++ case OMAP_DSS_COLOR_ARGB16: ++ case OMAP_DSS_COLOR_ARGB32: ++ case OMAP_DSS_COLOR_RGBA32: ++ if (plane == OMAP_DSS_VIDEO1) ++ return -EINVAL; ++ break; ++ ++ case OMAP_DSS_COLOR_YUV2: ++ case OMAP_DSS_COLOR_UYVY: ++ cconv = 1; ++ break; ++ ++ default: ++ return -EINVAL; ++ } ++ } ++ ++ if (ilace && height >= out_height) ++ fieldmode = 1; ++ ++ calc_rotation_offset(rotation, mirror, ++ screen_width, width, height, color_mode, ++ fieldmode, ++ &offset0, &offset1, &row_inc, &pix_inc); ++ ++ DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", ++ offset0, offset1, row_inc, pix_inc); ++ ++ if (ilace) { ++ if (fieldmode) ++ height /= 2; ++ pos_y /= 2; ++ out_height /= 2; ++ ++ DSSDBG("adjusting for ilace: height %d, pos_y %d, " ++ "out_height %d\n", ++ height, pos_y, out_height); ++ } ++ ++ _dispc_set_channel_out(plane, channel_out); ++ _dispc_set_color_mode(plane, color_mode); ++ ++ _dispc_set_plane_ba0(plane, paddr + offset0); ++ _dispc_set_plane_ba1(plane, paddr + offset1); ++ ++ _dispc_set_row_inc(plane, row_inc); ++ _dispc_set_pix_inc(plane, pix_inc); ++ ++ DSSDBG("%d,%d %dx%d -> %dx%d\n", pos_x, pos_y, width, height, ++ out_width, out_height); ++ ++ _dispc_set_plane_pos(plane, pos_x, pos_y); ++ ++ _dispc_set_pic_size(plane, width, height); ++ ++ if (plane != OMAP_DSS_GFX) { ++ _dispc_set_scaling(plane, width, height, ++ out_width, out_height, ++ ilace); ++ _dispc_set_vid_size(plane, out_width, out_height); ++ _dispc_set_vid_color_conv(plane, cconv); ++ } ++ ++ _dispc_set_rotation_attrs(plane, rotation, mirror, color_mode); ++ ++ return 0; ++} ++ ++static void _dispc_enable_plane(enum omap_plane plane, bool enable) ++{ ++ REG_FLD_MOD(dispc_reg_att[plane], enable ? 1 : 0, 0, 0); ++} ++ ++static void dispc_disable_isr(void *data, u32 mask) ++{ ++ struct completion *compl = data; ++ complete(compl); ++} ++ ++static void _enable_lcd_out(bool enable) ++{ ++ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0); ++} ++ ++void dispc_enable_lcd_out(bool enable) ++{ ++ struct completion frame_done_completion; ++ bool is_on; ++ int r; ++ ++ enable_clocks(1); ++ ++ /* When we disable LCD output, we need to wait until frame is done. ++ * Otherwise the DSS is still working, and turning off the clocks ++ * prevents DSS from going to OFF mode */ ++ is_on = REG_GET(DISPC_CONTROL, 0, 0); ++ ++ if (!enable && is_on) { ++ init_completion(&frame_done_completion); ++ ++ r = omap_dispc_register_isr(dispc_disable_isr, ++ &frame_done_completion, ++ DISPC_IRQ_FRAMEDONE); ++ ++ if (r) ++ DSSERR("failed to register FRAMEDONE isr\n"); ++ } ++ ++ _enable_lcd_out(enable); ++ ++ if (!enable && is_on) { ++ if (!wait_for_completion_timeout(&frame_done_completion, ++ msecs_to_jiffies(100))) ++ DSSERR("timeout waiting for FRAME DONE\n"); ++ ++ r = omap_dispc_unregister_isr(dispc_disable_isr, ++ &frame_done_completion, ++ DISPC_IRQ_FRAMEDONE); ++ ++ if (r) ++ DSSERR("failed to unregister FRAMEDONE isr\n"); ++ } ++ ++ enable_clocks(0); ++} ++ ++static void _enable_digit_out(bool enable) ++{ ++ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1); ++} ++ ++void dispc_enable_digit_out(bool enable) ++{ ++ struct completion frame_done_completion; ++ int r; ++ ++ enable_clocks(1); ++ ++ if (REG_GET(DISPC_CONTROL, 1, 1) == enable) { ++ enable_clocks(0); ++ return; ++ } ++ ++ if (enable) { ++ /* When we enable digit output, we'll get an extra digit ++ * sync lost interrupt, that we need to ignore */ ++ dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT; ++ omap_dispc_set_irqs(); ++ } ++ ++ /* When we disable digit output, we need to wait until fields are done. ++ * Otherwise the DSS is still working, and turning off the clocks ++ * prevents DSS from going to OFF mode. And when enabling, we need to ++ * wait for the extra sync losts */ ++ init_completion(&frame_done_completion); ++ ++ r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion, ++ DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD); ++ if (r) ++ DSSERR("failed to register EVSYNC isr\n"); ++ ++ _enable_digit_out(enable); ++ ++ /* XXX I understand from TRM that we should only wait for the ++ * current field to complete. But it seems we have to wait ++ * for both fields */ ++ if (!wait_for_completion_timeout(&frame_done_completion, ++ msecs_to_jiffies(100))) ++ DSSERR("timeout waiting for EVSYNC\n"); ++ ++ if (!wait_for_completion_timeout(&frame_done_completion, ++ msecs_to_jiffies(100))) ++ DSSERR("timeout waiting for EVSYNC\n"); ++ ++ r = omap_dispc_unregister_isr(dispc_disable_isr, ++ &frame_done_completion, ++ DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD); ++ if (r) ++ DSSERR("failed to unregister EVSYNC isr\n"); ++ ++ if (enable) { ++ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; ++ dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); ++ omap_dispc_set_irqs(); ++ } ++ ++ enable_clocks(0); ++} ++ ++void dispc_lcd_enable_signal_polarity(bool act_high) ++{ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29); ++ enable_clocks(0); ++} ++ ++void dispc_lcd_enable_signal(bool enable) ++{ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28); ++ enable_clocks(0); ++} ++ ++void dispc_pck_free_enable(bool enable) ++{ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27); ++ enable_clocks(0); ++} ++ ++void dispc_enable_fifohandcheck(bool enable) ++{ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16); ++ enable_clocks(0); ++} ++ ++ ++void dispc_set_lcd_display_type(enum omap_lcd_display_type type) ++{ ++ int mode; ++ ++ switch (type) { ++ case OMAP_DSS_LCD_DISPLAY_STN: ++ mode = 0; ++ break; ++ ++ case OMAP_DSS_LCD_DISPLAY_TFT: ++ mode = 1; ++ break; ++ ++ default: ++ BUG(); ++ return; ++ } ++ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3); ++ enable_clocks(0); ++} ++ ++void dispc_set_loadmode(enum omap_dss_load_mode mode) ++{ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1); ++ enable_clocks(0); ++} ++ ++ ++void dispc_set_default_color(enum omap_channel channel, u32 color) ++{ ++ const struct dispc_reg def_reg[] = { DISPC_DEFAULT_COLOR0, ++ DISPC_DEFAULT_COLOR1 }; ++ ++ enable_clocks(1); ++ dispc_write_reg(def_reg[channel], color); ++ enable_clocks(0); ++} ++ ++u32 dispc_get_default_color(enum omap_channel channel) ++{ ++ const struct dispc_reg def_reg[] = { DISPC_DEFAULT_COLOR0, ++ DISPC_DEFAULT_COLOR1 }; ++ u32 l; ++ ++ BUG_ON(channel != OMAP_DSS_CHANNEL_DIGIT && ++ channel != OMAP_DSS_CHANNEL_LCD); ++ ++ enable_clocks(1); ++ l = dispc_read_reg(def_reg[channel]); ++ enable_clocks(0); ++ ++ return l; ++} ++ ++void dispc_set_trans_key(enum omap_channel ch, ++ enum omap_dss_color_key_type type, ++ u32 trans_key) ++{ ++ const struct dispc_reg tr_reg[] = { ++ DISPC_TRANS_COLOR0, DISPC_TRANS_COLOR1 }; ++ ++ enable_clocks(1); ++ if (ch == OMAP_DSS_CHANNEL_LCD) ++ REG_FLD_MOD(DISPC_CONFIG, type, 11, 11); ++ else /* OMAP_DSS_CHANNEL_DIGIT */ ++ REG_FLD_MOD(DISPC_CONFIG, type, 13, 13); ++ ++ dispc_write_reg(tr_reg[ch], trans_key); ++ enable_clocks(0); ++} ++ ++void dispc_get_trans_key(enum omap_channel ch, ++ enum omap_dss_color_key_type *type, ++ u32 *trans_key) ++{ ++ const struct dispc_reg tr_reg[] = { ++ DISPC_TRANS_COLOR0, DISPC_TRANS_COLOR1 }; ++ ++ enable_clocks(1); ++ if (type) { ++ if (ch == OMAP_DSS_CHANNEL_LCD) ++ *type = REG_GET(DISPC_CONFIG, 11, 11) >> 11; ++ else if (ch == OMAP_DSS_CHANNEL_DIGIT) ++ *type = REG_GET(DISPC_CONFIG, 13, 13) >> 13; ++ else ++ BUG(); ++ } ++ ++ if (trans_key) ++ *trans_key = dispc_read_reg(tr_reg[ch]); ++ enable_clocks(0); ++} ++ ++void dispc_enable_trans_key(enum omap_channel ch, bool enable) ++{ ++ enable_clocks(1); ++ if (ch == OMAP_DSS_CHANNEL_LCD) ++ REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10); ++ else /* OMAP_DSS_CHANNEL_DIGIT */ ++ REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12); ++ enable_clocks(0); ++} ++ ++bool dispc_trans_key_enabled(enum omap_channel ch) ++{ ++ bool enabled; ++ ++ enable_clocks(1); ++ if (ch == OMAP_DSS_CHANNEL_LCD) ++ enabled = REG_GET(DISPC_CONFIG, 10, 10); ++ else if (ch == OMAP_DSS_CHANNEL_DIGIT) ++ enabled = REG_GET(DISPC_CONFIG, 12, 12); ++ else BUG(); ++ enable_clocks(0); ++ ++ return enabled; ++} ++ ++ ++void dispc_set_tft_data_lines(u8 data_lines) ++{ ++ int code; ++ ++ switch (data_lines) { ++ case 12: ++ code = 0; ++ break; ++ case 16: ++ code = 1; ++ break; ++ case 18: ++ code = 2; ++ break; ++ case 24: ++ code = 3; ++ break; ++ default: ++ BUG(); ++ return; ++ } ++ ++ enable_clocks(1); ++ REG_FLD_MOD(DISPC_CONTROL, code, 9, 8); ++ enable_clocks(0); ++} ++ ++void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode) ++{ ++ u32 l; ++ int stallmode; ++ int gpout0 = 1; ++ int gpout1; ++ ++ switch (mode) { ++ case OMAP_DSS_PARALLELMODE_BYPASS: ++ stallmode = 0; ++ gpout1 = 1; ++ break; ++ ++ case OMAP_DSS_PARALLELMODE_RFBI: ++ stallmode = 1; ++ gpout1 = 0; ++ break; ++ ++ case OMAP_DSS_PARALLELMODE_DSI: ++ stallmode = 1; ++ gpout1 = 1; ++ break; ++ ++ default: ++ BUG(); ++ return; ++ } ++ ++ enable_clocks(1); ++ ++ l = dispc_read_reg(DISPC_CONTROL); ++ ++ l = FLD_MOD(l, stallmode, 11, 11); ++ l = FLD_MOD(l, gpout0, 15, 15); ++ l = FLD_MOD(l, gpout1, 16, 16); ++ ++ dispc_write_reg(DISPC_CONTROL, l); ++ ++ enable_clocks(0); ++} ++ ++static void _dispc_set_lcd_timings(int hsw, int hfp, int hbp, ++ int vsw, int vfp, int vbp) ++{ ++ u32 timing_h, timing_v; ++ ++ if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { ++ BUG_ON(hsw < 1 || hsw > 64); ++ BUG_ON(hfp < 1 || hfp > 256); ++ BUG_ON(hbp < 1 || hbp > 256); ++ ++ BUG_ON(vsw < 1 || vsw > 64); ++ BUG_ON(vfp < 0 || vfp > 255); ++ BUG_ON(vbp < 0 || vbp > 255); ++ ++ timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) | ++ FLD_VAL(hbp-1, 27, 20); ++ ++ timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) | ++ FLD_VAL(vbp, 27, 20); ++ } else { ++ BUG_ON(hsw < 1 || hsw > 256); ++ BUG_ON(hfp < 1 || hfp > 4096); ++ BUG_ON(hbp < 1 || hbp > 4096); ++ ++ BUG_ON(vsw < 1 || vsw > 256); ++ BUG_ON(vfp < 0 || vfp > 4095); ++ BUG_ON(vbp < 0 || vbp > 4095); ++ ++ timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) | ++ FLD_VAL(hbp-1, 31, 20); ++ ++ timing_v = FLD_VAL(vsw-1, 7, 0) | FLD_VAL(vfp, 19, 8) | ++ FLD_VAL(vbp, 31, 20); ++ } ++ ++ enable_clocks(1); ++ dispc_write_reg(DISPC_TIMING_H, timing_h); ++ dispc_write_reg(DISPC_TIMING_V, timing_v); ++ enable_clocks(0); ++} ++ ++/* change name to mode? */ ++void dispc_set_lcd_timings(struct omap_video_timings *timings) ++{ ++ unsigned xtot, ytot; ++ unsigned long ht, vt; ++ ++ _dispc_set_lcd_timings(timings->hsw, timings->hfp, timings->hbp, ++ timings->vsw, timings->vfp, timings->vbp); ++ ++ dispc_set_lcd_size(timings->x_res, timings->y_res); ++ ++ xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp; ++ ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp; ++ ++ ht = (timings->pixel_clock * 1000) / xtot; ++ vt = (timings->pixel_clock * 1000) / xtot / ytot; ++ ++ DSSDBG("xres %u yres %u\n", timings->x_res, timings->y_res); ++ DSSDBG("pck %u\n", timings->pixel_clock); ++ DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", ++ timings->hsw, timings->hfp, timings->hbp, ++ timings->vsw, timings->vfp, timings->vbp); ++ ++ DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt); ++} ++ ++void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div) ++{ ++ BUG_ON(lck_div < 1); ++ BUG_ON(pck_div < 2); ++ ++ enable_clocks(1); ++ dispc_write_reg(DISPC_DIVISOR, ++ FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0)); ++ enable_clocks(0); ++} ++ ++static void dispc_get_lcd_divisor(int *lck_div, int *pck_div) ++{ ++ u32 l; ++ l = dispc_read_reg(DISPC_DIVISOR); ++ *lck_div = FLD_GET(l, 23, 16); ++ *pck_div = FLD_GET(l, 7, 0); ++} ++ ++unsigned long dispc_fclk_rate(void) ++{ ++ unsigned long r = 0; ++ ++ if (dss_get_dispc_clk_source() == 0) ++ r = dss_clk_get_rate(DSS_CLK_FCK1); ++ else ++#ifdef CONFIG_OMAP2_DSS_DSI ++ r = dsi_get_dsi1_pll_rate(); ++#else ++ BUG(); ++#endif ++ return r; ++} ++ ++unsigned long dispc_pclk_rate(void) ++{ ++ int lcd, pcd; ++ unsigned long r; ++ u32 l; ++ ++ l = dispc_read_reg(DISPC_DIVISOR); ++ ++ lcd = FLD_GET(l, 23, 16); ++ pcd = FLD_GET(l, 7, 0); ++ ++ r = dispc_fclk_rate(); ++ ++ return r / lcd / pcd; ++} ++ ++void dispc_dump_clocks(struct seq_file *s) ++{ ++ int lcd, pcd; ++ ++ enable_clocks(1); ++ ++ dispc_get_lcd_divisor(&lcd, &pcd); ++ ++ seq_printf(s, "- dispc -\n"); ++ ++ seq_printf(s, "dispc fclk source = %s\n", ++ dss_get_dispc_clk_source() == 0 ? ++ "dss1_alwon_fclk" : "dsi1_pll_fclk"); ++ ++ seq_printf(s, "pixel clk = %lu / %d / %d = %lu\n", ++ dispc_fclk_rate(), ++ lcd, pcd, ++ dispc_pclk_rate()); ++ ++ enable_clocks(0); ++} ++ ++void dispc_dump_regs(struct seq_file *s) ++{ ++#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dispc_read_reg(r)) ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ DUMPREG(DISPC_REVISION); ++ DUMPREG(DISPC_SYSCONFIG); ++ DUMPREG(DISPC_SYSSTATUS); ++ DUMPREG(DISPC_IRQSTATUS); ++ DUMPREG(DISPC_IRQENABLE); ++ DUMPREG(DISPC_CONTROL); ++ DUMPREG(DISPC_CONFIG); ++ DUMPREG(DISPC_CAPABLE); ++ DUMPREG(DISPC_DEFAULT_COLOR0); ++ DUMPREG(DISPC_DEFAULT_COLOR1); ++ DUMPREG(DISPC_TRANS_COLOR0); ++ DUMPREG(DISPC_TRANS_COLOR1); ++ DUMPREG(DISPC_LINE_STATUS); ++ DUMPREG(DISPC_LINE_NUMBER); ++ DUMPREG(DISPC_TIMING_H); ++ DUMPREG(DISPC_TIMING_V); ++ DUMPREG(DISPC_POL_FREQ); ++ DUMPREG(DISPC_DIVISOR); ++ DUMPREG(DISPC_GLOBAL_ALPHA); ++ DUMPREG(DISPC_SIZE_DIG); ++ DUMPREG(DISPC_SIZE_LCD); ++ ++ DUMPREG(DISPC_GFX_BA0); ++ DUMPREG(DISPC_GFX_BA1); ++ DUMPREG(DISPC_GFX_POSITION); ++ DUMPREG(DISPC_GFX_SIZE); ++ DUMPREG(DISPC_GFX_ATTRIBUTES); ++ DUMPREG(DISPC_GFX_FIFO_THRESHOLD); ++ DUMPREG(DISPC_GFX_FIFO_SIZE_STATUS); ++ DUMPREG(DISPC_GFX_ROW_INC); ++ DUMPREG(DISPC_GFX_PIXEL_INC); ++ DUMPREG(DISPC_GFX_WINDOW_SKIP); ++ DUMPREG(DISPC_GFX_TABLE_BA); ++ ++ DUMPREG(DISPC_DATA_CYCLE1); ++ DUMPREG(DISPC_DATA_CYCLE2); ++ DUMPREG(DISPC_DATA_CYCLE3); ++ ++ DUMPREG(DISPC_CPR_COEF_R); ++ DUMPREG(DISPC_CPR_COEF_G); ++ DUMPREG(DISPC_CPR_COEF_B); ++ ++ DUMPREG(DISPC_GFX_PRELOAD); ++ ++ DUMPREG(DISPC_VID_BA0(0)); ++ DUMPREG(DISPC_VID_BA1(0)); ++ DUMPREG(DISPC_VID_POSITION(0)); ++ DUMPREG(DISPC_VID_SIZE(0)); ++ DUMPREG(DISPC_VID_ATTRIBUTES(0)); ++ DUMPREG(DISPC_VID_FIFO_THRESHOLD(0)); ++ DUMPREG(DISPC_VID_FIFO_SIZE_STATUS(0)); ++ DUMPREG(DISPC_VID_ROW_INC(0)); ++ DUMPREG(DISPC_VID_PIXEL_INC(0)); ++ DUMPREG(DISPC_VID_FIR(0)); ++ DUMPREG(DISPC_VID_PICTURE_SIZE(0)); ++ DUMPREG(DISPC_VID_ACCU0(0)); ++ DUMPREG(DISPC_VID_ACCU1(0)); ++ ++ DUMPREG(DISPC_VID_BA0(1)); ++ DUMPREG(DISPC_VID_BA1(1)); ++ DUMPREG(DISPC_VID_POSITION(1)); ++ DUMPREG(DISPC_VID_SIZE(1)); ++ DUMPREG(DISPC_VID_ATTRIBUTES(1)); ++ DUMPREG(DISPC_VID_FIFO_THRESHOLD(1)); ++ DUMPREG(DISPC_VID_FIFO_SIZE_STATUS(1)); ++ DUMPREG(DISPC_VID_ROW_INC(1)); ++ DUMPREG(DISPC_VID_PIXEL_INC(1)); ++ DUMPREG(DISPC_VID_FIR(1)); ++ DUMPREG(DISPC_VID_PICTURE_SIZE(1)); ++ DUMPREG(DISPC_VID_ACCU0(1)); ++ DUMPREG(DISPC_VID_ACCU1(1)); ++ ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(0, 7)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(0, 7)); ++ DUMPREG(DISPC_VID_CONV_COEF(0, 0)); ++ DUMPREG(DISPC_VID_CONV_COEF(0, 1)); ++ DUMPREG(DISPC_VID_CONV_COEF(0, 2)); ++ DUMPREG(DISPC_VID_CONV_COEF(0, 3)); ++ DUMPREG(DISPC_VID_CONV_COEF(0, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(0, 7)); ++ ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_H(1, 7)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_HV(1, 7)); ++ DUMPREG(DISPC_VID_CONV_COEF(1, 0)); ++ DUMPREG(DISPC_VID_CONV_COEF(1, 1)); ++ DUMPREG(DISPC_VID_CONV_COEF(1, 2)); ++ DUMPREG(DISPC_VID_CONV_COEF(1, 3)); ++ DUMPREG(DISPC_VID_CONV_COEF(1, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 0)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 1)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 2)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 3)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 4)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 5)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 6)); ++ DUMPREG(DISPC_VID_FIR_COEF_V(1, 7)); ++ ++ DUMPREG(DISPC_VID_PRELOAD(0)); ++ DUMPREG(DISPC_VID_PRELOAD(1)); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++#undef DUMPREG ++} ++ ++static void _dispc_set_pol_freq(bool onoff, bool rf, bool ieo, bool ipc, ++ bool ihs, bool ivs, u8 acbi, u8 acb) ++{ ++ u32 l = 0; ++ ++ DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n", ++ onoff, rf, ieo, ipc, ihs, ivs, acbi, acb); ++ ++ l |= FLD_VAL(onoff, 17, 17); ++ l |= FLD_VAL(rf, 16, 16); ++ l |= FLD_VAL(ieo, 15, 15); ++ l |= FLD_VAL(ipc, 14, 14); ++ l |= FLD_VAL(ihs, 13, 13); ++ l |= FLD_VAL(ivs, 12, 12); ++ l |= FLD_VAL(acbi, 11, 8); ++ l |= FLD_VAL(acb, 7, 0); ++ ++ enable_clocks(1); ++ dispc_write_reg(DISPC_POL_FREQ, l); ++ enable_clocks(0); ++} ++ ++void dispc_set_pol_freq(struct omap_panel *panel) ++{ ++ _dispc_set_pol_freq((panel->config & OMAP_DSS_LCD_ONOFF) != 0, ++ (panel->config & OMAP_DSS_LCD_RF) != 0, ++ (panel->config & OMAP_DSS_LCD_IEO) != 0, ++ (panel->config & OMAP_DSS_LCD_IPC) != 0, ++ (panel->config & OMAP_DSS_LCD_IHS) != 0, ++ (panel->config & OMAP_DSS_LCD_IVS) != 0, ++ panel->acbi, panel->acb); ++} ++ ++void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck, ++ u16 *lck_div, u16 *pck_div) ++{ ++ u16 pcd_min = is_tft ? 2 : 3; ++ unsigned long best_pck; ++ u16 best_ld, cur_ld; ++ u16 best_pd, cur_pd; ++ ++ best_pck = 0; ++ best_ld = 0; ++ best_pd = 0; ++ ++ for (cur_ld = 1; cur_ld <= 255; ++cur_ld) { ++ unsigned long lck = fck / cur_ld; ++ ++ for (cur_pd = pcd_min; cur_pd <= 255; ++cur_pd) { ++ unsigned long pck = lck / cur_pd; ++ long old_delta = abs(best_pck - req_pck); ++ long new_delta = abs(pck - req_pck); ++ ++ if (best_pck == 0 || new_delta < old_delta) { ++ best_pck = pck; ++ best_ld = cur_ld; ++ best_pd = cur_pd; ++ ++ if (pck == req_pck) ++ goto found; ++ } ++ ++ if (pck < req_pck) ++ break; ++ } ++ ++ if (lck / pcd_min < req_pck) ++ break; ++ } ++ ++found: ++ *lck_div = best_ld; ++ *pck_div = best_pd; ++} ++ ++int dispc_calc_clock_div(bool is_tft, unsigned long req_pck, ++ struct dispc_clock_info *cinfo) ++{ ++ unsigned long prate; ++ struct dispc_clock_info cur, best; ++ int match = 0; ++ int min_fck_per_pck; ++ unsigned long fck_rate = dss_clk_get_rate(DSS_CLK_FCK1); ++ ++ if (cpu_is_omap34xx()) ++ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); ++ else ++ prate = 0; ++ ++ if (req_pck == dispc.cache_req_pck && ++ ((cpu_is_omap34xx() && prate == dispc.cache_prate) || ++ dispc.cache_cinfo.fck == fck_rate)) { ++ DSSDBG("dispc clock info found from cache.\n"); ++ *cinfo = dispc.cache_cinfo; ++ return 0; ++ } ++ ++ min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; ++ ++ if (min_fck_per_pck && ++ req_pck * min_fck_per_pck > DISPC_MAX_FCK) { ++ DSSERR("Requested pixel clock not possible with the current " ++ "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " ++ "the constraint off.\n"); ++ min_fck_per_pck = 0; ++ } ++ ++retry: ++ memset(&cur, 0, sizeof(cur)); ++ memset(&best, 0, sizeof(best)); ++ ++ if (cpu_is_omap24xx()) { ++ /* XXX can we change the clock on omap2? */ ++ cur.fck = dss_clk_get_rate(DSS_CLK_FCK1); ++ cur.fck_div = 1; ++ ++ match = 1; ++ ++ find_lck_pck_divs(is_tft, req_pck, cur.fck, ++ &cur.lck_div, &cur.pck_div); ++ ++ cur.lck = cur.fck / cur.lck_div; ++ cur.pck = cur.lck / cur.pck_div; ++ ++ best = cur; ++ ++ goto found; ++ } else if (cpu_is_omap34xx()) { ++ for (cur.fck_div = 16; cur.fck_div > 0; --cur.fck_div) { ++ cur.fck = prate / cur.fck_div * 2; ++ ++ if (cur.fck > DISPC_MAX_FCK) ++ continue; ++ ++ if (min_fck_per_pck && ++ cur.fck < req_pck * min_fck_per_pck) ++ continue; ++ ++ match = 1; ++ ++ find_lck_pck_divs(is_tft, req_pck, cur.fck, ++ &cur.lck_div, &cur.pck_div); ++ ++ cur.lck = cur.fck / cur.lck_div; ++ cur.pck = cur.lck / cur.pck_div; ++ ++ if (abs(cur.pck - req_pck) < abs(best.pck - req_pck)) { ++ best = cur; ++ ++ if (cur.pck == req_pck) ++ goto found; ++ } ++ } ++ } else { ++ BUG(); ++ } ++ ++found: ++ if (!match) { ++ if (min_fck_per_pck) { ++ DSSERR("Could not find suitable clock settings.\n" ++ "Turning FCK/PCK constraint off and" ++ "trying again.\n"); ++ min_fck_per_pck = 0; ++ goto retry; ++ } ++ ++ DSSERR("Could not find suitable clock settings.\n"); ++ ++ return -EINVAL; ++ } ++ ++ if (cinfo) ++ *cinfo = best; ++ ++ dispc.cache_req_pck = req_pck; ++ dispc.cache_prate = prate; ++ dispc.cache_cinfo = best; ++ ++ return 0; ++} ++ ++int dispc_set_clock_div(struct dispc_clock_info *cinfo) ++{ ++ unsigned long prate; ++ int r; ++ ++ if (cpu_is_omap34xx()) { ++ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); ++ DSSDBG("dpll4_m4 = %ld\n", prate); ++ } ++ ++ DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div); ++ DSSDBG("lck = %ld (%d)\n", cinfo->lck, cinfo->lck_div); ++ DSSDBG("pck = %ld (%d)\n", cinfo->pck, cinfo->pck_div); ++ ++ if (cpu_is_omap34xx()) { ++ r = clk_set_rate(dispc.dpll4_m4_ck, prate / cinfo->fck_div); ++ if (r) ++ return r; ++ } ++ ++ dispc_set_lcd_divisor(cinfo->lck_div, cinfo->pck_div); ++ ++ return 0; ++} ++ ++int dispc_get_clock_div(struct dispc_clock_info *cinfo) ++{ ++ cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK1); ++ ++ if (cpu_is_omap34xx()) { ++ unsigned long prate; ++ prate = clk_get_rate(clk_get_parent(dispc.dpll4_m4_ck)); ++ cinfo->fck_div = prate / (cinfo->fck / 2); ++ } else { ++ cinfo->fck_div = 0; ++ } ++ ++ cinfo->lck_div = REG_GET(DISPC_DIVISOR, 23, 16); ++ cinfo->pck_div = REG_GET(DISPC_DIVISOR, 7, 0); ++ ++ cinfo->lck = cinfo->fck / cinfo->lck_div; ++ cinfo->pck = cinfo->lck / cinfo->pck_div; ++ ++ return 0; ++} ++ ++static void omap_dispc_set_irqs(void) ++{ ++ unsigned long flags; ++ u32 mask = dispc.irq_error_mask; ++ int i; ++ struct omap_dispc_isr_data *isr_data; ++ ++ spin_lock_irqsave(&dispc.irq_lock, flags); ++ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ isr_data = &dispc.registered_isr[i]; ++ ++ if (isr_data->isr == NULL) ++ continue; ++ ++ mask |= isr_data->mask; ++ } ++ ++ enable_clocks(1); ++ dispc_write_reg(DISPC_IRQENABLE, mask); ++ enable_clocks(0); ++ ++ spin_unlock_irqrestore(&dispc.irq_lock, flags); ++} ++ ++int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask) ++{ ++ int i; ++ int ret; ++ unsigned long flags; ++ struct omap_dispc_isr_data *isr_data; ++ ++ if (isr == NULL) ++ return -EINVAL; ++ ++ spin_lock_irqsave(&dispc.irq_lock, flags); ++ ++ /* check for duplicate entry */ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ isr_data = &dispc.registered_isr[i]; ++ if (isr_data->isr == isr && isr_data->arg == arg && ++ isr_data->mask == mask) { ++ ret = -EINVAL; ++ goto err; ++ } ++ } ++ ++ isr_data = NULL; ++ ret = -EBUSY; ++ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ isr_data = &dispc.registered_isr[i]; ++ ++ if (isr_data->isr != NULL) ++ continue; ++ ++ isr_data->isr = isr; ++ isr_data->arg = arg; ++ isr_data->mask = mask; ++ ret = 0; ++ ++ break; ++ } ++err: ++ spin_unlock_irqrestore(&dispc.irq_lock, flags); ++ ++ if (ret == 0) ++ omap_dispc_set_irqs(); ++ ++ return ret; ++} ++EXPORT_SYMBOL(omap_dispc_register_isr); ++ ++int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask) ++{ ++ int i; ++ unsigned long flags; ++ int ret = -EINVAL; ++ struct omap_dispc_isr_data *isr_data; ++ ++ spin_lock_irqsave(&dispc.irq_lock, flags); ++ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ isr_data = &dispc.registered_isr[i]; ++ if (isr_data->isr != isr || isr_data->arg != arg || ++ isr_data->mask != mask) ++ continue; ++ ++ /* found the correct isr */ ++ ++ isr_data->isr = NULL; ++ isr_data->arg = NULL; ++ isr_data->mask = 0; ++ ++ ret = 0; ++ break; ++ } ++ ++ spin_unlock_irqrestore(&dispc.irq_lock, flags); ++ ++ if (ret == 0) ++ omap_dispc_set_irqs(); ++ ++ return ret; ++} ++EXPORT_SYMBOL(omap_dispc_unregister_isr); ++ ++#ifdef DEBUG ++static void print_irq_status(u32 status) ++{ ++ if ((status & dispc.irq_error_mask) == 0) ++ return; ++ ++ printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status); ++ ++#define PIS(x) \ ++ if (status & DISPC_IRQ_##x) \ ++ printk(#x " "); ++ PIS(GFX_FIFO_UNDERFLOW); ++ PIS(OCP_ERR); ++ PIS(VID1_FIFO_UNDERFLOW); ++ PIS(VID2_FIFO_UNDERFLOW); ++ PIS(SYNC_LOST); ++ PIS(SYNC_LOST_DIGIT); ++#undef PIS ++ ++ printk("\n"); ++} ++#endif ++ ++/* Called from dss.c. Note that we don't touch clocks here, ++ * but we presume they are on because we got an IRQ. However, ++ * an irq handler may turn the clocks off, so we may not have ++ * clock later in the function. */ ++void dispc_irq_handler(void) ++{ ++ int i; ++ u32 irqstatus = dispc_read_reg(DISPC_IRQSTATUS); ++ u32 handledirqs = 0; ++ u32 unhandled_errors; ++ struct omap_dispc_isr_data *isr_data; ++ ++#ifdef DEBUG ++ if (dss_debug) ++ print_irq_status(irqstatus); ++#endif ++ /* Ack the interrupt. Do it here before clocks are possibly turned ++ * off */ ++ dispc_write_reg(DISPC_IRQSTATUS, irqstatus); ++ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ isr_data = &dispc.registered_isr[i]; ++ ++ if (!isr_data->isr) ++ continue; ++ ++ if (isr_data->mask & irqstatus) { ++ isr_data->isr(isr_data->arg, irqstatus); ++ handledirqs |= isr_data->mask; ++ } ++ } ++ ++ unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask; ++ ++ if (unhandled_errors) { ++ spin_lock(&dispc.error_lock); ++ dispc.error_irqs |= unhandled_errors; ++ spin_unlock(&dispc.error_lock); ++ ++ dispc.irq_error_mask &= ~unhandled_errors; ++ omap_dispc_set_irqs(); ++ ++ schedule_work(&dispc.error_work); ++ } ++} ++ ++static void dispc_error_worker(struct work_struct *work) ++{ ++ int i; ++ u32 errors; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dispc.error_lock, flags); ++ errors = dispc.error_irqs; ++ dispc.error_irqs = 0; ++ spin_unlock_irqrestore(&dispc.error_lock, flags); ++ ++ if (errors & DISPC_IRQ_GFX_FIFO_UNDERFLOW) { ++ DSSERR("GFX_FIFO_UNDERFLOW, disabling GFX\n"); ++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { ++ struct omap_overlay *ovl; ++ ovl = omap_dss_get_overlay(i); ++ ++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) ++ continue; ++ ++ if (ovl->id == 0) { ++ dispc_enable_plane(ovl->id, 0); ++ dispc_go(ovl->manager->id); ++ mdelay(50); ++ break; ++ } ++ } ++ } ++ ++ if (errors & DISPC_IRQ_VID1_FIFO_UNDERFLOW) { ++ DSSERR("VID1_FIFO_UNDERFLOW, disabling VID1\n"); ++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { ++ struct omap_overlay *ovl; ++ ovl = omap_dss_get_overlay(i); ++ ++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) ++ continue; ++ ++ if (ovl->id == 1) { ++ dispc_enable_plane(ovl->id, 0); ++ dispc_go(ovl->manager->id); ++ mdelay(50); ++ break; ++ } ++ } ++ } ++ ++ if (errors & DISPC_IRQ_VID2_FIFO_UNDERFLOW) { ++ DSSERR("VID2_FIFO_UNDERFLOW, disabling VID2\n"); ++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { ++ struct omap_overlay *ovl; ++ ovl = omap_dss_get_overlay(i); ++ ++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) ++ continue; ++ ++ if (ovl->id == 2) { ++ dispc_enable_plane(ovl->id, 0); ++ dispc_go(ovl->manager->id); ++ mdelay(50); ++ break; ++ } ++ } ++ } ++ ++ if (errors & DISPC_IRQ_SYNC_LOST) { ++ DSSERR("SYNC_LOST, disabling LCD\n"); ++ for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { ++ struct omap_overlay_manager *mgr; ++ mgr = omap_dss_get_overlay_manager(i); ++ ++ if (mgr->id == OMAP_DSS_CHANNEL_LCD) { ++ mgr->display->disable(mgr->display); ++ break; ++ } ++ } ++ } ++ ++ if (errors & DISPC_IRQ_SYNC_LOST_DIGIT) { ++ DSSERR("SYNC_LOST_DIGIT, disabling TV\n"); ++ for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { ++ struct omap_overlay_manager *mgr; ++ mgr = omap_dss_get_overlay_manager(i); ++ ++ if (mgr->id == OMAP_DSS_CHANNEL_DIGIT) { ++ mgr->display->disable(mgr->display); ++ break; ++ } ++ } ++ } ++ ++ if (errors & DISPC_IRQ_OCP_ERR) { ++ DSSERR("OCP_ERR\n"); ++ for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { ++ struct omap_overlay_manager *mgr; ++ mgr = omap_dss_get_overlay_manager(i); ++ ++ if (mgr->caps & OMAP_DSS_OVL_CAP_DISPC) ++ mgr->display->disable(mgr->display); ++ } ++ } ++ ++ dispc.irq_error_mask |= errors; ++ omap_dispc_set_irqs(); ++} ++ ++int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout) ++{ ++ void dispc_irq_wait_handler(void *data, u32 mask) ++ { ++ complete((struct completion *)data); ++ } ++ ++ int r; ++ DECLARE_COMPLETION_ONSTACK(completion); ++ ++ r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, ++ irqmask); ++ ++ if (r) ++ return r; ++ ++ timeout = wait_for_completion_timeout(&completion, timeout); ++ ++ omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); ++ ++ if (timeout == 0) ++ return -ETIMEDOUT; ++ ++ if (timeout == -ERESTARTSYS) ++ return -ERESTARTSYS; ++ ++ return 0; ++} ++ ++int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, ++ unsigned long timeout) ++{ ++ void dispc_irq_wait_handler(void *data, u32 mask) ++ { ++ complete((struct completion *)data); ++ } ++ ++ int r; ++ DECLARE_COMPLETION_ONSTACK(completion); ++ ++ r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, ++ irqmask); ++ ++ if (r) ++ return r; ++ ++ timeout = wait_for_completion_interruptible_timeout(&completion, ++ timeout); ++ ++ omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); ++ ++ if (timeout == 0) ++ return -ETIMEDOUT; ++ ++ if (timeout == -ERESTARTSYS) ++ return -ERESTARTSYS; ++ ++ return 0; ++} ++ ++#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC ++void dispc_fake_vsync_irq(void) ++{ ++ u32 irqstatus = DISPC_IRQ_VSYNC; ++ int i; ++ ++ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { ++ struct omap_dispc_isr_data *isr_data; ++ isr_data = &dispc.registered_isr[i]; ++ ++ if (!isr_data->isr) ++ continue; ++ ++ if (isr_data->mask & irqstatus) ++ isr_data->isr(isr_data->arg, irqstatus); ++ } ++} ++#endif ++ ++static void _omap_dispc_initialize_irq(void) ++{ ++ memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr)); ++ ++ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; ++ ++ /* there's SYNC_LOST_DIGIT waiting after enabling the DSS, ++ * so clear it */ ++ dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS)); ++ ++ omap_dispc_set_irqs(); ++} ++ ++static void _omap_dispc_initial_config(void) ++{ ++ u32 l; ++ ++ l = dispc_read_reg(DISPC_SYSCONFIG); ++ l = FLD_MOD(l, 2, 13, 12); /* MIDLEMODE: smart standby */ ++ l = FLD_MOD(l, 2, 4, 3); /* SIDLEMODE: smart idle */ ++ l = FLD_MOD(l, 1, 2, 2); /* ENWAKEUP */ ++ l = FLD_MOD(l, 1, 0, 0); /* AUTOIDLE */ ++ dispc_write_reg(DISPC_SYSCONFIG, l); ++ ++ /* FUNCGATED */ ++ REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9); ++ ++ /* L3 firewall setting: enable access to OCM RAM */ ++ if (cpu_is_omap24xx()) ++ __raw_writel(0x402000b0, IO_ADDRESS(0x680050a0)); ++ ++ _dispc_setup_color_conv_coef(); ++ ++ dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY); ++} ++ ++int dispc_init(void) ++{ ++ u32 rev; ++ ++ spin_lock_init(&dispc.irq_lock); ++ spin_lock_init(&dispc.error_lock); ++ ++ INIT_WORK(&dispc.error_work, dispc_error_worker); ++ ++ dispc.base = ioremap(DISPC_BASE, DISPC_SZ_REGS); ++ if (!dispc.base) { ++ DSSERR("can't ioremap DISPC\n"); ++ return -ENOMEM; ++ } ++ ++ if (cpu_is_omap34xx()) { ++ dispc.dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck"); ++ if (IS_ERR(dispc.dpll4_m4_ck)) { ++ DSSERR("Failed to get dpll4_m4_ck\n"); ++ return -ENODEV; ++ } ++ } ++ ++ enable_clocks(1); ++ ++ _omap_dispc_initial_config(); ++ ++ _omap_dispc_initialize_irq(); ++ ++ dispc_save_context(); ++ ++ rev = dispc_read_reg(DISPC_REVISION); ++ printk(KERN_INFO "OMAP DISPC rev %d.%d\n", ++ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); ++ ++ enable_clocks(0); ++ ++ return 0; ++} ++ ++void dispc_exit(void) ++{ ++ if (cpu_is_omap34xx()) ++ clk_put(dispc.dpll4_m4_ck); ++ iounmap(dispc.base); ++} ++ ++int dispc_enable_plane(enum omap_plane plane, bool enable) ++{ ++ DSSDBG("dispc_enable_plane %d, %d\n", plane, enable); ++ ++ enable_clocks(1); ++ _dispc_enable_plane(plane, enable); ++ enable_clocks(0); ++ ++ return 0; ++} ++ ++int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, ++ u32 paddr, u16 screen_width, ++ u16 pos_x, u16 pos_y, ++ u16 width, u16 height, ++ u16 out_width, u16 out_height, ++ enum omap_color_mode color_mode, ++ bool ilace, ++ u8 rotation, bool mirror) ++{ ++ int r = 0; ++ ++ DSSDBG("dispc_setup_plane %d, ch %d, pa %x, sw %d, %d,%d, %dx%d -> " ++ "%dx%d, ilace %d, cmode %x, rot %d, mir %d\n", ++ plane, channel_out, paddr, screen_width, pos_x, pos_y, ++ width, height, ++ out_width, out_height, ++ ilace, color_mode, ++ rotation, mirror); ++ ++ enable_clocks(1); ++ ++ r = _dispc_setup_plane(plane, channel_out, ++ paddr, screen_width, ++ pos_x, pos_y, ++ width, height, ++ out_width, out_height, ++ color_mode, ilace, ++ rotation, mirror); ++ ++ enable_clocks(0); ++ ++ return r; ++} ++ ++static int dispc_is_intersecting(int x1, int y1, int w1, int h1, ++ int x2, int y2, int w2, int h2) ++{ ++ if (x1 >= (x2+w2)) ++ return 0; ++ ++ if ((x1+w1) <= x2) ++ return 0; ++ ++ if (y1 >= (y2+h2)) ++ return 0; ++ ++ if ((y1+h1) <= y2) ++ return 0; ++ ++ return 1; ++} ++ ++static int dispc_is_overlay_scaled(struct omap_overlay_info *pi) ++{ ++ if (pi->width != pi->out_width) ++ return 1; ++ ++ if (pi->height != pi->out_height) ++ return 1; ++ ++ return 0; ++} ++ ++/* returns the area that needs updating */ ++void dispc_setup_partial_planes(struct omap_display *display, ++ u16 *xi, u16 *yi, u16 *wi, u16 *hi) ++{ ++ struct omap_overlay_manager *mgr; ++ int i; ++ ++ int x, y, w, h; ++ ++ x = *xi; ++ y = *yi; ++ w = *wi; ++ h = *hi; ++ ++ DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n", ++ *xi, *yi, *wi, *hi); ++ ++ ++ mgr = display->manager; ++ ++ if (!mgr) { ++ DSSDBG("no manager\n"); ++ return; ++ } ++ ++ for (i = 0; i < mgr->num_overlays; i++) { ++ struct omap_overlay *ovl; ++ struct omap_overlay_info *pi; ++ ovl = mgr->overlays[i]; ++ ++ if (ovl->manager != mgr) ++ continue; ++ ++ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) ++ continue; ++ ++ pi = &ovl->info; ++ ++ if (!pi->enabled) ++ continue; ++ /* ++ * If the plane is intersecting and scaled, we ++ * enlarge the update region to accomodate the ++ * whole area ++ */ ++ ++ if (dispc_is_intersecting(x, y, w, h, ++ pi->pos_x, pi->pos_y, ++ pi->out_width, pi->out_height)) { ++ if (dispc_is_overlay_scaled(pi)) { ++ ++ int x1, y1, x2, y2; ++ ++ if (x > pi->pos_x) ++ x1 = pi->pos_x; ++ else ++ x1 = x; ++ ++ if (y > pi->pos_y) ++ y1 = pi->pos_y; ++ else ++ y1 = y; ++ ++ if ((x + w) < (pi->pos_x + pi->out_width)) ++ x2 = pi->pos_x + pi->out_width; ++ else ++ x2 = x + w; ++ ++ if ((y + h) < (pi->pos_y + pi->out_height)) ++ y2 = pi->pos_y + pi->out_height; ++ else ++ y2 = y + h; ++ ++ x = x1; ++ y = y1; ++ w = x2 - x1; ++ h = y2 - y1; ++ ++ DSSDBG("Update area after enlarge due to " ++ "scaling %d, %d %dx%d\n", ++ x, y, w, h); ++ } ++ } ++ } ++ ++ for (i = 0; i < mgr->num_overlays; i++) { ++ struct omap_overlay *ovl = mgr->overlays[i]; ++ struct omap_overlay_info *pi = &ovl->info; ++ ++ int px = pi->pos_x; ++ int py = pi->pos_y; ++ int pw = pi->width; ++ int ph = pi->height; ++ int pow = pi->out_width; ++ int poh = pi->out_height; ++ u32 pa = pi->paddr; ++ int psw = pi->screen_width; ++ int bpp; ++ ++ if (ovl->manager != mgr) ++ continue; ++ ++ /* ++ * If plane is not enabled or the update region ++ * does not intersect with the plane in question, ++ * we really disable the plane from hardware ++ */ ++ ++ if (!pi->enabled || ++ !dispc_is_intersecting(x, y, w, h, ++ px, py, pow, poh)) { ++ dispc_enable_plane(ovl->id, 0); ++ continue; ++ } ++ ++ switch (pi->color_mode) { ++ case OMAP_DSS_COLOR_RGB16: ++ case OMAP_DSS_COLOR_ARGB16: ++ case OMAP_DSS_COLOR_YUV2: ++ case OMAP_DSS_COLOR_UYVY: ++ bpp = 16; ++ break; ++ ++ case OMAP_DSS_COLOR_RGB24P: ++ bpp = 24; ++ break; ++ ++ case OMAP_DSS_COLOR_RGB24U: ++ case OMAP_DSS_COLOR_ARGB32: ++ case OMAP_DSS_COLOR_RGBA32: ++ case OMAP_DSS_COLOR_RGBX32: ++ bpp = 32; ++ break; ++ ++ default: ++ BUG(); ++ return; ++ } ++ ++ if (x > pi->pos_x) { ++ px = 0; ++ pw -= (x - pi->pos_x); ++ pa += (x - pi->pos_x) * bpp / 8; ++ } else { ++ px = pi->pos_x - x; ++ } ++ ++ if (y > pi->pos_y) { ++ py = 0; ++ ph -= (y - pi->pos_y); ++ pa += (y - pi->pos_y) * psw * bpp / 8; ++ } else { ++ py = pi->pos_y - y; ++ } ++ ++ if (w < (px+pw)) ++ pw -= (px+pw) - (w); ++ ++ if (h < (py+ph)) ++ ph -= (py+ph) - (h); ++ ++ /* Can't scale the GFX plane */ ++ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0 || ++ dispc_is_overlay_scaled(pi) == 0) { ++ pow = pw; ++ poh = ph; ++ } ++ ++ DSSDBG("calc plane %d, %x, sw %d, %d,%d, %dx%d -> %dx%d\n", ++ ovl->id, pa, psw, px, py, pw, ph, pow, poh); ++ ++ dispc_setup_plane(ovl->id, mgr->id, ++ pa, psw, ++ px, py, ++ pw, ph, ++ pow, poh, ++ pi->color_mode, 0, ++ pi->rotation, // XXX rotation probably wrong ++ pi->mirror); ++ ++ dispc_enable_plane(ovl->id, 1); ++ } ++ ++ *xi = x; ++ *yi = y; ++ *wi = w; ++ *hi = h; ++ ++} ++ +diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c +new file mode 100644 +index 0000000..9aaf392 +--- /dev/null ++++ b/drivers/video/omap2/dss/display.c +@@ -0,0 +1,693 @@ ++/* ++ * linux/drivers/video/omap2/dss/display.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "DISPLAY" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include "dss.h" ++ ++static int num_displays; ++static LIST_HEAD(display_list); ++ ++static ssize_t display_name_show(struct omap_display *display, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", display->name); ++} ++ ++static ssize_t display_enabled_show(struct omap_display *display, char *buf) ++{ ++ bool enabled = display->state != OMAP_DSS_DISPLAY_DISABLED; ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", enabled); ++} ++ ++static ssize_t display_enabled_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ bool enabled, r; ++ ++ enabled = simple_strtoul(buf, NULL, 10); ++ ++ if (enabled != (display->state != OMAP_DSS_DISPLAY_DISABLED)) { ++ if (enabled) { ++ r = display->enable(display); ++ if (r) ++ return r; ++ } else { ++ display->disable(display); ++ } ++ } ++ ++ return size; ++} ++ ++static ssize_t display_upd_mode_show(struct omap_display *display, char *buf) ++{ ++ enum omap_dss_update_mode mode = OMAP_DSS_UPDATE_AUTO; ++ if (display->get_update_mode) ++ mode = display->get_update_mode(display); ++ return snprintf(buf, PAGE_SIZE, "%d\n", mode); ++} ++ ++static ssize_t display_upd_mode_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ int val, r; ++ enum omap_dss_update_mode mode; ++ ++ val = simple_strtoul(buf, NULL, 10); ++ ++ switch (val) { ++ case OMAP_DSS_UPDATE_DISABLED: ++ case OMAP_DSS_UPDATE_AUTO: ++ case OMAP_DSS_UPDATE_MANUAL: ++ mode = (enum omap_dss_update_mode)val; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ if ((r = display->set_update_mode(display, mode))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t display_tear_show(struct omap_display *display, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ++ display->get_te ? display->get_te(display) : 0); ++} ++ ++static ssize_t display_tear_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ unsigned long te; ++ int r; ++ ++ if (!display->enable_te || !display->get_te) ++ return -ENOENT; ++ ++ te = simple_strtoul(buf, NULL, 0); ++ ++ if ((r = display->enable_te(display, te))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t display_timings_show(struct omap_display *display, char *buf) ++{ ++ struct omap_video_timings t; ++ ++ if (!display->get_timings) ++ return -ENOENT; ++ ++ display->get_timings(display, &t); ++ ++ return snprintf(buf, PAGE_SIZE, "%u,%u/%u/%u/%u,%u/%u/%u/%u\n", ++ t.pixel_clock, ++ t.x_res, t.hfp, t.hbp, t.hsw, ++ t.y_res, t.vfp, t.vbp, t.vsw); ++} ++ ++static ssize_t display_timings_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ struct omap_video_timings t; ++ int r, found; ++ ++ if (!display->set_timings || !display->check_timings) ++ return -ENOENT; ++ ++ found = 0; ++#ifdef CONFIG_OMAP2_DSS_VENC ++ if (strncmp("pal", buf, 3) == 0) { ++ t = omap_dss_pal_timings; ++ found = 1; ++ } else if (strncmp("ntsc", buf, 4) == 0) { ++ t = omap_dss_ntsc_timings; ++ found = 1; ++ } ++#endif ++ if (!found && sscanf(buf, "%u,%hu/%hu/%hu/%hu,%hu/%hu/%hu/%hu", ++ &t.pixel_clock, ++ &t.x_res, &t.hfp, &t.hbp, &t.hsw, ++ &t.y_res, &t.vfp, &t.vbp, &t.vsw) != 9) ++ return -EINVAL; ++ ++ if ((r = display->check_timings(display, &t))) ++ return r; ++ ++ display->set_timings(display, &t); ++ ++ return size; ++} ++ ++static ssize_t display_rotate_show(struct omap_display *display, char *buf) ++{ ++ int rotate; ++ if (!display->get_rotate) ++ return -ENOENT; ++ rotate = display->get_rotate(display); ++ return snprintf(buf, PAGE_SIZE, "%u\n", rotate); ++} ++ ++static ssize_t display_rotate_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ unsigned long rot; ++ int r; ++ ++ if (!display->set_rotate || !display->get_rotate) ++ return -ENOENT; ++ ++ rot = simple_strtoul(buf, NULL, 0); ++ ++ if ((r = display->set_rotate(display, rot))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t display_mirror_show(struct omap_display *display, char *buf) ++{ ++ int mirror; ++ if (!display->get_mirror) ++ return -ENOENT; ++ mirror = display->get_mirror(display); ++ return snprintf(buf, PAGE_SIZE, "%u\n", mirror); ++} ++ ++static ssize_t display_mirror_store(struct omap_display *display, ++ const char *buf, size_t size) ++{ ++ unsigned long mirror; ++ int r; ++ ++ if (!display->set_mirror || !display->get_mirror) ++ return -ENOENT; ++ ++ mirror = simple_strtoul(buf, NULL, 0); ++ ++ if ((r = display->set_mirror(display, mirror))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t display_panel_name_show(struct omap_display *display, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", ++ display->panel ? display->panel->name : ""); ++} ++ ++static ssize_t display_ctrl_name_show(struct omap_display *display, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", ++ display->ctrl ? display->ctrl->name : ""); ++} ++ ++struct display_attribute { ++ struct attribute attr; ++ ssize_t (*show)(struct omap_display *, char *); ++ ssize_t (*store)(struct omap_display *, const char *, size_t); ++}; ++ ++#define DISPLAY_ATTR(_name, _mode, _show, _store) \ ++ struct display_attribute display_attr_##_name = \ ++ __ATTR(_name, _mode, _show, _store) ++ ++static DISPLAY_ATTR(name, S_IRUGO, display_name_show, NULL); ++static DISPLAY_ATTR(enabled, S_IRUGO|S_IWUSR, ++ display_enabled_show, display_enabled_store); ++static DISPLAY_ATTR(update_mode, S_IRUGO|S_IWUSR, ++ display_upd_mode_show, display_upd_mode_store); ++static DISPLAY_ATTR(tear_elim, S_IRUGO|S_IWUSR, ++ display_tear_show, display_tear_store); ++static DISPLAY_ATTR(timings, S_IRUGO|S_IWUSR, ++ display_timings_show, display_timings_store); ++static DISPLAY_ATTR(rotate, S_IRUGO|S_IWUSR, ++ display_rotate_show, display_rotate_store); ++static DISPLAY_ATTR(mirror, S_IRUGO|S_IWUSR, ++ display_mirror_show, display_mirror_store); ++static DISPLAY_ATTR(panel_name, S_IRUGO, display_panel_name_show, NULL); ++static DISPLAY_ATTR(ctrl_name, S_IRUGO, display_ctrl_name_show, NULL); ++ ++static struct attribute *display_sysfs_attrs[] = { ++ &display_attr_name.attr, ++ &display_attr_enabled.attr, ++ &display_attr_update_mode.attr, ++ &display_attr_tear_elim.attr, ++ &display_attr_timings.attr, ++ &display_attr_rotate.attr, ++ &display_attr_mirror.attr, ++ &display_attr_panel_name.attr, ++ &display_attr_ctrl_name.attr, ++ NULL ++}; ++ ++static ssize_t display_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) ++{ ++ struct omap_display *display; ++ struct display_attribute *display_attr; ++ ++ display = container_of(kobj, struct omap_display, kobj); ++ display_attr = container_of(attr, struct display_attribute, attr); ++ ++ if (!display_attr->show) ++ return -ENOENT; ++ ++ return display_attr->show(display, buf); ++} ++ ++static ssize_t display_attr_store(struct kobject *kobj, struct attribute *attr, ++ const char *buf, size_t size) ++{ ++ struct omap_display *display; ++ struct display_attribute *display_attr; ++ ++ display = container_of(kobj, struct omap_display, kobj); ++ display_attr = container_of(attr, struct display_attribute, attr); ++ ++ if (!display_attr->store) ++ return -ENOENT; ++ ++ return display_attr->store(display, buf, size); ++} ++ ++static struct sysfs_ops display_sysfs_ops = { ++ .show = display_attr_show, ++ .store = display_attr_store, ++}; ++ ++static struct kobj_type display_ktype = { ++ .sysfs_ops = &display_sysfs_ops, ++ .default_attrs = display_sysfs_attrs, ++}; ++ ++static void default_get_resolution(struct omap_display *display, ++ u16 *xres, u16 *yres) ++{ ++ *xres = display->panel->timings.x_res; ++ *yres = display->panel->timings.y_res; ++} ++ ++static void default_configure_overlay(struct omap_overlay *ovl) ++{ ++ unsigned low, high, size; ++ enum omap_burst_size burst; ++ enum omap_plane plane = ovl->id; ++ ++ burst = OMAP_DSS_BURST_16x32; ++ size = 16 * 32 / 8; ++ ++ dispc_set_burst_size(plane, burst); ++ ++ high = dispc_get_plane_fifo_size(plane) - 1; ++ low = dispc_get_plane_fifo_size(plane) - size; ++ ++ dispc_setup_plane_fifo(plane, low, high); ++} ++ ++static int default_wait_vsync(struct omap_display *display) ++{ ++ unsigned long timeout = msecs_to_jiffies(500); ++ u32 irq; ++ ++ if (display->type == OMAP_DISPLAY_TYPE_VENC) ++ irq = DISPC_IRQ_EVSYNC_ODD; ++ else ++ irq = DISPC_IRQ_VSYNC; ++ ++ return omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); ++} ++ ++static int default_get_recommended_bpp(struct omap_display *display) ++{ ++ if (display->panel->recommended_bpp) ++ return display->panel->recommended_bpp; ++ ++ switch (display->type) { ++ case OMAP_DISPLAY_TYPE_DPI: ++ if (display->hw_config.u.dpi.data_lines == 24) ++ return 24; ++ else ++ return 16; ++ ++ case OMAP_DISPLAY_TYPE_DBI: ++ case OMAP_DISPLAY_TYPE_DSI: ++ if (display->ctrl->pixel_size == 24) ++ return 24; ++ else ++ return 16; ++ case OMAP_DISPLAY_TYPE_VENC: ++ case OMAP_DISPLAY_TYPE_SDI: ++ return 24; ++ return 24; ++ default: ++ BUG(); ++ } ++} ++ ++void dss_init_displays(struct platform_device *pdev) ++{ ++ struct omap_dss_board_info *pdata = pdev->dev.platform_data; ++ int i, r; ++ ++ INIT_LIST_HEAD(&display_list); ++ ++ num_displays = 0; ++ ++ for (i = 0; i < pdata->num_displays; ++i) { ++ struct omap_display *display; ++ ++ switch (pdata->displays[i]->type) { ++ case OMAP_DISPLAY_TYPE_DPI: ++#ifdef CONFIG_OMAP2_DSS_RFBI ++ case OMAP_DISPLAY_TYPE_DBI: ++#endif ++#ifdef CONFIG_OMAP2_DSS_SDI ++ case OMAP_DISPLAY_TYPE_SDI: ++#endif ++#ifdef CONFIG_OMAP2_DSS_DSI ++ case OMAP_DISPLAY_TYPE_DSI: ++#endif ++#ifdef CONFIG_OMAP2_DSS_VENC ++ case OMAP_DISPLAY_TYPE_VENC: ++#endif ++ break; ++ default: ++ DSSERR("Support for display '%s' not compiled in.\n", ++ pdata->displays[i]->name); ++ continue; ++ } ++ ++ display = kzalloc(sizeof(*display), GFP_KERNEL); ++ ++ /*atomic_set(&display->ref_count, 0);*/ ++ display->ref_count = 0; ++ ++ display->hw_config = *pdata->displays[i]; ++ display->type = pdata->displays[i]->type; ++ display->name = pdata->displays[i]->name; ++ ++ display->get_resolution = default_get_resolution; ++ display->get_recommended_bpp = default_get_recommended_bpp; ++ display->configure_overlay = default_configure_overlay; ++ display->wait_vsync = default_wait_vsync; ++ ++ switch (display->type) { ++ case OMAP_DISPLAY_TYPE_DPI: ++ dpi_init_display(display); ++ break; ++#ifdef CONFIG_OMAP2_DSS_RFBI ++ case OMAP_DISPLAY_TYPE_DBI: ++ rfbi_init_display(display); ++ break; ++#endif ++#ifdef CONFIG_OMAP2_DSS_VENC ++ case OMAP_DISPLAY_TYPE_VENC: ++ venc_init_display(display); ++ break; ++#endif ++#ifdef CONFIG_OMAP2_DSS_SDI ++ case OMAP_DISPLAY_TYPE_SDI: ++ sdi_init_display(display); ++ break; ++#endif ++#ifdef CONFIG_OMAP2_DSS_DSI ++ case OMAP_DISPLAY_TYPE_DSI: ++ dsi_init_display(display); ++ break; ++#endif ++ default: ++ BUG(); ++ } ++ ++ r = kobject_init_and_add(&display->kobj, &display_ktype, ++ &pdev->dev.kobj, "display%d", num_displays); ++ ++ if (r) { ++ DSSERR("failed to create sysfs file\n"); ++ continue; ++ } ++ ++ num_displays++; ++ ++ list_add_tail(&display->list, &display_list); ++ } ++} ++ ++void dss_uninit_displays(struct platform_device *pdev) ++{ ++ struct omap_display *display; ++ ++ while (!list_empty(&display_list)) { ++ display = list_first_entry(&display_list, ++ struct omap_display, list); ++ list_del(&display->list); ++ kobject_del(&display->kobj); ++ kobject_put(&display->kobj); ++ kfree(display); ++ } ++ ++ num_displays = 0; ++} ++ ++int dss_suspend_all_displays(void) ++{ ++ int r; ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) { ++ display->activate_after_resume = 0; ++ continue; ++ } ++ ++ if (!display->suspend) { ++ DSSERR("display '%s' doesn't implement suspend\n", ++ display->name); ++ r = -ENOSYS; ++ goto err; ++ } ++ ++ r = display->suspend(display); ++ ++ if (r) ++ goto err; ++ ++ display->activate_after_resume = 1; ++ } ++ ++ return 0; ++err: ++ /* resume all displays that were suspended */ ++ dss_resume_all_displays(); ++ return r; ++} ++ ++int dss_resume_all_displays(void) ++{ ++ int r; ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->activate_after_resume && display->resume) { ++ r = display->resume(display); ++ if (r) ++ return r; ++ } ++ ++ display->activate_after_resume = 0; ++ } ++ ++ return 0; ++} ++ ++int omap_dss_get_num_displays(void) ++{ ++ return num_displays; ++} ++EXPORT_SYMBOL(omap_dss_get_num_displays); ++ ++struct omap_display *dss_get_display(int no) ++{ ++ int i = 0; ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (i++ == no) ++ return display; ++ } ++ ++ return NULL; ++} ++ ++struct omap_display *omap_dss_get_display(int no) ++{ ++ struct omap_display *display; ++ ++ display = dss_get_display(no); ++ ++ if (!display) ++ return NULL; ++ ++ switch (display->type) { ++ case OMAP_DISPLAY_TYPE_VENC: ++ break; ++ ++ case OMAP_DISPLAY_TYPE_DPI: ++ case OMAP_DISPLAY_TYPE_SDI: ++ if (display->panel == NULL) ++ return NULL; ++ break; ++ ++ case OMAP_DISPLAY_TYPE_DBI: ++ case OMAP_DISPLAY_TYPE_DSI: ++ if (display->panel == NULL || display->ctrl == NULL) ++ return NULL; ++ break; ++ ++ default: ++ return NULL; ++ } ++ ++ if (display->ctrl) { ++ if (!try_module_get(display->ctrl->owner)) ++ goto err0; ++ ++ if (display->ctrl->init) ++ if (display->ctrl->init(display) != 0) ++ goto err1; ++ } ++ ++ if (display->panel) { ++ if (!try_module_get(display->panel->owner)) ++ goto err2; ++ ++ if (display->panel->init) ++ if (display->panel->init(display) != 0) ++ goto err3; ++ } ++ ++ display->ref_count++; ++ /* ++ if (atomic_cmpxchg(&display->ref_count, 0, 1) != 0) ++ return 0; ++*/ ++ ++ return display; ++err3: ++ if (display->panel) ++ module_put(display->panel->owner); ++err2: ++ if (display->ctrl && display->ctrl->cleanup) ++ display->ctrl->cleanup(display); ++err1: ++ if (display->ctrl) ++ module_put(display->ctrl->owner); ++err0: ++ return NULL; ++} ++EXPORT_SYMBOL(omap_dss_get_display); ++ ++void omap_dss_put_display(struct omap_display *display) ++{ ++ if (--display->ref_count > 0) ++ return; ++/* ++ if (atomic_cmpxchg(&display->ref_count, 1, 0) != 1) ++ return; ++*/ ++ if (display->ctrl) { ++ if (display->ctrl->cleanup) ++ display->ctrl->cleanup(display); ++ module_put(display->ctrl->owner); ++ } ++ ++ if (display->panel) { ++ if (display->panel->cleanup) ++ display->panel->cleanup(display); ++ module_put(display->panel->owner); ++ } ++} ++EXPORT_SYMBOL(omap_dss_put_display); ++ ++void omap_dss_register_ctrl(struct omap_ctrl *ctrl) ++{ ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->hw_config.ctrl_name && ++ strcmp(display->hw_config.ctrl_name, ctrl->name) == 0) { ++ display->ctrl = ctrl; ++ DSSDBG("ctrl '%s' registered\n", ctrl->name); ++ } ++ } ++} ++EXPORT_SYMBOL(omap_dss_register_ctrl); ++ ++void omap_dss_register_panel(struct omap_panel *panel) ++{ ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->hw_config.panel_name && ++ strcmp(display->hw_config.panel_name, panel->name) == 0) { ++ display->panel = panel; ++ DSSDBG("panel '%s' registered\n", panel->name); ++ } ++ } ++} ++EXPORT_SYMBOL(omap_dss_register_panel); ++ ++void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl) ++{ ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->hw_config.ctrl_name && ++ strcmp(display->hw_config.ctrl_name, ctrl->name) == 0) ++ display->ctrl = NULL; ++ } ++} ++EXPORT_SYMBOL(omap_dss_unregister_ctrl); ++ ++void omap_dss_unregister_panel(struct omap_panel *panel) ++{ ++ struct omap_display *display; ++ ++ list_for_each_entry(display, &display_list, list) { ++ if (display->hw_config.panel_name && ++ strcmp(display->hw_config.panel_name, panel->name) == 0) ++ display->panel = NULL; ++ } ++} ++EXPORT_SYMBOL(omap_dss_unregister_panel); +diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c +new file mode 100644 +index 0000000..71fffca +--- /dev/null ++++ b/drivers/video/omap2/dss/dpi.c +@@ -0,0 +1,393 @@ ++/* ++ * linux/drivers/video/omap2/dss/dpi.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "dss.h" ++ ++static struct { ++ int update_enabled; ++} dpi; ++ ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++static int dpi_set_dsi_clk(bool is_tft, unsigned long pck_req, ++ unsigned long *fck, int *lck_div, int *pck_div) ++{ ++ struct dsi_clock_info cinfo; ++ int r; ++ ++ r = dsi_pll_calc_pck(is_tft, pck_req, &cinfo); ++ if (r) ++ return r; ++ ++ r = dsi_pll_program(&cinfo); ++ if (r) ++ return r; ++ ++ dss_select_clk_source(0, 1); ++ ++ dispc_set_lcd_divisor(cinfo.lck_div, cinfo.pck_div); ++ ++ *fck = cinfo.dsi1_pll_fclk; ++ *lck_div = cinfo.lck_div; ++ *pck_div = cinfo.pck_div; ++ ++ return 0; ++} ++#else ++static int dpi_set_dispc_clk(bool is_tft, unsigned long pck_req, ++ unsigned long *fck, int *lck_div, int *pck_div) ++{ ++ struct dispc_clock_info cinfo; ++ int r; ++ ++ r = dispc_calc_clock_div(is_tft, pck_req, &cinfo); ++ if (r) ++ return r; ++ ++ r = dispc_set_clock_div(&cinfo); ++ if (r) ++ return r; ++ ++ *fck = cinfo.fck; ++ *lck_div = cinfo.lck_div; ++ *pck_div = cinfo.pck_div; ++ ++ return 0; ++} ++#endif ++ ++static int dpi_set_mode(struct omap_display *display) ++{ ++ struct omap_panel *panel = display->panel; ++ int lck_div, pck_div; ++ unsigned long fck; ++ unsigned long pck; ++ bool is_tft; ++ int r = 0; ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ dispc_set_pol_freq(panel); ++ ++ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; ++ ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++ r = dpi_set_dsi_clk(is_tft, panel->timings.pixel_clock * 1000, ++ &fck, &lck_div, &pck_div); ++#else ++ r = dpi_set_dispc_clk(is_tft, panel->timings.pixel_clock * 1000, ++ &fck, &lck_div, &pck_div); ++#endif ++ if (r) ++ goto err0; ++ ++ pck = fck / lck_div / pck_div / 1000; ++ ++ if (pck != panel->timings.pixel_clock) { ++ DSSWARN("Could not find exact pixel clock. " ++ "Requested %d kHz, got %lu kHz\n", ++ panel->timings.pixel_clock, pck); ++ ++ panel->timings.pixel_clock = pck; ++ } ++ ++ dispc_set_lcd_timings(&panel->timings); ++ ++err0: ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ return r; ++} ++ ++static int dpi_basic_init(struct omap_display *display) ++{ ++ bool is_tft; ++ ++ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; ++ ++ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS); ++ dispc_set_lcd_display_type(is_tft ? OMAP_DSS_LCD_DISPLAY_TFT : ++ OMAP_DSS_LCD_DISPLAY_STN); ++ dispc_set_tft_data_lines(display->hw_config.u.dpi.data_lines); ++ ++ return 0; ++} ++ ++static int dpi_display_enable(struct omap_display *display) ++{ ++ struct omap_panel *panel = display->panel; ++ int r; ++ ++ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { ++ DSSERR("display already enabled\n"); ++ return -EINVAL; ++ } ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ r = dpi_basic_init(display); ++ if (r) ++ goto err0; ++ ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++ dss_clk_enable(DSS_CLK_FCK2); ++ r = dsi_pll_init(0, 1); ++ if (r) ++ goto err1; ++#endif ++ r = dpi_set_mode(display); ++ if (r) ++ goto err2; ++ ++ mdelay(2); ++ ++ dispc_enable_lcd_out(1); ++ ++ r = panel->enable(display); ++ if (r) ++ goto err3; ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++ ++ return 0; ++ ++err3: ++ dispc_enable_lcd_out(0); ++err2: ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++ dsi_pll_uninit(); ++err1: ++ dss_clk_disable(DSS_CLK_FCK2); ++#endif ++err0: ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ return r; ++} ++ ++static int dpi_display_resume(struct omap_display *display); ++ ++static void dpi_display_disable(struct omap_display *display) ++{ ++ if (display->state == OMAP_DSS_DISPLAY_DISABLED) ++ return; ++ ++ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) ++ dpi_display_resume(display); ++ ++ display->panel->disable(display); ++ ++ dispc_enable_lcd_out(0); ++ ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++ dss_select_clk_source(0, 0); ++ dsi_pll_uninit(); ++ dss_clk_disable(DSS_CLK_FCK2); ++#endif ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++} ++ ++static int dpi_display_suspend(struct omap_display *display) ++{ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return -EINVAL; ++ ++ DSSDBG("dpi_display_suspend\n"); ++ ++ if (display->panel->suspend) ++ display->panel->suspend(display); ++ ++ dispc_enable_lcd_out(0); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ display->state = OMAP_DSS_DISPLAY_SUSPENDED; ++ ++ return 0; ++} ++ ++static int dpi_display_resume(struct omap_display *display) ++{ ++ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) ++ return -EINVAL; ++ ++ DSSDBG("dpi_display_resume\n"); ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ dispc_enable_lcd_out(1); ++ ++ if (display->panel->resume) ++ display->panel->resume(display); ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++ ++ return 0; ++} ++ ++static void dpi_set_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ DSSDBG("dpi_set_timings\n"); ++ display->panel->timings = *timings; ++ if (display->state == OMAP_DSS_DISPLAY_ACTIVE) { ++ dpi_set_mode(display); ++ dispc_go(OMAP_DSS_CHANNEL_LCD); ++ } ++} ++ ++static int dpi_check_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ bool is_tft; ++ int r; ++ int lck_div, pck_div; ++ unsigned long fck; ++ unsigned long pck; ++ ++ if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { ++ if (timings->hsw < 1 || timings->hsw > 64 || ++ timings->hfp < 1 || timings->hfp > 256 || ++ timings->hbp < 1 || timings->hbp > 256) { ++ return -EINVAL; ++ } ++ ++ if (timings->vsw < 1 || timings->vsw > 64 || ++ timings->vfp > 255 || timings->vbp > 255) { ++ return -EINVAL; ++ } ++ } else { ++ if (timings->hsw < 1 || timings->hsw > 256 || ++ timings->hfp < 1 || timings->hfp > 4096 || ++ timings->hbp < 1 || timings->hbp > 4096) { ++ return -EINVAL; ++ } ++ ++ if (timings->vsw < 1 || timings->vsw > 64 || ++ timings->vfp > 4095 || timings->vbp > 4095) { ++ return -EINVAL; ++ } ++ } ++ ++ if (timings->pixel_clock == 0) ++ return -EINVAL; ++ ++ is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0; ++ ++#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL ++ { ++ struct dsi_clock_info cinfo; ++ r = dsi_pll_calc_pck(is_tft, timings->pixel_clock * 1000, ++ &cinfo); ++ ++ if (r) ++ return r; ++ ++ fck = cinfo.dsi1_pll_fclk; ++ lck_div = cinfo.lck_div; ++ pck_div = cinfo.pck_div; ++ } ++#else ++ { ++ struct dispc_clock_info cinfo; ++ r = dispc_calc_clock_div(is_tft, timings->pixel_clock * 1000, ++ &cinfo); ++ ++ if (r) ++ return r; ++ ++ fck = cinfo.fck; ++ lck_div = cinfo.lck_div; ++ pck_div = cinfo.pck_div; ++ } ++#endif ++ ++ pck = fck / lck_div / pck_div / 1000; ++ ++ timings->pixel_clock = pck; ++ ++ return 0; ++} ++ ++static void dpi_get_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ *timings = display->panel->timings; ++} ++ ++static int dpi_display_set_update_mode(struct omap_display *display, ++ enum omap_dss_update_mode mode) ++{ ++ if (mode == OMAP_DSS_UPDATE_MANUAL) ++ return -EINVAL; ++ ++ if (mode == OMAP_DSS_UPDATE_DISABLED) { ++ dispc_enable_lcd_out(0); ++ dpi.update_enabled = 0; ++ } else { ++ dispc_enable_lcd_out(1); ++ dpi.update_enabled = 1; ++ } ++ ++ return 0; ++} ++ ++static enum omap_dss_update_mode dpi_display_get_update_mode( ++ struct omap_display *display) ++{ ++ return dpi.update_enabled ? OMAP_DSS_UPDATE_AUTO : ++ OMAP_DSS_UPDATE_DISABLED; ++} ++ ++void dpi_init_display(struct omap_display *display) ++{ ++ DSSDBG("DPI init_display\n"); ++ ++ display->enable = dpi_display_enable; ++ display->disable = dpi_display_disable; ++ display->suspend = dpi_display_suspend; ++ display->resume = dpi_display_resume; ++ display->set_timings = dpi_set_timings; ++ display->check_timings = dpi_check_timings; ++ display->get_timings = dpi_get_timings; ++ display->set_update_mode = dpi_display_set_update_mode; ++ display->get_update_mode = dpi_display_get_update_mode; ++} ++ ++int dpi_init(void) ++{ ++ return 0; ++} ++ ++void dpi_exit(void) ++{ ++} ++ +diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c +new file mode 100644 +index 0000000..4442931 +--- /dev/null ++++ b/drivers/video/omap2/dss/dsi.c +@@ -0,0 +1,3752 @@ ++/* ++ * linux/drivers/video/omap2/dss/dsi.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "DSI" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "dss.h" ++ ++/*#define VERBOSE_IRQ*/ ++ ++#define DSI_BASE 0x4804FC00 ++ ++struct dsi_reg { u16 idx; }; ++ ++#define DSI_REG(idx) ((const struct dsi_reg) { idx }) ++ ++#define DSI_SZ_REGS SZ_1K ++/* DSI Protocol Engine */ ++ ++#define DSI_REVISION DSI_REG(0x0000) ++#define DSI_SYSCONFIG DSI_REG(0x0010) ++#define DSI_SYSSTATUS DSI_REG(0x0014) ++#define DSI_IRQSTATUS DSI_REG(0x0018) ++#define DSI_IRQENABLE DSI_REG(0x001C) ++#define DSI_CTRL DSI_REG(0x0040) ++#define DSI_COMPLEXIO_CFG1 DSI_REG(0x0048) ++#define DSI_COMPLEXIO_IRQ_STATUS DSI_REG(0x004C) ++#define DSI_COMPLEXIO_IRQ_ENABLE DSI_REG(0x0050) ++#define DSI_CLK_CTRL DSI_REG(0x0054) ++#define DSI_TIMING1 DSI_REG(0x0058) ++#define DSI_TIMING2 DSI_REG(0x005C) ++#define DSI_VM_TIMING1 DSI_REG(0x0060) ++#define DSI_VM_TIMING2 DSI_REG(0x0064) ++#define DSI_VM_TIMING3 DSI_REG(0x0068) ++#define DSI_CLK_TIMING DSI_REG(0x006C) ++#define DSI_TX_FIFO_VC_SIZE DSI_REG(0x0070) ++#define DSI_RX_FIFO_VC_SIZE DSI_REG(0x0074) ++#define DSI_COMPLEXIO_CFG2 DSI_REG(0x0078) ++#define DSI_RX_FIFO_VC_FULLNESS DSI_REG(0x007C) ++#define DSI_VM_TIMING4 DSI_REG(0x0080) ++#define DSI_TX_FIFO_VC_EMPTINESS DSI_REG(0x0084) ++#define DSI_VM_TIMING5 DSI_REG(0x0088) ++#define DSI_VM_TIMING6 DSI_REG(0x008C) ++#define DSI_VM_TIMING7 DSI_REG(0x0090) ++#define DSI_STOPCLK_TIMING DSI_REG(0x0094) ++#define DSI_VC_CTRL(n) DSI_REG(0x0100 + (n * 0x20)) ++#define DSI_VC_TE(n) DSI_REG(0x0104 + (n * 0x20)) ++#define DSI_VC_LONG_PACKET_HEADER(n) DSI_REG(0x0108 + (n * 0x20)) ++#define DSI_VC_LONG_PACKET_PAYLOAD(n) DSI_REG(0x010C + (n * 0x20)) ++#define DSI_VC_SHORT_PACKET_HEADER(n) DSI_REG(0x0110 + (n * 0x20)) ++#define DSI_VC_IRQSTATUS(n) DSI_REG(0x0118 + (n * 0x20)) ++#define DSI_VC_IRQENABLE(n) DSI_REG(0x011C + (n * 0x20)) ++ ++/* DSIPHY_SCP */ ++ ++#define DSI_DSIPHY_CFG0 DSI_REG(0x200 + 0x0000) ++#define DSI_DSIPHY_CFG1 DSI_REG(0x200 + 0x0004) ++#define DSI_DSIPHY_CFG2 DSI_REG(0x200 + 0x0008) ++#define DSI_DSIPHY_CFG5 DSI_REG(0x200 + 0x0014) ++ ++/* DSI_PLL_CTRL_SCP */ ++ ++#define DSI_PLL_CONTROL DSI_REG(0x300 + 0x0000) ++#define DSI_PLL_STATUS DSI_REG(0x300 + 0x0004) ++#define DSI_PLL_GO DSI_REG(0x300 + 0x0008) ++#define DSI_PLL_CONFIGURATION1 DSI_REG(0x300 + 0x000C) ++#define DSI_PLL_CONFIGURATION2 DSI_REG(0x300 + 0x0010) ++ ++#define REG_GET(idx, start, end) \ ++ FLD_GET(dsi_read_reg(idx), start, end) ++ ++#define REG_FLD_MOD(idx, val, start, end) \ ++ dsi_write_reg(idx, FLD_MOD(dsi_read_reg(idx), val, start, end)) ++ ++/* Global interrupts */ ++#define DSI_IRQ_VC0 (1 << 0) ++#define DSI_IRQ_VC1 (1 << 1) ++#define DSI_IRQ_VC2 (1 << 2) ++#define DSI_IRQ_VC3 (1 << 3) ++#define DSI_IRQ_WAKEUP (1 << 4) ++#define DSI_IRQ_RESYNC (1 << 5) ++#define DSI_IRQ_PLL_LOCK (1 << 7) ++#define DSI_IRQ_PLL_UNLOCK (1 << 8) ++#define DSI_IRQ_PLL_RECALL (1 << 9) ++#define DSI_IRQ_COMPLEXIO_ERR (1 << 10) ++#define DSI_IRQ_HS_TX_TIMEOUT (1 << 14) ++#define DSI_IRQ_LP_RX_TIMEOUT (1 << 15) ++#define DSI_IRQ_TE_TRIGGER (1 << 16) ++#define DSI_IRQ_ACK_TRIGGER (1 << 17) ++#define DSI_IRQ_SYNC_LOST (1 << 18) ++#define DSI_IRQ_LDO_POWER_GOOD (1 << 19) ++#define DSI_IRQ_TA_TIMEOUT (1 << 20) ++#define DSI_IRQ_ERROR_MASK \ ++ (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \ ++ DSI_IRQ_TA_TIMEOUT) ++#define DSI_IRQ_CHANNEL_MASK 0xf ++ ++/* Virtual channel interrupts */ ++#define DSI_VC_IRQ_CS (1 << 0) ++#define DSI_VC_IRQ_ECC_CORR (1 << 1) ++#define DSI_VC_IRQ_PACKET_SENT (1 << 2) ++#define DSI_VC_IRQ_FIFO_TX_OVF (1 << 3) ++#define DSI_VC_IRQ_FIFO_RX_OVF (1 << 4) ++#define DSI_VC_IRQ_BTA (1 << 5) ++#define DSI_VC_IRQ_ECC_NO_CORR (1 << 6) ++#define DSI_VC_IRQ_FIFO_TX_UDF (1 << 7) ++#define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8) ++#define DSI_VC_IRQ_ERROR_MASK \ ++ (DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \ ++ DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \ ++ DSI_VC_IRQ_FIFO_TX_UDF) ++ ++/* ComplexIO interrupts */ ++#define DSI_CIO_IRQ_ERRSYNCESC1 (1 << 0) ++#define DSI_CIO_IRQ_ERRSYNCESC2 (1 << 1) ++#define DSI_CIO_IRQ_ERRSYNCESC3 (1 << 2) ++#define DSI_CIO_IRQ_ERRESC1 (1 << 5) ++#define DSI_CIO_IRQ_ERRESC2 (1 << 6) ++#define DSI_CIO_IRQ_ERRESC3 (1 << 7) ++#define DSI_CIO_IRQ_ERRCONTROL1 (1 << 10) ++#define DSI_CIO_IRQ_ERRCONTROL2 (1 << 11) ++#define DSI_CIO_IRQ_ERRCONTROL3 (1 << 12) ++#define DSI_CIO_IRQ_STATEULPS1 (1 << 15) ++#define DSI_CIO_IRQ_STATEULPS2 (1 << 16) ++#define DSI_CIO_IRQ_STATEULPS3 (1 << 17) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP0_1 (1 << 20) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP1_1 (1 << 21) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP0_2 (1 << 22) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP1_2 (1 << 23) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP0_3 (1 << 24) ++#define DSI_CIO_IRQ_ERRCONTENTIONLP1_3 (1 << 25) ++#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0 (1 << 30) ++#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1 (1 << 31) ++ ++#define DSI_DT_DCS_SHORT_WRITE_0 0x05 ++#define DSI_DT_DCS_SHORT_WRITE_1 0x15 ++#define DSI_DT_DCS_READ 0x06 ++#define DSI_DT_SET_MAX_RET_PKG_SIZE 0x37 ++#define DSI_DT_NULL_PACKET 0x09 ++#define DSI_DT_DCS_LONG_WRITE 0x39 ++ ++#define DSI_DT_RX_ACK_WITH_ERR 0x02 ++#define DSI_DT_RX_DCS_LONG_READ 0x1c ++#define DSI_DT_RX_SHORT_READ_1 0x21 ++#define DSI_DT_RX_SHORT_READ_2 0x22 ++ ++#define FINT_MAX 2100000 ++#define FINT_MIN 750000 ++#define REGN_MAX (1 << 7) ++#define REGM_MAX ((1 << 11) - 1) ++#define REGM3_MAX (1 << 4) ++#define REGM4_MAX (1 << 4) ++ ++enum fifo_size { ++ DSI_FIFO_SIZE_0 = 0, ++ DSI_FIFO_SIZE_32 = 1, ++ DSI_FIFO_SIZE_64 = 2, ++ DSI_FIFO_SIZE_96 = 3, ++ DSI_FIFO_SIZE_128 = 4, ++}; ++ ++#define DSI_CMD_FIFO_LEN 16 ++ ++struct dsi_cmd_update { ++ int bytespp; ++ u16 x; ++ u16 y; ++ u16 w; ++ u16 h; ++}; ++ ++struct dsi_cmd_mem_read { ++ void *buf; ++ size_t size; ++ u16 x; ++ u16 y; ++ u16 w; ++ u16 h; ++ size_t *ret_size; ++ struct completion *completion; ++}; ++ ++struct dsi_cmd_test { ++ int test_num; ++ int *result; ++ struct completion *completion; ++}; ++ ++enum dsi_cmd { ++ DSI_CMD_UPDATE, ++ DSI_CMD_AUTOUPDATE, ++ DSI_CMD_SYNC, ++ DSI_CMD_MEM_READ, ++ DSI_CMD_TEST, ++ DSI_CMD_SET_TE, ++ DSI_CMD_SET_UPDATE_MODE, ++ DSI_CMD_SET_ROTATE, ++ DSI_CMD_SET_MIRROR, ++}; ++ ++struct dsi_cmd_item { ++ struct omap_display *display; ++ ++ enum dsi_cmd cmd; ++ ++ union { ++ struct dsi_cmd_update r; ++ struct completion *sync; ++ struct dsi_cmd_mem_read mem_read; ++ struct dsi_cmd_test test; ++ int te; ++ enum omap_dss_update_mode update_mode; ++ int rotate; ++ int mirror; ++ } u; ++}; ++ ++static struct ++{ ++ void __iomem *base; ++ ++ unsigned long dsi1_pll_fclk; /* Hz */ ++ unsigned long dsi2_pll_fclk; /* Hz */ ++ unsigned long dsiphy; /* Hz */ ++ unsigned long ddr_clk; /* Hz */ ++ ++ struct { ++ struct omap_display *display; ++ enum fifo_size fifo_size; ++ int dest_per; /* destination peripheral 0-3 */ ++ } vc[4]; ++ ++ struct mutex lock; ++ ++ unsigned pll_locked; ++ ++ struct completion bta_completion; ++ ++ struct work_struct framedone_work; ++ struct work_struct process_work; ++ struct workqueue_struct *workqueue; ++ ++ enum omap_dss_update_mode user_update_mode; ++ enum omap_dss_update_mode target_update_mode; ++ enum omap_dss_update_mode update_mode; ++ int use_te; ++ int framedone_scheduled; /* helps to catch strange framedone bugs */ ++ ++ unsigned long cache_req_pck; ++ unsigned long cache_clk_freq; ++ struct dsi_clock_info cache_cinfo; ++ ++ struct kfifo *cmd_fifo; ++ spinlock_t cmd_lock; ++ struct completion cmd_done; ++ atomic_t cmd_fifo_full; ++ atomic_t cmd_pending; ++ ++ bool autoupdate_setup; ++ ++#ifdef DEBUG ++ ktime_t perf_setup_time; ++ ktime_t perf_start_time; ++ int perf_measure_frames; ++ ++ struct { ++ int x, y, w, h; ++ int bytespp; ++ } update_region; ++ ++#endif ++ int debug_process; ++ int debug_read; ++ int debug_write; ++} dsi; ++ ++#ifdef DEBUG ++static unsigned int dsi_perf; ++module_param_named(dsi_perf, dsi_perf, bool, 0644); ++#endif ++ ++static void dsi_process_cmd_fifo(struct work_struct *work); ++static void dsi_push_update(struct omap_display *display, ++ int x, int y, int w, int h); ++static void dsi_push_autoupdate(struct omap_display *display); ++ ++static inline void dsi_write_reg(const struct dsi_reg idx, u32 val) ++{ ++ __raw_writel(val, dsi.base + idx.idx); ++} ++ ++static inline u32 dsi_read_reg(const struct dsi_reg idx) ++{ ++ return __raw_readl(dsi.base + idx.idx); ++} ++ ++ ++void dsi_save_context(void) ++{ ++} ++ ++void dsi_restore_context(void) ++{ ++} ++ ++static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum, ++ int value) ++{ ++ int t = 100000; ++ ++ while (REG_GET(idx, bitnum, bitnum) != value) { ++ if (--t == 0) ++ return !value; ++ } ++ ++ return value; ++} ++ ++#ifdef DEBUG ++static void perf_mark_setup(void) ++{ ++ dsi.perf_setup_time = ktime_get(); ++} ++ ++static void perf_mark_start(void) ++{ ++ dsi.perf_start_time = ktime_get(); ++} ++ ++static void perf_show(const char *name) ++{ ++ ktime_t t, setup_time, trans_time; ++ u32 total_bytes; ++ u32 setup_us, trans_us, total_us; ++ const int numframes = 100; ++ static u32 s_trans_us, s_min_us = 0xffffffff, s_max_us; ++ ++ if (!dsi_perf) ++ return; ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED) ++ return; ++ ++ t = ktime_get(); ++ ++ setup_time = ktime_sub(dsi.perf_start_time, dsi.perf_setup_time); ++ setup_us = (u32)ktime_to_us(setup_time); ++ if (setup_us == 0) ++ setup_us = 1; ++ ++ trans_time = ktime_sub(t, dsi.perf_start_time); ++ trans_us = (u32)ktime_to_us(trans_time); ++ if (trans_us == 0) ++ trans_us = 1; ++ ++ total_us = setup_us + trans_us; ++ ++ total_bytes = dsi.update_region.w * ++ dsi.update_region.h * ++ dsi.update_region.bytespp; ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) { ++ dsi.perf_measure_frames++; ++ ++ if (trans_us < s_min_us) ++ s_min_us = trans_us; ++ ++ if (trans_us > s_max_us) ++ s_max_us = trans_us; ++ ++ s_trans_us += trans_us; ++ ++ if (dsi.perf_measure_frames < numframes) ++ return; ++ ++ DSSINFO("%s update: %d frames in %u us " ++ "(min/max/avg %u/%u/%u), %u fps\n", ++ name, numframes, ++ s_trans_us, ++ s_min_us, ++ s_max_us, ++ s_trans_us / numframes, ++ 1000*1000 / (s_trans_us / numframes)); ++ ++ dsi.perf_measure_frames = 0; ++ s_trans_us = 0; ++ s_min_us = 0xffffffff; ++ s_max_us = 0; ++ } else { ++ DSSINFO("%s update %u us + %u us = %u us (%uHz), %u bytes, " ++ "%u kbytes/sec\n", ++ name, ++ setup_us, ++ trans_us, ++ total_us, ++ 1000*1000 / total_us, ++ total_bytes, ++ total_bytes * 1000 / total_us); ++ } ++} ++#else ++#define perf_mark_setup() ++#define perf_mark_start() ++#define perf_show(x) ++#endif ++ ++static void print_irq_status(u32 status) ++{ ++#ifndef VERBOSE_IRQ ++ if ((status & ~DSI_IRQ_CHANNEL_MASK) == 0) ++ return; ++#endif ++ printk(KERN_DEBUG "DSI IRQ: 0x%x: ", status); ++ ++#define PIS(x) \ ++ if (status & DSI_IRQ_##x) \ ++ printk(#x " "); ++#ifdef VERBOSE_IRQ ++ PIS(VC0); ++ PIS(VC1); ++ PIS(VC2); ++ PIS(VC3); ++#endif ++ PIS(WAKEUP); ++ PIS(RESYNC); ++ PIS(PLL_LOCK); ++ PIS(PLL_UNLOCK); ++ PIS(PLL_RECALL); ++ PIS(COMPLEXIO_ERR); ++ PIS(HS_TX_TIMEOUT); ++ PIS(LP_RX_TIMEOUT); ++ PIS(TE_TRIGGER); ++ PIS(ACK_TRIGGER); ++ PIS(SYNC_LOST); ++ PIS(LDO_POWER_GOOD); ++ PIS(TA_TIMEOUT); ++#undef PIS ++ ++ printk("\n"); ++} ++ ++static void print_irq_status_vc(int channel, u32 status) ++{ ++#ifndef VERBOSE_IRQ ++ if ((status & ~DSI_VC_IRQ_PACKET_SENT) == 0) ++ return; ++#endif ++ printk(KERN_DEBUG "DSI VC(%d) IRQ 0x%x: ", channel, status); ++ ++#define PIS(x) \ ++ if (status & DSI_VC_IRQ_##x) \ ++ printk(#x " "); ++ PIS(CS); ++ PIS(ECC_CORR); ++#ifdef VERBOSE_IRQ ++ PIS(PACKET_SENT); ++#endif ++ PIS(FIFO_TX_OVF); ++ PIS(FIFO_RX_OVF); ++ PIS(BTA); ++ PIS(ECC_NO_CORR); ++ PIS(FIFO_TX_UDF); ++ PIS(PP_BUSY_CHANGE); ++#undef PIS ++ printk("\n"); ++} ++ ++static void print_irq_status_cio(u32 status) ++{ ++ printk(KERN_DEBUG "DSI CIO IRQ 0x%x: ", status); ++ ++#define PIS(x) \ ++ if (status & DSI_CIO_IRQ_##x) \ ++ printk(#x " "); ++ PIS(ERRSYNCESC1); ++ PIS(ERRSYNCESC2); ++ PIS(ERRSYNCESC3); ++ PIS(ERRESC1); ++ PIS(ERRESC2); ++ PIS(ERRESC3); ++ PIS(ERRCONTROL1); ++ PIS(ERRCONTROL2); ++ PIS(ERRCONTROL3); ++ PIS(STATEULPS1); ++ PIS(STATEULPS2); ++ PIS(STATEULPS3); ++ PIS(ERRCONTENTIONLP0_1); ++ PIS(ERRCONTENTIONLP1_1); ++ PIS(ERRCONTENTIONLP0_2); ++ PIS(ERRCONTENTIONLP1_2); ++ PIS(ERRCONTENTIONLP0_3); ++ PIS(ERRCONTENTIONLP1_3); ++ PIS(ULPSACTIVENOT_ALL0); ++ PIS(ULPSACTIVENOT_ALL1); ++#undef PIS ++ ++ printk("\n"); ++} ++ ++static int debug_irq; ++ ++/* called from dss */ ++void dsi_irq_handler(void) ++{ ++ u32 irqstatus, vcstatus, ciostatus; ++ int i; ++ ++ irqstatus = dsi_read_reg(DSI_IRQSTATUS); ++ ++ if (irqstatus & DSI_IRQ_ERROR_MASK) { ++ DSSERR("DSI error, irqstatus %x\n", irqstatus); ++ print_irq_status(irqstatus); ++ } else if (debug_irq) { ++ print_irq_status(irqstatus); ++ } ++ ++ for (i = 0; i < 4; ++i) { ++ if ((irqstatus & (1< 30*1000*1000) ++ REG_FLD_MOD(DSI_CLK_CTRL, 1, 21, 21); /* LP_RX_SYNCHRO_ENABLE */ ++ ++ return 0; ++} ++ ++ ++enum dsi_pll_power_state { ++ DSI_PLL_POWER_OFF = 0x0, ++ DSI_PLL_POWER_ON_HSCLK = 0x1, ++ DSI_PLL_POWER_ON_ALL = 0x2, ++ DSI_PLL_POWER_ON_DIV = 0x3, ++}; ++ ++static int dsi_pll_power(enum dsi_pll_power_state state) ++{ ++ int t = 0; ++ ++ REG_FLD_MOD(DSI_CLK_CTRL, state, 31, 30); /* PLL_PWR_CMD */ ++ ++ /* PLL_PWR_STATUS */ ++ while (FLD_GET(dsi_read_reg(DSI_CLK_CTRL), 29, 28) != state) { ++ udelay(1); ++ if (t++ > 1000) { ++ DSSERR("Failed to set DSI PLL power mode to %d\n", ++ state); ++ return -ENODEV; ++ } ++ } ++ ++ return 0; ++} ++ ++int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck, ++ struct dsi_clock_info *cinfo) ++{ ++ struct dsi_clock_info cur, best; ++ int min_fck_per_pck; ++ int match = 0; ++ ++ if (req_pck == dsi.cache_req_pck && ++ dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) { ++ DSSDBG("DSI clock info found from cache\n"); ++ *cinfo = dsi.cache_cinfo; ++ return 0; ++ } ++ ++ min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; ++ ++ if (min_fck_per_pck && ++ req_pck * min_fck_per_pck > DISPC_MAX_FCK) { ++ DSSERR("Requested pixel clock not possible with the current " ++ "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " ++ "the constraint off.\n"); ++ min_fck_per_pck = 0; ++ } ++ ++ DSSDBG("dsi_pll_calc\n"); ++ ++retry: ++ memset(&best, 0, sizeof(best)); ++ ++ memset(&cur, 0, sizeof(cur)); ++ cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2); ++ cur.use_dss2_fck = 1; ++ cur.highfreq = 0; ++ ++ /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ ++ /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ ++ /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ ++ for (cur.regn = 1; cur.regn < REGN_MAX; ++cur.regn) { ++ if (cur.highfreq == 0) ++ cur.fint = cur.clkin / cur.regn; ++ else ++ cur.fint = cur.clkin / (2 * cur.regn); ++ ++ if (cur.fint > FINT_MAX || cur.fint < FINT_MIN) ++ continue; ++ ++ /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ ++ for (cur.regm = 1; cur.regm < REGM_MAX; ++cur.regm) { ++ unsigned long a, b; ++ ++ a = 2 * cur.regm * (cur.clkin/1000); ++ b = cur.regn * (cur.highfreq + 1); ++ cur.dsiphy = a / b * 1000; ++ ++ if (cur.dsiphy > 1800 * 1000 * 1000) ++ break; ++ ++ /* DSI1_PLL_FCLK(MHz) = DSIPHY(MHz) / regm3 < 173MHz */ ++ for (cur.regm3 = 1; cur.regm3 < REGM3_MAX; ++ ++cur.regm3) { ++ cur.dsi1_pll_fclk = cur.dsiphy / cur.regm3; ++ ++ /* this will narrow down the search a bit, ++ * but still give pixclocks below what was ++ * requested */ ++ if (cur.dsi1_pll_fclk < req_pck) ++ break; ++ ++ if (cur.dsi1_pll_fclk > DISPC_MAX_FCK) ++ continue; ++ ++ if (min_fck_per_pck && ++ cur.dsi1_pll_fclk < ++ req_pck * min_fck_per_pck) ++ continue; ++ ++ match = 1; ++ ++ find_lck_pck_divs(is_tft, req_pck, ++ cur.dsi1_pll_fclk, ++ &cur.lck_div, ++ &cur.pck_div); ++ ++ cur.lck = cur.dsi1_pll_fclk / cur.lck_div; ++ cur.pck = cur.lck / cur.pck_div; ++ ++ if (abs(cur.pck - req_pck) < ++ abs(best.pck - req_pck)) { ++ best = cur; ++ ++ if (cur.pck == req_pck) ++ goto found; ++ } ++ } ++ } ++ } ++found: ++ if (!match) { ++ if (min_fck_per_pck) { ++ DSSERR("Could not find suitable clock settings.\n" ++ "Turning FCK/PCK constraint off and" ++ "trying again.\n"); ++ min_fck_per_pck = 0; ++ goto retry; ++ } ++ ++ DSSERR("Could not find suitable clock settings.\n"); ++ ++ return -EINVAL; ++ } ++ ++ /* DSI2_PLL_FCLK (regm4) is not used. Set it to something sane. */ ++ best.regm4 = best.dsiphy / 48000000; ++ if (best.regm4 > REGM4_MAX) ++ best.regm4 = REGM4_MAX; ++ else if (best.regm4 == 0) ++ best.regm4 = 1; ++ best.dsi2_pll_fclk = best.dsiphy / best.regm4; ++ ++ if (cinfo) ++ *cinfo = best; ++ ++ dsi.cache_req_pck = req_pck; ++ dsi.cache_clk_freq = 0; ++ dsi.cache_cinfo = best; ++ ++ return 0; ++} ++ ++static int dsi_pll_calc_ddrfreq(unsigned long clk_freq, ++ struct dsi_clock_info *cinfo) ++{ ++ struct dsi_clock_info cur, best; ++ const bool use_dss2_fck = 1; ++ unsigned long datafreq; ++ ++ DSSDBG("dsi_pll_calc_ddrfreq\n"); ++ ++ if (clk_freq == dsi.cache_clk_freq && ++ dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) { ++ DSSDBG("DSI clock info found from cache\n"); ++ *cinfo = dsi.cache_cinfo; ++ return 0; ++ } ++ ++ datafreq = clk_freq * 4; ++ ++ memset(&best, 0, sizeof(best)); ++ ++ memset(&cur, 0, sizeof(cur)); ++ cur.use_dss2_fck = use_dss2_fck; ++ if (use_dss2_fck) { ++ cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2); ++ cur.highfreq = 0; ++ } else { ++ cur.clkin = dispc_pclk_rate(); ++ if (cur.clkin < 32000000) ++ cur.highfreq = 0; ++ else ++ cur.highfreq = 1; ++ } ++ ++ /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ ++ /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ ++ /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ ++ for (cur.regn = 1; cur.regn < REGN_MAX; ++cur.regn) { ++ if (cur.highfreq == 0) ++ cur.fint = cur.clkin / cur.regn; ++ else ++ cur.fint = cur.clkin / (2 * cur.regn); ++ ++ if (cur.fint > FINT_MAX || cur.fint < FINT_MIN) ++ continue; ++ ++ /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ ++ for (cur.regm = 1; cur.regm < REGM_MAX; ++cur.regm) { ++ unsigned long a, b; ++ ++ a = 2 * cur.regm * (cur.clkin/1000); ++ b = cur.regn * (cur.highfreq + 1); ++ cur.dsiphy = a / b * 1000; ++ ++ if (cur.dsiphy > 1800 * 1000 * 1000) ++ break; ++ ++ if (abs(cur.dsiphy - datafreq) < ++ abs(best.dsiphy - datafreq)) { ++ best = cur; ++ /* DSSDBG("best %ld\n", best.dsiphy); */ ++ } ++ ++ if (cur.dsiphy == datafreq) ++ goto found; ++ } ++ } ++found: ++ /* DSI1_PLL_FCLK (regm3) is not used. Set it to something sane. */ ++ best.regm3 = best.dsiphy / 48000000; ++ if (best.regm3 > REGM3_MAX) ++ best.regm3 = REGM3_MAX; ++ else if (best.regm3 == 0) ++ best.regm3 = 1; ++ best.dsi1_pll_fclk = best.dsiphy / best.regm3; ++ ++ /* DSI2_PLL_FCLK (regm4) is not used. Set it to something sane. */ ++ best.regm4 = best.dsiphy / 48000000; ++ if (best.regm4 > REGM4_MAX) ++ best.regm4 = REGM4_MAX; ++ else if (best.regm4 == 0) ++ best.regm4 = 1; ++ best.dsi2_pll_fclk = best.dsiphy / best.regm4; ++ ++ if (cinfo) ++ *cinfo = best; ++ ++ dsi.cache_clk_freq = clk_freq; ++ dsi.cache_req_pck = 0; ++ dsi.cache_cinfo = best; ++ ++ return 0; ++} ++ ++int dsi_pll_program(struct dsi_clock_info *cinfo) ++{ ++ int r = 0; ++ u32 l; ++ ++ DSSDBG("dsi_pll_program\n"); ++ ++ dsi.dsiphy = cinfo->dsiphy; ++ dsi.ddr_clk = dsi.dsiphy / 4; ++ dsi.dsi1_pll_fclk = cinfo->dsi1_pll_fclk; ++ dsi.dsi2_pll_fclk = cinfo->dsi2_pll_fclk; ++ ++ DSSDBG("DSI Fint %ld\n", cinfo->fint); ++ ++ DSSDBG("clkin (%s) rate %ld, highfreq %d\n", ++ cinfo->use_dss2_fck ? "dss2_fck" : "pclkfree", ++ cinfo->clkin, ++ cinfo->highfreq); ++ ++ /* DSIPHY == CLKIN4DDR */ ++ DSSDBG("DSIPHY = 2 * %d / %d * %lu / %d = %lu\n", ++ cinfo->regm, ++ cinfo->regn, ++ cinfo->clkin, ++ cinfo->highfreq + 1, ++ cinfo->dsiphy); ++ ++ DSSDBG("Data rate on 1 DSI lane %ld Mbps\n", ++ dsi.dsiphy / 1000 / 1000 / 2); ++ ++ DSSDBG("Clock lane freq %ld Hz\n", dsi.ddr_clk); ++ ++ DSSDBG("regm3 = %d, dsi1_pll_fclk = %lu\n", ++ cinfo->regm3, cinfo->dsi1_pll_fclk); ++ DSSDBG("regm4 = %d, dsi2_pll_fclk = %lu\n", ++ cinfo->regm4, cinfo->dsi2_pll_fclk); ++ ++ REG_FLD_MOD(DSI_PLL_CONTROL, 0, 0, 0); /* DSI_PLL_AUTOMODE = manual */ ++ ++ l = dsi_read_reg(DSI_PLL_CONFIGURATION1); ++ l = FLD_MOD(l, 1, 0, 0); /* DSI_PLL_STOPMODE */ ++ l = FLD_MOD(l, cinfo->regn - 1, 7, 1); /* DSI_PLL_REGN */ ++ l = FLD_MOD(l, cinfo->regm, 18, 8); /* DSI_PLL_REGM */ ++ l = FLD_MOD(l, cinfo->regm3 - 1, 22, 19); /* DSI_CLOCK_DIV */ ++ l = FLD_MOD(l, cinfo->regm4 - 1, 26, 23); /* DSIPROTO_CLOCK_DIV */ ++ dsi_write_reg(DSI_PLL_CONFIGURATION1, l); ++ ++ l = dsi_read_reg(DSI_PLL_CONFIGURATION2); ++ l = FLD_MOD(l, 7, 4, 1); /* DSI_PLL_FREQSEL */ ++ /* DSI_PLL_CLKSEL */ ++ l = FLD_MOD(l, cinfo->use_dss2_fck ? 0 : 1, 11, 11); ++ l = FLD_MOD(l, cinfo->highfreq, 12, 12); /* DSI_PLL_HIGHFREQ */ ++ l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ ++ l = FLD_MOD(l, 0, 14, 14); /* DSIPHY_CLKINEN */ ++ l = FLD_MOD(l, 1, 20, 20); /* DSI_HSDIVBYPASS */ ++ dsi_write_reg(DSI_PLL_CONFIGURATION2, l); ++ ++ REG_FLD_MOD(DSI_PLL_GO, 1, 0, 0); /* DSI_PLL_GO */ ++ ++ if (wait_for_bit_change(DSI_PLL_GO, 0, 0) != 0) { ++ DSSERR("dsi pll go bit not going down.\n"); ++ r = -EIO; ++ goto err; ++ } ++ ++ if (wait_for_bit_change(DSI_PLL_STATUS, 1, 1) != 1) { ++ DSSERR("cannot lock PLL\n"); ++ r = -EIO; ++ goto err; ++ } ++ ++ dsi.pll_locked = 1; ++ ++ l = dsi_read_reg(DSI_PLL_CONFIGURATION2); ++ l = FLD_MOD(l, 0, 0, 0); /* DSI_PLL_IDLE */ ++ l = FLD_MOD(l, 0, 5, 5); /* DSI_PLL_PLLLPMODE */ ++ l = FLD_MOD(l, 0, 6, 6); /* DSI_PLL_LOWCURRSTBY */ ++ l = FLD_MOD(l, 0, 7, 7); /* DSI_PLL_TIGHTPHASELOCK */ ++ l = FLD_MOD(l, 0, 8, 8); /* DSI_PLL_DRIFTGUARDEN */ ++ l = FLD_MOD(l, 0, 10, 9); /* DSI_PLL_LOCKSEL */ ++ l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ ++ l = FLD_MOD(l, 1, 14, 14); /* DSIPHY_CLKINEN */ ++ l = FLD_MOD(l, 0, 15, 15); /* DSI_BYPASSEN */ ++ l = FLD_MOD(l, 1, 16, 16); /* DSS_CLOCK_EN */ ++ l = FLD_MOD(l, 0, 17, 17); /* DSS_CLOCK_PWDN */ ++ l = FLD_MOD(l, 1, 18, 18); /* DSI_PROTO_CLOCK_EN */ ++ l = FLD_MOD(l, 0, 19, 19); /* DSI_PROTO_CLOCK_PWDN */ ++ l = FLD_MOD(l, 0, 20, 20); /* DSI_HSDIVBYPASS */ ++ dsi_write_reg(DSI_PLL_CONFIGURATION2, l); ++ ++ DSSDBG("PLL config done\n"); ++err: ++ return r; ++} ++ ++int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv) ++{ ++ int r = 0; ++ enum dsi_pll_power_state pwstate; ++ struct dispc_clock_info cinfo; ++ ++ DSSDBG("PLL init\n"); ++ ++ enable_clocks(1); ++ dsi_enable_pll_clock(1); ++ ++ /* configure dispc fck and pixel clock to something sane */ ++ r = dispc_calc_clock_div(1, 48 * 1000 * 1000, &cinfo); ++ if (r) ++ goto err0; ++ ++ r = dispc_set_clock_div(&cinfo); ++ if (r) { ++ DSSERR("Failed to set basic clocks\n"); ++ goto err0; ++ } ++ ++ r = dss_dsi_power_up(); ++ if (r) ++ goto err0; ++ ++ /* PLL does not come out of reset without this... */ ++ dispc_pck_free_enable(1); ++ ++ if (wait_for_bit_change(DSI_PLL_STATUS, 0, 1) != 1) { ++ DSSERR("PLL not coming out of reset.\n"); ++ r = -ENODEV; ++ goto err1; ++ } ++ ++ /* ... but if left on, we get problems when planes do not ++ * fill the whole display. No idea about this XXX */ ++ dispc_pck_free_enable(0); ++ ++ if (enable_hsclk && enable_hsdiv) ++ pwstate = DSI_PLL_POWER_ON_ALL; ++ else if (enable_hsclk) ++ pwstate = DSI_PLL_POWER_ON_HSCLK; ++ else if (enable_hsdiv) ++ pwstate = DSI_PLL_POWER_ON_DIV; ++ else ++ pwstate = DSI_PLL_POWER_OFF; ++ ++ r = dsi_pll_power(pwstate); ++ ++ if (r) ++ goto err1; ++ ++ DSSDBG("PLL init done\n"); ++ ++ return 0; ++err1: ++ dss_dsi_power_down(); ++err0: ++ enable_clocks(0); ++ dsi_enable_pll_clock(0); ++ return r; ++} ++ ++void dsi_pll_uninit(void) ++{ ++ enable_clocks(0); ++ dsi_enable_pll_clock(0); ++ ++ dsi.pll_locked = 0; ++ dsi_pll_power(DSI_PLL_POWER_OFF); ++ dss_dsi_power_down(); ++ DSSDBG("PLL uninit done\n"); ++} ++ ++unsigned long dsi_get_dsi1_pll_rate(void) ++{ ++ return dsi.dsi1_pll_fclk; ++} ++ ++unsigned long dsi_get_dsi2_pll_rate(void) ++{ ++ return dsi.dsi2_pll_fclk; ++} ++ ++void dsi_dump_clocks(struct seq_file *s) ++{ ++ int clksel; ++ ++ enable_clocks(1); ++ ++ clksel = REG_GET(DSI_PLL_CONFIGURATION2, 11, 11); ++ ++ seq_printf(s, "- dsi -\n"); ++ ++ seq_printf(s, "dsi fclk source = %s\n", ++ dss_get_dsi_clk_source() == 0 ? ++ "dss1_alwon_fclk" : "dsi2_pll_fclk"); ++ ++ seq_printf(s, "dsi pll source = %s\n", ++ clksel == 0 ? ++ "dss2_alwon_fclk" : "pclkfree"); ++ ++ seq_printf(s, "DSIPHY\t\t%lu\nDDR_CLK\t\t%lu\n", ++ dsi.dsiphy, dsi.ddr_clk); ++ ++ seq_printf(s, "dsi1_pll_fck\t%lu (%s)\n" ++ "dsi2_pll_fck\t%lu (%s)\n", ++ dsi.dsi1_pll_fclk, ++ dss_get_dispc_clk_source() == 0 ? "off" : "on", ++ dsi.dsi2_pll_fclk, ++ dss_get_dsi_clk_source() == 0 ? "off" : "on"); ++ ++ enable_clocks(0); ++} ++ ++void dsi_dump_regs(struct seq_file *s) ++{ ++#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(r)) ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ DUMPREG(DSI_REVISION); ++ DUMPREG(DSI_SYSCONFIG); ++ DUMPREG(DSI_SYSSTATUS); ++ DUMPREG(DSI_IRQSTATUS); ++ DUMPREG(DSI_IRQENABLE); ++ DUMPREG(DSI_CTRL); ++ DUMPREG(DSI_COMPLEXIO_CFG1); ++ DUMPREG(DSI_COMPLEXIO_IRQ_STATUS); ++ DUMPREG(DSI_COMPLEXIO_IRQ_ENABLE); ++ DUMPREG(DSI_CLK_CTRL); ++ DUMPREG(DSI_TIMING1); ++ DUMPREG(DSI_TIMING2); ++ DUMPREG(DSI_VM_TIMING1); ++ DUMPREG(DSI_VM_TIMING2); ++ DUMPREG(DSI_VM_TIMING3); ++ DUMPREG(DSI_CLK_TIMING); ++ DUMPREG(DSI_TX_FIFO_VC_SIZE); ++ DUMPREG(DSI_RX_FIFO_VC_SIZE); ++ DUMPREG(DSI_COMPLEXIO_CFG2); ++ DUMPREG(DSI_RX_FIFO_VC_FULLNESS); ++ DUMPREG(DSI_VM_TIMING4); ++ DUMPREG(DSI_TX_FIFO_VC_EMPTINESS); ++ DUMPREG(DSI_VM_TIMING5); ++ DUMPREG(DSI_VM_TIMING6); ++ DUMPREG(DSI_VM_TIMING7); ++ DUMPREG(DSI_STOPCLK_TIMING); ++ ++ DUMPREG(DSI_VC_CTRL(0)); ++ DUMPREG(DSI_VC_TE(0)); ++ DUMPREG(DSI_VC_LONG_PACKET_HEADER(0)); ++ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(0)); ++ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(0)); ++ DUMPREG(DSI_VC_IRQSTATUS(0)); ++ DUMPREG(DSI_VC_IRQENABLE(0)); ++ ++ DUMPREG(DSI_VC_CTRL(1)); ++ DUMPREG(DSI_VC_TE(1)); ++ DUMPREG(DSI_VC_LONG_PACKET_HEADER(1)); ++ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(1)); ++ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(1)); ++ DUMPREG(DSI_VC_IRQSTATUS(1)); ++ DUMPREG(DSI_VC_IRQENABLE(1)); ++ ++ DUMPREG(DSI_VC_CTRL(2)); ++ DUMPREG(DSI_VC_TE(2)); ++ DUMPREG(DSI_VC_LONG_PACKET_HEADER(2)); ++ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(2)); ++ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(2)); ++ DUMPREG(DSI_VC_IRQSTATUS(2)); ++ DUMPREG(DSI_VC_IRQENABLE(2)); ++ ++ DUMPREG(DSI_VC_CTRL(3)); ++ DUMPREG(DSI_VC_TE(3)); ++ DUMPREG(DSI_VC_LONG_PACKET_HEADER(3)); ++ DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(3)); ++ DUMPREG(DSI_VC_SHORT_PACKET_HEADER(3)); ++ DUMPREG(DSI_VC_IRQSTATUS(3)); ++ DUMPREG(DSI_VC_IRQENABLE(3)); ++ ++ DUMPREG(DSI_DSIPHY_CFG0); ++ DUMPREG(DSI_DSIPHY_CFG1); ++ DUMPREG(DSI_DSIPHY_CFG2); ++ DUMPREG(DSI_DSIPHY_CFG5); ++ ++ DUMPREG(DSI_PLL_CONTROL); ++ DUMPREG(DSI_PLL_STATUS); ++ DUMPREG(DSI_PLL_GO); ++ DUMPREG(DSI_PLL_CONFIGURATION1); ++ DUMPREG(DSI_PLL_CONFIGURATION2); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++#undef DUMPREG ++} ++ ++enum dsi_complexio_power_state { ++ DSI_COMPLEXIO_POWER_OFF = 0x0, ++ DSI_COMPLEXIO_POWER_ON = 0x1, ++ DSI_COMPLEXIO_POWER_ULPS = 0x2, ++}; ++ ++static int dsi_complexio_power(enum dsi_complexio_power_state state) ++{ ++ int t = 0; ++ ++ /* PWR_CMD */ ++ REG_FLD_MOD(DSI_COMPLEXIO_CFG1, state, 28, 27); ++ ++ /* PWR_STATUS */ ++ while (FLD_GET(dsi_read_reg(DSI_COMPLEXIO_CFG1), 26, 25) != state) { ++ udelay(1); ++ if (t++ > 1000) { ++ DSSERR("failed to set complexio power state to " ++ "%d\n", state); ++ return -ENODEV; ++ } ++ } ++ ++ return 0; ++} ++ ++static void dsi_complexio_config(struct omap_display *display) ++{ ++ u32 r; ++ ++ int clk_lane = display->hw_config.u.dsi.clk_lane; ++ int data1_lane = display->hw_config.u.dsi.data1_lane; ++ int data2_lane = display->hw_config.u.dsi.data2_lane; ++ int clk_pol = display->hw_config.u.dsi.clk_pol; ++ int data1_pol = display->hw_config.u.dsi.data1_pol; ++ int data2_pol = display->hw_config.u.dsi.data2_pol; ++ ++ r = dsi_read_reg(DSI_COMPLEXIO_CFG1); ++ r = FLD_MOD(r, clk_lane, 2, 0); ++ r = FLD_MOD(r, clk_pol, 3, 3); ++ r = FLD_MOD(r, data1_lane, 6, 4); ++ r = FLD_MOD(r, data1_pol, 7, 7); ++ r = FLD_MOD(r, data2_lane, 10, 8); ++ r = FLD_MOD(r, data2_pol, 11, 11); ++ dsi_write_reg(DSI_COMPLEXIO_CFG1, r); ++ ++ /* The configuration of the DSI complex I/O (number of data lanes, ++ position, differential order) should not be changed while ++ DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. In order for ++ the hardware to take into account a new configuration of the complex ++ I/O (done in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to ++ follow this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1, ++ then reset the DSS.DSI_CTRL[0] IF_EN to 0, then set ++ DSS.DSI_CLK_CTRL[20] LP_CLK_ENABLE to 1 and finally set again the ++ DSS.DSI_CTRL[0] IF_EN bit to 1. If the sequence is not followed, the ++ DSI complex I/O configuration is unknown. */ ++ ++ /* ++ REG_FLD_MOD(DSI_CTRL, 1, 0, 0); ++ REG_FLD_MOD(DSI_CTRL, 0, 0, 0); ++ REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20); ++ REG_FLD_MOD(DSI_CTRL, 1, 0, 0); ++ */ ++} ++ ++static inline unsigned ns2ddr(unsigned ns) ++{ ++ /* convert time in ns to ddr ticks, rounding up */ ++ return (ns * (dsi.ddr_clk/1000/1000) + 999) / 1000; ++} ++ ++static inline unsigned ddr2ns(unsigned ddr) ++{ ++ return ddr * 1000 * 1000 / (dsi.ddr_clk / 1000); ++} ++ ++static void dsi_complexio_timings(void) ++{ ++ u32 r; ++ u32 ths_prepare, ths_prepare_ths_zero, ths_trail, ths_exit; ++ u32 tlpx_half, tclk_trail, tclk_zero; ++ u32 tclk_prepare; ++ ++ /* calculate timings */ ++ ++ /* 1 * DDR_CLK = 2 * UI */ ++ ++ /* min 40ns + 4*UI max 85ns + 6*UI */ ++ ths_prepare = ns2ddr(59) + 2; ++ ++ /* min 145ns + 10*UI */ ++ ths_prepare_ths_zero = ns2ddr(145) + 5; ++ ++ /* min max(8*UI, 60ns+4*UI) */ ++ ths_trail = max((unsigned)4, ns2ddr(60) + 2); ++ ++ /* min 100ns */ ++ ths_exit = ns2ddr(100); ++ ++ /* tlpx min 50n */ ++ tlpx_half = ns2ddr(25); ++ ++ /* min 60ns */ ++ tclk_trail = ns2ddr(60); ++ ++ /* min 38ns, max 95ns */ ++ tclk_prepare = ns2ddr(38); ++ ++ /* min tclk-prepare + tclk-zero = 300ns */ ++ tclk_zero = ns2ddr(300 - 38); ++ ++ DSSDBG("ths_prepare %u (%uns), ths_prepare_ths_zero %u (%uns)\n", ++ ths_prepare, ddr2ns(ths_prepare), ++ ths_prepare_ths_zero, ddr2ns(ths_prepare_ths_zero)); ++ DSSDBG("ths_trail %u (%uns), ths_exit %u (%uns)\n", ++ ths_trail, ddr2ns(ths_trail), ++ ths_exit, ddr2ns(ths_exit)); ++ ++ DSSDBG("tlpx_half %u (%uns), tclk_trail %u (%uns), " ++ "tclk_zero %u (%uns)\n", ++ tlpx_half, ddr2ns(tlpx_half), ++ tclk_trail, ddr2ns(tclk_trail), ++ tclk_zero, ddr2ns(tclk_zero)); ++ DSSDBG("tclk_prepare %u (%uns)\n", ++ tclk_prepare, ddr2ns(tclk_prepare)); ++ ++ /* program timings */ ++ ++ r = dsi_read_reg(DSI_DSIPHY_CFG0); ++ r = FLD_MOD(r, ths_prepare, 31, 24); ++ r = FLD_MOD(r, ths_prepare_ths_zero, 23, 16); ++ r = FLD_MOD(r, ths_trail, 15, 8); ++ r = FLD_MOD(r, ths_exit, 7, 0); ++ dsi_write_reg(DSI_DSIPHY_CFG0, r); ++ ++ r = dsi_read_reg(DSI_DSIPHY_CFG1); ++ r = FLD_MOD(r, tlpx_half, 22, 16); ++ r = FLD_MOD(r, tclk_trail, 15, 8); ++ r = FLD_MOD(r, tclk_zero, 7, 0); ++ dsi_write_reg(DSI_DSIPHY_CFG1, r); ++ ++ r = dsi_read_reg(DSI_DSIPHY_CFG2); ++ r = FLD_MOD(r, tclk_prepare, 7, 0); ++ dsi_write_reg(DSI_DSIPHY_CFG2, r); ++} ++ ++ ++static int dsi_complexio_init(struct omap_display *display) ++{ ++ int r = 0; ++ ++ DSSDBG("dsi_complexio_init\n"); ++ ++ /* CIO_CLK_ICG, enable L3 clk to CIO */ ++ REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14); ++ ++ /* A dummy read using the SCP interface to any DSIPHY register is ++ * required after DSIPHY reset to complete the reset of the DSI complex ++ * I/O. */ ++ dsi_read_reg(DSI_DSIPHY_CFG5); ++ ++ if (wait_for_bit_change(DSI_DSIPHY_CFG5, 30, 1) != 1) { ++ DSSERR("ComplexIO PHY not coming out of reset.\n"); ++ r = -ENODEV; ++ goto err; ++ } ++ ++ dsi_complexio_config(display); ++ ++ r = dsi_complexio_power(DSI_COMPLEXIO_POWER_ON); ++ ++ if (r) ++ goto err; ++ ++ if (wait_for_bit_change(DSI_COMPLEXIO_CFG1, 29, 1) != 1) { ++ DSSERR("ComplexIO not coming out of reset.\n"); ++ r = -ENODEV; ++ goto err; ++ } ++ ++ if (wait_for_bit_change(DSI_COMPLEXIO_CFG1, 21, 1) != 1) { ++ DSSERR("ComplexIO LDO power down.\n"); ++ r = -ENODEV; ++ goto err; ++ } ++ ++ dsi_complexio_timings(); ++ ++ /* ++ The configuration of the DSI complex I/O (number of data lanes, ++ position, differential order) should not be changed while ++ DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. For the ++ hardware to recognize a new configuration of the complex I/O (done ++ in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to follow ++ this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1, next ++ reset the DSS.DSI_CTRL[0] IF_EN to 0, then set DSS.DSI_CLK_CTRL[20] ++ LP_CLK_ENABLE to 1, and finally, set again the DSS.DSI_CTRL[0] IF_EN ++ bit to 1. If the sequence is not followed, the DSi complex I/O ++ configuration is undetermined. ++ */ ++ dsi_if_enable(1); ++ dsi_if_enable(0); ++ REG_FLD_MOD(DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */ ++ dsi_if_enable(1); ++ dsi_if_enable(0); ++ ++ DSSDBG("CIO init done\n"); ++err: ++ return r; ++} ++ ++static void dsi_complexio_uninit(void) ++{ ++ dsi_complexio_power(DSI_COMPLEXIO_POWER_OFF); ++} ++ ++static int _dsi_wait_reset(void) ++{ ++ int i = 0; ++ ++ while (REG_GET(DSI_SYSSTATUS, 0, 0) == 0) { ++ if (i++ > 5) { ++ DSSERR("soft reset failed\n"); ++ return -ENODEV; ++ } ++ udelay(1); ++ } ++ ++ return 0; ++} ++ ++static int _dsi_reset(void) ++{ ++ /* Soft reset */ ++ REG_FLD_MOD(DSI_SYSCONFIG, 1, 1, 1); ++ return _dsi_wait_reset(); ++} ++ ++ ++static void dsi_config_tx_fifo(enum fifo_size size1, enum fifo_size size2, ++ enum fifo_size size3, enum fifo_size size4) ++{ ++ u32 r = 0; ++ int add = 0; ++ int i; ++ ++ dsi.vc[0].fifo_size = size1; ++ dsi.vc[1].fifo_size = size2; ++ dsi.vc[2].fifo_size = size3; ++ dsi.vc[3].fifo_size = size4; ++ ++ for (i = 0; i < 4; i++) { ++ u8 v; ++ int size = dsi.vc[i].fifo_size; ++ ++ if (add + size > 4) { ++ DSSERR("Illegal FIFO configuration\n"); ++ BUG(); ++ } ++ ++ v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); ++ r |= v << (8 * i); ++ /*DSSDBG("TX FIFO vc %d: size %d, add %d\n", i, size, add); */ ++ add += size; ++ } ++ ++ dsi_write_reg(DSI_TX_FIFO_VC_SIZE, r); ++} ++ ++static void dsi_config_rx_fifo(enum fifo_size size1, enum fifo_size size2, ++ enum fifo_size size3, enum fifo_size size4) ++{ ++ u32 r = 0; ++ int add = 0; ++ int i; ++ ++ dsi.vc[0].fifo_size = size1; ++ dsi.vc[1].fifo_size = size2; ++ dsi.vc[2].fifo_size = size3; ++ dsi.vc[3].fifo_size = size4; ++ ++ for (i = 0; i < 4; i++) { ++ u8 v; ++ int size = dsi.vc[i].fifo_size; ++ ++ if (add + size > 4) { ++ DSSERR("Illegal FIFO configuration\n"); ++ BUG(); ++ } ++ ++ v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); ++ r |= v << (8 * i); ++ /*DSSDBG("RX FIFO vc %d: size %d, add %d\n", i, size, add); */ ++ add += size; ++ } ++ ++ dsi_write_reg(DSI_RX_FIFO_VC_SIZE, r); ++} ++ ++static int dsi_force_tx_stop_mode_io(void) ++{ ++ u32 r; ++ ++ r = dsi_read_reg(DSI_TIMING1); ++ r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ ++ dsi_write_reg(DSI_TIMING1, r); ++ ++ if (wait_for_bit_change(DSI_TIMING1, 15, 0) != 0) { ++ DSSERR("TX_STOP bit not going down\n"); ++ return -EIO; ++ } ++ ++ return 0; ++} ++ ++static void dsi_vc_print_status(int channel) ++{ ++ u32 r; ++ ++ r = dsi_read_reg(DSI_VC_CTRL(channel)); ++ DSSDBG("vc %d: TX_FIFO_NOT_EMPTY %d, BTA_EN %d, VC_BUSY %d, " ++ "TX_FIFO_FULL %d, RX_FIFO_NOT_EMPTY %d, ", ++ channel, ++ FLD_GET(r, 5, 5), ++ FLD_GET(r, 6, 6), ++ FLD_GET(r, 15, 15), ++ FLD_GET(r, 16, 16), ++ FLD_GET(r, 20, 20)); ++ ++ r = dsi_read_reg(DSI_TX_FIFO_VC_EMPTINESS); ++ DSSDBG("EMPTINESS %d\n", (r >> (8 * channel)) & 0xff); ++} ++ ++static void dsi_vc_config(int channel) ++{ ++ u32 r; ++ ++ DSSDBG("dsi_vc_config %d\n", channel); ++ ++ r = dsi_read_reg(DSI_VC_CTRL(channel)); ++ ++ r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */ ++ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ ++ r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */ ++ r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */ ++ r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */ ++ r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */ ++ r = FLD_MOD(r, 0, 9, 9); /* MODE_SPEED, high speed on/off */ ++ ++ r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ ++ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ ++ ++ dsi_write_reg(DSI_VC_CTRL(channel), r); ++} ++ ++static void dsi_vc_config_vp(int channel) ++{ ++ u32 r; ++ ++ DSSDBG("dsi_vc_config_vp\n"); ++ ++ r = dsi_read_reg(DSI_VC_CTRL(channel)); ++ ++ r = FLD_MOD(r, 1, 1, 1); /* SOURCE, 1 = video port */ ++ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ ++ r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */ ++ r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */ ++ r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */ ++ r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */ ++ r = FLD_MOD(r, 1, 9, 9); /* MODE_SPEED, high speed on/off */ ++ ++ r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ ++ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ ++ ++ dsi_write_reg(DSI_VC_CTRL(channel), r); ++} ++ ++ ++static int dsi_vc_enable(int channel, bool enable) ++{ ++ DSSDBG("dsi_vc_enable channel %d, enable %d\n", channel, enable); ++ ++ enable = enable ? 1 : 0; ++ ++ REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 0, 0); ++ ++ if (wait_for_bit_change(DSI_VC_CTRL(channel), 0, enable) != enable) { ++ DSSERR("Failed to set dsi_vc_enable to %d\n", enable); ++ return -EIO; ++ } ++ ++ return 0; ++} ++ ++static void dsi_vc_enable_hs(int channel, bool enable) ++{ ++ DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable); ++ ++ dsi_vc_enable(channel, 0); ++ dsi_if_enable(0); ++ ++ REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 9, 9); ++ ++ dsi_vc_enable(channel, 1); ++ dsi_if_enable(1); ++ ++ dsi_force_tx_stop_mode_io(); ++} ++ ++static void dsi_vc_flush_long_data(int channel) ++{ ++ while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { ++ u32 val; ++ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); ++ DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n", ++ (val >> 0) & 0xff, ++ (val >> 8) & 0xff, ++ (val >> 16) & 0xff, ++ (val >> 24) & 0xff); ++ } ++} ++ ++static void dsi_show_rx_ack_with_err(u16 err) ++{ ++ DSSERR("\tACK with ERROR (%#x):\n", err); ++ if (err & (1 << 0)) ++ DSSERR("\t\tSoT Error\n"); ++ if (err & (1 << 1)) ++ DSSERR("\t\tSoT Sync Error\n"); ++ if (err & (1 << 2)) ++ DSSERR("\t\tEoT Sync Error\n"); ++ if (err & (1 << 3)) ++ DSSERR("\t\tEscape Mode Entry Command Error\n"); ++ if (err & (1 << 4)) ++ DSSERR("\t\tLP Transmit Sync Error\n"); ++ if (err & (1 << 5)) ++ DSSERR("\t\tHS Receive Timeout Error\n"); ++ if (err & (1 << 6)) ++ DSSERR("\t\tFalse Control Error\n"); ++ if (err & (1 << 7)) ++ DSSERR("\t\t(reserved7)\n"); ++ if (err & (1 << 8)) ++ DSSERR("\t\tECC Error, single-bit (corrected)\n"); ++ if (err & (1 << 9)) ++ DSSERR("\t\tECC Error, multi-bit (not corrected)\n"); ++ if (err & (1 << 10)) ++ DSSERR("\t\tChecksum Error\n"); ++ if (err & (1 << 11)) ++ DSSERR("\t\tData type not recognized\n"); ++ if (err & (1 << 12)) ++ DSSERR("\t\tInvalid VC ID\n"); ++ if (err & (1 << 13)) ++ DSSERR("\t\tInvalid Transmission Length\n"); ++ if (err & (1 << 14)) ++ DSSERR("\t\t(reserved14)\n"); ++ if (err & (1 << 15)) ++ DSSERR("\t\tDSI Protocol Violation\n"); ++} ++ ++static u16 dsi_vc_flush_receive_data(int channel) ++{ ++ /* RX_FIFO_NOT_EMPTY */ ++ while (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { ++ u32 val; ++ u8 dt; ++ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); ++ DSSDBG("\trawval %#08x\n", val); ++ dt = FLD_GET(val, 5, 0); ++ if (dt == DSI_DT_RX_ACK_WITH_ERR) { ++ u16 err = FLD_GET(val, 23, 8); ++ dsi_show_rx_ack_with_err(err); ++ } else if (dt == DSI_DT_RX_SHORT_READ_1) { ++ DSSDBG("\tDCS short response, 1 byte: %#x\n", ++ FLD_GET(val, 23, 8)); ++ } else if (dt == DSI_DT_RX_SHORT_READ_2) { ++ DSSDBG("\tDCS short response, 2 byte: %#x\n", ++ FLD_GET(val, 23, 8)); ++ } else if (dt == DSI_DT_RX_DCS_LONG_READ) { ++ DSSDBG("\tDCS long response, len %d\n", ++ FLD_GET(val, 23, 8)); ++ dsi_vc_flush_long_data(channel); ++ } else { ++ DSSERR("\tunknown datatype 0x%02x\n", dt); ++ } ++ } ++ return 0; ++} ++ ++static int dsi_vc_send_bta(int channel) ++{ ++ unsigned long tmo; ++ ++ /*DSSDBG("dsi_vc_send_bta_sync %d\n", channel); */ ++ ++ if (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { /* RX_FIFO_NOT_EMPTY */ ++ DSSERR("rx fifo not empty when sending BTA, dumping data:\n"); ++ dsi_vc_flush_receive_data(channel); ++ } ++ ++ REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */ ++ ++ tmo = jiffies + msecs_to_jiffies(10); ++ while (REG_GET(DSI_VC_CTRL(channel), 6, 6) == 1) { ++ if (time_after(jiffies, tmo)) { ++ DSSERR("Failed to send BTA\n"); ++ return -EIO; ++ } ++ } ++ ++ return 0; ++} ++ ++static int dsi_vc_send_bta_sync(int channel) ++{ ++ int r = 0; ++ ++ init_completion(&dsi.bta_completion); ++ ++ dsi_vc_enable_bta_irq(channel); ++ ++ r = dsi_vc_send_bta(channel); ++ if (r) ++ goto err; ++ ++ if (wait_for_completion_timeout(&dsi.bta_completion, ++ msecs_to_jiffies(500)) == 0) { ++ DSSERR("Failed to receive BTA\n"); ++ r = -EIO; ++ goto err; ++ } ++err: ++ dsi_vc_disable_bta_irq(channel); ++ ++ return r; ++} ++ ++static inline void dsi_vc_write_long_header(int channel, u8 data_type, ++ u16 len, u8 ecc) ++{ ++ u32 val; ++ u8 data_id; ++ ++ /*data_id = data_type | channel << 6; */ ++ data_id = data_type | dsi.vc[channel].dest_per << 6; ++ ++ val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) | ++ FLD_VAL(ecc, 31, 24); ++ ++ dsi_write_reg(DSI_VC_LONG_PACKET_HEADER(channel), val); ++} ++ ++static inline void dsi_vc_write_long_payload(int channel, ++ u8 b1, u8 b2, u8 b3, u8 b4) ++{ ++ u32 val; ++ ++ val = b4 << 24 | b3 << 16 | b2 << 8 | b1 << 0; ++ ++/* DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n", ++ b1, b2, b3, b4, val); */ ++ ++ dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(channel), val); ++} ++ ++static int dsi_vc_send_long(int channel, u8 data_type, u8 *data, u16 len, ++ u8 ecc) ++{ ++ /*u32 val; */ ++ int i; ++ u8 *p; ++ int r = 0; ++ u8 b1, b2, b3, b4; ++ ++ if (dsi.debug_write) ++ DSSDBG("dsi_vc_send_long, %d bytes\n", len); ++ ++ /* len + header */ ++ if (dsi.vc[channel].fifo_size * 32 * 4 < len + 4) { ++ DSSERR("unable to send long packet: packet too long.\n"); ++ return -EINVAL; ++ } ++ ++ dsi_vc_write_long_header(channel, data_type, len, ecc); ++ ++ /*dsi_vc_print_status(0); */ ++ ++ p = data; ++ for (i = 0; i < len >> 2; i++) { ++ if (dsi.debug_write) ++ DSSDBG("\tsending full packet %d\n", i); ++ /*dsi_vc_print_status(0); */ ++ ++ b1 = *p++; ++ b2 = *p++; ++ b3 = *p++; ++ b4 = *p++; ++ ++ dsi_vc_write_long_payload(channel, b1, b2, b3, b4); ++ } ++ ++ i = len % 4; ++ if (i) { ++ b1 = 0; b2 = 0; b3 = 0; ++ ++ if (dsi.debug_write) ++ DSSDBG("\tsending remainder bytes %d\n", i); ++ ++ switch (i) { ++ case 3: ++ b1 = *p++; ++ b2 = *p++; ++ b3 = *p++; ++ break; ++ case 2: ++ b1 = *p++; ++ b2 = *p++; ++ break; ++ case 1: ++ b1 = *p++; ++ break; ++ } ++ ++ dsi_vc_write_long_payload(channel, b1, b2, b3, 0); ++ } ++ ++ return r; ++} ++ ++static int dsi_vc_send_short(int channel, u8 data_type, u16 data, u8 ecc) ++{ ++ u32 r; ++ u8 data_id; ++ ++ if (dsi.debug_write) ++ DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n", ++ channel, ++ data_type, data & 0xff, (data >> 8) & 0xff); ++ ++ if (FLD_GET(dsi_read_reg(DSI_VC_CTRL(channel)), 16, 16)) { ++ DSSERR("ERROR FIFO FULL, aborting transfer\n"); ++ return -EINVAL; ++ } ++ ++ data_id = data_type | channel << 6; ++ ++ r = (data_id << 0) | (data << 8) | (ecc << 24); ++ ++ dsi_write_reg(DSI_VC_SHORT_PACKET_HEADER(channel), r); ++ ++ return 0; ++} ++ ++int dsi_vc_send_null(int channel) ++{ ++ u8 nullpkg[] = {0, 0, 0, 0}; ++ return dsi_vc_send_long(0, DSI_DT_NULL_PACKET, nullpkg, 4, 0); ++} ++EXPORT_SYMBOL(dsi_vc_send_null); ++ ++int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len) ++{ ++ int r; ++ ++ BUG_ON(len == 0); ++ ++ if (len == 1) { ++ r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_0, ++ data[0], 0); ++ } else if (len == 2) { ++ r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_1, ++ data[0] | (data[1] << 8), 0); ++ } else { ++ /* 0x39 = DCS Long Write */ ++ r = dsi_vc_send_long(channel, DSI_DT_DCS_LONG_WRITE, ++ data, len, 0); ++ } ++ ++ return r; ++} ++EXPORT_SYMBOL(dsi_vc_dcs_write_nosync); ++ ++int dsi_vc_dcs_write(int channel, u8 *data, int len) ++{ ++ int r; ++ ++ r = dsi_vc_dcs_write_nosync(channel, data, len); ++ if (r) ++ return r; ++ ++ /* Some devices need time to process the msg in low power mode. ++ This also makes the write synchronous, and checks that ++ the peripheral is still alive */ ++ r = dsi_vc_send_bta_sync(channel); ++ ++ return r; ++} ++EXPORT_SYMBOL(dsi_vc_dcs_write); ++ ++int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen) ++{ ++ u32 val; ++ u8 dt; ++ int r; ++ ++ if (dsi.debug_read) ++ DSSDBG("dsi_vc_dcs_read\n"); ++ ++ r = dsi_vc_send_short(channel, DSI_DT_DCS_READ, dcs_cmd, 0); ++ if (r) ++ return r; ++ ++ r = dsi_vc_send_bta_sync(channel); ++ if (r) ++ return r; ++ ++ if (REG_GET(DSI_VC_CTRL(channel), 20, 20) == 0) { /* RX_FIFO_NOT_EMPTY */ ++ DSSERR("RX fifo empty when trying to read.\n"); ++ return -EIO; ++ } ++ ++ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); ++ if (dsi.debug_read) ++ DSSDBG("\theader: %08x\n", val); ++ dt = FLD_GET(val, 5, 0); ++ if (dt == DSI_DT_RX_ACK_WITH_ERR) { ++ u16 err = FLD_GET(val, 23, 8); ++ dsi_show_rx_ack_with_err(err); ++ return -1; ++ ++ } else if (dt == DSI_DT_RX_SHORT_READ_1) { ++ u8 data = FLD_GET(val, 15, 8); ++ if (dsi.debug_read) ++ DSSDBG("\tDCS short response, 1 byte: %02x\n", data); ++ ++ if (buflen < 1) ++ return -1; ++ ++ buf[0] = data; ++ ++ return 1; ++ } else if (dt == DSI_DT_RX_SHORT_READ_2) { ++ u16 data = FLD_GET(val, 23, 8); ++ if (dsi.debug_read) ++ DSSDBG("\tDCS short response, 2 byte: %04x\n", data); ++ ++ if (buflen < 2) ++ return -1; ++ ++ buf[0] = data & 0xff; ++ buf[1] = (data >> 8) & 0xff; ++ ++ return 2; ++ } else if (dt == DSI_DT_RX_DCS_LONG_READ) { ++ int w; ++ int len = FLD_GET(val, 23, 8); ++ if (dsi.debug_read) ++ DSSDBG("\tDCS long response, len %d\n", len); ++ ++ if (len > buflen) ++ return -1; ++ ++ /* two byte checksum ends the packet, not included in len */ ++ for (w = 0; w < len + 2;) { ++ int b; ++ val = dsi_read_reg(DSI_VC_SHORT_PACKET_HEADER(channel)); ++ if (dsi.debug_read) ++ DSSDBG("\t\t%02x %02x %02x %02x\n", ++ (val >> 0) & 0xff, ++ (val >> 8) & 0xff, ++ (val >> 16) & 0xff, ++ (val >> 24) & 0xff); ++ ++ for (b = 0; b < 4; ++b) { ++ if (w < len) ++ buf[w] = (val >> (b * 8)) & 0xff; ++ /* we discard the 2 byte checksum */ ++ ++w; ++ } ++ } ++ ++ return len; ++ ++ } else { ++ DSSERR("\tunknown datatype 0x%02x\n", dt); ++ return -1; ++ } ++} ++EXPORT_SYMBOL(dsi_vc_dcs_read); ++ ++ ++int dsi_vc_set_max_rx_packet_size(int channel, u16 len) ++{ ++ return dsi_vc_send_short(channel, DSI_DT_SET_MAX_RET_PKG_SIZE, ++ len, 0); ++} ++EXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size); ++ ++ ++static int dsi_set_lp_rx_timeout(int ns, int x4, int x16) ++{ ++ u32 r; ++ unsigned long fck; ++ int ticks; ++ ++ /* ticks in DSI_FCK */ ++ ++ fck = dsi_fclk_rate(); ++ ticks = (fck / 1000 / 1000) * ns / 1000; ++ ++ if (ticks > 0x1fff) { ++ DSSERR("LP_TX_TO too high\n"); ++ return -EINVAL; ++ } ++ ++ r = dsi_read_reg(DSI_TIMING2); ++ r = FLD_MOD(r, 1, 15, 15); /* LP_RX_TO */ ++ r = FLD_MOD(r, x16, 14, 14); /* LP_RX_TO_X16 */ ++ r = FLD_MOD(r, x4, 13, 13); /* LP_RX_TO_X4 */ ++ r = FLD_MOD(r, ticks, 12, 0); /* LP_RX_COUNTER */ ++ dsi_write_reg(DSI_TIMING2, r); ++ ++ DSSDBG("LP_RX_TO %ld ns (%#x ticks)\n", ++ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / ++ (fck / 1000 / 1000), ++ ticks); ++ ++ return 0; ++} ++ ++static int dsi_set_ta_timeout(int ns, int x8, int x16) ++{ ++ u32 r; ++ unsigned long fck; ++ int ticks; ++ ++ /* ticks in DSI_FCK */ ++ ++ fck = dsi_fclk_rate(); ++ ticks = (fck / 1000 / 1000) * ns / 1000; ++ ++ if (ticks > 0x1fff) { ++ DSSERR("TA_TO too high\n"); ++ return -EINVAL; ++ } ++ ++ r = dsi_read_reg(DSI_TIMING1); ++ r = FLD_MOD(r, 1, 31, 31); /* TA_TO */ ++ r = FLD_MOD(r, x16, 30, 30); /* TA_TO_X16 */ ++ r = FLD_MOD(r, x8, 29, 29); /* TA_TO_X8 */ ++ r = FLD_MOD(r, ticks, 28, 16); /* TA_TO_COUNTER */ ++ dsi_write_reg(DSI_TIMING1, r); ++ ++ DSSDBG("TA_TO %ld ns (%#x ticks)\n", ++ (ticks * (x16 ? 16 : 1) * (x8 ? 8 : 1) * 1000) / ++ (fck / 1000 / 1000), ++ ticks); ++ ++ return 0; ++} ++ ++static int dsi_set_stop_state_counter(int ns, int x4, int x16) ++{ ++ u32 r; ++ unsigned long fck; ++ int ticks; ++ ++ /* ticks in DSI_FCK */ ++ ++ fck = dsi_fclk_rate(); ++ ticks = (fck / 1000 / 1000) * ns / 1000; ++ ++ if (ticks > 0x1fff) { ++ DSSERR("STOP_STATE_COUNTER_IO too high\n"); ++ return -EINVAL; ++ } ++ ++ r = dsi_read_reg(DSI_TIMING1); ++ r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ ++ r = FLD_MOD(r, x16, 14, 14); /* STOP_STATE_X16_IO */ ++ r = FLD_MOD(r, x4, 13, 13); /* STOP_STATE_X4_IO */ ++ r = FLD_MOD(r, ticks, 12, 0); /* STOP_STATE_COUNTER_IO */ ++ dsi_write_reg(DSI_TIMING1, r); ++ ++ DSSDBG("STOP_STATE_COUNTER %ld ns (%#x ticks)\n", ++ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / ++ (fck / 1000 / 1000), ++ ticks); ++ ++ return 0; ++} ++ ++static int dsi_set_hs_tx_timeout(int ns, int x4, int x16) ++{ ++ u32 r; ++ unsigned long fck; ++ int ticks; ++ ++ /* ticks in TxByteClkHS */ ++ ++ fck = dsi.ddr_clk / 4; ++ ticks = (fck / 1000 / 1000) * ns / 1000; ++ ++ if (ticks > 0x1fff) { ++ DSSERR("HS_TX_TO too high\n"); ++ return -EINVAL; ++ } ++ ++ r = dsi_read_reg(DSI_TIMING2); ++ r = FLD_MOD(r, 1, 31, 31); /* HS_TX_TO */ ++ r = FLD_MOD(r, x16, 30, 30); /* HS_TX_TO_X16 */ ++ r = FLD_MOD(r, x4, 29, 29); /* HS_TX_TO_X8 (4 really) */ ++ r = FLD_MOD(r, ticks, 28, 16); /* HS_TX_TO_COUNTER */ ++ dsi_write_reg(DSI_TIMING2, r); ++ ++ DSSDBG("HS_TX_TO %ld ns (%#x ticks)\n", ++ (ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1) * 1000) / ++ (fck / 1000 / 1000), ++ ticks); ++ ++ return 0; ++} ++static int dsi_proto_config(struct omap_display *display) ++{ ++ u32 r; ++ int buswidth = 0; ++ ++ dsi_config_tx_fifo(DSI_FIFO_SIZE_128, ++ DSI_FIFO_SIZE_0, ++ DSI_FIFO_SIZE_0, ++ DSI_FIFO_SIZE_0); ++ ++ dsi_config_rx_fifo(DSI_FIFO_SIZE_128, ++ DSI_FIFO_SIZE_0, ++ DSI_FIFO_SIZE_0, ++ DSI_FIFO_SIZE_0); ++ ++ /* XXX what values for the timeouts? */ ++ dsi_set_stop_state_counter(1000, 0, 0); ++ ++ dsi_set_ta_timeout(50000, 1, 1); ++ ++ /* 3000ns * 16 */ ++ dsi_set_lp_rx_timeout(3000, 0, 1); ++ ++ /* 10000ns * 4 */ ++ dsi_set_hs_tx_timeout(10000, 1, 0); ++ ++ switch (display->ctrl->pixel_size) { ++ case 16: ++ buswidth = 0; ++ break; ++ case 18: ++ buswidth = 1; ++ break; ++ case 24: ++ buswidth = 2; ++ break; ++ default: ++ BUG(); ++ } ++ ++ r = dsi_read_reg(DSI_CTRL); ++ r = FLD_MOD(r, 1, 1, 1); /* CS_RX_EN */ ++ r = FLD_MOD(r, 1, 2, 2); /* ECC_RX_EN */ ++ r = FLD_MOD(r, 1, 3, 3); /* TX_FIFO_ARBITRATION */ ++ /* XXX what should the ratio be */ ++ r = FLD_MOD(r, 0, 4, 4); /* VP_CLK_RATIO, VP_PCLK = VP_CLK/2 */ ++ r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */ ++ r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */ ++ r = FLD_MOD(r, 2, 13, 12); /* LINE_BUFFER, 2 lines */ ++ r = FLD_MOD(r, 1, 14, 14); /* TRIGGER_RESET_MODE */ ++ r = FLD_MOD(r, 1, 19, 19); /* EOT_ENABLE */ ++ r = FLD_MOD(r, 1, 24, 24); /* DCS_CMD_ENABLE */ ++ r = FLD_MOD(r, 0, 25, 25); /* DCS_CMD_CODE, 1=start, 0=continue */ ++ ++ dsi_write_reg(DSI_CTRL, r); ++ ++ /* we configure vc0 for L4 communication, and ++ * vc1 for dispc */ ++ dsi_vc_config(0); ++ dsi_vc_config_vp(1); ++ ++ /* set all vc targets to peripheral 0 */ ++ dsi.vc[0].dest_per = 0; ++ dsi.vc[1].dest_per = 0; ++ dsi.vc[2].dest_per = 0; ++ dsi.vc[3].dest_per = 0; ++ ++ return 0; ++} ++ ++static void dsi_proto_timings(void) ++{ ++ int tlpx_half, tclk_zero, tclk_prepare, tclk_trail; ++ int tclk_pre, tclk_post; ++ int ddr_clk_pre, ddr_clk_post; ++ u32 r; ++ ++ r = dsi_read_reg(DSI_DSIPHY_CFG1); ++ tlpx_half = FLD_GET(r, 22, 16); ++ tclk_trail = FLD_GET(r, 15, 8); ++ tclk_zero = FLD_GET(r, 7, 0); ++ ++ r = dsi_read_reg(DSI_DSIPHY_CFG2); ++ tclk_prepare = FLD_GET(r, 7, 0); ++ ++ /* min 8*UI */ ++ tclk_pre = 20; ++ /* min 60ns + 52*UI */ ++ tclk_post = ns2ddr(60) + 26; ++ ++ ddr_clk_pre = (tclk_pre + tlpx_half*2 + tclk_zero + tclk_prepare) / 4; ++ ddr_clk_post = (tclk_post + tclk_trail) / 4; ++ ++ r = dsi_read_reg(DSI_CLK_TIMING); ++ r = FLD_MOD(r, ddr_clk_pre, 15, 8); ++ r = FLD_MOD(r, ddr_clk_post, 7, 0); ++ dsi_write_reg(DSI_CLK_TIMING, r); ++ ++ DSSDBG("ddr_clk_pre %d, ddr_clk_post %d\n", ++ ddr_clk_pre, ++ ddr_clk_post); ++} ++ ++ ++#define DSI_DECL_VARS \ ++ int __dsi_cb = 0; u32 __dsi_cv = 0; ++ ++#define DSI_FLUSH(ch) \ ++ if (__dsi_cb > 0) { \ ++ /*DSSDBG("sending long packet %#010x\n", __dsi_cv);*/ \ ++ dsi_write_reg(DSI_VC_LONG_PACKET_PAYLOAD(ch), __dsi_cv); \ ++ __dsi_cb = __dsi_cv = 0; \ ++ } ++ ++#define DSI_PUSH(ch, data) \ ++ do { \ ++ __dsi_cv |= (data) << (__dsi_cb * 8); \ ++ /*DSSDBG("cv = %#010x, cb = %d\n", __dsi_cv, __dsi_cb);*/ \ ++ if (++__dsi_cb > 3) \ ++ DSI_FLUSH(ch); \ ++ } while (0) ++ ++static int dsi_update_screen_l4(struct omap_display *display, ++ int x, int y, int w, int h) ++{ ++ /* Note: supports only 24bit colors in 32bit container */ ++ int first = 1; ++ int fifo_stalls = 0; ++ int max_dsi_packet_size; ++ int max_data_per_packet; ++ int max_pixels_per_packet; ++ int pixels_left; ++ int bytespp = 3; ++ int scr_width; ++ u32 __iomem *data; ++ int start_offset; ++ int horiz_inc; ++ int current_x; ++ struct omap_overlay *ovl; ++ ++ debug_irq = 0; ++ ++ DSSDBG("dsi_update_screen_l4 (%d,%d %dx%d)\n", ++ x, y, w, h); ++ ++ ovl = display->manager->overlays[0]; ++ ++ if (ovl->info.color_mode != OMAP_DSS_COLOR_RGB24U) ++ return -EINVAL; ++ ++ if (display->ctrl->pixel_size != 24) ++ return -EINVAL; ++ ++ scr_width = ovl->info.screen_width; ++ data = ovl->info.vaddr; ++ ++ start_offset = scr_width * y + x; ++ horiz_inc = scr_width - w; ++ current_x = x; ++ ++ /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp) bytes ++ * in fifo */ ++ ++ /* When using CPU, max long packet size is TX buffer size */ ++ max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4; ++ ++ /* we seem to get better perf if we divide the tx fifo to half, ++ and while the other half is being sent, we fill the other half ++ max_dsi_packet_size /= 2; */ ++ ++ max_data_per_packet = max_dsi_packet_size - 4 - 1; ++ ++ max_pixels_per_packet = max_data_per_packet / bytespp; ++ ++ DSSDBG("max_pixels_per_packet %d\n", max_pixels_per_packet); ++ ++ display->ctrl->setup_update(display, x, y, w, h); ++ ++ pixels_left = w * h; ++ ++ DSSDBG("total pixels %d\n", pixels_left); ++ ++ data += start_offset; ++ ++#ifdef DEBUG ++ dsi.update_region.x = x; ++ dsi.update_region.y = y; ++ dsi.update_region.w = w; ++ dsi.update_region.h = h; ++ dsi.update_region.bytespp = bytespp; ++#endif ++ ++ perf_mark_start(); ++ ++ while (pixels_left > 0) { ++ /* 0x2c = write_memory_start */ ++ /* 0x3c = write_memory_continue */ ++ u8 dcs_cmd = first ? 0x2c : 0x3c; ++ int pixels; ++ DSI_DECL_VARS; ++ first = 0; ++ ++#if 1 ++ /* using fifo not empty */ ++ /* TX_FIFO_NOT_EMPTY */ ++ while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) { ++ udelay(1); ++ fifo_stalls++; ++ if (fifo_stalls > 0xfffff) { ++ DSSERR("fifo stalls overflow, pixels left %d\n", ++ pixels_left); ++ dsi_if_enable(0); ++ return -EIO; ++ } ++ } ++#elif 1 ++ /* using fifo emptiness */ ++ while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 < ++ max_dsi_packet_size) { ++ fifo_stalls++; ++ if (fifo_stalls > 0xfffff) { ++ DSSERR("fifo stalls overflow, pixels left %d\n", ++ pixels_left); ++ dsi_if_enable(0); ++ return -EIO; ++ } ++ } ++#else ++ while ((REG_GET(DSI_TX_FIFO_VC_EMPTINESS, 7, 0)+1)*4 == 0) { ++ fifo_stalls++; ++ if (fifo_stalls > 0xfffff) { ++ DSSERR("fifo stalls overflow, pixels left %d\n", ++ pixels_left); ++ dsi_if_enable(0); ++ return -EIO; ++ } ++ } ++#endif ++ pixels = min(max_pixels_per_packet, pixels_left); ++ ++ pixels_left -= pixels; ++ ++ dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE, ++ 1 + pixels * bytespp, 0); ++ ++ DSI_PUSH(0, dcs_cmd); ++ ++ while (pixels-- > 0) { ++ u32 pix = __raw_readl(data++); ++ ++ DSI_PUSH(0, (pix >> 16) & 0xff); ++ DSI_PUSH(0, (pix >> 8) & 0xff); ++ DSI_PUSH(0, (pix >> 0) & 0xff); ++ ++ current_x++; ++ if (current_x == x+w) { ++ current_x = x; ++ data += horiz_inc; ++ } ++ } ++ ++ DSI_FLUSH(0); ++ } ++ ++ perf_show("L4"); ++ ++ return 0; ++} ++ ++#if 0 ++static void dsi_clear_screen_l4(struct omap_display *display, ++ int x, int y, int w, int h) ++{ ++ int first = 1; ++ int fifo_stalls = 0; ++ int max_dsi_packet_size; ++ int max_data_per_packet; ++ int max_pixels_per_packet; ++ int pixels_left; ++ int bytespp = 3; ++ int pixnum; ++ ++ debug_irq = 0; ++ ++ DSSDBG("dsi_clear_screen_l4 (%d,%d %dx%d)\n", ++ x, y, w, h); ++ ++ if (display->ctrl->bpp != 24) ++ return -EINVAL; ++ ++ /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp) ++ * bytes in fifo */ ++ ++ /* When using CPU, max long packet size is TX buffer size */ ++ max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4; ++ ++ max_data_per_packet = max_dsi_packet_size - 4 - 1; ++ ++ max_pixels_per_packet = max_data_per_packet / bytespp; ++ ++ enable_clocks(1); ++ ++ display->ctrl->setup_update(display, x, y, w, h); ++ ++ pixels_left = w * h; ++ ++ dsi.update_region.x = x; ++ dsi.update_region.y = y; ++ dsi.update_region.w = w; ++ dsi.update_region.h = h; ++ dsi.update_region.bytespp = bytespp; ++ ++ start_measuring(); ++ ++ pixnum = 0; ++ ++ while (pixels_left > 0) { ++ /* 0x2c = write_memory_start */ ++ /* 0x3c = write_memory_continue */ ++ u8 dcs_cmd = first ? 0x2c : 0x3c; ++ int pixels; ++ DSI_DECL_VARS; ++ first = 0; ++ ++ /* TX_FIFO_NOT_EMPTY */ ++ while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) { ++ fifo_stalls++; ++ if (fifo_stalls > 0xfffff) { ++ DSSERR("fifo stalls overflow\n"); ++ dsi_if_enable(0); ++ enable_clocks(0); ++ return; ++ } ++ } ++ ++ pixels = min(max_pixels_per_packet, pixels_left); ++ ++ pixels_left -= pixels; ++ ++ dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE, ++ 1 + pixels * bytespp, 0); ++ ++ DSI_PUSH(0, dcs_cmd); ++ ++ while (pixels-- > 0) { ++ u32 pix; ++ ++ pix = 0x000000; ++ ++ DSI_PUSH(0, (pix >> 16) & 0xff); ++ DSI_PUSH(0, (pix >> 8) & 0xff); ++ DSI_PUSH(0, (pix >> 0) & 0xff); ++ } ++ ++ DSI_FLUSH(0); ++ } ++ ++ enable_clocks(0); ++ ++ end_measuring("L4 CLEAR"); ++} ++#endif ++ ++static void dsi_setup_update_dispc(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ DSSDBG("dsi_setup_update_dispc(%d,%d %dx%d)\n", ++ x, y, w, h); ++ ++#ifdef DEBUG ++ dsi.update_region.x = x; ++ dsi.update_region.y = y; ++ dsi.update_region.w = w; ++ dsi.update_region.h = h; ++ dsi.update_region.bytespp = 3; // XXX ++#endif ++ ++ dispc_setup_partial_planes(display, &x, &y, &w, &h); ++ ++ dispc_set_lcd_size(w, h); ++} ++ ++static void dsi_setup_autoupdate_dispc(struct omap_display *display) ++{ ++ u16 w, h; ++ ++ display->get_resolution(display, &w, &h); ++ ++#ifdef DEBUG ++ dsi.update_region.x = 0; ++ dsi.update_region.y = 0; ++ dsi.update_region.w = w; ++ dsi.update_region.h = h; ++ dsi.update_region.bytespp = 3; // XXX ++#endif ++ ++ /* the overlay settings may not have been applied, if we were in manual ++ * mode earlier, so do it here */ ++ display->manager->apply(display->manager); ++ ++ dispc_set_lcd_size(w, h); ++ ++ dsi.autoupdate_setup = 0; ++} ++ ++static void dsi_update_screen_dispc(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ int bytespp = 3; ++ int total_len; ++ int line_packet_len; ++ u32 l; ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) ++ DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n", ++ x, y, w, h); ++ ++ /* TODO: one packet could be longer, I think? Max is the line buffer */ ++ line_packet_len = w * bytespp + 1; /* 1 byte for DCS cmd */ ++ total_len = line_packet_len * h; ++ ++ display->ctrl->setup_update(display, x, y, w, h); ++ ++ if (0) ++ dsi_vc_print_status(1); ++ ++ perf_mark_start(); ++ ++ l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */ ++ dsi_write_reg(DSI_VC_TE(1), l); ++ ++ dsi_vc_write_long_header(1, DSI_DT_DCS_LONG_WRITE, line_packet_len, 0); ++ ++ if (dsi.use_te) ++ l = FLD_MOD(l, 1, 30, 30); /* TE_EN */ ++ else ++ l = FLD_MOD(l, 1, 31, 31); /* TE_START */ ++ dsi_write_reg(DSI_VC_TE(1), l); ++ ++ dispc_enable_lcd_out(1); ++ ++ if (dsi.use_te) ++ dsi_vc_send_bta(1); ++} ++ ++static void framedone_callback(void *data, u32 mask) ++{ ++ if (dsi.framedone_scheduled) { ++ DSSERR("Framedone already scheduled. Bogus FRAMEDONE IRQ?\n"); ++ return; ++ } ++ ++ dsi.framedone_scheduled = 1; ++ ++ /* We get FRAMEDONE when DISPC has finished sending pixels and turns ++ * itself off. However, DSI still has the pixels in its buffers, and ++ * is sending the data. Thus we have to wait until we can do a new ++ * transfer or turn the clocks off. We do that in a separate work ++ * func. */ ++ queue_work(dsi.workqueue, &dsi.framedone_work); ++} ++ ++static void framedone_worker(struct work_struct *work) ++{ ++ u32 l; ++ unsigned long tmo; ++ int i = 0; ++ ++ l = REG_GET(DSI_VC_TE(1), 23, 0); /* TE_SIZE */ ++ ++ /* There shouldn't be much stuff in DSI buffers, if any, so we'll ++ * just busyloop */ ++ if (l > 0) { ++ tmo = jiffies + msecs_to_jiffies(50); ++ while (REG_GET(DSI_VC_TE(1), 23, 0) > 0) { /* TE_SIZE */ ++ i++; ++ if (time_after(jiffies, tmo)) { ++ DSSERR("timeout waiting TE_SIZE to zero\n"); ++ break; ++ } ++ cpu_relax(); ++ } ++ } ++ ++ if (REG_GET(DSI_VC_TE(1), 30, 30)) ++ DSSERR("TE_EN not zero\n"); ++ ++ if (REG_GET(DSI_VC_TE(1), 31, 31)) ++ DSSERR("TE_START not zero\n"); ++ ++ perf_show("DISPC"); ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) ++ DSSDBG("FRAMEDONE\n"); ++ ++#if 0 ++ if (l) ++ DSSWARN("FRAMEDONE irq too early, %d bytes, %d loops\n", l, i); ++#else ++ if (l > 1024*3) ++ DSSWARN("FRAMEDONE irq too early, %d bytes, %d loops\n", l, i); ++#endif ++ ++#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC ++ dispc_fake_vsync_irq(); ++#endif ++ dsi.framedone_scheduled = 0; ++ ++ /* XXX check that fifo is not full. otherwise we would sleep and never ++ * get to process_cmd_fifo below */ ++ /* We check for target_update_mode, not update_mode. No reason to push ++ * new updates if we're turning auto update off */ ++ if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO) ++ dsi_push_autoupdate(dsi.vc[1].display); ++ ++ atomic_set(&dsi.cmd_pending, 0); ++ dsi_process_cmd_fifo(NULL); ++} ++ ++static void dsi_start_auto_update(struct omap_display *display) ++{ ++ DSSDBG("starting auto update\n"); ++ ++ dsi.autoupdate_setup = 1; ++ ++ dsi_push_autoupdate(display); ++} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++/* FIFO functions */ ++ ++static void dsi_signal_fifo_waiters(void) ++{ ++ if (atomic_read(&dsi.cmd_fifo_full) > 0) { ++ DSSDBG("SIGNALING: Fifo not full for waiter!\n"); ++ complete(&dsi.cmd_done); ++ atomic_dec(&dsi.cmd_fifo_full); ++ } ++} ++ ++/* returns 1 for async op, and 0 for sync op */ ++static int dsi_do_update(struct omap_display *display, ++ struct dsi_cmd_update *upd) ++{ ++ int r; ++ u16 x = upd->x, y = upd->y, w = upd->w, h = upd->h; ++ u16 dw, dh; ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED) ++ return 0; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return 0; ++ ++ display->get_resolution(display, &dw, &dh); ++ if (x > dw || y > dh) ++ return 0; ++ ++ if (x + w > dw) ++ w = dw - x; ++ ++ if (y + h > dh) ++ h = dh - y; ++ ++ DSSDBGF("%d,%d %dx%d", x, y, w, h); ++ ++ perf_mark_setup(); ++ ++ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { ++ dsi_setup_update_dispc(display, x, y, w, h); ++ dsi_update_screen_dispc(display, x, y, w, h); ++ return 1; ++ } else { ++ r = dsi_update_screen_l4(display, x, y, w, h); ++ if (r) ++ DSSERR("L4 update failed\n"); ++ return 0; ++ } ++} ++ ++/* returns 1 for async op, and 0 for sync op */ ++static int dsi_do_autoupdate(struct omap_display *display) ++{ ++ int r; ++ u16 w, h; ++ ++ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED) ++ return 0; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return 0; ++ ++ display->get_resolution(display, &w, &h); ++ ++ perf_mark_setup(); ++ ++ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { ++ if (dsi.autoupdate_setup) ++ dsi_setup_autoupdate_dispc(display); ++ dsi_update_screen_dispc(display, 0, 0, w, h); ++ return 1; ++ } else { ++ r = dsi_update_screen_l4(display, 0, 0, w, h); ++ if (r) ++ DSSERR("L4 update failed\n"); ++ return 0; ++ } ++} ++ ++static void dsi_do_cmd_mem_read(struct omap_display *display, ++ struct dsi_cmd_mem_read *mem_read) ++{ ++ int r; ++ r = display->ctrl->memory_read(display, ++ mem_read->buf, ++ mem_read->size, ++ mem_read->x, ++ mem_read->y, ++ mem_read->w, ++ mem_read->h); ++ ++ *mem_read->ret_size = (size_t)r; ++ complete(mem_read->completion); ++} ++ ++static void dsi_do_cmd_test(struct omap_display *display, ++ struct dsi_cmd_test *test) ++{ ++ int r = 0; ++ ++ DSSDBGF(""); ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return; ++ ++ /* run test first in low speed mode */ ++ dsi_vc_enable_hs(0, 0); ++ ++ if (display->ctrl->run_test) { ++ r = display->ctrl->run_test(display, test->test_num); ++ if (r) ++ goto end; ++ } ++ ++ if (display->panel->run_test) { ++ r = display->panel->run_test(display, test->test_num); ++ if (r) ++ goto end; ++ } ++ ++ /* then in high speed */ ++ dsi_vc_enable_hs(0, 1); ++ ++ if (display->ctrl->run_test) { ++ r = display->ctrl->run_test(display, test->test_num); ++ if (r) ++ goto end; ++ } ++ ++ if (display->panel->run_test) ++ r = display->panel->run_test(display, test->test_num); ++ ++end: ++ dsi_vc_enable_hs(0, 1); ++ ++ *test->result = r; ++ complete(test->completion); ++ ++ DSSDBG("test end\n"); ++} ++ ++static void dsi_do_cmd_set_te(struct omap_display *display, bool enable) ++{ ++ dsi.use_te = enable; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return; ++ ++ display->ctrl->enable_te(display, enable); ++ ++ if (enable) { ++ /* disable LP_RX_TO, so that we can receive TE. ++ * Time to wait for TE is longer than the timer allows */ ++ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ ++ } else { ++ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */ ++ } ++} ++ ++static void dsi_do_cmd_set_update_mode(struct omap_display *display, ++ enum omap_dss_update_mode mode) ++{ ++ dsi.update_mode = mode; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return; ++ ++ if (mode == OMAP_DSS_UPDATE_AUTO) ++ dsi_start_auto_update(display); ++} ++ ++static void dsi_process_cmd_fifo(struct work_struct *work) ++{ ++ int len; ++ struct dsi_cmd_item p; ++ unsigned long flags; ++ struct omap_display *display; ++ int exit = 0; ++ ++ if (dsi.debug_process) ++ DSSDBGF(""); ++ ++ if (atomic_cmpxchg(&dsi.cmd_pending, 0, 1) == 1) { ++ if (dsi.debug_process) ++ DSSDBG("cmd pending, skip process\n"); ++ return; ++ } ++ ++ while (!exit) { ++ spin_lock_irqsave(dsi.cmd_fifo->lock, flags); ++ ++ len = __kfifo_get(dsi.cmd_fifo, (unsigned char *)&p, ++ sizeof(p)); ++ if (len == 0) { ++ if (dsi.debug_process) ++ DSSDBG("nothing more in fifo, atomic clear\n"); ++ atomic_set(&dsi.cmd_pending, 0); ++ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); ++ break; ++ } ++ ++ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); ++ ++ BUG_ON(len != sizeof(p)); ++ ++ display = p.display; ++ ++ if (dsi.debug_process) ++ DSSDBG("processing cmd %d\n", p.cmd); ++ ++ switch (p.cmd) { ++ case DSI_CMD_UPDATE: ++ if (dsi_do_update(display, &p.u.r)) { ++ if (dsi.debug_process) ++ DSSDBG("async update\n"); ++ exit = 1; ++ } else { ++ if (dsi.debug_process) ++ DSSDBG("sync update\n"); ++ } ++ break; ++ ++ case DSI_CMD_AUTOUPDATE: ++ if (dsi_do_autoupdate(display)) { ++ if (dsi.debug_process) ++ DSSDBG("async autoupdate\n"); ++ exit = 1; ++ } else { ++ if (dsi.debug_process) ++ DSSDBG("sync autoupdate\n"); ++ } ++ break; ++ ++ case DSI_CMD_SYNC: ++ if (dsi.debug_process) ++ DSSDBG("Signaling SYNC done!\n"); ++ complete(p.u.sync); ++ break; ++ ++ case DSI_CMD_MEM_READ: ++ dsi_do_cmd_mem_read(display, &p.u.mem_read); ++ break; ++ ++ case DSI_CMD_TEST: ++ dsi_do_cmd_test(display, &p.u.test); ++ break; ++ ++ case DSI_CMD_SET_TE: ++ dsi_do_cmd_set_te(display, p.u.te); ++ break; ++ ++ case DSI_CMD_SET_UPDATE_MODE: ++ dsi_do_cmd_set_update_mode(display, p.u.update_mode); ++ break; ++ ++ case DSI_CMD_SET_ROTATE: ++ display->ctrl->set_rotate(display, p.u.rotate); ++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) ++ dsi.autoupdate_setup = 1; ++ break; ++ ++ case DSI_CMD_SET_MIRROR: ++ display->ctrl->set_mirror(display, p.u.mirror); ++ break; ++ ++ default: ++ BUG(); ++ } ++ } ++ ++ if (dsi.debug_process) ++ DSSDBG("exit dsi_process_cmd_fifo\n"); ++ ++ dsi_signal_fifo_waiters(); ++} ++ ++static void dsi_push_cmd(struct dsi_cmd_item *p) ++{ ++ int ret; ++ ++ if (dsi.debug_process) ++ DSSDBGF(""); ++ ++ while (1) { ++ unsigned long flags; ++ unsigned avail, used; ++ ++ spin_lock_irqsave(dsi.cmd_fifo->lock, flags); ++ used = __kfifo_len(dsi.cmd_fifo) / sizeof(struct dsi_cmd_item); ++ avail = DSI_CMD_FIFO_LEN - used; ++ ++ if (dsi.debug_process) ++ DSSDBG("%u/%u items left in fifo\n", avail, used); ++ ++ if (avail == 0) { ++ if (dsi.debug_process) ++ DSSDBG("cmd fifo full, waiting...\n"); ++ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); ++ atomic_inc(&dsi.cmd_fifo_full); ++ wait_for_completion(&dsi.cmd_done); ++ if (dsi.debug_process) ++ DSSDBG("cmd fifo not full, woke up\n"); ++ continue; ++ } ++ ++ ret = __kfifo_put(dsi.cmd_fifo, (unsigned char *)p, ++ sizeof(*p)); ++ ++ spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags); ++ ++ BUG_ON(ret != sizeof(*p)); ++ ++ break; ++ } ++ ++ queue_work(dsi.workqueue, &dsi.process_work); ++} ++ ++static void dsi_push_update(struct omap_display *display, ++ int x, int y, int w, int h) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_UPDATE; ++ ++ p.u.r.x = x; ++ p.u.r.y = y; ++ p.u.r.w = w; ++ p.u.r.h = h; ++ ++ DSSDBG("pushing UPDATE %d,%d %dx%d\n", x, y, w, h); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_autoupdate(struct omap_display *display) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_AUTOUPDATE; ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_sync(struct omap_display *display, ++ struct completion *sync_comp) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_SYNC; ++ p.u.sync = sync_comp; ++ ++ DSSDBG("pushing SYNC\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_mem_read(struct omap_display *display, ++ struct dsi_cmd_mem_read *mem_read) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_MEM_READ; ++ p.u.mem_read = *mem_read; ++ ++ DSSDBG("pushing MEM_READ\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_test(struct omap_display *display, int test_num, ++ int *result, struct completion *completion) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_TEST; ++ p.u.test.test_num = test_num; ++ p.u.test.result = result; ++ p.u.test.completion = completion; ++ ++ DSSDBG("pushing TEST\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_set_te(struct omap_display *display, bool enable) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_SET_TE; ++ p.u.te = enable; ++ ++ DSSDBG("pushing SET_TE\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_set_update_mode(struct omap_display *display, ++ enum omap_dss_update_mode mode) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_SET_UPDATE_MODE; ++ p.u.update_mode = mode; ++ ++ DSSDBG("pushing SET_UPDATE_MODE\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_set_rotate(struct omap_display *display, int rotate) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_SET_ROTATE; ++ p.u.rotate = rotate; ++ ++ DSSDBG("pushing SET_ROTATE\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static void dsi_push_set_mirror(struct omap_display *display, int mirror) ++{ ++ struct dsi_cmd_item p; ++ ++ p.display = display; ++ p.cmd = DSI_CMD_SET_MIRROR; ++ p.u.mirror = mirror; ++ ++ DSSDBG("pushing SET_MIRROR\n"); ++ ++ dsi_push_cmd(&p); ++} ++ ++static int dsi_wait_sync(struct omap_display *display) ++{ ++ long wait = msecs_to_jiffies(60000); ++ struct completion compl; ++ ++ DSSDBGF(""); ++ ++ init_completion(&compl); ++ dsi_push_sync(display, &compl); ++ ++ DSSDBG("Waiting for SYNC to happen...\n"); ++ wait = wait_for_completion_timeout(&compl, wait); ++ DSSDBG("Released from SYNC\n"); ++ ++ if (wait == 0) { ++ DSSERR("timeout waiting sync\n"); ++ return -ETIME; ++ } ++ ++ return 0; ++} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++/* Display funcs */ ++ ++static int dsi_display_init_dispc(struct omap_display *display) ++{ ++ int r; ++ ++ r = omap_dispc_register_isr(framedone_callback, NULL, ++ DISPC_IRQ_FRAMEDONE); ++ if (r) { ++ DSSERR("can't get FRAMEDONE irq\n"); ++ return r; ++ } ++ ++ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); ++ ++ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_DSI); ++ dispc_enable_fifohandcheck(1); ++ ++ dispc_set_tft_data_lines(display->ctrl->pixel_size); ++ ++ { ++ struct omap_video_timings timings = { ++ .hsw = 1, ++ .hfp = 1, ++ .hbp = 1, ++ .vsw = 1, ++ .vfp = 0, ++ .vbp = 0, ++ }; ++ ++ dispc_set_lcd_timings(&timings); ++ } ++ ++ return 0; ++} ++ ++static void dsi_display_uninit_dispc(struct omap_display *display) ++{ ++ omap_dispc_unregister_isr(framedone_callback, NULL, ++ DISPC_IRQ_FRAMEDONE); ++} ++ ++static int dsi_display_init_dsi(struct omap_display *display) ++{ ++ struct dsi_clock_info cinfo; ++ int r; ++ ++ _dsi_print_reset_status(); ++ ++ r = dsi_pll_init(1, 0); ++ if (r) ++ goto err0; ++ ++ r = dsi_pll_calc_ddrfreq(display->hw_config.u.dsi.ddr_clk_hz, &cinfo); ++ if (r) ++ goto err1; ++ ++ r = dsi_pll_program(&cinfo); ++ if (r) ++ goto err1; ++ ++ DSSDBG("PLL OK\n"); ++ ++ r = dsi_complexio_init(display); ++ if (r) ++ goto err1; ++ ++ _dsi_print_reset_status(); ++ ++ dsi_proto_timings(); ++ dsi_set_lp_clk_divisor(); ++ ++ if (1) ++ _dsi_print_reset_status(); ++ ++ r = dsi_proto_config(display); ++ if (r) ++ goto err2; ++ ++ /* enable interface */ ++ dsi_vc_enable(0, 1); ++ dsi_vc_enable(1, 1); ++ dsi_if_enable(1); ++ dsi_force_tx_stop_mode_io(); ++ ++ if (display->ctrl && display->ctrl->enable) { ++ r = display->ctrl->enable(display); ++ if (r) ++ goto err3; ++ } ++ ++ if (display->panel && display->panel->enable) { ++ r = display->panel->enable(display); ++ if (r) ++ goto err4; ++ } ++ ++ /* enable high-speed after initial config */ ++ dsi_vc_enable_hs(0, 1); ++ ++ return 0; ++err4: ++ if (display->ctrl && display->ctrl->disable) ++ display->ctrl->disable(display); ++err3: ++ dsi_if_enable(0); ++err2: ++ dsi_complexio_uninit(); ++err1: ++ dsi_pll_uninit(); ++err0: ++ return r; ++} ++ ++static void dsi_display_uninit_dsi(struct omap_display *display) ++{ ++ if (display->panel && display->panel->disable) ++ display->panel->disable(display); ++ if (display->ctrl && display->ctrl->disable) ++ display->ctrl->disable(display); ++ ++ dsi_complexio_uninit(); ++ dsi_pll_uninit(); ++} ++ ++static int dsi_core_init(void) ++{ ++ /* Autoidle */ ++ REG_FLD_MOD(DSI_SYSCONFIG, 1, 0, 0); ++ ++ /* ENWAKEUP */ ++ REG_FLD_MOD(DSI_SYSCONFIG, 1, 2, 2); ++ ++ /* SIDLEMODE smart-idle */ ++ REG_FLD_MOD(DSI_SYSCONFIG, 2, 4, 3); ++ ++ _dsi_initialize_irq(); ++ ++ return 0; ++} ++ ++static int dsi_display_enable(struct omap_display *display) ++{ ++ int r = 0; ++ ++ DSSDBG("dsi_display_enable\n"); ++ ++ mutex_lock(&dsi.lock); ++ ++ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { ++ DSSERR("display already enabled\n"); ++ r = -EINVAL; ++ goto err0; ++ } ++ ++ enable_clocks(1); ++ dsi_enable_pll_clock(1); ++ ++ r = _dsi_reset(); ++ if (r) ++ return r; ++ ++ dsi_core_init(); ++ ++ r = dsi_display_init_dispc(display); ++ if (r) ++ goto err1; ++ ++ r = dsi_display_init_dsi(display); ++ if (r) ++ goto err2; ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++ ++ if (dsi.use_te) ++ dsi_push_set_te(display, 1); ++ ++ dsi_push_set_update_mode(display, dsi.user_update_mode); ++ dsi.target_update_mode = dsi.user_update_mode; ++ ++ mutex_unlock(&dsi.lock); ++ ++ return dsi_wait_sync(display); ++ ++err2: ++ dsi_display_uninit_dispc(display); ++err1: ++ enable_clocks(0); ++ dsi_enable_pll_clock(0); ++err0: ++ mutex_unlock(&dsi.lock); ++ DSSDBG("dsi_display_enable FAILED\n"); ++ return r; ++} ++ ++static void dsi_display_disable(struct omap_display *display) ++{ ++ DSSDBG("dsi_display_disable\n"); ++ ++ mutex_lock(&dsi.lock); ++ ++ if (display->state == OMAP_DSS_DISPLAY_DISABLED || ++ display->state == OMAP_DSS_DISPLAY_SUSPENDED) ++ goto end; ++ ++ if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) { ++ dsi_push_set_update_mode(display, OMAP_DSS_UPDATE_DISABLED); ++ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED; ++ } ++ ++ dsi_wait_sync(display); ++ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++ ++ dsi_display_uninit_dispc(display); ++ ++ dsi_display_uninit_dsi(display); ++ ++ enable_clocks(0); ++ dsi_enable_pll_clock(0); ++end: ++ mutex_unlock(&dsi.lock); ++} ++ ++static int dsi_display_suspend(struct omap_display *display) ++{ ++ DSSDBG("dsi_display_suspend\n"); ++ ++ dsi_display_disable(display); ++ ++ display->state = OMAP_DSS_DISPLAY_SUSPENDED; ++ ++ return 0; ++} ++ ++static int dsi_display_resume(struct omap_display *display) ++{ ++ DSSDBG("dsi_display_resume\n"); ++ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++ return dsi_display_enable(display); ++} ++ ++static int dsi_display_update(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ DSSDBG("dsi_display_update(%d,%d %dx%d)\n", x, y, w, h); ++ ++ if (w == 0 || h == 0) ++ return 0; ++ ++ mutex_lock(&dsi.lock); ++ ++ if (dsi.target_update_mode == OMAP_DSS_UPDATE_MANUAL) ++ dsi_push_update(display, x, y, w, h); ++ /* XXX else return error? */ ++ ++ mutex_unlock(&dsi.lock); ++ ++ return 0; ++} ++ ++static int dsi_display_sync(struct omap_display *display) ++{ ++ DSSDBGF(""); ++ return dsi_wait_sync(display); ++} ++ ++static int dsi_display_set_update_mode(struct omap_display *display, ++ enum omap_dss_update_mode mode) ++{ ++ DSSDBGF("%d", mode); ++ ++ mutex_lock(&dsi.lock); ++ ++ if (dsi.target_update_mode != mode) { ++ dsi_push_set_update_mode(display, mode); ++ ++ dsi.target_update_mode = mode; ++ dsi.user_update_mode = mode; ++ } ++ ++ mutex_unlock(&dsi.lock); ++ ++ return dsi_wait_sync(display); ++} ++ ++static enum omap_dss_update_mode dsi_display_get_update_mode( ++ struct omap_display *display) ++{ ++ return dsi.update_mode; ++} ++ ++static int dsi_display_enable_te(struct omap_display *display, bool enable) ++{ ++ DSSDBGF("%d", enable); ++ ++ if (!display->ctrl->enable_te) ++ return -ENOENT; ++ ++ dsi_push_set_te(display, enable); ++ ++ return dsi_wait_sync(display); ++} ++ ++static int dsi_display_get_te(struct omap_display *display) ++{ ++ return dsi.use_te; ++} ++ ++ ++ ++static int dsi_display_set_rotate(struct omap_display *display, u8 rotate) ++{ ++ DSSDBGF("%d", rotate); ++ ++ if (!display->ctrl->set_rotate || !display->ctrl->get_rotate) ++ return -EINVAL; ++ ++ dsi_push_set_rotate(display, rotate); ++ ++ return dsi_wait_sync(display); ++} ++ ++static u8 dsi_display_get_rotate(struct omap_display *display) ++{ ++ if (!display->ctrl->set_rotate || !display->ctrl->get_rotate) ++ return 0; ++ ++ return display->ctrl->get_rotate(display); ++} ++ ++static int dsi_display_set_mirror(struct omap_display *display, bool mirror) ++{ ++ DSSDBGF("%d", mirror); ++ ++ if (!display->ctrl->set_mirror || !display->ctrl->get_mirror) ++ return -EINVAL; ++ ++ dsi_push_set_mirror(display, mirror); ++ ++ return dsi_wait_sync(display); ++} ++ ++static bool dsi_display_get_mirror(struct omap_display *display) ++{ ++ if (!display->ctrl->set_mirror || !display->ctrl->get_mirror) ++ return 0; ++ ++ return display->ctrl->get_mirror(display); ++} ++ ++static int dsi_display_run_test(struct omap_display *display, int test_num) ++{ ++ long wait = msecs_to_jiffies(60000); ++ struct completion compl; ++ int result; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return -EIO; ++ ++ DSSDBGF("%d", test_num); ++ ++ init_completion(&compl); ++ ++ dsi_push_test(display, test_num, &result, &compl); ++ ++ DSSDBG("Waiting for SYNC to happen...\n"); ++ wait = wait_for_completion_timeout(&compl, wait); ++ DSSDBG("Released from SYNC\n"); ++ ++ if (wait == 0) { ++ DSSERR("timeout waiting test sync\n"); ++ return -ETIME; ++ } ++ ++ return result; ++} ++ ++static int dsi_display_memory_read(struct omap_display *display, ++ void *buf, size_t size, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ long wait = msecs_to_jiffies(60000); ++ struct completion compl; ++ struct dsi_cmd_mem_read mem_read; ++ size_t ret_size; ++ ++ DSSDBGF(""); ++ ++ if (!display->ctrl->memory_read) ++ return -EINVAL; ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return -EIO; ++ ++ init_completion(&compl); ++ ++ mem_read.x = x; ++ mem_read.y = y; ++ mem_read.w = w; ++ mem_read.h = h; ++ mem_read.buf = buf; ++ mem_read.size = size; ++ mem_read.ret_size = &ret_size; ++ mem_read.completion = &compl; ++ ++ dsi_push_mem_read(display, &mem_read); ++ ++ DSSDBG("Waiting for SYNC to happen...\n"); ++ wait = wait_for_completion_timeout(&compl, wait); ++ DSSDBG("Released from SYNC\n"); ++ ++ if (wait == 0) { ++ DSSERR("timeout waiting mem read sync\n"); ++ return -ETIME; ++ } ++ ++ return ret_size; ++} ++ ++static void dsi_configure_overlay(struct omap_overlay *ovl) ++{ ++ unsigned low, high, size; ++ enum omap_burst_size burst; ++ enum omap_plane plane = ovl->id; ++ ++ burst = OMAP_DSS_BURST_16x32; ++ size = 16 * 32 / 8; ++ ++ dispc_set_burst_size(plane, burst); ++ ++ high = dispc_get_plane_fifo_size(plane) - size; ++ low = 0; ++ dispc_setup_plane_fifo(plane, low, high); ++} ++ ++void dsi_init_display(struct omap_display *display) ++{ ++ DSSDBG("DSI init\n"); ++ ++ display->enable = dsi_display_enable; ++ display->disable = dsi_display_disable; ++ display->suspend = dsi_display_suspend; ++ display->resume = dsi_display_resume; ++ display->update = dsi_display_update; ++ display->sync = dsi_display_sync; ++ display->set_update_mode = dsi_display_set_update_mode; ++ display->get_update_mode = dsi_display_get_update_mode; ++ display->enable_te = dsi_display_enable_te; ++ display->get_te = dsi_display_get_te; ++ ++ display->get_rotate = dsi_display_get_rotate; ++ display->set_rotate = dsi_display_set_rotate; ++ ++ display->get_mirror = dsi_display_get_mirror; ++ display->set_mirror = dsi_display_set_mirror; ++ ++ display->run_test = dsi_display_run_test; ++ display->memory_read = dsi_display_memory_read; ++ ++ display->configure_overlay = dsi_configure_overlay; ++ ++ display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; ++ ++ dsi.vc[0].display = display; ++ dsi.vc[1].display = display; ++} ++ ++int dsi_init(void) ++{ ++ u32 rev; ++ ++ spin_lock_init(&dsi.cmd_lock); ++ dsi.cmd_fifo = kfifo_alloc( ++ DSI_CMD_FIFO_LEN * sizeof(struct dsi_cmd_item), ++ GFP_KERNEL, ++ &dsi.cmd_lock); ++ ++ init_completion(&dsi.cmd_done); ++ atomic_set(&dsi.cmd_fifo_full, 0); ++ atomic_set(&dsi.cmd_pending, 0); ++ ++ init_completion(&dsi.bta_completion); ++ ++ dsi.workqueue = create_singlethread_workqueue("dsi"); ++ INIT_WORK(&dsi.framedone_work, framedone_worker); ++ INIT_WORK(&dsi.process_work, dsi_process_cmd_fifo); ++ ++ mutex_init(&dsi.lock); ++ ++ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED; ++ dsi.user_update_mode = OMAP_DSS_UPDATE_DISABLED; ++ ++ dsi.base = ioremap(DSI_BASE, DSI_SZ_REGS); ++ if (!dsi.base) { ++ DSSERR("can't ioremap DSI\n"); ++ return -ENOMEM; ++ } ++ ++ enable_clocks(1); ++ ++ rev = dsi_read_reg(DSI_REVISION); ++ printk(KERN_INFO "OMAP DSI rev %d.%d\n", ++ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); ++ ++ enable_clocks(0); ++ ++ return 0; ++} ++ ++void dsi_exit(void) ++{ ++ flush_workqueue(dsi.workqueue); ++ destroy_workqueue(dsi.workqueue); ++ ++ iounmap(dsi.base); ++ ++ kfifo_free(dsi.cmd_fifo); ++ ++ DSSDBG("omap_dsi_exit\n"); ++} ++ +diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c +new file mode 100644 +index 0000000..adc1f34 +--- /dev/null ++++ b/drivers/video/omap2/dss/dss.c +@@ -0,0 +1,345 @@ ++/* ++ * linux/drivers/video/omap2/dss/dss.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "DSS" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include "dss.h" ++ ++#define DSS_BASE 0x48050000 ++ ++#define DSS_SZ_REGS SZ_512 ++ ++struct dss_reg { ++ u16 idx; ++}; ++ ++#define DSS_REG(idx) ((const struct dss_reg) { idx }) ++ ++#define DSS_REVISION DSS_REG(0x0000) ++#define DSS_SYSCONFIG DSS_REG(0x0010) ++#define DSS_SYSSTATUS DSS_REG(0x0014) ++#define DSS_IRQSTATUS DSS_REG(0x0018) ++#define DSS_CONTROL DSS_REG(0x0040) ++#define DSS_SDI_CONTROL DSS_REG(0x0044) ++#define DSS_PLL_CONTROL DSS_REG(0x0048) ++#define DSS_SDI_STATUS DSS_REG(0x005C) ++ ++#define REG_GET(idx, start, end) \ ++ FLD_GET(dss_read_reg(idx), start, end) ++ ++#define REG_FLD_MOD(idx, val, start, end) \ ++ dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) ++ ++static struct { ++ void __iomem *base; ++ ++ u32 ctx[DSS_SZ_REGS / sizeof(u32)]; ++} dss; ++ ++static int _omap_dss_wait_reset(void); ++ ++static inline void dss_write_reg(const struct dss_reg idx, u32 val) ++{ ++ __raw_writel(val, dss.base + idx.idx); ++} ++ ++static inline u32 dss_read_reg(const struct dss_reg idx) ++{ ++ return __raw_readl(dss.base + idx.idx); ++} ++ ++#define SR(reg) \ ++ dss.ctx[(DSS_##reg).idx / sizeof(u32)] = dss_read_reg(DSS_##reg) ++#define RR(reg) \ ++ dss_write_reg(DSS_##reg, dss.ctx[(DSS_##reg).idx / sizeof(u32)]) ++ ++void dss_save_context(void) ++{ ++ if (cpu_is_omap24xx()) ++ return; ++ ++ SR(SYSCONFIG); ++ SR(CONTROL); ++ ++#ifdef CONFIG_OMAP2_DSS_SDI ++ SR(SDI_CONTROL); ++ SR(PLL_CONTROL); ++#endif ++} ++ ++void dss_restore_context(void) ++{ ++ if (_omap_dss_wait_reset()) ++ DSSERR("DSS not coming out of reset after sleep\n"); ++ ++ RR(SYSCONFIG); ++ RR(CONTROL); ++ ++#ifdef CONFIG_OMAP2_DSS_SDI ++ RR(SDI_CONTROL); ++ RR(PLL_CONTROL); ++#endif ++} ++ ++#undef SR ++#undef RR ++ ++void dss_sdi_init(u8 datapairs) ++{ ++ u32 l; ++ ++ BUG_ON(datapairs > 3 || datapairs < 1); ++ ++ l = dss_read_reg(DSS_SDI_CONTROL); ++ l = FLD_MOD(l, 0xf, 19, 15); /* SDI_PDIV */ ++ l = FLD_MOD(l, datapairs-1, 3, 2); /* SDI_PRSEL */ ++ l = FLD_MOD(l, 2, 1, 0); /* SDI_BWSEL */ ++ dss_write_reg(DSS_SDI_CONTROL, l); ++ ++ l = dss_read_reg(DSS_PLL_CONTROL); ++ l = FLD_MOD(l, 0x7, 25, 22); /* SDI_PLL_FREQSEL */ ++ l = FLD_MOD(l, 0xb, 16, 11); /* SDI_PLL_REGN */ ++ l = FLD_MOD(l, 0xb4, 10, 1); /* SDI_PLL_REGM */ ++ dss_write_reg(DSS_PLL_CONTROL, l); ++} ++ ++void dss_sdi_enable(void) ++{ ++ dispc_pck_free_enable(1); ++ ++ /* Reset SDI PLL */ ++ REG_FLD_MOD(DSS_PLL_CONTROL, 1, 18, 18); /* SDI_PLL_SYSRESET */ ++ udelay(1); /* wait 2x PCLK */ ++ ++ /* Lock SDI PLL */ ++ REG_FLD_MOD(DSS_PLL_CONTROL, 1, 28, 28); /* SDI_PLL_GOBIT */ ++ ++ /* Waiting for PLL lock request to complete */ ++ while (dss_read_reg(DSS_SDI_STATUS) & (1 << 6)) ++ ; ++ ++ /* Clearing PLL_GO bit */ ++ REG_FLD_MOD(DSS_PLL_CONTROL, 0, 28, 28); ++ ++ /* Waiting for PLL to lock */ ++ while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 5))) ++ ; ++ ++ dispc_lcd_enable_signal(1); ++ ++ /* Waiting for SDI reset to complete */ ++ while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 2))) ++ ; ++} ++ ++void dss_sdi_disable(void) ++{ ++ dispc_lcd_enable_signal(0); ++ ++ dispc_pck_free_enable(0); ++ ++ /* Reset SDI PLL */ ++ REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ ++} ++ ++void dss_dump_regs(struct seq_file *s) ++{ ++#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ DUMPREG(DSS_REVISION); ++ DUMPREG(DSS_SYSCONFIG); ++ DUMPREG(DSS_SYSSTATUS); ++ DUMPREG(DSS_IRQSTATUS); ++ DUMPREG(DSS_CONTROL); ++ DUMPREG(DSS_SDI_CONTROL); ++ DUMPREG(DSS_PLL_CONTROL); ++ DUMPREG(DSS_SDI_STATUS); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++#undef DUMPREG ++} ++ ++void dss_select_clk_source(bool dsi, bool dispc) ++{ ++ u32 r; ++ r = dss_read_reg(DSS_CONTROL); ++ r = FLD_MOD(r, dsi, 1, 1); /* DSI_CLK_SWITCH */ ++ r = FLD_MOD(r, dispc, 0, 0); /* DISPC_CLK_SWITCH */ ++ dss_write_reg(DSS_CONTROL, r); ++} ++ ++int dss_get_dsi_clk_source(void) ++{ ++ return FLD_GET(dss_read_reg(DSS_CONTROL), 1, 1); ++} ++ ++int dss_get_dispc_clk_source(void) ++{ ++ return FLD_GET(dss_read_reg(DSS_CONTROL), 0, 0); ++} ++ ++static irqreturn_t dss_irq_handler_omap2(int irq, void *arg) ++{ ++ dispc_irq_handler(); ++ ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t dss_irq_handler_omap3(int irq, void *arg) ++{ ++ u32 irqstatus; ++ ++ irqstatus = dss_read_reg(DSS_IRQSTATUS); ++ ++ if (irqstatus & (1<<0)) /* DISPC_IRQ */ ++ dispc_irq_handler(); ++#ifdef CONFIG_OMAP2_DSS_DSI ++ if (irqstatus & (1<<1)) /* DSI_IRQ */ ++ dsi_irq_handler(); ++#endif ++ ++ return IRQ_HANDLED; ++} ++ ++static int _omap_dss_wait_reset(void) ++{ ++ unsigned timeout = 1000; ++ ++ while (REG_GET(DSS_SYSSTATUS, 0, 0) == 0) { ++ udelay(1); ++ if (!--timeout) { ++ DSSERR("soft reset failed\n"); ++ return -ENODEV; ++ } ++ } ++ ++ return 0; ++} ++ ++static int _omap_dss_reset(void) ++{ ++ /* Soft reset */ ++ REG_FLD_MOD(DSS_SYSCONFIG, 1, 1, 1); ++ return _omap_dss_wait_reset(); ++} ++ ++void dss_set_venc_output(enum omap_dss_venc_type type) ++{ ++ int l = 0; ++ ++ if (type == OMAP_DSS_VENC_TYPE_COMPOSITE) ++ l = 0; ++ else if (type == OMAP_DSS_VENC_TYPE_SVIDEO) ++ l = 1; ++ else ++ BUG(); ++ ++ /* venc out selection. 0 = comp, 1 = svideo */ ++ REG_FLD_MOD(DSS_CONTROL, l, 6, 6); ++} ++ ++void dss_set_dac_pwrdn_bgz(bool enable) ++{ ++ REG_FLD_MOD(DSS_CONTROL, enable, 5, 5); /* DAC Power-Down Control */ ++} ++ ++int dss_init(bool skip_init) ++{ ++ int r; ++ u32 rev; ++ ++ dss.base = ioremap(DSS_BASE, DSS_SZ_REGS); ++ if (!dss.base) { ++ DSSERR("can't ioremap DSS\n"); ++ r = -ENOMEM; ++ goto fail0; ++ } ++ ++ if (!skip_init) { ++ /* We need to wait here a bit, otherwise we sometimes start to ++ * get synclost errors, and after that only power cycle will ++ * restore DSS functionality. I have no idea why this happens. ++ * And we have to wait _before_ resetting the DSS, but after ++ * enabling clocks. ++ */ ++ msleep(50); ++ ++ _omap_dss_reset(); ++ ++ } ++ else ++ printk("DSS SKIP RESET\n"); ++ ++ /* autoidle */ ++ REG_FLD_MOD(DSS_SYSCONFIG, 1, 0, 0); ++ ++ /* Select DPLL */ ++ REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); ++ ++#ifdef CONFIG_OMAP2_DSS_VENC ++ REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ ++ REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ ++ REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ ++#endif ++ ++ r = request_irq(INT_24XX_DSS_IRQ, ++ cpu_is_omap24xx() ++ ? dss_irq_handler_omap2 ++ : dss_irq_handler_omap3, ++ 0, "OMAP DSS", NULL); ++ ++ if (r < 0) { ++ DSSERR("omap2 dss: request_irq failed\n"); ++ goto fail1; ++ } ++ ++ dss_save_context(); ++ ++ rev = dss_read_reg(DSS_REVISION); ++ printk(KERN_INFO "OMAP DSS rev %d.%d\n", ++ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); ++ ++ return 0; ++ ++fail1: ++ iounmap(dss.base); ++fail0: ++ return r; ++} ++ ++void dss_exit(void) ++{ ++ free_irq(INT_24XX_DSS_IRQ, NULL); ++ ++ iounmap(dss.base); ++} ++ +diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h +new file mode 100644 +index 0000000..bac5ece +--- /dev/null ++++ b/drivers/video/omap2/dss/dss.h +@@ -0,0 +1,331 @@ ++/* ++ * linux/drivers/video/omap2/dss/dss.h ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#ifndef __OMAP2_DSS_H ++#define __OMAP2_DSS_H ++ ++#ifdef CONFIG_OMAP2_DSS_DEBUG_SUPPORT ++#define DEBUG ++#endif ++ ++#ifdef DEBUG ++extern unsigned int dss_debug; ++#ifdef DSS_SUBSYS_NAME ++#define DSSDBG(format, ...) \ ++ if (dss_debug) \ ++ printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME ": " format, \ ++ ## __VA_ARGS__) ++#else ++#define DSSDBG(format, ...) \ ++ if (dss_debug) \ ++ printk(KERN_DEBUG "omapdss: " format, ## __VA_ARGS__) ++#endif ++ ++#ifdef DSS_SUBSYS_NAME ++#define DSSDBGF(format, ...) \ ++ if (dss_debug) \ ++ printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME \ ++ ": %s(" format ")\n", \ ++ __func__, \ ++ ## __VA_ARGS__) ++#else ++#define DSSDBGF(format, ...) \ ++ if (dss_debug) \ ++ printk(KERN_DEBUG "omapdss: " \ ++ ": %s(" format ")\n", \ ++ __func__, \ ++ ## __VA_ARGS__) ++#endif ++ ++#else /* DEBUG */ ++#define DSSDBG(format, ...) ++#define DSSDBGF(format, ...) ++#endif ++ ++ ++#ifdef DSS_SUBSYS_NAME ++#define DSSERR(format, ...) \ ++ printk(KERN_ERR "omapdss " DSS_SUBSYS_NAME " error: " format, \ ++ ## __VA_ARGS__) ++#else ++#define DSSERR(format, ...) \ ++ printk(KERN_ERR "omapdss error: " format, ## __VA_ARGS__) ++#endif ++ ++#ifdef DSS_SUBSYS_NAME ++#define DSSINFO(format, ...) \ ++ printk(KERN_INFO "omapdss " DSS_SUBSYS_NAME ": " format, \ ++ ## __VA_ARGS__) ++#else ++#define DSSINFO(format, ...) \ ++ printk(KERN_INFO "omapdss: " format, ## __VA_ARGS__) ++#endif ++ ++#ifdef DSS_SUBSYS_NAME ++#define DSSWARN(format, ...) \ ++ printk(KERN_WARNING "omapdss " DSS_SUBSYS_NAME ": " format, \ ++ ## __VA_ARGS__) ++#else ++#define DSSWARN(format, ...) \ ++ printk(KERN_WARNING "omapdss: " format, ## __VA_ARGS__) ++#endif ++ ++/* OMAP TRM gives bitfields as start:end, where start is the higher bit ++ number. For example 7:0 */ ++#define FLD_MASK(start, end) (((1 << (start - end + 1)) - 1) << (end)) ++#define FLD_VAL(val, start, end) (((val) << end) & FLD_MASK(start, end)) ++#define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end)) ++#define FLD_MOD(orig, val, start, end) \ ++ (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) ++ ++#define DISPC_MAX_FCK 173000000 ++ ++enum omap_burst_size { ++ OMAP_DSS_BURST_4x32 = 0, ++ OMAP_DSS_BURST_8x32 = 1, ++ OMAP_DSS_BURST_16x32 = 2, ++}; ++ ++enum omap_parallel_interface_mode { ++ OMAP_DSS_PARALLELMODE_BYPASS, /* MIPI DPI */ ++ OMAP_DSS_PARALLELMODE_RFBI, /* MIPI DBI */ ++ OMAP_DSS_PARALLELMODE_DSI, ++}; ++ ++enum dss_clock { ++ DSS_CLK_ICK = 1 << 0, ++ DSS_CLK_FCK1 = 1 << 1, ++ DSS_CLK_FCK2 = 1 << 2, ++ DSS_CLK_54M = 1 << 3, ++ DSS_CLK_96M = 1 << 4, ++}; ++ ++struct dispc_clock_info { ++ /* rates that we get with dividers below */ ++ unsigned long fck; ++ unsigned long lck; ++ unsigned long pck; ++ ++ /* dividers */ ++ u16 fck_div; ++ u16 lck_div; ++ u16 pck_div; ++}; ++ ++struct dsi_clock_info { ++ /* rates that we get with dividers below */ ++ unsigned long fint; ++ unsigned long dsiphy; ++ unsigned long clkin; ++ unsigned long dsi1_pll_fclk; ++ unsigned long dsi2_pll_fclk; ++ unsigned long lck; ++ unsigned long pck; ++ ++ /* dividers */ ++ u16 regn; ++ u16 regm; ++ u16 regm3; ++ u16 regm4; ++ ++ u16 lck_div; ++ u16 pck_div; ++ ++ u8 highfreq; ++ bool use_dss2_fck; ++}; ++ ++struct seq_file; ++struct platform_device; ++ ++/* core */ ++void dss_clk_enable(enum dss_clock clks); ++void dss_clk_disable(enum dss_clock clks); ++unsigned long dss_clk_get_rate(enum dss_clock clk); ++int dss_need_ctx_restore(void); ++void dss_dump_clocks(struct seq_file *s); ++ ++int dss_dsi_power_up(void); ++void dss_dsi_power_down(void); ++ ++/* display */ ++void dss_init_displays(struct platform_device *pdev); ++void dss_uninit_displays(struct platform_device *pdev); ++int dss_suspend_all_displays(void); ++int dss_resume_all_displays(void); ++struct omap_display *dss_get_display(int no); ++ ++/* manager */ ++int dss_init_overlay_managers(struct platform_device *pdev); ++void dss_uninit_overlay_managers(struct platform_device *pdev); ++ ++/* overlay */ ++void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name); ++void dss_uninit_overlays(struct platform_device *pdev); ++int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display); ++void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr); ++ ++/* DSS */ ++int dss_init(bool skip_init); ++void dss_exit(void); ++ ++void dss_save_context(void); ++void dss_restore_context(void); ++ ++void dss_dump_regs(struct seq_file *s); ++ ++void dss_sdi_init(u8 datapairs); ++void dss_sdi_enable(void); ++void dss_sdi_disable(void); ++ ++void dss_select_clk_source(bool dsi, bool dispc); ++int dss_get_dsi_clk_source(void); ++int dss_get_dispc_clk_source(void); ++void dss_set_venc_output(enum omap_dss_venc_type type); ++void dss_set_dac_pwrdn_bgz(bool enable); ++ ++/* SDI */ ++int sdi_init(bool skip_init); ++void sdi_exit(void); ++void sdi_init_display(struct omap_display *display); ++ ++/* DSI */ ++int dsi_init(void); ++void dsi_exit(void); ++ ++void dsi_dump_clocks(struct seq_file *s); ++void dsi_dump_regs(struct seq_file *s); ++ ++void dsi_save_context(void); ++void dsi_restore_context(void); ++ ++void dsi_init_display(struct omap_display *display); ++void dsi_irq_handler(void); ++unsigned long dsi_get_dsi1_pll_rate(void); ++unsigned long dsi_get_dsi2_pll_rate(void); ++int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck, ++ struct dsi_clock_info *cinfo); ++int dsi_pll_program(struct dsi_clock_info *cinfo); ++int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv); ++void dsi_pll_uninit(void); ++ ++/* DPI */ ++int dpi_init(void); ++void dpi_exit(void); ++void dpi_init_display(struct omap_display *display); ++ ++/* DISPC */ ++int dispc_init(void); ++void dispc_exit(void); ++void dispc_dump_clocks(struct seq_file *s); ++void dispc_dump_regs(struct seq_file *s); ++void dispc_irq_handler(void); ++void dispc_fake_vsync_irq(void); ++ ++void dispc_save_context(void); ++void dispc_restore_context(void); ++ ++void dispc_lcd_enable_signal_polarity(bool act_high); ++void dispc_lcd_enable_signal(bool enable); ++void dispc_pck_free_enable(bool enable); ++void dispc_enable_fifohandcheck(bool enable); ++ ++void dispc_set_lcd_size(u16 width, u16 height); ++void dispc_set_digit_size(u16 width, u16 height); ++u32 dispc_get_plane_fifo_size(enum omap_plane plane); ++void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high); ++void dispc_enable_fifomerge(bool enable); ++void dispc_set_burst_size(enum omap_plane plane, ++ enum omap_burst_size burst_size); ++ ++void dispc_set_plane_ba0(enum omap_plane plane, u32 paddr); ++void dispc_set_plane_ba1(enum omap_plane plane, u32 paddr); ++void dispc_set_plane_pos(enum omap_plane plane, u16 x, u16 y); ++void dispc_set_plane_size(enum omap_plane plane, u16 width, u16 height); ++ ++int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, ++ u32 paddr, u16 screen_width, ++ u16 pos_x, u16 pos_y, ++ u16 width, u16 height, ++ u16 out_width, u16 out_height, ++ enum omap_color_mode color_mode, ++ bool ilace, ++ u8 rotation, bool mirror); ++ ++void dispc_go(enum omap_channel channel); ++void dispc_enable_lcd_out(bool enable); ++void dispc_enable_digit_out(bool enable); ++int dispc_enable_plane(enum omap_plane plane, bool enable); ++ ++void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode); ++void dispc_set_tft_data_lines(u8 data_lines); ++void dispc_set_lcd_display_type(enum omap_lcd_display_type type); ++void dispc_set_loadmode(enum omap_dss_load_mode mode); ++ ++void dispc_set_default_color(enum omap_channel channel, u32 color); ++u32 dispc_get_default_color(enum omap_channel channel); ++void dispc_set_trans_key(enum omap_channel ch, ++ enum omap_dss_color_key_type type, ++ u32 trans_key); ++void dispc_get_trans_key(enum omap_channel ch, ++ enum omap_dss_color_key_type *type, ++ u32 *trans_key); ++void dispc_enable_trans_key(enum omap_channel ch, bool enable); ++bool dispc_trans_key_enabled(enum omap_channel ch); ++ ++void dispc_set_lcd_timings(struct omap_video_timings *timings); ++unsigned long dispc_fclk_rate(void); ++unsigned long dispc_pclk_rate(void); ++void dispc_set_pol_freq(struct omap_panel *panel); ++void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck, ++ u16 *lck_div, u16 *pck_div); ++int dispc_calc_clock_div(bool is_tft, unsigned long req_pck, ++ struct dispc_clock_info *cinfo); ++int dispc_set_clock_div(struct dispc_clock_info *cinfo); ++int dispc_get_clock_div(struct dispc_clock_info *cinfo); ++void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div); ++ ++void dispc_setup_partial_planes(struct omap_display *display, ++ u16 *x, u16 *y, u16 *w, u16 *h); ++void dispc_draw_partial_planes(struct omap_display *display); ++ ++ ++/* VENC */ ++int venc_init(void); ++void venc_exit(void); ++void venc_dump_regs(struct seq_file *s); ++void venc_init_display(struct omap_display *display); ++ ++/* RFBI */ ++int rfbi_init(void); ++void rfbi_exit(void); ++void rfbi_dump_regs(struct seq_file *s); ++ ++int rfbi_configure(int rfbi_module, int bpp, int lines); ++void rfbi_enable_rfbi(bool enable); ++void rfbi_transfer_area(u16 width, u16 height, ++ void (callback)(void *data), void *data); ++void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t); ++unsigned long rfbi_get_max_tx_rate(void); ++void rfbi_init_display(struct omap_display *display); ++ ++#endif +diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c +new file mode 100644 +index 0000000..b0fee80 +--- /dev/null ++++ b/drivers/video/omap2/dss/manager.c +@@ -0,0 +1,576 @@ ++/* ++ * linux/drivers/video/omap2/dss/manager.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "MANAGER" ++ ++#include ++#include ++#include ++ ++#include ++ ++#include "dss.h" ++ ++static int num_managers; ++static struct list_head manager_list; ++ ++static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", mgr->name); ++} ++ ++static ssize_t manager_display_show(struct omap_overlay_manager *mgr, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", ++ mgr->display ? mgr->display->name : ""); ++} ++ ++static ssize_t manager_display_store(struct omap_overlay_manager *mgr, const char *buf, size_t size) ++{ ++ int r, i; ++ int len = size; ++ struct omap_display *display = NULL; ++ ++ if (buf[size-1] == '\n') ++ --len; ++ ++ if (len > 0) { ++ for (i = 0; i < omap_dss_get_num_displays(); ++i) { ++ display = dss_get_display(i); ++ ++ if (strncmp(buf, display->name, len) == 0) ++ break; ++ ++ display = NULL; ++ } ++ } ++ ++ if (len > 0 && display == NULL) ++ return -EINVAL; ++ ++ if (display) ++ DSSDBG("display %s found\n", display->name); ++ ++ if (mgr->display) { ++ r = mgr->unset_display(mgr); ++ if (r) { ++ DSSERR("failed to unset display\n"); ++ return r; ++ } ++ } ++ ++ if (display) { ++ r = mgr->set_display(mgr, display); ++ if (r) { ++ DSSERR("failed to set manager\n"); ++ return r; ++ } ++ ++ r = mgr->apply(mgr); ++ if (r) { ++ DSSERR("failed to apply dispc config\n"); ++ return r; ++ } ++ } ++ ++ return size; ++} ++ ++static ssize_t manager_default_color_show(struct omap_overlay_manager *mgr, ++ char *buf) ++{ ++ u32 default_color; ++ ++ default_color = dispc_get_default_color(mgr->id); ++ return snprintf(buf, PAGE_SIZE, "%d", default_color); ++} ++ ++static ssize_t manager_default_color_store(struct omap_overlay_manager *mgr, ++ const char *buf, size_t size) ++{ ++ u32 default_color; ++ ++ if (sscanf(buf, "%d", &default_color) != 1) ++ return -EINVAL; ++ dispc_set_default_color(mgr->id, default_color); ++ ++ return size; ++} ++ ++static const char *color_key_type_str[] = { ++ "gfx-destination", ++ "video-source", ++}; ++ ++static ssize_t manager_color_key_type_show(struct omap_overlay_manager *mgr, ++ char *buf) ++{ ++ enum omap_dss_color_key_type key_type; ++ ++ dispc_get_trans_key(mgr->id, &key_type, NULL); ++ BUG_ON(key_type >= ARRAY_SIZE(color_key_type_str)); ++ ++ return snprintf(buf, PAGE_SIZE, "%s\n", color_key_type_str[key_type]); ++} ++ ++static ssize_t manager_color_key_type_store(struct omap_overlay_manager *mgr, ++ const char *buf, size_t size) ++{ ++ enum omap_dss_color_key_type key_type; ++ u32 key_value; ++ ++ for (key_type = OMAP_DSS_COLOR_KEY_GFX_DST; ++ key_type < ARRAY_SIZE(color_key_type_str); key_type++) { ++ if (sysfs_streq(buf, color_key_type_str[key_type])) ++ break; ++ } ++ if (key_type == ARRAY_SIZE(color_key_type_str)) ++ return -EINVAL; ++ dispc_get_trans_key(mgr->id, NULL, &key_value); ++ dispc_set_trans_key(mgr->id, key_type, key_value); ++ ++ return size; ++} ++ ++static ssize_t manager_color_key_value_show(struct omap_overlay_manager *mgr, ++ char *buf) ++{ ++ u32 key_value; ++ ++ dispc_get_trans_key(mgr->id, NULL, &key_value); ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", key_value); ++} ++ ++static ssize_t manager_color_key_value_store(struct omap_overlay_manager *mgr, ++ const char *buf, size_t size) ++{ ++ enum omap_dss_color_key_type key_type; ++ u32 key_value; ++ ++ if (sscanf(buf, "%d", &key_value) != 1) ++ return -EINVAL; ++ dispc_get_trans_key(mgr->id, &key_type, NULL); ++ dispc_set_trans_key(mgr->id, key_type, key_value); ++ ++ return size; ++} ++ ++static ssize_t manager_color_key_enabled_show(struct omap_overlay_manager *mgr, ++ char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ++ dispc_trans_key_enabled(mgr->id)); ++} ++ ++static ssize_t manager_color_key_enabled_store(struct omap_overlay_manager *mgr, ++ const char *buf, size_t size) ++{ ++ int enable; ++ ++ if (sscanf(buf, "%d", &enable) != 1) ++ return -EINVAL; ++ ++ dispc_enable_trans_key(mgr->id, enable); ++ ++ return size; ++} ++ ++ ++struct manager_attribute { ++ struct attribute attr; ++ ssize_t (*show)(struct omap_overlay_manager *, char *); ++ ssize_t (*store)(struct omap_overlay_manager *, const char *, size_t); ++}; ++ ++#define MANAGER_ATTR(_name, _mode, _show, _store) \ ++ struct manager_attribute manager_attr_##_name = \ ++ __ATTR(_name, _mode, _show, _store) ++ ++static MANAGER_ATTR(name, S_IRUGO, manager_name_show, NULL); ++static MANAGER_ATTR(display, S_IRUGO|S_IWUSR, ++ manager_display_show, manager_display_store); ++static MANAGER_ATTR(default_color, S_IRUGO|S_IWUSR, ++ manager_default_color_show, manager_default_color_store); ++static MANAGER_ATTR(color_key_type, S_IRUGO|S_IWUSR, ++ manager_color_key_type_show, manager_color_key_type_store); ++static MANAGER_ATTR(color_key_value, S_IRUGO|S_IWUSR, ++ manager_color_key_value_show, manager_color_key_value_store); ++static MANAGER_ATTR(color_key_enabled, S_IRUGO|S_IWUSR, ++ manager_color_key_enabled_show, manager_color_key_enabled_store); ++ ++static struct attribute *manager_sysfs_attrs[] = { ++ &manager_attr_name.attr, ++ &manager_attr_display.attr, ++ &manager_attr_default_color.attr, ++ &manager_attr_color_key_type.attr, ++ &manager_attr_color_key_value.attr, ++ &manager_attr_color_key_enabled.attr, ++ NULL ++}; ++ ++static ssize_t manager_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) ++{ ++ struct omap_overlay_manager *manager; ++ struct manager_attribute *manager_attr; ++ ++ manager = container_of(kobj, struct omap_overlay_manager, kobj); ++ manager_attr = container_of(attr, struct manager_attribute, attr); ++ ++ if (!manager_attr->show) ++ return -ENOENT; ++ ++ return manager_attr->show(manager, buf); ++} ++ ++static ssize_t manager_attr_store(struct kobject *kobj, struct attribute *attr, ++ const char *buf, size_t size) ++{ ++ struct omap_overlay_manager *manager; ++ struct manager_attribute *manager_attr; ++ ++ manager = container_of(kobj, struct omap_overlay_manager, kobj); ++ manager_attr = container_of(attr, struct manager_attribute, attr); ++ ++ if (!manager_attr->store) ++ return -ENOENT; ++ ++ return manager_attr->store(manager, buf, size); ++} ++ ++static struct sysfs_ops manager_sysfs_ops = { ++ .show = manager_attr_show, ++ .store = manager_attr_store, ++}; ++ ++static struct kobj_type manager_ktype = { ++ .sysfs_ops = &manager_sysfs_ops, ++ .default_attrs = manager_sysfs_attrs, ++}; ++ ++static int omap_dss_set_display(struct omap_overlay_manager *mgr, ++ struct omap_display *display) ++{ ++ int i; ++ int r; ++ ++ if (display->manager) { ++ DSSERR("display '%s' already has a manager '%s'\n", ++ display->name, display->manager->name); ++ return -EINVAL; ++ } ++ ++ if ((mgr->supported_displays & display->type) == 0) { ++ DSSERR("display '%s' does not support manager '%s'\n", ++ display->name, mgr->name); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < mgr->num_overlays; i++) { ++ struct omap_overlay *ovl = mgr->overlays[i]; ++ ++ if (ovl->manager != mgr || !ovl->info.enabled) ++ continue; ++ ++ r = dss_check_overlay(ovl, display); ++ if (r) ++ return r; ++ } ++ ++ display->manager = mgr; ++ mgr->display = display; ++ ++ return 0; ++} ++ ++static int omap_dss_unset_display(struct omap_overlay_manager *mgr) ++{ ++ if (!mgr->display) { ++ DSSERR("failed to unset display, display not set.\n"); ++ return -EINVAL; ++ } ++ ++ mgr->display->manager = NULL; ++ mgr->display = NULL; ++ ++ return 0; ++} ++ ++ ++static int overlay_enabled(struct omap_overlay *ovl) ++{ ++ return ovl->info.enabled && ovl->manager && ovl->manager->display; ++} ++ ++/* We apply settings to both managers here so that we can use optimizations ++ * like fifomerge. Shadow registers can be changed first and the non-shadowed ++ * should be changed last, at the same time with GO */ ++static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) ++{ ++ int i; ++ int ret = 0; ++ enum omap_dss_update_mode mode; ++ struct omap_display *display; ++ struct omap_overlay *ovl; ++ bool ilace = 0; ++ int outw, outh; ++ int r; ++ int num_planes_enabled = 0; ++ ++ DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ /* Configure normal overlay parameters and disable unused overlays */ ++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { ++ ovl = omap_dss_get_overlay(i); ++ ++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) ++ continue; ++ ++ if (!overlay_enabled(ovl)) { ++ dispc_enable_plane(ovl->id, 0); ++ continue; ++ } ++ ++ display = ovl->manager->display; ++ ++ if (dss_check_overlay(ovl, display)) { ++ dispc_enable_plane(ovl->id, 0); ++ continue; ++ } ++ ++ ++num_planes_enabled; ++ ++ /* On a manual update display, in manual update mode, update() ++ * handles configuring planes */ ++ mode = OMAP_DSS_UPDATE_AUTO; ++ if (display->get_update_mode) ++ mode = display->get_update_mode(mgr->display); ++ ++ if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE && ++ mode != OMAP_DSS_UPDATE_AUTO) ++ continue; ++ ++ if (display->type == OMAP_DISPLAY_TYPE_VENC) ++ ilace = 1; ++ ++ if (ovl->info.out_width == 0) ++ outw = ovl->info.width; ++ else ++ outw = ovl->info.out_width; ++ ++ if (ovl->info.out_height == 0) ++ outh = ovl->info.height; ++ else ++ outh = ovl->info.out_height; ++ ++ r = dispc_setup_plane(ovl->id, ovl->manager->id, ++ ovl->info.paddr, ++ ovl->info.screen_width, ++ ovl->info.pos_x, ++ ovl->info.pos_y, ++ ovl->info.width, ++ ovl->info.height, ++ outw, ++ outh, ++ ovl->info.color_mode, ++ ilace, ++ ovl->info.rotation, ++ ovl->info.mirror); ++ ++ if (r) { ++ DSSERR("dispc_setup_plane failed for ovl %d\n", ++ ovl->id); ++ dispc_enable_plane(ovl->id, 0); ++ continue; ++ } ++ ++ dispc_enable_plane(ovl->id, 1); ++ } ++ ++ /* Enable fifo merge if possible */ ++ dispc_enable_fifomerge(num_planes_enabled == 1); ++ ++ /* Go through overlays again. This time we configure fifos. We have to ++ * do this after enabling/disabling fifomerge so that we have correct ++ * knowledge of fifo sizes */ ++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) { ++ ovl = omap_dss_get_overlay(i); ++ ++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC)) ++ continue; ++ ++ if (!overlay_enabled(ovl)) { ++ continue; ++ } ++ ++ ovl->manager->display->configure_overlay(ovl); ++ } ++ ++ /* Issue GO for managers */ ++ list_for_each_entry(mgr, &manager_list, list) { ++ if (!(mgr->caps & OMAP_DSS_OVL_MGR_CAP_DISPC)) ++ continue; ++ ++ display = mgr->display; ++ ++ if (!display) ++ continue; ++ ++ /* We don't need GO with manual update display. LCD iface will ++ * always be turned off after frame, and new settings will ++ * be taken in to use at next update */ ++ if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) ++ continue; ++ ++ dispc_go(mgr->id); ++ } ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ return ret; ++} ++ ++static void omap_dss_mgr_set_def_color(struct omap_overlay_manager *mgr, ++ u32 color) ++{ ++ dispc_set_default_color(mgr->id, color); ++} ++ ++static void omap_dss_mgr_set_trans_key(struct omap_overlay_manager *mgr, ++ enum omap_dss_color_key_type type, ++ u32 trans_key) ++{ ++ dispc_set_trans_key(mgr->id, type, trans_key); ++} ++ ++static void omap_dss_mgr_enable_trans_key(struct omap_overlay_manager *mgr, ++ bool enable) ++{ ++ dispc_enable_trans_key(mgr->id, enable); ++} ++ ++static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager) ++{ ++ ++num_managers; ++ list_add_tail(&manager->list, &manager_list); ++} ++ ++int dss_init_overlay_managers(struct platform_device *pdev) ++{ ++ int i, r; ++ ++ INIT_LIST_HEAD(&manager_list); ++ ++ num_managers = 0; ++ ++ for (i = 0; i < 2; ++i) { ++ struct omap_overlay_manager *mgr; ++ mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); ++ ++ BUG_ON(mgr == NULL); ++ ++ switch (i) { ++ case 0: ++ mgr->name = "lcd"; ++ mgr->id = OMAP_DSS_CHANNEL_LCD; ++ mgr->supported_displays = ++ OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | ++ OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI; ++ break; ++ case 1: ++ mgr->name = "tv"; ++ mgr->id = OMAP_DSS_CHANNEL_DIGIT; ++ mgr->supported_displays = OMAP_DISPLAY_TYPE_VENC; ++ break; ++ } ++ ++ mgr->set_display = &omap_dss_set_display, ++ mgr->unset_display = &omap_dss_unset_display, ++ mgr->apply = &omap_dss_mgr_apply, ++ mgr->set_default_color = &omap_dss_mgr_set_def_color, ++ mgr->set_trans_key = &omap_dss_mgr_set_trans_key, ++ mgr->enable_trans_key = &omap_dss_mgr_enable_trans_key, ++ mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC, ++ ++ dss_overlay_setup_dispc_manager(mgr); ++ ++ omap_dss_add_overlay_manager(mgr); ++ ++ r = kobject_init_and_add(&mgr->kobj, &manager_ktype, ++ &pdev->dev.kobj, "manager%d", i); ++ ++ if (r) { ++ DSSERR("failed to create sysfs file\n"); ++ continue; ++ } ++ } ++ ++ return 0; ++} ++ ++void dss_uninit_overlay_managers(struct platform_device *pdev) ++{ ++ struct omap_overlay_manager *mgr; ++ ++ while (!list_empty(&manager_list)) { ++ mgr = list_first_entry(&manager_list, ++ struct omap_overlay_manager, list); ++ list_del(&mgr->list); ++ kobject_del(&mgr->kobj); ++ kobject_put(&mgr->kobj); ++ kfree(mgr); ++ } ++ ++ num_managers = 0; ++} ++ ++int omap_dss_get_num_overlay_managers(void) ++{ ++ return num_managers; ++} ++EXPORT_SYMBOL(omap_dss_get_num_overlay_managers); ++ ++struct omap_overlay_manager *omap_dss_get_overlay_manager(int num) ++{ ++ int i = 0; ++ struct omap_overlay_manager *mgr; ++ ++ list_for_each_entry(mgr, &manager_list, list) { ++ if (i++ == num) ++ return mgr; ++ } ++ ++ return NULL; ++} ++EXPORT_SYMBOL(omap_dss_get_overlay_manager); ++ ++#ifdef L4_EXAMPLE ++static int ovl_mgr_apply_l4(struct omap_overlay_manager *mgr) ++{ ++ DSSDBG("omap_dss_mgr_apply_l4(%s)\n", mgr->name); ++ ++ return 0; ++} ++#endif ++ +diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c +new file mode 100644 +index 0000000..968edbe +--- /dev/null ++++ b/drivers/video/omap2/dss/overlay.c +@@ -0,0 +1,587 @@ ++/* ++ * linux/drivers/video/omap2/dss/overlay.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "OVERLAY" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "dss.h" ++ ++static int num_overlays; ++static struct list_head overlay_list; ++ ++static ssize_t overlay_name_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", ovl->name); ++} ++ ++static ssize_t overlay_manager_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%s\n", ++ ovl->manager ? ovl->manager->name : ""); ++} ++ ++static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf, size_t size) ++{ ++ int i, r; ++ struct omap_overlay_manager *mgr = NULL; ++ int len = size; ++ ++ if (buf[size-1] == '\n') ++ --len; ++ ++ if (len > 0) { ++ for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { ++ mgr = omap_dss_get_overlay_manager(i); ++ ++ if (strncmp(buf, mgr->name, len) == 0) ++ break; ++ ++ mgr = NULL; ++ } ++ } ++ ++ if (len > 0 && mgr == NULL) ++ return -EINVAL; ++ ++ if (mgr) ++ DSSDBG("manager %s found\n", mgr->name); ++ ++ if (mgr != ovl->manager) { ++ /* detach old manager */ ++ if (ovl->manager) { ++ r = ovl->unset_manager(ovl); ++ if (r) { ++ DSSERR("detach failed\n"); ++ return r; ++ } ++ } ++ ++ if (mgr) { ++ r = ovl->set_manager(ovl, mgr); ++ if (r) { ++ DSSERR("Failed to attach overlay\n"); ++ return r; ++ } ++ } ++ } ++ ++ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t overlay_input_size_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d,%d\n", ++ ovl->info.width, ovl->info.height); ++} ++ ++static ssize_t overlay_screen_width_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ovl->info.screen_width); ++} ++ ++static ssize_t overlay_position_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d,%d\n", ++ ovl->info.pos_x, ovl->info.pos_y); ++} ++ ++static ssize_t overlay_position_store(struct omap_overlay *ovl, ++ const char *buf, size_t size) ++{ ++ int r; ++ char *last; ++ struct omap_overlay_info info; ++ ++ ovl->get_overlay_info(ovl, &info); ++ ++ info.pos_x = simple_strtoul(buf, &last, 10); ++ ++last; ++ if (last - buf >= size) ++ return -EINVAL; ++ ++ info.pos_y = simple_strtoul(last, &last, 10); ++ ++ if ((r = ovl->set_overlay_info(ovl, &info))) ++ return r; ++ ++ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t overlay_output_size_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d,%d\n", ++ ovl->info.out_width, ovl->info.out_height); ++} ++ ++static ssize_t overlay_output_size_store(struct omap_overlay *ovl, ++ const char *buf, size_t size) ++{ ++ int r; ++ char *last; ++ struct omap_overlay_info info; ++ ++ ovl->get_overlay_info(ovl, &info); ++ ++ info.out_width = simple_strtoul(buf, &last, 10); ++ ++last; ++ if (last - buf >= size) ++ return -EINVAL; ++ ++ info.out_height = simple_strtoul(last, &last, 10); ++ ++ if ((r = ovl->set_overlay_info(ovl, &info))) ++ return r; ++ ++ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) ++ return r; ++ ++ return size; ++} ++ ++static ssize_t overlay_enabled_show(struct omap_overlay *ovl, char *buf) ++{ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ovl->info.enabled); ++} ++ ++static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf, size_t size) ++{ ++ int r; ++ struct omap_overlay_info info; ++ ++ ovl->get_overlay_info(ovl, &info); ++ ++ info.enabled = simple_strtoul(buf, NULL, 10); ++ ++ if ((r = ovl->set_overlay_info(ovl, &info))) ++ return r; ++ ++ if (ovl->manager && (r = ovl->manager->apply(ovl->manager))) ++ return r; ++ ++ return size; ++} ++ ++struct overlay_attribute { ++ struct attribute attr; ++ ssize_t (*show)(struct omap_overlay *, char *); ++ ssize_t (*store)(struct omap_overlay *, const char *, size_t); ++}; ++ ++#define OVERLAY_ATTR(_name, _mode, _show, _store) \ ++ struct overlay_attribute overlay_attr_##_name = \ ++ __ATTR(_name, _mode, _show, _store) ++ ++static OVERLAY_ATTR(name, S_IRUGO, overlay_name_show, NULL); ++static OVERLAY_ATTR(manager, S_IRUGO|S_IWUSR, ++ overlay_manager_show, overlay_manager_store); ++static OVERLAY_ATTR(input_size, S_IRUGO, overlay_input_size_show, NULL); ++static OVERLAY_ATTR(screen_width, S_IRUGO, overlay_screen_width_show, NULL); ++static OVERLAY_ATTR(position, S_IRUGO|S_IWUSR, ++ overlay_position_show, overlay_position_store); ++static OVERLAY_ATTR(output_size, S_IRUGO|S_IWUSR, ++ overlay_output_size_show, overlay_output_size_store); ++static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR, ++ overlay_enabled_show, overlay_enabled_store); ++ ++static struct attribute *overlay_sysfs_attrs[] = { ++ &overlay_attr_name.attr, ++ &overlay_attr_manager.attr, ++ &overlay_attr_input_size.attr, ++ &overlay_attr_screen_width.attr, ++ &overlay_attr_position.attr, ++ &overlay_attr_output_size.attr, ++ &overlay_attr_enabled.attr, ++ NULL ++}; ++ ++static ssize_t overlay_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) ++{ ++ struct omap_overlay *overlay; ++ struct overlay_attribute *overlay_attr; ++ ++ overlay = container_of(kobj, struct omap_overlay, kobj); ++ overlay_attr = container_of(attr, struct overlay_attribute, attr); ++ ++ if (!overlay_attr->show) ++ return -ENOENT; ++ ++ return overlay_attr->show(overlay, buf); ++} ++ ++static ssize_t overlay_attr_store(struct kobject *kobj, struct attribute *attr, ++ const char *buf, size_t size) ++{ ++ struct omap_overlay *overlay; ++ struct overlay_attribute *overlay_attr; ++ ++ overlay = container_of(kobj, struct omap_overlay, kobj); ++ overlay_attr = container_of(attr, struct overlay_attribute, attr); ++ ++ if (!overlay_attr->store) ++ return -ENOENT; ++ ++ return overlay_attr->store(overlay, buf, size); ++} ++ ++static struct sysfs_ops overlay_sysfs_ops = { ++ .show = overlay_attr_show, ++ .store = overlay_attr_store, ++}; ++ ++static struct kobj_type overlay_ktype = { ++ .sysfs_ops = &overlay_sysfs_ops, ++ .default_attrs = overlay_sysfs_attrs, ++}; ++ ++/* Check if overlay parameters are compatible with display */ ++int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display) ++{ ++ struct omap_overlay_info *info; ++ u16 outw, outh; ++ u16 dw, dh; ++ ++ if (!display) ++ return 0; ++ ++ if (!ovl->info.enabled) ++ return 0; ++ ++ info = &ovl->info; ++ ++ display->get_resolution(display, &dw, &dh); ++ ++ DSSDBG("check_overlay %d: (%d,%d %dx%d -> %dx%d) disp (%dx%d)\n", ++ ovl->id, ++ info->pos_x, info->pos_y, ++ info->width, info->height, ++ info->out_width, info->out_height, ++ dw, dh); ++ ++ if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { ++ outw = info->width; ++ outh = info->height; ++ } else { ++ if (info->out_width == 0) ++ outw = info->width; ++ else ++ outw = info->out_width; ++ ++ if (info->out_height == 0) ++ outh = info->height; ++ else ++ outh = info->out_height; ++ } ++ ++ if (dw < info->pos_x + outw) { ++ DSSDBG("check_overlay failed 1: %d < %d + %d\n", ++ dw, info->pos_x, outw); ++ return -EINVAL; ++ } ++ ++ if (dh < info->pos_y + outh) { ++ DSSDBG("check_overlay failed 2: %d < %d + %d\n", ++ dh, info->pos_y, outh); ++ return -EINVAL; ++ } ++ ++ if ((ovl->supported_modes & info->color_mode) == 0) { ++ DSSERR("overlay doesn't support mode %d\n", info->color_mode); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int dss_ovl_set_overlay_info(struct omap_overlay *ovl, ++ struct omap_overlay_info *info) ++{ ++ int r; ++ struct omap_overlay_info old_info; ++ ++ old_info = ovl->info; ++ ovl->info = *info; ++ ++ if (ovl->manager) { ++ r = dss_check_overlay(ovl, ovl->manager->display); ++ if (r) { ++ ovl->info = old_info; ++ return r; ++ } ++ } ++ ++ return 0; ++} ++ ++static void dss_ovl_get_overlay_info(struct omap_overlay *ovl, ++ struct omap_overlay_info *info) ++{ ++ *info = ovl->info; ++} ++ ++static int omap_dss_set_manager(struct omap_overlay *ovl, ++ struct omap_overlay_manager *mgr) ++{ ++ int r; ++ ++ if (ovl->manager) { ++ DSSERR("overlay '%s' already has a manager '%s'\n", ++ ovl->name, ovl->manager->name); ++ } ++ ++ r = dss_check_overlay(ovl, mgr->display); ++ if (r) ++ return r; ++ ++ ovl->manager = mgr; ++ ++ return 0; ++} ++ ++static int omap_dss_unset_manager(struct omap_overlay *ovl) ++{ ++ if (!ovl->manager) { ++ DSSERR("failed to detach overlay: manager not set\n"); ++ return -EINVAL; ++ } ++ ++ ovl->manager = NULL; ++ ++ return 0; ++} ++ ++int omap_dss_get_num_overlays(void) ++{ ++ return num_overlays; ++} ++EXPORT_SYMBOL(omap_dss_get_num_overlays); ++ ++struct omap_overlay *omap_dss_get_overlay(int num) ++{ ++ int i = 0; ++ struct omap_overlay *ovl; ++ ++ list_for_each_entry(ovl, &overlay_list, list) { ++ if (i++ == num) ++ return ovl; ++ } ++ ++ return NULL; ++} ++EXPORT_SYMBOL(omap_dss_get_overlay); ++ ++static void omap_dss_add_overlay(struct omap_overlay *overlay) ++{ ++ ++num_overlays; ++ list_add_tail(&overlay->list, &overlay_list); ++} ++ ++static struct omap_overlay *dispc_overlays[3]; ++ ++void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr) ++{ ++ mgr->num_overlays = 3; ++ mgr->overlays = dispc_overlays; ++} ++ ++void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name) ++{ ++ int i, r; ++ struct omap_overlay_manager *lcd_mgr; ++ struct omap_overlay_manager *tv_mgr; ++ struct omap_overlay_manager *def_mgr = NULL; ++ ++ INIT_LIST_HEAD(&overlay_list); ++ ++ num_overlays = 0; ++ ++ for (i = 0; i < 3; ++i) { ++ struct omap_overlay *ovl; ++ ovl = kzalloc(sizeof(*ovl), GFP_KERNEL); ++ ++ BUG_ON(ovl == NULL); ++ ++ switch (i) { ++ case 0: ++ ovl->name = "gfx"; ++ ovl->id = OMAP_DSS_GFX; ++ ovl->supported_modes = OMAP_DSS_COLOR_GFX_OMAP3; ++ ovl->caps = OMAP_DSS_OVL_CAP_DISPC; ++ break; ++ case 1: ++ ovl->name = "vid1"; ++ ovl->id = OMAP_DSS_VIDEO1; ++ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3; ++ ovl->caps = OMAP_DSS_OVL_CAP_SCALE | ++ OMAP_DSS_OVL_CAP_DISPC; ++ break; ++ case 2: ++ ovl->name = "vid2"; ++ ovl->id = OMAP_DSS_VIDEO2; ++ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3; ++ ovl->caps = OMAP_DSS_OVL_CAP_SCALE | ++ OMAP_DSS_OVL_CAP_DISPC; ++ break; ++ } ++ ++ ovl->set_manager = &omap_dss_set_manager; ++ ovl->unset_manager = &omap_dss_unset_manager; ++ ovl->set_overlay_info = &dss_ovl_set_overlay_info; ++ ovl->get_overlay_info = &dss_ovl_get_overlay_info; ++ ++ omap_dss_add_overlay(ovl); ++ ++ r = kobject_init_and_add(&ovl->kobj, &overlay_ktype, ++ &pdev->dev.kobj, "overlay%d", i); ++ ++ if (r) { ++ DSSERR("failed to create sysfs file\n"); ++ continue; ++ } ++ ++ dispc_overlays[i] = ovl; ++ } ++ ++ lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD); ++ tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV); ++ ++ if (def_disp_name) { ++ for (i = 0; i < omap_dss_get_num_displays() ; i++) { ++ struct omap_display *display = dss_get_display(i); ++ ++ if (strcmp(display->name, def_disp_name) == 0) { ++ if (display->type != OMAP_DISPLAY_TYPE_VENC) { ++ lcd_mgr->set_display(lcd_mgr, display); ++ def_mgr = lcd_mgr; ++ } else { ++ lcd_mgr->set_display(tv_mgr, display); ++ def_mgr = tv_mgr; ++ } ++ ++ break; ++ } ++ } ++ ++ if (!def_mgr) ++ DSSWARN("default display %s not found\n", ++ def_disp_name); ++ } ++ ++ if (def_mgr != lcd_mgr) { ++ /* connect lcd manager to first non-VENC display found */ ++ for (i = 0; i < omap_dss_get_num_displays(); i++) { ++ struct omap_display *display = dss_get_display(i); ++ if (display->type != OMAP_DISPLAY_TYPE_VENC) { ++ lcd_mgr->set_display(lcd_mgr, display); ++ ++ if (!def_mgr) ++ def_mgr = lcd_mgr; ++ ++ break; ++ } ++ } ++ } ++ ++ if (def_mgr != tv_mgr) { ++ /* connect tv manager to first VENC display found */ ++ for (i = 0; i < omap_dss_get_num_displays(); i++) { ++ struct omap_display *display = dss_get_display(i); ++ if (display->type == OMAP_DISPLAY_TYPE_VENC) { ++ tv_mgr->set_display(tv_mgr, display); ++ ++ if (!def_mgr) ++ def_mgr = tv_mgr; ++ ++ break; ++ } ++ } ++ } ++ ++ /* connect all dispc overlays to def_mgr */ ++ if (def_mgr) { ++ for (i = 0; i < 3; i++) { ++ struct omap_overlay *ovl; ++ ovl = omap_dss_get_overlay(i); ++ omap_dss_set_manager(ovl, def_mgr); ++ } ++ } ++ ++#ifdef L4_EXAMPLE ++ /* setup L4 overlay as an example */ ++ { ++ static struct omap_overlay ovl = { ++ .name = "l4-ovl", ++ .supported_modes = OMAP_DSS_COLOR_RGB24U, ++ .set_manager = &omap_dss_set_manager, ++ .unset_manager = &omap_dss_unset_manager, ++ .setup_input = &omap_dss_setup_overlay_input, ++ .setup_output = &omap_dss_setup_overlay_output, ++ .enable = &omap_dss_enable_overlay, ++ }; ++ ++ static struct omap_overlay_manager mgr = { ++ .name = "l4", ++ .num_overlays = 1, ++ .overlays = &ovl, ++ .set_display = &omap_dss_set_display, ++ .unset_display = &omap_dss_unset_display, ++ .apply = &ovl_mgr_apply_l4, ++ .supported_displays = ++ OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI, ++ }; ++ ++ omap_dss_add_overlay(&ovl); ++ omap_dss_add_overlay_manager(&mgr); ++ omap_dss_set_manager(&ovl, &mgr); ++ } ++#endif ++} ++ ++void dss_uninit_overlays(struct platform_device *pdev) ++{ ++ struct omap_overlay *ovl; ++ ++ while (!list_empty(&overlay_list)) { ++ ovl = list_first_entry(&overlay_list, ++ struct omap_overlay, list); ++ list_del(&ovl->list); ++ kobject_del(&ovl->kobj); ++ kobject_put(&ovl->kobj); ++ kfree(ovl); ++ } ++ ++ num_overlays = 0; ++} ++ +diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c +new file mode 100644 +index 0000000..3e9ae1e +--- /dev/null ++++ b/drivers/video/omap2/dss/rfbi.c +@@ -0,0 +1,1304 @@ ++/* ++ * linux/drivers/video/omap2/dss/rfbi.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "RFBI" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include "dss.h" ++ ++/*#define MEASURE_PERF*/ ++ ++#define RFBI_BASE 0x48050800 ++ ++struct rfbi_reg { u16 idx; }; ++ ++#define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) ++ ++#define RFBI_REVISION RFBI_REG(0x0000) ++#define RFBI_SYSCONFIG RFBI_REG(0x0010) ++#define RFBI_SYSSTATUS RFBI_REG(0x0014) ++#define RFBI_CONTROL RFBI_REG(0x0040) ++#define RFBI_PIXEL_CNT RFBI_REG(0x0044) ++#define RFBI_LINE_NUMBER RFBI_REG(0x0048) ++#define RFBI_CMD RFBI_REG(0x004c) ++#define RFBI_PARAM RFBI_REG(0x0050) ++#define RFBI_DATA RFBI_REG(0x0054) ++#define RFBI_READ RFBI_REG(0x0058) ++#define RFBI_STATUS RFBI_REG(0x005c) ++ ++#define RFBI_CONFIG(n) RFBI_REG(0x0060 + (n)*0x18) ++#define RFBI_ONOFF_TIME(n) RFBI_REG(0x0064 + (n)*0x18) ++#define RFBI_CYCLE_TIME(n) RFBI_REG(0x0068 + (n)*0x18) ++#define RFBI_DATA_CYCLE1(n) RFBI_REG(0x006c + (n)*0x18) ++#define RFBI_DATA_CYCLE2(n) RFBI_REG(0x0070 + (n)*0x18) ++#define RFBI_DATA_CYCLE3(n) RFBI_REG(0x0074 + (n)*0x18) ++ ++#define RFBI_VSYNC_WIDTH RFBI_REG(0x0090) ++#define RFBI_HSYNC_WIDTH RFBI_REG(0x0094) ++ ++#define RFBI_CMD_FIFO_LEN_BYTES (16 * sizeof(struct update_param)) ++ ++#define REG_FLD_MOD(idx, val, start, end) \ ++ rfbi_write_reg(idx, FLD_MOD(rfbi_read_reg(idx), val, start, end)) ++ ++/* To work around an RFBI transfer rate limitation */ ++#define OMAP_RFBI_RATE_LIMIT 1 ++ ++enum omap_rfbi_cycleformat { ++ OMAP_DSS_RFBI_CYCLEFORMAT_1_1 = 0, ++ OMAP_DSS_RFBI_CYCLEFORMAT_2_1 = 1, ++ OMAP_DSS_RFBI_CYCLEFORMAT_3_1 = 2, ++ OMAP_DSS_RFBI_CYCLEFORMAT_3_2 = 3, ++}; ++ ++enum omap_rfbi_datatype { ++ OMAP_DSS_RFBI_DATATYPE_12 = 0, ++ OMAP_DSS_RFBI_DATATYPE_16 = 1, ++ OMAP_DSS_RFBI_DATATYPE_18 = 2, ++ OMAP_DSS_RFBI_DATATYPE_24 = 3, ++}; ++ ++enum omap_rfbi_parallelmode { ++ OMAP_DSS_RFBI_PARALLELMODE_8 = 0, ++ OMAP_DSS_RFBI_PARALLELMODE_9 = 1, ++ OMAP_DSS_RFBI_PARALLELMODE_12 = 2, ++ OMAP_DSS_RFBI_PARALLELMODE_16 = 3, ++}; ++ ++enum update_cmd { ++ RFBI_CMD_UPDATE = 0, ++ RFBI_CMD_SYNC = 1, ++}; ++ ++static int rfbi_convert_timings(struct rfbi_timings *t); ++static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); ++static void process_cmd_fifo(void); ++ ++static struct { ++ void __iomem *base; ++ ++ unsigned long l4_khz; ++ ++ enum omap_rfbi_datatype datatype; ++ enum omap_rfbi_parallelmode parallelmode; ++ ++ enum omap_rfbi_te_mode te_mode; ++ int te_enabled; ++ ++ void (*framedone_callback)(void *data); ++ void *framedone_callback_data; ++ ++ struct omap_display *display[2]; ++ ++ struct kfifo *cmd_fifo; ++ spinlock_t cmd_lock; ++ struct completion cmd_done; ++ atomic_t cmd_fifo_full; ++ atomic_t cmd_pending; ++#ifdef MEASURE_PERF ++ unsigned perf_bytes; ++ ktime_t perf_setup_time; ++ ktime_t perf_start_time; ++#endif ++} rfbi; ++ ++struct update_region { ++ u16 x; ++ u16 y; ++ u16 w; ++ u16 h; ++}; ++ ++struct update_param { ++ u8 rfbi_module; ++ u8 cmd; ++ ++ union { ++ struct update_region r; ++ struct completion *sync; ++ } par; ++}; ++ ++static inline void rfbi_write_reg(const struct rfbi_reg idx, u32 val) ++{ ++ __raw_writel(val, rfbi.base + idx.idx); ++} ++ ++static inline u32 rfbi_read_reg(const struct rfbi_reg idx) ++{ ++ return __raw_readl(rfbi.base + idx.idx); ++} ++ ++static void rfbi_enable_clocks(bool enable) ++{ ++ if (enable) ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ else ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++} ++ ++void omap_rfbi_write_command(const void *buf, u32 len) ++{ ++ rfbi_enable_clocks(1); ++ switch (rfbi.parallelmode) { ++ case OMAP_DSS_RFBI_PARALLELMODE_8: ++ { ++ const u8 *b = buf; ++ for (; len; len--) ++ rfbi_write_reg(RFBI_CMD, *b++); ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_16: ++ { ++ const u16 *w = buf; ++ BUG_ON(len & 1); ++ for (; len; len -= 2) ++ rfbi_write_reg(RFBI_CMD, *w++); ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_9: ++ case OMAP_DSS_RFBI_PARALLELMODE_12: ++ default: ++ BUG(); ++ } ++ rfbi_enable_clocks(0); ++} ++EXPORT_SYMBOL(omap_rfbi_write_command); ++ ++void omap_rfbi_read_data(void *buf, u32 len) ++{ ++ rfbi_enable_clocks(1); ++ switch (rfbi.parallelmode) { ++ case OMAP_DSS_RFBI_PARALLELMODE_8: ++ { ++ u8 *b = buf; ++ for (; len; len--) { ++ rfbi_write_reg(RFBI_READ, 0); ++ *b++ = rfbi_read_reg(RFBI_READ); ++ } ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_16: ++ { ++ u16 *w = buf; ++ BUG_ON(len & ~1); ++ for (; len; len -= 2) { ++ rfbi_write_reg(RFBI_READ, 0); ++ *w++ = rfbi_read_reg(RFBI_READ); ++ } ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_9: ++ case OMAP_DSS_RFBI_PARALLELMODE_12: ++ default: ++ BUG(); ++ } ++ rfbi_enable_clocks(0); ++} ++EXPORT_SYMBOL(omap_rfbi_read_data); ++ ++void omap_rfbi_write_data(const void *buf, u32 len) ++{ ++ rfbi_enable_clocks(1); ++ switch (rfbi.parallelmode) { ++ case OMAP_DSS_RFBI_PARALLELMODE_8: ++ { ++ const u8 *b = buf; ++ for (; len; len--) ++ rfbi_write_reg(RFBI_PARAM, *b++); ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_16: ++ { ++ const u16 *w = buf; ++ BUG_ON(len & 1); ++ for (; len; len -= 2) ++ rfbi_write_reg(RFBI_PARAM, *w++); ++ break; ++ } ++ ++ case OMAP_DSS_RFBI_PARALLELMODE_9: ++ case OMAP_DSS_RFBI_PARALLELMODE_12: ++ default: ++ BUG(); ++ ++ } ++ rfbi_enable_clocks(0); ++} ++EXPORT_SYMBOL(omap_rfbi_write_data); ++ ++void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, ++ u16 x, u16 y, ++ u16 w, u16 h) ++{ ++ int start_offset = scr_width * y + x; ++ int horiz_offset = scr_width - w; ++ int i; ++ ++ rfbi_enable_clocks(1); ++ ++ if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && ++ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { ++ const u16 __iomem *pd = buf; ++ pd += start_offset; ++ ++ for (; h; --h) { ++ for (i = 0; i < w; ++i) { ++ const u8 __iomem *b = (const u8 __iomem *)pd; ++ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); ++ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++ ++pd; ++ } ++ pd += horiz_offset; ++ } ++ } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_24 && ++ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { ++ const u32 __iomem *pd = buf; ++ pd += start_offset; ++ ++ for (; h; --h) { ++ for (i = 0; i < w; ++i) { ++ const u8 __iomem *b = (const u8 __iomem *)pd; ++ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+2)); ++ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); ++ rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++ ++pd; ++ } ++ pd += horiz_offset; ++ } ++ } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && ++ rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_16) { ++ const u16 __iomem *pd = buf; ++ pd += start_offset; ++ ++ for (; h; --h) { ++ for (i = 0; i < w; ++i) { ++ rfbi_write_reg(RFBI_PARAM, __raw_readw(pd)); ++ ++pd; ++ } ++ pd += horiz_offset; ++ } ++ } else { ++ BUG(); ++ } ++ ++ rfbi_enable_clocks(0); ++} ++EXPORT_SYMBOL(omap_rfbi_write_pixels); ++ ++#ifdef MEASURE_PERF ++static void perf_mark_setup(void) ++{ ++ rfbi.perf_setup_time = ktime_get(); ++} ++ ++static void perf_mark_start(void) ++{ ++ rfbi.perf_start_time = ktime_get(); ++} ++ ++static void perf_show(const char *name) ++{ ++ ktime_t t, setup_time, trans_time; ++ u32 total_bytes; ++ u32 setup_us, trans_us, total_us; ++ ++ t = ktime_get(); ++ ++ setup_time = ktime_sub(rfbi.perf_start_time, rfbi.perf_setup_time); ++ setup_us = (u32)ktime_to_us(setup_time); ++ if (setup_us == 0) ++ setup_us = 1; ++ ++ trans_time = ktime_sub(t, rfbi.perf_start_time); ++ trans_us = (u32)ktime_to_us(trans_time); ++ if (trans_us == 0) ++ trans_us = 1; ++ ++ total_us = setup_us + trans_us; ++ ++ total_bytes = rfbi.perf_bytes; ++ ++ DSSINFO("%s update %u us + %u us = %u us (%uHz), %u bytes, " ++ "%u kbytes/sec\n", ++ name, ++ setup_us, ++ trans_us, ++ total_us, ++ 1000*1000 / total_us, ++ total_bytes, ++ total_bytes * 1000 / total_us); ++} ++#else ++#define perf_mark_setup() ++#define perf_mark_start() ++#define perf_show(x) ++#endif ++ ++void rfbi_transfer_area(u16 width, u16 height, ++ void (callback)(void *data), void *data) ++{ ++ u32 l; ++ ++ /*BUG_ON(callback == 0);*/ ++ BUG_ON(rfbi.framedone_callback != NULL); ++ ++ DSSDBG("rfbi_transfer_area %dx%d\n", width, height); ++ ++ dispc_set_lcd_size(width, height); ++ ++ dispc_enable_lcd_out(1); ++ ++ rfbi.framedone_callback = callback; ++ rfbi.framedone_callback_data = data; ++ ++ rfbi_enable_clocks(1); ++ ++ rfbi_write_reg(RFBI_PIXEL_CNT, width * height); ++ ++ l = rfbi_read_reg(RFBI_CONTROL); ++ l = FLD_MOD(l, 1, 0, 0); /* enable */ ++ if (!rfbi.te_enabled) ++ l = FLD_MOD(l, 1, 4, 4); /* ITE */ ++ ++ perf_mark_start(); ++ ++ rfbi_write_reg(RFBI_CONTROL, l); ++} ++ ++static void framedone_callback(void *data, u32 mask) ++{ ++ void (*callback)(void *data); ++ ++ DSSDBG("FRAMEDONE\n"); ++ ++ perf_show("DISPC"); ++ ++ REG_FLD_MOD(RFBI_CONTROL, 0, 0, 0); ++ ++ rfbi_enable_clocks(0); ++ ++ callback = rfbi.framedone_callback; ++ rfbi.framedone_callback = NULL; ++ ++ /*callback(rfbi.framedone_callback_data);*/ ++ ++ atomic_set(&rfbi.cmd_pending, 0); ++ ++ process_cmd_fifo(); ++} ++ ++#if 1 /* VERBOSE */ ++static void rfbi_print_timings(void) ++{ ++ u32 l; ++ u32 time; ++ ++ l = rfbi_read_reg(RFBI_CONFIG(0)); ++ time = 1000000000 / rfbi.l4_khz; ++ if (l & (1 << 4)) ++ time *= 2; ++ ++ DSSDBG("Tick time %u ps\n", time); ++ l = rfbi_read_reg(RFBI_ONOFF_TIME(0)); ++ DSSDBG("CSONTIME %d, CSOFFTIME %d, WEONTIME %d, WEOFFTIME %d, " ++ "REONTIME %d, REOFFTIME %d\n", ++ l & 0x0f, (l >> 4) & 0x3f, (l >> 10) & 0x0f, (l >> 14) & 0x3f, ++ (l >> 20) & 0x0f, (l >> 24) & 0x3f); ++ ++ l = rfbi_read_reg(RFBI_CYCLE_TIME(0)); ++ DSSDBG("WECYCLETIME %d, RECYCLETIME %d, CSPULSEWIDTH %d, " ++ "ACCESSTIME %d\n", ++ (l & 0x3f), (l >> 6) & 0x3f, (l >> 12) & 0x3f, ++ (l >> 22) & 0x3f); ++} ++#else ++static void rfbi_print_timings(void) {} ++#endif ++ ++ ++ ++ ++static u32 extif_clk_period; ++ ++static inline unsigned long round_to_extif_ticks(unsigned long ps, int div) ++{ ++ int bus_tick = extif_clk_period * div; ++ return (ps + bus_tick - 1) / bus_tick * bus_tick; ++} ++ ++static int calc_reg_timing(struct rfbi_timings *t, int div) ++{ ++ t->clk_div = div; ++ ++ t->cs_on_time = round_to_extif_ticks(t->cs_on_time, div); ++ ++ t->we_on_time = round_to_extif_ticks(t->we_on_time, div); ++ t->we_off_time = round_to_extif_ticks(t->we_off_time, div); ++ t->we_cycle_time = round_to_extif_ticks(t->we_cycle_time, div); ++ ++ t->re_on_time = round_to_extif_ticks(t->re_on_time, div); ++ t->re_off_time = round_to_extif_ticks(t->re_off_time, div); ++ t->re_cycle_time = round_to_extif_ticks(t->re_cycle_time, div); ++ ++ t->access_time = round_to_extif_ticks(t->access_time, div); ++ t->cs_off_time = round_to_extif_ticks(t->cs_off_time, div); ++ t->cs_pulse_width = round_to_extif_ticks(t->cs_pulse_width, div); ++ ++ DSSDBG("[reg]cson %d csoff %d reon %d reoff %d\n", ++ t->cs_on_time, t->cs_off_time, t->re_on_time, t->re_off_time); ++ DSSDBG("[reg]weon %d weoff %d recyc %d wecyc %d\n", ++ t->we_on_time, t->we_off_time, t->re_cycle_time, ++ t->we_cycle_time); ++ DSSDBG("[reg]rdaccess %d cspulse %d\n", ++ t->access_time, t->cs_pulse_width); ++ ++ return rfbi_convert_timings(t); ++} ++ ++static int calc_extif_timings(struct rfbi_timings *t) ++{ ++ u32 max_clk_div; ++ int div; ++ ++ rfbi_get_clk_info(&extif_clk_period, &max_clk_div); ++ for (div = 1; div <= max_clk_div; div++) { ++ if (calc_reg_timing(t, div) == 0) ++ break; ++ } ++ ++ if (div <= max_clk_div) ++ return 0; ++ ++ DSSERR("can't setup timings\n"); ++ return -1; ++} ++ ++ ++void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t) ++{ ++ int r; ++ ++ if (!t->converted) { ++ r = calc_extif_timings(t); ++ if (r < 0) ++ DSSERR("Failed to calc timings\n"); ++ } ++ ++ BUG_ON(!t->converted); ++ ++ rfbi_enable_clocks(1); ++ rfbi_write_reg(RFBI_ONOFF_TIME(rfbi_module), t->tim[0]); ++ rfbi_write_reg(RFBI_CYCLE_TIME(rfbi_module), t->tim[1]); ++ ++ /* TIMEGRANULARITY */ ++ REG_FLD_MOD(RFBI_CONFIG(rfbi_module), ++ (t->tim[2] ? 1 : 0), 4, 4); ++ ++ rfbi_print_timings(); ++ rfbi_enable_clocks(0); ++} ++ ++static int ps_to_rfbi_ticks(int time, int div) ++{ ++ unsigned long tick_ps; ++ int ret; ++ ++ /* Calculate in picosecs to yield more exact results */ ++ tick_ps = 1000000000 / (rfbi.l4_khz) * div; ++ ++ ret = (time + tick_ps - 1) / tick_ps; ++ ++ return ret; ++} ++ ++#ifdef OMAP_RFBI_RATE_LIMIT ++unsigned long rfbi_get_max_tx_rate(void) ++{ ++ unsigned long l4_rate, dss1_rate; ++ int min_l4_ticks = 0; ++ int i; ++ ++ /* According to TI this can't be calculated so make the ++ * adjustments for a couple of known frequencies and warn for ++ * others. ++ */ ++ static const struct { ++ unsigned long l4_clk; /* HZ */ ++ unsigned long dss1_clk; /* HZ */ ++ unsigned long min_l4_ticks; ++ } ftab[] = { ++ { 55, 132, 7, }, /* 7.86 MPix/s */ ++ { 110, 110, 12, }, /* 9.16 MPix/s */ ++ { 110, 132, 10, }, /* 11 Mpix/s */ ++ { 120, 120, 10, }, /* 12 Mpix/s */ ++ { 133, 133, 10, }, /* 13.3 Mpix/s */ ++ }; ++ ++ l4_rate = rfbi.l4_khz / 1000; ++ dss1_rate = dss_clk_get_rate(DSS_CLK_FCK1) / 1000000; ++ ++ for (i = 0; i < ARRAY_SIZE(ftab); i++) { ++ /* Use a window instead of an exact match, to account ++ * for different DPLL multiplier / divider pairs. ++ */ ++ if (abs(ftab[i].l4_clk - l4_rate) < 3 && ++ abs(ftab[i].dss1_clk - dss1_rate) < 3) { ++ min_l4_ticks = ftab[i].min_l4_ticks; ++ break; ++ } ++ } ++ if (i == ARRAY_SIZE(ftab)) { ++ /* Can't be sure, return anyway the maximum not ++ * rate-limited. This might cause a problem only for the ++ * tearing synchronisation. ++ */ ++ DSSERR("can't determine maximum RFBI transfer rate\n"); ++ return rfbi.l4_khz * 1000; ++ } ++ return rfbi.l4_khz * 1000 / min_l4_ticks; ++} ++#else ++int rfbi_get_max_tx_rate(void) ++{ ++ return rfbi.l4_khz * 1000; ++} ++#endif ++ ++static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div) ++{ ++ *clk_period = 1000000000 / rfbi.l4_khz; ++ *max_clk_div = 2; ++} ++ ++static int rfbi_convert_timings(struct rfbi_timings *t) ++{ ++ u32 l; ++ int reon, reoff, weon, weoff, cson, csoff, cs_pulse; ++ int actim, recyc, wecyc; ++ int div = t->clk_div; ++ ++ if (div <= 0 || div > 2) ++ return -1; ++ ++ /* Make sure that after conversion it still holds that: ++ * weoff > weon, reoff > reon, recyc >= reoff, wecyc >= weoff, ++ * csoff > cson, csoff >= max(weoff, reoff), actim > reon ++ */ ++ weon = ps_to_rfbi_ticks(t->we_on_time, div); ++ weoff = ps_to_rfbi_ticks(t->we_off_time, div); ++ if (weoff <= weon) ++ weoff = weon + 1; ++ if (weon > 0x0f) ++ return -1; ++ if (weoff > 0x3f) ++ return -1; ++ ++ reon = ps_to_rfbi_ticks(t->re_on_time, div); ++ reoff = ps_to_rfbi_ticks(t->re_off_time, div); ++ if (reoff <= reon) ++ reoff = reon + 1; ++ if (reon > 0x0f) ++ return -1; ++ if (reoff > 0x3f) ++ return -1; ++ ++ cson = ps_to_rfbi_ticks(t->cs_on_time, div); ++ csoff = ps_to_rfbi_ticks(t->cs_off_time, div); ++ if (csoff <= cson) ++ csoff = cson + 1; ++ if (csoff < max(weoff, reoff)) ++ csoff = max(weoff, reoff); ++ if (cson > 0x0f) ++ return -1; ++ if (csoff > 0x3f) ++ return -1; ++ ++ l = cson; ++ l |= csoff << 4; ++ l |= weon << 10; ++ l |= weoff << 14; ++ l |= reon << 20; ++ l |= reoff << 24; ++ ++ t->tim[0] = l; ++ ++ actim = ps_to_rfbi_ticks(t->access_time, div); ++ if (actim <= reon) ++ actim = reon + 1; ++ if (actim > 0x3f) ++ return -1; ++ ++ wecyc = ps_to_rfbi_ticks(t->we_cycle_time, div); ++ if (wecyc < weoff) ++ wecyc = weoff; ++ if (wecyc > 0x3f) ++ return -1; ++ ++ recyc = ps_to_rfbi_ticks(t->re_cycle_time, div); ++ if (recyc < reoff) ++ recyc = reoff; ++ if (recyc > 0x3f) ++ return -1; ++ ++ cs_pulse = ps_to_rfbi_ticks(t->cs_pulse_width, div); ++ if (cs_pulse > 0x3f) ++ return -1; ++ ++ l = wecyc; ++ l |= recyc << 6; ++ l |= cs_pulse << 12; ++ l |= actim << 22; ++ ++ t->tim[1] = l; ++ ++ t->tim[2] = div - 1; ++ ++ t->converted = 1; ++ ++ return 0; ++} ++ ++/* xxx FIX module selection missing */ ++int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, ++ unsigned hs_pulse_time, unsigned vs_pulse_time, ++ int hs_pol_inv, int vs_pol_inv, int extif_div) ++{ ++ int hs, vs; ++ int min; ++ u32 l; ++ ++ hs = ps_to_rfbi_ticks(hs_pulse_time, 1); ++ vs = ps_to_rfbi_ticks(vs_pulse_time, 1); ++ if (hs < 2) ++ return -EDOM; ++ if (mode == OMAP_DSS_RFBI_TE_MODE_2) ++ min = 2; ++ else /* OMAP_DSS_RFBI_TE_MODE_1 */ ++ min = 4; ++ if (vs < min) ++ return -EDOM; ++ if (vs == hs) ++ return -EINVAL; ++ rfbi.te_mode = mode; ++ DSSDBG("setup_te: mode %d hs %d vs %d hs_inv %d vs_inv %d\n", ++ mode, hs, vs, hs_pol_inv, vs_pol_inv); ++ ++ rfbi_enable_clocks(1); ++ rfbi_write_reg(RFBI_HSYNC_WIDTH, hs); ++ rfbi_write_reg(RFBI_VSYNC_WIDTH, vs); ++ ++ l = rfbi_read_reg(RFBI_CONFIG(0)); ++ if (hs_pol_inv) ++ l &= ~(1 << 21); ++ else ++ l |= 1 << 21; ++ if (vs_pol_inv) ++ l &= ~(1 << 20); ++ else ++ l |= 1 << 20; ++ rfbi_enable_clocks(0); ++ ++ return 0; ++} ++EXPORT_SYMBOL(omap_rfbi_setup_te); ++ ++/* xxx FIX module selection missing */ ++int omap_rfbi_enable_te(bool enable, unsigned line) ++{ ++ u32 l; ++ ++ DSSDBG("te %d line %d mode %d\n", enable, line, rfbi.te_mode); ++ if (line > (1 << 11) - 1) ++ return -EINVAL; ++ ++ rfbi_enable_clocks(1); ++ l = rfbi_read_reg(RFBI_CONFIG(0)); ++ l &= ~(0x3 << 2); ++ if (enable) { ++ rfbi.te_enabled = 1; ++ l |= rfbi.te_mode << 2; ++ } else ++ rfbi.te_enabled = 0; ++ rfbi_write_reg(RFBI_CONFIG(0), l); ++ rfbi_write_reg(RFBI_LINE_NUMBER, line); ++ rfbi_enable_clocks(0); ++ ++ return 0; ++} ++EXPORT_SYMBOL(omap_rfbi_enable_te); ++ ++#if 0 ++static void rfbi_enable_config(int enable1, int enable2) ++{ ++ u32 l; ++ int cs = 0; ++ ++ if (enable1) ++ cs |= 1<<0; ++ if (enable2) ++ cs |= 1<<1; ++ ++ rfbi_enable_clocks(1); ++ ++ l = rfbi_read_reg(RFBI_CONTROL); ++ ++ l = FLD_MOD(l, cs, 3, 2); ++ l = FLD_MOD(l, 0, 1, 1); ++ ++ rfbi_write_reg(RFBI_CONTROL, l); ++ ++ ++ l = rfbi_read_reg(RFBI_CONFIG(0)); ++ l = FLD_MOD(l, 0, 3, 2); /* TRIGGERMODE: ITE */ ++ /*l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ ++ /*l |= FLD_VAL(0, 8, 7); */ /* L4FORMAT, 1pix/L4 */ ++ ++ l = FLD_MOD(l, 0, 16, 16); /* A0POLARITY */ ++ l = FLD_MOD(l, 1, 20, 20); /* TE_VSYNC_POLARITY */ ++ l = FLD_MOD(l, 1, 21, 21); /* HSYNCPOLARITY */ ++ ++ l = FLD_MOD(l, OMAP_DSS_RFBI_PARALLELMODE_8, 1, 0); ++ rfbi_write_reg(RFBI_CONFIG(0), l); ++ ++ rfbi_enable_clocks(0); ++} ++#endif ++ ++int rfbi_configure(int rfbi_module, int bpp, int lines) ++{ ++ u32 l; ++ int cycle1 = 0, cycle2 = 0, cycle3 = 0; ++ enum omap_rfbi_cycleformat cycleformat; ++ enum omap_rfbi_datatype datatype; ++ enum omap_rfbi_parallelmode parallelmode; ++ ++ switch (bpp) { ++ case 12: ++ datatype = OMAP_DSS_RFBI_DATATYPE_12; ++ break; ++ case 16: ++ datatype = OMAP_DSS_RFBI_DATATYPE_16; ++ break; ++ case 18: ++ datatype = OMAP_DSS_RFBI_DATATYPE_18; ++ break; ++ case 24: ++ datatype = OMAP_DSS_RFBI_DATATYPE_24; ++ break; ++ default: ++ BUG(); ++ return 1; ++ } ++ rfbi.datatype = datatype; ++ ++ switch (lines) { ++ case 8: ++ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_8; ++ break; ++ case 9: ++ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_9; ++ break; ++ case 12: ++ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_12; ++ break; ++ case 16: ++ parallelmode = OMAP_DSS_RFBI_PARALLELMODE_16; ++ break; ++ default: ++ BUG(); ++ return 1; ++ } ++ rfbi.parallelmode = parallelmode; ++ ++ if ((bpp % lines) == 0) { ++ switch (bpp / lines) { ++ case 1: ++ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_1_1; ++ break; ++ case 2: ++ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_2_1; ++ break; ++ case 3: ++ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_1; ++ break; ++ default: ++ BUG(); ++ return 1; ++ } ++ } else if ((2 * bpp % lines) == 0) { ++ if ((2 * bpp / lines) == 3) ++ cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_2; ++ else { ++ BUG(); ++ return 1; ++ } ++ } else { ++ BUG(); ++ return 1; ++ } ++ ++ switch (cycleformat) { ++ case OMAP_DSS_RFBI_CYCLEFORMAT_1_1: ++ cycle1 = lines; ++ break; ++ ++ case OMAP_DSS_RFBI_CYCLEFORMAT_2_1: ++ cycle1 = lines; ++ cycle2 = lines; ++ break; ++ ++ case OMAP_DSS_RFBI_CYCLEFORMAT_3_1: ++ cycle1 = lines; ++ cycle2 = lines; ++ cycle3 = lines; ++ break; ++ ++ case OMAP_DSS_RFBI_CYCLEFORMAT_3_2: ++ cycle1 = lines; ++ cycle2 = (lines / 2) | ((lines / 2) << 16); ++ cycle3 = (lines << 16); ++ break; ++ } ++ ++ rfbi_enable_clocks(1); ++ ++ REG_FLD_MOD(RFBI_CONTROL, 0, 3, 2); /* clear CS */ ++ ++ l = 0; ++ l |= FLD_VAL(parallelmode, 1, 0); ++ l |= FLD_VAL(0, 3, 2); /* TRIGGERMODE: ITE */ ++ l |= FLD_VAL(0, 4, 4); /* TIMEGRANULARITY */ ++ l |= FLD_VAL(datatype, 6, 5); ++ /* l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ ++ l |= FLD_VAL(0, 8, 7); /* L4FORMAT, 1pix/L4 */ ++ l |= FLD_VAL(cycleformat, 10, 9); ++ l |= FLD_VAL(0, 12, 11); /* UNUSEDBITS */ ++ l |= FLD_VAL(0, 16, 16); /* A0POLARITY */ ++ l |= FLD_VAL(0, 17, 17); /* REPOLARITY */ ++ l |= FLD_VAL(0, 18, 18); /* WEPOLARITY */ ++ l |= FLD_VAL(0, 19, 19); /* CSPOLARITY */ ++ l |= FLD_VAL(1, 20, 20); /* TE_VSYNC_POLARITY */ ++ l |= FLD_VAL(1, 21, 21); /* HSYNCPOLARITY */ ++ rfbi_write_reg(RFBI_CONFIG(rfbi_module), l); ++ ++ rfbi_write_reg(RFBI_DATA_CYCLE1(rfbi_module), cycle1); ++ rfbi_write_reg(RFBI_DATA_CYCLE2(rfbi_module), cycle2); ++ rfbi_write_reg(RFBI_DATA_CYCLE3(rfbi_module), cycle3); ++ ++ ++ l = rfbi_read_reg(RFBI_CONTROL); ++ l = FLD_MOD(l, rfbi_module+1, 3, 2); /* Select CSx */ ++ l = FLD_MOD(l, 0, 1, 1); /* clear bypass */ ++ rfbi_write_reg(RFBI_CONTROL, l); ++ ++ ++ DSSDBG("RFBI config: bpp %d, lines %d, cycles: 0x%x 0x%x 0x%x\n", ++ bpp, lines, cycle1, cycle2, cycle3); ++ ++ rfbi_enable_clocks(0); ++ ++ return 0; ++} ++EXPORT_SYMBOL(rfbi_configure); ++ ++static int rfbi_find_display(struct omap_display *disp) ++{ ++ if (disp == rfbi.display[0]) ++ return 0; ++ ++ if (disp == rfbi.display[1]) ++ return 1; ++ ++ BUG(); ++ return -1; ++} ++ ++ ++static void signal_fifo_waiters(void) ++{ ++ if (atomic_read(&rfbi.cmd_fifo_full) > 0) { ++ /* DSSDBG("SIGNALING: Fifo not full for waiter!\n"); */ ++ complete(&rfbi.cmd_done); ++ atomic_dec(&rfbi.cmd_fifo_full); ++ } ++} ++ ++/* returns 1 for async op, and 0 for sync op */ ++static int do_update(struct omap_display *display, struct update_region *upd) ++{ ++ u16 x = upd->x; ++ u16 y = upd->y; ++ u16 w = upd->w; ++ u16 h = upd->h; ++ ++ perf_mark_setup(); ++ ++ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { ++ /*display->ctrl->enable_te(display, 1); */ ++ dispc_setup_partial_planes(display, &x, &y, &w, &h); ++ } ++ ++#ifdef MEASURE_PERF ++ rfbi.perf_bytes = w * h * 2; /* XXX always 16bit */ ++#endif ++ ++ display->ctrl->setup_update(display, x, y, w, h); ++ ++ if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { ++ rfbi_transfer_area(w, h, NULL, NULL); ++ return 1; ++ } else { ++ struct omap_overlay *ovl; ++ void __iomem *addr; ++ int scr_width; ++ ++ ovl = display->manager->overlays[0]; ++ scr_width = ovl->info.screen_width; ++ addr = ovl->info.vaddr; ++ ++ omap_rfbi_write_pixels(addr, scr_width, x, y, w, h); ++ ++ perf_show("L4"); ++ ++ return 0; ++ } ++} ++ ++static void process_cmd_fifo(void) ++{ ++ int len; ++ struct update_param p; ++ struct omap_display *display; ++ unsigned long flags; ++ ++ if (atomic_inc_return(&rfbi.cmd_pending) != 1) ++ return; ++ ++ while (true) { ++ spin_lock_irqsave(rfbi.cmd_fifo->lock, flags); ++ ++ len = __kfifo_get(rfbi.cmd_fifo, (unsigned char *)&p, ++ sizeof(struct update_param)); ++ if (len == 0) { ++ DSSDBG("nothing more in fifo\n"); ++ atomic_set(&rfbi.cmd_pending, 0); ++ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); ++ break; ++ } ++ ++ /* DSSDBG("fifo full %d\n", rfbi.cmd_fifo_full.counter);*/ ++ ++ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); ++ ++ BUG_ON(len != sizeof(struct update_param)); ++ BUG_ON(p.rfbi_module > 1); ++ ++ display = rfbi.display[p.rfbi_module]; ++ ++ if (p.cmd == RFBI_CMD_UPDATE) { ++ if (do_update(display, &p.par.r)) ++ break; /* async op */ ++ } else if (p.cmd == RFBI_CMD_SYNC) { ++ DSSDBG("Signaling SYNC done!\n"); ++ complete(p.par.sync); ++ } else ++ BUG(); ++ } ++ ++ signal_fifo_waiters(); ++} ++ ++static void rfbi_push_cmd(struct update_param *p) ++{ ++ int ret; ++ ++ while (1) { ++ unsigned long flags; ++ int available; ++ ++ spin_lock_irqsave(rfbi.cmd_fifo->lock, flags); ++ available = RFBI_CMD_FIFO_LEN_BYTES - ++ __kfifo_len(rfbi.cmd_fifo); ++ ++/* DSSDBG("%d bytes left in fifo\n", available); */ ++ if (available < sizeof(struct update_param)) { ++ DSSDBG("Going to wait because FIFO FULL..\n"); ++ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); ++ atomic_inc(&rfbi.cmd_fifo_full); ++ wait_for_completion(&rfbi.cmd_done); ++ /*DSSDBG("Woke up because fifo not full anymore\n");*/ ++ continue; ++ } ++ ++ ret = __kfifo_put(rfbi.cmd_fifo, (unsigned char *)p, ++ sizeof(struct update_param)); ++/* DSSDBG("pushed %d bytes\n", ret);*/ ++ ++ spin_unlock_irqrestore(rfbi.cmd_fifo->lock, flags); ++ ++ BUG_ON(ret != sizeof(struct update_param)); ++ ++ break; ++ } ++} ++ ++static void rfbi_push_update(int rfbi_module, int x, int y, int w, int h) ++{ ++ struct update_param p; ++ ++ p.rfbi_module = rfbi_module; ++ p.cmd = RFBI_CMD_UPDATE; ++ ++ p.par.r.x = x; ++ p.par.r.y = y; ++ p.par.r.w = w; ++ p.par.r.h = h; ++ ++ DSSDBG("RFBI pushed %d,%d %dx%d\n", x, y, w, h); ++ ++ rfbi_push_cmd(&p); ++ ++ process_cmd_fifo(); ++} ++ ++static void rfbi_push_sync(int rfbi_module, struct completion *sync_comp) ++{ ++ struct update_param p; ++ ++ p.rfbi_module = rfbi_module; ++ p.cmd = RFBI_CMD_SYNC; ++ p.par.sync = sync_comp; ++ ++ rfbi_push_cmd(&p); ++ ++ DSSDBG("RFBI sync pushed to cmd fifo\n"); ++ ++ process_cmd_fifo(); ++} ++ ++void rfbi_dump_regs(struct seq_file *s) ++{ ++#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ DUMPREG(RFBI_REVISION); ++ DUMPREG(RFBI_SYSCONFIG); ++ DUMPREG(RFBI_SYSSTATUS); ++ DUMPREG(RFBI_CONTROL); ++ DUMPREG(RFBI_PIXEL_CNT); ++ DUMPREG(RFBI_LINE_NUMBER); ++ DUMPREG(RFBI_CMD); ++ DUMPREG(RFBI_PARAM); ++ DUMPREG(RFBI_DATA); ++ DUMPREG(RFBI_READ); ++ DUMPREG(RFBI_STATUS); ++ ++ DUMPREG(RFBI_CONFIG(0)); ++ DUMPREG(RFBI_ONOFF_TIME(0)); ++ DUMPREG(RFBI_CYCLE_TIME(0)); ++ DUMPREG(RFBI_DATA_CYCLE1(0)); ++ DUMPREG(RFBI_DATA_CYCLE2(0)); ++ DUMPREG(RFBI_DATA_CYCLE3(0)); ++ ++ DUMPREG(RFBI_CONFIG(1)); ++ DUMPREG(RFBI_ONOFF_TIME(1)); ++ DUMPREG(RFBI_CYCLE_TIME(1)); ++ DUMPREG(RFBI_DATA_CYCLE1(1)); ++ DUMPREG(RFBI_DATA_CYCLE2(1)); ++ DUMPREG(RFBI_DATA_CYCLE3(1)); ++ ++ DUMPREG(RFBI_VSYNC_WIDTH); ++ DUMPREG(RFBI_HSYNC_WIDTH); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++#undef DUMPREG ++} ++ ++int rfbi_init(void) ++{ ++ u32 rev; ++ u32 l; ++ ++ spin_lock_init(&rfbi.cmd_lock); ++ rfbi.cmd_fifo = kfifo_alloc(RFBI_CMD_FIFO_LEN_BYTES, GFP_KERNEL, ++ &rfbi.cmd_lock); ++ if (IS_ERR(rfbi.cmd_fifo)) ++ return -ENOMEM; ++ ++ init_completion(&rfbi.cmd_done); ++ atomic_set(&rfbi.cmd_fifo_full, 0); ++ atomic_set(&rfbi.cmd_pending, 0); ++ ++ rfbi.base = ioremap(RFBI_BASE, SZ_256); ++ if (!rfbi.base) { ++ DSSERR("can't ioremap RFBI\n"); ++ return -ENOMEM; ++ } ++ ++ rfbi_enable_clocks(1); ++ ++ msleep(10); ++ ++ rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; ++ ++ /* Enable autoidle and smart-idle */ ++ l = rfbi_read_reg(RFBI_SYSCONFIG); ++ l |= (1 << 0) | (2 << 3); ++ rfbi_write_reg(RFBI_SYSCONFIG, l); ++ ++ rev = rfbi_read_reg(RFBI_REVISION); ++ printk(KERN_INFO "OMAP RFBI rev %d.%d\n", ++ FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); ++ ++ rfbi_enable_clocks(0); ++ ++ return 0; ++} ++ ++void rfbi_exit(void) ++{ ++ DSSDBG("rfbi_exit\n"); ++ ++ kfifo_free(rfbi.cmd_fifo); ++ ++ iounmap(rfbi.base); ++} ++ ++/* struct omap_display support */ ++static int rfbi_display_update(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ int rfbi_module; ++ ++ if (w == 0 || h == 0) ++ return 0; ++ ++ rfbi_module = rfbi_find_display(display); ++ ++ rfbi_push_update(rfbi_module, x, y, w, h); ++ ++ return 0; ++} ++ ++static int rfbi_display_sync(struct omap_display *display) ++{ ++ struct completion sync_comp; ++ int rfbi_module; ++ ++ rfbi_module = rfbi_find_display(display); ++ ++ init_completion(&sync_comp); ++ rfbi_push_sync(rfbi_module, &sync_comp); ++ DSSDBG("Waiting for SYNC to happen...\n"); ++ wait_for_completion(&sync_comp); ++ DSSDBG("Released from SYNC\n"); ++ return 0; ++} ++ ++static int rfbi_display_enable_te(struct omap_display *display, bool enable) ++{ ++ display->ctrl->enable_te(display, enable); ++ return 0; ++} ++ ++static int rfbi_display_enable(struct omap_display *display) ++{ ++ int r; ++ ++ BUG_ON(display->panel == NULL || display->ctrl == NULL); ++ ++ r = omap_dispc_register_isr(framedone_callback, NULL, ++ DISPC_IRQ_FRAMEDONE); ++ if (r) { ++ DSSERR("can't get FRAMEDONE irq\n"); ++ return r; ++ } ++ ++ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); ++ ++ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_RFBI); ++ ++ dispc_set_tft_data_lines(display->ctrl->pixel_size); ++ ++ rfbi_configure(display->hw_config.u.rfbi.channel, ++ display->ctrl->pixel_size, ++ display->hw_config.u.rfbi.data_lines); ++ ++ rfbi_set_timings(display->hw_config.u.rfbi.channel, ++ &display->ctrl->timings); ++ ++ ++ if (display->ctrl && display->ctrl->enable) { ++ r = display->ctrl->enable(display); ++ if (r) ++ goto err; ++ } ++ ++ if (display->panel && display->panel->enable) { ++ r = display->panel->enable(display); ++ if (r) ++ goto err; ++ } ++ ++ return 0; ++err: ++ return -ENODEV; ++} ++ ++static void rfbi_display_disable(struct omap_display *display) ++{ ++ display->ctrl->disable(display); ++ omap_dispc_unregister_isr(framedone_callback, NULL, ++ DISPC_IRQ_FRAMEDONE); ++} ++ ++void rfbi_init_display(struct omap_display *display) ++{ ++ display->enable = rfbi_display_enable; ++ display->disable = rfbi_display_disable; ++ display->update = rfbi_display_update; ++ display->sync = rfbi_display_sync; ++ display->enable_te = rfbi_display_enable_te; ++ ++ rfbi.display[display->hw_config.u.rfbi.channel] = display; ++ ++ display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; ++} +diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c +new file mode 100644 +index 0000000..fbff2b2 +--- /dev/null ++++ b/drivers/video/omap2/dss/sdi.c +@@ -0,0 +1,245 @@ ++/* ++ * linux/drivers/video/omap2/dss/sdi.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "SDI" ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include "dss.h" ++ ++ ++static struct { ++ bool skip_init; ++ bool update_enabled; ++} sdi; ++ ++static void sdi_basic_init(void) ++{ ++ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS); ++ ++ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT); ++ dispc_set_tft_data_lines(24); ++ dispc_lcd_enable_signal_polarity(1); ++} ++ ++static int sdi_display_enable(struct omap_display *display) ++{ ++ struct dispc_clock_info cinfo; ++ u16 lck_div, pck_div; ++ unsigned long fck; ++ struct omap_panel *panel = display->panel; ++ unsigned long pck; ++ int r; ++ ++ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { ++ DSSERR("display already enabled\n"); ++ return -EINVAL; ++ } ++ ++ /* In case of skip_init sdi_init has already enabled the clocks */ ++ if (!sdi.skip_init) ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ sdi_basic_init(); ++ ++ /* 15.5.9.1.2 */ ++ panel->config |= OMAP_DSS_LCD_RF | OMAP_DSS_LCD_ONOFF; ++ ++ dispc_set_pol_freq(panel); ++ ++ if (!sdi.skip_init) ++ r = dispc_calc_clock_div(1, panel->timings.pixel_clock * 1000, ++ &cinfo); ++ else ++ r = dispc_get_clock_div(&cinfo); ++ ++ if (r) ++ goto err0; ++ ++ fck = cinfo.fck; ++ lck_div = cinfo.lck_div; ++ pck_div = cinfo.pck_div; ++ ++ pck = fck / lck_div / pck_div / 1000; ++ ++ if (pck != panel->timings.pixel_clock) { ++ DSSWARN("Could not find exact pixel clock. Requested %d kHz, " ++ "got %lu kHz\n", ++ panel->timings.pixel_clock, pck); ++ ++ panel->timings.pixel_clock = pck; ++ } ++ ++ ++ dispc_set_lcd_timings(&panel->timings); ++ ++ r = dispc_set_clock_div(&cinfo); ++ if (r) ++ goto err1; ++ ++ if (!sdi.skip_init) { ++ dss_sdi_init(display->hw_config.u.sdi.datapairs); ++ dss_sdi_enable(); ++ mdelay(2); ++ } ++ ++ dispc_enable_lcd_out(1); ++ ++ r = panel->enable(display); ++ if (r) ++ goto err2; ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++ ++ sdi.skip_init = 0; ++ ++ return 0; ++err2: ++ dispc_enable_lcd_out(0); ++err1: ++err0: ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ return r; ++} ++ ++static int sdi_display_resume(struct omap_display *display); ++ ++static void sdi_display_disable(struct omap_display *display) ++{ ++ if (display->state == OMAP_DSS_DISPLAY_DISABLED) ++ return; ++ ++ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) ++ sdi_display_resume(display); ++ ++ display->panel->disable(display); ++ ++ dispc_enable_lcd_out(0); ++ ++ dss_sdi_disable(); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++} ++ ++static int sdi_display_suspend(struct omap_display *display) ++{ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ return -EINVAL; ++ ++ if (display->panel->suspend) ++ display->panel->suspend(display); ++ ++ dispc_enable_lcd_out(0); ++ ++ dss_sdi_disable(); ++ ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ display->state = OMAP_DSS_DISPLAY_SUSPENDED; ++ ++ return 0; ++} ++ ++static int sdi_display_resume(struct omap_display *display) ++{ ++ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) ++ return -EINVAL; ++ ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ ++ dss_sdi_enable(); ++ mdelay(2); ++ ++ dispc_enable_lcd_out(1); ++ ++ if (display->panel->resume) ++ display->panel->resume(display); ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++ ++ return 0; ++} ++ ++static int sdi_display_set_update_mode(struct omap_display *display, ++ enum omap_dss_update_mode mode) ++{ ++ if (mode == OMAP_DSS_UPDATE_MANUAL) ++ return -EINVAL; ++ ++ if (mode == OMAP_DSS_UPDATE_DISABLED) { ++ dispc_enable_lcd_out(0); ++ sdi.update_enabled = 0; ++ } else { ++ dispc_enable_lcd_out(1); ++ sdi.update_enabled = 1; ++ } ++ ++ return 0; ++} ++ ++static enum omap_dss_update_mode sdi_display_get_update_mode( ++ struct omap_display *display) ++{ ++ return sdi.update_enabled ? OMAP_DSS_UPDATE_AUTO : ++ OMAP_DSS_UPDATE_DISABLED; ++} ++ ++static void sdi_get_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ *timings = display->panel->timings; ++} ++ ++void sdi_init_display(struct omap_display *display) ++{ ++ DSSDBG("SDI init\n"); ++ ++ display->enable = sdi_display_enable; ++ display->disable = sdi_display_disable; ++ display->suspend = sdi_display_suspend; ++ display->resume = sdi_display_resume; ++ display->set_update_mode = sdi_display_set_update_mode; ++ display->get_update_mode = sdi_display_get_update_mode; ++ display->get_timings = sdi_get_timings; ++} ++ ++int sdi_init(bool skip_init) ++{ ++ /* we store this for first display enable, then clear it */ ++ sdi.skip_init = skip_init; ++ ++ /* ++ * Enable clocks already here, otherwise there would be a toggle ++ * of them until sdi_display_enable is called. ++ */ ++ if (skip_init) ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); ++ return 0; ++} ++ ++void sdi_exit(void) ++{ ++} +diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c +new file mode 100644 +index 0000000..aceed9f +--- /dev/null ++++ b/drivers/video/omap2/dss/venc.c +@@ -0,0 +1,600 @@ ++/* ++ * linux/drivers/video/omap2/dss/venc.c ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * VENC settings from TI's DSS driver ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#define DSS_SUBSYS_NAME "VENC" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "dss.h" ++ ++#define VENC_BASE 0x48050C00 ++ ++/* Venc registers */ ++#define VENC_REV_ID 0x00 ++#define VENC_STATUS 0x04 ++#define VENC_F_CONTROL 0x08 ++#define VENC_VIDOUT_CTRL 0x10 ++#define VENC_SYNC_CTRL 0x14 ++#define VENC_LLEN 0x1C ++#define VENC_FLENS 0x20 ++#define VENC_HFLTR_CTRL 0x24 ++#define VENC_CC_CARR_WSS_CARR 0x28 ++#define VENC_C_PHASE 0x2C ++#define VENC_GAIN_U 0x30 ++#define VENC_GAIN_V 0x34 ++#define VENC_GAIN_Y 0x38 ++#define VENC_BLACK_LEVEL 0x3C ++#define VENC_BLANK_LEVEL 0x40 ++#define VENC_X_COLOR 0x44 ++#define VENC_M_CONTROL 0x48 ++#define VENC_BSTAMP_WSS_DATA 0x4C ++#define VENC_S_CARR 0x50 ++#define VENC_LINE21 0x54 ++#define VENC_LN_SEL 0x58 ++#define VENC_L21__WC_CTL 0x5C ++#define VENC_HTRIGGER_VTRIGGER 0x60 ++#define VENC_SAVID__EAVID 0x64 ++#define VENC_FLEN__FAL 0x68 ++#define VENC_LAL__PHASE_RESET 0x6C ++#define VENC_HS_INT_START_STOP_X 0x70 ++#define VENC_HS_EXT_START_STOP_X 0x74 ++#define VENC_VS_INT_START_X 0x78 ++#define VENC_VS_INT_STOP_X__VS_INT_START_Y 0x7C ++#define VENC_VS_INT_STOP_Y__VS_EXT_START_X 0x80 ++#define VENC_VS_EXT_STOP_X__VS_EXT_START_Y 0x84 ++#define VENC_VS_EXT_STOP_Y 0x88 ++#define VENC_AVID_START_STOP_X 0x90 ++#define VENC_AVID_START_STOP_Y 0x94 ++#define VENC_FID_INT_START_X__FID_INT_START_Y 0xA0 ++#define VENC_FID_INT_OFFSET_Y__FID_EXT_START_X 0xA4 ++#define VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y 0xA8 ++#define VENC_TVDETGP_INT_START_STOP_X 0xB0 ++#define VENC_TVDETGP_INT_START_STOP_Y 0xB4 ++#define VENC_GEN_CTRL 0xB8 ++#define VENC_OUTPUT_CONTROL 0xC4 ++#define VENC_DAC_B__DAC_C 0xC8 ++ ++struct venc_config { ++ u32 f_control; ++ u32 vidout_ctrl; ++ u32 sync_ctrl; ++ u32 llen; ++ u32 flens; ++ u32 hfltr_ctrl; ++ u32 cc_carr_wss_carr; ++ u32 c_phase; ++ u32 gain_u; ++ u32 gain_v; ++ u32 gain_y; ++ u32 black_level; ++ u32 blank_level; ++ u32 x_color; ++ u32 m_control; ++ u32 bstamp_wss_data; ++ u32 s_carr; ++ u32 line21; ++ u32 ln_sel; ++ u32 l21__wc_ctl; ++ u32 htrigger_vtrigger; ++ u32 savid__eavid; ++ u32 flen__fal; ++ u32 lal__phase_reset; ++ u32 hs_int_start_stop_x; ++ u32 hs_ext_start_stop_x; ++ u32 vs_int_start_x; ++ u32 vs_int_stop_x__vs_int_start_y; ++ u32 vs_int_stop_y__vs_ext_start_x; ++ u32 vs_ext_stop_x__vs_ext_start_y; ++ u32 vs_ext_stop_y; ++ u32 avid_start_stop_x; ++ u32 avid_start_stop_y; ++ u32 fid_int_start_x__fid_int_start_y; ++ u32 fid_int_offset_y__fid_ext_start_x; ++ u32 fid_ext_start_y__fid_ext_offset_y; ++ u32 tvdetgp_int_start_stop_x; ++ u32 tvdetgp_int_start_stop_y; ++ u32 gen_ctrl; ++}; ++ ++/* from TRM */ ++static const struct venc_config venc_config_pal_trm = { ++ .f_control = 0, ++ .vidout_ctrl = 1, ++ .sync_ctrl = 0x40, ++ .llen = 0x35F, /* 863 */ ++ .flens = 0x270, /* 624 */ ++ .hfltr_ctrl = 0, ++ .cc_carr_wss_carr = 0x2F7225ED, ++ .c_phase = 0, ++ .gain_u = 0x111, ++ .gain_v = 0x181, ++ .gain_y = 0x140, ++ .black_level = 0x3B, ++ .blank_level = 0x3B, ++ .x_color = 0x7, ++ .m_control = 0x2, ++ .bstamp_wss_data = 0x3F, ++ .s_carr = 0x2A098ACB, ++ .line21 = 0, ++ .ln_sel = 0x01290015, ++ .l21__wc_ctl = 0x0000F603, ++ .htrigger_vtrigger = 0, ++ ++ .savid__eavid = 0x06A70108, ++ .flen__fal = 0x00180270, ++ .lal__phase_reset = 0x00040135, ++ .hs_int_start_stop_x = 0x00880358, ++ .hs_ext_start_stop_x = 0x000F035F, ++ .vs_int_start_x = 0x01A70000, ++ .vs_int_stop_x__vs_int_start_y = 0x000001A7, ++ .vs_int_stop_y__vs_ext_start_x = 0x01AF0000, ++ .vs_ext_stop_x__vs_ext_start_y = 0x000101AF, ++ .vs_ext_stop_y = 0x00000025, ++ .avid_start_stop_x = 0x03530083, ++ .avid_start_stop_y = 0x026C002E, ++ .fid_int_start_x__fid_int_start_y = 0x0001008A, ++ .fid_int_offset_y__fid_ext_start_x = 0x002E0138, ++ .fid_ext_start_y__fid_ext_offset_y = 0x01380001, ++ ++ .tvdetgp_int_start_stop_x = 0x00140001, ++ .tvdetgp_int_start_stop_y = 0x00010001, ++ .gen_ctrl = 0x00FF0000, ++}; ++ ++/* from TRM */ ++static const struct venc_config venc_config_ntsc_trm = { ++ .f_control = 0, ++ .vidout_ctrl = 1, ++ .sync_ctrl = 0x8040, ++ .llen = 0x359, ++ .flens = 0x20C, ++ .hfltr_ctrl = 0, ++ .cc_carr_wss_carr = 0x043F2631, ++ .c_phase = 0, ++ .gain_u = 0x102, ++ .gain_v = 0x16C, ++ .gain_y = 0x12F, ++ .black_level = 0x43, ++ .blank_level = 0x38, ++ .x_color = 0x7, ++ .m_control = 0x1, ++ .bstamp_wss_data = 0x38, ++ .s_carr = 0x21F07C1F, ++ .line21 = 0, ++ .ln_sel = 0x01310011, ++ .l21__wc_ctl = 0x0000F003, ++ .htrigger_vtrigger = 0, ++ ++ .savid__eavid = 0x069300F4, ++ .flen__fal = 0x0016020C, ++ .lal__phase_reset = 0x00060107, ++ .hs_int_start_stop_x = 0x008E0350, ++ .hs_ext_start_stop_x = 0x000F0359, ++ .vs_int_start_x = 0x01A00000, ++ .vs_int_stop_x__vs_int_start_y = 0x020701A0, ++ .vs_int_stop_y__vs_ext_start_x = 0x01AC0024, ++ .vs_ext_stop_x__vs_ext_start_y = 0x020D01AC, ++ .vs_ext_stop_y = 0x00000006, ++ .avid_start_stop_x = 0x03480078, ++ .avid_start_stop_y = 0x02060024, ++ .fid_int_start_x__fid_int_start_y = 0x0001008A, ++ .fid_int_offset_y__fid_ext_start_x = 0x01AC0106, ++ .fid_ext_start_y__fid_ext_offset_y = 0x01060006, ++ ++ .tvdetgp_int_start_stop_x = 0x00140001, ++ .tvdetgp_int_start_stop_y = 0x00010001, ++ .gen_ctrl = 0x00F90000, ++}; ++ ++static const struct venc_config venc_config_pal_bdghi = { ++ .f_control = 0, ++ .vidout_ctrl = 0, ++ .sync_ctrl = 0, ++ .hfltr_ctrl = 0, ++ .x_color = 0, ++ .line21 = 0, ++ .ln_sel = 21, ++ .htrigger_vtrigger = 0, ++ .tvdetgp_int_start_stop_x = 0x00140001, ++ .tvdetgp_int_start_stop_y = 0x00010001, ++ .gen_ctrl = 0x00FB0000, ++ ++ .llen = 864-1, ++ .flens = 625-1, ++ .cc_carr_wss_carr = 0x2F7625ED, ++ .c_phase = 0xDF, ++ .gain_u = 0x111, ++ .gain_v = 0x181, ++ .gain_y = 0x140, ++ .black_level = 0x3e, ++ .blank_level = 0x3e, ++ .m_control = 0<<2 | 1<<1, ++ .bstamp_wss_data = 0x42, ++ .s_carr = 0x2a098acb, ++ .l21__wc_ctl = 0<<13 | 0x16<<8 | 0<<0, ++ .savid__eavid = 0x06A70108, ++ .flen__fal = 23<<16 | 624<<0, ++ .lal__phase_reset = 2<<17 | 310<<0, ++ .hs_int_start_stop_x = 0x00920358, ++ .hs_ext_start_stop_x = 0x000F035F, ++ .vs_int_start_x = 0x1a7<<16, ++ .vs_int_stop_x__vs_int_start_y = 0x000601A7, ++ .vs_int_stop_y__vs_ext_start_x = 0x01AF0036, ++ .vs_ext_stop_x__vs_ext_start_y = 0x27101af, ++ .vs_ext_stop_y = 0x05, ++ .avid_start_stop_x = 0x03530082, ++ .avid_start_stop_y = 0x0270002E, ++ .fid_int_start_x__fid_int_start_y = 0x0005008A, ++ .fid_int_offset_y__fid_ext_start_x = 0x002E0138, ++ .fid_ext_start_y__fid_ext_offset_y = 0x01380005, ++}; ++ ++const struct omap_video_timings omap_dss_pal_timings = { ++ .x_res = 720, ++ .y_res = 574, ++ .pixel_clock = 26181, ++ .hsw = 32, ++ .hfp = 80, ++ .hbp = 48, ++ .vsw = 7, ++ .vfp = 3, ++ .vbp = 6, ++}; ++EXPORT_SYMBOL(omap_dss_pal_timings); ++ ++const struct omap_video_timings omap_dss_ntsc_timings = { ++ .x_res = 720, ++ .y_res = 482, ++ .pixel_clock = 22153, ++ .hsw = 32, ++ .hfp = 80, ++ .hbp = 48, ++ .vsw = 10, ++ .vfp = 3, ++ .vbp = 6, ++}; ++EXPORT_SYMBOL(omap_dss_ntsc_timings); ++ ++static struct { ++ void __iomem *base; ++ struct mutex venc_lock; ++} venc; ++ ++static struct omap_panel venc_panel = { ++ .name = "tv-out", ++}; ++ ++static inline void venc_write_reg(int idx, u32 val) ++{ ++ __raw_writel(val, venc.base + idx); ++} ++ ++static inline u32 venc_read_reg(int idx) ++{ ++ u32 l = __raw_readl(venc.base + idx); ++ return l; ++} ++ ++static void venc_write_config(const struct venc_config *config) ++{ ++ DSSDBG("write venc conf\n"); ++ ++ venc_write_reg(VENC_LLEN, config->llen); ++ venc_write_reg(VENC_FLENS, config->flens); ++ venc_write_reg(VENC_CC_CARR_WSS_CARR, config->cc_carr_wss_carr); ++ venc_write_reg(VENC_C_PHASE, config->c_phase); ++ venc_write_reg(VENC_GAIN_U, config->gain_u); ++ venc_write_reg(VENC_GAIN_V, config->gain_v); ++ venc_write_reg(VENC_GAIN_Y, config->gain_y); ++ venc_write_reg(VENC_BLACK_LEVEL, config->black_level); ++ venc_write_reg(VENC_BLANK_LEVEL, config->blank_level); ++ venc_write_reg(VENC_M_CONTROL, config->m_control); ++ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data); ++ venc_write_reg(VENC_S_CARR, config->s_carr); ++ venc_write_reg(VENC_L21__WC_CTL, config->l21__wc_ctl); ++ venc_write_reg(VENC_SAVID__EAVID, config->savid__eavid); ++ venc_write_reg(VENC_FLEN__FAL, config->flen__fal); ++ venc_write_reg(VENC_LAL__PHASE_RESET, config->lal__phase_reset); ++ venc_write_reg(VENC_HS_INT_START_STOP_X, config->hs_int_start_stop_x); ++ venc_write_reg(VENC_HS_EXT_START_STOP_X, config->hs_ext_start_stop_x); ++ venc_write_reg(VENC_VS_INT_START_X, config->vs_int_start_x); ++ venc_write_reg(VENC_VS_INT_STOP_X__VS_INT_START_Y, ++ config->vs_int_stop_x__vs_int_start_y); ++ venc_write_reg(VENC_VS_INT_STOP_Y__VS_EXT_START_X, ++ config->vs_int_stop_y__vs_ext_start_x); ++ venc_write_reg(VENC_VS_EXT_STOP_X__VS_EXT_START_Y, ++ config->vs_ext_stop_x__vs_ext_start_y); ++ venc_write_reg(VENC_VS_EXT_STOP_Y, config->vs_ext_stop_y); ++ venc_write_reg(VENC_AVID_START_STOP_X, config->avid_start_stop_x); ++ venc_write_reg(VENC_AVID_START_STOP_Y, config->avid_start_stop_y); ++ venc_write_reg(VENC_FID_INT_START_X__FID_INT_START_Y, ++ config->fid_int_start_x__fid_int_start_y); ++ venc_write_reg(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X, ++ config->fid_int_offset_y__fid_ext_start_x); ++ venc_write_reg(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y, ++ config->fid_ext_start_y__fid_ext_offset_y); ++ ++ venc_write_reg(VENC_DAC_B__DAC_C, venc_read_reg(VENC_DAC_B__DAC_C)); ++ venc_write_reg(VENC_VIDOUT_CTRL, config->vidout_ctrl); ++ venc_write_reg(VENC_HFLTR_CTRL, config->hfltr_ctrl); ++ venc_write_reg(VENC_X_COLOR, config->x_color); ++ venc_write_reg(VENC_LINE21, config->line21); ++ venc_write_reg(VENC_LN_SEL, config->ln_sel); ++ venc_write_reg(VENC_HTRIGGER_VTRIGGER, config->htrigger_vtrigger); ++ venc_write_reg(VENC_TVDETGP_INT_START_STOP_X, ++ config->tvdetgp_int_start_stop_x); ++ venc_write_reg(VENC_TVDETGP_INT_START_STOP_Y, ++ config->tvdetgp_int_start_stop_y); ++ venc_write_reg(VENC_GEN_CTRL, config->gen_ctrl); ++ venc_write_reg(VENC_F_CONTROL, config->f_control); ++ venc_write_reg(VENC_SYNC_CTRL, config->sync_ctrl); ++} ++ ++static void venc_reset(void) ++{ ++ int t = 1000; ++ ++ venc_write_reg(VENC_F_CONTROL, 1<<8); ++ while (venc_read_reg(VENC_F_CONTROL) & (1<<8)) { ++ if (--t == 0) { ++ DSSERR("Failed to reset venc\n"); ++ return; ++ } ++ } ++ ++ /* the magical sleep that makes things work */ ++ msleep(20); ++} ++ ++static void venc_enable_clocks(int enable) ++{ ++ if (enable) ++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | ++ DSS_CLK_96M); ++ else ++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | ++ DSS_CLK_96M); ++} ++ ++static const struct venc_config *venc_timings_to_config( ++ struct omap_video_timings *timings) ++{ ++ if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) ++ return &venc_config_pal_trm; ++ ++ if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) ++ return &venc_config_ntsc_trm; ++ ++ BUG(); ++} ++ ++int venc_init(void) ++{ ++ u8 rev_id; ++ ++ mutex_init(&venc.venc_lock); ++ ++ venc_panel.timings = omap_dss_pal_timings; ++ ++ venc.base = ioremap(VENC_BASE, SZ_1K); ++ if (!venc.base) { ++ DSSERR("can't ioremap VENC\n"); ++ return -ENOMEM; ++ } ++ ++ venc_enable_clocks(1); ++ ++ rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); ++ printk(KERN_INFO "OMAP VENC rev %d\n", rev_id); ++ ++ venc_enable_clocks(0); ++ ++ return 0; ++} ++ ++void venc_exit(void) ++{ ++ iounmap(venc.base); ++} ++ ++static void venc_power_on(struct omap_display *display) ++{ ++ venc_enable_clocks(1); ++ ++ venc_reset(); ++ venc_write_config(venc_timings_to_config(&display->panel->timings)); ++ ++ dss_set_venc_output(display->hw_config.u.venc.type); ++ dss_set_dac_pwrdn_bgz(1); ++ ++ if (display->hw_config.u.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE) { ++ if (cpu_is_omap24xx()) ++ venc_write_reg(VENC_OUTPUT_CONTROL, 0x2); ++ else ++ venc_write_reg(VENC_OUTPUT_CONTROL, 0xa); ++ } else { /* S-Video */ ++ venc_write_reg(VENC_OUTPUT_CONTROL, 0xd); ++ } ++ ++ dispc_set_digit_size(display->panel->timings.x_res, ++ display->panel->timings.y_res/2); ++ ++ if (display->hw_config.panel_enable) ++ display->hw_config.panel_enable(display); ++ ++ dispc_enable_digit_out(1); ++} ++ ++static void venc_power_off(struct omap_display *display) ++{ ++ venc_write_reg(VENC_OUTPUT_CONTROL, 0); ++ dss_set_dac_pwrdn_bgz(0); ++ ++ dispc_enable_digit_out(0); ++ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ ++ venc_enable_clocks(0); ++} ++ ++static int venc_enable_display(struct omap_display *display) ++{ ++ int r = 0; ++ ++ DSSDBG("venc_enable_display\n"); ++ ++ mutex_lock(&venc.venc_lock); ++ ++ if (display->state != OMAP_DSS_DISPLAY_DISABLED) { ++ r = -EINVAL; ++ goto err; ++ } ++ ++ venc_power_on(display); ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++err: ++ mutex_unlock(&venc.venc_lock); ++ ++ return r; ++} ++ ++static void venc_disable_display(struct omap_display *display) ++{ ++ DSSDBG("venc_disable_display\n"); ++ ++ mutex_lock(&venc.venc_lock); ++ ++ if (display->state == OMAP_DSS_DISPLAY_DISABLED) ++ goto end; ++ ++ if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) { ++ /* suspended is the same as disabled with venc */ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++ goto end; ++ } ++ ++ venc_power_off(display); ++ ++ display->state = OMAP_DSS_DISPLAY_DISABLED; ++end: ++ mutex_unlock(&venc.venc_lock); ++} ++ ++static int venc_display_suspend(struct omap_display *display) ++{ ++ int r = 0; ++ ++ DSSDBG("venc_display_suspend\n"); ++ ++ mutex_lock(&venc.venc_lock); ++ ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) { ++ r = -EINVAL; ++ goto err; ++ } ++ ++ venc_power_off(display); ++ ++ display->state = OMAP_DSS_DISPLAY_SUSPENDED; ++err: ++ mutex_unlock(&venc.venc_lock); ++ ++ return r; ++} ++ ++static int venc_display_resume(struct omap_display *display) ++{ ++ int r = 0; ++ ++ DSSDBG("venc_display_resume\n"); ++ ++ mutex_lock(&venc.venc_lock); ++ ++ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) { ++ r = -EINVAL; ++ goto err; ++ } ++ ++ venc_power_on(display); ++ ++ display->state = OMAP_DSS_DISPLAY_ACTIVE; ++err: ++ mutex_unlock(&venc.venc_lock); ++ ++ return r; ++} ++ ++static void venc_get_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ *timings = venc_panel.timings; ++} ++ ++static void venc_set_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ DSSDBG("venc_set_timings\n"); ++ display->panel->timings = *timings; ++ if (display->state == OMAP_DSS_DISPLAY_ACTIVE) { ++ /* turn the venc off and on to get new timings to use */ ++ venc_disable_display(display); ++ venc_enable_display(display); ++ } ++} ++ ++static int venc_check_timings(struct omap_display *display, ++ struct omap_video_timings *timings) ++{ ++ DSSDBG("venc_check_timings\n"); ++ ++ if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) ++ return 0; ++ ++ if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) ++ return 0; ++ ++ return -EINVAL; ++} ++ ++void venc_init_display(struct omap_display *display) ++{ ++ display->panel = &venc_panel; ++ display->enable = venc_enable_display; ++ display->disable = venc_disable_display; ++ display->suspend = venc_display_suspend; ++ display->resume = venc_display_resume; ++ display->get_timings = venc_get_timings; ++ display->set_timings = venc_set_timings; ++ display->check_timings = venc_check_timings; ++} +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0004-DSS2-OMAP-framebuffer-driver.patch b/recipes/linux/linux-omap-2.6.29/dss2/0004-DSS2-OMAP-framebuffer-driver.patch new file mode 100644 index 0000000000..09afa7e5be --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0004-DSS2-OMAP-framebuffer-driver.patch @@ -0,0 +1,3403 @@ +From db9314f01a207e256d545244d3d00dc4ce535280 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 10:25:48 +0300 +Subject: [PATCH] DSS2: OMAP framebuffer driver + +Signed-off-by: Tomi Valkeinen +--- + arch/arm/plat-omap/fb.c | 28 + + drivers/video/omap/Kconfig | 5 +- + drivers/video/omap2/omapfb/Kconfig | 35 + + drivers/video/omap2/omapfb/Makefile | 2 + + drivers/video/omap2/omapfb/omapfb-ioctl.c | 656 ++++++++++ + drivers/video/omap2/omapfb/omapfb-main.c | 2010 +++++++++++++++++++++++++++++ + drivers/video/omap2/omapfb/omapfb-sysfs.c | 371 ++++++ + drivers/video/omap2/omapfb/omapfb.h | 153 +++ + include/linux/omapfb.h | 20 + + 9 files changed, 3278 insertions(+), 2 deletions(-) + create mode 100644 drivers/video/omap2/omapfb/Kconfig + create mode 100644 drivers/video/omap2/omapfb/Makefile + create mode 100644 drivers/video/omap2/omapfb/omapfb-ioctl.c + create mode 100644 drivers/video/omap2/omapfb/omapfb-main.c + create mode 100644 drivers/video/omap2/omapfb/omapfb-sysfs.c + create mode 100644 drivers/video/omap2/omapfb/omapfb.h + +diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c +index 40615a6..1dc3415 100644 +--- a/arch/arm/plat-omap/fb.c ++++ b/arch/arm/plat-omap/fb.c +@@ -327,6 +327,34 @@ static inline int omap_init_fb(void) + + arch_initcall(omap_init_fb); + ++#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) ++ ++static u64 omap_fb_dma_mask = ~(u32)0; ++static struct omapfb_platform_data omapfb_config; ++ ++static struct platform_device omap_fb_device = { ++ .name = "omapfb", ++ .id = -1, ++ .dev = { ++ .dma_mask = &omap_fb_dma_mask, ++ .coherent_dma_mask = ~(u32)0, ++ .platform_data = &omapfb_config, ++ }, ++ .num_resources = 0, ++}; ++ ++void omapfb_set_platform_data(struct omapfb_platform_data *data) ++{ ++ omapfb_config = *data; ++} ++ ++static inline int omap_init_fb(void) ++{ ++ return platform_device_register(&omap_fb_device); ++} ++ ++arch_initcall(omap_init_fb); ++ + #else + + void omapfb_reserve_sdram(void) {} +diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig +index c355b59..a1c10de 100644 +--- a/drivers/video/omap/Kconfig ++++ b/drivers/video/omap/Kconfig +@@ -1,6 +1,7 @@ + config FB_OMAP + tristate "OMAP frame buffer support (EXPERIMENTAL)" +- depends on FB && ARCH_OMAP ++ depends on FB && ARCH_OMAP && (OMAP2_DSS = "n") ++ + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT +@@ -72,7 +73,7 @@ config FB_OMAP_LCD_MIPID + + config FB_OMAP_BOOTLOADER_INIT + bool "Check bootloader initialization" +- depends on FB_OMAP ++ depends on FB_OMAP || FB_OMAP2 + help + Say Y here if you want to enable checking if the bootloader has + already initialized the display controller. In this case the +diff --git a/drivers/video/omap2/omapfb/Kconfig b/drivers/video/omap2/omapfb/Kconfig +new file mode 100644 +index 0000000..4f66033 +--- /dev/null ++++ b/drivers/video/omap2/omapfb/Kconfig +@@ -0,0 +1,35 @@ ++menuconfig FB_OMAP2 ++ tristate "OMAP2/3 frame buffer support (EXPERIMENTAL)" ++ depends on FB && OMAP2_DSS ++ ++ select FB_CFB_FILLRECT ++ select FB_CFB_COPYAREA ++ select FB_CFB_IMAGEBLIT ++ help ++ Frame buffer driver for OMAP2/3 based boards. ++ ++config FB_OMAP2_DEBUG_SUPPORT ++ bool "Debug support for OMAP2/3 FB" ++ default y ++ depends on FB_OMAP2 ++ help ++ Support for debug output. You have to enable the actual printing ++ with debug module parameter. ++ ++config FB_OMAP2_FORCE_AUTO_UPDATE ++ bool "Force main display to automatic update mode" ++ depends on FB_OMAP2 ++ help ++ Forces main display to automatic update mode (if possible), ++ and also enables tearsync (if possible). By default ++ displays that support manual update are started in manual ++ update mode. ++ ++config FB_OMAP2_NUM_FBS ++ int "Number of framebuffers" ++ range 1 10 ++ default 3 ++ depends on FB_OMAP2 ++ help ++ Select the number of framebuffers created. OMAP2/3 has 3 overlays ++ so normally this would be 3. +diff --git a/drivers/video/omap2/omapfb/Makefile b/drivers/video/omap2/omapfb/Makefile +new file mode 100644 +index 0000000..51c2e00 +--- /dev/null ++++ b/drivers/video/omap2/omapfb/Makefile +@@ -0,0 +1,2 @@ ++obj-$(CONFIG_FB_OMAP2) += omapfb.o ++omapfb-y := omapfb-main.o omapfb-sysfs.o omapfb-ioctl.o +diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c +new file mode 100644 +index 0000000..7f18d2a +--- /dev/null ++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c +@@ -0,0 +1,656 @@ ++/* ++ * linux/drivers/video/omap2/omapfb-ioctl.c ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "omapfb.h" ++ ++static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ struct omap_overlay *ovl; ++ struct omap_overlay_info info; ++ int r = 0; ++ ++ DBG("omapfb_setup_plane\n"); ++ ++ omapfb_lock(fbdev); ++ ++ if (ofbi->num_overlays != 1) { ++ r = -EINVAL; ++ goto out; ++ } ++ ++ /* XXX uses only the first overlay */ ++ ovl = ofbi->overlays[0]; ++ ++ if (pi->enabled && !ofbi->region.size) { ++ /* ++ * This plane's memory was freed, can't enable it ++ * until it's reallocated. ++ */ ++ r = -EINVAL; ++ goto out; ++ } ++ ++ ovl->get_overlay_info(ovl, &info); ++ ++ info.pos_x = pi->pos_x; ++ info.pos_y = pi->pos_y; ++ info.out_width = pi->out_width; ++ info.out_height = pi->out_height; ++ info.enabled = pi->enabled; ++ ++ r = ovl->set_overlay_info(ovl, &info); ++ if (r) ++ goto out; ++ ++ if (ovl->manager) { ++ r = ovl->manager->apply(ovl->manager); ++ if (r) ++ goto out; ++ } ++ ++ if (display) { ++ u16 w, h; ++ ++ if (display->sync) ++ display->sync(display); ++ ++ display->get_resolution(display, &w, &h); ++ ++ if (display->update) ++ display->update(display, 0, 0, w, h); ++ } ++ ++out: ++ omapfb_unlock(fbdev); ++ if (r) ++ dev_err(fbdev->dev, "setup_plane failed\n"); ++ return r; ++} ++ ++static int omapfb_query_plane(struct fb_info *fbi, struct omapfb_plane_info *pi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ ++ omapfb_lock(fbdev); ++ ++ if (ofbi->num_overlays != 1) { ++ memset(pi, 0, sizeof(*pi)); ++ } else { ++ struct omap_overlay_info *ovli; ++ struct omap_overlay *ovl; ++ ++ ovl = ofbi->overlays[0]; ++ ovli = &ovl->info; ++ ++ pi->pos_x = ovli->pos_x; ++ pi->pos_y = ovli->pos_y; ++ pi->enabled = ovli->enabled; ++ pi->channel_out = 0; /* xxx */ ++ pi->mirror = 0; ++ pi->out_width = ovli->out_width; ++ pi->out_height = ovli->out_height; ++ } ++ ++ omapfb_unlock(fbdev); ++ ++ return 0; ++} ++ ++static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omapfb2_mem_region *rg; ++ int r, i; ++ size_t size; ++ ++ if (mi->type > OMAPFB_MEMTYPE_MAX) ++ return -EINVAL; ++ ++ size = PAGE_ALIGN(mi->size); ++ ++ rg = &ofbi->region; ++ ++ omapfb_lock(fbdev); ++ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ if (ofbi->overlays[i]->info.enabled) { ++ r = -EBUSY; ++ goto out; ++ } ++ } ++ ++ if (rg->size != size || rg->type != mi->type) { ++ r = omapfb_realloc_fbmem(fbi, size, mi->type); ++ if (r) { ++ dev_err(fbdev->dev, "realloc fbmem failed\n"); ++ goto out; ++ } ++ } ++ ++ r = 0; ++out: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static int omapfb_query_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omapfb2_mem_region *rg; ++ ++ rg = &ofbi->region; ++ memset(mi, 0, sizeof(*mi)); ++ ++ omapfb_lock(fbdev); ++ mi->size = rg->size; ++ mi->type = rg->type; ++ omapfb_unlock(fbdev); ++ ++ return 0; ++} ++ ++static int omapfb_update_window(struct fb_info *fbi, ++ u32 x, u32 y, u32 w, u32 h) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ u16 dw, dh; ++ ++ if (!display) ++ return 0; ++ ++ if (w == 0 || h == 0) ++ return 0; ++ ++ display->get_resolution(display, &dw, &dh); ++ ++ if (x + w > dw || y + h > dh) ++ return -EINVAL; ++ ++ omapfb_lock(fbdev); ++ display->update(display, x, y, w, h); ++ omapfb_unlock(fbdev); ++ ++ return 0; ++} ++ ++static int omapfb_set_update_mode(struct fb_info *fbi, ++ enum omapfb_update_mode mode) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ enum omap_dss_update_mode um; ++ int r; ++ ++ if (!display || !display->set_update_mode) ++ return -EINVAL; ++ ++ switch (mode) { ++ case OMAPFB_UPDATE_DISABLED: ++ um = OMAP_DSS_UPDATE_DISABLED; ++ break; ++ ++ case OMAPFB_AUTO_UPDATE: ++ um = OMAP_DSS_UPDATE_AUTO; ++ break; ++ ++ case OMAPFB_MANUAL_UPDATE: ++ um = OMAP_DSS_UPDATE_MANUAL; ++ break; ++ ++ default: ++ return -EINVAL; ++ } ++ ++ omapfb_lock(fbdev); ++ r = display->set_update_mode(display, um); ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static int omapfb_get_update_mode(struct fb_info *fbi, ++ enum omapfb_update_mode *mode) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ enum omap_dss_update_mode m; ++ ++ if (!display || !display->get_update_mode) ++ return -EINVAL; ++ ++ omapfb_lock(fbdev); ++ m = display->get_update_mode(display); ++ omapfb_unlock(fbdev); ++ ++ switch (m) { ++ case OMAP_DSS_UPDATE_DISABLED: ++ *mode = OMAPFB_UPDATE_DISABLED; ++ break; ++ case OMAP_DSS_UPDATE_AUTO: ++ *mode = OMAPFB_AUTO_UPDATE; ++ break; ++ case OMAP_DSS_UPDATE_MANUAL: ++ *mode = OMAPFB_MANUAL_UPDATE; ++ break; ++ default: ++ BUG(); ++ } ++ ++ return 0; ++} ++ ++/* XXX this color key handling is a hack... */ ++static struct omapfb_color_key omapfb_color_keys[2]; ++ ++static int _omapfb_set_color_key(struct omap_overlay_manager *mgr, ++ struct omapfb_color_key *ck) ++{ ++ enum omap_dss_color_key_type kt; ++ ++ if(!mgr->set_default_color || !mgr->set_trans_key || ++ !mgr->enable_trans_key) ++ return 0; ++ ++ if (ck->key_type == OMAPFB_COLOR_KEY_DISABLED) { ++ mgr->enable_trans_key(mgr, 0); ++ omapfb_color_keys[mgr->id] = *ck; ++ return 0; ++ } ++ ++ switch(ck->key_type) { ++ case OMAPFB_COLOR_KEY_GFX_DST: ++ kt = OMAP_DSS_COLOR_KEY_GFX_DST; ++ break; ++ case OMAPFB_COLOR_KEY_VID_SRC: ++ kt = OMAP_DSS_COLOR_KEY_VID_SRC; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ mgr->set_default_color(mgr, ck->background); ++ mgr->set_trans_key(mgr, kt, ck->trans_key); ++ mgr->enable_trans_key(mgr, 1); ++ ++ omapfb_color_keys[mgr->id] = *ck; ++ ++ return 0; ++} ++ ++static int omapfb_set_color_key(struct fb_info *fbi, ++ struct omapfb_color_key *ck) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ int r; ++ int i; ++ struct omap_overlay_manager *mgr = NULL; ++ ++ omapfb_lock(fbdev); ++ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ if (ofbi->overlays[i]->manager) { ++ mgr = ofbi->overlays[i]->manager; ++ break; ++ } ++ } ++ ++ if (!mgr) { ++ r = -EINVAL; ++ goto err; ++ } ++ ++ if(!mgr->set_default_color || !mgr->set_trans_key || ++ !mgr->enable_trans_key) { ++ r = -ENODEV; ++ goto err; ++ } ++ ++ r = _omapfb_set_color_key(mgr, ck); ++err: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static int omapfb_get_color_key(struct fb_info *fbi, ++ struct omapfb_color_key *ck) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_overlay_manager *mgr = NULL; ++ int r = 0; ++ int i; ++ ++ omapfb_lock(fbdev); ++ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ if (ofbi->overlays[i]->manager) { ++ mgr = ofbi->overlays[i]->manager; ++ break; ++ } ++ } ++ ++ if (!mgr) { ++ r = -EINVAL; ++ goto err; ++ } ++ ++ if(!mgr->set_default_color || !mgr->set_trans_key || ++ !mgr->enable_trans_key) { ++ r = -ENODEV; ++ goto err; ++ } ++ ++ *ck = omapfb_color_keys[mgr->id]; ++err: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static int omapfb_memory_read(struct fb_info *fbi, ++ struct omapfb_memory_read *mr) ++{ ++ struct omap_display *display = fb2display(fbi); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ void *buf; ++ int r; ++ ++ if (!display || !display->memory_read) ++ return -ENOENT; ++ ++ if (!access_ok(VERIFY_WRITE, mr->buffer, mr->buffer_size)) ++ return -EFAULT; ++ ++ if (mr->w * mr->h * 3 > mr->buffer_size) ++ return -EINVAL; ++ ++ buf = vmalloc(mr->buffer_size); ++ if (!buf) { ++ DBG("vmalloc failed\n"); ++ return -ENOMEM; ++ } ++ ++ omapfb_lock(fbdev); ++ ++ r = display->memory_read(display, buf, mr->buffer_size, ++ mr->x, mr->y, mr->w, mr->h); ++ ++ if (r > 0) { ++ if (copy_to_user(mr->buffer, buf, mr->buffer_size)) ++ r = -EFAULT; ++ } ++ ++ vfree(buf); ++ ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ ++ union { ++ struct omapfb_update_window_old uwnd_o; ++ struct omapfb_update_window uwnd; ++ struct omapfb_plane_info plane_info; ++ struct omapfb_caps caps; ++ struct omapfb_mem_info mem_info; ++ struct omapfb_color_key color_key; ++ enum omapfb_update_mode update_mode; ++ int test_num; ++ struct omapfb_memory_read memory_read; ++ } p; ++ ++ int r = 0; ++ ++ switch (cmd) { ++ case OMAPFB_SYNC_GFX: ++ DBG("ioctl SYNC_GFX\n"); ++ if (!display || !display->sync) { ++ /* DSS1 never returns an error here, so we neither */ ++ /*r = -EINVAL;*/ ++ break; ++ } ++ ++ omapfb_lock(fbdev); ++ r = display->sync(display); ++ omapfb_unlock(fbdev); ++ break; ++ ++ case OMAPFB_UPDATE_WINDOW_OLD: ++ DBG("ioctl UPDATE_WINDOW_OLD\n"); ++ if (!display || !display->update) { ++ r = -EINVAL; ++ break; ++ } ++ ++ if (copy_from_user(&p.uwnd_o, ++ (void __user *)arg, ++ sizeof(p.uwnd_o))) { ++ r = -EFAULT; ++ break; ++ } ++ ++ r = omapfb_update_window(fbi, p.uwnd_o.x, p.uwnd_o.y, ++ p.uwnd_o.width, p.uwnd_o.height); ++ break; ++ ++ case OMAPFB_UPDATE_WINDOW: ++ DBG("ioctl UPDATE_WINDOW\n"); ++ if (!display || !display->update) { ++ r = -EINVAL; ++ break; ++ } ++ ++ if (copy_from_user(&p.uwnd, (void __user *)arg, ++ sizeof(p.uwnd))) { ++ r = -EFAULT; ++ break; ++ } ++ ++ r = omapfb_update_window(fbi, p.uwnd.x, p.uwnd.y, ++ p.uwnd.width, p.uwnd.height); ++ break; ++ ++ case OMAPFB_SETUP_PLANE: ++ DBG("ioctl SETUP_PLANE\n"); ++ if (copy_from_user(&p.plane_info, (void __user *)arg, ++ sizeof(p.plane_info))) ++ r = -EFAULT; ++ else ++ r = omapfb_setup_plane(fbi, &p.plane_info); ++ break; ++ ++ case OMAPFB_QUERY_PLANE: ++ DBG("ioctl QUERY_PLANE\n"); ++ r = omapfb_query_plane(fbi, &p.plane_info); ++ if (r < 0) ++ break; ++ if (copy_to_user((void __user *)arg, &p.plane_info, ++ sizeof(p.plane_info))) ++ r = -EFAULT; ++ break; ++ ++ case OMAPFB_SETUP_MEM: ++ DBG("ioctl SETUP_MEM\n"); ++ if (copy_from_user(&p.mem_info, (void __user *)arg, ++ sizeof(p.mem_info))) ++ r = -EFAULT; ++ else ++ r = omapfb_setup_mem(fbi, &p.mem_info); ++ break; ++ ++ case OMAPFB_QUERY_MEM: ++ DBG("ioctl QUERY_MEM\n"); ++ r = omapfb_query_mem(fbi, &p.mem_info); ++ if (r < 0) ++ break; ++ if (copy_to_user((void __user *)arg, &p.mem_info, ++ sizeof(p.mem_info))) ++ r = -EFAULT; ++ break; ++ ++ case OMAPFB_GET_CAPS: ++ DBG("ioctl GET_CAPS\n"); ++ if (!display) { ++ r = -EINVAL; ++ break; ++ } ++ ++ p.caps.ctrl = display->caps; ++ ++ if (copy_to_user((void __user *)arg, &p.caps, sizeof(p.caps))) ++ r = -EFAULT; ++ break; ++ ++ case OMAPFB_SET_UPDATE_MODE: ++ DBG("ioctl SET_UPDATE_MODE\n"); ++ if (get_user(p.update_mode, (int __user *)arg)) ++ r = -EFAULT; ++ else ++ r = omapfb_set_update_mode(fbi, p.update_mode); ++ break; ++ ++ case OMAPFB_GET_UPDATE_MODE: ++ DBG("ioctl GET_UPDATE_MODE\n"); ++ r = omapfb_get_update_mode(fbi, &p.update_mode); ++ if (r) ++ break; ++ if (put_user(p.update_mode, ++ (enum omapfb_update_mode __user *)arg)) ++ r = -EFAULT; ++ break; ++ ++ case OMAPFB_SET_COLOR_KEY: ++ DBG("ioctl SET_COLOR_KEY\n"); ++ if (copy_from_user(&p.color_key, (void __user *)arg, ++ sizeof(p.color_key))) ++ r = -EFAULT; ++ else ++ r = omapfb_set_color_key(fbi, &p.color_key); ++ break; ++ ++ case OMAPFB_GET_COLOR_KEY: ++ DBG("ioctl GET_COLOR_KEY\n"); ++ if ((r = omapfb_get_color_key(fbi, &p.color_key)) < 0) ++ break; ++ if (copy_to_user((void __user *)arg, &p.color_key, ++ sizeof(p.color_key))) ++ r = -EFAULT; ++ break; ++ ++ case OMAPFB_WAITFORVSYNC: ++ DBG("ioctl WAITFORVSYNC\n"); ++ if (!display) { ++ r = -EINVAL; ++ break; ++ } ++ ++ r = display->wait_vsync(display); ++ break; ++ ++ /* LCD and CTRL tests do the same thing for backward ++ * compatibility */ ++ case OMAPFB_LCD_TEST: ++ DBG("ioctl LCD_TEST\n"); ++ if (get_user(p.test_num, (int __user *)arg)) { ++ r = -EFAULT; ++ break; ++ } ++ if (!display || !display->run_test) { ++ r = -EINVAL; ++ break; ++ } ++ ++ r = display->run_test(display, p.test_num); ++ ++ break; ++ ++ case OMAPFB_CTRL_TEST: ++ DBG("ioctl CTRL_TEST\n"); ++ if (get_user(p.test_num, (int __user *)arg)) { ++ r = -EFAULT; ++ break; ++ } ++ if (!display || !display->run_test) { ++ r = -EINVAL; ++ break; ++ } ++ ++ r = display->run_test(display, p.test_num); ++ ++ break; ++ ++ case OMAPFB_MEMORY_READ: ++ DBG("ioctl MEMORY_READ\n"); ++ ++ if (copy_from_user(&p.memory_read, (void __user *)arg, ++ sizeof(p.memory_read))) { ++ r = -EFAULT; ++ break; ++ } ++ ++ r = omapfb_memory_read(fbi, &p.memory_read); ++ ++ break; ++ ++ default: ++ dev_err(fbdev->dev, "Unknown ioctl 0x%x\n", cmd); ++ r = -EINVAL; ++ } ++ ++ if (r < 0) ++ DBG("ioctl failed: %d\n", r); ++ ++ return r; ++} ++ ++ +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +new file mode 100644 +index 0000000..852abe5 +--- /dev/null ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -0,0 +1,2010 @@ ++/* ++ * linux/drivers/video/omap2/omapfb-main.c ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "omapfb.h" ++ ++#define MODULE_NAME "omapfb" ++ ++static char *def_mode; ++static char *def_vram; ++static int def_vrfb; ++static int def_rotate; ++static int def_mirror; ++ ++#ifdef DEBUG ++unsigned int omapfb_debug; ++module_param_named(debug, omapfb_debug, bool, 0644); ++static unsigned int omapfb_test_pattern; ++module_param_named(test, omapfb_test_pattern, bool, 0644); ++#endif ++ ++#ifdef DEBUG ++static void draw_pixel(struct fb_info *fbi, int x, int y, unsigned color) ++{ ++ struct fb_var_screeninfo *var = &fbi->var; ++ struct fb_fix_screeninfo *fix = &fbi->fix; ++ void __iomem *addr = fbi->screen_base; ++ const unsigned bytespp = var->bits_per_pixel >> 3; ++ const unsigned line_len = fix->line_length / bytespp; ++ ++ int r = (color >> 16) & 0xff; ++ int g = (color >> 8) & 0xff; ++ int b = (color >> 0) & 0xff; ++ ++ if (var->bits_per_pixel == 16) { ++ u16 __iomem *p = (u16 __iomem *)addr; ++ p += y * line_len + x; ++ ++ r = r * 32 / 256; ++ g = g * 64 / 256; ++ b = b * 32 / 256; ++ ++ __raw_writew((r << 11) | (g << 5) | (b << 0), p); ++ } else if (var->bits_per_pixel == 24) { ++ u8 __iomem *p = (u8 __iomem *)addr; ++ p += (y * line_len + x) * 3; ++ ++ __raw_writeb(b, p + 0); ++ __raw_writeb(g, p + 1); ++ __raw_writeb(r, p + 2); ++ } else if (var->bits_per_pixel == 32) { ++ u32 __iomem *p = (u32 __iomem *)addr; ++ p += y * line_len + x; ++ __raw_writel(color, p); ++ } ++} ++ ++static void fill_fb(struct fb_info *fbi) ++{ ++ struct fb_var_screeninfo *var = &fbi->var; ++ const short w = var->xres_virtual; ++ const short h = var->yres_virtual; ++ void __iomem *addr = fbi->screen_base; ++ int y, x; ++ ++ if (!addr) ++ return; ++ ++ DBG("fill_fb %dx%d, line_len %d bytes\n", w, h, fbi->fix.line_length); ++ ++ for (y = 0; y < h; y++) { ++ for (x = 0; x < w; x++) { ++ if (x < 20 && y < 20) ++ draw_pixel(fbi, x, y, 0xffffff); ++ else if (x < 20 && (y > 20 && y < h - 20)) ++ draw_pixel(fbi, x, y, 0xff); ++ else if (y < 20 && (x > 20 && x < w - 20)) ++ draw_pixel(fbi, x, y, 0xff00); ++ else if (x > w - 20 && (y > 20 && y < h - 20)) ++ draw_pixel(fbi, x, y, 0xff0000); ++ else if (y > h - 20 && (x > 20 && x < w - 20)) ++ draw_pixel(fbi, x, y, 0xffff00); ++ else if (x == 20 || x == w - 20 || ++ y == 20 || y == h - 20) ++ draw_pixel(fbi, x, y, 0xffffff); ++ else if (x == y || w - x == h - y) ++ draw_pixel(fbi, x, y, 0xff00ff); ++ else if (w - x == y || x == h - y) ++ draw_pixel(fbi, x, y, 0x00ffff); ++ else if (x > 20 && y > 20 && x < w - 20 && y < h - 20) { ++ int t = x * 3 / w; ++ unsigned r = 0, g = 0, b = 0; ++ unsigned c; ++ if (var->bits_per_pixel == 16) { ++ if (t == 0) ++ b = (y % 32) * 256 / 32; ++ else if (t == 1) ++ g = (y % 64) * 256 / 64; ++ else if (t == 2) ++ r = (y % 32) * 256 / 32; ++ } else { ++ if (t == 0) ++ b = (y % 256); ++ else if (t == 1) ++ g = (y % 256); ++ else if (t == 2) ++ r = (y % 256); ++ } ++ c = (r << 16) | (g << 8) | (b << 0); ++ draw_pixel(fbi, x, y, c); ++ } else { ++ draw_pixel(fbi, x, y, 0); ++ } ++ } ++ } ++} ++#endif ++ ++static unsigned omapfb_get_vrfb_offset(struct omapfb_info *ofbi, int rot) ++{ ++ struct vrfb *vrfb = &ofbi->region.vrfb; ++ unsigned offset; ++ ++ switch (rot) { ++ case FB_ROTATE_UR: ++ offset = 0; ++ break; ++ case FB_ROTATE_CW: ++ offset = vrfb->yoffset; ++ break; ++ case FB_ROTATE_UD: ++ offset = vrfb->yoffset * OMAP_VRFB_LINE_LEN + vrfb->xoffset; ++ break; ++ case FB_ROTATE_CCW: ++ offset = vrfb->xoffset * OMAP_VRFB_LINE_LEN; ++ break; ++ default: ++ BUG(); ++ } ++ ++ offset *= vrfb->bytespp; ++ ++ return offset; ++} ++ ++static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi) ++{ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ unsigned offset; ++ int rot; ++ ++ rot = ofbi->rotation; ++ ++ offset = omapfb_get_vrfb_offset(ofbi, rot); ++ ++ return ofbi->region.vrfb.paddr[rot] + offset; ++ } else { ++ return ofbi->region.paddr; ++ } ++} ++ ++u32 omapfb_get_region_paddr(struct omapfb_info *ofbi) ++{ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ return ofbi->region.vrfb.paddr[0]; ++ else ++ return ofbi->region.paddr; ++} ++ ++void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi) ++{ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ return ofbi->region.vrfb.vaddr[0]; ++ else ++ return ofbi->region.vaddr; ++} ++ ++static struct omapfb_colormode omapfb_colormodes[] = { ++ { ++ .dssmode = OMAP_DSS_COLOR_UYVY, ++ .bits_per_pixel = 16, ++ .nonstd = OMAPFB_COLOR_YUV422, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_YUV2, ++ .bits_per_pixel = 16, ++ .nonstd = OMAPFB_COLOR_YUY422, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_ARGB16, ++ .bits_per_pixel = 16, ++ .red = { .length = 4, .offset = 8, .msb_right = 0 }, ++ .green = { .length = 4, .offset = 4, .msb_right = 0 }, ++ .blue = { .length = 4, .offset = 0, .msb_right = 0 }, ++ .transp = { .length = 4, .offset = 12, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_RGB16, ++ .bits_per_pixel = 16, ++ .red = { .length = 5, .offset = 11, .msb_right = 0 }, ++ .green = { .length = 6, .offset = 5, .msb_right = 0 }, ++ .blue = { .length = 5, .offset = 0, .msb_right = 0 }, ++ .transp = { .length = 0, .offset = 0, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_RGB24P, ++ .bits_per_pixel = 24, ++ .red = { .length = 8, .offset = 16, .msb_right = 0 }, ++ .green = { .length = 8, .offset = 8, .msb_right = 0 }, ++ .blue = { .length = 8, .offset = 0, .msb_right = 0 }, ++ .transp = { .length = 0, .offset = 0, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_RGB24U, ++ .bits_per_pixel = 32, ++ .red = { .length = 8, .offset = 16, .msb_right = 0 }, ++ .green = { .length = 8, .offset = 8, .msb_right = 0 }, ++ .blue = { .length = 8, .offset = 0, .msb_right = 0 }, ++ .transp = { .length = 0, .offset = 0, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_ARGB32, ++ .bits_per_pixel = 32, ++ .red = { .length = 8, .offset = 16, .msb_right = 0 }, ++ .green = { .length = 8, .offset = 8, .msb_right = 0 }, ++ .blue = { .length = 8, .offset = 0, .msb_right = 0 }, ++ .transp = { .length = 8, .offset = 24, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_RGBA32, ++ .bits_per_pixel = 32, ++ .red = { .length = 8, .offset = 24, .msb_right = 0 }, ++ .green = { .length = 8, .offset = 16, .msb_right = 0 }, ++ .blue = { .length = 8, .offset = 8, .msb_right = 0 }, ++ .transp = { .length = 8, .offset = 0, .msb_right = 0 }, ++ }, { ++ .dssmode = OMAP_DSS_COLOR_RGBX32, ++ .bits_per_pixel = 32, ++ .red = { .length = 8, .offset = 24, .msb_right = 0 }, ++ .green = { .length = 8, .offset = 16, .msb_right = 0 }, ++ .blue = { .length = 8, .offset = 8, .msb_right = 0 }, ++ .transp = { .length = 0, .offset = 0, .msb_right = 0 }, ++ }, ++}; ++ ++static bool cmp_var_to_colormode(struct fb_var_screeninfo *var, ++ struct omapfb_colormode *color) ++{ ++ bool cmp_component(struct fb_bitfield *f1, struct fb_bitfield *f2) ++ { ++ return f1->length == f2->length && ++ f1->offset == f2->offset && ++ f1->msb_right == f2->msb_right; ++ } ++ ++ if (var->bits_per_pixel == 0 || ++ var->red.length == 0 || ++ var->blue.length == 0 || ++ var->green.length == 0) ++ return 0; ++ ++ return var->bits_per_pixel == color->bits_per_pixel && ++ cmp_component(&var->red, &color->red) && ++ cmp_component(&var->green, &color->green) && ++ cmp_component(&var->blue, &color->blue) && ++ cmp_component(&var->transp, &color->transp); ++} ++ ++static void assign_colormode_to_var(struct fb_var_screeninfo *var, ++ struct omapfb_colormode *color) ++{ ++ var->bits_per_pixel = color->bits_per_pixel; ++ var->nonstd = color->nonstd; ++ var->red = color->red; ++ var->green = color->green; ++ var->blue = color->blue; ++ var->transp = color->transp; ++} ++ ++static enum omap_color_mode fb_mode_to_dss_mode(struct fb_var_screeninfo *var) ++{ ++ enum omap_color_mode dssmode; ++ int i; ++ ++ /* first match with nonstd field */ ++ if (var->nonstd) { ++ for (i = 0; i < ARRAY_SIZE(omapfb_colormodes); ++i) { ++ struct omapfb_colormode *mode = &omapfb_colormodes[i]; ++ if (var->nonstd == mode->nonstd) { ++ assign_colormode_to_var(var, mode); ++ return mode->dssmode; ++ } ++ } ++ ++ return -EINVAL; ++ } ++ ++ /* then try exact match of bpp and colors */ ++ for (i = 0; i < ARRAY_SIZE(omapfb_colormodes); ++i) { ++ struct omapfb_colormode *mode = &omapfb_colormodes[i]; ++ if (cmp_var_to_colormode(var, mode)) { ++ assign_colormode_to_var(var, mode); ++ return mode->dssmode; ++ } ++ } ++ ++ /* match with bpp if user has not filled color fields ++ * properly */ ++ switch (var->bits_per_pixel) { ++ case 1: ++ dssmode = OMAP_DSS_COLOR_CLUT1; ++ break; ++ case 2: ++ dssmode = OMAP_DSS_COLOR_CLUT2; ++ break; ++ case 4: ++ dssmode = OMAP_DSS_COLOR_CLUT4; ++ break; ++ case 8: ++ dssmode = OMAP_DSS_COLOR_CLUT8; ++ break; ++ case 12: ++ dssmode = OMAP_DSS_COLOR_RGB12U; ++ break; ++ case 16: ++ dssmode = OMAP_DSS_COLOR_RGB16; ++ break; ++ case 24: ++ dssmode = OMAP_DSS_COLOR_RGB24P; ++ break; ++ case 32: ++ dssmode = OMAP_DSS_COLOR_RGB24U; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < ARRAY_SIZE(omapfb_colormodes); ++i) { ++ struct omapfb_colormode *mode = &omapfb_colormodes[i]; ++ if (dssmode == mode->dssmode) { ++ assign_colormode_to_var(var, mode); ++ return mode->dssmode; ++ } ++ } ++ ++ return -EINVAL; ++} ++ ++void set_fb_fix(struct fb_info *fbi) ++{ ++ struct fb_fix_screeninfo *fix = &fbi->fix; ++ struct fb_var_screeninfo *var = &fbi->var; ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_mem_region *rg = &ofbi->region; ++ ++ DBG("set_fb_fix\n"); ++ ++ /* used by open/write in fbmem.c */ ++ fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi); ++ ++ /* used by mmap in fbmem.c */ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ fix->line_length = ++ (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3; ++ else ++ fix->line_length = ++ (var->xres_virtual * var->bits_per_pixel) >> 3; ++ fix->smem_start = omapfb_get_region_paddr(ofbi); ++ fix->smem_len = rg->size; ++ ++ fix->type = FB_TYPE_PACKED_PIXELS; ++ ++ if (var->nonstd) ++ fix->visual = FB_VISUAL_PSEUDOCOLOR; ++ else { ++ switch (var->bits_per_pixel) { ++ case 32: ++ case 24: ++ case 16: ++ case 12: ++ fix->visual = FB_VISUAL_TRUECOLOR; ++ /* 12bpp is stored in 16 bits */ ++ break; ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ fix->visual = FB_VISUAL_PSEUDOCOLOR; ++ break; ++ } ++ } ++ ++ fix->accel = FB_ACCEL_NONE; ++ ++ fix->xpanstep = 1; ++ fix->ypanstep = 1; ++ ++ if (rg->size) { ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ omap_vrfb_setup(&rg->vrfb, rg->paddr, ++ var->xres_virtual, var->yres_virtual, ++ var->bits_per_pixel >> 3); ++ } ++} ++ ++/* check new var and possibly modify it to be ok */ ++int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omap_display *display = fb2display(fbi); ++ unsigned long max_frame_size; ++ unsigned long line_size; ++ int xres_min, yres_min; ++ int xres_max, yres_max; ++ enum omap_color_mode mode = 0; ++ int i; ++ int bytespp; ++ ++ DBG("check_fb_var %d\n", ofbi->id); ++ ++ if (ofbi->region.size == 0) ++ return 0; ++ ++ mode = fb_mode_to_dss_mode(var); ++ if (mode < 0) { ++ DBG("cannot convert var to omap dss mode\n"); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < ofbi->num_overlays; ++i) { ++ if ((ofbi->overlays[i]->supported_modes & mode) == 0) { ++ DBG("invalid mode\n"); ++ return -EINVAL; ++ } ++ } ++ ++ if (var->rotate < 0 || var->rotate > 3) ++ return -EINVAL; ++ ++ if (var->rotate != fbi->var.rotate) { ++ DBG("rotation changing\n"); ++ ++ ofbi->rotation = var->rotate; ++ ++ if (abs(var->rotate - fbi->var.rotate) != 2) { ++ int tmp; ++ DBG("rotate changing 90/270 degrees. " ++ "swapping x/y res\n"); ++ ++ tmp = var->yres; ++ var->yres = var->xres; ++ var->xres = tmp; ++ ++ tmp = var->yres_virtual; ++ var->yres_virtual = var->xres_virtual; ++ var->xres_virtual = tmp; ++ } ++ } ++ ++ xres_min = OMAPFB_PLANE_XRES_MIN; ++ xres_max = 2048; ++ yres_min = OMAPFB_PLANE_YRES_MIN; ++ yres_max = 2048; ++ ++ bytespp = var->bits_per_pixel >> 3; ++ ++ /* XXX: some applications seem to set virtual res to 0. */ ++ if (var->xres_virtual == 0) ++ var->xres_virtual = var->xres; ++ ++ if (var->yres_virtual == 0) ++ var->yres_virtual = var->yres; ++ ++ if (var->xres_virtual < xres_min || var->yres_virtual < yres_min) ++ return -EINVAL; ++ ++ if (var->xres < xres_min) ++ var->xres = xres_min; ++ if (var->yres < yres_min) ++ var->yres = yres_min; ++ if (var->xres > xres_max) ++ var->xres = xres_max; ++ if (var->yres > yres_max) ++ var->yres = yres_max; ++ ++ if (var->xres > var->xres_virtual) ++ var->xres = var->xres_virtual; ++ if (var->yres > var->yres_virtual) ++ var->yres = var->yres_virtual; ++ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ line_size = OMAP_VRFB_LINE_LEN * bytespp; ++ else ++ line_size = var->xres_virtual * bytespp; ++ ++ max_frame_size = ofbi->region.size; ++ ++ DBG("max frame size %lu, line size %lu\n", max_frame_size, line_size); ++ ++ if (line_size * var->yres_virtual > max_frame_size) { ++ DBG("can't fit FB into memory, reducing y\n"); ++ var->yres_virtual = max_frame_size / line_size; ++ ++ if (var->yres_virtual < yres_min) ++ var->yres_virtual = yres_min; ++ ++ if (var->yres > var->yres_virtual) ++ var->yres = var->yres_virtual; ++ } ++ ++ if (line_size * var->yres_virtual > max_frame_size) { ++ DBG("can't fit FB into memory, reducing x\n"); ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ return -EINVAL; ++ ++ var->xres_virtual = max_frame_size / var->yres_virtual / ++ bytespp; ++ ++ if (var->xres_virtual < xres_min) ++ var->xres_virtual = xres_min; ++ ++ if (var->xres > var->xres_virtual) ++ var->xres = var->xres_virtual; ++ ++ line_size = var->xres_virtual * bytespp; ++ } ++ ++ if (line_size * var->yres_virtual > max_frame_size) { ++ DBG("cannot fit FB to memory\n"); ++ return -EINVAL; ++ } ++ ++ if (var->xres + var->xoffset > var->xres_virtual) ++ var->xoffset = var->xres_virtual - var->xres; ++ if (var->yres + var->yoffset > var->yres_virtual) ++ var->yoffset = var->yres_virtual - var->yres; ++ ++ DBG("xres = %d, yres = %d, vxres = %d, vyres = %d\n", ++ var->xres, var->yres, ++ var->xres_virtual, var->yres_virtual); ++ ++ var->height = -1; ++ var->width = -1; ++ var->grayscale = 0; ++ ++ if (display && display->get_timings) { ++ struct omap_video_timings timings; ++ display->get_timings(display, &timings); ++ ++ /* pixclock in ps, the rest in pixclock */ ++ var->pixclock = timings.pixel_clock != 0 ? ++ KHZ2PICOS(timings.pixel_clock) : ++ 0; ++ var->left_margin = timings.hfp; ++ var->right_margin = timings.hbp; ++ var->upper_margin = timings.vfp; ++ var->lower_margin = timings.vbp; ++ var->hsync_len = timings.hsw; ++ var->vsync_len = timings.vsw; ++ } else { ++ var->pixclock = 0; ++ var->left_margin = 0; ++ var->right_margin = 0; ++ var->upper_margin = 0; ++ var->lower_margin = 0; ++ var->hsync_len = 0; ++ var->vsync_len = 0; ++ } ++ ++ /* TODO: get these from panel->config */ ++ var->vmode = FB_VMODE_NONINTERLACED; ++ var->sync = 0; ++ ++ return 0; ++} ++ ++/* ++ * --------------------------------------------------------------------------- ++ * fbdev framework callbacks ++ * --------------------------------------------------------------------------- ++ */ ++static int omapfb_open(struct fb_info *fbi, int user) ++{ ++ return 0; ++} ++ ++static int omapfb_release(struct fb_info *fbi, int user) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ ++ DBG("Closing fb with plane index %d\n", ofbi->id); ++ ++ omapfb_lock(fbdev); ++#if 1 ++ if (display && display->get_update_mode && display->update) { ++ /* XXX this update should be removed, I think. But it's ++ * good for debugging */ ++ if (display->get_update_mode(display) == ++ OMAP_DSS_UPDATE_MANUAL) { ++ u16 w, h; ++ ++ if (display->sync) ++ display->sync(display); ++ ++ display->get_resolution(display, &w, &h); ++ display->update(display, 0, 0, w, h); ++ } ++ } ++#endif ++ ++ if (display && display->sync) ++ display->sync(display); ++ ++ omapfb_unlock(fbdev); ++ ++ return 0; ++} ++ ++/* setup overlay according to the fb */ ++static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, ++ u16 posx, u16 posy, u16 outw, u16 outh) ++{ ++ int r = 0; ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct fb_var_screeninfo *var = &fbi->var; ++ struct fb_fix_screeninfo *fix = &fbi->fix; ++ enum omap_color_mode mode = 0; ++ int offset; ++ u32 data_start_p; ++ void __iomem *data_start_v; ++ struct omap_overlay_info info; ++ int xres, yres; ++ int screen_width; ++ int rot, mirror; ++ ++ DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id, ++ posx, posy, outw, outh); ++ ++ if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_CCW) { ++ xres = var->yres; ++ yres = var->xres; ++ } else { ++ xres = var->xres; ++ yres = var->yres; ++ } ++ ++ offset = ((var->yoffset * var->xres_virtual + ++ var->xoffset) * var->bits_per_pixel) >> 3; ++ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ data_start_p = omapfb_get_region_rot_paddr(ofbi); ++ data_start_v = NULL; ++ } else { ++ data_start_p = omapfb_get_region_paddr(ofbi); ++ data_start_v = omapfb_get_region_vaddr(ofbi); ++ } ++ ++ data_start_p += offset; ++ data_start_v += offset; ++ ++ mode = fb_mode_to_dss_mode(var); ++ ++ if (mode == -EINVAL) { ++ DBG("fb_mode_to_dss_mode failed"); ++ r = -EINVAL; ++ goto err; ++ } ++ ++ screen_width = fix->line_length / (var->bits_per_pixel >> 3); ++ ++ ovl->get_overlay_info(ovl, &info); ++ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ rot = 0; ++ mirror = 0; ++ } else { ++ rot = ofbi->rotation; ++ mirror = ofbi->mirror; ++ } ++ ++ info.paddr = data_start_p; ++ info.vaddr = data_start_v; ++ info.screen_width = screen_width; ++ info.width = xres; ++ info.height = yres; ++ info.color_mode = mode; ++ info.rotation = rot; ++ info.mirror = mirror; ++ ++ info.pos_x = posx; ++ info.pos_y = posy; ++ info.out_width = outw; ++ info.out_height = outh; ++ ++ r = ovl->set_overlay_info(ovl, &info); ++ if (r) { ++ DBG("ovl->setup_overlay_info failed\n"); ++ goto err; ++ } ++ ++ return 0; ++ ++err: ++ DBG("setup_overlay failed\n"); ++ return r; ++} ++ ++/* apply var to the overlay */ ++int omapfb_apply_changes(struct fb_info *fbi, int init) ++{ ++ int r = 0; ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct fb_var_screeninfo *var = &fbi->var; ++ struct omap_overlay *ovl; ++ u16 posx, posy; ++ u16 outw, outh; ++ int i; ++ ++#ifdef DEBUG ++ if (omapfb_test_pattern) ++ fill_fb(fbi); ++#endif ++ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ ovl = ofbi->overlays[i]; ++ ++ DBG("apply_changes, fb %d, ovl %d\n", ofbi->id, ovl->id); ++ ++ if (ofbi->region.size == 0) { ++ /* the fb is not available. disable the overlay */ ++ omapfb_overlay_enable(ovl, 0); ++ if (!init && ovl->manager) ++ ovl->manager->apply(ovl->manager); ++ continue; ++ } ++ ++ if (init || (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { ++ if (ofbi->rotation == FB_ROTATE_CW || ++ ofbi->rotation == FB_ROTATE_CCW) { ++ outw = var->yres; ++ outh = var->xres; ++ } else { ++ outw = var->xres; ++ outh = var->yres; ++ } ++ } else { ++ outw = ovl->info.out_width; ++ outh = ovl->info.out_height; ++ } ++ ++ if (init) { ++ posx = 0; ++ posy = 0; ++ } else { ++ posx = ovl->info.pos_x; ++ posy = ovl->info.pos_y; ++ } ++ ++ r = omapfb_setup_overlay(fbi, ovl, posx, posy, outw, outh); ++ if (r) ++ goto err; ++ ++ if (!init && ovl->manager) ++ ovl->manager->apply(ovl->manager); ++ } ++ return 0; ++err: ++ DBG("apply_changes failed\n"); ++ return r; ++} ++ ++/* checks var and eventually tweaks it to something supported, ++ * DO NOT MODIFY PAR */ ++static int omapfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fbi) ++{ ++ int r; ++ ++ DBG("check_var(%d)\n", FB2OFB(fbi)->id); ++ ++ r = check_fb_var(fbi, var); ++ ++ return r; ++} ++ ++/* set the video mode according to info->var */ ++static int omapfb_set_par(struct fb_info *fbi) ++{ ++ int r; ++ ++ DBG("set_par(%d)\n", FB2OFB(fbi)->id); ++ ++ set_fb_fix(fbi); ++ r = omapfb_apply_changes(fbi, 0); ++ ++ return r; ++} ++ ++static int omapfb_pan_display(struct fb_var_screeninfo *var, ++ struct fb_info *fbi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ int r = 0; ++ ++ DBG("pan_display(%d)\n", ofbi->id); ++ ++ omapfb_lock(fbdev); ++ ++ if (var->xoffset != fbi->var.xoffset || ++ var->yoffset != fbi->var.yoffset) { ++ struct fb_var_screeninfo new_var; ++ ++ new_var = fbi->var; ++ new_var.xoffset = var->xoffset; ++ new_var.yoffset = var->yoffset; ++ ++ r = check_fb_var(fbi, &new_var); ++ ++ if (r == 0) { ++ fbi->var = new_var; ++ set_fb_fix(fbi); ++ r = omapfb_apply_changes(fbi, 0); ++ } ++ } ++ ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static void mmap_user_open(struct vm_area_struct *vma) ++{ ++ struct omapfb_info *ofbi = (struct omapfb_info *)vma->vm_private_data; ++ ++ atomic_inc(&ofbi->map_count); ++} ++ ++static void mmap_user_close(struct vm_area_struct *vma) ++{ ++ struct omapfb_info *ofbi = (struct omapfb_info *)vma->vm_private_data; ++ ++ atomic_dec(&ofbi->map_count); ++} ++ ++static struct vm_operations_struct mmap_user_ops = { ++ .open = mmap_user_open, ++ .close = mmap_user_close, ++}; ++ ++static int omapfb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct fb_fix_screeninfo *fix = &fbi->fix; ++ unsigned long off; ++ unsigned long start; ++ u32 len; ++ ++ if (vma->vm_end - vma->vm_start == 0) ++ return 0; ++ if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) ++ return -EINVAL; ++ off = vma->vm_pgoff << PAGE_SHIFT; ++ ++ start = omapfb_get_region_paddr(ofbi); ++ len = fix->smem_len; ++ if (off >= len) ++ return -EINVAL; ++ if ((vma->vm_end - vma->vm_start + off) > len) ++ return -EINVAL; ++ ++ off += start; ++ ++ DBG("user mmap region start %lx, len %d, off %lx\n", start, len, off); ++ ++ vma->vm_pgoff = off >> PAGE_SHIFT; ++ vma->vm_flags |= VM_IO | VM_RESERVED; ++ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); ++ vma->vm_ops = &mmap_user_ops; ++ vma->vm_private_data = ofbi; ++ if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, ++ vma->vm_end - vma->vm_start, vma->vm_page_prot)) ++ return -EAGAIN; ++ /* vm_ops.open won't be called for mmap itself. */ ++ atomic_inc(&ofbi->map_count); ++ return 0; ++} ++ ++/* Store a single color palette entry into a pseudo palette or the hardware ++ * palette if one is available. For now we support only 16bpp and thus store ++ * the entry only to the pseudo palette. ++ */ ++static int _setcolreg(struct fb_info *fbi, u_int regno, u_int red, u_int green, ++ u_int blue, u_int transp, int update_hw_pal) ++{ ++ /*struct omapfb_info *ofbi = FB2OFB(fbi);*/ ++ /*struct omapfb2_device *fbdev = ofbi->fbdev;*/ ++ struct fb_var_screeninfo *var = &fbi->var; ++ int r = 0; ++ ++ enum omapfb_color_format mode = OMAPFB_COLOR_RGB24U; /* XXX */ ++ ++ /*switch (plane->color_mode) {*/ ++ switch (mode) { ++ case OMAPFB_COLOR_YUV422: ++ case OMAPFB_COLOR_YUV420: ++ case OMAPFB_COLOR_YUY422: ++ r = -EINVAL; ++ break; ++ case OMAPFB_COLOR_CLUT_8BPP: ++ case OMAPFB_COLOR_CLUT_4BPP: ++ case OMAPFB_COLOR_CLUT_2BPP: ++ case OMAPFB_COLOR_CLUT_1BPP: ++ /* ++ if (fbdev->ctrl->setcolreg) ++ r = fbdev->ctrl->setcolreg(regno, red, green, blue, ++ transp, update_hw_pal); ++ */ ++ /* Fallthrough */ ++ r = -EINVAL; ++ break; ++ case OMAPFB_COLOR_RGB565: ++ case OMAPFB_COLOR_RGB444: ++ case OMAPFB_COLOR_RGB24P: ++ case OMAPFB_COLOR_RGB24U: ++ if (r != 0) ++ break; ++ ++ if (regno < 0) { ++ r = -EINVAL; ++ break; ++ } ++ ++ if (regno < 16) { ++ u16 pal; ++ pal = ((red >> (16 - var->red.length)) << ++ var->red.offset) | ++ ((green >> (16 - var->green.length)) << ++ var->green.offset) | ++ (blue >> (16 - var->blue.length)); ++ ((u32 *)(fbi->pseudo_palette))[regno] = pal; ++ } ++ break; ++ default: ++ BUG(); ++ } ++ return r; ++} ++ ++static int omapfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ++ u_int transp, struct fb_info *info) ++{ ++ DBG("setcolreg\n"); ++ ++ return _setcolreg(info, regno, red, green, blue, transp, 1); ++} ++ ++static int omapfb_setcmap(struct fb_cmap *cmap, struct fb_info *info) ++{ ++ int count, index, r; ++ u16 *red, *green, *blue, *transp; ++ u16 trans = 0xffff; ++ ++ DBG("setcmap\n"); ++ ++ red = cmap->red; ++ green = cmap->green; ++ blue = cmap->blue; ++ transp = cmap->transp; ++ index = cmap->start; ++ ++ for (count = 0; count < cmap->len; count++) { ++ if (transp) ++ trans = *transp++; ++ r = _setcolreg(info, index++, *red++, *green++, *blue++, trans, ++ count == cmap->len - 1); ++ if (r != 0) ++ return r; ++ } ++ ++ return 0; ++} ++ ++static int omapfb_blank(int blank, struct fb_info *fbi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ int do_update = 0; ++ int r = 0; ++ ++ omapfb_lock(fbdev); ++ ++ switch (blank) { ++ case FB_BLANK_UNBLANK: ++ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) ++ goto exit; ++ ++ if (display->resume) ++ r = display->resume(display); ++ ++ if (r == 0 && display->get_update_mode && ++ display->get_update_mode(display) == ++ OMAP_DSS_UPDATE_MANUAL) ++ do_update = 1; ++ ++ break; ++ ++ case FB_BLANK_NORMAL: ++ /* FB_BLANK_NORMAL could be implemented. ++ * Needs DSS additions. */ ++ case FB_BLANK_VSYNC_SUSPEND: ++ case FB_BLANK_HSYNC_SUSPEND: ++ case FB_BLANK_POWERDOWN: ++ if (display->state != OMAP_DSS_DISPLAY_ACTIVE) ++ goto exit; ++ ++ if (display->suspend) ++ r = display->suspend(display); ++ ++ break; ++ ++ default: ++ r = -EINVAL; ++ } ++ ++exit: ++ omapfb_unlock(fbdev); ++ ++ if (r == 0 && do_update && display->update) { ++ u16 w, h; ++ display->get_resolution(display, &w, &h); ++ ++ r = display->update(display, 0, 0, w, h); ++ } ++ ++ return r; ++} ++ ++#if 0 ++/* XXX fb_read and fb_write are needed for VRFB */ ++ssize_t omapfb_write(struct fb_info *info, const char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ DBG("omapfb_write %d, %lu\n", count, (unsigned long)*ppos); ++ // XXX needed for VRFB ++ return count; ++} ++#endif ++ ++static struct fb_ops omapfb_ops = { ++ .owner = THIS_MODULE, ++ .fb_open = omapfb_open, ++ .fb_release = omapfb_release, ++ .fb_fillrect = cfb_fillrect, ++ .fb_copyarea = cfb_copyarea, ++ .fb_imageblit = cfb_imageblit, ++ .fb_blank = omapfb_blank, ++ .fb_ioctl = omapfb_ioctl, ++ .fb_check_var = omapfb_check_var, ++ .fb_set_par = omapfb_set_par, ++ .fb_pan_display = omapfb_pan_display, ++ .fb_mmap = omapfb_mmap, ++ .fb_setcolreg = omapfb_setcolreg, ++ .fb_setcmap = omapfb_setcmap, ++ //.fb_write = omapfb_write, ++}; ++ ++static void omapfb_free_fbmem(struct fb_info *fbi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omapfb2_mem_region *rg; ++ ++ rg = &ofbi->region; ++ ++ if (rg->paddr) ++ if (omap_vram_free(rg->paddr, rg->size)) ++ dev_err(fbdev->dev, "VRAM FREE failed\n"); ++ ++ if (rg->vaddr) ++ iounmap(rg->vaddr); ++ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ /* unmap the 0 angle rotation */ ++ if (rg->vrfb.vaddr[0]) { ++ iounmap(rg->vrfb.vaddr[0]); ++ omap_vrfb_release_ctx(&rg->vrfb); ++ } ++ } ++ ++ rg->vaddr = NULL; ++ rg->paddr = 0; ++ rg->alloc = 0; ++ rg->size = 0; ++} ++ ++static int omapfb_free_all_fbmem(struct omapfb2_device *fbdev) ++{ ++ int i; ++ ++ DBG("free all fbmem\n"); ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ struct fb_info *fbi = fbdev->fbs[i]; ++ omapfb_free_fbmem(fbi); ++ memset(&fbi->fix, 0, sizeof(fbi->fix)); ++ memset(&fbi->var, 0, sizeof(fbi->var)); ++ } ++ ++ return 0; ++} ++ ++static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, ++ unsigned long paddr) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omapfb2_mem_region *rg; ++ void __iomem *vaddr; ++ int r; ++ int clear = 0; ++ ++ rg = &ofbi->region; ++ memset(rg, 0, sizeof(*rg)); ++ ++ size = PAGE_ALIGN(size); ++ ++ if (!paddr) { ++ DBG("allocating %lu bytes for fb %d\n", size, ofbi->id); ++ r = omap_vram_alloc(OMAPFB_MEMTYPE_SDRAM, size, &paddr); ++ clear = 1; ++ } else { ++ DBG("reserving %lu bytes at %lx for fb %d\n", size, paddr, ++ ofbi->id); ++ r = omap_vram_reserve(paddr, size); ++ } ++ ++ if (r) { ++ dev_err(fbdev->dev, "failed to allocate framebuffer\n"); ++ return -ENOMEM; ++ } ++ ++ if (ofbi->rotation_type != OMAPFB_ROT_VRFB) { ++ vaddr = ioremap_wc(paddr, size); ++ ++ if (!vaddr) { ++ dev_err(fbdev->dev, "failed to ioremap framebuffer\n"); ++ omap_vram_free(paddr, size); ++ return -ENOMEM; ++ } ++ ++ DBG("allocated VRAM paddr %lx, vaddr %p\n", paddr, vaddr); ++ ++ if (clear) ++ memset_io(vaddr, 0, size); ++ } else { ++ void __iomem *va; ++ ++ r = omap_vrfb_request_ctx(&rg->vrfb); ++ if (r) { ++ dev_err(fbdev->dev, "vrfb create ctx failed\n"); ++ return r; ++ } ++ ++ /* only ioremap the 0 angle view */ ++ va = ioremap_wc(rg->vrfb.paddr[0], size); ++ ++ if(!va) { ++ printk(KERN_ERR "vrfb: ioremap failed\n"); ++ return -ENOMEM; ++ } ++ ++ DBG("ioremapped vrfb area 0 to %p\n", va); ++ ++ rg->vrfb.vaddr[0] = va; ++ ++ vaddr = NULL; ++ ++ if (clear) ++ memset_io(va, 0, size); ++ } ++ ++ rg->paddr = paddr; ++ rg->vaddr = vaddr; ++ rg->size = size; ++ rg->alloc = 1; ++ ++ return 0; ++} ++ ++/* allocate fbmem using display resolution as reference */ ++static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size, ++ unsigned long paddr) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omap_display *display; ++ int bytespp; ++ ++ display = fb2display(fbi); ++ ++ if (!display) ++ return 0; ++ ++ switch (display->get_recommended_bpp(display)) { ++ case 16: ++ bytespp = 2; ++ break; ++ case 24: ++ bytespp = 4; ++ break; ++ default: ++ bytespp = 4; ++ break; ++ } ++ ++ if (!size) { ++ u16 w, h; ++ ++ display->get_resolution(display, &w, &h); ++ ++ if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ int oldw = w, oldh = h; ++ ++ omap_vrfb_adjust_size(&w, &h, bytespp); ++ ++ /* Because we change the resolution of the 0 degree view, ++ * we need to alloc max(w, h) for height */ ++ h = max(w, h); ++ w = OMAP_VRFB_LINE_LEN; ++ ++ DBG("adjusting fb mem size for VRFB, %dx%d -> %dx%d\n", ++ oldw, oldh, w, h); ++ } ++ ++ size = w * h * bytespp; ++ } ++ ++ return omapfb_alloc_fbmem(fbi, size, paddr); ++} ++ ++static int omapfb_parse_vram_param(const char *param, int max_entries, ++ unsigned long *sizes, unsigned long *paddrs) ++{ ++ int fbnum; ++ unsigned long size; ++ unsigned long paddr = 0; ++ char *p, *start; ++ ++ start = (char *)param; ++ ++ while (1) { ++ p = start; ++ ++ fbnum = simple_strtoul(p, &p, 10); ++ ++ if (p == param) ++ return -EINVAL; ++ ++ if (*p != ':') ++ return -EINVAL; ++ ++ if (fbnum >= max_entries) ++ return -EINVAL; ++ ++ size = memparse(p + 1, &p); ++ ++ if (!size) ++ return -EINVAL; ++ ++ paddr = 0; ++ ++ if (*p == '@') { ++ paddr = simple_strtoul(p + 1, &p, 16); ++ ++ if (!paddr) ++ return -EINVAL; ++ ++ } ++ ++ paddrs[fbnum] = paddr; ++ sizes[fbnum] = size; ++ ++ if (*p == 0) ++ break; ++ ++ if (*p != ',') ++ return -EINVAL; ++ ++ ++p; ++ ++ start = p; ++ } ++ ++ return 0; ++} ++ ++static int omapfb_allocate_all_fbs(struct omapfb2_device *fbdev) ++{ ++ int i, r; ++ unsigned long vram_sizes[10]; ++ unsigned long vram_paddrs[10]; ++ ++ memset(&vram_sizes, 0, sizeof(vram_sizes)); ++ memset(&vram_paddrs, 0, sizeof(vram_paddrs)); ++ ++ if (def_vram && omapfb_parse_vram_param(def_vram, 10, ++ vram_sizes, vram_paddrs)) { ++ dev_err(fbdev->dev, "failed to parse vram parameter\n"); ++ ++ memset(&vram_sizes, 0, sizeof(vram_sizes)); ++ memset(&vram_paddrs, 0, sizeof(vram_paddrs)); ++ } ++ ++ if (fbdev->dev->platform_data) { ++ struct omapfb_platform_data *opd; ++ opd = fbdev->dev->platform_data; ++ for (i = 0; i < opd->mem_desc.region_cnt; ++i) { ++ if (!vram_sizes[i]) { ++ unsigned long size; ++ unsigned long paddr; ++ ++ size = opd->mem_desc.region[i].size; ++ paddr = opd->mem_desc.region[i].paddr; ++ ++ vram_sizes[i] = size; ++ vram_paddrs[i] = paddr; ++ } ++ } ++ } ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ /* allocate memory automatically only for fb0, or if ++ * excplicitly defined with vram or plat data option */ ++ if (i == 0 || vram_sizes[i] != 0) { ++ r = omapfb_alloc_fbmem_display(fbdev->fbs[i], ++ vram_sizes[i], vram_paddrs[i]); ++ ++ if (r) ++ return r; ++ } ++ } ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); ++ struct omapfb2_mem_region *rg; ++ rg = &ofbi->region; ++ ++ DBG("region%d phys %08x virt %p size=%lu\n", ++ i, ++ rg->paddr, ++ rg->vaddr, ++ rg->size); ++ } ++ ++ return 0; ++} ++ ++int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_display *display = fb2display(fbi); ++ struct omapfb2_mem_region *rg = &ofbi->region; ++ unsigned long old_size = rg->size; ++ unsigned long old_paddr = rg->paddr; ++ int old_type = rg->type; ++ int r; ++ ++ if (type > OMAPFB_MEMTYPE_MAX) ++ return -EINVAL; ++ ++ size = PAGE_ALIGN(size); ++ ++ if (old_size == size && old_type == type) ++ return 0; ++ ++ if (display && display->sync) ++ display->sync(display); ++ ++ omapfb_free_fbmem(fbi); ++ ++ if (size == 0) { ++ memset(&fbi->fix, 0, sizeof(fbi->fix)); ++ memset(&fbi->var, 0, sizeof(fbi->var)); ++ return 0; ++ } ++ ++ r = omapfb_alloc_fbmem(fbi, size, 0); ++ ++ if (r) { ++ if (old_size) ++ omapfb_alloc_fbmem(fbi, old_size, old_paddr); ++ ++ if (rg->size == 0) { ++ memset(&fbi->fix, 0, sizeof(fbi->fix)); ++ memset(&fbi->var, 0, sizeof(fbi->var)); ++ } ++ ++ return r; ++ } ++ ++ if (old_size == size) ++ return 0; ++ ++ if (old_size == 0) { ++ DBG("initializing fb %d\n", ofbi->id); ++ r = omapfb_fb_init(fbdev, fbi); ++ if (r) { ++ DBG("omapfb_fb_init failed\n"); ++ goto err; ++ } ++ r = omapfb_apply_changes(fbi, 1); ++ if (r) { ++ DBG("omapfb_apply_changes failed\n"); ++ goto err; ++ } ++ } else { ++ struct fb_var_screeninfo new_var; ++ memcpy(&new_var, &fbi->var, sizeof(new_var)); ++ r = check_fb_var(fbi, &new_var); ++ if (r) ++ goto err; ++ memcpy(&fbi->var, &new_var, sizeof(fbi->var)); ++ set_fb_fix(fbi); ++ } ++ ++ return 0; ++err: ++ omapfb_free_fbmem(fbi); ++ memset(&fbi->fix, 0, sizeof(fbi->fix)); ++ memset(&fbi->var, 0, sizeof(fbi->var)); ++ return r; ++} ++ ++/* initialize fb_info, var, fix to something sane based on the display */ ++int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi) ++{ ++ struct fb_var_screeninfo *var = &fbi->var; ++ struct fb_fix_screeninfo *fix = &fbi->fix; ++ struct omap_display *display = fb2display(fbi); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ int r = 0; ++ ++ fbi->fbops = &omapfb_ops; ++ fbi->flags = FBINFO_FLAG_DEFAULT; ++ fbi->pseudo_palette = fbdev->pseudo_palette; ++ ++ strncpy(fix->id, MODULE_NAME, sizeof(fix->id)); ++ ++ if (ofbi->region.size == 0) { ++ memset(&fbi->fix, 0, sizeof(fbi->fix)); ++ memset(&fbi->var, 0, sizeof(fbi->var)); ++ return 0; ++ } ++ ++ var->nonstd = 0; ++ ++ var->rotate = ofbi->rotation; ++ ++ if (display) { ++ u16 w, h; ++ display->get_resolution(display, &w, &h); ++ ++ if (ofbi->rotation == FB_ROTATE_CW || ++ ofbi->rotation == FB_ROTATE_CCW) { ++ var->xres = h; ++ var->yres = w; ++ } else { ++ var->xres = w; ++ var->yres = h; ++ } ++ ++ var->xres_virtual = var->xres; ++ var->yres_virtual = var->yres; ++ ++ switch (display->get_recommended_bpp(display)) { ++ case 16: ++ var->bits_per_pixel = 16; ++ break; ++ case 24: ++ var->bits_per_pixel = 32; ++ break; ++ default: ++ dev_err(fbdev->dev, "illegal display bpp\n"); ++ return -EINVAL; ++ } ++ } else { ++ /* if there's no display, let's just guess some basic values */ ++ var->xres = 320; ++ var->yres = 240; ++ var->xres_virtual = var->xres; ++ var->yres_virtual = var->yres; ++ var->bits_per_pixel = 16; ++ } ++ ++ r = check_fb_var(fbi, var); ++ if (r) ++ goto err; ++ ++ set_fb_fix(fbi); ++err: ++ return r; ++} ++ ++static void fbinfo_cleanup(struct omapfb2_device *fbdev, struct fb_info *fbi) ++{ ++ fb_dealloc_cmap(&fbi->cmap); ++} ++ ++ ++static void omapfb_free_resources(struct omapfb2_device *fbdev) ++{ ++ int i; ++ ++ DBG("free_resources\n"); ++ ++ if (fbdev == NULL) ++ return; ++ ++ for (i = 0; i < fbdev->num_fbs; i++) ++ unregister_framebuffer(fbdev->fbs[i]); ++ ++ /* free the reserved fbmem */ ++ omapfb_free_all_fbmem(fbdev); ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ fbinfo_cleanup(fbdev, fbdev->fbs[i]); ++ framebuffer_release(fbdev->fbs[i]); ++ } ++ ++ for (i = 0; i < fbdev->num_displays; i++) { ++ if (fbdev->displays[i]->state != OMAP_DSS_DISPLAY_DISABLED) ++ fbdev->displays[i]->disable(fbdev->displays[i]); ++ ++ omap_dss_put_display(fbdev->displays[i]); ++ } ++ ++ dev_set_drvdata(fbdev->dev, NULL); ++ kfree(fbdev); ++} ++ ++static int omapfb_create_framebuffers(struct omapfb2_device *fbdev) ++{ ++ int r, i; ++ ++ fbdev->num_fbs = 0; ++ ++ DBG("create %d framebuffers\n", CONFIG_FB_OMAP2_NUM_FBS); ++ ++ /* allocate fb_infos */ ++ for (i = 0; i < CONFIG_FB_OMAP2_NUM_FBS; i++) { ++ struct fb_info *fbi; ++ struct omapfb_info *ofbi; ++ ++ fbi = framebuffer_alloc(sizeof(struct omapfb_info), ++ fbdev->dev); ++ ++ if (fbi == NULL) { ++ dev_err(fbdev->dev, ++ "unable to allocate memory for plane info\n"); ++ return -ENOMEM; ++ } ++ ++ fbdev->fbs[i] = fbi; ++ ++ ofbi = FB2OFB(fbi); ++ ofbi->fbdev = fbdev; ++ ofbi->id = i; ++ ++ /* assign these early, so that fb alloc can use them */ ++ ofbi->rotation_type = def_vrfb ? OMAPFB_ROT_VRFB : ++ OMAPFB_ROT_DMA; ++ ofbi->rotation = def_rotate; ++ ofbi->mirror = def_mirror; ++ ++ fbdev->num_fbs++; ++ } ++ ++ DBG("fb_infos allocated\n"); ++ ++ /* assign overlays for the fbs */ ++ for (i = 0; i < min(fbdev->num_fbs, fbdev->num_overlays); i++) { ++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); ++ ++ ofbi->overlays[0] = fbdev->overlays[i]; ++ ofbi->num_overlays = 1; ++ } ++ ++ /* allocate fb memories */ ++ r = omapfb_allocate_all_fbs(fbdev); ++ if (r) { ++ dev_err(fbdev->dev, "failed to allocate fbmem\n"); ++ return r; ++ } ++ ++ DBG("fbmems allocated\n"); ++ ++ /* setup fb_infos */ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ r = omapfb_fb_init(fbdev, fbdev->fbs[i]); ++ if (r) { ++ dev_err(fbdev->dev, "failed to setup fb_info\n"); ++ return r; ++ } ++ } ++ ++ DBG("fb_infos initialized\n"); ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ r = register_framebuffer(fbdev->fbs[i]); ++ if (r != 0) { ++ dev_err(fbdev->dev, ++ "registering framebuffer %d failed\n", i); ++ return r; ++ } ++ } ++ ++ DBG("framebuffers registered\n"); ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ r = omapfb_apply_changes(fbdev->fbs[i], 1); ++ if (r) { ++ dev_err(fbdev->dev, "failed to change mode\n"); ++ return r; ++ } ++ } ++ ++ DBG("create sysfs for fbs\n"); ++ r = omapfb_create_sysfs(fbdev); ++ if (r) { ++ dev_err(fbdev->dev, "failed to create sysfs entries\n"); ++ return r; ++ } ++ ++ /* Enable fb0 */ ++ if (fbdev->num_fbs > 0) { ++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[0]); ++ ++ if (ofbi->num_overlays > 0 ) { ++ struct omap_overlay *ovl = ofbi->overlays[0]; ++ ++ r = omapfb_overlay_enable(ovl, 1); ++ ++ if (r) { ++ dev_err(fbdev->dev, ++ "failed to enable overlay\n"); ++ return r; ++ } ++ } ++ } ++ ++ DBG("create_framebuffers done\n"); ++ ++ return 0; ++} ++ ++int omapfb_mode_to_timings(const char *mode_str, ++ struct omap_video_timings *timings, u8 *bpp) ++{ ++ struct fb_info fbi; ++ struct fb_var_screeninfo var; ++ struct fb_ops fbops; ++ int r; ++ ++#ifdef CONFIG_OMAP2_DSS_VENC ++ if (strcmp(mode_str, "pal") == 0) { ++ *timings = omap_dss_pal_timings; ++ *bpp = 0; ++ return 0; ++ } else if (strcmp(mode_str, "ntsc") == 0) { ++ *timings = omap_dss_ntsc_timings; ++ *bpp = 0; ++ return 0; ++ } ++#endif ++ ++ /* this is quite a hack, but I wanted to use the modedb and for ++ * that we need fb_info and var, so we create dummy ones */ ++ ++ memset(&fbi, 0, sizeof(fbi)); ++ memset(&var, 0, sizeof(var)); ++ memset(&fbops, 0, sizeof(fbops)); ++ fbi.fbops = &fbops; ++ ++ r = fb_find_mode(&var, &fbi, mode_str, NULL, 0, NULL, 24); ++ ++ if (r != 0) { ++ timings->pixel_clock = PICOS2KHZ(var.pixclock); ++ timings->hfp = var.left_margin; ++ timings->hbp = var.right_margin; ++ timings->vfp = var.upper_margin; ++ timings->vbp = var.lower_margin; ++ timings->hsw = var.hsync_len; ++ timings->vsw = var.vsync_len; ++ timings->x_res = var.xres; ++ timings->y_res = var.yres; ++ ++ switch (var.bits_per_pixel) { ++ case 16: ++ *bpp = 16; ++ break; ++ case 24: ++ case 32: ++ default: ++ *bpp = 24; ++ break; ++ } ++ ++ return 0; ++ } else { ++ return -EINVAL; ++ } ++} ++ ++static int omapfb_set_def_mode(struct omap_display *display, char *mode_str) ++{ ++ int r; ++ u8 bpp; ++ struct omap_video_timings timings; ++ ++ r = omapfb_mode_to_timings(mode_str, &timings, &bpp); ++ if (r) ++ return r; ++ ++ display->panel->recommended_bpp = bpp; ++ ++ if (!display->check_timings || !display->set_timings) ++ return -EINVAL; ++ ++ r = display->check_timings(display, &timings); ++ if (r) ++ return r; ++ ++ display->set_timings(display, &timings); ++ ++ return 0; ++} ++ ++static int omapfb_parse_def_modes(struct omapfb2_device *fbdev) ++{ ++ char *str, *options, *this_opt; ++ int r = 0; ++ ++ str = kmalloc(strlen(def_mode) + 1, GFP_KERNEL); ++ strcpy(str, def_mode); ++ options = str; ++ ++ while (!r && (this_opt = strsep(&options, ",")) != NULL) { ++ char *p, *display_str, *mode_str; ++ struct omap_display *display; ++ int i; ++ ++ p = strchr(this_opt, ':'); ++ if (!p) { ++ r = -EINVAL; ++ break; ++ } ++ ++ *p = 0; ++ display_str = this_opt; ++ mode_str = p + 1; ++ ++ display = NULL; ++ for (i = 0; i < fbdev->num_displays; ++i) { ++ if (strcmp(fbdev->displays[i]->name, ++ display_str) == 0) { ++ display = fbdev->displays[i]; ++ break; ++ } ++ } ++ ++ if (!display) { ++ r = -EINVAL; ++ break; ++ } ++ ++ r = omapfb_set_def_mode(display, mode_str); ++ if (r) ++ break; ++ } ++ ++ kfree(str); ++ ++ return r; ++} ++ ++static int omapfb_probe(struct platform_device *pdev) ++{ ++ struct omapfb2_device *fbdev = NULL; ++ int r = 0; ++ int i, t; ++ struct omap_overlay *ovl; ++ struct omap_display *def_display; ++ ++ DBG("omapfb_probe\n"); ++ ++ if (pdev->num_resources != 0) { ++ dev_err(&pdev->dev, "probed for an unknown device\n"); ++ r = -ENODEV; ++ goto err0; ++ } ++ ++ fbdev = kzalloc(sizeof(struct omapfb2_device), GFP_KERNEL); ++ if (fbdev == NULL) { ++ r = -ENOMEM; ++ goto err0; ++ } ++ ++ mutex_init(&fbdev->mtx); ++ ++ fbdev->dev = &pdev->dev; ++ platform_set_drvdata(pdev, fbdev); ++ ++ fbdev->num_displays = 0; ++ t = omap_dss_get_num_displays(); ++ for (i = 0; i < t; i++) { ++ struct omap_display *display; ++ display = omap_dss_get_display(i); ++ if (!display) { ++ dev_err(&pdev->dev, "can't get display %d\n", i); ++ r = -EINVAL; ++ goto cleanup; ++ } ++ ++ fbdev->displays[fbdev->num_displays++] = display; ++ } ++ ++ if (fbdev->num_displays == 0) { ++ dev_err(&pdev->dev, "no displays\n"); ++ r = -EINVAL; ++ goto cleanup; ++ } ++ ++ fbdev->num_overlays = omap_dss_get_num_overlays(); ++ for (i = 0; i < fbdev->num_overlays; i++) ++ fbdev->overlays[i] = omap_dss_get_overlay(i); ++ ++ fbdev->num_managers = omap_dss_get_num_overlay_managers(); ++ for (i = 0; i < fbdev->num_managers; i++) ++ fbdev->managers[i] = omap_dss_get_overlay_manager(i); ++ ++ ++ /* gfx overlay should be the default one. find a display ++ * connected to that, and use it as default display */ ++ ovl = omap_dss_get_overlay(0); ++ if (ovl->manager && ovl->manager->display) { ++ def_display = ovl->manager->display; ++ } else { ++ dev_err(&pdev->dev, "cannot find default display\n"); ++ r = -EINVAL; ++ goto cleanup; ++ } ++ ++ if (def_mode && strlen(def_mode) > 0) { ++ if (omapfb_parse_def_modes(fbdev)) ++ dev_err(&pdev->dev, "cannot parse default modes\n"); ++ } ++ ++ r = omapfb_create_framebuffers(fbdev); ++ if (r) ++ goto cleanup; ++ ++ for (i = 0; i < fbdev->num_managers; i++) { ++ struct omap_overlay_manager *mgr; ++ mgr = fbdev->managers[i]; ++ r = mgr->apply(mgr); ++ if (r) { ++ dev_err(fbdev->dev, "failed to apply dispc config\n"); ++ goto cleanup; ++ } ++ } ++ ++ DBG("mgr->apply'ed\n"); ++ ++ r = def_display->enable(def_display); ++ if (r) { ++ dev_err(fbdev->dev, "Failed to enable display '%s'\n", ++ def_display->name); ++ goto cleanup; ++ } ++ ++ /* set the update mode */ ++ if (def_display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { ++#ifdef CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE ++ if (def_display->set_update_mode) ++ def_display->set_update_mode(def_display, ++ OMAP_DSS_UPDATE_AUTO); ++ if (def_display->enable_te) ++ def_display->enable_te(def_display, 1); ++#else ++ if (def_display->set_update_mode) ++ def_display->set_update_mode(def_display, ++ OMAP_DSS_UPDATE_MANUAL); ++ if (def_display->enable_te) ++ def_display->enable_te(def_display, 0); ++#endif ++ } else { ++ if (def_display->set_update_mode) ++ def_display->set_update_mode(def_display, ++ OMAP_DSS_UPDATE_AUTO); ++ } ++ ++ for (i = 0; i < fbdev->num_displays; i++) { ++ struct omap_display *display = fbdev->displays[i]; ++ u16 w, h; ++ ++ if (!display->get_update_mode || !display->update) ++ continue; ++ ++ if (display->get_update_mode(display) == ++ OMAP_DSS_UPDATE_MANUAL) { ++ ++ display->get_resolution(display, &w, &h); ++ display->update(display, 0, 0, w, h); ++ } ++ } ++ ++ DBG("display->updated\n"); ++ ++ return 0; ++ ++cleanup: ++ omapfb_free_resources(fbdev); ++err0: ++ dev_err(&pdev->dev, "failed to setup omapfb\n"); ++ return r; ++} ++ ++static int omapfb_remove(struct platform_device *pdev) ++{ ++ struct omapfb2_device *fbdev = platform_get_drvdata(pdev); ++ ++ /* FIXME: wait till completion of pending events */ ++ ++ omapfb_remove_sysfs(fbdev); ++ ++ omapfb_free_resources(fbdev); ++ ++ return 0; ++} ++ ++static struct platform_driver omapfb_driver = { ++ .probe = omapfb_probe, ++ .remove = omapfb_remove, ++ .driver = { ++ .name = "omapfb", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init omapfb_init(void) ++{ ++ DBG("omapfb_init\n"); ++ ++ if (platform_driver_register(&omapfb_driver)) { ++ printk(KERN_ERR "failed to register omapfb driver\n"); ++ return -ENODEV; ++ } ++ ++ return 0; ++} ++ ++static void __exit omapfb_exit(void) ++{ ++ DBG("omapfb_exit\n"); ++ platform_driver_unregister(&omapfb_driver); ++} ++ ++module_param_named(mode, def_mode, charp, 0); ++module_param_named(vram, def_vram, charp, 0); ++module_param_named(rotate, def_rotate, int, 0); ++module_param_named(vrfb, def_vrfb, bool, 0); ++module_param_named(mirror, def_mirror, bool, 0); ++ ++/* late_initcall to let panel/ctrl drivers loaded first. ++ * I guess better option would be a more dynamic approach, ++ * so that omapfb reacts to new panels when they are loaded */ ++late_initcall(omapfb_init); ++/*module_init(omapfb_init);*/ ++module_exit(omapfb_exit); ++ ++MODULE_AUTHOR("Tomi Valkeinen "); ++MODULE_DESCRIPTION("OMAP2/3 Framebuffer"); ++MODULE_LICENSE("GPL v2"); +diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c +new file mode 100644 +index 0000000..2c88718 +--- /dev/null ++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c +@@ -0,0 +1,371 @@ ++/* ++ * linux/drivers/video/omap2/omapfb-sysfs.c ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "omapfb.h" ++ ++static ssize_t show_rotate_type(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ofbi->rotation_type); ++} ++ ++static ssize_t show_mirror(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ ++ return snprintf(buf, PAGE_SIZE, "%d\n", ofbi->mirror); ++} ++ ++static ssize_t store_mirror(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ bool mirror; ++ int r; ++ struct fb_var_screeninfo new_var; ++ ++ mirror = simple_strtoul(buf, NULL, 0); ++ ++ if (mirror != 0 && mirror != 1) ++ return -EINVAL; ++ ++ omapfb_lock(fbdev); ++ ++ ofbi->mirror = mirror; ++ ++ memcpy(&new_var, &fbi->var, sizeof(new_var)); ++ r = check_fb_var(fbi, &new_var); ++ if (r) ++ goto out; ++ memcpy(&fbi->var, &new_var, sizeof(fbi->var)); ++ ++ set_fb_fix(fbi); ++ ++ r = omapfb_apply_changes(fbi, 0); ++ if (r) ++ goto out; ++ ++ r = count; ++out: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static ssize_t show_overlays(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ ssize_t l = 0; ++ int t; ++ ++ for (t = 0; t < ofbi->num_overlays; t++) { ++ struct omap_overlay *ovl = ofbi->overlays[t]; ++ int ovlnum; ++ ++ for (ovlnum = 0; ovlnum < fbdev->num_overlays; ++ovlnum) ++ if (ovl == fbdev->overlays[ovlnum]) ++ break; ++ ++ l += snprintf(buf + l, PAGE_SIZE - l, "%s%d", ++ t == 0 ? "" : ",", ovlnum); ++ } ++ ++ l += snprintf(buf + l, PAGE_SIZE - l, "\n"); ++ ++ return l; ++} ++ ++static struct omapfb_info *get_overlay_fb(struct omapfb2_device *fbdev, ++ struct omap_overlay *ovl) ++{ ++ int i, t; ++ ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]); ++ ++ for (t = 0; t < ofbi->num_overlays; t++) { ++ if (ofbi->overlays[t] == ovl) ++ return ofbi; ++ } ++ } ++ ++ return NULL; ++} ++ ++static ssize_t store_overlays(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ struct omap_overlay *ovls[OMAPFB_MAX_OVL_PER_FB]; ++ struct omap_overlay *ovl; ++ int num_ovls, r, i; ++ int len; ++ ++ num_ovls = 0; ++ ++ len = strlen(buf); ++ if (buf[len - 1] == '\n') ++ len = len - 1; ++ ++ omapfb_lock(fbdev); ++ ++ if (len > 0) { ++ char *p = (char *)buf; ++ int ovlnum; ++ ++ while (p < buf + len) { ++ int found; ++ if (num_ovls == OMAPFB_MAX_OVL_PER_FB) { ++ r = -EINVAL; ++ goto out; ++ } ++ ++ ovlnum = simple_strtoul(p, &p, 0); ++ if (ovlnum > fbdev->num_overlays) { ++ r = -EINVAL; ++ goto out; ++ } ++ ++ found = 0; ++ for (i = 0; i < num_ovls; ++i) { ++ if (ovls[i] == fbdev->overlays[ovlnum]) { ++ found = 1; ++ break; ++ } ++ } ++ ++ if (!found) ++ ovls[num_ovls++] = fbdev->overlays[ovlnum]; ++ ++ p++; ++ } ++ } ++ ++ for (i = 0; i < num_ovls; ++i) { ++ struct omapfb_info *ofbi2 = get_overlay_fb(fbdev, ovls[i]); ++ if (ofbi2 && ofbi2 != ofbi) { ++ dev_err(fbdev->dev, "overlay already in use\n"); ++ r = -EINVAL; ++ goto out; ++ } ++ } ++ ++ /* detach unused overlays */ ++ for (i = 0; i < ofbi->num_overlays; ++i) { ++ int t, found; ++ ++ ovl = ofbi->overlays[i]; ++ ++ found = 0; ++ ++ for (t = 0; t < num_ovls; ++t) { ++ if (ovl == ovls[t]) { ++ found = 1; ++ break; ++ } ++ } ++ ++ if (found) ++ continue; ++ ++ DBG("detaching %d\n", ofbi->overlays[i]->id); ++ ++ omapfb_overlay_enable(ovl, 0); ++ ++ if (ovl->manager) ++ ovl->manager->apply(ovl->manager); ++ ++ for (t = i + 1; t < ofbi->num_overlays; t++) ++ ofbi->overlays[t-1] = ofbi->overlays[t]; ++ ++ ofbi->num_overlays--; ++ i--; ++ } ++ ++ for (i = 0; i < num_ovls; ++i) { ++ int t, found; ++ ++ ovl = ovls[i]; ++ ++ found = 0; ++ ++ for (t = 0; t < ofbi->num_overlays; ++t) { ++ if (ovl == ofbi->overlays[t]) { ++ found = 1; ++ break; ++ } ++ } ++ ++ if (found) ++ continue; ++ ++ ofbi->overlays[ofbi->num_overlays++] = ovl; ++ ++ r = omapfb_apply_changes(fbi, 1); ++ if (r) ++ goto out; ++ ++ if (ovl->manager) { ++ r = ovl->manager->apply(ovl->manager); ++ if (r) ++ goto out; ++ } ++ } ++ ++ r = count; ++out: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static ssize_t show_size(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ ++ return snprintf(buf, PAGE_SIZE, "%lu\n", ofbi->region.size); ++} ++ ++static ssize_t store_size(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ unsigned long size; ++ int r; ++ int i; ++ ++ size = PAGE_ALIGN(simple_strtoul(buf, NULL, 0)); ++ ++ omapfb_lock(fbdev); ++ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ if (ofbi->overlays[i]->info.enabled) { ++ r = -EBUSY; ++ goto out; ++ } ++ } ++ ++ if (size != ofbi->region.size) { ++ r = omapfb_realloc_fbmem(fbi, size, ofbi->region.type); ++ if (r) { ++ dev_err(dev, "realloc fbmem failed\n"); ++ goto out; ++ } ++ } ++ ++ r = count; ++out: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++static ssize_t show_phys(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ ++ return snprintf(buf, PAGE_SIZE, "%0x\n", ofbi->region.paddr); ++} ++ ++static ssize_t show_virt(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ ++ return snprintf(buf, PAGE_SIZE, "%p\n", ofbi->region.vaddr); ++} ++ ++static struct device_attribute omapfb_attrs[] = { ++ __ATTR(rotate_type, S_IRUGO, show_rotate_type, NULL), ++ __ATTR(mirror, S_IRUGO | S_IWUSR, show_mirror, store_mirror), ++ __ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size), ++ __ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays), ++ __ATTR(phys_addr, S_IRUGO, show_phys, NULL), ++ __ATTR(virt_addr, S_IRUGO, show_virt, NULL), ++}; ++ ++int omapfb_create_sysfs(struct omapfb2_device *fbdev) ++{ ++ int i; ++ int r; ++ ++ DBG("create sysfs for fbs\n"); ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ int t; ++ for (t = 0; t < ARRAY_SIZE(omapfb_attrs); t++) { ++ r = device_create_file(fbdev->fbs[i]->dev, ++ &omapfb_attrs[t]); ++ ++ if (r) { ++ dev_err(fbdev->dev, "failed to create sysfs file\n"); ++ return r; ++ } ++ } ++ } ++ ++ return 0; ++} ++ ++void omapfb_remove_sysfs(struct omapfb2_device *fbdev) ++{ ++ int i, t; ++ ++ DBG("remove sysfs for fbs\n"); ++ for (i = 0; i < fbdev->num_fbs; i++) { ++ for (t = 0; t < ARRAY_SIZE(omapfb_attrs); t++) ++ device_remove_file(fbdev->fbs[i]->dev, ++ &omapfb_attrs[t]); ++ } ++} ++ +diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h +new file mode 100644 +index 0000000..65e9e6e +--- /dev/null ++++ b/drivers/video/omap2/omapfb/omapfb.h +@@ -0,0 +1,153 @@ ++/* ++ * linux/drivers/video/omap2/omapfb.h ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * Some code and ideas taken from drivers/video/omap/ driver ++ * by Imre Deak. ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#ifndef __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ ++#define __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ ++ ++#ifdef CONFIG_FB_OMAP2_DEBUG_SUPPORT ++#define DEBUG ++#endif ++ ++#ifdef DEBUG ++extern unsigned int omapfb_debug; ++#define DBG(format, ...) \ ++ if (omapfb_debug) \ ++ printk(KERN_DEBUG "OMAPFB: " format, ## __VA_ARGS__) ++#else ++#define DBG(format, ...) ++#endif ++ ++#define FB2OFB(fb_info) ((struct omapfb_info *)(fb_info->par)) ++ ++/* max number of overlays to which a framebuffer data can be direct */ ++#define OMAPFB_MAX_OVL_PER_FB 3 ++ ++struct omapfb2_mem_region { ++ u32 paddr; ++ void __iomem *vaddr; ++ struct vrfb vrfb; ++ unsigned long size; ++ u8 type; /* OMAPFB_PLANE_MEM_* */ ++ bool alloc; /* allocated by the driver */ ++ bool map; /* kernel mapped by the driver */ ++}; ++ ++enum omapfb_rotation_type { ++ OMAPFB_ROT_DMA = 0, ++ OMAPFB_ROT_VRFB = 1, ++}; ++ ++/* appended to fb_info */ ++struct omapfb_info { ++ int id; ++ struct omapfb2_mem_region region; ++ atomic_t map_count; ++ int num_overlays; ++ struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB]; ++ struct omapfb2_device *fbdev; ++ enum omapfb_rotation_type rotation_type; ++ u8 rotation; ++ bool mirror; ++}; ++ ++struct omapfb2_device { ++ struct device *dev; ++ struct mutex mtx; ++ ++ u32 pseudo_palette[17]; ++ ++ int state; ++ ++ unsigned num_fbs; ++ struct fb_info *fbs[10]; ++ ++ unsigned num_displays; ++ struct omap_display *displays[10]; ++ unsigned num_overlays; ++ struct omap_overlay *overlays[10]; ++ unsigned num_managers; ++ struct omap_overlay_manager *managers[10]; ++}; ++ ++struct omapfb_colormode { ++ enum omap_color_mode dssmode; ++ u32 bits_per_pixel; ++ u32 nonstd; ++ struct fb_bitfield red; ++ struct fb_bitfield green; ++ struct fb_bitfield blue; ++ struct fb_bitfield transp; ++}; ++ ++u32 omapfb_get_region_paddr(struct omapfb_info *ofbi); ++void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi); ++ ++void set_fb_fix(struct fb_info *fbi); ++int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var); ++int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type); ++int omapfb_apply_changes(struct fb_info *fbi, int init); ++int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi); ++ ++int omapfb_create_sysfs(struct omapfb2_device *fbdev); ++void omapfb_remove_sysfs(struct omapfb2_device *fbdev); ++ ++int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg); ++ ++int omapfb_mode_to_timings(const char *mode_str, ++ struct omap_video_timings *timings, u8 *bpp); ++ ++/* find the display connected to this fb, if any */ ++static inline struct omap_display *fb2display(struct fb_info *fbi) ++{ ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ int i; ++ ++ /* XXX: returns the display connected to first attached overlay */ ++ for (i = 0; i < ofbi->num_overlays; i++) { ++ if (ofbi->overlays[i]->manager) ++ return ofbi->overlays[i]->manager->display; ++ } ++ ++ return NULL; ++} ++ ++static inline void omapfb_lock(struct omapfb2_device *fbdev) ++{ ++ mutex_lock(&fbdev->mtx); ++} ++ ++static inline void omapfb_unlock(struct omapfb2_device *fbdev) ++{ ++ mutex_unlock(&fbdev->mtx); ++} ++ ++static inline int omapfb_overlay_enable(struct omap_overlay *ovl, ++ int enable) ++{ ++ struct omap_overlay_info info; ++ ++ ovl->get_overlay_info(ovl, &info); ++ info.enabled = enable; ++ return ovl->set_overlay_info(ovl, &info); ++} ++ ++#endif +diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h +index b226bdf..96190b2 100644 +--- a/include/linux/omapfb.h ++++ b/include/linux/omapfb.h +@@ -50,6 +50,8 @@ + #define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) + #define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) + #define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) ++#define OMAPFB_WAITFORVSYNC OMAP_IO(57) ++#define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read) + + #define OMAPFB_CAPS_GENERIC_MASK 0x00000fff + #define OMAPFB_CAPS_LCDC_MASK 0x00fff000 +@@ -90,6 +92,13 @@ enum omapfb_color_format { + OMAPFB_COLOR_CLUT_1BPP, + OMAPFB_COLOR_RGB444, + OMAPFB_COLOR_YUY422, ++ ++ OMAPFB_COLOR_ARGB16, ++ OMAPFB_COLOR_RGB24U, /* RGB24, 32-bit container */ ++ OMAPFB_COLOR_RGB24P, /* RGB24, 24-bit container */ ++ OMAPFB_COLOR_ARGB32, ++ OMAPFB_COLOR_RGBA32, ++ OMAPFB_COLOR_RGBX32, + }; + + struct omapfb_update_window { +@@ -161,6 +170,15 @@ enum omapfb_update_mode { + OMAPFB_MANUAL_UPDATE + }; + ++struct omapfb_memory_read { ++ __u16 x; ++ __u16 y; ++ __u16 w; ++ __u16 h; ++ size_t buffer_size; ++ void __user *buffer; ++}; ++ + #ifdef __KERNEL__ + + #include +@@ -376,6 +394,8 @@ extern struct lcd_ctrl omap1_lcd_ctrl; + extern struct lcd_ctrl omap2_disp_ctrl; + #endif + ++extern void omapfb_set_platform_data(struct omapfb_platform_data *data); ++ + extern void omapfb_reserve_sdram(void); + extern void omapfb_register_panel(struct lcd_panel *panel); + extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0005-DSS2-Add-panel-drivers.patch b/recipes/linux/linux-omap-2.6.29/dss2/0005-DSS2-Add-panel-drivers.patch new file mode 100644 index 0000000000..835298f40a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0005-DSS2-Add-panel-drivers.patch @@ -0,0 +1,396 @@ +From 4cc0368574f587f448231ccd121266bed4bf9729 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 10:29:56 +0300 +Subject: [PATCH] DSS2: Add panel drivers + +- Generic panel +- Samsung LTE430WQ-F0C LCD Panel +- Sharp LS037V7DW01 LCD Panel + +Signed-off-by: Tomi Valkeinen +--- + drivers/video/omap2/displays/Kconfig | 21 ++++ + drivers/video/omap2/displays/Makefile | 3 + + drivers/video/omap2/displays/panel-generic.c | 96 +++++++++++++++++ + .../omap2/displays/panel-samsung-lte430wq-f0c.c | 108 +++++++++++++++++++ + .../video/omap2/displays/panel-sharp-ls037v7dw01.c | 112 ++++++++++++++++++++ + 5 files changed, 340 insertions(+), 0 deletions(-) + create mode 100644 drivers/video/omap2/displays/Kconfig + create mode 100644 drivers/video/omap2/displays/Makefile + create mode 100644 drivers/video/omap2/displays/panel-generic.c + create mode 100644 drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c + create mode 100644 drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c + +diff --git a/drivers/video/omap2/displays/Kconfig b/drivers/video/omap2/displays/Kconfig +new file mode 100644 +index 0000000..0419ec8 +--- /dev/null ++++ b/drivers/video/omap2/displays/Kconfig +@@ -0,0 +1,21 @@ ++menu "OMAP2/3 Display Device Drivers" ++ depends on OMAP2_DSS ++ ++config PANEL_GENERIC ++ tristate "Generic Panel" ++ help ++ Generic panel driver. ++ Used for DVI output for Beagle and OMAP3 SDP. ++ ++config PANEL_SAMSUNG_LTE430WQ_F0C ++ tristate "Samsung LTE430WQ-F0C LCD Panel" ++ depends on OMAP2_DSS ++ help ++ LCD Panel used on Overo Palo43 ++ ++config PANEL_SHARP_LS037V7DW01 ++ tristate "Sharp LS037V7DW01 LCD Panel" ++ depends on OMAP2_DSS ++ help ++ LCD Panel used in TI's SDP3430 and EVM boards ++endmenu +diff --git a/drivers/video/omap2/displays/Makefile b/drivers/video/omap2/displays/Makefile +new file mode 100644 +index 0000000..a26bbd2 +--- /dev/null ++++ b/drivers/video/omap2/displays/Makefile +@@ -0,0 +1,3 @@ ++obj-$(CONFIG_PANEL_GENERIC) += panel-generic.o ++obj-$(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C) += panel-samsung-lte430wq-f0c.o ++obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o +diff --git a/drivers/video/omap2/displays/panel-generic.c b/drivers/video/omap2/displays/panel-generic.c +new file mode 100644 +index 0000000..8382acb +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-generic.c +@@ -0,0 +1,96 @@ ++/* ++ * Generic panel support ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++ ++#include ++ ++static int generic_panel_init(struct omap_display *display) ++{ ++ return 0; ++} ++ ++static int generic_panel_enable(struct omap_display *display) ++{ ++ int r = 0; ++ ++ if (display->hw_config.panel_enable) ++ r = display->hw_config.panel_enable(display); ++ ++ return r; ++} ++ ++static void generic_panel_disable(struct omap_display *display) ++{ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++} ++ ++static int generic_panel_suspend(struct omap_display *display) ++{ ++ generic_panel_disable(display); ++ return 0; ++} ++ ++static int generic_panel_resume(struct omap_display *display) ++{ ++ return generic_panel_enable(display); ++} ++ ++static struct omap_panel generic_panel = { ++ .owner = THIS_MODULE, ++ .name = "panel-generic", ++ .init = generic_panel_init, ++ .enable = generic_panel_enable, ++ .disable = generic_panel_disable, ++ .suspend = generic_panel_suspend, ++ .resume = generic_panel_resume, ++ ++ .timings = { ++ /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */ ++ .x_res = 640, ++ .y_res = 480, ++ .pixel_clock = 23500, ++ .hfp = 48, ++ .hsw = 32, ++ .hbp = 80, ++ .vfp = 3, ++ .vsw = 4, ++ .vbp = 7, ++ }, ++ ++ .config = OMAP_DSS_LCD_TFT, ++}; ++ ++ ++static int __init generic_panel_drv_init(void) ++{ ++ omap_dss_register_panel(&generic_panel); ++ return 0; ++} ++ ++static void __exit generic_panel_drv_exit(void) ++{ ++ omap_dss_unregister_panel(&generic_panel); ++} ++ ++module_init(generic_panel_drv_init); ++module_exit(generic_panel_drv_exit); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c +new file mode 100644 +index 0000000..e4bb781 +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c +@@ -0,0 +1,108 @@ ++/* ++ * LCD panel driver for Samsung LTE430WQ-F0C ++ * ++ * Author: Steve Sakoman ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++ ++#include ++ ++static int samsung_lte_panel_init(struct omap_display *display) ++{ ++ return 0; ++} ++ ++static void samsung_lte_panel_cleanup(struct omap_display *display) ++{ ++} ++ ++static int samsung_lte_panel_enable(struct omap_display *display) ++{ ++ int r = 0; ++ ++ /* wait couple of vsyncs until enabling the LCD */ ++ msleep(50); ++ ++ if (display->hw_config.panel_enable) ++ r = display->hw_config.panel_enable(display); ++ ++ return r; ++} ++ ++static void samsung_lte_panel_disable(struct omap_display *display) ++{ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ ++ /* wait at least 5 vsyncs after disabling the LCD */ ++ msleep(100); ++} ++ ++static int samsung_lte_panel_suspend(struct omap_display *display) ++{ ++ samsung_lte_panel_disable(display); ++ return 0; ++} ++ ++static int samsung_lte_panel_resume(struct omap_display *display) ++{ ++ return samsung_lte_panel_enable(display); ++} ++ ++static struct omap_panel samsung_lte_panel = { ++ .owner = THIS_MODULE, ++ .name = "samsung-lte430wq-f0c", ++ .init = samsung_lte_panel_init, ++ .cleanup = samsung_lte_panel_cleanup, ++ .enable = samsung_lte_panel_enable, ++ .disable = samsung_lte_panel_disable, ++ .suspend = samsung_lte_panel_suspend, ++ .resume = samsung_lte_panel_resume, ++ ++ .timings = { ++ .x_res = 480, ++ .y_res = 272, ++ ++ .pixel_clock = 9200, ++ ++ .hsw = 41, ++ .hfp = 8, ++ .hbp = 45-41, ++ ++ .vsw = 10, ++ .vfp = 4, ++ .vbp = 12-10, ++ }, ++ ++ .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IVS, ++}; ++ ++ ++static int __init samsung_lte_panel_drv_init(void) ++{ ++ omap_dss_register_panel(&samsung_lte_panel); ++ return 0; ++} ++ ++static void __exit samsung_lte_panel_drv_exit(void) ++{ ++ omap_dss_unregister_panel(&samsung_lte_panel); ++} ++ ++module_init(samsung_lte_panel_drv_init); ++module_exit(samsung_lte_panel_drv_exit); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c +new file mode 100644 +index 0000000..1f99150 +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c +@@ -0,0 +1,112 @@ ++/* ++ * LCD panel driver for Sharp LS037V7DW01 ++ * ++ * Copyright (C) 2008 Nokia Corporation ++ * Author: Tomi Valkeinen ++ * ++ * 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 published by ++ * the Free Software Foundation. ++ * ++ * 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, see . ++ */ ++ ++#include ++#include ++ ++#include ++ ++static int sharp_ls_panel_init(struct omap_display *display) ++{ ++ return 0; ++} ++ ++static void sharp_ls_panel_cleanup(struct omap_display *display) ++{ ++} ++ ++static int sharp_ls_panel_enable(struct omap_display *display) ++{ ++ int r = 0; ++ ++ /* wait couple of vsyncs until enabling the LCD */ ++ msleep(50); ++ ++ if (display->hw_config.panel_enable) ++ r = display->hw_config.panel_enable(display); ++ ++ return r; ++} ++ ++static void sharp_ls_panel_disable(struct omap_display *display) ++{ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ ++ /* wait at least 5 vsyncs after disabling the LCD */ ++ ++ msleep(100); ++} ++ ++static int sharp_ls_panel_suspend(struct omap_display *display) ++{ ++ sharp_ls_panel_disable(display); ++ return 0; ++} ++ ++static int sharp_ls_panel_resume(struct omap_display *display) ++{ ++ return sharp_ls_panel_enable(display); ++} ++ ++static struct omap_panel sharp_ls_panel = { ++ .owner = THIS_MODULE, ++ .name = "sharp-ls037v7dw01", ++ .init = sharp_ls_panel_init, ++ .cleanup = sharp_ls_panel_cleanup, ++ .enable = sharp_ls_panel_enable, ++ .disable = sharp_ls_panel_disable, ++ .suspend = sharp_ls_panel_suspend, ++ .resume = sharp_ls_panel_resume, ++ ++ .timings = { ++ .x_res = 480, ++ .y_res = 640, ++ ++ .pixel_clock = 19200, ++ ++ .hsw = 2, ++ .hfp = 1, ++ .hbp = 28, ++ ++ .vsw = 1, ++ .vfp = 1, ++ .vbp = 1, ++ }, ++ ++ .acb = 0x28, ++ ++ .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS, ++}; ++ ++ ++static int __init sharp_ls_panel_drv_init(void) ++{ ++ omap_dss_register_panel(&sharp_ls_panel); ++ return 0; ++} ++ ++static void __exit sharp_ls_panel_drv_exit(void) ++{ ++ omap_dss_unregister_panel(&sharp_ls_panel); ++} ++ ++module_init(sharp_ls_panel_drv_init); ++module_exit(sharp_ls_panel_drv_exit); ++MODULE_LICENSE("GPL"); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch b/recipes/linux/linux-omap-2.6.29/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch new file mode 100644 index 0000000000..0025f1aa8b --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch @@ -0,0 +1,1079 @@ +From 18a25382e81c03230e022ca2eb7e0fce24479d6a Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 10:31:57 +0300 +Subject: [PATCH] DSS2: HACK: Add DSS2 support for N800 + +Works, but it an ugly quick hack. + +Signed-off-by: Tomi Valkeinen +--- + arch/arm/mach-omap2/board-n800.c | 216 +++++++++++--- + drivers/video/omap2/displays/Kconfig | 10 + + drivers/video/omap2/displays/Makefile | 3 + + drivers/video/omap2/displays/ctrl-blizzard.c | 279 +++++++++++++++++ + drivers/video/omap2/displays/panel-n800.c | 435 ++++++++++++++++++++++++++ + 5 files changed, 905 insertions(+), 38 deletions(-) + create mode 100644 drivers/video/omap2/displays/ctrl-blizzard.c + create mode 100644 drivers/video/omap2/displays/panel-n800.c + +diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c +index f6f6571..6de60ae 100644 +--- a/arch/arm/mach-omap2/board-n800.c ++++ b/arch/arm/mach-omap2/board-n800.c +@@ -41,6 +41,8 @@ + #include + #include + #include ++#include ++#include + + #include <../drivers/cbus/tahvo.h> + #include <../drivers/media/video/tcm825x.h> +@@ -161,23 +163,176 @@ static struct omap_uart_config n800_uart_config __initdata = { + + #include "../../../drivers/cbus/retu.h" + +-static struct omap_fbmem_config n800_fbmem0_config __initdata = { +- .size = 752 * 1024, ++static struct omap_tmp105_config n800_tmp105_config __initdata = { ++ .tmp105_irq_pin = 125, ++ .set_power = n800_tmp105_set_power, + }; + +-static struct omap_fbmem_config n800_fbmem1_config __initdata = { +- .size = 752 * 1024, +-}; + +-static struct omap_fbmem_config n800_fbmem2_config __initdata = { +- .size = 752 * 1024, ++ ++ ++/* DISPLAY */ ++static struct { ++ struct clk *sys_ck; ++} blizzard; ++ ++static int blizzard_get_clocks(void) ++{ ++ blizzard.sys_ck = clk_get(0, "osc_ck"); ++ if (IS_ERR(blizzard.sys_ck)) { ++ printk(KERN_ERR "can't get Blizzard clock\n"); ++ return PTR_ERR(blizzard.sys_ck); ++ } ++ return 0; ++} ++ ++static unsigned long blizzard_get_clock_rate(void) ++{ ++ return clk_get_rate(blizzard.sys_ck); ++} ++ ++static int n800_pn800_enable(struct omap_display *display) ++{ ++ if (display->hw_config.panel_reset_gpio != -1) { ++ printk("enabling panel gpio\n"); ++ gpio_direction_output(display->hw_config.panel_reset_gpio, 1); ++ } ++ ++ return 0; ++} ++ ++static void n800_pn800_disable(struct omap_display *display) ++{ ++ if (display->hw_config.panel_reset_gpio != -1) { ++ printk("disabling panel gpio\n"); ++ gpio_direction_output(display->hw_config.panel_reset_gpio, 0); ++ msleep(120); ++ } ++} ++ ++static int n800_blizzard_enable(struct omap_display *display) ++{ ++ printk("enabling bliz powers\n"); ++ ++ /* Vcore to 1.475V */ ++ tahvo_set_clear_reg_bits(0x07, 0, 0xf); ++ msleep(10); ++ ++ clk_enable(blizzard.sys_ck); ++ ++ if (display->hw_config.ctrl_reset_gpio != -1) ++ gpio_direction_output(display->hw_config.ctrl_reset_gpio, 1); ++ ++ printk("osc_ck %lu\n", blizzard_get_clock_rate()); ++ ++ return 0; ++} ++ ++static void n800_blizzard_disable(struct omap_display *display) ++{ ++ printk("disabling bliz powers\n"); ++ ++ if (display->hw_config.ctrl_reset_gpio != -1) ++ gpio_direction_output(display->hw_config.ctrl_reset_gpio, 0); ++ ++ clk_disable(blizzard.sys_ck); ++ ++ /* Vcore to 1.005V */ ++ tahvo_set_clear_reg_bits(0x07, 0xf, 0); ++} ++ ++static int n800_set_backlight_level(struct omap_display *display, int level) ++{ ++ return 0; ++} ++ ++static struct omap_dss_display_config n800_dsi_display_data = { ++ .type = OMAP_DISPLAY_TYPE_DBI, ++ .name = "lcd", ++ .ctrl_name = "ctrl-blizzard", ++ .panel_name = "panel-pn800", ++ .panel_reset_gpio = -1, ++ .ctrl_reset_gpio = N800_BLIZZARD_POWERDOWN_GPIO, ++ .panel_enable = n800_pn800_enable, ++ .panel_disable = n800_pn800_disable, ++ .ctrl_enable = n800_blizzard_enable, ++ .ctrl_disable = n800_blizzard_disable, ++ .set_backlight = n800_set_backlight_level, ++ .u.rfbi = { ++ .channel = 0, ++ /* 8 for cmd mode, 16 for pixel data. ctrl-blizzard handles switching */ ++ .data_lines = 8, ++ }, ++ .panel_data = 0, // XXX used for panel datalines ++}; ++static struct omap_dss_board_info n800_dss_data = { ++ .num_displays = 1, ++ .displays = { ++ &n800_dsi_display_data, ++ }, + }; + +-static struct omap_tmp105_config n800_tmp105_config __initdata = { +- .tmp105_irq_pin = 125, +- .set_power = n800_tmp105_set_power, ++static struct platform_device n800_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &n800_dss_data, ++ }, + }; + ++static void __init n800_display_init(void) ++{ ++ int r; ++ const struct omap_lcd_config *conf; ++ ++ conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); ++ if (conf != NULL) { ++ n800_dsi_display_data.panel_reset_gpio = conf->nreset_gpio; ++ n800_dsi_display_data.panel_data = ++ (void*)(u32)conf->data_lines; // XXX ++ //printk("\n\nTULI %d\n\n", conf->data_lines); ++ } else { ++ printk("\n\nEI TULLU MIOTÄÄÄ\n\n"); ++ } ++ ++ blizzard_get_clocks(); ++ clk_enable(blizzard.sys_ck); // XXX always enable ++ ++ //omapfb_set_ctrl_platform_data(&n800_blizzard_data); ++ // ++ if (n800_dsi_display_data.ctrl_reset_gpio != -1) { ++ r = gpio_request(n800_dsi_display_data.ctrl_reset_gpio, ++ "Blizzard pd"); ++ if (r < 0) { ++ n800_dsi_display_data.ctrl_reset_gpio = -1; ++ printk(KERN_ERR "Unable to get Blizzard GPIO\n"); ++ } else { ++ gpio_direction_output(n800_dsi_display_data.ctrl_reset_gpio, ++ 1); ++ // XXX always enable ++ } ++ } ++ ++ if (n800_dsi_display_data.panel_reset_gpio != -1) { ++ r = gpio_request(n800_dsi_display_data.panel_reset_gpio, ++ "panel reset"); ++ if (r < 0) { ++ n800_dsi_display_data.panel_reset_gpio = -1; ++ printk(KERN_ERR "Unable to get pn800 GPIO\n"); ++ } else { ++ gpio_direction_output(n800_dsi_display_data.panel_reset_gpio, ++ 1); ++ // XXX always enable ++ } ++ } ++} ++ ++/* DISPLAY END */ ++ ++ ++ ++ ++ + static void mipid_shutdown(struct mipid_platform_data *pdata) + { + if (pdata->nreset_gpio != -1) { +@@ -191,6 +346,7 @@ static struct mipid_platform_data n800_mipid_platform_data = { + .shutdown = mipid_shutdown, + }; + ++#if 0 + static void __init mipid_dev_init(void) + { + const struct omap_lcd_config *conf; +@@ -201,26 +357,9 @@ static void __init mipid_dev_init(void) + n800_mipid_platform_data.data_lines = conf->data_lines; + } + } ++#endif + +-static struct { +- struct clk *sys_ck; +-} blizzard; +- +-static int blizzard_get_clocks(void) +-{ +- blizzard.sys_ck = clk_get(0, "osc_ck"); +- if (IS_ERR(blizzard.sys_ck)) { +- printk(KERN_ERR "can't get Blizzard clock\n"); +- return PTR_ERR(blizzard.sys_ck); +- } +- return 0; +-} +- +-static unsigned long blizzard_get_clock_rate(struct device *dev) +-{ +- return clk_get_rate(blizzard.sys_ck); +-} +- ++#if 0 + static void blizzard_enable_clocks(int enable) + { + if (enable) +@@ -265,14 +404,12 @@ static void __init blizzard_dev_init(void) + gpio_direction_output(N800_BLIZZARD_POWERDOWN_GPIO, 1); + + blizzard_get_clocks(); +- omapfb_set_ctrl_platform_data(&n800_blizzard_data); ++ //omapfb_set_ctrl_platform_data(&n800_blizzard_data); + } ++#endif + + static struct omap_board_config_kernel n800_config[] __initdata = { + { OMAP_TAG_UART, &n800_uart_config }, +- { OMAP_TAG_FBMEM, &n800_fbmem0_config }, +- { OMAP_TAG_FBMEM, &n800_fbmem1_config }, +- { OMAP_TAG_FBMEM, &n800_fbmem2_config }, + { OMAP_TAG_TMP105, &n800_tmp105_config }, + }; + +@@ -379,7 +516,7 @@ static struct omap2_mcspi_device_config tsc2005_mcspi_config = { + + static struct spi_board_info n800_spi_board_info[] __initdata = { + { +- .modalias = "lcd_mipid", ++ .modalias = "panel-n800", + .bus_num = 1, + .chip_select = 1, + .max_speed_hz = 4000000, +@@ -404,7 +541,7 @@ static struct spi_board_info n800_spi_board_info[] __initdata = { + + static struct spi_board_info n810_spi_board_info[] __initdata = { + { +- .modalias = "lcd_mipid", ++ .modalias = "panel-n800", + .bus_num = 1, + .chip_select = 1, + .max_speed_hz = 4000000, +@@ -582,6 +719,7 @@ static struct platform_device *n800_devices[] __initdata = { + #if defined(CONFIG_CBUS_RETU_HEADSET) + &retu_headset_device, + #endif ++ &n800_dss_device, + }; + + #ifdef CONFIG_MENELAUS +@@ -713,9 +851,10 @@ void __init nokia_n800_common_init(void) + if (machine_is_nokia_n810()) + i2c_register_board_info(2, n810_i2c_board_info_2, + ARRAY_SIZE(n810_i2c_board_info_2)); +- +- mipid_dev_init(); +- blizzard_dev_init(); ++ ++ //mipid_dev_init(); ++ //blizzard_dev_init(); ++ n800_display_init(); + } + + static void __init nokia_n800_init(void) +@@ -735,6 +874,7 @@ void __init nokia_n800_map_io(void) + omap_board_config_size = ARRAY_SIZE(n800_config); + + omap2_set_globals_242x(); ++ omap2_set_sdram_vram(800 * 480 * 2 * 3, 0); + omap2_map_common_io(); + } + +diff --git a/drivers/video/omap2/displays/Kconfig b/drivers/video/omap2/displays/Kconfig +index 0419ec8..356ceb1 100644 +--- a/drivers/video/omap2/displays/Kconfig ++++ b/drivers/video/omap2/displays/Kconfig +@@ -18,4 +18,14 @@ config PANEL_SHARP_LS037V7DW01 + depends on OMAP2_DSS + help + LCD Panel used in TI's SDP3430 and EVM boards ++ ++config PANEL_N800 ++ tristate "Panel N8x0" ++ help ++ N8x0 LCD (hack) ++ ++config CTRL_BLIZZARD ++ tristate "Blizzard Controller" ++ help ++ Blizzard Controller (hack) + endmenu +diff --git a/drivers/video/omap2/displays/Makefile b/drivers/video/omap2/displays/Makefile +index a26bbd2..1b74b7e 100644 +--- a/drivers/video/omap2/displays/Makefile ++++ b/drivers/video/omap2/displays/Makefile +@@ -1,3 +1,6 @@ + obj-$(CONFIG_PANEL_GENERIC) += panel-generic.o + obj-$(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C) += panel-samsung-lte430wq-f0c.o + obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o ++ ++obj-$(CONFIG_CTRL_BLIZZARD) += ctrl-blizzard.o ++obj-$(CONFIG_PANEL_N800) += panel-n800.o +diff --git a/drivers/video/omap2/displays/ctrl-blizzard.c b/drivers/video/omap2/displays/ctrl-blizzard.c +new file mode 100644 +index 0000000..6698e4d +--- /dev/null ++++ b/drivers/video/omap2/displays/ctrl-blizzard.c +@@ -0,0 +1,279 @@ ++ ++//#define DEBUG ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#ifdef DEBUG ++#define DBG(format, ...) printk(KERN_DEBUG "Blizzard: " format, ## __VA_ARGS__) ++#else ++#define DBG(format, ...) ++#endif ++ ++#define BLIZZARD_REV_CODE 0x00 ++#define BLIZZARD_CONFIG 0x02 ++#define BLIZZARD_PLL_DIV 0x04 ++#define BLIZZARD_PLL_LOCK_RANGE 0x06 ++#define BLIZZARD_PLL_CLOCK_SYNTH_0 0x08 ++#define BLIZZARD_PLL_CLOCK_SYNTH_1 0x0a ++#define BLIZZARD_PLL_MODE 0x0c ++#define BLIZZARD_CLK_SRC 0x0e ++#define BLIZZARD_MEM_BANK0_ACTIVATE 0x10 ++#define BLIZZARD_MEM_BANK0_STATUS 0x14 ++#define BLIZZARD_PANEL_CONFIGURATION 0x28 ++#define BLIZZARD_HDISP 0x2a ++#define BLIZZARD_HNDP 0x2c ++#define BLIZZARD_VDISP0 0x2e ++#define BLIZZARD_VDISP1 0x30 ++#define BLIZZARD_VNDP 0x32 ++#define BLIZZARD_HSW 0x34 ++#define BLIZZARD_VSW 0x38 ++#define BLIZZARD_DISPLAY_MODE 0x68 ++#define BLIZZARD_INPUT_WIN_X_START_0 0x6c ++#define BLIZZARD_DATA_SOURCE_SELECT 0x8e ++#define BLIZZARD_DISP_MEM_DATA_PORT 0x90 ++#define BLIZZARD_DISP_MEM_READ_ADDR0 0x92 ++#define BLIZZARD_POWER_SAVE 0xE6 ++#define BLIZZARD_NDISP_CTRL_STATUS 0xE8 ++ ++/* Data source select */ ++/* For S1D13745 */ ++#define BLIZZARD_SRC_WRITE_LCD_BACKGROUND 0x00 ++#define BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE 0x01 ++#define BLIZZARD_SRC_WRITE_OVERLAY_ENABLE 0x04 ++#define BLIZZARD_SRC_DISABLE_OVERLAY 0x05 ++/* For S1D13744 */ ++#define BLIZZARD_SRC_WRITE_LCD 0x00 ++#define BLIZZARD_SRC_BLT_LCD 0x06 ++ ++#define BLIZZARD_COLOR_RGB565 0x01 ++#define BLIZZARD_COLOR_YUV420 0x09 ++ ++#define BLIZZARD_VERSION_S1D13745 0x01 /* Hailstorm */ ++#define BLIZZARD_VERSION_S1D13744 0x02 /* Blizzard */ ++ ++#define BLIZZARD_AUTO_UPDATE_TIME (HZ / 20) ++ ++ ++ ++static struct { ++ int version; ++} blizzard; ++ ++ ++static inline void blizzard_cmd(u8 cmd) ++{ ++ omap_rfbi_write_command(&cmd, 1); ++} ++ ++static inline void blizzard_write(u8 cmd, const u8 *buf, int len) ++{ ++ omap_rfbi_write_command(&cmd, 1); ++ omap_rfbi_write_data(buf, len); ++} ++ ++static inline void blizzard_read(u8 cmd, u8 *buf, int len) ++{ ++ omap_rfbi_write_command(&cmd, 1); ++ omap_rfbi_read_data(buf, len); ++} ++ ++static u8 blizzard_read_reg(u8 cmd) ++{ ++ u8 data; ++ blizzard_read(cmd, &data, 1); ++ return data; ++} ++ ++static int blizzard_ctrl_init(struct omap_display *display) ++{ ++ DBG("blizzard_ctrl_init\n"); ++ ++ return 0; ++} ++ ++ ++static int blizzard_ctrl_enable(struct omap_display *display) ++{ ++ int r = 0; ++ u8 rev, conf; ++ ++ DBG("blizzard_ctrl_enable\n"); ++ ++ if (display->hw_config.ctrl_enable) { ++ r = display->hw_config.ctrl_enable(display); ++ if (r) ++ return r; ++ } ++ ++ msleep(100); ++ ++ rev = blizzard_read_reg(BLIZZARD_CLK_SRC); ++ printk("CLK_SRC %x\n", rev); ++ ++ rev = blizzard_read_reg(BLIZZARD_PLL_DIV); ++ printk("PLLDIV %x\n", rev); ++ ++ rev = blizzard_read_reg(BLIZZARD_REV_CODE); ++ conf = blizzard_read_reg(BLIZZARD_CONFIG); ++ ++ printk("rev %x, conf %x\n", rev, conf); ++ ++ switch (rev & 0xfc) { ++ case 0x9c: ++ blizzard.version = BLIZZARD_VERSION_S1D13744; ++ pr_info("omapfb: s1d13744 LCD controller rev %d " ++ "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); ++ break; ++ case 0xa4: ++ blizzard.version = BLIZZARD_VERSION_S1D13745; ++ pr_info("omapfb: s1d13745 LCD controller rev %d " ++ "initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); ++ break; ++ default: ++ printk("invalid s1d1374x revision %02x\n", ++ rev); ++ r = -ENODEV; ++ } ++ ++ return r; ++} ++ ++static void blizzard_ctrl_disable(struct omap_display *display) ++{ ++ DBG("blizzard_ctrl_disable\n"); ++ ++ if (display->hw_config.ctrl_disable) ++ display->hw_config.ctrl_disable(display); ++} ++ ++int rfbi_configure(int rfbi_module, int bpp, int lines); ++ ++static void blizzard_ctrl_setup_update(struct omap_display *display, ++ u16 x, u16 y, u16 w, u16 h) ++{ ++ u8 tmp[18]; ++ int x_end, y_end; ++ ++ DBG("blizzard_ctrl_setup_update\n"); ++ ++ x_end = x + w - 1; ++ y_end = y + h - 1; ++ ++ tmp[0] = x; ++ tmp[1] = x >> 8; ++ tmp[2] = y; ++ tmp[3] = y >> 8; ++ tmp[4] = x_end; ++ tmp[5] = x_end >> 8; ++ tmp[6] = y_end; ++ tmp[7] = y_end >> 8; ++ ++ /* scaling? */ ++ tmp[8] = x; ++ tmp[9] = x >> 8; ++ tmp[10] = y; ++ tmp[11] = y >> 8; ++ tmp[12] = x_end; ++ tmp[13] = x_end >> 8; ++ tmp[14] = y_end; ++ tmp[15] = y_end >> 8; ++ ++ tmp[16] = BLIZZARD_COLOR_RGB565; //color_mode; ++ ++ if (blizzard.version == BLIZZARD_VERSION_S1D13745) ++ tmp[17] = BLIZZARD_SRC_WRITE_LCD_BACKGROUND; ++ else ++ tmp[17] = blizzard.version == BLIZZARD_VERSION_S1D13744 ? ++ BLIZZARD_SRC_WRITE_LCD : ++ BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE; ++ ++ rfbi_configure(display->hw_config.u.rfbi.channel, ++ 16, ++ 8); ++ ++ blizzard_write(BLIZZARD_INPUT_WIN_X_START_0, tmp, 18); ++ ++ rfbi_configure(display->hw_config.u.rfbi.channel, ++ 16, ++ 16); ++} ++ ++static int blizzard_ctrl_enable_te(struct omap_display *display, bool enable) ++{ ++ return 0; ++} ++ ++static int blizzard_ctrl_rotate(struct omap_display *display, u8 rotate) ++{ ++ return 0; ++} ++ ++static int blizzard_ctrl_mirror(struct omap_display *display, bool enable) ++{ ++ return 0; ++} ++ ++static int blizzard_run_test(struct omap_display *display, int test_num) ++{ ++ return 0; ++} ++ ++static struct omap_ctrl blizzard_ctrl = { ++ .owner = THIS_MODULE, ++ .name = "ctrl-blizzard", ++ .init = blizzard_ctrl_init, ++ .enable = blizzard_ctrl_enable, ++ .disable = blizzard_ctrl_disable, ++ .setup_update = blizzard_ctrl_setup_update, ++ .enable_te = blizzard_ctrl_enable_te, ++ .set_rotate = blizzard_ctrl_rotate, ++ .set_mirror = blizzard_ctrl_mirror, ++ .run_test = blizzard_run_test, ++ .pixel_size = 16, ++ ++ .timings = { ++ .cs_on_time = 0, ++ ++ .we_on_time = 9000, ++ .we_off_time = 18000, ++ .we_cycle_time = 36000, ++ ++ .re_on_time = 9000, ++ .re_off_time = 27000, ++ .re_cycle_time = 36000, ++ ++ .access_time = 27000, ++ .cs_off_time = 36000, ++ ++ .cs_pulse_width = 0, ++ }, ++}; ++ ++ ++static int __init blizzard_init(void) ++{ ++ DBG("blizzard_init\n"); ++ omap_dss_register_ctrl(&blizzard_ctrl); ++ return 0; ++} ++ ++static void __exit blizzard_exit(void) ++{ ++ DBG("blizzard_exit\n"); ++ ++ omap_dss_unregister_ctrl(&blizzard_ctrl); ++} ++ ++module_init(blizzard_init); ++module_exit(blizzard_exit); ++ ++MODULE_AUTHOR("Tomi Valkeinen "); ++MODULE_DESCRIPTION("Blizzard Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/video/omap2/displays/panel-n800.c b/drivers/video/omap2/displays/panel-n800.c +new file mode 100644 +index 0000000..91d3e37 +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-n800.c +@@ -0,0 +1,435 @@ ++ ++/*#define DEBUG*/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define MIPID_CMD_READ_DISP_ID 0x04 ++#define MIPID_CMD_READ_RED 0x06 ++#define MIPID_CMD_READ_GREEN 0x07 ++#define MIPID_CMD_READ_BLUE 0x08 ++#define MIPID_CMD_READ_DISP_STATUS 0x09 ++#define MIPID_CMD_RDDSDR 0x0F ++#define MIPID_CMD_SLEEP_IN 0x10 ++#define MIPID_CMD_SLEEP_OUT 0x11 ++#define MIPID_CMD_DISP_OFF 0x28 ++#define MIPID_CMD_DISP_ON 0x29 ++ ++#define MIPID_VER_LPH8923 3 ++#define MIPID_VER_LS041Y3 4 ++ ++#define MIPID_ESD_CHECK_PERIOD msecs_to_jiffies(5000) ++ ++#ifdef DEBUG ++#define DBG(format, ...) printk(KERN_DEBUG "PN800: " format, ## __VA_ARGS__) ++#else ++#define DBG(format, ...) ++#endif ++ ++struct pn800_device { ++ struct backlight_device *bl_dev; ++ int enabled; ++ int model; ++ int revision; ++ u8 display_id[3]; ++ unsigned int saved_bklight_level; ++ unsigned long hw_guard_end; /* next value of jiffies ++ when we can issue the ++ next sleep in/out command */ ++ unsigned long hw_guard_wait; /* max guard time in jiffies */ ++ ++ struct spi_device *spi; ++ struct mutex mutex; ++ struct omap_panel panel; ++ struct omap_display *display; ++}; ++ ++ ++static void pn800_transfer(struct pn800_device *md, int cmd, ++ const u8 *wbuf, int wlen, u8 *rbuf, int rlen) ++{ ++ struct spi_message m; ++ struct spi_transfer *x, xfer[4]; ++ u16 w; ++ int r; ++ ++ BUG_ON(md->spi == NULL); ++ ++ spi_message_init(&m); ++ ++ memset(xfer, 0, sizeof(xfer)); ++ x = &xfer[0]; ++ ++ cmd &= 0xff; ++ x->tx_buf = &cmd; ++ x->bits_per_word = 9; ++ x->len = 2; ++ spi_message_add_tail(x, &m); ++ ++ if (wlen) { ++ x++; ++ x->tx_buf = wbuf; ++ x->len = wlen; ++ x->bits_per_word = 9; ++ spi_message_add_tail(x, &m); ++ } ++ ++ if (rlen) { ++ x++; ++ x->rx_buf = &w; ++ x->len = 1; ++ spi_message_add_tail(x, &m); ++ ++ if (rlen > 1) { ++ /* Arrange for the extra clock before the first ++ * data bit. ++ */ ++ x->bits_per_word = 9; ++ x->len = 2; ++ ++ x++; ++ x->rx_buf = &rbuf[1]; ++ x->len = rlen - 1; ++ spi_message_add_tail(x, &m); ++ } ++ } ++ ++ r = spi_sync(md->spi, &m); ++ if (r < 0) ++ dev_dbg(&md->spi->dev, "spi_sync %d\n", r); ++ ++ if (rlen) ++ rbuf[0] = w & 0xff; ++} ++ ++static inline void pn800_cmd(struct pn800_device *md, int cmd) ++{ ++ pn800_transfer(md, cmd, NULL, 0, NULL, 0); ++} ++ ++static inline void pn800_write(struct pn800_device *md, ++ int reg, const u8 *buf, int len) ++{ ++ pn800_transfer(md, reg, buf, len, NULL, 0); ++} ++ ++static inline void pn800_read(struct pn800_device *md, ++ int reg, u8 *buf, int len) ++{ ++ pn800_transfer(md, reg, NULL, 0, buf, len); ++} ++ ++static void set_data_lines(struct pn800_device *md, int data_lines) ++{ ++ u16 par; ++ ++ switch (data_lines) { ++ case 16: ++ par = 0x150; ++ break; ++ case 18: ++ par = 0x160; ++ break; ++ case 24: ++ par = 0x170; ++ break; ++ } ++ pn800_write(md, 0x3a, (u8 *)&par, 2); ++} ++ ++static void send_init_string(struct pn800_device *md) ++{ ++ u16 initpar[] = { 0x0102, 0x0100, 0x0100 }; ++ int data_lines; ++ ++ pn800_write(md, 0xc2, (u8 *)initpar, sizeof(initpar)); ++ ++ data_lines = (int)md->display->hw_config.panel_data; // XXX ++ ++ set_data_lines(md, data_lines); ++} ++ ++static void hw_guard_start(struct pn800_device *md, int guard_msec) ++{ ++ md->hw_guard_wait = msecs_to_jiffies(guard_msec); ++ md->hw_guard_end = jiffies + md->hw_guard_wait; ++} ++ ++static void hw_guard_wait(struct pn800_device *md) ++{ ++ unsigned long wait = md->hw_guard_end - jiffies; ++ ++ if ((long)wait > 0 && wait <= md->hw_guard_wait) { ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_timeout(wait); ++ } ++} ++ ++static void set_sleep_mode(struct pn800_device *md, int on) ++{ ++ int cmd, sleep_time = 50; ++ ++ if (on) ++ cmd = MIPID_CMD_SLEEP_IN; ++ else ++ cmd = MIPID_CMD_SLEEP_OUT; ++ hw_guard_wait(md); ++ pn800_cmd(md, cmd); ++ hw_guard_start(md, 120); ++ /* ++ * When we enable the panel, it seems we _have_ to sleep ++ * 120 ms before sending the init string. When disabling the ++ * panel we'll sleep for the duration of 2 frames, so that the ++ * controller can still provide the PCLK,HS,VS signals. */ ++ if (!on) ++ sleep_time = 120; ++ msleep(sleep_time); ++} ++ ++static void set_display_state(struct pn800_device *md, int enabled) ++{ ++ int cmd = enabled ? MIPID_CMD_DISP_ON : MIPID_CMD_DISP_OFF; ++ ++ pn800_cmd(md, cmd); ++} ++ ++static int panel_enabled(struct pn800_device *md) ++{ ++ u32 disp_status; ++ int enabled; ++ ++ pn800_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4); ++ disp_status = __be32_to_cpu(disp_status); ++ enabled = (disp_status & (1 << 17)) && (disp_status & (1 << 10)); ++ dev_dbg(&md->spi->dev, ++ "LCD panel %s enabled by bootloader (status 0x%04x)\n", ++ enabled ? "" : "not ", disp_status); ++ DBG("status %#08x\n", disp_status); ++ return enabled; ++} ++ ++static int panel_detect(struct pn800_device *md) ++{ ++ pn800_read(md, MIPID_CMD_READ_DISP_ID, md->display_id, 3); ++ dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", ++ md->display_id[0], md->display_id[1], md->display_id[2]); ++ ++ switch (md->display_id[0]) { ++ case 0x45: ++ md->model = MIPID_VER_LPH8923; ++ md->panel.name = "lph8923"; ++ break; ++ case 0x83: ++ md->model = MIPID_VER_LS041Y3; ++ md->panel.name = "ls041y3"; ++ //md->esd_check = ls041y3_esd_check; ++ break; ++ default: ++ md->panel.name = "unknown"; ++ dev_err(&md->spi->dev, "invalid display ID\n"); ++ return -ENODEV; ++ } ++ ++ md->revision = md->display_id[1]; ++ pr_info("omapfb: %s rev %02x LCD detected\n", ++ md->panel.name, md->revision); ++ ++ return 0; ++} ++ ++ ++ ++static int pn800_panel_enable(struct omap_display *display) ++{ ++ int r; ++ struct pn800_device *md = ++ (struct pn800_device *)display->panel->priv; ++ ++ DBG("pn800_panel_enable\n"); ++ ++ mutex_lock(&md->mutex); ++ ++ if (display->hw_config.panel_enable) ++ display->hw_config.panel_enable(display); ++ ++ msleep(50); // wait for power up ++ ++ r = panel_detect(md); ++ if (r) { ++ mutex_unlock(&md->mutex); ++ return r; ++ } ++ ++ md->enabled = panel_enabled(md); ++ ++ if (md->enabled) { ++ DBG("panel already enabled\n"); ++ ; /*pn800_esd_start_check(md);*/ ++ } else { ++ ; /*md->saved_bklight_level = pn800_get_bklight_level(panel);*/ ++ } ++ ++ ++ if (md->enabled) { ++ mutex_unlock(&md->mutex); ++ return 0; ++ } ++ ++ set_sleep_mode(md, 0); ++ md->enabled = 1; ++ send_init_string(md); ++ set_display_state(md, 1); ++ //mipid_set_bklight_level(panel, md->saved_bklight_level); ++ //mipid_esd_start_check(md); ++ ++ mutex_unlock(&md->mutex); ++ return 0; ++} ++ ++static void pn800_panel_disable(struct omap_display *display) ++{ ++ struct pn800_device *md = ++ (struct pn800_device *)display->panel->priv; ++ ++ DBG("pn800_panel_disable\n"); ++ ++ mutex_lock(&md->mutex); ++ ++ if (!md->enabled) { ++ mutex_unlock(&md->mutex); ++ return; ++ } ++ /*md->saved_bklight_level = pn800_get_bklight_level(panel);*/ ++ /*pn800_set_bklight_level(panel, 0);*/ ++ ++ set_display_state(md, 0); ++ set_sleep_mode(md, 1); ++ md->enabled = 0; ++ ++ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ ++ mutex_unlock(&md->mutex); ++} ++ ++static int pn800_panel_init(struct omap_display *display) ++{ ++ struct pn800_device *md = ++ (struct pn800_device *)display->panel->priv; ++ ++ DBG("pn800_panel_init\n"); ++ ++ mutex_init(&md->mutex); ++ md->display = display; ++ ++ return 0; ++} ++ ++static int pn800_run_test(struct omap_display *display, int test_num) ++{ ++ return 0; ++} ++ ++static struct omap_panel pn800_panel = { ++ .owner = THIS_MODULE, ++ .name = "panel-pn800", ++ .init = pn800_panel_init, ++ /*.remove = pn800_cleanup,*/ ++ .enable = pn800_panel_enable, ++ .disable = pn800_panel_disable, ++ //.set_mode = pn800_set_mode, ++ .run_test = pn800_run_test, ++ ++ .timings = { ++ .x_res = 800, ++ .y_res = 480, ++ ++ .pixel_clock = 21940, ++ .hsw = 50, ++ .hfp = 20, ++ .hbp = 15, ++ ++ .vsw = 2, ++ .vfp = 1, ++ .vbp = 3, ++ }, ++ .config = OMAP_DSS_LCD_TFT, ++}; ++ ++static int pn800_spi_probe(struct spi_device *spi) ++{ ++ struct pn800_device *md; ++ ++ DBG("pn800_spi_probe\n"); ++ ++ md = kzalloc(sizeof(*md), GFP_KERNEL); ++ if (md == NULL) { ++ dev_err(&spi->dev, "out of memory\n"); ++ return -ENOMEM; ++ } ++ ++ spi->mode = SPI_MODE_0; ++ md->spi = spi; ++ dev_set_drvdata(&spi->dev, md); ++ md->panel = pn800_panel; ++ pn800_panel.priv = md; ++ ++ omap_dss_register_panel(&pn800_panel); ++ ++ return 0; ++} ++ ++static int pn800_spi_remove(struct spi_device *spi) ++{ ++ struct pn800_device *md = dev_get_drvdata(&spi->dev); ++ ++ DBG("pn800_spi_remove\n"); ++ ++ omap_dss_unregister_panel(&pn800_panel); ++ ++ /*pn800_disable(&md->panel);*/ ++ kfree(md); ++ ++ return 0; ++} ++ ++static struct spi_driver pn800_spi_driver = { ++ .driver = { ++ .name = "panel-n800", ++ .bus = &spi_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = pn800_spi_probe, ++ .remove = __devexit_p(pn800_spi_remove), ++}; ++ ++static int __init pn800_init(void) ++{ ++ DBG("pn800_init\n"); ++ return spi_register_driver(&pn800_spi_driver); ++} ++ ++static void __exit pn800_exit(void) ++{ ++ DBG("pn800_exit\n"); ++ spi_unregister_driver(&pn800_spi_driver); ++} ++ ++module_init(pn800_init); ++module_exit(pn800_exit); ++ ++MODULE_AUTHOR("Tomi Valkeinen "); ++MODULE_DESCRIPTION("N800 LCD Driver"); ++MODULE_LICENSE("GPL"); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch b/recipes/linux/linux-omap-2.6.29/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch new file mode 100644 index 0000000000..9282964713 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch @@ -0,0 +1,5715 @@ +From 9292aae93419867b9d0fce5cf3b2697e9250f5b5 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 10:36:05 +0300 +Subject: [PATCH] DSS2: Add DSS2 support for SDP, Beagle, Overo, EVM + +Also custom dss_*_defconfigs as an example. + +Signed-off-by: Tomi Valkeinen +--- + arch/arm/configs/dss_omap3_beagle_defconfig | 1371 ++++++++++++++++++++ + arch/arm/configs/dss_omap_3430sdp_defconfig | 1634 +++++++++++++++++++++++ + arch/arm/configs/dss_overo_defconfig | 1862 +++++++++++++++++++++++++++ + arch/arm/mach-omap2/board-3430sdp.c | 227 ++++- + arch/arm/mach-omap2/board-omap3beagle.c | 95 ++- + arch/arm/mach-omap2/board-omap3evm.c | 217 +++- + arch/arm/mach-omap2/board-overo.c | 98 ++- + 7 files changed, 5475 insertions(+), 29 deletions(-) + create mode 100644 arch/arm/configs/dss_omap3_beagle_defconfig + create mode 100644 arch/arm/configs/dss_omap_3430sdp_defconfig + create mode 100644 arch/arm/configs/dss_overo_defconfig + +diff --git a/arch/arm/configs/dss_omap3_beagle_defconfig b/arch/arm/configs/dss_omap3_beagle_defconfig +new file mode 100644 +index 0000000..7143168 +--- /dev/null ++++ b/arch/arm/configs/dss_omap3_beagle_defconfig +@@ -0,0 +1,1371 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.29-omap1 ++# Thu Apr 2 11:24:09 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_HAVE_LATENCYTOP_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++CONFIG_BSD_PROCESS_ACCT=y ++# CONFIG_BSD_PROCESS_ACCT_V3 is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++ ++# ++# RCU Subsystem ++# ++CONFIG_CLASSIC_RCU=y ++# CONFIG_TREE_RCU is not set ++# CONFIG_PREEMPT_RCU is not set ++# CONFIG_TREE_RCU_TRACE is not set ++# CONFIG_PREEMPT_RCU_TRACE is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++# CONFIG_CGROUPS is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_ANON_INODES=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++# CONFIG_SYSCTL_SYSCALL is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++CONFIG_KALLSYMS_EXTRA_PASS=y ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_COMPAT_BRK=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_GENERIC_DMA_COHERENT=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++CONFIG_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_BLK_DEV_BSG is not set ++# CONFIG_BLK_DEV_INTEGRITY is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++CONFIG_DEFAULT_AS=y ++# CONFIG_DEFAULT_DEADLINE is not set ++# CONFIG_DEFAULT_CFQ is not set ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="anticipatory" ++# CONFIG_FREEZER is not set ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KIRKWOOD is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_LOKI is not set ++# CONFIG_ARCH_MV78XX0 is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION5X is not set ++# CONFIG_ARCH_PNX4008 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_S3C64XX is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++CONFIG_ARCH_OMAP=y ++# CONFIG_ARCH_MSM is not set ++# CONFIG_ARCH_W90X900 is not set ++ ++# ++# TI OMAP Implementations ++# ++CONFIG_ARCH_OMAP_OTG=y ++# CONFIG_ARCH_OMAP1 is not set ++# CONFIG_ARCH_OMAP2 is not set ++CONFIG_ARCH_OMAP3=y ++ ++# ++# OMAP Feature Selections ++# ++# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set ++# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set ++# CONFIG_OMAP_SMARTREFLEX is not set ++# CONFIG_OMAP_RESET_CLOCKS is not set ++CONFIG_OMAP_BOOT_TAG=y ++CONFIG_OMAP_BOOT_REASON=y ++# CONFIG_OMAP_COMPONENT_VERSION is not set ++# CONFIG_OMAP_GPIO_SWITCH is not set ++# CONFIG_OMAP_MUX is not set ++# CONFIG_OMAP_MCBSP is not set ++# CONFIG_OMAP_MBOX_FWK is not set ++# CONFIG_OMAP_MPU_TIMER is not set ++CONFIG_OMAP_32K_TIMER=y ++CONFIG_OMAP_32K_TIMER_HZ=128 ++CONFIG_OMAP_TICK_GPTIMER=12 ++CONFIG_OMAP_DM_TIMER=y ++# CONFIG_OMAP_LL_DEBUG_UART1 is not set ++# CONFIG_OMAP_LL_DEBUG_UART2 is not set ++CONFIG_OMAP_LL_DEBUG_UART3=y ++CONFIG_ARCH_OMAP34XX=y ++CONFIG_ARCH_OMAP3430=y ++ ++# ++# OMAP Board Type ++# ++# CONFIG_MACH_NOKIA_RX51 is not set ++# CONFIG_MACH_OMAP_LDP is not set ++# CONFIG_MACH_OMAP_3430SDP is not set ++# CONFIG_MACH_OMAP3EVM is not set ++CONFIG_MACH_OMAP3_BEAGLE=y ++# CONFIG_MACH_OVERO is not set ++# CONFIG_MACH_OMAP3_PANDORA is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_32v6K=y ++CONFIG_CPU_V7=y ++CONFIG_CPU_32v7=y ++CONFIG_CPU_ABRT_EV7=y ++CONFIG_CPU_PABRT_IFAR=y ++CONFIG_CPU_CACHE_V7=y ++CONFIG_CPU_CACHE_VIPT=y ++CONFIG_CPU_COPY_V6=y ++CONFIG_CPU_TLB_V7=y ++CONFIG_CPU_HAS_ASID=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_ARM_THUMBEE is not set ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_BPREDICT_DISABLE is not set ++CONFIG_HAS_TLS_REG=y ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++CONFIG_VMSPLIT_3G=y ++# CONFIG_VMSPLIT_2G is not set ++# CONFIG_VMSPLIT_1G is not set ++CONFIG_PAGE_OFFSET=0xC0000000 ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=128 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++CONFIG_ARCH_FLATMEM_HAS_HOLES=y ++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set ++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_PAGEFLAGS_EXTENDED=y ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_PHYS_ADDR_T_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=0 ++CONFIG_VIRT_TO_BUS=y ++CONFIG_UNEVICTABLE_LRU=y ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.2.14:/tftpboot/rootfs ip=192.168.2.15 nolock,rsize=1024,wsize=1024 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Power Management ++# ++# CONFIG_CPU_FREQ is not set ++# CONFIG_CPU_IDLE is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_VFP=y ++CONFIG_VFPv3=y ++# CONFIG_NEON is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set ++CONFIG_HAVE_AOUT=y ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_MISC=y ++ ++# ++# Power management options ++# ++CONFIG_PM=y ++# CONFIG_PM_DEBUG is not set ++# CONFIG_SUSPEND is not set ++# CONFIG_APM_EMULATION is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_COMPAT_NET_DEV_OPS=y ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++CONFIG_IP_PNP_BOOTP=y ++CONFIG_IP_PNP_RARP=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++# CONFIG_DCB is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_PHONET is not set ++CONFIG_WIRELESS=y ++# CONFIG_CFG80211 is not set ++CONFIG_WIRELESS_OLD_REGULATORY=y ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_LIB80211 is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_WIMAX is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_TESTS is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_AR7_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_GPIO is not set ++CONFIG_MTD_NAND_OMAP2=y ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# LPDDR flash memory drivers ++# ++# CONFIG_MTD_LPDDR is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=16384 ++# CONFIG_BLK_DEV_XIP is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_MISC_DEVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_LIBFC is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_DH is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_NET_ETHERNET is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_IWLWIFI_LEDS is not set ++ ++# ++# Enable WiMAX (Networking options) to see the WiMAX drivers ++# ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++# CONFIG_INPUT_KEYBOARD is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++CONFIG_DEVKMEM=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_8250=y ++CONFIG_SERIAL_8250_CONSOLE=y ++CONFIG_SERIAL_8250_NR_UARTS=32 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=4 ++CONFIG_SERIAL_8250_EXTENDED=y ++CONFIG_SERIAL_8250_MANY_PORTS=y ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++CONFIG_SERIAL_8250_DETECT_IRQ=y ++CONFIG_SERIAL_8250_RSA=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_HELPER_AUTO=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++CONFIG_I2C_OMAP=y ++# CONFIG_I2C_SIMTEC is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_TAOS_EVM is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_STUB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCA9539 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TWL4030_MADC is not set ++# CONFIG_TWL4030_POWEROFF is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++# CONFIG_SPI is not set ++CONFIG_ARCH_REQUIRE_GPIOLIB=y ++CONFIG_GPIOLIB=y ++# CONFIG_DEBUG_GPIO is not set ++# CONFIG_GPIO_SYSFS is not set ++ ++# ++# Memory mapped GPIO expanders: ++# ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_MAX732X is not set ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++CONFIG_GPIO_TWL4030=y ++ ++# ++# PCI GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++# CONFIG_THERMAL is not set ++# CONFIG_THERMAL_HWMON is not set ++# CONFIG_WATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++ ++# ++# Sonics Silicon Backplane ++# ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_CORE is not set ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++# CONFIG_HTC_EGPIO is not set ++# CONFIG_HTC_PASIC3 is not set ++# CONFIG_TPS65010 is not set ++CONFIG_TWL4030_CORE=y ++# CONFIG_TWL4030_POWER is not set ++# CONFIG_MFD_TMIO is not set ++# CONFIG_MFD_T7L66XB is not set ++# CONFIG_MFD_TC6387XB is not set ++# CONFIG_MFD_TC6393XB is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_PCF50633 is not set ++ ++# ++# Multimedia devices ++# ++ ++# ++# Multimedia core support ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_VIDEO_MEDIA is not set ++ ++# ++# Multimedia drivers ++# ++CONFIG_DAB=y ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++# CONFIG_FB_BOOT_VESA_SUPPORT is not set ++CONFIG_FB_CFB_FILLRECT=m ++CONFIG_FB_CFB_COPYAREA=m ++CONFIG_FB_CFB_IMAGEBLIT=m ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++# CONFIG_FB_SYS_FOPS is not set ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set ++CONFIG_OMAP2_DSS=m ++CONFIG_OMAP2_DSS_VRAM_SIZE=12 ++CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y ++# CONFIG_OMAP2_DSS_RFBI is not set ++CONFIG_OMAP2_DSS_VENC=y ++# CONFIG_OMAP2_DSS_SDI is not set ++# CONFIG_OMAP2_DSS_DSI is not set ++# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set ++CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 ++ ++# ++# OMAP2/3 Display Device Drivers ++# ++CONFIG_PANEL_GENERIC=m ++# CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C is not set ++# CONFIG_PANEL_SHARP_LS037V7DW01 is not set ++# CONFIG_PANEL_N800 is not set ++# CONFIG_CTRL_BLIZZARD is not set ++CONFIG_FB_OMAP2=m ++CONFIG_FB_OMAP2_DEBUG_SUPPORT=y ++# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set ++CONFIG_FB_OMAP2_NUM_FBS=3 ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE is not set ++# CONFIG_LOGO is not set ++# CONFIG_SOUND is not set ++# CONFIG_HID_SUPPORT is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++CONFIG_USB_ARCH_HAS_EHCI=y ++# CONFIG_USB is not set ++# CONFIG_USB_OTG_WHITELIST is not set ++# CONFIG_USB_OTG_BLACKLIST_HUB is not set ++CONFIG_USB_MUSB_HDRC=y ++CONFIG_USB_MUSB_SOC=y ++ ++# ++# OMAP 343x high speed USB support ++# ++# CONFIG_USB_MUSB_HOST is not set ++CONFIG_USB_MUSB_PERIPHERAL=y ++# CONFIG_USB_MUSB_OTG is not set ++CONFIG_USB_GADGET_MUSB_HDRC=y ++# CONFIG_MUSB_PIO_ONLY is not set ++CONFIG_USB_INVENTRA_DMA=y ++# CONFIG_USB_TI_CPPI_DMA is not set ++# CONFIG_USB_MUSB_DEBUG is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; ++# ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_PXA25X is not set ++# CONFIG_USB_GADGET_PXA27X is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_IMX is not set ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_FSL_QE is not set ++# CONFIG_USB_GADGET_CI13XXX is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++CONFIG_USB_GADGET_DUALSPEED=y ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=y ++CONFIG_USB_ETH_RNDIS=y ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FILE_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++ ++# ++# OTG and related infrastructure ++# ++CONFIG_USB_OTG_UTILS=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_ISP1301_OMAP is not set ++CONFIG_TWL4030_USB=y ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD/SDIO Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++# CONFIG_MMC_SDHCI is not set ++CONFIG_MMC_OMAP_HS=y ++# CONFIG_MEMSTICK is not set ++# CONFIG_ACCESSIBILITY is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++CONFIG_RTC_DRV_TWL4030=y ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_BQ4802 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_DMADEVICES is not set ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_BQ24022 is not set ++CONFIG_REGULATOR_TWL4030=y ++# CONFIG_UIO is not set ++# CONFIG_STAGING is not set ++ ++# ++# CBUS support ++# ++# CONFIG_CBUS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++# CONFIG_EXT3_FS_XATTR is not set ++# CONFIG_EXT4_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++CONFIG_FILE_LOCKING=y ++# CONFIG_XFS_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++CONFIG_PRINT_QUOTA_WARNING=y ++CONFIG_QUOTA_TREE=y ++# CONFIG_QFMT_V1 is not set ++CONFIG_QFMT_V2=y ++CONFIG_QUOTACTL=y ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_SQUASHFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++CONFIG_NFS_V4=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFSD is not set ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++# CONFIG_SUNRPC_REGISTER_V4 is not set ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_FRAME_WARN=1024 ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++CONFIG_DEBUG_MUTEXES=y ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_WRITECOUNT is not set ++# CONFIG_DEBUG_MEMORY_INIT is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_CPU_STALL_DETECTOR is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_LATENCYTOP is not set ++CONFIG_HAVE_FUNCTION_TRACER=y ++ ++# ++# Tracers ++# ++# CONFIG_FUNCTION_TRACER is not set ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_SCHED_TRACER is not set ++# CONFIG_CONTEXT_SWITCH_TRACER is not set ++# CONFIG_BOOT_TRACER is not set ++# CONFIG_TRACE_BRANCH_PROFILING is not set ++# CONFIG_STACK_TRACER is not set ++# CONFIG_DYNAMIC_PRINTK_DEBUG is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_ARCH_KGDB=y ++# CONFIG_KGDB is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_DEBUG_LL is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITYFS is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++# CONFIG_CRYPTO_FIPS is not set ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_BLKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_TEST is not set ++ ++# ++# Authenticated Encryption with Associated Data ++# ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_SEQIV is not set ++ ++# ++# Block modes ++# ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_CTS is not set ++CONFIG_CRYPTO_ECB=m ++# CONFIG_CRYPTO_LRW is not set ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_XTS is not set ++ ++# ++# Hash modes ++# ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++ ++# ++# Digest ++# ++CONFIG_CRYPTO_CRC32C=y ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_RMD128 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++# CONFIG_CRYPTO_RMD256 is not set ++# CONFIG_CRYPTO_RMD320 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_WP512 is not set ++ ++# ++# Ciphers ++# ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++ ++# ++# Compression ++# ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_LZO is not set ++ ++# ++# Random Number Generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_GENERIC_FIND_LAST_BIT=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_T10DIF is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff --git a/arch/arm/configs/dss_omap_3430sdp_defconfig b/arch/arm/configs/dss_omap_3430sdp_defconfig +new file mode 100644 +index 0000000..dc30dce +--- /dev/null ++++ b/arch/arm/configs/dss_omap_3430sdp_defconfig +@@ -0,0 +1,1634 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.29-omap1 ++# Thu Apr 2 11:11:24 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_HAVE_LATENCYTOP_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++CONFIG_BSD_PROCESS_ACCT=y ++# CONFIG_BSD_PROCESS_ACCT_V3 is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++ ++# ++# RCU Subsystem ++# ++CONFIG_CLASSIC_RCU=y ++# CONFIG_TREE_RCU is not set ++# CONFIG_PREEMPT_RCU is not set ++# CONFIG_TREE_RCU_TRACE is not set ++# CONFIG_PREEMPT_RCU_TRACE is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++# CONFIG_CGROUPS is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_ANON_INODES=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++# CONFIG_SYSCTL_SYSCALL is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++CONFIG_KALLSYMS_EXTRA_PASS=y ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_COMPAT_BRK=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_GENERIC_DMA_COHERENT=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++CONFIG_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_BLK_DEV_BSG is not set ++# CONFIG_BLK_DEV_INTEGRITY is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++CONFIG_DEFAULT_AS=y ++# CONFIG_DEFAULT_DEADLINE is not set ++# CONFIG_DEFAULT_CFQ is not set ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="anticipatory" ++CONFIG_FREEZER=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KIRKWOOD is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_LOKI is not set ++# CONFIG_ARCH_MV78XX0 is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION5X is not set ++# CONFIG_ARCH_PNX4008 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_S3C64XX is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++CONFIG_ARCH_OMAP=y ++# CONFIG_ARCH_MSM is not set ++# CONFIG_ARCH_W90X900 is not set ++ ++# ++# TI OMAP Implementations ++# ++CONFIG_ARCH_OMAP_OTG=y ++# CONFIG_ARCH_OMAP1 is not set ++# CONFIG_ARCH_OMAP2 is not set ++CONFIG_ARCH_OMAP3=y ++ ++# ++# OMAP Feature Selections ++# ++# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set ++# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set ++CONFIG_OMAP_SMARTREFLEX=y ++# CONFIG_OMAP_SMARTREFLEX_TESTING is not set ++CONFIG_OMAP_RESET_CLOCKS=y ++CONFIG_OMAP_BOOT_TAG=y ++CONFIG_OMAP_BOOT_REASON=y ++# CONFIG_OMAP_COMPONENT_VERSION is not set ++# CONFIG_OMAP_GPIO_SWITCH is not set ++CONFIG_OMAP_MUX=y ++CONFIG_OMAP_MUX_DEBUG=y ++CONFIG_OMAP_MUX_WARNINGS=y ++# CONFIG_OMAP_MCBSP is not set ++# CONFIG_OMAP_MBOX_FWK is not set ++# CONFIG_OMAP_MPU_TIMER is not set ++CONFIG_OMAP_32K_TIMER=y ++CONFIG_OMAP_32K_TIMER_HZ=128 ++CONFIG_OMAP_TICK_GPTIMER=1 ++CONFIG_OMAP_DM_TIMER=y ++CONFIG_OMAP_LL_DEBUG_UART1=y ++# CONFIG_OMAP_LL_DEBUG_UART2 is not set ++# CONFIG_OMAP_LL_DEBUG_UART3 is not set ++CONFIG_OMAP_SERIAL_WAKE=y ++CONFIG_ARCH_OMAP34XX=y ++CONFIG_ARCH_OMAP3430=y ++ ++# ++# OMAP Board Type ++# ++# CONFIG_MACH_NOKIA_RX51 is not set ++# CONFIG_MACH_OMAP_LDP is not set ++CONFIG_MACH_OMAP_3430SDP=y ++# CONFIG_MACH_OMAP3EVM is not set ++# CONFIG_MACH_OMAP3_BEAGLE is not set ++# CONFIG_MACH_OVERO is not set ++# CONFIG_MACH_OMAP3_PANDORA is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_32v6K=y ++CONFIG_CPU_V7=y ++CONFIG_CPU_32v7=y ++CONFIG_CPU_ABRT_EV7=y ++CONFIG_CPU_PABRT_IFAR=y ++CONFIG_CPU_CACHE_V7=y ++CONFIG_CPU_CACHE_VIPT=y ++CONFIG_CPU_COPY_V6=y ++CONFIG_CPU_TLB_V7=y ++CONFIG_CPU_HAS_ASID=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_ARM_THUMBEE is not set ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_BPREDICT_DISABLE is not set ++CONFIG_HAS_TLS_REG=y ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++CONFIG_VMSPLIT_3G=y ++# CONFIG_VMSPLIT_2G is not set ++# CONFIG_VMSPLIT_1G is not set ++CONFIG_PAGE_OFFSET=0xC0000000 ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=128 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++CONFIG_ARCH_FLATMEM_HAS_HOLES=y ++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set ++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_PAGEFLAGS_EXTENDED=y ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_PHYS_ADDR_T_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=0 ++CONFIG_VIRT_TO_BUS=y ++CONFIG_UNEVICTABLE_LRU=y ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:tgt:eth0:off rw console=ttyS2,115200n8" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# CPU Power Management ++# ++# CONFIG_CPU_FREQ is not set ++# CONFIG_CPU_IDLE is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_FPE_NWFPE=y ++# CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set ++CONFIG_VFP=y ++CONFIG_VFPv3=y ++# CONFIG_NEON is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set ++CONFIG_HAVE_AOUT=y ++# CONFIG_BINFMT_AOUT is not set ++CONFIG_BINFMT_MISC=y ++ ++# ++# Power management options ++# ++CONFIG_PM=y ++# CONFIG_PM_DEBUG is not set ++CONFIG_PM_SLEEP=y ++CONFIG_SUSPEND=y ++CONFIG_SUSPEND_FREEZER=y ++# CONFIG_APM_EMULATION is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_COMPAT_NET_DEV_OPS=y ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++CONFIG_IP_PNP_BOOTP=y ++CONFIG_IP_PNP_RARP=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++# CONFIG_DCB is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_PHONET is not set ++CONFIG_WIRELESS=y ++# CONFIG_CFG80211 is not set ++CONFIG_WIRELESS_OLD_REGULATORY=y ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_LIB80211 is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_WIMAX is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_CONCAT=y ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_TESTS is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_AR7_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++# CONFIG_MTD_CFI_ADV_OPTIONS is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++CONFIG_MTD_OMAP_NOR=y ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++CONFIG_MTD_NAND_ECC_SMC=y ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_GPIO is not set ++CONFIG_MTD_NAND_OMAP2=y ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++CONFIG_MTD_ONENAND=y ++CONFIG_MTD_ONENAND_VERIFY_WRITE=y ++# CONFIG_MTD_ONENAND_GENERIC is not set ++CONFIG_MTD_ONENAND_OMAP2=y ++# CONFIG_MTD_ONENAND_OTP is not set ++# CONFIG_MTD_ONENAND_2X_PROGRAM is not set ++# CONFIG_MTD_ONENAND_SIM is not set ++ ++# ++# LPDDR flash memory drivers ++# ++# CONFIG_MTD_LPDDR is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=16384 ++# CONFIG_BLK_DEV_XIP is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_ICS932S401 is not set ++# CONFIG_OMAP_STI is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++# CONFIG_EEPROM_AT24 is not set ++# CONFIG_EEPROM_AT25 is not set ++# CONFIG_EEPROM_LEGACY is not set ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_LIBFC is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_DH is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_AX88796 is not set ++CONFIG_SMC91X=y ++# CONFIG_DM9000 is not set ++# CONFIG_ENC28J60 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_SMSC911X is not set ++# CONFIG_DNET is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set ++# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set ++# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_IWLWIFI_LEDS is not set ++ ++# ++# Enable WiMAX (Networking options) to see the WiMAX drivers ++# ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++CONFIG_KEYBOARD_TWL4030=y ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++CONFIG_TOUCHSCREEN_ADS7846=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_INEXIO is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_TSC2005 is not set ++# CONFIG_TOUCHSCREEN_TSC210X is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set ++# CONFIG_TOUCHSCREEN_TSC2007 is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++CONFIG_DEVKMEM=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_8250=y ++CONFIG_SERIAL_8250_CONSOLE=y ++CONFIG_SERIAL_8250_NR_UARTS=32 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=4 ++CONFIG_SERIAL_8250_EXTENDED=y ++CONFIG_SERIAL_8250_MANY_PORTS=y ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++CONFIG_SERIAL_8250_DETECT_IRQ=y ++CONFIG_SERIAL_8250_RSA=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_HELPER_AUTO=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++CONFIG_I2C_OMAP=y ++# CONFIG_I2C_SIMTEC is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_STUB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCA9539 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TWL4030_MADC is not set ++# CONFIG_TWL4030_POWEROFF is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_BITBANG is not set ++# CONFIG_SPI_GPIO is not set ++CONFIG_SPI_OMAP24XX=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_TSC210X is not set ++# CONFIG_SPI_TSC2301 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_ARCH_REQUIRE_GPIOLIB=y ++CONFIG_GPIOLIB=y ++# CONFIG_DEBUG_GPIO is not set ++# CONFIG_GPIO_SYSFS is not set ++ ++# ++# Memory mapped GPIO expanders: ++# ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_MAX732X is not set ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++CONFIG_GPIO_TWL4030=y ++ ++# ++# PCI GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_GPIO_MAX7301 is not set ++# CONFIG_GPIO_MCP23S08 is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++# CONFIG_THERMAL is not set ++# CONFIG_THERMAL_HWMON is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_OMAP_WATCHDOG=y ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++ ++# ++# Sonics Silicon Backplane ++# ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_CORE is not set ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++# CONFIG_HTC_EGPIO is not set ++# CONFIG_HTC_PASIC3 is not set ++# CONFIG_TPS65010 is not set ++CONFIG_TWL4030_CORE=y ++# CONFIG_TWL4030_POWER is not set ++# CONFIG_MFD_TMIO is not set ++# CONFIG_MFD_T7L66XB is not set ++# CONFIG_MFD_TC6387XB is not set ++# CONFIG_MFD_TC6393XB is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_PCF50633 is not set ++ ++# ++# Multimedia devices ++# ++ ++# ++# Multimedia core support ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_VIDEO_MEDIA is not set ++ ++# ++# Multimedia drivers ++# ++CONFIG_DAB=y ++# CONFIG_USB_DABUSB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++# CONFIG_FB_BOOT_VESA_SUPPORT is not set ++CONFIG_FB_CFB_FILLRECT=m ++CONFIG_FB_CFB_COPYAREA=m ++CONFIG_FB_CFB_IMAGEBLIT=m ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++# CONFIG_FB_SYS_FOPS is not set ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++# CONFIG_FB_OMAP_LCD_VGA is not set ++# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set ++CONFIG_OMAP2_DSS=m ++CONFIG_OMAP2_DSS_VRAM_SIZE=8 ++CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y ++# CONFIG_OMAP2_DSS_RFBI is not set ++CONFIG_OMAP2_DSS_VENC=y ++# CONFIG_OMAP2_DSS_SDI is not set ++# CONFIG_OMAP2_DSS_DSI is not set ++# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set ++CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 ++ ++# ++# OMAP2/3 Display Device Drivers ++# ++CONFIG_PANEL_GENERIC=m ++# CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C is not set ++CONFIG_PANEL_SHARP_LS037V7DW01=m ++# CONFIG_PANEL_N800 is not set ++# CONFIG_CTRL_BLIZZARD is not set ++CONFIG_FB_OMAP2=m ++CONFIG_FB_OMAP2_DEBUG_SUPPORT=y ++# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set ++CONFIG_FB_OMAP2_NUM_FBS=3 ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE is not set ++# CONFIG_LOGO is not set ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++# CONFIG_HIDRAW is not set ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_HID_PID is not set ++# CONFIG_USB_HIDDEV is not set ++ ++# ++# Special HID drivers ++# ++CONFIG_HID_COMPAT=y ++# CONFIG_HID_A4TECH is not set ++# CONFIG_HID_APPLE is not set ++# CONFIG_HID_BELKIN is not set ++# CONFIG_HID_CHERRY is not set ++# CONFIG_HID_CHICONY is not set ++# CONFIG_HID_CYPRESS is not set ++# CONFIG_HID_EZKEY is not set ++# CONFIG_HID_GYRATION is not set ++# CONFIG_HID_LOGITECH is not set ++# CONFIG_HID_MICROSOFT is not set ++# CONFIG_HID_MONTEREY is not set ++# CONFIG_HID_NTRIG is not set ++# CONFIG_HID_PANTHERLORD is not set ++# CONFIG_HID_PETALYNX is not set ++# CONFIG_HID_SAMSUNG is not set ++# CONFIG_HID_SONY is not set ++# CONFIG_HID_SUNPLUS is not set ++# CONFIG_GREENASIA_FF is not set ++# CONFIG_HID_TOPSEED is not set ++# CONFIG_THRUSTMASTER_FF is not set ++# CONFIG_ZEROPLUS_FF is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++CONFIG_USB_ARCH_HAS_EHCI=y ++CONFIG_USB=y ++CONFIG_USB_DEBUG=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++# CONFIG_USB_DEVICE_CLASS is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++CONFIG_USB_SUSPEND=y ++CONFIG_USB_OTG=y ++# CONFIG_USB_OTG_WHITELIST is not set ++# CONFIG_USB_OTG_BLACKLIST_HUB is not set ++CONFIG_USB_MON=y ++# CONFIG_USB_WUSB is not set ++# CONFIG_USB_WUSB_CBAF is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_C67X00_HCD is not set ++CONFIG_USB_EHCI_HCD=m ++CONFIG_OMAP_EHCI_PHY_MODE=y ++# CONFIG_OMAP_EHCI_TLL_MODE is not set ++# CONFIG_USB_EHCI_ROOT_HUB_TT is not set ++# CONFIG_USB_EHCI_TT_NEWSCHED is not set ++# CONFIG_USB_OXU210HP_HCD is not set ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_OHCI_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++# CONFIG_USB_HWA_HCD is not set ++CONFIG_USB_MUSB_HDRC=y ++CONFIG_USB_MUSB_SOC=y ++ ++# ++# OMAP 343x high speed USB support ++# ++# CONFIG_USB_MUSB_HOST is not set ++# CONFIG_USB_MUSB_PERIPHERAL is not set ++CONFIG_USB_MUSB_OTG=y ++CONFIG_USB_GADGET_MUSB_HDRC=y ++CONFIG_USB_MUSB_HDRC_HCD=y ++# CONFIG_MUSB_PIO_ONLY is not set ++CONFIG_USB_INVENTRA_DMA=y ++# CONFIG_USB_TI_CPPI_DMA is not set ++# CONFIG_USB_MUSB_DEBUG is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_WDM is not set ++# CONFIG_USB_TMC is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; ++# ++ ++# ++# see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_SEVSEG is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_SISUSBVGA is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++CONFIG_USB_TEST=y ++# CONFIG_USB_ISIGHTFW is not set ++# CONFIG_USB_VST is not set ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_DEBUG=y ++CONFIG_USB_GADGET_DEBUG_FILES=y ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_PXA25X is not set ++# CONFIG_USB_GADGET_PXA27X is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_IMX is not set ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_FSL_QE is not set ++# CONFIG_USB_GADGET_CI13XXX is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++CONFIG_USB_GADGET_DUALSPEED=y ++CONFIG_USB_ZERO=m ++# CONFIG_USB_ZERO_HNPTEST is not set ++# CONFIG_USB_ETH is not set ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FILE_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++ ++# ++# OTG and related infrastructure ++# ++CONFIG_USB_OTG_UTILS=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_ISP1301_OMAP is not set ++CONFIG_TWL4030_USB=y ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD/SDIO Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++# CONFIG_MMC_SDHCI is not set ++CONFIG_MMC_OMAP_HS=m ++# CONFIG_MMC_SPI is not set ++# CONFIG_MEMSTICK is not set ++# CONFIG_ACCESSIBILITY is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++CONFIG_RTC_DRV_TWL4030=y ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_M41T94 is not set ++# CONFIG_RTC_DRV_DS1305 is not set ++# CONFIG_RTC_DRV_DS1390 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++# CONFIG_RTC_DRV_R9701 is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_DS3234 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_BQ4802 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_DMADEVICES is not set ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_BQ24022 is not set ++CONFIG_REGULATOR_TWL4030=y ++# CONFIG_UIO is not set ++# CONFIG_STAGING is not set ++ ++# ++# CBUS support ++# ++# CONFIG_CBUS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++# CONFIG_EXT3_FS_XATTR is not set ++# CONFIG_EXT4_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++CONFIG_FILE_LOCKING=y ++# CONFIG_XFS_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++CONFIG_PRINT_QUOTA_WARNING=y ++CONFIG_QUOTA_TREE=y ++# CONFIG_QFMT_V1 is not set ++CONFIG_QFMT_V2=y ++CONFIG_QUOTACTL=y ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++CONFIG_JFFS2_COMPRESSION_OPTIONS=y ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_JFFS2_CMODE_NONE is not set ++CONFIG_JFFS2_CMODE_PRIORITY=y ++# CONFIG_JFFS2_CMODE_SIZE is not set ++# CONFIG_JFFS2_CMODE_FAVOURLZO is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_SQUASHFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++CONFIG_NFS_V4=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFSD is not set ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++# CONFIG_SUNRPC_REGISTER_V4 is not set ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_FRAME_WARN=1024 ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++CONFIG_DEBUG_MUTEXES=y ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_WRITECOUNT is not set ++# CONFIG_DEBUG_MEMORY_INIT is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_CPU_STALL_DETECTOR is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_LATENCYTOP is not set ++CONFIG_HAVE_FUNCTION_TRACER=y ++ ++# ++# Tracers ++# ++# CONFIG_FUNCTION_TRACER is not set ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_SCHED_TRACER is not set ++# CONFIG_CONTEXT_SWITCH_TRACER is not set ++# CONFIG_BOOT_TRACER is not set ++# CONFIG_TRACE_BRANCH_PROFILING is not set ++# CONFIG_STACK_TRACER is not set ++# CONFIG_DYNAMIC_PRINTK_DEBUG is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_ARCH_KGDB=y ++# CONFIG_KGDB is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_DEBUG_LL is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITYFS is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++# CONFIG_CRYPTO_FIPS is not set ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_BLKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_TEST is not set ++ ++# ++# Authenticated Encryption with Associated Data ++# ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_SEQIV is not set ++ ++# ++# Block modes ++# ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_CTS is not set ++CONFIG_CRYPTO_ECB=m ++# CONFIG_CRYPTO_LRW is not set ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_XTS is not set ++ ++# ++# Hash modes ++# ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++ ++# ++# Digest ++# ++CONFIG_CRYPTO_CRC32C=y ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_RMD128 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++# CONFIG_CRYPTO_RMD256 is not set ++# CONFIG_CRYPTO_RMD320 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_WP512 is not set ++ ++# ++# Ciphers ++# ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++ ++# ++# Compression ++# ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_LZO is not set ++ ++# ++# Random Number Generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_GENERIC_FIND_LAST_BIT=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_T10DIF is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff --git a/arch/arm/configs/dss_overo_defconfig b/arch/arm/configs/dss_overo_defconfig +new file mode 100644 +index 0000000..755a1b6 +--- /dev/null ++++ b/arch/arm/configs/dss_overo_defconfig +@@ -0,0 +1,1862 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.29-omap1 ++# Thu Apr 2 11:30:57 2009 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_HAVE_LATENCYTOP_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y ++CONFIG_OPROFILE_ARMV7=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++CONFIG_BSD_PROCESS_ACCT=y ++# CONFIG_BSD_PROCESS_ACCT_V3 is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++ ++# ++# RCU Subsystem ++# ++CONFIG_CLASSIC_RCU=y ++# CONFIG_TREE_RCU is not set ++# CONFIG_PREEMPT_RCU is not set ++# CONFIG_TREE_RCU_TRACE is not set ++# CONFIG_PREEMPT_RCU_TRACE is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++# CONFIG_CGROUPS is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++# CONFIG_NAMESPACES is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_ANON_INODES=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++# CONFIG_SYSCTL_SYSCALL is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++# CONFIG_ELF_CORE is not set ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_COMPAT_BRK is not set ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++CONFIG_PROFILING=y ++CONFIG_TRACEPOINTS=y ++# CONFIG_MARKERS is not set ++CONFIG_OPROFILE=y ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_KPROBES is not set ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_GENERIC_DMA_COHERENT=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++CONFIG_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_BLK_DEV_BSG is not set ++# CONFIG_BLK_DEV_INTEGRITY is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_FREEZER=y ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KIRKWOOD is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_LOKI is not set ++# CONFIG_ARCH_MV78XX0 is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_ORION5X is not set ++# CONFIG_ARCH_PNX4008 is not set ++# CONFIG_ARCH_PXA is not set ++# CONFIG_ARCH_RPC is not set ++# CONFIG_ARCH_SA1100 is not set ++# CONFIG_ARCH_S3C2410 is not set ++# CONFIG_ARCH_S3C64XX is not set ++# CONFIG_ARCH_SHARK is not set ++# CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set ++CONFIG_ARCH_OMAP=y ++# CONFIG_ARCH_MSM is not set ++# CONFIG_ARCH_W90X900 is not set ++ ++# ++# TI OMAP Implementations ++# ++CONFIG_ARCH_OMAP_OTG=y ++# CONFIG_ARCH_OMAP1 is not set ++# CONFIG_ARCH_OMAP2 is not set ++CONFIG_ARCH_OMAP3=y ++ ++# ++# OMAP Feature Selections ++# ++# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set ++# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set ++CONFIG_OMAP_SMARTREFLEX=y ++# CONFIG_OMAP_SMARTREFLEX_TESTING is not set ++# CONFIG_OMAP_RESET_CLOCKS is not set ++CONFIG_OMAP_BOOT_TAG=y ++CONFIG_OMAP_BOOT_REASON=y ++# CONFIG_OMAP_COMPONENT_VERSION is not set ++# CONFIG_OMAP_GPIO_SWITCH is not set ++# CONFIG_OMAP_MUX is not set ++CONFIG_OMAP_MCBSP=y ++# CONFIG_OMAP_MBOX_FWK is not set ++# CONFIG_OMAP_MPU_TIMER is not set ++CONFIG_OMAP_32K_TIMER=y ++CONFIG_OMAP_32K_TIMER_HZ=128 ++CONFIG_OMAP_TICK_GPTIMER=1 ++CONFIG_OMAP_DM_TIMER=y ++# CONFIG_OMAP_LL_DEBUG_UART1 is not set ++# CONFIG_OMAP_LL_DEBUG_UART2 is not set ++CONFIG_OMAP_LL_DEBUG_UART3=y ++CONFIG_ARCH_OMAP34XX=y ++CONFIG_ARCH_OMAP3430=y ++ ++# ++# OMAP Board Type ++# ++# CONFIG_MACH_NOKIA_RX51 is not set ++# CONFIG_MACH_OMAP_LDP is not set ++# CONFIG_MACH_OMAP_3430SDP is not set ++# CONFIG_MACH_OMAP3EVM is not set ++# CONFIG_MACH_OMAP3_BEAGLE is not set ++CONFIG_MACH_OVERO=y ++# CONFIG_MACH_OMAP3_PANDORA is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_32v6K=y ++CONFIG_CPU_V7=y ++CONFIG_CPU_32v7=y ++CONFIG_CPU_ABRT_EV7=y ++CONFIG_CPU_PABRT_IFAR=y ++CONFIG_CPU_CACHE_V7=y ++CONFIG_CPU_CACHE_VIPT=y ++CONFIG_CPU_COPY_V6=y ++CONFIG_CPU_TLB_V7=y ++CONFIG_CPU_HAS_ASID=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++CONFIG_ARM_THUMBEE=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_BPREDICT_DISABLE is not set ++CONFIG_HAS_TLS_REG=y ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y ++CONFIG_VMSPLIT_3G=y ++# CONFIG_VMSPLIT_2G is not set ++# CONFIG_VMSPLIT_1G is not set ++CONFIG_PAGE_OFFSET=0xC0000000 ++# CONFIG_PREEMPT is not set ++CONFIG_HZ=128 ++CONFIG_AEABI=y ++# CONFIG_OABI_COMPAT is not set ++CONFIG_ARCH_FLATMEM_HAS_HOLES=y ++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set ++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_PAGEFLAGS_EXTENDED=y ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_PHYS_ADDR_T_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=0 ++CONFIG_VIRT_TO_BUS=y ++CONFIG_UNEVICTABLE_LRU=y ++CONFIG_LEDS=y ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.2.14:/tftpboot/rootfs ip=192.168.2.15 nolock,rsize=1024,wsize=1024 rw" ++# CONFIG_XIP_KERNEL is not set ++CONFIG_KEXEC=y ++CONFIG_ATAGS_PROC=y ++ ++# ++# CPU Power Management ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_TABLE=y ++# CONFIG_CPU_FREQ_DEBUG is not set ++CONFIG_CPU_FREQ_STAT=y ++CONFIG_CPU_FREQ_STAT_DETAILS=y ++CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set ++# CONFIG_CPU_IDLE is not set ++ ++# ++# Floating point emulation ++# ++ ++# ++# At least one emulation must be selected ++# ++CONFIG_VFP=y ++CONFIG_VFPv3=y ++CONFIG_NEON=y ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_HAVE_AOUT=y ++CONFIG_BINFMT_AOUT=m ++CONFIG_BINFMT_MISC=y ++ ++# ++# Power management options ++# ++CONFIG_PM=y ++# CONFIG_PM_DEBUG is not set ++CONFIG_PM_SLEEP=y ++CONFIG_SUSPEND=y ++CONFIG_SUSPEND_FREEZER=y ++# CONFIG_APM_EMULATION is not set ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_COMPAT_NET_DEV_OPS=y ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++CONFIG_IP_PNP_BOOTP=y ++CONFIG_IP_PNP_RARP=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++CONFIG_INET_TUNNEL=m ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=m ++# CONFIG_IPV6_PRIVACY is not set ++# CONFIG_IPV6_ROUTER_PREF is not set ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++# CONFIG_INET6_AH is not set ++# CONFIG_INET6_ESP is not set ++# CONFIG_INET6_IPCOMP is not set ++# CONFIG_IPV6_MIP6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_INET6_XFRM_MODE_TRANSPORT=m ++CONFIG_INET6_XFRM_MODE_TUNNEL=m ++CONFIG_INET6_XFRM_MODE_BEET=m ++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set ++CONFIG_IPV6_SIT=m ++CONFIG_IPV6_NDISC_NODETYPE=y ++# CONFIG_IPV6_TUNNEL is not set ++# CONFIG_IPV6_MULTIPLE_TABLES is not set ++# CONFIG_IPV6_MROUTE is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++# CONFIG_DCB is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++CONFIG_BT=y ++CONFIG_BT_L2CAP=y ++CONFIG_BT_SCO=y ++CONFIG_BT_RFCOMM=y ++CONFIG_BT_RFCOMM_TTY=y ++CONFIG_BT_BNEP=y ++CONFIG_BT_BNEP_MC_FILTER=y ++CONFIG_BT_BNEP_PROTO_FILTER=y ++CONFIG_BT_HIDP=y ++ ++# ++# Bluetooth device drivers ++# ++# CONFIG_BT_HCIBTSDIO is not set ++CONFIG_BT_HCIUART=y ++CONFIG_BT_HCIUART_H4=y ++CONFIG_BT_HCIUART_BCSP=y ++# CONFIG_BT_HCIUART_LL is not set ++# CONFIG_BT_HCIBRF6150 is not set ++# CONFIG_BT_HCIH4P is not set ++# CONFIG_BT_HCIVHCI is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_PHONET is not set ++CONFIG_WIRELESS=y ++CONFIG_CFG80211=y ++# CONFIG_CFG80211_REG_DEBUG is not set ++CONFIG_NL80211=y ++CONFIG_WIRELESS_OLD_REGULATORY=y ++CONFIG_WIRELESS_EXT=y ++CONFIG_WIRELESS_EXT_SYSFS=y ++CONFIG_LIB80211=y ++CONFIG_LIB80211_CRYPT_WEP=m ++CONFIG_LIB80211_CRYPT_CCMP=m ++CONFIG_LIB80211_CRYPT_TKIP=m ++# CONFIG_LIB80211_DEBUG is not set ++CONFIG_MAC80211=y ++ ++# ++# Rate control algorithm selection ++# ++CONFIG_MAC80211_RC_PID=y ++CONFIG_MAC80211_RC_MINSTREL=y ++CONFIG_MAC80211_RC_DEFAULT_PID=y ++# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set ++CONFIG_MAC80211_RC_DEFAULT="pid" ++# CONFIG_MAC80211_MESH is not set ++CONFIG_MAC80211_LEDS=y ++# CONFIG_MAC80211_DEBUGFS is not set ++# CONFIG_MAC80211_DEBUG_MENU is not set ++# CONFIG_WIMAX is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++CONFIG_FIRMWARE_IN_KERNEL=y ++CONFIG_EXTRA_FIRMWARE="" ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_CONCAT=y ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_TESTS is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_AR7_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++# CONFIG_MTD_NAND_GPIO is not set ++CONFIG_MTD_NAND_OMAP2=y ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# LPDDR flash memory drivers ++# ++# CONFIG_MTD_LPDDR is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_CRYPTOLOOP=m ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=16384 ++# CONFIG_BLK_DEV_XIP is not set ++CONFIG_CDROM_PKTCDVD=m ++CONFIG_CDROM_PKTCDVD_BUFFERS=8 ++# CONFIG_CDROM_PKTCDVD_WCACHE is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_ICS932S401 is not set ++# CONFIG_OMAP_STI is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++# CONFIG_EEPROM_AT24 is not set ++# CONFIG_EEPROM_AT25 is not set ++# CONFIG_EEPROM_LEGACY is not set ++CONFIG_EEPROM_93CX6=m ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++CONFIG_RAID_ATTRS=m ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=m ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_LIBFC is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_DH is not set ++# CONFIG_ATA is not set ++CONFIG_MD=y ++CONFIG_BLK_DEV_MD=m ++CONFIG_MD_LINEAR=m ++CONFIG_MD_RAID0=m ++CONFIG_MD_RAID1=m ++CONFIG_MD_RAID10=m ++CONFIG_MD_RAID456=m ++CONFIG_MD_RAID5_RESHAPE=y ++CONFIG_MD_MULTIPATH=m ++CONFIG_MD_FAULTY=m ++CONFIG_BLK_DEV_DM=m ++# CONFIG_DM_DEBUG is not set ++CONFIG_DM_CRYPT=m ++CONFIG_DM_SNAPSHOT=m ++CONFIG_DM_MIRROR=m ++CONFIG_DM_ZERO=m ++CONFIG_DM_MULTIPATH=m ++CONFIG_DM_DELAY=m ++# CONFIG_DM_UEVENT is not set ++CONFIG_NETDEVICES=y ++CONFIG_DUMMY=m ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++CONFIG_TUN=m ++# CONFIG_VETH is not set ++# CONFIG_NET_ETHERNET is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++CONFIG_WLAN_80211=y ++CONFIG_LIBERTAS=y ++CONFIG_LIBERTAS_SDIO=y ++CONFIG_LIBERTAS_DEBUG=y ++# CONFIG_LIBERTAS_THINFIRM is not set ++# CONFIG_MAC80211_HWSIM is not set ++CONFIG_P54_COMMON=m ++# CONFIG_IWLWIFI_LEDS is not set ++CONFIG_HOSTAP=m ++CONFIG_HOSTAP_FIRMWARE=y ++CONFIG_HOSTAP_FIRMWARE_NVRAM=y ++# CONFIG_B43 is not set ++# CONFIG_B43LEGACY is not set ++# CONFIG_RT2X00 is not set ++ ++# ++# Enable WiMAX (Networking options) to see the WiMAX drivers ++# ++# CONFIG_WAN is not set ++CONFIG_PPP=m ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_MPPE=m ++CONFIG_PPPOE=m ++# CONFIG_PPPOL2TP is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=m ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_TWL4030 is not set ++# CONFIG_KEYBOARD_LM8323 is not set ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_ELANTECH is not set ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_BCM5974 is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_DEVKMEM=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_8250=y ++CONFIG_SERIAL_8250_CONSOLE=y ++CONFIG_SERIAL_8250_NR_UARTS=32 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=4 ++CONFIG_SERIAL_8250_EXTENDED=y ++CONFIG_SERIAL_8250_MANY_PORTS=y ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++CONFIG_SERIAL_8250_DETECT_IRQ=y ++CONFIG_SERIAL_8250_RSA=y ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_HELPER_AUTO=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++CONFIG_I2C_OMAP=y ++# CONFIG_I2C_SIMTEC is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_TAOS_EVM is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_STUB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCA9539 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++CONFIG_TWL4030_MADC=m ++CONFIG_TWL4030_POWEROFF=y ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_SENSORS_TSL2563 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_BITBANG is not set ++# CONFIG_SPI_GPIO is not set ++CONFIG_SPI_OMAP24XX=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_TSC210X is not set ++# CONFIG_SPI_TSC2301 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_ARCH_REQUIRE_GPIOLIB=y ++CONFIG_GPIOLIB=y ++CONFIG_DEBUG_GPIO=y ++CONFIG_GPIO_SYSFS=y ++ ++# ++# Memory mapped GPIO expanders: ++# ++ ++# ++# I2C GPIO expanders: ++# ++# CONFIG_GPIO_MAX732X is not set ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCF857X is not set ++CONFIG_GPIO_TWL4030=y ++ ++# ++# PCI GPIO expanders: ++# ++ ++# ++# SPI GPIO expanders: ++# ++# CONFIG_GPIO_MAX7301 is not set ++# CONFIG_GPIO_MCP23S08 is not set ++# CONFIG_W1 is not set ++CONFIG_POWER_SUPPLY=m ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++# CONFIG_PDA_POWER is not set ++# CONFIG_BATTERY_DS2760 is not set ++# CONFIG_TWL4030_BCI_BATTERY is not set ++# CONFIG_BATTERY_BQ27x00 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_AD7414 is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADCXX is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7462 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7473 is not set ++# CONFIG_SENSORS_ADT7475 is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM70 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_LTC4245 is not set ++# CONFIG_SENSORS_MAX1111 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_SENSORS_TSC210X is not set ++CONFIG_SENSORS_OMAP34XX=y ++# CONFIG_HWMON_DEBUG_CHIP is not set ++# CONFIG_THERMAL is not set ++# CONFIG_THERMAL_HWMON is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_OMAP_WATCHDOG=y ++CONFIG_SSB_POSSIBLE=y ++ ++# ++# Sonics Silicon Backplane ++# ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_CORE is not set ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_ASIC3 is not set ++# CONFIG_HTC_EGPIO is not set ++# CONFIG_HTC_PASIC3 is not set ++# CONFIG_TPS65010 is not set ++CONFIG_TWL4030_CORE=y ++# CONFIG_TWL4030_POWER is not set ++# CONFIG_MFD_TMIO is not set ++# CONFIG_MFD_T7L66XB is not set ++# CONFIG_MFD_TC6387XB is not set ++# CONFIG_MFD_TC6393XB is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_PCF50633 is not set ++ ++# ++# Multimedia devices ++# ++ ++# ++# Multimedia core support ++# ++CONFIG_VIDEO_DEV=m ++CONFIG_VIDEO_V4L2_COMMON=m ++CONFIG_VIDEO_ALLOW_V4L1=y ++CONFIG_VIDEO_V4L1_COMPAT=y ++CONFIG_DVB_CORE=m ++CONFIG_VIDEO_MEDIA=m ++ ++# ++# Multimedia drivers ++# ++CONFIG_MEDIA_ATTACH=y ++CONFIG_MEDIA_TUNER=m ++# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set ++CONFIG_MEDIA_TUNER_SIMPLE=m ++CONFIG_MEDIA_TUNER_TDA8290=m ++CONFIG_MEDIA_TUNER_TDA9887=m ++CONFIG_MEDIA_TUNER_TEA5761=m ++CONFIG_MEDIA_TUNER_TEA5767=m ++CONFIG_MEDIA_TUNER_MT20XX=m ++CONFIG_MEDIA_TUNER_XC2028=m ++CONFIG_MEDIA_TUNER_XC5000=m ++CONFIG_VIDEO_V4L2=m ++CONFIG_VIDEO_V4L1=m ++CONFIG_VIDEO_CAPTURE_DRIVERS=y ++# CONFIG_VIDEO_ADV_DEBUG is not set ++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set ++CONFIG_VIDEO_HELPER_CHIPS_AUTO=y ++# CONFIG_VIDEO_VIVI is not set ++# CONFIG_VIDEO_CPIA is not set ++# CONFIG_VIDEO_SAA5246A is not set ++# CONFIG_VIDEO_SAA5249 is not set ++# CONFIG_SOC_CAMERA is not set ++CONFIG_RADIO_ADAPTERS=y ++# CONFIG_RADIO_TEA5764 is not set ++# CONFIG_DVB_DYNAMIC_MINORS is not set ++CONFIG_DVB_CAPTURE_DRIVERS=y ++# CONFIG_TTPCI_EEPROM is not set ++# CONFIG_DVB_B2C2_FLEXCOP is not set ++ ++# ++# Supported DVB Frontends ++# ++ ++# ++# Customise DVB Frontends ++# ++# CONFIG_DVB_FE_CUSTOMISE is not set ++ ++# ++# Multistandard (satellite) frontends ++# ++# CONFIG_DVB_STB0899 is not set ++# CONFIG_DVB_STB6100 is not set ++ ++# ++# DVB-S (satellite) frontends ++# ++CONFIG_DVB_CX24110=m ++CONFIG_DVB_CX24123=m ++CONFIG_DVB_MT312=m ++CONFIG_DVB_S5H1420=m ++# CONFIG_DVB_STV0288 is not set ++# CONFIG_DVB_STB6000 is not set ++CONFIG_DVB_STV0299=m ++CONFIG_DVB_TDA8083=m ++CONFIG_DVB_TDA10086=m ++# CONFIG_DVB_TDA8261 is not set ++CONFIG_DVB_VES1X93=m ++CONFIG_DVB_TUNER_ITD1000=m ++# CONFIG_DVB_TUNER_CX24113 is not set ++CONFIG_DVB_TDA826X=m ++CONFIG_DVB_TUA6100=m ++# CONFIG_DVB_CX24116 is not set ++# CONFIG_DVB_SI21XX is not set ++ ++# ++# DVB-T (terrestrial) frontends ++# ++CONFIG_DVB_SP8870=m ++CONFIG_DVB_SP887X=m ++CONFIG_DVB_CX22700=m ++CONFIG_DVB_CX22702=m ++# CONFIG_DVB_DRX397XD is not set ++CONFIG_DVB_L64781=m ++CONFIG_DVB_TDA1004X=m ++CONFIG_DVB_NXT6000=m ++CONFIG_DVB_MT352=m ++CONFIG_DVB_ZL10353=m ++CONFIG_DVB_DIB3000MB=m ++CONFIG_DVB_DIB3000MC=m ++CONFIG_DVB_DIB7000M=m ++CONFIG_DVB_DIB7000P=m ++CONFIG_DVB_TDA10048=m ++ ++# ++# DVB-C (cable) frontends ++# ++CONFIG_DVB_VES1820=m ++CONFIG_DVB_TDA10021=m ++CONFIG_DVB_TDA10023=m ++CONFIG_DVB_STV0297=m ++ ++# ++# ATSC (North American/Korean Terrestrial/Cable DTV) frontends ++# ++CONFIG_DVB_NXT200X=m ++# CONFIG_DVB_OR51211 is not set ++# CONFIG_DVB_OR51132 is not set ++CONFIG_DVB_BCM3510=m ++CONFIG_DVB_LGDT330X=m ++# CONFIG_DVB_LGDT3304 is not set ++CONFIG_DVB_S5H1409=m ++CONFIG_DVB_AU8522=m ++CONFIG_DVB_S5H1411=m ++ ++# ++# ISDB-T (terrestrial) frontends ++# ++# CONFIG_DVB_S921 is not set ++ ++# ++# Digital terrestrial only tuners/PLL ++# ++CONFIG_DVB_PLL=m ++CONFIG_DVB_TUNER_DIB0070=m ++ ++# ++# SEC control devices for DVB-S ++# ++CONFIG_DVB_LNBP21=m ++# CONFIG_DVB_ISL6405 is not set ++CONFIG_DVB_ISL6421=m ++# CONFIG_DVB_LGS8GL5 is not set ++ ++# ++# Tools to develop new frontends ++# ++# CONFIG_DVB_DUMMY_FE is not set ++# CONFIG_DVB_AF9013 is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++# CONFIG_FB_BOOT_VESA_SUPPORT is not set ++CONFIG_FB_CFB_FILLRECT=m ++CONFIG_FB_CFB_COPYAREA=m ++CONFIG_FB_CFB_IMAGEBLIT=m ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++# CONFIG_FB_SYS_FOPS is not set ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set ++CONFIG_OMAP2_DSS=m ++CONFIG_OMAP2_DSS_VRAM_SIZE=12 ++CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y ++# CONFIG_OMAP2_DSS_RFBI is not set ++CONFIG_OMAP2_DSS_VENC=y ++# CONFIG_OMAP2_DSS_SDI is not set ++# CONFIG_OMAP2_DSS_DSI is not set ++# CONFIG_OMAP2_DSS_FAKE_VSYNC is not set ++CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=0 ++ ++# ++# OMAP2/3 Display Device Drivers ++# ++CONFIG_PANEL_GENERIC=m ++CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C=m ++# CONFIG_PANEL_SHARP_LS037V7DW01 is not set ++# CONFIG_PANEL_N800 is not set ++# CONFIG_CTRL_BLIZZARD is not set ++CONFIG_FB_OMAP2=m ++CONFIG_FB_OMAP2_DEBUG_SUPPORT=y ++# CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE is not set ++CONFIG_FB_OMAP2_NUM_FBS=3 ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++CONFIG_DISPLAY_SUPPORT=y ++ ++# ++# Display hardware drivers ++# ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE is not set ++# CONFIG_LOGO is not set ++CONFIG_SOUND=y ++CONFIG_SOUND_OSS_CORE=y ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++CONFIG_SND_SEQUENCER=m ++# CONFIG_SND_SEQ_DUMMY is not set ++CONFIG_SND_OSSEMUL=y ++CONFIG_SND_MIXER_OSS=y ++CONFIG_SND_PCM_OSS=y ++CONFIG_SND_PCM_OSS_PLUGINS=y ++CONFIG_SND_SEQUENCER_OSS=y ++# CONFIG_SND_HRTIMER is not set ++# CONFIG_SND_DYNAMIC_MINORS is not set ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_VERBOSE_PROCFS=y ++CONFIG_SND_VERBOSE_PRINTK=y ++CONFIG_SND_DEBUG=y ++# CONFIG_SND_DEBUG_VERBOSE is not set ++# CONFIG_SND_PCM_XRUN_DEBUG is not set ++CONFIG_SND_DRIVERS=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_VIRMIDI is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_MPU401 is not set ++CONFIG_SND_ARM=y ++CONFIG_SND_SPI=y ++CONFIG_SND_SOC=y ++CONFIG_SND_OMAP_SOC=y ++CONFIG_SND_OMAP_SOC_MCBSP=y ++CONFIG_SND_OMAP_SOC_OVERO=y ++CONFIG_SND_SOC_I2C_AND_SPI=y ++# CONFIG_SND_SOC_ALL_CODECS is not set ++CONFIG_SND_SOC_TWL4030=y ++# CONFIG_SOUND_PRIME is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++# CONFIG_HID_PID is not set ++ ++# ++# Special HID drivers ++# ++CONFIG_HID_COMPAT=y ++# CONFIG_HID_APPLE is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++CONFIG_USB_ARCH_HAS_EHCI=y ++# CONFIG_USB is not set ++# CONFIG_USB_OTG_WHITELIST is not set ++# CONFIG_USB_OTG_BLACKLIST_HUB is not set ++CONFIG_USB_MUSB_HDRC=y ++CONFIG_USB_MUSB_SOC=y ++ ++# ++# OMAP 343x high speed USB support ++# ++# CONFIG_USB_MUSB_HOST is not set ++CONFIG_USB_MUSB_PERIPHERAL=y ++# CONFIG_USB_MUSB_OTG is not set ++CONFIG_USB_GADGET_MUSB_HDRC=y ++# CONFIG_MUSB_PIO_ONLY is not set ++CONFIG_USB_INVENTRA_DMA=y ++# CONFIG_USB_TI_CPPI_DMA is not set ++# CONFIG_USB_MUSB_DEBUG is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; ++# ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_PXA25X is not set ++# CONFIG_USB_GADGET_PXA27X is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_IMX is not set ++# CONFIG_USB_GADGET_M66592 is not set ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_FSL_QE is not set ++# CONFIG_USB_GADGET_CI13XXX is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++CONFIG_USB_GADGET_DUALSPEED=y ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=y ++CONFIG_USB_ETH_RNDIS=y ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FILE_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++ ++# ++# OTG and related infrastructure ++# ++CONFIG_USB_OTG_UTILS=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_ISP1301_OMAP is not set ++CONFIG_TWL4030_USB=y ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++CONFIG_MMC_UNSAFE_RESUME=y ++ ++# ++# MMC/SD/SDIO Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++CONFIG_SDIO_UART=y ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++# CONFIG_MMC_SDHCI is not set ++CONFIG_MMC_OMAP_HS=y ++# CONFIG_MMC_SPI is not set ++# CONFIG_MEMSTICK is not set ++# CONFIG_ACCESSIBILITY is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++ ++# ++# LED drivers ++# ++# CONFIG_LEDS_OMAP_DEBUG is not set ++# CONFIG_LEDS_OMAP is not set ++# CONFIG_LEDS_OMAP_PWM is not set ++# CONFIG_LEDS_PCA9532 is not set ++CONFIG_LEDS_GPIO=y ++# CONFIG_LEDS_LP5521 is not set ++# CONFIG_LEDS_PCA955X is not set ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set ++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++CONFIG_RTC_DRV_TWL4030=y ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_M41T94 is not set ++# CONFIG_RTC_DRV_DS1305 is not set ++# CONFIG_RTC_DRV_DS1390 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++# CONFIG_RTC_DRV_R9701 is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_DS3234 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_BQ4802 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_DMADEVICES is not set ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_BQ24022 is not set ++CONFIG_REGULATOR_TWL4030=y ++# CONFIG_UIO is not set ++# CONFIG_STAGING is not set ++ ++# ++# CBUS support ++# ++# CONFIG_CBUS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++# CONFIG_EXT3_FS_XATTR is not set ++# CONFIG_EXT4_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++CONFIG_FILE_LOCKING=y ++CONFIG_XFS_FS=m ++# CONFIG_XFS_QUOTA is not set ++# CONFIG_XFS_POSIX_ACL is not set ++# CONFIG_XFS_RT is not set ++# CONFIG_XFS_DEBUG is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++CONFIG_PRINT_QUOTA_WARNING=y ++CONFIG_QUOTA_TREE=y ++# CONFIG_QFMT_V1 is not set ++CONFIG_QFMT_V2=y ++CONFIG_QUOTACTL=y ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++CONFIG_FUSE_FS=m ++ ++# ++# CD-ROM/DVD Filesystems ++# ++CONFIG_ISO9660_FS=m ++CONFIG_JOLIET=y ++CONFIG_ZISOFS=y ++CONFIG_UDF_FS=m ++CONFIG_UDF_NLS=y ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++CONFIG_JFFS2_SUMMARY=y ++CONFIG_JFFS2_FS_XATTR=y ++CONFIG_JFFS2_FS_POSIX_ACL=y ++CONFIG_JFFS2_FS_SECURITY=y ++CONFIG_JFFS2_COMPRESSION_OPTIONS=y ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_LZO=y ++CONFIG_JFFS2_RTIME=y ++CONFIG_JFFS2_RUBIN=y ++# CONFIG_JFFS2_CMODE_NONE is not set ++CONFIG_JFFS2_CMODE_PRIORITY=y ++# CONFIG_JFFS2_CMODE_SIZE is not set ++# CONFIG_JFFS2_CMODE_FAVOURLZO is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_SQUASHFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++CONFIG_NFS_V4=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFSD is not set ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_EXPORTFS=m ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++# CONFIG_SUNRPC_REGISTER_V4 is not set ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_FRAME_WARN=1024 ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 ++CONFIG_SCHED_DEBUG=y ++CONFIG_SCHEDSTATS=y ++CONFIG_TIMER_STATS=y ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_SLUB_STATS is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++CONFIG_DEBUG_MUTEXES=y ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++CONFIG_STACKTRACE=y ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_WRITECOUNT is not set ++# CONFIG_DEBUG_MEMORY_INIT is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_CPU_STALL_DETECTOR is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_LATENCYTOP is not set ++CONFIG_NOP_TRACER=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++CONFIG_RING_BUFFER=y ++CONFIG_TRACING=y ++ ++# ++# Tracers ++# ++# CONFIG_FUNCTION_TRACER is not set ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_SCHED_TRACER is not set ++# CONFIG_CONTEXT_SWITCH_TRACER is not set ++# CONFIG_BOOT_TRACER is not set ++# CONFIG_TRACE_BRANCH_PROFILING is not set ++# CONFIG_STACK_TRACER is not set ++# CONFIG_FTRACE_STARTUP_TEST is not set ++# CONFIG_DYNAMIC_PRINTK_DEBUG is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_ARCH_KGDB=y ++# CONFIG_KGDB is not set ++CONFIG_DEBUG_USER=y ++CONFIG_DEBUG_ERRORS=y ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_DEBUG_LL is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITYFS is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_XOR_BLOCKS=m ++CONFIG_ASYNC_CORE=m ++CONFIG_ASYNC_MEMCPY=m ++CONFIG_ASYNC_XOR=m ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++# CONFIG_CRYPTO_FIPS is not set ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_BLKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++CONFIG_CRYPTO_GF128MUL=m ++CONFIG_CRYPTO_NULL=m ++CONFIG_CRYPTO_CRYPTD=m ++# CONFIG_CRYPTO_AUTHENC is not set ++CONFIG_CRYPTO_TEST=m ++ ++# ++# Authenticated Encryption with Associated Data ++# ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_SEQIV is not set ++ ++# ++# Block modes ++# ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_CTS is not set ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_LRW=m ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_XTS is not set ++ ++# ++# Hash modes ++# ++CONFIG_CRYPTO_HMAC=m ++CONFIG_CRYPTO_XCBC=m ++ ++# ++# Digest ++# ++CONFIG_CRYPTO_CRC32C=y ++CONFIG_CRYPTO_MD4=m ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_CRYPTO_RMD128 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++# CONFIG_CRYPTO_RMD256 is not set ++# CONFIG_CRYPTO_RMD320 is not set ++CONFIG_CRYPTO_SHA1=m ++CONFIG_CRYPTO_SHA256=m ++CONFIG_CRYPTO_SHA512=m ++CONFIG_CRYPTO_TGR192=m ++CONFIG_CRYPTO_WP512=m ++ ++# ++# Ciphers ++# ++CONFIG_CRYPTO_AES=y ++CONFIG_CRYPTO_ANUBIS=m ++CONFIG_CRYPTO_ARC4=y ++CONFIG_CRYPTO_BLOWFISH=m ++CONFIG_CRYPTO_CAMELLIA=m ++CONFIG_CRYPTO_CAST5=m ++CONFIG_CRYPTO_CAST6=m ++CONFIG_CRYPTO_DES=y ++CONFIG_CRYPTO_FCRYPT=m ++CONFIG_CRYPTO_KHAZAD=m ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_SEED is not set ++CONFIG_CRYPTO_SERPENT=m ++CONFIG_CRYPTO_TEA=m ++CONFIG_CRYPTO_TWOFISH=m ++CONFIG_CRYPTO_TWOFISH_COMMON=m ++ ++# ++# Compression ++# ++CONFIG_CRYPTO_DEFLATE=m ++# CONFIG_CRYPTO_LZO is not set ++ ++# ++# Random Number Generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_GENERIC_FIND_LAST_BIT=y ++CONFIG_CRC_CCITT=y ++CONFIG_CRC16=m ++CONFIG_CRC_T10DIF=y ++CONFIG_CRC_ITU_T=y ++CONFIG_CRC32=y ++CONFIG_CRC7=y ++CONFIG_LIBCRC32C=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c +index 0a1099e..3c664a9 100644 +--- a/arch/arm/mach-omap2/board-3430sdp.c ++++ b/arch/arm/mach-omap2/board-3430sdp.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + + #include + +@@ -242,6 +243,35 @@ static struct spi_board_info sdp3430_spi_board_info[] __initdata = { + }, + }; + ++ ++#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 ++#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 ++#if 0 ++#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 24 ++#define SDP3430_LCD_PANEL_ENABLE_GPIO 28 ++#else ++#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8 ++#define SDP3430_LCD_PANEL_ENABLE_GPIO 5 ++#endif ++ ++#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER ++#define ENABLE_VAUX2_DEDICATED 0x09 ++#define ENABLE_VAUX2_DEV_GRP 0x20 ++#define ENABLE_VAUX3_DEDICATED 0x03 ++#define ENABLE_VAUX3_DEV_GRP 0x20 ++ ++#define ENABLE_VPLL2_DEDICATED 0x05 ++#define ENABLE_VPLL2_DEV_GRP 0xE0 ++#define TWL4030_VPLL2_DEV_GRP 0x33 ++#define TWL4030_VPLL2_DEDICATED 0x36 ++ ++#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) ++ ++static unsigned backlight_gpio; ++static unsigned enable_gpio; ++static int lcd_enabled; ++static int dvi_enabled; ++ + static struct platform_device sdp3430_lcd_device = { + .name = "sdp2430_lcd", + .id = -1, +@@ -257,9 +287,198 @@ static struct regulator_consumer_supply sdp3430_vdvi_supply = { + .dev = &sdp3430_lcd_device.dev, + }; + ++static void enable_vpll2(int enable) ++{ ++ u8 ded_val, grp_val; ++ ++ if (enable) { ++ ded_val = ENABLE_VPLL2_DEDICATED; ++ grp_val = ENABLE_VPLL2_DEV_GRP; ++ } else { ++ ded_val = 0; ++ grp_val = 0; ++ } ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ded_val, TWL4030_VPLL2_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ grp_val, TWL4030_VPLL2_DEV_GRP); ++} ++ ++static int sdp3430_dsi_power_up(void) ++{ ++ if (omap_rev() > OMAP3430_REV_ES1_0) ++ enable_vpll2(1); ++ return 0; ++} ++ ++static void sdp3430_dsi_power_down(void) ++{ ++ if (omap_rev() > OMAP3430_REV_ES1_0) ++ enable_vpll2(0); ++} ++ ++static void __init sdp3430_display_init(void) ++{ ++ int r; ++ ++ enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; ++ backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; ++ ++ r = gpio_request(enable_gpio, "LCD reset"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD reset GPIO\n"); ++ goto err0; ++ } ++ ++ r = gpio_request(backlight_gpio, "LCD Backlight"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD backlight GPIO\n"); ++ goto err1; ++ } ++ ++ gpio_direction_output(enable_gpio, 0); ++ gpio_direction_output(backlight_gpio, 0); ++ ++ return; ++err1: ++ gpio_free(enable_gpio); ++err0: ++ return; ++} ++ ++static int sdp3430_panel_enable_lcd(struct omap_display *display) ++{ ++ u8 ded_val, ded_reg; ++ u8 grp_val, grp_reg; ++ ++ if (dvi_enabled) { ++ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); ++ return -EINVAL; ++ } ++ ++ ded_reg = TWL4030_VAUX3_DEDICATED; ++ ded_val = ENABLE_VAUX3_DEDICATED; ++ grp_reg = TWL4030_VAUX3_DEV_GRP; ++ grp_val = ENABLE_VAUX3_DEV_GRP; ++ ++ gpio_direction_output(enable_gpio, 1); ++ gpio_direction_output(backlight_gpio, 1); ++ ++ if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg)) ++ return -EIO; ++ if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg)) ++ return -EIO; ++ ++ sdp3430_dsi_power_up(); ++ ++ lcd_enabled = 1; ++ ++ return 0; ++} ++ ++static void sdp3430_panel_disable_lcd(struct omap_display *display) ++{ ++ lcd_enabled = 0; ++ ++ sdp3430_dsi_power_down(); ++ ++ gpio_direction_output(enable_gpio, 0); ++ gpio_direction_output(backlight_gpio, 0); ++} ++ ++static struct omap_dss_display_config sdp3430_display_data = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "lcd", ++ .panel_name = "sharp-ls037v7dw01", ++ .u.dpi.data_lines = 16, ++ .panel_enable = sdp3430_panel_enable_lcd, ++ .panel_disable = sdp3430_panel_disable_lcd, ++}; ++ ++static int sdp3430_panel_enable_dvi(struct omap_display *display) ++{ ++ if (lcd_enabled) { ++ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); ++ return -EINVAL; ++ } ++ ++ sdp3430_dsi_power_up(); ++ ++ dvi_enabled = 1; ++ ++ return 0; ++} ++ ++static void sdp3430_panel_disable_dvi(struct omap_display *display) ++{ ++ sdp3430_dsi_power_down(); ++ ++ dvi_enabled = 0; ++} ++ ++ ++static struct omap_dss_display_config sdp3430_display_data_dvi = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "dvi", ++ .panel_name = "panel-generic", ++ .u.dpi.data_lines = 24, ++ .panel_enable = sdp3430_panel_enable_dvi, ++ .panel_disable = sdp3430_panel_disable_dvi, ++}; ++ ++static int sdp3430_panel_enable_tv(struct omap_display *display) ++{ ++#define ENABLE_VDAC_DEDICATED 0x03 ++#define ENABLE_VDAC_DEV_GRP 0x20 ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEDICATED, ++ TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); ++ ++ return 0; ++} ++ ++static void sdp3430_panel_disable_tv(struct omap_display *display) ++{ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEV_GRP); ++} ++ ++static struct omap_dss_display_config sdp3430_display_data_tv = { ++ .type = OMAP_DISPLAY_TYPE_VENC, ++ .name = "tv", ++ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, ++ .panel_enable = sdp3430_panel_enable_tv, ++ .panel_disable = sdp3430_panel_disable_tv, ++}; ++ ++static struct omap_dss_board_info sdp3430_dss_data = { ++ .dsi_power_up = sdp3430_dsi_power_up, ++ .dsi_power_down = sdp3430_dsi_power_down, ++ .num_displays = 3, ++ .displays = { ++ &sdp3430_display_data, ++ &sdp3430_display_data_dvi, ++ &sdp3430_display_data_tv, ++ } ++}; ++ ++static struct platform_device sdp3430_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &sdp3430_dss_data, ++ }, ++}; ++ + static struct platform_device *sdp3430_devices[] __initdata = { + &sdp3430_smc91x_device, +- &sdp3430_lcd_device, ++ &sdp3430_dss_device, + }; + + static inline void __init sdp3430_init_smc91x(void) +@@ -306,13 +525,8 @@ static struct omap_uart_config sdp3430_uart_config __initdata = { + .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), + }; + +-static struct omap_lcd_config sdp3430_lcd_config __initdata = { +- .ctrl_name = "internal", +-}; +- + static struct omap_board_config_kernel sdp3430_config[] __initdata = { + { OMAP_TAG_UART, &sdp3430_uart_config }, +- { OMAP_TAG_LCD, &sdp3430_lcd_config }, + }; + + static int sdp3430_batt_table[] = { +@@ -681,6 +895,7 @@ static void __init omap_3430sdp_init(void) + omap_serial_init(); + usb_musb_init(); + usb_ehci_init(); ++ sdp3430_display_init(); + } + + static void __init omap_3430sdp_map_io(void) +diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c +index 346351e..b67e7a5 100644 +--- a/arch/arm/mach-omap2/board-omap3beagle.c ++++ b/arch/arm/mach-omap2/board-omap3beagle.c +@@ -30,6 +30,7 @@ + + #include + #include ++#include + + #include + #include +@@ -43,6 +44,7 @@ + #include + #include + #include ++#include + + #include "twl4030-generic-scripts.h" + #include "mmc-twl4030.h" +@@ -312,10 +314,6 @@ static void __init omap3_beagle_init_irq(void) + omap_gpio_init(); + } + +-static struct omap_lcd_config omap3_beagle_lcd_config __initdata = { +- .ctrl_name = "internal", +-}; +- + static struct gpio_led gpio_leds[] = { + { + .name = "beagleboard::usr0", +@@ -369,13 +367,94 @@ static struct platform_device keys_gpio = { + }, + }; + ++/* DSS */ ++ ++static int beagle_enable_dvi(struct omap_display *display) ++{ ++ if (display->hw_config.panel_reset_gpio != -1) ++ gpio_direction_output(display->hw_config.panel_reset_gpio, 1); ++ ++ return 0; ++} ++ ++static void beagle_disable_dvi(struct omap_display *display) ++{ ++ if (display->hw_config.panel_reset_gpio != -1) ++ gpio_direction_output(display->hw_config.panel_reset_gpio, 0); ++} ++ ++static struct omap_dss_display_config beagle_display_data_dvi = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "dvi", ++ .panel_name = "panel-generic", ++ .u.dpi.data_lines = 24, ++ .panel_reset_gpio = 170, ++ .panel_enable = beagle_enable_dvi, ++ .panel_disable = beagle_disable_dvi, ++}; ++ ++ ++static int beagle_panel_enable_tv(struct omap_display *display) ++{ ++#define ENABLE_VDAC_DEDICATED 0x03 ++#define ENABLE_VDAC_DEV_GRP 0x20 ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEDICATED, ++ TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); ++ ++ return 0; ++} ++ ++static void beagle_panel_disable_tv(struct omap_display *display) ++{ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEV_GRP); ++} ++ ++static struct omap_dss_display_config beagle_display_data_tv = { ++ .type = OMAP_DISPLAY_TYPE_VENC, ++ .name = "tv", ++ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, ++ .panel_enable = beagle_panel_enable_tv, ++ .panel_disable = beagle_panel_disable_tv, ++}; ++ ++static struct omap_dss_board_info beagle_dss_data = { ++ .num_displays = 2, ++ .displays = { ++ &beagle_display_data_dvi, ++ &beagle_display_data_tv, ++ } ++}; ++ ++static struct platform_device beagle_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &beagle_dss_data, ++ }, ++}; ++ ++static void __init beagle_display_init(void) ++{ ++ int r; ++ ++ r = gpio_request(beagle_display_data_dvi.panel_reset_gpio, "DVI reset"); ++ if (r < 0) ++ printk(KERN_ERR "Unable to get DVI reset GPIO\n"); ++} ++ + static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { + { OMAP_TAG_UART, &omap3_beagle_uart_config }, +- { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, + }; + + static struct platform_device *omap3_beagle_devices[] __initdata = { +- &omap3_beagle_lcd_device, ++ &beagle_dss_device, + &leds_gpio, + &keys_gpio, + }; +@@ -428,13 +507,11 @@ static void __init omap3_beagle_init(void) + omap_serial_init(); + + omap_cfg_reg(J25_34XX_GPIO170); +- gpio_request(170, "DVI_nPD"); +- /* REVISIT leave DVI powered down until it's needed ... */ +- gpio_direction_output(170, true); + + usb_musb_init(); + usb_ehci_init(); + omap3beagle_flash_init(); ++ beagle_display_init(); + } + + static void __init omap3_beagle_map_io(void) +diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c +index 024d7c4..6f5a866 100644 +--- a/arch/arm/mach-omap2/board-omap3evm.c ++++ b/arch/arm/mach-omap2/board-omap3evm.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + + #include "sdram-micron-mt46h32m32lf-6.h" + #include "twl4030-generic-scripts.h" +@@ -216,13 +217,215 @@ static int __init omap3_evm_i2c_init(void) + return 0; + } + +-static struct platform_device omap3_evm_lcd_device = { +- .name = "omap3evm_lcd", +- .id = -1, ++#define LCD_PANEL_LR 2 ++#define LCD_PANEL_UD 3 ++#define LCD_PANEL_INI 152 ++#define LCD_PANEL_ENABLE_GPIO 153 ++#define LCD_PANEL_QVGA 154 ++#define LCD_PANEL_RESB 155 ++ ++#define ENABLE_VDAC_DEDICATED 0x03 ++#define ENABLE_VDAC_DEV_GRP 0x20 ++#define ENABLE_VPLL2_DEDICATED 0x05 ++#define ENABLE_VPLL2_DEV_GRP 0xE0 ++ ++#define TWL4030_GPIODATA_IN3 0x03 ++#define TWL4030_GPIODATA_DIR3 0x06 ++#define TWL4030_VPLL2_DEV_GRP 0x33 ++#define TWL4030_VPLL2_DEDICATED 0x36 ++ ++static int lcd_enabled; ++static int dvi_enabled; ++ ++static void __init omap3_evm_display_init(void) ++{ ++ int r; ++ r = gpio_request(LCD_PANEL_LR, "lcd_panel_lr"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD_PANEL_LR\n"); ++ return; ++ } ++ r = gpio_request(LCD_PANEL_UD, "lcd_panel_ud"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD_PANEL_UD\n"); ++ goto err_1; ++ } ++ ++ r = gpio_request(LCD_PANEL_INI, "lcd_panel_ini"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD_PANEL_INI\n"); ++ goto err_2; ++ } ++ r = gpio_request(LCD_PANEL_RESB, "lcd_panel_resb"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD_PANEL_RESB\n"); ++ goto err_3; ++ } ++ r = gpio_request(LCD_PANEL_QVGA, "lcd_panel_qvga"); ++ if (r) { ++ printk(KERN_ERR "failed to get LCD_PANEL_QVGA\n"); ++ goto err_4; ++ } ++ ++ gpio_direction_output(LCD_PANEL_LR, 0); ++ gpio_direction_output(LCD_PANEL_UD, 0); ++ gpio_direction_output(LCD_PANEL_INI, 0); ++ gpio_direction_output(LCD_PANEL_RESB, 0); ++ gpio_direction_output(LCD_PANEL_QVGA, 0); ++ ++#define TWL_LED_LEDEN 0x00 ++#define TWL_PWMA_PWMAON 0x00 ++#define TWL_PWMA_PWMAOFF 0x01 ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF); ++ ++ gpio_direction_output(LCD_PANEL_RESB, 1); ++ gpio_direction_output(LCD_PANEL_INI, 1); ++ gpio_direction_output(LCD_PANEL_QVGA, 0); ++ gpio_direction_output(LCD_PANEL_LR, 1); ++ gpio_direction_output(LCD_PANEL_UD, 1); ++ ++ return; ++ ++err_4: ++ gpio_free(LCD_PANEL_RESB); ++err_3: ++ gpio_free(LCD_PANEL_INI); ++err_2: ++ gpio_free(LCD_PANEL_UD); ++err_1: ++ gpio_free(LCD_PANEL_LR); ++ ++} ++ ++static int omap3_evm_panel_enable_lcd(struct omap_display *display) ++{ ++ if (dvi_enabled) { ++ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); ++ return -EINVAL; ++ } ++ if (omap_rev() > OMAP3430_REV_ES1_0) { ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP); ++ } ++ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); ++ lcd_enabled = 1; ++ return 0; ++} ++ ++static void omap3_evm_panel_disable_lcd(struct omap_display *display) ++{ ++ if (omap_rev() > OMAP3430_REV_ES1_0) { ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, ++ TWL4030_VPLL2_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, ++ TWL4030_VPLL2_DEV_GRP); ++ } ++ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); ++ lcd_enabled = 0; ++} ++ ++static struct omap_dss_display_config omap3_evm_display_data = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "lcd", ++ .panel_name = "sharp-ls037v7dw01", ++ .u.dpi.data_lines = 18, ++ .panel_enable = omap3_evm_panel_enable_lcd, ++ .panel_disable = omap3_evm_panel_disable_lcd, + }; + +-static struct omap_lcd_config omap3_evm_lcd_config __initdata = { +- .ctrl_name = "internal", ++static int omap3_evm_panel_enable_tv(struct omap_display *display) ++{ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEDICATED, TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); ++ return 0; ++} ++ ++static void omap3_evm_panel_disable_tv(struct omap_display *display) ++{ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEV_GRP); ++} ++ ++static struct omap_dss_display_config omap3_evm_display_data_tv = { ++ .type = OMAP_DISPLAY_TYPE_VENC, ++ .name = "tv", ++ .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, ++ .panel_enable = omap3_evm_panel_enable_tv, ++ .panel_disable = omap3_evm_panel_disable_tv, ++}; ++ ++ ++static int omap3_evm_panel_enable_dvi(struct omap_display *display) ++{ ++ if (lcd_enabled) { ++ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); ++ return -EINVAL; ++ } ++ if (omap_rev() > OMAP3430_REV_ES1_0) { ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP); ++ } ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, ++ TWL4030_GPIODATA_IN3); ++ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, ++ TWL4030_GPIODATA_DIR3); ++ dvi_enabled = 1; ++ ++ return 0; ++} ++ ++static void omap3_evm_panel_disable_dvi(struct omap_display *display) ++{ ++ if (omap_rev() > OMAP3430_REV_ES1_0) { ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, ++ TWL4030_VPLL2_DEDICATED); ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0, ++ TWL4030_VPLL2_DEV_GRP); ++ } ++ ++ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00, ++ TWL4030_GPIODATA_IN3); ++ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00, ++ TWL4030_GPIODATA_DIR3); ++ dvi_enabled = 0; ++} ++ ++ ++static struct omap_dss_display_config omap3_evm_display_data_dvi = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "dvi", ++ .panel_name = "panel-generic", ++ .u.dpi.data_lines = 24, ++ .panel_enable = omap3_evm_panel_enable_dvi, ++ .panel_disable = omap3_evm_panel_disable_dvi, ++}; ++ ++static struct omap_dss_board_info omap3_evm_dss_data = { ++ .num_displays = 3, ++ .displays = { ++ &omap3_evm_display_data, ++ &omap3_evm_display_data_dvi, ++ &omap3_evm_display_data_tv, ++ } ++}; ++static struct platform_device omap3_evm_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &omap3_evm_dss_data, ++ }, + }; + + static void ads7846_dev_init(void) +@@ -281,11 +484,10 @@ static void __init omap3_evm_init_irq(void) + + static struct omap_board_config_kernel omap3_evm_config[] __initdata = { + { OMAP_TAG_UART, &omap3_evm_uart_config }, +- { OMAP_TAG_LCD, &omap3_evm_lcd_config }, + }; + + static struct platform_device *omap3_evm_devices[] __initdata = { +- &omap3_evm_lcd_device, ++ &omap3_evm_dss_device, + &omap3evm_smc911x_device, + }; + +@@ -305,6 +507,7 @@ static void __init omap3_evm_init(void) + usb_ehci_init(); + omap3evm_flash_init(); + ads7846_dev_init(); ++ omap3_evm_display_init(); + } + + static void __init omap3_evm_map_io(void) +diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c +index 071f4b0..267bb6b 100644 +--- a/arch/arm/mach-omap2/board-overo.c ++++ b/arch/arm/mach-omap2/board-overo.c +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -176,6 +177,9 @@ static void __init overo_ads7846_init(void) + static inline void __init overo_ads7846_init(void) { return; } + #endif + ++static int lcd_enabled; ++static int dvi_enabled; ++ + static struct mtd_partition overo_nand_partitions[] = { + { + .name = "xloader", +@@ -360,22 +364,101 @@ static void __init overo_init_irq(void) + omap_gpio_init(); + } + +-static struct platform_device overo_lcd_device = { +- .name = "overo_lcd", +- .id = -1, ++/* DSS */ ++ ++#define OVERO_GPIO_LCD_EN 144 ++ ++static void __init overo_display_init(void) ++{ ++ int r; ++ ++ r = gpio_request(OVERO_GPIO_LCD_EN, "display enable"); ++ if (r) ++ printk("fail1\n"); ++ r = gpio_direction_output(OVERO_GPIO_LCD_EN, 1); ++ if (r) ++ printk("fail2\n"); ++ gpio_export(OVERO_GPIO_LCD_EN, 0); ++} ++ ++static int overo_panel_enable_dvi(struct omap_display *display) ++{ ++ if (lcd_enabled) { ++ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); ++ return -EINVAL; ++ } ++ dvi_enabled = 1; ++ ++ gpio_set_value(OVERO_GPIO_LCD_EN, 1); ++ ++ return 0; ++} ++ ++static void overo_panel_disable_dvi(struct omap_display *display) ++{ ++ gpio_set_value(OVERO_GPIO_LCD_EN, 0); ++ ++ dvi_enabled = 0; ++} ++ ++static struct omap_dss_display_config overo_display_data_dvi = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "dvi", ++ .panel_name = "panel-generic", ++ .u.dpi.data_lines = 24, ++ .panel_enable = overo_panel_enable_dvi, ++ .panel_disable = overo_panel_disable_dvi, + }; + +-static struct omap_lcd_config overo_lcd_config __initdata = { +- .ctrl_name = "internal", ++static int overo_panel_enable_lcd(struct omap_display *display) ++{ ++ if (dvi_enabled) { ++ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); ++ return -EINVAL; ++ } ++ ++ gpio_set_value(OVERO_GPIO_LCD_EN, 1); ++ lcd_enabled = 1; ++ return 0; ++} ++ ++static void overo_panel_disable_lcd(struct omap_display *display) ++{ ++ gpio_set_value(OVERO_GPIO_LCD_EN, 0); ++ lcd_enabled = 0; ++} ++ ++static struct omap_dss_display_config overo_display_data_lcd = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "lcd", ++ .panel_name = "samsung-lte430wq-f0c", ++ .u.dpi.data_lines = 24, ++ .panel_enable = overo_panel_enable_lcd, ++ .panel_disable = overo_panel_disable_lcd, ++ }; ++ ++static struct omap_dss_board_info overo_dss_data = { ++ .num_displays = 2, ++ .displays = { ++ &overo_display_data_dvi, ++ &overo_display_data_lcd, ++ } ++}; ++ ++static struct platform_device overo_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &overo_dss_data, ++ }, + }; + + static struct omap_board_config_kernel overo_config[] __initdata = { + { OMAP_TAG_UART, &overo_uart_config }, +- { OMAP_TAG_LCD, &overo_lcd_config }, + }; + + static struct platform_device *overo_devices[] __initdata = { +- &overo_lcd_device, ++ &overo_dss_device, + }; + + static void __init overo_init(void) +@@ -390,6 +473,7 @@ static void __init overo_init(void) + overo_flash_init(); + overo_init_smsc911x(); + overo_ads7846_init(); ++ overo_display_init(); + + if ((gpio_request(OVERO_GPIO_W2W_NRESET, + "OVERO_GPIO_W2W_NRESET") == 0) && +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch b/recipes/linux/linux-omap-2.6.29/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch new file mode 100644 index 0000000000..4c8d432dd5 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch @@ -0,0 +1,39 @@ +From 4741076cae4f4284e1fff9a03f35475b8455af54 Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Wed, 1 Apr 2009 14:36:39 +0200 +Subject: [PATCH] DSS2: Add function to display object to get the backlight level + +This is needed by an upcoming patch that changes the backlight +initialization to use the backlight level set by the bootloader. + +Also add a field for the maximum backlight level. + +Signed-off-by: Imre Deak +--- + arch/arm/plat-omap/include/mach/display.h | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h +index 6288353..6b702c7 100644 +--- a/arch/arm/plat-omap/include/mach/display.h ++++ b/arch/arm/plat-omap/include/mach/display.h +@@ -211,6 +211,8 @@ struct omap_dss_display_config { + int panel_reset_gpio; + int ctrl_reset_gpio; + ++ int max_backlight_level; ++ + const char *name; /* for debug */ + const char *ctrl_name; + const char *panel_name; +@@ -225,6 +227,7 @@ struct omap_dss_display_config { + void (*ctrl_disable)(struct omap_display *display); + int (*set_backlight)(struct omap_display *display, + int level); ++ int (*get_backlight)(struct omap_display *display); + }; + + struct device; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0009-DSS2-Add-acx565akm-panel.patch b/recipes/linux/linux-omap-2.6.29/dss2/0009-DSS2-Add-acx565akm-panel.patch new file mode 100644 index 0000000000..3f55f04460 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0009-DSS2-Add-acx565akm-panel.patch @@ -0,0 +1,778 @@ +From 66e16f86d3f4c5b34b37e965c65102b7192371de Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Thu, 2 Apr 2009 11:47:13 +0300 +Subject: [PATCH] DSS2: Add acx565akm panel + +Signed-off-by: Imre Deak +--- + drivers/video/omap2/displays/Kconfig | 8 + + drivers/video/omap2/displays/Makefile | 2 + + drivers/video/omap2/displays/panel-acx565akm.c | 712 ++++++++++++++++++++++++ + drivers/video/omap2/displays/panel-acx565akm.h | 9 + + 4 files changed, 731 insertions(+), 0 deletions(-) + create mode 100644 drivers/video/omap2/displays/panel-acx565akm.c + create mode 100644 drivers/video/omap2/displays/panel-acx565akm.h + +diff --git a/drivers/video/omap2/displays/Kconfig b/drivers/video/omap2/displays/Kconfig +index 356ceb1..3feecee 100644 +--- a/drivers/video/omap2/displays/Kconfig ++++ b/drivers/video/omap2/displays/Kconfig +@@ -28,4 +28,12 @@ config CTRL_BLIZZARD + tristate "Blizzard Controller" + help + Blizzard Controller (hack) ++ ++config PANEL_ACX565AKM ++ tristate "ACX565AKM LCD Panel" ++ depends on OMAP2_DSS_SDI ++ select BACKLIGHT_CLASS_DEVICE ++ help ++ LCD Panel used in RX51 ++ + endmenu +diff --git a/drivers/video/omap2/displays/Makefile b/drivers/video/omap2/displays/Makefile +index 1b74b7e..9bafcb6 100644 +--- a/drivers/video/omap2/displays/Makefile ++++ b/drivers/video/omap2/displays/Makefile +@@ -4,3 +4,5 @@ obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o + + obj-$(CONFIG_CTRL_BLIZZARD) += ctrl-blizzard.o + obj-$(CONFIG_PANEL_N800) += panel-n800.o ++ ++obj-$(CONFIG_PANEL_ACX565AKM) += panel-acx565akm.o +diff --git a/drivers/video/omap2/displays/panel-acx565akm.c b/drivers/video/omap2/displays/panel-acx565akm.c +new file mode 100644 +index 0000000..2679d6c +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-acx565akm.c +@@ -0,0 +1,712 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "panel-acx565akm.h" ++ ++#define MIPID_CMD_READ_DISP_ID 0x04 ++#define MIPID_CMD_READ_RED 0x06 ++#define MIPID_CMD_READ_GREEN 0x07 ++#define MIPID_CMD_READ_BLUE 0x08 ++#define MIPID_CMD_READ_DISP_STATUS 0x09 ++#define MIPID_CMD_RDDSDR 0x0F ++#define MIPID_CMD_SLEEP_IN 0x10 ++#define MIPID_CMD_SLEEP_OUT 0x11 ++#define MIPID_CMD_DISP_OFF 0x28 ++#define MIPID_CMD_DISP_ON 0x29 ++#define MIPID_CMD_WRITE_DISP_BRIGHTNESS 0x51 ++#define MIPID_CMD_READ_DISP_BRIGHTNESS 0x52 ++#define MIPID_CMD_WRITE_CTRL_DISP 0x53 ++ ++#define CTRL_DISP_BRIGHTNESS_CTRL_ON (1 << 5) ++#define CTRL_DISP_AMBIENT_LIGHT_CTRL_ON (1 << 4) ++#define CTRL_DISP_BACKLIGHT_ON (1 << 2) ++#define CTRL_DISP_AUTO_BRIGHTNESS_ON (1 << 1) ++ ++#define MIPID_CMD_READ_CTRL_DISP 0x54 ++#define MIPID_CMD_WRITE_CABC 0x55 ++#define MIPID_CMD_READ_CABC 0x56 ++ ++#define MIPID_VER_LPH8923 3 ++#define MIPID_VER_LS041Y3 4 ++#define MIPID_VER_L4F00311 8 ++#define MIPID_VER_ACX565AKM 9 ++ ++struct acx565akm_device { ++ struct backlight_device *bl_dev; ++ int enabled; ++ int model; ++ int revision; ++ u8 display_id[3]; ++ int has_bc:1; ++ int has_cabc:1; ++ unsigned int saved_bklight_level; ++ unsigned long hw_guard_end; /* next value of jiffies ++ when we can issue the ++ next sleep in/out command */ ++ unsigned long hw_guard_wait; /* max guard time in jiffies */ ++ ++ struct spi_device *spi; ++ struct mutex mutex; ++ struct omap_panel panel; ++ struct omap_display *display; ++}; ++ ++static int acx565akm_bl_update_status(struct backlight_device *dev); ++ ++static void acx565akm_transfer(struct acx565akm_device *md, int cmd, ++ const u8 *wbuf, int wlen, u8 *rbuf, int rlen) ++{ ++ struct spi_message m; ++ struct spi_transfer *x, xfer[5]; ++ int r; ++ ++ BUG_ON(md->spi == NULL); ++ ++ spi_message_init(&m); ++ ++ memset(xfer, 0, sizeof(xfer)); ++ x = &xfer[0]; ++ ++ cmd &= 0xff; ++ x->tx_buf = &cmd; ++ x->bits_per_word = 9; ++ x->len = 2; ++ ++ if (rlen > 1 && wlen == 0) { ++ /* ++ * Between the command and the response data there is a ++ * dummy clock cycle. Add an extra bit after the command ++ * word to account for this. ++ */ ++ x->bits_per_word = 10; ++ cmd <<= 1; ++ } ++ spi_message_add_tail(x, &m); ++ ++ if (wlen) { ++ x++; ++ x->tx_buf = wbuf; ++ x->len = wlen; ++ x->bits_per_word = 9; ++ spi_message_add_tail(x, &m); ++ } ++ ++ if (rlen) { ++ x++; ++ x->rx_buf = rbuf; ++ x->len = rlen; ++ spi_message_add_tail(x, &m); ++ } ++ ++ r = spi_sync(md->spi, &m); ++ if (r < 0) ++ dev_dbg(&md->spi->dev, "spi_sync %d\n", r); ++} ++ ++static inline void acx565akm_cmd(struct acx565akm_device *md, int cmd) ++{ ++ acx565akm_transfer(md, cmd, NULL, 0, NULL, 0); ++} ++ ++static inline void acx565akm_write(struct acx565akm_device *md, ++ int reg, const u8 *buf, int len) ++{ ++ acx565akm_transfer(md, reg, buf, len, NULL, 0); ++} ++ ++static inline void acx565akm_read(struct acx565akm_device *md, ++ int reg, u8 *buf, int len) ++{ ++ acx565akm_transfer(md, reg, NULL, 0, buf, len); ++} ++ ++static void hw_guard_start(struct acx565akm_device *md, int guard_msec) ++{ ++ md->hw_guard_wait = msecs_to_jiffies(guard_msec); ++ md->hw_guard_end = jiffies + md->hw_guard_wait; ++} ++ ++static void hw_guard_wait(struct acx565akm_device *md) ++{ ++ unsigned long wait = md->hw_guard_end - jiffies; ++ ++ if ((long)wait > 0 && wait <= md->hw_guard_wait) { ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_timeout(wait); ++ } ++} ++ ++static void set_sleep_mode(struct acx565akm_device *md, int on) ++{ ++ int cmd, sleep_time = 50; ++ ++ if (on) ++ cmd = MIPID_CMD_SLEEP_IN; ++ else ++ cmd = MIPID_CMD_SLEEP_OUT; ++ hw_guard_wait(md); ++ acx565akm_cmd(md, cmd); ++ hw_guard_start(md, 120); ++ /* ++ * When we enable the panel, it seems we _have_ to sleep ++ * 120 ms before sending the init string. When disabling the ++ * panel we'll sleep for the duration of 2 frames, so that the ++ * controller can still provide the PCLK,HS,VS signals. */ ++ if (!on) ++ sleep_time = 120; ++ msleep(sleep_time); ++} ++ ++static void set_display_state(struct acx565akm_device *md, int enabled) ++{ ++ int cmd = enabled ? MIPID_CMD_DISP_ON : MIPID_CMD_DISP_OFF; ++ ++ acx565akm_cmd(md, cmd); ++} ++ ++static int panel_enabled(struct acx565akm_device *md) ++{ ++ u32 disp_status; ++ int enabled; ++ ++ acx565akm_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4); ++ disp_status = __be32_to_cpu(disp_status); ++ enabled = (disp_status & (1 << 17)) && (disp_status & (1 << 10)); ++ dev_dbg(&md->spi->dev, ++ "LCD panel %senabled by bootloader (status 0x%04x)\n", ++ enabled ? "" : "not ", disp_status); ++ return enabled; ++} ++ ++static void enable_backlight_ctrl(struct acx565akm_device *md, int enable) ++{ ++ u16 ctrl; ++ ++ acx565akm_read(md, MIPID_CMD_READ_CTRL_DISP, (u8 *)&ctrl, 1); ++ if (enable) { ++ ctrl |= CTRL_DISP_BRIGHTNESS_CTRL_ON | ++ CTRL_DISP_BACKLIGHT_ON; ++ } else { ++ ctrl &= ~(CTRL_DISP_BRIGHTNESS_CTRL_ON | ++ CTRL_DISP_BACKLIGHT_ON); ++ } ++ ++ ctrl |= 1 << 8; ++ acx565akm_write(md, MIPID_CMD_WRITE_CTRL_DISP, (u8 *)&ctrl, 2); ++} ++ ++static void set_cabc_mode(struct acx565akm_device *md, int mode) ++{ ++ u16 cabc_ctrl; ++ ++ cabc_ctrl = 0; ++ acx565akm_read(md, MIPID_CMD_READ_CABC, (u8 *)&cabc_ctrl, 1); ++ cabc_ctrl &= ~3; ++ cabc_ctrl |= (1 << 8) | (mode & 3); ++ acx565akm_write(md, MIPID_CMD_WRITE_CABC, (u8 *)&cabc_ctrl, 2); ++} ++ ++static int get_cabc_mode(struct acx565akm_device *md) ++{ ++ u8 cabc_ctrl; ++ ++ acx565akm_read(md, MIPID_CMD_READ_CABC, &cabc_ctrl, 1); ++ return cabc_ctrl & 3; ++} ++ ++static int panel_detect(struct acx565akm_device *md) ++{ ++ acx565akm_read(md, MIPID_CMD_READ_DISP_ID, md->display_id, 3); ++ dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", ++ md->display_id[0], md->display_id[1], md->display_id[2]); ++ ++ switch (md->display_id[0]) { ++ case 0x10: ++ md->model = MIPID_VER_ACX565AKM; ++ md->panel.name = "acx565akm"; ++ md->has_bc = 1; ++ md->has_cabc = 1; ++ break; ++ case 0x29: ++ md->model = MIPID_VER_L4F00311; ++ md->panel.name = "l4f00311"; ++ break; ++ case 0x45: ++ md->model = MIPID_VER_LPH8923; ++ md->panel.name = "lph8923"; ++ break; ++ case 0x83: ++ md->model = MIPID_VER_LS041Y3; ++ md->panel.name = "ls041y3"; ++ break; ++ default: ++ md->panel.name = "unknown"; ++ dev_err(&md->spi->dev, "invalid display ID\n"); ++ return -ENODEV; ++ } ++ ++ md->revision = md->display_id[1]; ++ ++ pr_info("omapfb: %s rev %02x LCD detected\n", ++ md->panel.name, md->revision); ++ ++ return 0; ++} ++ ++static int acx565akm_panel_enable(struct omap_display *display) ++{ ++ struct acx565akm_device *md = ++ (struct acx565akm_device *)display->panel->priv; ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ mutex_lock(&md->mutex); ++ ++ if (display->hw_config.panel_enable) ++ display->hw_config.panel_enable(display); ++ ++ md->enabled = panel_enabled(md); ++ ++ if (md->enabled) { ++ dev_dbg(&md->spi->dev, "panel already enabled\n"); ++ mutex_unlock(&md->mutex); ++ return 0; ++ } ++ ++ set_sleep_mode(md, 0); ++ md->enabled = 1; ++ set_display_state(md, 1); ++ ++ mutex_unlock(&md->mutex); ++ ++ return acx565akm_bl_update_status(md->bl_dev); ++} ++ ++static void acx565akm_panel_disable(struct omap_display *display) ++{ ++ struct acx565akm_device *md = ++ (struct acx565akm_device *)display->panel->priv; ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ mutex_lock(&md->mutex); ++ ++ if (!md->enabled) { ++ mutex_unlock(&md->mutex); ++ return; ++ } ++ set_display_state(md, 0); ++ set_sleep_mode(md, 1); ++ md->enabled = 0; ++ ++ if (display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ ++ mutex_unlock(&md->mutex); ++} ++ ++#if 0 ++static void acx565akm_set_mode(struct omap_display *display, ++ int x_res, int y_res, int bpp) ++{ ++ struct acx565akm_device *md = ++ (struct acx565akm_device *)display->panel->priv; ++ u16 par; ++ ++ switch (bpp) { ++ case 16: ++ par = 0x150; ++ break; ++ case 18: ++ par = 0x160; ++ break; ++ case 24: ++ par = 0x170; ++ break; ++ } ++ ++ acx565akm_write(md, 0x3a, (u8 *)&par, 2); ++} ++#endif ++ ++static int acx565akm_panel_suspend(struct omap_display *display) ++{ ++ acx565akm_panel_disable(display); ++ return 0; ++} ++ ++static int acx565akm_panel_resume(struct omap_display *display) ++{ ++ return acx565akm_panel_enable(display); ++} ++ ++static void acx565akm_set_brightness(struct acx565akm_device *md, int level) ++{ ++ int bv; ++ ++ bv = level | (1 << 8); ++ acx565akm_write(md, MIPID_CMD_WRITE_DISP_BRIGHTNESS, (u8 *)&bv, 2); ++ ++ if (level) ++ enable_backlight_ctrl(md, 1); ++ else ++ enable_backlight_ctrl(md, 0); ++} ++ ++static int acx565akm_get_actual_brightness(struct acx565akm_device *md) ++{ ++ u8 bv; ++ ++ acx565akm_read(md, MIPID_CMD_READ_DISP_BRIGHTNESS, &bv, 1); ++ ++ return bv; ++} ++ ++static int acx565akm_bl_update_status(struct backlight_device *dev) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(&dev->dev); ++ struct omap_display *display = md->display; ++ int r; ++ int level; ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ if (display->hw_config.set_backlight == NULL) ++ return -ENODEV; ++ ++ mutex_lock(&md->mutex); ++ ++ if (dev->props.fb_blank == FB_BLANK_UNBLANK && ++ dev->props.power == FB_BLANK_UNBLANK) ++ level = dev->props.brightness; ++ else ++ level = 0; ++ ++ r = 0; ++ if (md->has_bc) ++ acx565akm_set_brightness(md, level); ++ else ++ if (display->hw_config.set_backlight != NULL) ++ r = display->hw_config.set_backlight(display, level); ++ else ++ r = -ENODEV; ++ ++ mutex_unlock(&md->mutex); ++ ++ return r; ++} ++ ++static int acx565akm_bl_get_intensity(struct backlight_device *dev) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(&dev->dev); ++ struct omap_display *display = md->display; ++ ++ dev_dbg(&dev->dev, "%s\n", __func__); ++ ++ if (md->has_bc && display->hw_config.set_backlight == NULL) ++ return -ENODEV; ++ ++ if (dev->props.fb_blank == FB_BLANK_UNBLANK && ++ dev->props.power == FB_BLANK_UNBLANK) { ++ if (md->has_bc) ++ return acx565akm_get_actual_brightness(md); ++ else ++ return dev->props.brightness; ++ } ++ ++ return 0; ++} ++ ++static struct backlight_ops acx565akm_bl_ops = { ++ .get_brightness = acx565akm_bl_get_intensity, ++ .update_status = acx565akm_bl_update_status, ++}; ++ ++static const char *cabc_modes[] = { ++ "off", /* used also always when CABC is not supported */ ++ "ui", ++ "still-image", ++ "moving-image", ++}; ++ ++static ssize_t show_cabc_mode(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(dev); ++ const char *mode_str; ++ int mode; ++ int len; ++ ++ if (!md->has_cabc) ++ mode = 0; ++ else ++ mode = get_cabc_mode(md); ++ mode_str = "unknown"; ++ if (mode >= 0 && mode < ARRAY_SIZE(cabc_modes)) ++ mode_str = cabc_modes[mode]; ++ len = snprintf(buf, PAGE_SIZE, "%s\n", mode_str); ++ ++ return len < PAGE_SIZE - 1 ? len : PAGE_SIZE - 1; ++} ++ ++static ssize_t store_cabc_mode(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(dev); ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(cabc_modes); i++) { ++ const char *mode_str = cabc_modes[i]; ++ int cmp_len = strlen(mode_str); ++ ++ if (count > 0 && buf[count - 1] == '\n') ++ count--; ++ if (count != cmp_len) ++ continue; ++ ++ if (strncmp(buf, mode_str, cmp_len) == 0) ++ break; ++ } ++ ++ if (i == ARRAY_SIZE(cabc_modes)) ++ return -EINVAL; ++ ++ if (!md->has_cabc && i != 0) ++ return -EINVAL; ++ ++ mutex_lock(&md->mutex); ++ set_cabc_mode(md, i); ++ mutex_unlock(&md->mutex); ++ ++ return count; ++} ++ ++static ssize_t show_cabc_available_modes(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(dev); ++ int len; ++ int i; ++ ++ if (!md->has_cabc) ++ return snprintf(buf, PAGE_SIZE, "%s\n", cabc_modes[0]); ++ ++ for (i = 0, len = 0; ++ len < PAGE_SIZE && i < ARRAY_SIZE(cabc_modes); i++) ++ len += snprintf(&buf[len], PAGE_SIZE - len, "%s%s%s", ++ i ? " " : "", cabc_modes[i], ++ i == ARRAY_SIZE(cabc_modes) - 1 ? "\n" : ""); ++ ++ return len < PAGE_SIZE ? len : PAGE_SIZE - 1; ++} ++ ++static DEVICE_ATTR(cabc_mode, S_IRUGO | S_IWUSR, ++ show_cabc_mode, store_cabc_mode); ++static DEVICE_ATTR(cabc_available_modes, S_IRUGO, ++ show_cabc_available_modes, NULL); ++ ++static struct attribute *bldev_attrs[] = { ++ &dev_attr_cabc_mode.attr, ++ &dev_attr_cabc_available_modes.attr, ++ NULL, ++}; ++ ++static struct attribute_group bldev_attr_group = { ++ .attrs = bldev_attrs, ++}; ++ ++static int acx565akm_panel_init(struct omap_display *display) ++{ ++ struct omap_panel *panel = display->panel; ++ struct acx565akm_panel_data *panel_data = display->hw_config.panel_data; ++ struct acx565akm_device *md = (struct acx565akm_device *)panel->priv; ++ ++ struct backlight_device *bldev; ++ int brightness; ++ int max_brightness; ++ int r; ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ if (!panel_data) { ++ dev_err(&md->spi->dev, "no panel data\n"); ++ return -ENODEV; ++ } ++ ++ mutex_init(&md->mutex); ++ md->display = display; ++ ++ if (display->hw_config.panel_enable) ++ display->hw_config.panel_enable(display); ++ ++ md->enabled = panel_enabled(md); ++ ++ r = panel_detect(md); ++ if (r) { ++ if (!md->enabled && display->hw_config.panel_disable) ++ display->hw_config.panel_disable(display); ++ mutex_unlock(&md->mutex); ++ return r; ++ } ++ ++ if (!panel_data->bc_connected) { ++ md->has_bc = 0; ++ md->has_cabc = 0; ++ } ++ ++#if 0 ++ acx565akm_set_mode(display, panel->timings.x_res, panel->timings.y_res, ++ panel->bpp); ++#endif ++ ++ if (!md->enabled) ++ display->hw_config.panel_disable(display); ++ ++ bldev = backlight_device_register("acx565akm", &md->spi->dev, ++ md, &acx565akm_bl_ops); ++ md->bl_dev = bldev; ++ ++ if (md->has_cabc) { ++ r = sysfs_create_group(&bldev->dev.kobj, &bldev_attr_group); ++ if (r) { ++ dev_err(&bldev->dev, "failed to create sysfs files\n"); ++ backlight_device_unregister(bldev); ++ return r; ++ } ++ } ++ ++ bldev->props.fb_blank = FB_BLANK_UNBLANK; ++ bldev->props.power = FB_BLANK_UNBLANK; ++ ++ if (md->has_bc) ++ max_brightness = 255; ++ else ++ max_brightness = display->hw_config.max_backlight_level; ++ ++ if (md->has_bc) ++ brightness = acx565akm_get_actual_brightness(md); ++ else { ++ if (display->hw_config.get_backlight != NULL) ++ brightness = display->hw_config.get_backlight(display); ++ else ++ brightness = 0; ++ } ++ ++ bldev->props.max_brightness = max_brightness; ++ bldev->props.brightness = brightness; ++ acx565akm_bl_update_status(bldev); ++ ++ return 0; ++} ++ ++static struct omap_panel acx565akm_panel = { ++ .name = "panel-acx565akm", ++ .init = acx565akm_panel_init, ++ .suspend = acx565akm_panel_suspend, ++ .resume = acx565akm_panel_resume, ++ .enable = acx565akm_panel_enable, ++ .disable = acx565akm_panel_disable, ++ ++ .timings = { ++ .x_res = 800, ++ .y_res = 480, ++ ++ .pixel_clock = 24000, ++ ++ .hsw = 4, ++ .hfp = 16, ++ .hbp = 12, ++ ++ .vsw = 3, ++ .vfp = 3, ++ .vbp = 3, ++ }, ++ ++ .config = OMAP_DSS_LCD_TFT, ++ ++ .recommended_bpp = 16, ++ ++ /* ++ * supported modes: 12bpp(444), 16bpp(565), 18bpp(666), 24bpp(888) ++ * resolutions. ++ */ ++}; ++ ++static int acx565akm_spi_probe(struct spi_device *spi) ++{ ++ struct acx565akm_device *md; ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ md = kzalloc(sizeof(*md), GFP_KERNEL); ++ if (md == NULL) { ++ dev_err(&spi->dev, "out of memory\n"); ++ return -ENOMEM; ++ } ++ ++ spi->mode = SPI_MODE_3; ++ md->spi = spi; ++ dev_set_drvdata(&spi->dev, md); ++ md->panel = acx565akm_panel; ++ acx565akm_panel.priv = md; ++ ++ omap_dss_register_panel(&acx565akm_panel); ++ ++ return 0; ++} ++ ++static int acx565akm_spi_remove(struct spi_device *spi) ++{ ++ struct acx565akm_device *md = dev_get_drvdata(&spi->dev); ++ ++ dev_dbg(&md->spi->dev, "%s\n", __func__); ++ ++ sysfs_remove_group(&md->bl_dev->dev.kobj, &bldev_attr_group); ++ backlight_device_unregister(md->bl_dev); ++ omap_dss_unregister_panel(&acx565akm_panel); ++ ++ kfree(md); ++ ++ return 0; ++} ++ ++static struct spi_driver acx565akm_spi_driver = { ++ .driver = { ++ .name = "acx565akm", ++ .bus = &spi_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = acx565akm_spi_probe, ++ .remove = __devexit_p(acx565akm_spi_remove), ++}; ++ ++static int __init acx565akm_init(void) ++{ ++ return spi_register_driver(&acx565akm_spi_driver); ++} ++ ++static void __exit acx565akm_exit(void) ++{ ++ spi_unregister_driver(&acx565akm_spi_driver); ++} ++ ++module_init(acx565akm_init); ++module_exit(acx565akm_exit); ++ ++MODULE_AUTHOR("Tomi Valkeinen "); ++MODULE_DESCRIPTION("acx565akm LCD Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/video/omap2/displays/panel-acx565akm.h b/drivers/video/omap2/displays/panel-acx565akm.h +new file mode 100644 +index 0000000..6d3727b +--- /dev/null ++++ b/drivers/video/omap2/displays/panel-acx565akm.h +@@ -0,0 +1,9 @@ ++#ifndef __DRIVERS_VIDEO_OMAP2_DISPLAYS_PANEL_ACX565AKM_H ++#define __DRIVERS_VIDEO_OMAP2_DISPLAYS_PANEL_ACX565AKM_H ++ ++struct acx565akm_panel_data { ++ unsigned bc_connected:1; ++}; ++ ++#endif ++ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch b/recipes/linux/linux-omap-2.6.29/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch new file mode 100644 index 0000000000..c7efc58a05 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch @@ -0,0 +1,28 @@ +From 370510e24ddbf539392ebb6a1e43280965fcb19b Mon Sep 17 00:00:00 2001 +From: Vaibhav Hiremath +Date: Tue, 31 Mar 2009 18:47:32 +0530 +Subject: [PATCH] DSS2: Small VRFB context allocation bug fixed + +This is minor bug while requesting and mapping memory for +VRFB space. + +Signed-off-by: Vaibhav Hiremath +--- + drivers/video/omap2/omapfb/omapfb-main.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index 852abe5..44febef 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -1193,6 +1193,7 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + + if(!va) { + printk(KERN_ERR "vrfb: ioremap failed\n"); ++ omap_vrfb_release_ctx(&rg->vrfb); + return -ENOMEM; + } + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch b/recipes/linux/linux-omap-2.6.29/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch new file mode 100644 index 0000000000..1a82ed2a22 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch @@ -0,0 +1,37 @@ +From 370d1f93a32e8fcaeac5c16574417e354af21d08 Mon Sep 17 00:00:00 2001 +From: Vaibhav Hiremath +Date: Tue, 31 Mar 2009 18:38:31 +0530 +Subject: [PATCH] DSS2: Allocated memory for Color Look-up-table + +We were not allocating memory for CMAP buffer and due to that +G_CMAP was failing, since it does check for size of CMAP buffer. + +Called "fb_alloc_cmap" for llocating memory for CMAP. + +We are currently not supporting 1,2,4,8 bpp, so meaning less +for us as of now. But for completeness this is required. + +Signed-off-by: Vaibhav Hiremath +--- + drivers/video/omap2/omapfb/omapfb-main.c | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index 44febef..afe40a9 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -1525,6 +1525,11 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi) + goto err; + + set_fb_fix(fbi); ++ ++ r = fb_alloc_cmap(&fbi->cmap, 256, 0); ++ if (r) ++ dev_err(fbdev->dev, "unable to allocate color map memory\n"); ++ + err: + return r; + } +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0012-DSS2-Fix-DMA-rotation.patch b/recipes/linux/linux-omap-2.6.29/dss2/0012-DSS2-Fix-DMA-rotation.patch new file mode 100644 index 0000000000..22add6efd2 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0012-DSS2-Fix-DMA-rotation.patch @@ -0,0 +1,65 @@ +From 9c93bcab724b5935d745604773ed43825efefd87 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 13:47:11 +0300 +Subject: [PATCH] DSS2: Fix DMA rotation + +u16 was not a good type for offsets. First, they need to be signed, +and second, 16 bits is not enough. +--- + drivers/video/omap2/dss/dispc.c | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index ffb5648..6cea545 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -778,7 +778,7 @@ static void _dispc_set_vid_size(enum omap_plane plane, int width, int height) + dispc_write_reg(vsi_reg[plane-1], val); + } + +-static void _dispc_set_pix_inc(enum omap_plane plane, u16 inc) ++static void _dispc_set_pix_inc(enum omap_plane plane, s32 inc) + { + const struct dispc_reg ri_reg[] = { DISPC_GFX_PIXEL_INC, + DISPC_VID_PIXEL_INC(0), +@@ -787,7 +787,7 @@ static void _dispc_set_pix_inc(enum omap_plane plane, u16 inc) + dispc_write_reg(ri_reg[plane], inc); + } + +-static void _dispc_set_row_inc(enum omap_plane plane, u16 inc) ++static void _dispc_set_row_inc(enum omap_plane plane, s32 inc) + { + const struct dispc_reg ri_reg[] = { DISPC_GFX_ROW_INC, + DISPC_VID_ROW_INC(0), +@@ -1123,7 +1123,7 @@ static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation, + } + } + +-static int pixinc(int pixels, u8 ps) ++static s32 pixinc(int pixels, u8 ps) + { + if (pixels == 1) + return 1; +@@ -1140,7 +1140,7 @@ static void calc_rotation_offset(u8 rotation, bool mirror, + u16 width, u16 height, + enum omap_color_mode color_mode, bool fieldmode, + unsigned *offset0, unsigned *offset1, +- u16 *row_inc, u16 *pix_inc) ++ s32 *row_inc, s32 *pix_inc) + { + u8 ps; + u16 fbw, fbh; +@@ -1298,8 +1298,8 @@ static int _dispc_setup_plane(enum omap_plane plane, + bool fieldmode = 0; + int cconv = 0; + unsigned offset0, offset1; +- u16 row_inc; +- u16 pix_inc; ++ s32 row_inc; ++ s32 pix_inc; + + if (plane == OMAP_DSS_GFX) { + if (width != out_width || height != out_height) +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch b/recipes/linux/linux-omap-2.6.29/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch new file mode 100644 index 0000000000..76b8c73630 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch @@ -0,0 +1,41 @@ +From 360a55ddd309e3a45b227a4a905ae7120dd16169 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen +Date: Thu, 2 Apr 2009 14:21:12 +0300 +Subject: [PATCH] DSS2: Verify that overlay paddr != 0 + +--- + drivers/video/omap2/dss/dispc.c | 3 +++ + drivers/video/omap2/dss/overlay.c | 3 +++ + 2 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 6cea545..2480a03 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1301,6 +1301,9 @@ static int _dispc_setup_plane(enum omap_plane plane, + s32 row_inc; + s32 pix_inc; + ++ if (paddr == 0) ++ return -EINVAL; ++ + if (plane == OMAP_DSS_GFX) { + if (width != out_width || height != out_height) + return -EINVAL; +diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c +index 968edbe..9209acf 100644 +--- a/drivers/video/omap2/dss/overlay.c ++++ b/drivers/video/omap2/dss/overlay.c +@@ -331,6 +331,9 @@ static int dss_ovl_set_overlay_info(struct omap_overlay *ovl, + int r; + struct omap_overlay_info old_info; + ++ if (info->paddr == 0) ++ return -EINVAL; ++ + old_info = ovl->info; + ovl->info = *info; + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch b/recipes/linux/linux-omap-2.6.29/isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch new file mode 100644 index 0000000000..902f87943d --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch @@ -0,0 +1,153 @@ +From 742cc1e62f0d04333c51630f3020da000aeb6de1 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Mon, 2 Mar 2009 19:36:26 +0200 +Subject: [PATCH] omap3: Add base address definitions and resources for OMAP 3 ISP + +This replaces earlier patch from Sergio Aguirre titled "[REVIEW PATCH 03/14] +OMAP34XX: CAM: Resources fixes". + +Signed-off-by: Sakari Ailus +--- + arch/arm/mach-omap2/devices.c | 66 ++++++++++++++++++++++++--- + arch/arm/plat-omap/include/mach/omap34xx.h | 28 +++++++++++- + 2 files changed, 85 insertions(+), 9 deletions(-) + +diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c +index dad4528..2568b0c 100644 +--- a/arch/arm/mach-omap2/devices.c ++++ b/arch/arm/mach-omap2/devices.c +@@ -56,10 +56,60 @@ static inline void omap_init_camera(void) + + #elif defined(CONFIG_VIDEO_OMAP3) || defined(CONFIG_VIDEO_OMAP3_MODULE) + +-static struct resource cam_resources[] = { ++static struct resource omap3isp_resources[] = { ++ { ++ .start = OMAP3430_ISP_BASE, ++ .end = OMAP3430_ISP_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_CBUFF_BASE, ++ .end = OMAP3430_ISP_CBUFF_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_CCP2_BASE, ++ .end = OMAP3430_ISP_CCP2_END, ++ .flags = IORESOURCE_MEM, ++ }, + { +- .start = OMAP34XX_CAMERA_BASE, +- .end = OMAP34XX_CAMERA_BASE + 0x1B70, ++ .start = OMAP3430_ISP_CCDC_BASE, ++ .end = OMAP3430_ISP_CCDC_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_HIST_BASE, ++ .end = OMAP3430_ISP_HIST_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_H3A_BASE, ++ .end = OMAP3430_ISP_H3A_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_PREV_BASE, ++ .end = OMAP3430_ISP_PREV_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_RESZ_BASE, ++ .end = OMAP3430_ISP_RESZ_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_SBL_BASE, ++ .end = OMAP3430_ISP_SBL_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_CSI2A_BASE, ++ .end = OMAP3430_ISP_CSI2A_END, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3430_ISP_CSI2PHY_BASE, ++ .end = OMAP3430_ISP_CSI2PHY_END, + .flags = IORESOURCE_MEM, + }, + { +@@ -68,16 +118,16 @@ static struct resource cam_resources[] = { + } + }; + +-static struct platform_device omap_cam_device = { +- .name = "omap34xxcam", ++static struct platform_device omap3isp_device = { ++ .name = "omap3isp", + .id = -1, +- .num_resources = ARRAY_SIZE(cam_resources), +- .resource = cam_resources, ++ .num_resources = ARRAY_SIZE(omap3isp_resources), ++ .resource = omap3isp_resources, + }; + + static inline void omap_init_camera(void) + { +- platform_device_register(&omap_cam_device); ++ platform_device_register(&omap3isp_device); + } + #else + static inline void omap_init_camera(void) +diff --git a/arch/arm/plat-omap/include/mach/omap34xx.h b/arch/arm/plat-omap/include/mach/omap34xx.h +index 27a1e45..3bfbdf7 100644 +--- a/arch/arm/plat-omap/include/mach/omap34xx.h ++++ b/arch/arm/plat-omap/include/mach/omap34xx.h +@@ -49,6 +49,33 @@ + #define OMAP343X_CTRL_BASE OMAP343X_SCM_BASE + + #define OMAP34XX_IC_BASE 0x48200000 ++ ++#define OMAP3430_ISP_BASE (L4_34XX_BASE + 0xBC000) ++#define OMAP3430_ISP_CBUFF_BASE (OMAP3430_ISP_BASE + 0x0100) ++#define OMAP3430_ISP_CCP2_BASE (OMAP3430_ISP_BASE + 0x0400) ++#define OMAP3430_ISP_CCDC_BASE (OMAP3430_ISP_BASE + 0x0600) ++#define OMAP3430_ISP_HIST_BASE (OMAP3430_ISP_BASE + 0x0A00) ++#define OMAP3430_ISP_H3A_BASE (OMAP3430_ISP_BASE + 0x0C00) ++#define OMAP3430_ISP_PREV_BASE (OMAP3430_ISP_BASE + 0x0E00) ++#define OMAP3430_ISP_RESZ_BASE (OMAP3430_ISP_BASE + 0x1000) ++#define OMAP3430_ISP_SBL_BASE (OMAP3430_ISP_BASE + 0x1200) ++#define OMAP3430_ISP_MMU_BASE (OMAP3430_ISP_BASE + 0x1400) ++#define OMAP3430_ISP_CSI2A_BASE (OMAP3430_ISP_BASE + 0x1800) ++#define OMAP3430_ISP_CSI2PHY_BASE (OMAP3430_ISP_BASE + 0x1970) ++ ++#define OMAP3430_ISP_END (OMAP3430_ISP_BASE + 0x06F) ++#define OMAP3430_ISP_CBUFF_END (OMAP3430_ISP_CBUFF_BASE + 0x077) ++#define OMAP3430_ISP_CCP2_END (OMAP3430_ISP_CCP2_BASE + 0x1EF) ++#define OMAP3430_ISP_CCDC_END (OMAP3430_ISP_CCDC_BASE + 0x0A7) ++#define OMAP3430_ISP_HIST_END (OMAP3430_ISP_HIST_BASE + 0x047) ++#define OMAP3430_ISP_H3A_END (OMAP3430_ISP_H3A_BASE + 0x05F) ++#define OMAP3430_ISP_PREV_END (OMAP3430_ISP_PREV_BASE + 0x09F) ++#define OMAP3430_ISP_RESZ_END (OMAP3430_ISP_RESZ_BASE + 0x0AB) ++#define OMAP3430_ISP_SBL_END (OMAP3430_ISP_SBL_BASE + 0x0FB) ++#define OMAP3430_ISP_MMU_END (OMAP3430_ISP_MMU_BASE + 0x06F) ++#define OMAP3430_ISP_CSI2A_END (OMAP3430_ISP_CSI2A_BASE + 0x16F) ++#define OMAP3430_ISP_CSI2PHY_END (OMAP3430_ISP_CSI2PHY_BASE + 0x007) ++ + #define OMAP34XX_IVA_INTC_BASE 0x40000000 + #define OMAP34XX_HSUSB_OTG_BASE (L4_34XX_BASE + 0xAB000) + #define OMAP34XX_HSUSB_HOST_BASE (L4_34XX_BASE + 0x64000) +@@ -56,7 +83,6 @@ + #define OMAP34XX_SR1_BASE 0x480C9000 + #define OMAP34XX_SR2_BASE 0x480CB000 + +-#define OMAP34XX_CAMERA_BASE (L4_34XX_BASE + 0xBC000) + #define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000) + + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0001-omap-iommu-tlb-and-pagetable-primitives.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0001-omap-iommu-tlb-and-pagetable-primitives.patch new file mode 100644 index 0000000000..c2c9bc2b62 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0001-omap-iommu-tlb-and-pagetable-primitives.patch @@ -0,0 +1,1226 @@ +From a62a047ed02162573e4bece18ecf8bdd66ccd06b Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Mon, 26 Jan 2009 15:13:40 +0200 +Subject: [PATCH] omap iommu: tlb and pagetable primitives + +This patch provides: + +- iotlb_*() : iommu tlb operations +- iopgtable_*() : iommu pagetable(twl) operations +- iommu_*() : the other generic operations + +and the entry points to register and acquire iommu object. + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/plat-omap/include/mach/iommu.h | 157 +++++ + arch/arm/plat-omap/iommu.c | 953 +++++++++++++++++++++++++++++++ + arch/arm/plat-omap/iopgtable.h | 72 +++ + 3 files changed, 1182 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/plat-omap/include/mach/iommu.h + create mode 100644 arch/arm/plat-omap/iommu.c + create mode 100644 arch/arm/plat-omap/iopgtable.h + +diff --git a/arch/arm/plat-omap/include/mach/iommu.h b/arch/arm/plat-omap/include/mach/iommu.h +new file mode 100644 +index 0000000..ef04d7a +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/iommu.h +@@ -0,0 +1,157 @@ ++/* ++ * omap iommu: main structures ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#ifndef __MACH_IOMMU_H ++#define __MACH_IOMMU_H ++ ++struct iotlb_entry { ++ u32 da; ++ u32 pa; ++ u32 pgsz, prsvd, valid; ++ union { ++ u16 ap; ++ struct { ++ u32 endian, elsz, mixed; ++ }; ++ }; ++}; ++ ++struct iommu { ++ const char *name; ++ struct module *owner; ++ struct clk *clk; ++ void __iomem *regbase; ++ struct device *dev; ++ ++ unsigned int refcount; ++ struct mutex iommu_lock; /* global for this whole object */ ++ ++ /* ++ * We don't change iopgd for a situation like pgd for a task, ++ * but share it globally for each iommu. ++ */ ++ u32 *iopgd; ++ spinlock_t page_table_lock; /* protect iopgd */ ++ ++ int nr_tlb_entries; ++ ++ struct list_head mmap; ++ struct mutex mmap_lock; /* protect mmap */ ++ ++ int (*isr)(struct iommu *obj); ++ ++ void *ctx; /* iommu context: registres saved area */ ++}; ++ ++struct cr_regs { ++ union { ++ struct { ++ u16 cam_l; ++ u16 cam_h; ++ }; ++ u32 cam; ++ }; ++ union { ++ struct { ++ u16 ram_l; ++ u16 ram_h; ++ }; ++ u32 ram; ++ }; ++}; ++ ++struct iotlb_lock { ++ short base; ++ short vict; ++}; ++ ++/* architecture specific functions */ ++struct iommu_functions { ++ unsigned long version; ++ ++ int (*enable)(struct iommu *obj); ++ void (*disable)(struct iommu *obj); ++ u32 (*fault_isr)(struct iommu *obj, u32 *ra); ++ ++ void (*tlb_read_cr)(struct iommu *obj, struct cr_regs *cr); ++ void (*tlb_load_cr)(struct iommu *obj, struct cr_regs *cr); ++ ++ struct cr_regs *(*alloc_cr)(struct iommu *obj, struct iotlb_entry *e); ++ int (*cr_valid)(struct cr_regs *cr); ++ u32 (*cr_to_virt)(struct cr_regs *cr); ++ void (*cr_to_e)(struct cr_regs *cr, struct iotlb_entry *e); ++ ssize_t (*dump_cr)(struct iommu *obj, struct cr_regs *cr, char *buf); ++ ++ u32 (*get_pte_attr)(struct iotlb_entry *e); ++ ++ void (*save_ctx)(struct iommu *obj); ++ void (*restore_ctx)(struct iommu *obj); ++ ssize_t (*dump_ctx)(struct iommu *obj, char *buf); ++}; ++ ++struct iommu_platform_data { ++ const char *name; ++ const char *clk_name; ++ const int nr_tlb_entries; ++}; ++ ++#include ++ ++/* ++ * utilities for super page(16MB, 1MB, 64KB and 4KB) ++ */ ++ ++#define iopgsz_max(bytes) \ ++ (((bytes) >= SZ_16M) ? SZ_16M : \ ++ ((bytes) >= SZ_1M) ? SZ_1M : \ ++ ((bytes) >= SZ_64K) ? SZ_64K : \ ++ ((bytes) >= SZ_4K) ? SZ_4K : 0) ++ ++#define bytes_to_iopgsz(bytes) \ ++ (((bytes) == SZ_16M) ? MMU_CAM_PGSZ_16M : \ ++ ((bytes) == SZ_1M) ? MMU_CAM_PGSZ_1M : \ ++ ((bytes) == SZ_64K) ? MMU_CAM_PGSZ_64K : \ ++ ((bytes) == SZ_4K) ? MMU_CAM_PGSZ_4K : -1) ++ ++#define iopgsz_to_bytes(iopgsz) \ ++ (((iopgsz) == MMU_CAM_PGSZ_16M) ? SZ_16M : \ ++ ((iopgsz) == MMU_CAM_PGSZ_1M) ? SZ_1M : \ ++ ((iopgsz) == MMU_CAM_PGSZ_64K) ? SZ_64K : \ ++ ((iopgsz) == MMU_CAM_PGSZ_4K) ? SZ_4K : 0) ++ ++#define iopgsz_ok(bytes) (bytes_to_iopgsz(bytes) >= 0) ++ ++/* ++ * global functions ++ */ ++extern u32 iommu_arch_version(void); ++ ++extern int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e); ++extern void flush_iotlb_page(struct iommu *obj, u32 da); ++extern void flush_iotlb_range(struct iommu *obj, u32 start, u32 end); ++extern void flush_iotlb_all(struct iommu *obj); ++ ++ssize_t iotlb_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf); ++ ++extern int iopgtable_store_entry(struct iommu *obj, struct iotlb_entry *e); ++extern size_t iopgtable_clear_entry(struct iommu *obj, u32 iova); ++ ++extern struct iommu *iommu_get(const char *name); ++extern void iommu_put(struct iommu *obj); ++ ++extern void iommu_save_ctx(struct iommu *obj); ++extern void iommu_restore_ctx(struct iommu *obj); ++ ++extern int install_iommu_arch(const struct iommu_functions *ops); ++extern void uninstall_iommu_arch(const struct iommu_functions *ops); ++ ++#endif /* __MACH_IOMMU_H */ +diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c +new file mode 100644 +index 0000000..e638883 +--- /dev/null ++++ b/arch/arm/plat-omap/iommu.c +@@ -0,0 +1,953 @@ ++/* ++ * omap iommu: tlb and pagetable primitives ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU , ++ * Paul Mundt and Toshihiro Kobayashi ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include "iopgtable.h" ++ ++/* accommodate the difference between omap1 and omap2/3 */ ++static const struct iommu_functions *arch_iommu; ++ ++static struct platform_driver omap_iommu_driver; ++static struct kmem_cache *iopte_cachep; ++ ++/** ++ * install_iommu_arch() - Install archtecure specific iommu functions ++ * @ops: a pointer to architecture specific iommu functions ++ * ++ * There are several kind of iommu algorithm(tlb, pagetable) among ++ * omap series. This interface installs such an iommu algorighm. ++ **/ ++int install_iommu_arch(const struct iommu_functions *ops) ++{ ++ if (arch_iommu) ++ return -EBUSY; ++ ++ arch_iommu = ops; ++ return 0; ++} ++EXPORT_SYMBOL_GPL(install_iommu_arch); ++ ++/** ++ * uninstall_iommu_arch() - Uninstall archtecure specific iommu functions ++ * @ops: a pointer to architecture specific iommu functions ++ * ++ * This interface uninstalls the iommu algorighm installed previously. ++ **/ ++void uninstall_iommu_arch(const struct iommu_functions *ops) ++{ ++ if (arch_iommu != ops) ++ pr_err("%s: not your arch\n", __func__); ++ ++ arch_iommu = NULL; ++} ++EXPORT_SYMBOL_GPL(uninstall_iommu_arch); ++ ++/** ++ * iommu_save_ctx() - Save registers for pm off-mode support ++ * @obj: target iommu ++ **/ ++void iommu_save_ctx(struct iommu *obj) ++{ ++ arch_iommu->save_ctx(obj); ++} ++EXPORT_SYMBOL_GPL(iommu_save_ctx); ++ ++/** ++ * iommu_restore_ctx() - Restore registers for pm off-mode support ++ * @obj: target iommu ++ **/ ++void iommu_restore_ctx(struct iommu *obj) ++{ ++ arch_iommu->restore_ctx(obj); ++} ++EXPORT_SYMBOL_GPL(iommu_restore_ctx); ++ ++/** ++ * iommu_arch_version() - Return running iommu arch version ++ **/ ++u32 iommu_arch_version(void) ++{ ++ return arch_iommu->version; ++} ++EXPORT_SYMBOL_GPL(iommu_arch_version); ++ ++static int iommu_enable(struct iommu *obj) ++{ ++ int err; ++ ++ if (!obj) ++ return -EINVAL; ++ ++ clk_enable(obj->clk); ++ ++ err = arch_iommu->enable(obj); ++ ++ clk_disable(obj->clk); ++ return err; ++} ++ ++static void iommu_disable(struct iommu *obj) ++{ ++ if (!obj) ++ return; ++ ++ clk_enable(obj->clk); ++ ++ arch_iommu->disable(obj); ++ ++ clk_disable(obj->clk); ++} ++ ++#ifdef DEBUG ++static ssize_t iommu_dump_ctx(struct iommu *obj, char *buf) ++{ ++ if (!obj || !buf) ++ return -EINVAL; ++ ++ return arch_iommu->dump_ctx(obj, buf); ++} ++#endif ++ ++/* ++ * TLB operations ++ */ ++static inline void iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e) ++{ ++ BUG_ON(!cr || !e); ++ ++ arch_iommu->cr_to_e(cr, e); ++} ++ ++static inline int iotlb_cr_valid(struct cr_regs *cr) ++{ ++ if (!cr) ++ return -EINVAL; ++ ++ return arch_iommu->cr_valid(cr); ++} ++ ++static inline struct cr_regs *iotlb_alloc_cr(struct iommu *obj, ++ struct iotlb_entry *e) ++{ ++ if (!e) ++ return NULL; ++ ++ return arch_iommu->alloc_cr(obj, e); ++} ++ ++static inline u32 iotlb_cr_to_virt(struct cr_regs *cr) ++{ ++ return arch_iommu->cr_to_virt(cr); ++} ++ ++static u32 get_iopte_attr(struct iotlb_entry *e) ++{ ++ return arch_iommu->get_pte_attr(e); ++} ++ ++static u32 iommu_report_fault(struct iommu *obj, u32 *da) ++{ ++ return arch_iommu->fault_isr(obj, da); ++} ++ ++static void iotlb_lock_get(struct iommu *obj, struct iotlb_lock *l) ++{ ++ u32 val; ++ ++ val = iommu_read_reg(obj, MMU_LOCK); ++ ++ l->base = MMU_LOCK_BASE(val); ++ l->vict = MMU_LOCK_VICT(val); ++ ++ BUG_ON(l->base != 0); /* Currently no preservation is used */ ++} ++ ++static void iotlb_lock_set(struct iommu *obj, struct iotlb_lock *l) ++{ ++ u32 val; ++ ++ BUG_ON(l->base != 0); /* Currently no preservation is used */ ++ ++ val = (l->base << MMU_LOCK_BASE_SHIFT); ++ val |= (l->vict << MMU_LOCK_VICT_SHIFT); ++ ++ iommu_write_reg(obj, val, MMU_LOCK); ++} ++ ++static void iotlb_read_cr(struct iommu *obj, struct cr_regs *cr) ++{ ++ arch_iommu->tlb_read_cr(obj, cr); ++} ++ ++static void iotlb_load_cr(struct iommu *obj, struct cr_regs *cr) ++{ ++ arch_iommu->tlb_load_cr(obj, cr); ++ ++ iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); ++ iommu_write_reg(obj, 1, MMU_LD_TLB); ++} ++ ++/** ++ * iotlb_dump_cr() - Dump an iommu tlb entry into buf ++ * @obj: target iommu ++ * @cr: contents of cam and ram register ++ * @buf: output buffer ++ **/ ++ssize_t iotlb_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf) ++{ ++ BUG_ON(!cr || !buf); ++ ++ return arch_iommu->dump_cr(obj, cr, buf); ++} ++EXPORT_SYMBOL_GPL(iotlb_dump_cr); ++ ++/** ++ * load_iotlb_entry() - Set an iommu tlb entry ++ * @obj: target iommu ++ * @e: an iommu tlb entry info ++ **/ ++int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) ++{ ++ int i; ++ int err = 0; ++ struct iotlb_lock l; ++ struct cr_regs *cr; ++ ++ if (!obj || !obj->nr_tlb_entries || !e) ++ return -EINVAL; ++ ++ clk_enable(obj->clk); ++ ++ for (i = 0; i < obj->nr_tlb_entries; i++) { ++ struct cr_regs tmp; ++ ++ iotlb_lock_get(obj, &l); ++ l.vict = i; ++ iotlb_lock_set(obj, &l); ++ iotlb_read_cr(obj, &tmp); ++ if (!iotlb_cr_valid(&tmp)) ++ break; ++ } ++ ++ if (i == obj->nr_tlb_entries) { ++ dev_dbg(obj->dev, "%s: full: no entry\n", __func__); ++ err = -EBUSY; ++ goto out; ++ } ++ ++ cr = iotlb_alloc_cr(obj, e); ++ if (IS_ERR(cr)) { ++ clk_disable(obj->clk); ++ return PTR_ERR(cr); ++ } ++ ++ iotlb_load_cr(obj, cr); ++ kfree(cr); ++ ++ /* increment victim for next tlb load */ ++ if (++l.vict == obj->nr_tlb_entries) ++ l.vict = 0; ++ iotlb_lock_set(obj, &l); ++out: ++ clk_disable(obj->clk); ++ return err; ++} ++EXPORT_SYMBOL_GPL(load_iotlb_entry); ++ ++/** ++ * flush_iotlb_page() - Clear an iommu tlb entry ++ * @obj: target iommu ++ * @da: iommu device virtual address ++ * ++ * Clear an iommu tlb entry which includes 'da' address. ++ **/ ++void flush_iotlb_page(struct iommu *obj, u32 da) ++{ ++ struct iotlb_lock l; ++ int i; ++ ++ clk_enable(obj->clk); ++ ++ for (i = 0; i < obj->nr_tlb_entries; i++) { ++ struct cr_regs cr; ++ u32 start; ++ size_t bytes; ++ ++ iotlb_lock_get(obj, &l); ++ l.vict = i; ++ iotlb_lock_set(obj, &l); ++ iotlb_read_cr(obj, &cr); ++ if (!iotlb_cr_valid(&cr)) ++ continue; ++ ++ start = iotlb_cr_to_virt(&cr); ++ bytes = iopgsz_to_bytes(cr.cam & 3); ++ ++ if ((start <= da) && (da < start + bytes)) { ++ dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n", ++ __func__, start, da, bytes); ++ ++ iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); ++ } ++ } ++ clk_disable(obj->clk); ++ ++ if (i == obj->nr_tlb_entries) ++ dev_dbg(obj->dev, "%s: no page for %08x\n", __func__, da); ++} ++EXPORT_SYMBOL_GPL(flush_iotlb_page); ++ ++/** ++ * flush_iotlb_range() - Clear an iommu tlb entries ++ * @obj: target iommu ++ * @start: iommu device virtual address(start) ++ * @end: iommu device virtual address(end) ++ * ++ * Clear an iommu tlb entry which includes 'da' address. ++ **/ ++void flush_iotlb_range(struct iommu *obj, u32 start, u32 end) ++{ ++ u32 da = start; ++ ++ while (da < end) { ++ flush_iotlb_page(obj, da); ++ /* FIXME: Optimize for multiple page size */ ++ da += IOPTE_SIZE; ++ } ++} ++EXPORT_SYMBOL_GPL(flush_iotlb_range); ++ ++/** ++ * flush_iotlb_all() - Clear all iommu tlb entries ++ * @obj: target iommu ++ **/ ++void flush_iotlb_all(struct iommu *obj) ++{ ++ struct iotlb_lock l; ++ ++ clk_enable(obj->clk); ++ ++ l.base = 0; ++ l.vict = 0; ++ iotlb_lock_set(obj, &l); ++ ++ iommu_write_reg(obj, 1, MMU_GFLUSH); ++ ++ clk_disable(obj->clk); ++} ++EXPORT_SYMBOL_GPL(flush_iotlb_all); ++ ++/* ++ * H/W pagetable operations ++ */ ++static void flush_iopgd_range(u32 *first, u32 *last) ++{ ++ /* FIXME: L2 cache should be taken care of if it exists */ ++ do { ++ asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pgd" ++ : : "r" (first)); ++ first += L1_CACHE_BYTES / sizeof(*first); ++ } while (first <= last); ++} ++ ++static void flush_iopte_range(u32 *first, u32 *last) ++{ ++ /* FIXME: L2 cache should be taken care of if it exists */ ++ do { ++ asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pte" ++ : : "r" (first)); ++ first += L1_CACHE_BYTES / sizeof(*first); ++ } while (first <= last); ++} ++ ++static void iopte_free(u32 *iopte) ++{ ++ /* Note: freed iopte's must be clean ready for re-use */ ++ kmem_cache_free(iopte_cachep, iopte); ++} ++ ++static u32 *iopte_alloc(struct iommu *obj, u32 *iopgd, u32 da) ++{ ++ u32 *iopte; ++ ++ /* a table has already existed */ ++ if (*iopgd) ++ goto pte_ready; ++ ++ /* ++ * do the allocation outside the page table lock ++ */ ++ spin_unlock(&obj->page_table_lock); ++ iopte = kmem_cache_zalloc(iopte_cachep, GFP_KERNEL); ++ spin_lock(&obj->page_table_lock); ++ ++ if (!*iopgd) { ++ if (!iopte) ++ return ERR_PTR(-ENOMEM); ++ ++ *iopgd = virt_to_phys(iopte) | IOPGD_TABLE; ++ flush_iopgd_range(iopgd, iopgd); ++ ++ dev_vdbg(obj->dev, "%s: a new pte:%p\n", __func__, iopte); ++ } else { ++ /* We raced, free the reduniovant table */ ++ iopte_free(iopte); ++ } ++ ++pte_ready: ++ iopte = iopte_offset(iopgd, da); ++ ++ dev_vdbg(obj->dev, ++ "%s: da:%08x pgd:%p *pgd:%08x pte:%p *pte:%08x\n", ++ __func__, da, iopgd, *iopgd, iopte, *iopte); ++ ++ return iopte; ++} ++ ++static int iopgd_alloc_section(struct iommu *obj, u32 da, u32 pa, u32 prot) ++{ ++ u32 *iopgd = iopgd_offset(obj, da); ++ ++ *iopgd = (pa & IOSECTION_MASK) | prot | IOPGD_SECTION; ++ flush_iopgd_range(iopgd, iopgd); ++ return 0; ++} ++ ++static int iopgd_alloc_super(struct iommu *obj, u32 da, u32 pa, u32 prot) ++{ ++ u32 *iopgd = iopgd_offset(obj, da); ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ *(iopgd + i) = (pa & IOSUPER_MASK) | prot | IOPGD_SUPER; ++ flush_iopgd_range(iopgd, iopgd + 15); ++ return 0; ++} ++ ++static int iopte_alloc_page(struct iommu *obj, u32 da, u32 pa, u32 prot) ++{ ++ u32 *iopgd = iopgd_offset(obj, da); ++ u32 *iopte = iopte_alloc(obj, iopgd, da); ++ ++ if (IS_ERR(iopte)) ++ return PTR_ERR(iopte); ++ ++ *iopte = (pa & IOPAGE_MASK) | prot | IOPTE_SMALL; ++ flush_iopte_range(iopte, iopte); ++ ++ dev_vdbg(obj->dev, "%s: da:%08x pa:%08x pte:%p *pte:%08x\n", ++ __func__, da, pa, iopte, *iopte); ++ ++ return 0; ++} ++ ++static int iopte_alloc_large(struct iommu *obj, u32 da, u32 pa, u32 prot) ++{ ++ u32 *iopgd = iopgd_offset(obj, da); ++ u32 *iopte = iopte_alloc(obj, iopgd, da); ++ int i; ++ ++ if (IS_ERR(iopte)) ++ return PTR_ERR(iopte); ++ ++ for (i = 0; i < 16; i++) ++ *(iopte + i) = (pa & IOLARGE_MASK) | prot | IOPTE_LARGE; ++ flush_iopte_range(iopte, iopte + 15); ++ return 0; ++} ++ ++static int iopgtable_store_entry_core(struct iommu *obj, struct iotlb_entry *e) ++{ ++ int (*fn)(struct iommu *, u32, u32, u32); ++ u32 prot; ++ int err; ++ ++ if (!obj || !e) ++ return -EINVAL; ++ ++ switch (e->pgsz) { ++ case MMU_CAM_PGSZ_16M: ++ fn = iopgd_alloc_super; ++ break; ++ case MMU_CAM_PGSZ_1M: ++ fn = iopgd_alloc_section; ++ break; ++ case MMU_CAM_PGSZ_64K: ++ fn = iopte_alloc_large; ++ break; ++ case MMU_CAM_PGSZ_4K: ++ fn = iopte_alloc_page; ++ break; ++ default: ++ fn = NULL; ++ BUG(); ++ break; ++ } ++ ++ prot = get_iopte_attr(e); ++ ++ spin_lock(&obj->page_table_lock); ++ err = fn(obj, e->da, e->pa, prot); ++ spin_unlock(&obj->page_table_lock); ++ ++ return err; ++} ++ ++#ifdef DEBUG ++static void dump_tlb_entries(struct iommu *obj) ++{ ++ int i; ++ struct iotlb_lock l; ++ ++ clk_enable(obj->clk); ++ ++ pr_info("%8s %8s\n", "cam:", "ram:"); ++ pr_info("-----------------------------------------\n"); ++ ++ for (i = 0; i < obj->nr_tlb_entries; i++) { ++ struct cr_regs cr; ++ static char buf[4096]; ++ ++ iotlb_lock_get(obj, &l); ++ l.vict = i; ++ iotlb_lock_set(obj, &l); ++ iotlb_read_cr(obj, &cr); ++ if (!iotlb_cr_valid(&cr)) ++ continue; ++ ++ memset(buf, 0, 4096); ++ iotlb_dump_cr(obj, &cr, buf); ++ pr_err("%s", buf); ++ } ++ ++ clk_disable(obj->clk); ++} ++#else ++static inline void dump_tlb_entries(struct iommu *obj) {} ++#endif ++ ++/** ++ * iopgtable_store_entry() - Make an iommu pte entry ++ * @obj: target iommu ++ * @e: an iommu tlb entry info ++ **/ ++int iopgtable_store_entry(struct iommu *obj, struct iotlb_entry *e) ++{ ++ int err; ++ ++ flush_iotlb_page(obj, e->da); ++ err = iopgtable_store_entry_core(obj, e); ++#ifdef USE_IOTLB ++ if (!err) ++ load_iotlb_entry(obj, e); ++#endif ++ return err; ++} ++EXPORT_SYMBOL_GPL(iopgtable_store_entry); ++ ++/** ++ * iopgtable_lookup_entry() - Lookup an iommu pte entry ++ * @obj: target iommu ++ * @da: iommu device virtual address ++ * @ppgd: iommu pgd entry pointer to be returned ++ * @ppte: iommu pte entry pointer to be returned ++ **/ ++void iopgtable_lookup_entry(struct iommu *obj, u32 da, u32 **ppgd, u32 **ppte) ++{ ++ u32 *iopgd, *iopte = NULL; ++ ++ iopgd = iopgd_offset(obj, da); ++ if (!*iopgd) ++ goto out; ++ ++ if (*iopgd & IOPGD_TABLE) ++ iopte = iopte_offset(iopgd, da); ++out: ++ *ppgd = iopgd; ++ *ppte = iopte; ++} ++EXPORT_SYMBOL_GPL(iopgtable_lookup_entry); ++ ++static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da) ++{ ++ size_t bytes; ++ u32 *iopgd = iopgd_offset(obj, da); ++ int nent = 1; ++ ++ if (!*iopgd) ++ return 0; ++ ++ if (*iopgd & IOPGD_TABLE) { ++ int i; ++ u32 *iopte = iopte_offset(iopgd, da); ++ ++ bytes = IOPTE_SIZE; ++ if (*iopte & IOPTE_LARGE) { ++ nent *= 16; ++ /* rewind to the 1st entry */ ++ iopte = (u32 *)((u32)iopte & IOLARGE_MASK); ++ } ++ bytes *= nent; ++ memset(iopte, 0, nent * sizeof(*iopte)); ++ flush_iopte_range(iopte, iopte + (nent - 1) * sizeof(*iopte)); ++ ++ /* ++ * do table walk to check if this table is necessary or not ++ */ ++ iopte = iopte_offset(iopgd, 0); ++ for (i = 0; i < PTRS_PER_IOPTE; i++) ++ if (iopte[i]) ++ goto out; ++ ++ iopte_free(iopte); ++ nent = 1; /* for the next L1 entry */ ++ } else { ++ bytes = IOPGD_SIZE; ++ if (*iopgd & IOPGD_SUPER) { ++ nent *= 16; ++ /* rewind to the 1st entry */ ++ iopgd = (u32 *)((u32)iopgd & IOSUPER_MASK); ++ } ++ bytes *= nent; ++ } ++ memset(iopgd, 0, nent * sizeof(*iopgd)); ++ flush_iopgd_range(iopgd, iopgd + (nent - 1) * sizeof(*iopgd)); ++out: ++ return bytes; ++} ++ ++/** ++ * iopgtable_clear_entry() - Remove an iommu pte entry ++ * @obj: target iommu ++ * @da: iommu device virtual address ++ **/ ++size_t iopgtable_clear_entry(struct iommu *obj, u32 da) ++{ ++ size_t bytes; ++ ++ spin_lock(&obj->page_table_lock); ++ ++ bytes = iopgtable_clear_entry_core(obj, da); ++ flush_iotlb_page(obj, da); ++ ++ spin_unlock(&obj->page_table_lock); ++ ++ return bytes; ++} ++EXPORT_SYMBOL_GPL(iopgtable_clear_entry); ++ ++static void iopgtable_clear_entry_all(struct iommu *obj) ++{ ++ int i; ++ ++ spin_lock(&obj->page_table_lock); ++ ++ for (i = 0; i < PTRS_PER_IOPGD; i++) { ++ u32 da; ++ u32 *iopgd; ++ ++ da = i << IOPGD_SHIFT; ++ iopgd = iopgd_offset(obj, da); ++ ++ if (!*iopgd) ++ continue; ++ ++ if (*iopgd & IOPGD_TABLE) ++ iopte_free(iopte_offset(iopgd, 0)); ++ ++ *iopgd = 0; ++ flush_iopgd_range(iopgd, iopgd); ++ } ++ ++ flush_iotlb_all(obj); ++ ++ spin_unlock(&obj->page_table_lock); ++} ++ ++/* ++ * Device IOMMU generic operations ++ */ ++static irqreturn_t iommu_fault_handler(int irq, void *data) ++{ ++ u32 stat, da; ++ u32 *iopgd, *iopte; ++ int err = -EIO; ++ struct iommu *obj = data; ++ ++ /* Dynamic loading TLB or PTE */ ++ if (obj->isr) ++ err = obj->isr(obj); ++ ++ if (!err) ++ return IRQ_HANDLED; ++ ++ stat = iommu_report_fault(obj, &da); ++ if (!stat) ++ return IRQ_HANDLED; ++ ++ iopgd = iopgd_offset(obj, da); ++ ++ if (!(*iopgd & IOPGD_TABLE)) { ++ dev_err(obj->dev, "%s: da:%08x pgd:%p *pgd:%08x\n", __func__, ++ da, iopgd, *iopgd); ++ return IRQ_NONE; ++ } ++ ++ iopte = iopte_offset(iopgd, da); ++ ++ dev_err(obj->dev, "%s: da:%08x pgd:%p *pgd:%08x pte:%p *pte:%08x\n", ++ __func__, da, iopgd, *iopgd, iopte, *iopte); ++ ++ dump_tlb_entries(obj); ++ ++ return IRQ_NONE; ++} ++ ++static int device_match_by_alias(struct device *dev, void *data) ++{ ++ struct iommu *obj = to_iommu(dev); ++ const char *name = data; ++ ++ pr_debug("%s: %s %s\n", __func__, obj->name, name); ++ ++ return strcmp(obj->name, name) == 0; ++} ++ ++/** ++ * iommu_put() - Get iommu handler ++ * @name: target iommu name ++ **/ ++struct iommu *iommu_get(const char *name) ++{ ++ int err = -ENOMEM; ++ struct device *dev; ++ struct iommu *obj; ++ ++ dev = driver_find_device(&omap_iommu_driver.driver, NULL, (void *)name, ++ device_match_by_alias); ++ if (!dev) ++ return ERR_PTR(-ENODEV); ++ ++ obj = to_iommu(dev); ++ ++ mutex_lock(&obj->iommu_lock); ++ ++ if (obj->refcount++ == 0) { ++ err = iommu_enable(obj); ++ if (err) ++ goto err_enable; ++ flush_iotlb_all(obj); ++ } ++ ++ if (!try_module_get(obj->owner)) ++ goto err_module; ++ ++ mutex_unlock(&obj->iommu_lock); ++ ++ dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name); ++ return obj; ++ ++err_module: ++ if (obj->refcount == 1) ++ iommu_disable(obj); ++err_enable: ++ mutex_unlock(&obj->iommu_lock); ++ return ERR_PTR(err); ++} ++EXPORT_SYMBOL_GPL(iommu_get); ++ ++/** ++ * iommu_put() - Put back iommu handler ++ * @obj: target iommu ++ **/ ++void iommu_put(struct iommu *obj) ++{ ++ if (!obj && IS_ERR(obj)) ++ return; ++ ++ mutex_lock(&obj->iommu_lock); ++ ++ if (--obj->refcount == 0) ++ iommu_disable(obj); ++ ++ module_put(obj->owner); ++ ++ mutex_unlock(&obj->iommu_lock); ++ ++ dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name); ++} ++EXPORT_SYMBOL_GPL(iommu_put); ++ ++/* ++ * OMAP Device MMU(IOMMU) detection ++ */ ++static int __devinit omap_iommu_probe(struct platform_device *pdev) ++{ ++ int err = -ENODEV; ++ void *p; ++ int irq; ++ struct iommu *obj; ++ struct resource *res; ++ struct iommu_platform_data *pdata = pdev->dev.platform_data; ++ ++ if (pdev->num_resources != 2) ++ return -EINVAL; ++ ++ obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL); ++ if (!obj) ++ return -ENOMEM; ++ ++ obj->clk = clk_get(&pdev->dev, pdata->clk_name); ++ if (IS_ERR(obj->clk)) ++ goto err_clk; ++ ++ obj->nr_tlb_entries = pdata->nr_tlb_entries; ++ obj->name = pdata->name; ++ obj->dev = &pdev->dev; ++ obj->ctx = (void *)obj + sizeof(*obj); ++ ++ mutex_init(&obj->iommu_lock); ++ mutex_init(&obj->mmap_lock); ++ spin_lock_init(&obj->page_table_lock); ++ INIT_LIST_HEAD(&obj->mmap); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) { ++ err = -ENODEV; ++ goto err_mem; ++ } ++ obj->regbase = ioremap(res->start, resource_size(res)); ++ if (!obj->regbase) { ++ err = -ENOMEM; ++ goto err_mem; ++ } ++ ++ res = request_mem_region(res->start, resource_size(res), ++ dev_name(&pdev->dev)); ++ if (!res) { ++ err = -EIO; ++ goto err_mem; ++ } ++ ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) { ++ err = -ENODEV; ++ goto err_irq; ++ } ++ err = request_irq(irq, iommu_fault_handler, IRQF_SHARED, ++ dev_name(&pdev->dev), obj); ++ if (err < 0) ++ goto err_irq; ++ platform_set_drvdata(pdev, obj); ++ ++ p = (void *)__get_free_pages(GFP_KERNEL, get_order(IOPGD_TABLE_SIZE)); ++ if (!p) { ++ err = -ENOMEM; ++ goto err_pgd; ++ } ++ memset(p, 0, IOPGD_TABLE_SIZE); ++ clean_dcache_area(p, IOPGD_TABLE_SIZE); ++ obj->iopgd = p; ++ ++ BUG_ON(!IS_ALIGNED((unsigned long)obj->iopgd, IOPGD_TABLE_SIZE)); ++ ++ dev_info(&pdev->dev, "%s registered\n", obj->name); ++ return 0; ++ ++err_pgd: ++ free_irq(irq, obj); ++err_irq: ++ release_mem_region(res->start, resource_size(res)); ++ iounmap(obj->regbase); ++err_mem: ++ clk_put(obj->clk); ++err_clk: ++ kfree(obj); ++ return err; ++} ++ ++static int __devexit omap_iommu_remove(struct platform_device *pdev) ++{ ++ int irq; ++ struct resource *res; ++ struct iommu *obj = platform_get_drvdata(pdev); ++ ++ platform_set_drvdata(pdev, NULL); ++ ++ iopgtable_clear_entry_all(obj); ++ free_pages((unsigned long)obj->iopgd, get_order(IOPGD_TABLE_SIZE)); ++ ++ irq = platform_get_irq(pdev, 0); ++ free_irq(irq, obj); ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ release_mem_region(res->start, resource_size(res)); ++ iounmap(obj->regbase); ++ ++ clk_put(obj->clk); ++ dev_info(&pdev->dev, "%s removed\n", obj->name); ++ kfree(obj); ++ return 0; ++} ++ ++static struct platform_driver omap_iommu_driver = { ++ .probe = omap_iommu_probe, ++ .remove = __devexit_p(omap_iommu_remove), ++ .driver = { ++ .name = "omap-iommu", ++ }, ++}; ++ ++static void iopte_cachep_ctor(void *iopte) ++{ ++ clean_dcache_area(iopte, IOPTE_TABLE_SIZE); ++} ++ ++static int __init omap_iommu_init(void) ++{ ++ struct kmem_cache *p; ++ const unsigned long flags = SLAB_HWCACHE_ALIGN; ++ ++ p = kmem_cache_create("iopte_cache", IOPTE_TABLE_SIZE, 0, flags, ++ iopte_cachep_ctor); ++ if (!p) ++ return -ENOMEM; ++ iopte_cachep = p; ++ ++ return platform_driver_register(&omap_iommu_driver); ++} ++module_init(omap_iommu_init); ++ ++static void __exit omap_iommu_exit(void) ++{ ++ kmem_cache_destroy(iopte_cachep); ++ ++ platform_driver_unregister(&omap_iommu_driver); ++} ++module_exit(omap_iommu_exit); ++ ++MODULE_DESCRIPTION("omap iommu: tlb and pagetable primitives"); ++MODULE_ALIAS("platform:omap-iommu"); ++MODULE_AUTHOR("Hiroshi DOYU, Paul Mundt and Toshihiro Kobayashi"); ++MODULE_LICENSE("GPL v2"); +diff --git a/arch/arm/plat-omap/iopgtable.h b/arch/arm/plat-omap/iopgtable.h +new file mode 100644 +index 0000000..37dac43 +--- /dev/null ++++ b/arch/arm/plat-omap/iopgtable.h +@@ -0,0 +1,72 @@ ++/* ++ * omap iommu: pagetable definitions ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#ifndef __PLAT_OMAP_IOMMU_H ++#define __PLAT_OMAP_IOMMU_H ++ ++#define IOPGD_SHIFT 20 ++#define IOPGD_SIZE (1 << IOPGD_SHIFT) ++#define IOPGD_MASK (~(IOPGD_SIZE - 1)) ++#define IOSECTION_MASK IOPGD_MASK ++#define PTRS_PER_IOPGD (1 << (32 - IOPGD_SHIFT)) ++#define IOPGD_TABLE_SIZE (PTRS_PER_IOPGD * sizeof(u32)) ++ ++#define IOSUPER_SIZE (IOPGD_SIZE << 4) ++#define IOSUPER_MASK (~(IOSUPER_SIZE - 1)) ++ ++#define IOPTE_SHIFT 12 ++#define IOPTE_SIZE (1 << IOPTE_SHIFT) ++#define IOPTE_MASK (~(IOPTE_SIZE - 1)) ++#define IOPAGE_MASK IOPTE_MASK ++#define PTRS_PER_IOPTE (1 << (IOPGD_SHIFT - IOPTE_SHIFT)) ++#define IOPTE_TABLE_SIZE (PTRS_PER_IOPTE * sizeof(u32)) ++ ++#define IOLARGE_SIZE (IOPTE_SIZE << 4) ++#define IOLARGE_MASK (~(IOLARGE_SIZE - 1)) ++ ++#define IOPGD_TABLE (1 << 0) ++#define IOPGD_SECTION (2 << 0) ++#define IOPGD_SUPER (1 << 18 | 2 << 0) ++ ++#define IOPTE_SMALL (2 << 0) ++#define IOPTE_LARGE (1 << 0) ++ ++#define iopgd_index(da) (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1)) ++#define iopgd_offset(obj, da) ((obj)->iopgd + iopgd_index(da)) ++ ++#define iopte_paddr(iopgd) (*iopgd & ~((1 << 10) - 1)) ++#define iopte_vaddr(iopgd) ((u32 *)phys_to_virt(iopte_paddr(iopgd))) ++ ++#define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) ++#define iopte_offset(iopgd, da) (iopte_vaddr(iopgd) + iopte_index(da)) ++ ++static inline u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, ++ u32 flags) ++{ ++ memset(e, 0, sizeof(*e)); ++ ++ e->da = da; ++ e->pa = pa; ++ e->valid = 1; ++ /* FIXME: add OMAP1 support */ ++ e->pgsz = flags & MMU_CAM_PGSZ_MASK; ++ e->endian = flags & MMU_RAM_ENDIAN_MASK; ++ e->elsz = flags & MMU_RAM_ELSZ_MASK; ++ e->mixed = flags & MMU_RAM_MIXED_MASK; ++ ++ return iopgsz_to_bytes(e->pgsz); ++} ++ ++#define to_iommu(dev) \ ++ (struct iommu *)platform_get_drvdata(to_platform_device(dev)) ++ ++#endif /* __PLAT_OMAP_IOMMU_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0002-omap-iommu-omap2-architecture-specific-functions.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0002-omap-iommu-omap2-architecture-specific-functions.patch new file mode 100644 index 0000000000..d5f78dd14e --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0002-omap-iommu-omap2-architecture-specific-functions.patch @@ -0,0 +1,453 @@ +From c79d7959c45f40e47520aa6acd54c19094754787 Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Mon, 26 Jan 2009 15:13:45 +0200 +Subject: [PATCH] omap iommu: omap2 architecture specific functions + +The structure 'arch_mmu' accommodates the difference between omap1 and +omap2/3. + +This patch provides omap2/3 specific functions + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/mach-omap2/iommu2.c | 326 ++++++++++++++++++++++++++++++ + arch/arm/plat-omap/include/mach/iommu2.h | 94 +++++++++ + 2 files changed, 420 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/mach-omap2/iommu2.c + create mode 100644 arch/arm/plat-omap/include/mach/iommu2.h + +diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c +new file mode 100644 +index 0000000..88a44f1 +--- /dev/null ++++ b/arch/arm/mach-omap2/iommu2.c +@@ -0,0 +1,326 @@ ++/* ++ * omap iommu: omap2/3 architecture specific functions ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU , ++ * Paul Mundt and Toshihiro Kobayashi ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++/* ++ * omap2 architecture specific register bit definitions ++ */ ++#define IOMMU_ARCH_VERSION 0x00000011 ++ ++/* SYSCONF */ ++#define MMU_SYS_IDLE_SHIFT 3 ++#define MMU_SYS_IDLE_FORCE (0 << MMU_SYS_IDLE_SHIFT) ++#define MMU_SYS_IDLE_NONE (1 << MMU_SYS_IDLE_SHIFT) ++#define MMU_SYS_IDLE_SMART (2 << MMU_SYS_IDLE_SHIFT) ++#define MMU_SYS_IDLE_MASK (3 << MMU_SYS_IDLE_SHIFT) ++ ++#define MMU_SYS_SOFTRESET (1 << 1) ++#define MMU_SYS_AUTOIDLE 1 ++ ++/* SYSSTATUS */ ++#define MMU_SYS_RESETDONE 1 ++ ++/* IRQSTATUS & IRQENABLE */ ++#define MMU_IRQ_MULTIHITFAULT (1 << 4) ++#define MMU_IRQ_TABLEWALKFAULT (1 << 3) ++#define MMU_IRQ_EMUMISS (1 << 2) ++#define MMU_IRQ_TRANSLATIONFAULT (1 << 1) ++#define MMU_IRQ_TLBMISS (1 << 0) ++#define MMU_IRQ_MASK \ ++ (MMU_IRQ_MULTIHITFAULT | MMU_IRQ_TABLEWALKFAULT | MMU_IRQ_EMUMISS | \ ++ MMU_IRQ_TRANSLATIONFAULT) ++ ++/* MMU_CNTL */ ++#define MMU_CNTL_SHIFT 1 ++#define MMU_CNTL_MASK (7 << MMU_CNTL_SHIFT) ++#define MMU_CNTL_EML_TLB (1 << 3) ++#define MMU_CNTL_TWL_EN (1 << 2) ++#define MMU_CNTL_MMU_EN (1 << 1) ++ ++#define get_cam_va_mask(pgsz) \ ++ (((pgsz) == MMU_CAM_PGSZ_16M) ? 0xff000000 : \ ++ ((pgsz) == MMU_CAM_PGSZ_1M) ? 0xfff00000 : \ ++ ((pgsz) == MMU_CAM_PGSZ_64K) ? 0xffff0000 : \ ++ ((pgsz) == MMU_CAM_PGSZ_4K) ? 0xfffff000 : 0) ++ ++static int omap2_iommu_enable(struct iommu *obj) ++{ ++ u32 l, pa; ++ unsigned long timeout; ++ ++ if (!obj->iopgd || !IS_ALIGNED((u32)obj->iopgd, SZ_16K)) ++ return -EINVAL; ++ ++ pa = virt_to_phys(obj->iopgd); ++ if (!IS_ALIGNED(pa, SZ_16K)) ++ return -EINVAL; ++ ++ iommu_write_reg(obj, MMU_SYS_SOFTRESET, MMU_SYSCONFIG); ++ ++ timeout = jiffies + msecs_to_jiffies(20); ++ do { ++ l = iommu_read_reg(obj, MMU_SYSSTATUS); ++ if (l & MMU_SYS_RESETDONE) ++ break; ++ } while (time_after(jiffies, timeout)); ++ ++ if (!(l & MMU_SYS_RESETDONE)) { ++ dev_err(obj->dev, "can't take mmu out of reset\n"); ++ return -ENODEV; ++ } ++ ++ l = iommu_read_reg(obj, MMU_REVISION); ++ dev_info(obj->dev, "%s: version %d.%d\n", obj->name, ++ (l >> 4) & 0xf, l & 0xf); ++ ++ l = iommu_read_reg(obj, MMU_SYSCONFIG); ++ l &= ~MMU_SYS_IDLE_MASK; ++ l |= (MMU_SYS_IDLE_SMART | MMU_SYS_AUTOIDLE); ++ iommu_write_reg(obj, l, MMU_SYSCONFIG); ++ ++ iommu_write_reg(obj, MMU_IRQ_MASK, MMU_IRQENABLE); ++ iommu_write_reg(obj, pa, MMU_TTB); ++ ++ l = iommu_read_reg(obj, MMU_CNTL); ++ l &= ~MMU_CNTL_MASK; ++ l |= (MMU_CNTL_MMU_EN | MMU_CNTL_TWL_EN); ++ iommu_write_reg(obj, l, MMU_CNTL); ++ ++ return 0; ++} ++ ++static void omap2_iommu_disable(struct iommu *obj) ++{ ++ u32 l = iommu_read_reg(obj, MMU_CNTL); ++ ++ l &= ~MMU_CNTL_MASK; ++ iommu_write_reg(obj, l, MMU_CNTL); ++ iommu_write_reg(obj, MMU_SYS_IDLE_FORCE, MMU_SYSCONFIG); ++ ++ dev_dbg(obj->dev, "%s is shutting down\n", obj->name); ++} ++ ++static u32 omap2_iommu_fault_isr(struct iommu *obj, u32 *ra) ++{ ++ int i; ++ u32 stat, da; ++ const char *err_msg[] = { ++ "tlb miss", ++ "translation fault", ++ "emulation miss", ++ "table walk fault", ++ "multi hit fault", ++ }; ++ ++ stat = iommu_read_reg(obj, MMU_IRQSTATUS); ++ stat &= MMU_IRQ_MASK; ++ if (!stat) ++ return 0; ++ ++ da = iommu_read_reg(obj, MMU_FAULT_AD); ++ *ra = da; ++ ++ dev_err(obj->dev, "%s:\tda:%08x ", __func__, da); ++ ++ for (i = 0; i < ARRAY_SIZE(err_msg); i++) { ++ if (stat & (1 << i)) ++ printk("%s ", err_msg[i]); ++ } ++ printk("\n"); ++ ++ iommu_write_reg(obj, stat, MMU_IRQSTATUS); ++ return stat; ++} ++ ++static void omap2_tlb_read_cr(struct iommu *obj, struct cr_regs *cr) ++{ ++ cr->cam = iommu_read_reg(obj, MMU_READ_CAM); ++ cr->ram = iommu_read_reg(obj, MMU_READ_RAM); ++} ++ ++static void omap2_tlb_load_cr(struct iommu *obj, struct cr_regs *cr) ++{ ++ iommu_write_reg(obj, cr->cam | MMU_CAM_V, MMU_CAM); ++ iommu_write_reg(obj, cr->ram, MMU_RAM); ++} ++ ++static u32 omap2_cr_to_virt(struct cr_regs *cr) ++{ ++ u32 page_size = cr->cam & MMU_CAM_PGSZ_MASK; ++ u32 mask = get_cam_va_mask(cr->cam & page_size); ++ ++ return cr->cam & mask; ++} ++ ++static struct cr_regs *omap2_alloc_cr(struct iommu *obj, struct iotlb_entry *e) ++{ ++ struct cr_regs *cr; ++ ++ if (e->da & ~(get_cam_va_mask(e->pgsz))) { ++ dev_err(obj->dev, "%s:\twrong alignment: %08x\n", __func__, ++ e->da); ++ return ERR_PTR(-EINVAL); ++ } ++ ++ cr = kmalloc(sizeof(*cr), GFP_KERNEL); ++ if (!cr) ++ return ERR_PTR(-ENOMEM); ++ ++ cr->cam = (e->da & MMU_CAM_VATAG_MASK) | e->prsvd | e->pgsz; ++ cr->ram = e->pa | e->endian | e->elsz | e->mixed; ++ ++ return cr; ++} ++ ++static inline int omap2_cr_valid(struct cr_regs *cr) ++{ ++ return cr->cam & MMU_CAM_V; ++} ++ ++static u32 omap2_get_pte_attr(struct iotlb_entry *e) ++{ ++ u32 attr; ++ ++ attr = e->mixed << 5; ++ attr |= e->endian; ++ attr |= e->elsz >> 3; ++ attr <<= ((e->pgsz & MMU_CAM_PGSZ_4K) ? 0 : 6); ++ ++ return attr; ++} ++ ++static ssize_t omap2_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf) ++{ ++ char *p = buf; ++ ++ /* FIXME: Need more detail analysis of cam/ram */ ++ p += sprintf(p, "%08x %08x\n", cr->cam, cr->ram); ++ ++ return p - buf; ++} ++ ++#define pr_reg(name) \ ++ p += sprintf(p, "%20s: %08x\n", \ ++ __stringify(name), iommu_read_reg(obj, MMU_##name)); ++ ++static ssize_t omap2_iommu_dump_ctx(struct iommu *obj, char *buf) ++{ ++ char *p = buf; ++ ++ pr_reg(REVISION); ++ pr_reg(SYSCONFIG); ++ pr_reg(SYSSTATUS); ++ pr_reg(IRQSTATUS); ++ pr_reg(IRQENABLE); ++ pr_reg(WALKING_ST); ++ pr_reg(CNTL); ++ pr_reg(FAULT_AD); ++ pr_reg(TTB); ++ pr_reg(LOCK); ++ pr_reg(LD_TLB); ++ pr_reg(CAM); ++ pr_reg(RAM); ++ pr_reg(GFLUSH); ++ pr_reg(FLUSH_ENTRY); ++ pr_reg(READ_CAM); ++ pr_reg(READ_RAM); ++ pr_reg(EMU_FAULT_AD); ++ ++ return p - buf; ++} ++ ++static void omap2_iommu_save_ctx(struct iommu *obj) ++{ ++ int i; ++ u32 *p = obj->ctx; ++ ++ for (i = 0; i < (MMU_REG_SIZE / sizeof(u32)); i++) { ++ p[i] = iommu_read_reg(obj, i * sizeof(u32)); ++ dev_dbg(obj->dev, "%s\t[%02d] %08x\n", __func__, i, p[i]); ++ } ++ ++ BUG_ON(p[0] != IOMMU_ARCH_VERSION); ++} ++ ++static void omap2_iommu_restore_ctx(struct iommu *obj) ++{ ++ int i; ++ u32 *p = obj->ctx; ++ ++ for (i = 0; i < (MMU_REG_SIZE / sizeof(u32)); i++) { ++ iommu_write_reg(obj, p[i], i * sizeof(u32)); ++ dev_dbg(obj->dev, "%s\t[%02d] %08x\n", __func__, i, p[i]); ++ } ++ ++ BUG_ON(p[0] != IOMMU_ARCH_VERSION); ++} ++ ++static void omap2_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e) ++{ ++ e->da = cr->cam & MMU_CAM_VATAG_MASK; ++ e->pa = cr->ram & MMU_RAM_PADDR_MASK; ++ e->valid = cr->cam & MMU_CAM_V; ++ e->pgsz = cr->cam & MMU_CAM_PGSZ_MASK; ++ e->endian = cr->ram & MMU_RAM_ENDIAN_MASK; ++ e->elsz = cr->ram & MMU_RAM_ELSZ_MASK; ++ e->mixed = cr->ram & MMU_RAM_MIXED; ++} ++ ++static const struct iommu_functions omap2_iommu_ops = { ++ .version = IOMMU_ARCH_VERSION, ++ ++ .enable = omap2_iommu_enable, ++ .disable = omap2_iommu_disable, ++ .fault_isr = omap2_iommu_fault_isr, ++ ++ .tlb_read_cr = omap2_tlb_read_cr, ++ .tlb_load_cr = omap2_tlb_load_cr, ++ ++ .cr_to_e = omap2_cr_to_e, ++ .cr_to_virt = omap2_cr_to_virt, ++ .alloc_cr = omap2_alloc_cr, ++ .cr_valid = omap2_cr_valid, ++ .dump_cr = omap2_dump_cr, ++ ++ .get_pte_attr = omap2_get_pte_attr, ++ ++ .save_ctx = omap2_iommu_save_ctx, ++ .restore_ctx = omap2_iommu_restore_ctx, ++ .dump_ctx = omap2_iommu_dump_ctx, ++}; ++ ++static int __init omap2_iommu_init(void) ++{ ++ return install_iommu_arch(&omap2_iommu_ops); ++} ++module_init(omap2_iommu_init); ++ ++static void __exit omap2_iommu_exit(void) ++{ ++ uninstall_iommu_arch(&omap2_iommu_ops); ++} ++module_exit(omap2_iommu_exit); ++ ++MODULE_AUTHOR("Hiroshi DOYU, Paul Mundt and Toshihiro Kobayashi"); ++MODULE_DESCRIPTION("omap iommu: omap2/3 architecture specific functions"); ++MODULE_LICENSE("GPL v2"); +diff --git a/arch/arm/plat-omap/include/mach/iommu2.h b/arch/arm/plat-omap/include/mach/iommu2.h +new file mode 100644 +index 0000000..d746047 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/iommu2.h +@@ -0,0 +1,94 @@ ++/* ++ * omap iommu: omap2 architecture specific definitions ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#ifndef __MACH_IOMMU2_H ++#define __MACH_IOMMU2_H ++ ++/* ++ * MMU Register offsets ++ */ ++#define MMU_REVISION 0x00 ++#define MMU_SYSCONFIG 0x10 ++#define MMU_SYSSTATUS 0x14 ++#define MMU_IRQSTATUS 0x18 ++#define MMU_IRQENABLE 0x1c ++#define MMU_WALKING_ST 0x40 ++#define MMU_CNTL 0x44 ++#define MMU_FAULT_AD 0x48 ++#define MMU_TTB 0x4c ++#define MMU_LOCK 0x50 ++#define MMU_LD_TLB 0x54 ++#define MMU_CAM 0x58 ++#define MMU_RAM 0x5c ++#define MMU_GFLUSH 0x60 ++#define MMU_FLUSH_ENTRY 0x64 ++#define MMU_READ_CAM 0x68 ++#define MMU_READ_RAM 0x6c ++#define MMU_EMU_FAULT_AD 0x70 ++ ++#define MMU_REG_SIZE 256 ++ ++/* ++ * MMU Register bit definitions ++ */ ++#define MMU_LOCK_BASE_SHIFT 10 ++#define MMU_LOCK_BASE_MASK (0x1f << MMU_LOCK_BASE_SHIFT) ++#define MMU_LOCK_BASE(x) \ ++ ((x & MMU_LOCK_BASE_MASK) >> MMU_LOCK_BASE_SHIFT) ++ ++#define MMU_LOCK_VICT_SHIFT 4 ++#define MMU_LOCK_VICT_MASK (0x1f << MMU_LOCK_VICT_SHIFT) ++#define MMU_LOCK_VICT(x) \ ++ ((x & MMU_LOCK_VICT_MASK) >> MMU_LOCK_VICT_SHIFT) ++ ++#define MMU_CAM_VATAG_SHIFT 12 ++#define MMU_CAM_VATAG_MASK \ ++ ((~0UL >> MMU_CAM_VATAG_SHIFT) << MMU_CAM_VATAG_SHIFT) ++#define MMU_CAM_P (1 << 3) ++#define MMU_CAM_V (1 << 2) ++#define MMU_CAM_PGSZ_MASK 3 ++#define MMU_CAM_PGSZ_1M (0 << 0) ++#define MMU_CAM_PGSZ_64K (1 << 0) ++#define MMU_CAM_PGSZ_4K (2 << 0) ++#define MMU_CAM_PGSZ_16M (3 << 0) ++ ++#define MMU_RAM_PADDR_SHIFT 12 ++#define MMU_RAM_PADDR_MASK \ ++ ((~0UL >> MMU_RAM_PADDR_SHIFT) << MMU_RAM_PADDR_SHIFT) ++#define MMU_RAM_ENDIAN_SHIFT 9 ++#define MMU_RAM_ENDIAN_MASK (1 << MMU_RAM_ENDIAN_SHIFT) ++#define MMU_RAM_ENDIAN_BIG (1 << MMU_RAM_ENDIAN_SHIFT) ++#define MMU_RAM_ENDIAN_LITTLE (0 << MMU_RAM_ENDIAN_SHIFT) ++#define MMU_RAM_ELSZ_SHIFT 7 ++#define MMU_RAM_ELSZ_MASK (3 << MMU_RAM_ELSZ_SHIFT) ++#define MMU_RAM_ELSZ_8 (0 << MMU_RAM_ELSZ_SHIFT) ++#define MMU_RAM_ELSZ_16 (1 << MMU_RAM_ELSZ_SHIFT) ++#define MMU_RAM_ELSZ_32 (2 << MMU_RAM_ELSZ_SHIFT) ++#define MMU_RAM_ELSZ_NONE (3 << MMU_RAM_ELSZ_SHIFT) ++#define MMU_RAM_MIXED_SHIFT 6 ++#define MMU_RAM_MIXED_MASK (1 << MMU_RAM_MIXED_SHIFT) ++#define MMU_RAM_MIXED MMU_RAM_MIXED_MASK ++ ++/* ++ * register accessors ++ */ ++static inline u32 iommu_read_reg(struct iommu *obj, size_t offs) ++{ ++ return __raw_readl(obj->regbase + offs); ++} ++ ++static inline void iommu_write_reg(struct iommu *obj, u32 val, size_t offs) ++{ ++ __raw_writel(val, obj->regbase + offs); ++} ++ ++#endif /* __MACH_IOMMU2_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0003-omap-iommu-omap3-iommu-device-registration.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0003-omap-iommu-omap3-iommu-device-registration.patch new file mode 100644 index 0000000000..2954c47872 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0003-omap-iommu-omap3-iommu-device-registration.patch @@ -0,0 +1,124 @@ +From 6a84082597dd322713c5d5951530e3eecb878ad4 Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Wed, 28 Jan 2009 21:32:04 +0200 +Subject: [PATCH] omap iommu: omap3 iommu device registration + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/mach-omap2/omap3-iommu.c | 104 +++++++++++++++++++++++++++++++++++++ + 1 files changed, 104 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/mach-omap2/omap3-iommu.c + +diff --git a/arch/arm/mach-omap2/omap3-iommu.c b/arch/arm/mach-omap2/omap3-iommu.c +new file mode 100644 +index 0000000..97481cc +--- /dev/null ++++ b/arch/arm/mach-omap2/omap3-iommu.c +@@ -0,0 +1,104 @@ ++/* ++ * omap iommu: omap3 device registration ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++ ++#include ++ ++#define OMAP3_MMU1_BASE 0x480bd400 ++#define OMAP3_MMU2_BASE 0x5d000000 ++#define OMAP3_MMU1_IRQ 24 ++#define OMAP3_MMU2_IRQ 28 ++ ++static struct resource omap3_iommu_res[] = { ++ { /* Camera ISP MMU */ ++ .start = OMAP3_MMU1_BASE, ++ .end = OMAP3_MMU1_BASE + MMU_REG_SIZE - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3_MMU1_IRQ, ++ .flags = IORESOURCE_IRQ, ++ }, ++ { /* IVA2.2 MMU */ ++ .start = OMAP3_MMU2_BASE, ++ .end = OMAP3_MMU2_BASE + MMU_REG_SIZE - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ { ++ .start = OMAP3_MMU2_IRQ, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++#define NR_IOMMU_RES (ARRAY_SIZE(omap3_iommu_res) / 2) ++ ++static const struct iommu_platform_data omap3_iommu_pdata[] __initconst = { ++ { ++ .name = "isp", ++ .nr_tlb_entries = 8, ++ .clk_name = "cam_ick", ++ }, ++ { ++ .name = "iva2", ++ .nr_tlb_entries = 32, ++ .clk_name = "iva2_ck", ++ }, ++}; ++#define NR_IOMMU_DEVICES ARRAY_SIZE(omap3_iommu_pdata) ++ ++static struct platform_device *omap3_iommu_pdev[NR_IOMMU_DEVICES]; ++ ++static int __init omap3_iommu_init(void) ++{ ++ int i, err; ++ ++ for (i = 0; i < NR_IOMMU_DEVICES; i++) { ++ struct platform_device *pdev; ++ ++ pdev = platform_device_alloc("omap-iommu", i + 1); ++ if (!pdev) ++ goto err_out; ++ err = platform_device_add_resources(pdev, ++ &omap3_iommu_res[2 * i], NR_IOMMU_RES); ++ if (err) ++ goto err_out; ++ err = platform_device_add_data(pdev, &omap3_iommu_pdata[i], ++ sizeof(omap3_iommu_pdata[0])); ++ if (err) ++ goto err_out; ++ err = platform_device_add(pdev); ++ if (err) ++ goto err_out; ++ omap3_iommu_pdev[i] = pdev; ++ } ++ return 0; ++ ++err_out: ++ while (i--) ++ platform_device_put(omap3_iommu_pdev[i]); ++ return err; ++} ++module_init(omap3_iommu_init); ++ ++static void __exit omap3_iommu_exit(void) ++{ ++ int i; ++ ++ for (i = 0; i < NR_IOMMU_DEVICES; i++) ++ platform_device_unregister(omap3_iommu_pdev[i]); ++} ++module_exit(omap3_iommu_exit); ++ ++MODULE_AUTHOR("Hiroshi DOYU"); ++MODULE_DESCRIPTION("omap iommu: omap3 device registration"); ++MODULE_LICENSE("GPL v2"); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0004-omap-iommu-simple-virtual-address-space-management.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0004-omap-iommu-simple-virtual-address-space-management.patch new file mode 100644 index 0000000000..945778b943 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0004-omap-iommu-simple-virtual-address-space-management.patch @@ -0,0 +1,1083 @@ +From 07365182b998af3dc2b79e822b8e21a3f50262c4 Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Wed, 28 Jan 2009 21:32:08 +0200 +Subject: [PATCH] omap iommu: simple virtual address space management + +This patch provides a device drivers, which has a omap iommu, with +address mapping APIs between device virtual address(iommu), physical +address and MPU virtual address. + +There are 4 possible patterns for iommu virtual address(iova/da) mapping. + + |iova/ mapping iommu_ page + | da pa va (d)-(p)-(v) function type + --------------------------------------------------------------------------- + 1 | c c c 1 - 1 - 1 _kmap() / _kunmap() s + 2 | c c,a c 1 - 1 - 1 _kmalloc()/ _kfree() s + 3 | c d c 1 - n - 1 _vmap() / _vunmap() s + 4 | c d,a c 1 - n - 1 _vmalloc()/ _vfree() n* + + 'iova': device iommu virtual address + 'da': alias of 'iova' + 'pa': physical address + 'va': mpu virtual address + + 'c': contiguous memory area + 'd': dicontiguous memory area + 'a': anonymous memory allocation + '()': optional feature + + 'n': a normal page(4KB) size is used. + 's': multiple iommu superpage(16MB, 1MB, 64KB, 4KB) size is used. + + '*': not yet, but feasible. + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/include/asm/io.h | 6 + + arch/arm/mm/ioremap.c | 11 + + arch/arm/plat-omap/include/mach/iovmm.h | 94 ++++ + arch/arm/plat-omap/iovmm.c | 891 +++++++++++++++++++++++++++++++ + 4 files changed, 1002 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/plat-omap/include/mach/iovmm.h + create mode 100644 arch/arm/plat-omap/iovmm.c + +diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h +index d2a59cf..cbdadfe 100644 +--- a/arch/arm/include/asm/io.h ++++ b/arch/arm/include/asm/io.h +@@ -75,6 +75,12 @@ extern void __iomem * __arm_ioremap(unsigned long, size_t, unsigned int); + extern void __iounmap(volatile void __iomem *addr); + + /* ++ * external interface to remap single page with appropriate type ++ */ ++extern int ioremap_page(unsigned long virt, unsigned long phys, ++ unsigned int mtype); ++ ++/* + * Bad read/write accesses... + */ + extern void __readwrite_bug(const char *fn); +diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c +index 9f88dd3..8441351 100644 +--- a/arch/arm/mm/ioremap.c ++++ b/arch/arm/mm/ioremap.c +@@ -110,6 +110,17 @@ static int remap_area_pages(unsigned long start, unsigned long pfn, + return err; + } + ++int ioremap_page(unsigned long virt, unsigned long phys, unsigned int mtype) ++{ ++ const struct mem_type *type; ++ ++ type = get_mem_type(mtype); ++ if (!type) ++ return -EINVAL; ++ ++ return remap_area_pages(virt, __phys_to_pfn(phys), PAGE_SIZE, type); ++} ++EXPORT_SYMBOL(ioremap_page); + + void __check_kvm_seq(struct mm_struct *mm) + { +diff --git a/arch/arm/plat-omap/include/mach/iovmm.h b/arch/arm/plat-omap/include/mach/iovmm.h +new file mode 100644 +index 0000000..bdc7ce5 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/iovmm.h +@@ -0,0 +1,94 @@ ++/* ++ * omap iommu: simple virtual address space management ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#ifndef __IOMMU_MMAP_H ++#define __IOMMU_MMAP_H ++ ++struct iovm_struct { ++ struct iommu *iommu; /* iommu object which this belongs to */ ++ u32 da_start; /* area definition */ ++ u32 da_end; ++ u32 flags; /* IOVMF_: see below */ ++ struct list_head list; /* linked in ascending order */ ++ const struct sg_table *sgt; /* keep 'page' <-> 'da' mapping */ ++ void *va; /* mpu side mapped address */ ++}; ++ ++/* ++ * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) ++ * ++ * lower 16 bit is used for h/w and upper 16 bit is for s/w. ++ */ ++#define IOVMF_SW_SHIFT 16 ++#define IOVMF_HW_SIZE (1 << IOVMF_SW_SHIFT) ++#define IOVMF_HW_MASK (IOVMF_HW_SIZE - 1) ++#define IOVMF_SW_MASK (~IOVMF_HW_MASK)UL ++ ++/* ++ * iovma: h/w flags derived from cam and ram attribute ++ */ ++#define IOVMF_CAM_MASK (~((1 << 10) - 1)) ++#define IOVMF_RAM_MASK (~IOVMF_CAM_MASK) ++ ++#define IOVMF_PGSZ_MASK (3 << 0) ++#define IOVMF_PGSZ_1M MMU_CAM_PGSZ_1M ++#define IOVMF_PGSZ_64K MMU_CAM_PGSZ_64K ++#define IOVMF_PGSZ_4K MMU_CAM_PGSZ_4K ++#define IOVMF_PGSZ_16M MMU_CAM_PGSZ_16M ++ ++#define IOVMF_ENDIAN_MASK (1 << 9) ++#define IOVMF_ENDIAN_BIG MMU_RAM_ENDIAN_BIG ++#define IOVMF_ENDIAN_LITTLE MMU_RAM_ENDIAN_LITTLE ++ ++#define IOVMF_ELSZ_MASK (3 << 7) ++#define IOVMF_ELSZ_8 MMU_RAM_ELSZ_8 ++#define IOVMF_ELSZ_16 MMU_RAM_ELSZ_16 ++#define IOVMF_ELSZ_32 MMU_RAM_ELSZ_32 ++#define IOVMF_ELSZ_NONE MMU_RAM_ELSZ_NONE ++ ++#define IOVMF_MIXED_MASK (1 << 6) ++#define IOVMF_MIXED MMU_RAM_MIXED ++ ++/* ++ * iovma: s/w flags, used for mapping and umapping internally. ++ */ ++#define IOVMF_MMIO (1 << IOVMF_SW_SHIFT) ++#define IOVMF_ALLOC (2 << IOVMF_SW_SHIFT) ++#define IOVMF_ALLOC_MASK (3 << IOVMF_SW_SHIFT) ++ ++/* "superpages" is supported just with physically linear pages */ ++#define IOVMF_DISCONT (1 << (2 + IOVMF_SW_SHIFT)) ++#define IOVMF_LINEAR (2 << (2 + IOVMF_SW_SHIFT)) ++#define IOVMF_LINEAR_MASK (3 << (2 + IOVMF_SW_SHIFT)) ++ ++#define IOVMF_DA_FIXED (1 << (4 + IOVMF_SW_SHIFT)) ++#define IOVMF_DA_ANON (2 << (4 + IOVMF_SW_SHIFT)) ++#define IOVMF_DA_MASK (3 << (4 + IOVMF_SW_SHIFT)) ++ ++ ++extern struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da); ++extern u32 iommu_vmap(struct iommu *obj, u32 da, ++ const struct sg_table *sgt, u32 flags); ++extern struct sg_table *iommu_vunmap(struct iommu *obj, u32 da); ++extern u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, ++ u32 flags); ++extern void iommu_vfree(struct iommu *obj, const u32 da); ++extern u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, ++ u32 flags); ++extern void iommu_kunmap(struct iommu *obj, u32 da); ++extern u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, ++ u32 flags); ++extern void iommu_kfree(struct iommu *obj, u32 da); ++ ++extern void *da_to_va(struct iommu *obj, u32 da); ++ ++#endif /* __IOMMU_MMAP_H */ +diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c +new file mode 100644 +index 0000000..6726d10 +--- /dev/null ++++ b/arch/arm/plat-omap/iovmm.c +@@ -0,0 +1,891 @@ ++/* ++ * omap iommu: simple virtual address space management ++ * ++ * Copyright (C) 2008-2009 Nokia Corporation ++ * ++ * Written by Hiroshi DOYU ++ * ++ * 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 ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include "iopgtable.h" ++ ++/* ++ * A device driver needs to create address mappings between: ++ * ++ * - iommu/device address ++ * - physical address ++ * - mpu virtual address ++ * ++ * There are 4 possible patterns for them: ++ * ++ * |iova/ mapping iommu_ page ++ * | da pa va (d)-(p)-(v) function type ++ * --------------------------------------------------------------------------- ++ * 1 | c c c 1 - 1 - 1 _kmap() / _kunmap() s ++ * 2 | c c,a c 1 - 1 - 1 _kmalloc()/ _kfree() s ++ * 3 | c d c 1 - n - 1 _vmap() / _vunmap() s ++ * 4 | c d,a c 1 - n - 1 _vmalloc()/ _vfree() n* ++ * ++ * ++ * 'iova': device iommu virtual address ++ * 'da': alias of 'iova' ++ * 'pa': physical address ++ * 'va': mpu virtual address ++ * ++ * 'c': contiguous memory area ++ * 'd': dicontiguous memory area ++ * 'a': anonymous memory allocation ++ * '()': optional feature ++ * ++ * 'n': a normal page(4KB) size is used. ++ * 's': multiple iommu superpage(16MB, 1MB, 64KB, 4KB) size is used. ++ * ++ * '*': not yet, but feasible. ++ */ ++ ++static struct kmem_cache *iovm_area_cachep; ++ ++/* return total bytes of sg buffers */ ++static size_t sgtable_len(const struct sg_table *sgt) ++{ ++ unsigned int i, total = 0; ++ struct scatterlist *sg; ++ ++ if (!sgt) ++ return 0; ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) { ++ size_t bytes; ++ ++ bytes = sg_dma_len(sg); ++ ++ if (!iopgsz_ok(bytes)) { ++ pr_err("%s: sg[%d] not iommu pagesize(%x)\n", ++ __func__, i, bytes); ++ return 0; ++ } ++ ++ total += bytes; ++ } ++ ++ return total; ++} ++#define sgtable_ok(x) (!!sgtable_len(x)) ++ ++/* ++ * calculate the optimal number sg elements from total bytes based on ++ * iommu superpages ++ */ ++static unsigned int sgtable_nents(size_t bytes) ++{ ++ int i; ++ unsigned int nr_entries; ++ const unsigned long pagesize[] = { SZ_16M, SZ_1M, SZ_64K, SZ_4K, }; ++ ++ if (!IS_ALIGNED(bytes, PAGE_SIZE)) { ++ pr_err("%s: wrong size %08x\n", __func__, bytes); ++ return 0; ++ } ++ ++ nr_entries = 0; ++ for (i = 0; i < ARRAY_SIZE(pagesize); i++) { ++ if (bytes >= pagesize[i]) { ++ nr_entries += (bytes / pagesize[i]); ++ bytes %= pagesize[i]; ++ } ++ } ++ BUG_ON(bytes); ++ ++ return nr_entries; ++} ++ ++/* allocate and initialize sg_table header(a kind of 'superblock') */ ++static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags) ++{ ++ unsigned int nr_entries; ++ int err; ++ struct sg_table *sgt; ++ ++ if (!bytes) ++ return ERR_PTR(-EINVAL); ++ ++ if (!IS_ALIGNED(bytes, PAGE_SIZE)) ++ return ERR_PTR(-EINVAL); ++ ++ /* FIXME: IOVMF_DA_FIXED should support 'superpages' */ ++ if ((flags & IOVMF_LINEAR) && (flags & IOVMF_DA_ANON)) { ++ nr_entries = sgtable_nents(bytes); ++ if (!nr_entries) ++ return ERR_PTR(-EINVAL); ++ } else ++ nr_entries = bytes / PAGE_SIZE; ++ ++ sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); ++ if (!sgt) ++ return ERR_PTR(-ENOMEM); ++ ++ err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); ++ if (err) ++ return ERR_PTR(err); ++ ++ pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); ++ ++ return sgt; ++} ++ ++/* free sg_table header(a kind of superblock) */ ++static void sgtable_free(struct sg_table *sgt) ++{ ++ if (!sgt) ++ return; ++ ++ sg_free_table(sgt); ++ kfree(sgt); ++ ++ pr_debug("%s: sgt:%p\n", __func__, sgt); ++} ++ ++/* map 'sglist' to a contiguous mpu virtual area and return 'va' */ ++static void *vmap_sg(const struct sg_table *sgt) ++{ ++ u32 va; ++ size_t total; ++ unsigned int i; ++ struct scatterlist *sg; ++ struct vm_struct *new; ++ ++ total = sgtable_len(sgt); ++ if (!total) ++ return ERR_PTR(-EINVAL); ++ ++ new = __get_vm_area(total, VM_IOREMAP, VMALLOC_START, VMALLOC_END); ++ if (!new) ++ return ERR_PTR(-ENOMEM); ++ va = (u32)new->addr; ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) { ++ size_t bytes; ++ u32 pa; ++ int err; ++ ++ pa = sg_phys(sg); ++ bytes = sg_dma_len(sg); ++ ++ BUG_ON(bytes != PAGE_SIZE); ++ ++ err = ioremap_page(va, pa, MT_DEVICE); ++ if (err) ++ goto err_out; ++ ++ va += bytes; ++ } ++ ++ flush_cache_vmap(new->addr, total); ++ return new->addr; ++ ++err_out: ++ WARN_ON(1); /* FIXME: cleanup some mpu mappings */ ++ vunmap(new->addr); ++ return ERR_PTR(-EAGAIN); ++} ++ ++static inline void vunmap_sg(const void *va) ++{ ++ vunmap(va); ++} ++ ++static struct iovm_struct *__find_iovm_area(struct iommu *obj, const u32 da) ++{ ++ struct iovm_struct *tmp; ++ ++ list_for_each_entry(tmp, &obj->mmap, list) { ++ if ((da >= tmp->da_start) && (da < tmp->da_end)) { ++ size_t len; ++ ++ len = tmp->da_end - tmp->da_start; ++ ++ dev_dbg(obj->dev, "%s: %08x-%08x-%08x(%x) %08x\n", ++ __func__, tmp->da_start, da, tmp->da_end, len, ++ tmp->flags); ++ ++ return tmp; ++ } ++ } ++ ++ return NULL; ++} ++ ++/** ++ * find_iovm_area - find iovma which includes @da ++ * @da: iommu device virtual address ++ * ++ * Find the existing iovma starting at @da ++ */ ++struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da) ++{ ++ struct iovm_struct *area; ++ ++ mutex_lock(&obj->mmap_lock); ++ area = __find_iovm_area(obj, da); ++ mutex_unlock(&obj->mmap_lock); ++ ++ return area; ++} ++EXPORT_SYMBOL_GPL(find_iovm_area); ++ ++/* ++ * This finds the hole(area) which fits the requested address and len ++ * in iovmas mmap, and returns the new allocated iovma. ++ */ ++static struct iovm_struct *alloc_iovm_area(struct iommu *obj, u32 da, ++ size_t bytes, u32 flags) ++{ ++ struct iovm_struct *new, *tmp; ++ u32 start, prev_end, alignement; ++ ++ if (!obj || !bytes) ++ return ERR_PTR(-EINVAL); ++ ++ start = da; ++ alignement = PAGE_SIZE; ++ ++ if (flags & IOVMF_DA_ANON) { ++ /* ++ * Reserve the first page for NULL ++ */ ++ start = PAGE_SIZE; ++ if (flags & IOVMF_LINEAR) ++ alignement = iopgsz_max(bytes); ++ start = roundup(start, alignement); ++ } ++ ++ tmp = NULL; ++ if (list_empty(&obj->mmap)) ++ goto found; ++ ++ prev_end = 0; ++ list_for_each_entry(tmp, &obj->mmap, list) { ++ ++ if ((prev_end <= start) && (start + bytes < tmp->da_start)) ++ goto found; ++ ++ if (flags & IOVMF_DA_ANON) ++ start = roundup(tmp->da_end, alignement); ++ ++ prev_end = tmp->da_end; ++ } ++ ++ if ((start >= prev_end) && (ULONG_MAX - start >= bytes)) ++ goto found; ++ ++ dev_dbg(obj->dev, "%s: no space to fit %08x(%x) flags: %08x\n", ++ __func__, da, bytes, flags); ++ ++ return ERR_PTR(-EINVAL); ++ ++found: ++ new = kmem_cache_zalloc(iovm_area_cachep, GFP_KERNEL); ++ if (!new) ++ return ERR_PTR(-ENOMEM); ++ ++ new->iommu = obj; ++ new->da_start = start; ++ new->da_end = start + bytes; ++ new->flags = flags; ++ ++ /* ++ * keep ascending order of iovmas ++ */ ++ if (tmp) ++ list_add_tail(&new->list, &tmp->list); ++ else ++ list_add(&new->list, &obj->mmap); ++ ++ dev_dbg(obj->dev, "%s: found %08x-%08x-%08x(%x) %08x\n", ++ __func__, new->da_start, start, new->da_end, bytes, flags); ++ ++ return new; ++} ++ ++static void free_iovm_area(struct iommu *obj, struct iovm_struct *area) ++{ ++ size_t bytes; ++ ++ BUG_ON(!obj || !area); ++ ++ bytes = area->da_end - area->da_start; ++ ++ dev_dbg(obj->dev, "%s: %08x-%08x(%x) %08x\n", ++ __func__, area->da_start, area->da_end, bytes, area->flags); ++ ++ list_del(&area->list); ++ kmem_cache_free(iovm_area_cachep, area); ++} ++ ++/** ++ * da_to_va - convert (d) to (v) ++ * @obj: objective iommu ++ * @da: iommu device virtual address ++ * @va: mpu virtual address ++ * ++ * Returns mpu virtual addr which corresponds to a given device virtual addr ++ */ ++void *da_to_va(struct iommu *obj, u32 da) ++{ ++ void *va = NULL; ++ struct iovm_struct *area; ++ ++ mutex_lock(&obj->mmap_lock); ++ ++ area = __find_iovm_area(obj, da); ++ if (!area) { ++ dev_warn(obj->dev, "%s: no da area(%08x)\n", __func__, da); ++ goto out; ++ } ++ va = area->va; ++ mutex_unlock(&obj->mmap_lock); ++out: ++ return va; ++} ++EXPORT_SYMBOL_GPL(da_to_va); ++ ++static void sgtable_fill_vmalloc(struct sg_table *sgt, void *_va) ++{ ++ unsigned int i; ++ struct scatterlist *sg; ++ void *va = _va; ++ void *va_end; ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) { ++ struct page *pg; ++ const size_t bytes = PAGE_SIZE; ++ ++ /* ++ * iommu 'superpage' isn't supported with 'iommu_vmalloc()' ++ */ ++ pg = vmalloc_to_page(va); ++ BUG_ON(!pg); ++ sg_set_page(sg, pg, bytes, 0); ++ ++ va += bytes; ++ } ++ ++ va_end = _va + PAGE_SIZE * i; ++ flush_cache_vmap(_va, va_end); ++} ++ ++static inline void sgtable_drain_vmalloc(struct sg_table *sgt) ++{ ++ /* ++ * Actually this is not necessary at all, just exists for ++ * consistency of the code readibility. ++ */ ++ BUG_ON(!sgt); ++} ++ ++static void sgtable_fill_kmalloc(struct sg_table *sgt, u32 pa, size_t len) ++{ ++ unsigned int i; ++ struct scatterlist *sg; ++ void *va; ++ ++ va = phys_to_virt(pa); ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) { ++ size_t bytes; ++ ++ bytes = iopgsz_max(len); ++ ++ BUG_ON(!iopgsz_ok(bytes)); ++ ++ sg_set_buf(sg, phys_to_virt(pa), bytes); ++ /* ++ * 'pa' is cotinuous(linear). ++ */ ++ pa += bytes; ++ len -= bytes; ++ } ++ BUG_ON(len); ++ ++ clean_dcache_area(va, len); ++} ++ ++static inline void sgtable_drain_kmalloc(struct sg_table *sgt) ++{ ++ /* ++ * Actually this is not necessary at all, just exists for ++ * consistency of the code readibility ++ */ ++ BUG_ON(!sgt); ++} ++ ++/* create 'da' <-> 'pa' mapping from 'sgt' */ ++static int map_iovm_area(struct iommu *obj, struct iovm_struct *new, ++ const struct sg_table *sgt, u32 flags) ++{ ++ int err; ++ unsigned int i, j; ++ struct scatterlist *sg; ++ u32 da = new->da_start; ++ ++ if (!obj || !new || !sgt) ++ return -EINVAL; ++ ++ BUG_ON(!sgtable_ok(sgt)); ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) { ++ u32 pa; ++ int pgsz; ++ size_t bytes; ++ struct iotlb_entry e; ++ ++ pa = sg_phys(sg); ++ bytes = sg_dma_len(sg); ++ ++ flags &= ~IOVMF_PGSZ_MASK; ++ pgsz = bytes_to_iopgsz(bytes); ++ if (pgsz < 0) ++ goto err_out; ++ flags |= pgsz; ++ ++ pr_debug("%s: [%d] %08x %08x(%x)\n", __func__, ++ i, da, pa, bytes); ++ ++ iotlb_init_entry(&e, da, pa, flags); ++ err = iopgtable_store_entry(obj, &e); ++ if (err) ++ goto err_out; ++ ++ da += bytes; ++ } ++ return 0; ++ ++err_out: ++ da = new->da_start; ++ ++ for_each_sg(sgt->sgl, sg, i, j) { ++ size_t bytes; ++ ++ bytes = iopgtable_clear_entry(obj, da); ++ ++ BUG_ON(!iopgsz_ok(bytes)); ++ ++ da += bytes; ++ } ++ return err; ++} ++ ++/* release 'da' <-> 'pa' mapping */ ++static void unmap_iovm_area(struct iommu *obj, struct iovm_struct *area) ++{ ++ u32 start; ++ size_t total = area->da_end - area->da_start; ++ ++ BUG_ON((!total) || !IS_ALIGNED(total, PAGE_SIZE)); ++ ++ start = area->da_start; ++ while (total > 0) { ++ size_t bytes; ++ ++ bytes = iopgtable_clear_entry(obj, start); ++ if (bytes == 0) ++ bytes = PAGE_SIZE; ++ else ++ dev_dbg(obj->dev, "%s: unmap %08x(%x) %08x\n", ++ __func__, start, bytes, area->flags); ++ ++ BUG_ON(!IS_ALIGNED(bytes, PAGE_SIZE)); ++ ++ total -= bytes; ++ start += bytes; ++ } ++ BUG_ON(total); ++} ++ ++/* template function for all unmapping */ ++static struct sg_table *unmap_vm_area(struct iommu *obj, const u32 da, ++ void (*fn)(const void *), u32 flags) ++{ ++ struct sg_table *sgt = NULL; ++ struct iovm_struct *area; ++ ++ BUG_ON(in_interrupt()); ++ ++ if (!IS_ALIGNED(da, PAGE_SIZE)) { ++ dev_err(obj->dev, "%s: alignment err(%08x)\n", __func__, da); ++ return NULL; ++ } ++ ++ mutex_lock(&obj->mmap_lock); ++ ++ area = __find_iovm_area(obj, da); ++ if (!area) { ++ dev_err(obj->dev, "%s: no da area(%08x)\n", __func__, da); ++ goto out; ++ } ++ ++ if ((area->flags & flags) != flags) { ++ dev_err(obj->dev, "%s: wrong flags(%08x)\n", __func__, ++ area->flags); ++ goto out; ++ } ++ sgt = (struct sg_table *)area->sgt; ++ ++ unmap_iovm_area(obj, area); ++ ++ fn(area->va); ++ ++ dev_dbg(obj->dev, "%s: %08x-%08x-%08x(%x) %08x\n", __func__, ++ area->da_start, da, area->da_end, ++ area->da_end - area->da_start, area->flags); ++ ++ free_iovm_area(obj, area); ++out: ++ mutex_unlock(&obj->mmap_lock); ++ ++ return sgt; ++} ++ ++static u32 map_iommu_region(struct iommu *obj, u32 da, ++ const struct sg_table *sgt, void *va, size_t bytes, u32 flags) ++{ ++ int err = -ENOMEM; ++ struct iovm_struct *new; ++ ++ mutex_lock(&obj->mmap_lock); ++ ++ new = alloc_iovm_area(obj, da, bytes, flags); ++ if (IS_ERR(new)) { ++ err = PTR_ERR(new); ++ goto err_alloc_iovma; ++ } ++ new->va = va; ++ new->sgt = sgt; ++ ++ if (map_iovm_area(obj, new, sgt, new->flags)) ++ goto err_map; ++ ++ mutex_unlock(&obj->mmap_lock); ++ ++ dev_dbg(obj->dev, "%s: da:%08x(%x) flags:%08x va:%p\n", ++ __func__, new->da_start, bytes, new->flags, va); ++ ++ return new->da_start; ++ ++err_map: ++ free_iovm_area(obj, new); ++err_alloc_iovma: ++ mutex_unlock(&obj->mmap_lock); ++ return err; ++} ++ ++static inline u32 __iommu_vmap(struct iommu *obj, u32 da, ++ const struct sg_table *sgt, void *va, size_t bytes, u32 flags) ++{ ++ return map_iommu_region(obj, da, sgt, va, bytes, flags); ++} ++ ++/** ++ * iommu_vmap - (d)-(p)-(v) address mapper ++ * @obj: objective iommu ++ * @sgt: address of scatter gather table ++ * @flags: iovma and page property ++ * ++ * Creates 1-n-1 mapping with given @sgt and returns @da. ++ * All @sgt element must be io page size aligned. ++ */ ++u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt, ++ u32 flags) ++{ ++ size_t bytes; ++ void *va; ++ ++ if (!obj || !obj->dev || !sgt) ++ return -EINVAL; ++ ++ bytes = sgtable_len(sgt); ++ if (!bytes) ++ return -EINVAL; ++ bytes = PAGE_ALIGN(bytes); ++ ++ va = vmap_sg(sgt); ++ if (IS_ERR(va)) ++ return PTR_ERR(va); ++ ++ flags &= IOVMF_HW_MASK; ++ flags |= IOVMF_DISCONT; ++ flags |= IOVMF_MMIO; ++ flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); ++ ++ da = __iommu_vmap(obj, da, sgt, va, bytes, flags); ++ if (IS_ERR_VALUE(da)) ++ vunmap_sg(va); ++ ++ return da; ++} ++EXPORT_SYMBOL_GPL(iommu_vmap); ++ ++/** ++ * iommu_vunmap - release virtual mapping obtained by 'iommu_vmap()' ++ * @obj: objective iommu ++ * @da: iommu device virtual address ++ * ++ * Free the iommu virtually contiguous memory area starting at ++ * @da, which was returned by 'iommu_vmap()'. ++ */ ++struct sg_table *iommu_vunmap(struct iommu *obj, u32 da) ++{ ++ struct sg_table *sgt; ++ /* ++ * 'sgt' is allocated before 'iommu_vmalloc()' is called. ++ * Just returns 'sgt' to the caller to free ++ */ ++ sgt = unmap_vm_area(obj, da, vunmap_sg, IOVMF_DISCONT | IOVMF_MMIO); ++ if (!sgt) ++ dev_err(obj->dev, "%s: No sgt\n", __func__); ++ return sgt; ++} ++EXPORT_SYMBOL_GPL(iommu_vunmap); ++ ++/** ++ * iommu_vmalloc - (d)-(p)-(v) address allocator and mapper ++ * @obj: objective iommu ++ * @da: contiguous iommu virtual memory ++ * @bytes: allocation size ++ * @flags: iovma and page property ++ * ++ * Allocate @bytes linearly and creates 1-n-1 mapping and returns ++ * @da again, which might be adjusted if 'IOVMF_DA_ANON' is set. ++ */ ++u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) ++{ ++ void *va; ++ struct sg_table *sgt; ++ ++ if (!obj || !obj->dev || !bytes) ++ return -EINVAL; ++ ++ bytes = PAGE_ALIGN(bytes); ++ ++ va = vmalloc(bytes); ++ if (!va) ++ return -ENOMEM; ++ ++ sgt = sgtable_alloc(bytes, flags); ++ if (IS_ERR(sgt)) { ++ da = PTR_ERR(sgt); ++ goto err_sgt_alloc; ++ } ++ sgtable_fill_vmalloc(sgt, va); ++ ++ flags &= IOVMF_HW_MASK; ++ flags |= IOVMF_DISCONT; ++ flags |= IOVMF_ALLOC; ++ flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); ++ ++ da = __iommu_vmap(obj, da, sgt, va, bytes, flags); ++ if (IS_ERR_VALUE(da)) ++ goto err_iommu_vmap; ++ ++ return da; ++ ++err_iommu_vmap: ++ sgtable_drain_vmalloc(sgt); ++ sgtable_free(sgt); ++err_sgt_alloc: ++ vfree(va); ++ return da; ++} ++EXPORT_SYMBOL_GPL(iommu_vmalloc); ++ ++/** ++ * iommu_vfree - release memory allocated by 'iommu_vmalloc()' ++ * @obj: objective iommu ++ * @da: iommu device virtual address ++ * ++ * Frees the iommu virtually continuous memory area starting at ++ * @da, as obtained from 'iommu_vmalloc()'. ++ */ ++void iommu_vfree(struct iommu *obj, const u32 da) ++{ ++ struct sg_table *sgt; ++ ++ sgt = unmap_vm_area(obj, da, vfree, IOVMF_DISCONT | IOVMF_ALLOC); ++ if (!sgt) ++ dev_err(obj->dev, "%s: No sgt\n", __func__); ++ sgtable_free(sgt); ++} ++EXPORT_SYMBOL_GPL(iommu_vfree); ++ ++static u32 __iommu_kmap(struct iommu *obj, u32 da, u32 pa, void *va, ++ size_t bytes, u32 flags) ++{ ++ struct sg_table *sgt; ++ ++ sgt = sgtable_alloc(bytes, flags); ++ if (IS_ERR(sgt)) ++ return PTR_ERR(sgt); ++ ++ sgtable_fill_kmalloc(sgt, pa, bytes); ++ ++ da = map_iommu_region(obj, da, sgt, va, bytes, flags); ++ if (IS_ERR_VALUE(da)) { ++ sgtable_drain_kmalloc(sgt); ++ sgtable_free(sgt); ++ } ++ ++ return da; ++} ++ ++/** ++ * iommu_kmap - (d)-(p)-(v) address mapper ++ * @obj: objective iommu ++ * @da: contiguous iommu virtual memory ++ * @pa: contiguous physical memory ++ * @flags: iovma and page property ++ * ++ * Creates 1-1-1 mapping and returns @da again, which can be ++ * adjusted if 'IOVMF_DA_ANON' is set. ++ */ ++u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, ++ u32 flags) ++{ ++ void *va; ++ ++ if (!obj || !obj->dev || !bytes) ++ return -EINVAL; ++ ++ bytes = PAGE_ALIGN(bytes); ++ ++ va = ioremap(pa, bytes); ++ if (!va) ++ return -ENOMEM; ++ ++ flags &= IOVMF_HW_MASK; ++ flags |= IOVMF_LINEAR; ++ flags |= IOVMF_MMIO; ++ flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); ++ ++ da = __iommu_kmap(obj, da, pa, va, bytes, flags); ++ if (IS_ERR_VALUE(da)) ++ iounmap(va); ++ ++ return da; ++} ++EXPORT_SYMBOL_GPL(iommu_kmap); ++ ++/** ++ * iommu_kunmap - release virtual mapping obtained by 'iommu_kmap()' ++ * @obj: objective iommu ++ * @da: iommu device virtual address ++ * ++ * Frees the iommu virtually contiguous memory area starting at ++ * @da, which was passed to and was returned by'iommu_kmap()'. ++ */ ++void iommu_kunmap(struct iommu *obj, u32 da) ++{ ++ struct sg_table *sgt; ++ ++ sgt = unmap_vm_area(obj, da, __iounmap, IOVMF_LINEAR | IOVMF_MMIO); ++ if (!sgt) ++ dev_err(obj->dev, "%s: No sgt\n", __func__); ++ sgtable_free(sgt); ++} ++EXPORT_SYMBOL_GPL(iommu_kunmap); ++ ++/** ++ * iommu_kmalloc - (d)-(p)-(v) address allocator and mapper ++ * @obj: objective iommu ++ * @da: contiguous iommu virtual memory ++ * @bytes: bytes for allocation ++ * @flags: iovma and page property ++ * ++ * Allocate @bytes linearly and creates 1-1-1 mapping and returns ++ * @da again, which might be adjusted if 'IOVMF_DA_ANON' is set. ++ */ ++u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) ++{ ++ void *va; ++ u32 pa; ++ ++ if (!obj || !obj->dev || !bytes) ++ return -EINVAL; ++ ++ bytes = PAGE_ALIGN(bytes); ++ ++ va = kmalloc(bytes, GFP_KERNEL | GFP_DMA); ++ if (!va) ++ return -ENOMEM; ++ pa = virt_to_phys(va); ++ ++ flags &= IOVMF_HW_MASK; ++ flags |= IOVMF_LINEAR; ++ flags |= IOVMF_ALLOC; ++ flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); ++ ++ da = __iommu_kmap(obj, da, pa, va, bytes, flags); ++ if (IS_ERR_VALUE(da)) ++ kfree(va); ++ ++ return da; ++} ++EXPORT_SYMBOL_GPL(iommu_kmalloc); ++ ++/** ++ * iommu_kfree - release virtual mapping obtained by 'iommu_kmalloc()' ++ * @obj: objective iommu ++ * @da: iommu device virtual address ++ * ++ * Frees the iommu virtually contiguous memory area starting at ++ * @da, which was passed to and was returned by'iommu_kmalloc()'. ++ */ ++void iommu_kfree(struct iommu *obj, u32 da) ++{ ++ struct sg_table *sgt; ++ ++ sgt = unmap_vm_area(obj, da, kfree, IOVMF_LINEAR | IOVMF_ALLOC); ++ if (!sgt) ++ dev_err(obj->dev, "%s: No sgt\n", __func__); ++ sgtable_free(sgt); ++} ++EXPORT_SYMBOL_GPL(iommu_kfree); ++ ++ ++static int __init iovmm_init(void) ++{ ++ const unsigned long flags = SLAB_HWCACHE_ALIGN; ++ struct kmem_cache *p; ++ ++ p = kmem_cache_create("iovm_area_cache", sizeof(struct iovm_struct), 0, ++ flags, NULL); ++ if (!p) ++ return -ENOMEM; ++ iovm_area_cachep = p; ++ ++ return 0; ++} ++module_init(iovmm_init); ++ ++static void __exit iovmm_exit(void) ++{ ++ kmem_cache_destroy(iovm_area_cachep); ++} ++module_exit(iovmm_exit); ++ ++MODULE_DESCRIPTION("omap iommu: simple virtual address space management"); ++MODULE_AUTHOR("Hiroshi DOYU "); ++MODULE_LICENSE("GPL v2"); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0005-omap-iommu-entries-for-Kconfig-and-Makefile.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0005-omap-iommu-entries-for-Kconfig-and-Makefile.patch new file mode 100644 index 0000000000..c0f9e4d9ac --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0005-omap-iommu-entries-for-Kconfig-and-Makefile.patch @@ -0,0 +1,45 @@ +From 7de046a6a8446358001c38ad1d0b2b829ca0c98c Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Wed, 28 Jan 2009 21:32:08 +0200 +Subject: [PATCH] omap iommu: entries for Kconfig and Makefile + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/plat-omap/Kconfig | 8 ++++++++ + arch/arm/plat-omap/Makefile | 1 + + 2 files changed, 9 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig +index b16ae76..2090bb5 100644 +--- a/arch/arm/plat-omap/Kconfig ++++ b/arch/arm/plat-omap/Kconfig +@@ -176,6 +176,14 @@ config OMAP_MBOX_FWK + Say Y here if you want to use OMAP Mailbox framework support for + DSP, IVA1.0 and IVA2 in OMAP1/2/3. + ++config OMAP_IOMMU ++ tristate "IOMMU support" ++ depends on ARCH_OMAP ++ default n ++ help ++ Say Y here if you want to use OMAP IOMMU support for IVA2 and ++ Camera in OMAP3. ++ + choice + prompt "System timer" + default OMAP_MPU_TIMER +diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile +index 3ebc09e..aa8f6df 100644 +--- a/arch/arm/plat-omap/Makefile ++++ b/arch/arm/plat-omap/Makefile +@@ -13,6 +13,7 @@ obj- := + obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o + + obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o ++obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o + + obj-$(CONFIG_CPU_FREQ) += cpu-omap.o + obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0006-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0006-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch new file mode 100644 index 0000000000..54a7abfe85 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0006-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch @@ -0,0 +1,26 @@ +From b03f695e25bbdaa95a2cc87e15ee8592e7ca128d Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Feb 2009 18:01:29 +0200 +Subject: [PATCH] omap iommu: Don't try BUG_ON(in_interrupt()) + +Signed-off-by: Sakari Ailus +--- + arch/arm/plat-omap/iovmm.c | 2 -- + 1 files changed, 0 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c +index 6726d10..bdfbb09 100644 +--- a/arch/arm/plat-omap/iovmm.c ++++ b/arch/arm/plat-omap/iovmm.c +@@ -523,8 +523,6 @@ static struct sg_table *unmap_vm_area(struct iommu *obj, const u32 da, + struct sg_table *sgt = NULL; + struct iovm_struct *area; + +- BUG_ON(in_interrupt()); +- + if (!IS_ALIGNED(da, PAGE_SIZE)) { + dev_err(obj->dev, "%s: alignment err(%08x)\n", __func__, da); + return NULL; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0007-omap-iommu-We-support-chained-scatterlists-probabl.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0007-omap-iommu-We-support-chained-scatterlists-probabl.patch new file mode 100644 index 0000000000..d8ad0eb0b7 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0007-omap-iommu-We-support-chained-scatterlists-probabl.patch @@ -0,0 +1,24 @@ +From 24f984f784cae1a4515fe1be8db1ac24cdf51e84 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Feb 2009 18:37:41 +0200 +Subject: [PATCH] omap iommu: We support chained scatterlists, probably. :) + +Signed-off-by: Sakari Ailus +--- + arch/arm/include/asm/scatterlist.h | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/include/asm/scatterlist.h b/arch/arm/include/asm/scatterlist.h +index ca0a37d..393f8b8 100644 +--- a/arch/arm/include/asm/scatterlist.h ++++ b/arch/arm/include/asm/scatterlist.h +@@ -24,4 +24,6 @@ struct scatterlist { + #define sg_dma_address(sg) ((sg)->dma_address) + #define sg_dma_len(sg) ((sg)->length) + ++#define ARCH_HAS_SG_CHAIN ++ + #endif /* _ASMARM_SCATTERLIST_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/iommu/0008-omap2-iommu-entries-for-Kconfig-and-Makefile.patch b/recipes/linux/linux-omap-2.6.29/isp/iommu/0008-omap2-iommu-entries-for-Kconfig-and-Makefile.patch new file mode 100644 index 0000000000..298e797c37 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/iommu/0008-omap2-iommu-entries-for-Kconfig-and-Makefile.patch @@ -0,0 +1,29 @@ +From 3c65ff4a684d3e0f4d9c59e731975408452c3743 Mon Sep 17 00:00:00 2001 +From: Hiroshi DOYU +Date: Wed, 28 Jan 2009 21:32:09 +0200 +Subject: [PATCH] omap2 iommu: entries for Kconfig and Makefile + +Signed-off-by: Hiroshi DOYU +--- + arch/arm/mach-omap2/Makefile | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile +index b44bb78..33b5aa8 100644 +--- a/arch/arm/mach-omap2/Makefile ++++ b/arch/arm/mach-omap2/Makefile +@@ -38,6 +38,11 @@ obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o + obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o + mailbox_mach-objs := mailbox.o + ++iommu-y += iommu2.o ++iommu-$(CONFIG_ARCH_OMAP3) += omap3-iommu.o ++ ++obj-$(CONFIG_OMAP_IOMMU) += $(iommu-y) ++ + # Specific board support + obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o + obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o board-h4-mmc.o +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0001-omap3isp-Add-ISP-main-driver-and-register-definitio.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0001-omap3isp-Add-ISP-main-driver-and-register-definitio.patch new file mode 100644 index 0000000000..e6e07d8afc --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0001-omap3isp-Add-ISP-main-driver-and-register-definitio.patch @@ -0,0 +1,4625 @@ +From 77c99cd863b906c803c3dec08753c19bf9b67882 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add ISP main driver and register definitions + +TODO: + +- Release resoures in isp_probe() if something fails. + +- Implement a sensible generic interface so that the ISP can offer a + v4l2_subdev (like the v4l2-int-device slaves) interface towards the + camera driver. + +- Handle CSI1 and CSI2 error cases (currently unhandled?). + +- Fix H3A / HIST interrupt enabling / disabling. + +- Clean up the private ioctls. + +- Handle SBL overflows somehow. + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/Makefile | 2 + + drivers/media/video/isp/Makefile | 12 + + drivers/media/video/isp/isp.c | 2547 ++++++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/isp.h | 318 +++++ + drivers/media/video/isp/ispreg.h | 1674 +++++++++++++++++++++++++ + 5 files changed, 4553 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/Makefile + create mode 100644 drivers/media/video/isp/isp.c + create mode 100644 drivers/media/video/isp/isp.h + create mode 100644 drivers/media/video/isp/ispreg.h + +diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile +index 72f6d03..e654270 100644 +--- a/drivers/media/video/Makefile ++++ b/drivers/media/video/Makefile +@@ -106,6 +106,8 @@ obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o + obj-$(CONFIG_VIDEO_CAFE_CCIC) += cafe_ccic.o + obj-$(CONFIG_VIDEO_OV7670) += ov7670.o + ++obj-y += isp/ ++ + obj-$(CONFIG_VIDEO_TCM825X) += tcm825x.o + + obj-$(CONFIG_USB_DABUSB) += dabusb.o +diff --git a/drivers/media/video/isp/Makefile b/drivers/media/video/isp/Makefile +new file mode 100644 +index 0000000..f14d617 +--- /dev/null ++++ b/drivers/media/video/isp/Makefile +@@ -0,0 +1,12 @@ ++# Makefile for OMAP3 ISP driver ++ ++ifdef CONFIG_ARCH_OMAP3410 ++isp-mod-objs += \ ++ isp.o ispccdc.o ++else ++isp-mod-objs += \ ++ isp.o ispccdc.o ispmmu.o \ ++ isppreview.o ispresizer.o isph3a.o isphist.o isp_af.o ispcsi2.o ++endif ++ ++obj-$(CONFIG_VIDEO_OMAP3) += isp-mod.o +diff --git a/drivers/media/video/isp/isp.c b/drivers/media/video/isp/isp.c +new file mode 100644 +index 0000000..54c839b +--- /dev/null ++++ b/drivers/media/video/isp/isp.c +@@ -0,0 +1,2547 @@ ++/* ++ * isp.c ++ * ++ * Driver Library for ISP Control module in TI's OMAP3 Camera ISP ++ * ISP interface and IRQ related APIs are defined here. ++ * ++ * Copyright (C) 2009 Texas Instruments. ++ * Copyright (C) 2009 Nokia. ++ * ++ * Contributors: ++ * Sameer Venkatraman ++ * Mohit Jalori ++ * Sergio Aguirre ++ * Sakari Ailus ++ * Tuukka Toivonen ++ * Toni Leinonen ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispmmu.h" ++#include "ispreg.h" ++#include "ispccdc.h" ++#include "isph3a.h" ++#include "isphist.h" ++#include "isp_af.h" ++#include "isppreview.h" ++#include "ispresizer.h" ++#include "ispcsi2.h" ++ ++static struct isp_device *omap3isp; ++ ++static int isp_try_size(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++static void isp_save_ctx(void); ++ ++static void isp_restore_ctx(void); ++ ++static void isp_buf_init(void); ++ ++/* List of image formats supported via OMAP ISP */ ++const static struct v4l2_fmtdesc isp_formats[] = { ++ { ++ .description = "UYVY, packed", ++ .pixelformat = V4L2_PIX_FMT_UYVY, ++ }, ++ { ++ .description = "YUYV (YUV 4:2:2), packed", ++ .pixelformat = V4L2_PIX_FMT_YUYV, ++ }, ++ { ++ .description = "Bayer10 (GrR/BGb)", ++ .pixelformat = V4L2_PIX_FMT_SGRBG10, ++ }, ++}; ++ ++/* ISP Crop capabilities */ ++static struct v4l2_rect ispcroprect; ++static struct v4l2_rect cur_rect; ++ ++/** ++ * struct vcontrol - Video control structure. ++ * @qc: V4L2 Query control structure. ++ * @current_value: Current value of the control. ++ */ ++static struct vcontrol { ++ struct v4l2_queryctrl qc; ++ int current_value; ++} video_control[] = { ++ { ++ { ++ .id = V4L2_CID_BRIGHTNESS, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Brightness", ++ .minimum = ISPPRV_BRIGHT_LOW, ++ .maximum = ISPPRV_BRIGHT_HIGH, ++ .step = ISPPRV_BRIGHT_STEP, ++ .default_value = ISPPRV_BRIGHT_DEF, ++ }, ++ .current_value = ISPPRV_BRIGHT_DEF, ++ }, ++ { ++ { ++ .id = V4L2_CID_CONTRAST, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Contrast", ++ .minimum = ISPPRV_CONTRAST_LOW, ++ .maximum = ISPPRV_CONTRAST_HIGH, ++ .step = ISPPRV_CONTRAST_STEP, ++ .default_value = ISPPRV_CONTRAST_DEF, ++ }, ++ .current_value = ISPPRV_CONTRAST_DEF, ++ }, ++ { ++ { ++ .id = V4L2_CID_COLORFX, ++ .type = V4L2_CTRL_TYPE_MENU, ++ .name = "Color Effects", ++ .minimum = V4L2_COLORFX_NONE, ++ .maximum = V4L2_COLORFX_SEPIA, ++ .step = 1, ++ .default_value = V4L2_COLORFX_NONE, ++ }, ++ .current_value = V4L2_COLORFX_NONE, ++ } ++}; ++ ++static struct v4l2_querymenu video_menu[] = { ++ { ++ .id = V4L2_CID_COLORFX, ++ .index = 0, ++ .name = "None", ++ }, ++ { ++ .id = V4L2_CID_COLORFX, ++ .index = 1, ++ .name = "B&W", ++ }, ++ { ++ .id = V4L2_CID_COLORFX, ++ .index = 2, ++ .name = "Sepia", ++ }, ++}; ++ ++struct isp_buf { ++ dma_addr_t isp_addr; ++ void (*complete)(struct videobuf_buffer *vb, void *priv); ++ struct videobuf_buffer *vb; ++ void *priv; ++ u32 vb_state; ++}; ++ ++#define ISP_BUFS_IS_FULL(bufs) \ ++ (((bufs)->queue + 1) % NUM_BUFS == (bufs)->done) ++#define ISP_BUFS_IS_EMPTY(bufs) ((bufs)->queue == (bufs)->done) ++#define ISP_BUFS_IS_LAST(bufs) \ ++ ((bufs)->queue == ((bufs)->done + 1) % NUM_BUFS) ++#define ISP_BUFS_QUEUED(bufs) \ ++ ((((bufs)->done - (bufs)->queue + NUM_BUFS)) % NUM_BUFS) ++#define ISP_BUF_DONE(bufs) ((bufs)->buf + (bufs)->done) ++#define ISP_BUF_NEXT_DONE(bufs) \ ++ ((bufs)->buf + ((bufs)->done + 1) % NUM_BUFS) ++#define ISP_BUF_QUEUE(bufs) ((bufs)->buf + (bufs)->queue) ++#define ISP_BUF_MARK_DONE(bufs) \ ++ (bufs)->done = ((bufs)->done + 1) % NUM_BUFS; ++#define ISP_BUF_MARK_QUEUED(bufs) \ ++ (bufs)->queue = ((bufs)->queue + 1) % NUM_BUFS; ++ ++struct isp_bufs { ++ dma_addr_t isp_addr_capture[VIDEO_MAX_FRAME]; ++ spinlock_t lock; /* For handling current buffer */ ++ /* queue full: (ispsg.queue + 1) % NUM_BUFS == ispsg.done ++ queue empty: ispsg.queue == ispsg.done */ ++ struct isp_buf buf[NUM_BUFS]; ++ /* Next slot to queue a buffer. */ ++ int queue; ++ /* Buffer that is being processed. */ ++ int done; ++ /* Wait for this many hs_vs before anything else. */ ++ int wait_hs_vs; ++}; ++ ++/** ++ * struct ispirq - Structure for containing callbacks to be called in ISP ISR. ++ * @isp_callbk: Array which stores callback functions, indexed by the type of ++ * callback (8 possible types). ++ * @isp_callbk_arg1: Pointer to array containing pointers to the first argument ++ * to be passed to the requested callback function. ++ * @isp_callbk_arg2: Pointer to array containing pointers to the second ++ * argument to be passed to the requested callback function. ++ * ++ * This structure is used to contain all the callback functions related for ++ * each callback type (CBK_CCDC_VD0, CBK_CCDC_VD1, CBK_PREV_DONE, ++ * CBK_RESZ_DONE, CBK_MMU_ERR, CBK_H3A_AWB_DONE, CBK_HIST_DONE, CBK_HS_VS, ++ * CBK_LSC_ISR). ++ */ ++struct isp_irq { ++ isp_callback_t isp_callbk[CBK_END]; ++ isp_vbq_callback_ptr isp_callbk_arg1[CBK_END]; ++ void *isp_callbk_arg2[CBK_END]; ++}; ++ ++/** ++ * struct ispmodule - Structure for storing ISP sub-module information. ++ * @isp_pipeline: Bit mask for submodules enabled within the ISP. ++ * @applyCrop: Flag to do a crop operation when video buffer queue ISR is done ++ * @pix: Structure containing the format and layout of the output image. ++ * @ccdc_input_width: ISP CCDC module input image width. ++ * @ccdc_input_height: ISP CCDC module input image height. ++ * @ccdc_output_width: ISP CCDC module output image width. ++ * @ccdc_output_height: ISP CCDC module output image height. ++ * @preview_input_width: ISP Preview module input image width. ++ * @preview_input_height: ISP Preview module input image height. ++ * @preview_output_width: ISP Preview module output image width. ++ * @preview_output_height: ISP Preview module output image height. ++ * @resizer_input_width: ISP Resizer module input image width. ++ * @resizer_input_height: ISP Resizer module input image height. ++ * @resizer_output_width: ISP Resizer module output image width. ++ * @resizer_output_height: ISP Resizer module output image height. ++ */ ++struct isp_module { ++ unsigned int isp_pipeline; ++ int applyCrop; ++ struct v4l2_pix_format pix; ++ unsigned int ccdc_input_width; ++ unsigned int ccdc_input_height; ++ unsigned int ccdc_output_width; ++ unsigned int ccdc_output_height; ++ unsigned int preview_input_width; ++ unsigned int preview_input_height; ++ unsigned int preview_output_width; ++ unsigned int preview_output_height; ++ unsigned int resizer_input_width; ++ unsigned int resizer_input_height; ++ unsigned int resizer_output_width; ++ unsigned int resizer_output_height; ++}; ++ ++#define RAW_CAPTURE(isp) \ ++ (!((isp)->module.isp_pipeline & OMAP_ISP_PREVIEW)) ++ ++/** ++ * struct isp - Structure for storing ISP Control module information ++ * @lock: Spinlock to sync between isr and processes. ++ * @isp_mutex: Semaphore used to get access to the ISP. ++ * @ref_count: Reference counter. ++ * @cam_ick: Pointer to ISP Interface clock. ++ * @cam_fck: Pointer to ISP Functional clock. ++ * ++ * This structure is used to store the OMAP ISP Control Information. ++ */ ++static struct isp { ++ spinlock_t lock; /* For handling registered ISP callbacks */ ++ struct mutex isp_mutex; /* For handling ref_count field */ ++ int ref_count; ++ struct clk *cam_ick; ++ struct clk *cam_mclk; ++ struct clk *csi2_fck; ++ struct isp_interface_config *config; ++ dma_addr_t tmp_buf; ++ size_t tmp_buf_size; ++ unsigned long tmp_buf_offset; ++ struct isp_bufs bufs; ++ struct isp_irq irq; ++ struct isp_module module; ++} isp_obj; ++ ++/* Structure for saving/restoring ISP module registers */ ++static struct isp_reg isp_reg_list[] = { ++ {OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_GRESET_LENGTH, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_PSTRB_REPLAY, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_FRAME, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_PSTRB_DELAY, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_STRB_DELAY, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_SHUT_DELAY, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_PSTRB_LENGTH, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_STRB_LENGTH, 0}, ++ {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_SHUT_LENGTH, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF_SYSCONFIG, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF_IRQENABLE, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF0_CTRL, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF1_CTRL, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF0_START, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF1_START, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF0_END, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF1_END, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF0_WINDOWSIZE, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF1_WINDOWSIZE, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF0_THRESHOLD, 0}, ++ {OMAP3_ISP_IOMEM_CBUFF, ISP_CBUFF1_THRESHOLD, 0}, ++ {0, ISP_TOK_TERM, 0} ++}; ++ ++u32 isp_reg_readl(enum isp_mem_resources isp_mmio_range, u32 reg_offset) ++{ ++ return __raw_readl(omap3isp->mmio_base[isp_mmio_range] + reg_offset); ++} ++EXPORT_SYMBOL(isp_reg_readl); ++ ++void isp_reg_writel(u32 reg_value, enum isp_mem_resources isp_mmio_range, ++ u32 reg_offset) ++{ ++ __raw_writel(reg_value, ++ omap3isp->mmio_base[isp_mmio_range] + reg_offset); ++} ++EXPORT_SYMBOL(isp_reg_writel); ++ ++/* ++ * ++ * V4L2 Handling ++ * ++ */ ++ ++/** ++ * find_vctrl - Returns the index of the ctrl array of the requested ctrl ID. ++ * @id: Requested control ID. ++ * ++ * Returns 0 if successful, -EINVAL if not found, or -EDOM if its out of ++ * domain. ++ **/ ++static int find_vctrl(int id) ++{ ++ int i; ++ ++ if (id < V4L2_CID_BASE) ++ return -EDOM; ++ ++ for (i = (ARRAY_SIZE(video_control) - 1); i >= 0; i--) ++ if (video_control[i].qc.id == id) ++ break; ++ ++ if (i < 0) ++ i = -EINVAL; ++ ++ return i; ++} ++ ++static int find_next_vctrl(int id) ++{ ++ int i; ++ u32 best = (u32)-1; ++ ++ for (i = 0; i < ARRAY_SIZE(video_control); i++) { ++ if (video_control[i].qc.id > id && ++ (best == (u32)-1 || ++ video_control[i].qc.id < ++ video_control[best].qc.id)) { ++ best = i; ++ } ++ } ++ ++ if (best == (u32)-1) ++ return -EINVAL; ++ ++ return best; ++} ++ ++/** ++ * find_vmenu - Returns index of the menu array of the requested ctrl option. ++ * @id: Requested control ID. ++ * @index: Requested menu option index. ++ * ++ * Returns 0 if successful, -EINVAL if not found, or -EDOM if its out of ++ * domain. ++ **/ ++static int find_vmenu(int id, int index) ++{ ++ int i; ++ ++ if (id < V4L2_CID_BASE) ++ return -EDOM; ++ ++ for (i = (ARRAY_SIZE(video_menu) - 1); i >= 0; i--) { ++ if (video_menu[i].id != id || video_menu[i].index != index) ++ continue; ++ return i; ++ } ++ ++ return -EINVAL; ++} ++ ++/** ++ * isp_release_resources - Free ISP submodules ++ **/ ++static void isp_release_resources(void) ++{ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_CCDC) ++ ispccdc_free(); ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_PREVIEW) ++ isppreview_free(); ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_RESIZER) ++ ispresizer_free(); ++ return; ++} ++ ++static int isp_wait(int (*busy)(void), int wait_for_busy, int max_wait) ++{ ++ int wait = 0; ++ ++ if (max_wait == 0) ++ max_wait = 10000; /* 10 ms */ ++ ++ while ((wait_for_busy && !busy()) ++ || (!wait_for_busy && busy())) { ++ rmb(); ++ udelay(1); ++ wait++; ++ if (wait > max_wait) { ++ printk(KERN_ALERT "%s: wait is too much\n", __func__); ++ return -EBUSY; ++ } ++ } ++ DPRINTK_ISPCTRL(KERN_ALERT "%s: wait %d\n", __func__, wait); ++ ++ return 0; ++} ++ ++static int ispccdc_sbl_wait_idle(int max_wait) ++{ ++ return isp_wait(ispccdc_sbl_busy, 0, max_wait); ++} ++ ++static void isp_enable_interrupts(int is_raw) ++{ ++ isp_reg_writel(-1, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ | ++ IRQ0ENABLE_HS_VS_IRQ | ++ IRQ0ENABLE_CCDC_VD0_IRQ | ++ IRQ0ENABLE_CCDC_VD1_IRQ); ++ ++ if (is_raw) ++ return; ++ ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_PRV_DONE_IRQ | ++ IRQ0ENABLE_RSZ_DONE_IRQ); ++ ++ return; ++} ++ ++static void isp_disable_interrupts(void) ++{ ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~(IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ | ++ IRQ0ENABLE_HS_VS_IRQ | ++ IRQ0ENABLE_CCDC_VD0_IRQ | ++ IRQ0ENABLE_CCDC_VD1_IRQ | ++ IRQ0ENABLE_PRV_DONE_IRQ | ++ IRQ0ENABLE_RSZ_DONE_IRQ)); ++} ++ ++/** ++ * isp_set_callback - Sets the callback for the ISP module done events. ++ * @type: Type of the event for which callback is requested. ++ * @callback: Method to be called as callback in the ISR context. ++ * @arg1: First argument to be passed when callback is called in ISR. ++ * @arg2: Second argument to be passed when callback is called in ISR. ++ * ++ * This function sets a callback function for a done event in the ISP ++ * module, and enables the corresponding interrupt. ++ **/ ++int isp_set_callback(enum isp_callback_type type, isp_callback_t callback, ++ isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ unsigned long irqflags = 0; ++ ++ if (callback == NULL) { ++ DPRINTK_ISPCTRL("ISP_ERR : Null Callback\n"); ++ return -EINVAL; ++ } ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ isp_obj.irq.isp_callbk[type] = callback; ++ isp_obj.irq.isp_callbk_arg1[type] = arg1; ++ isp_obj.irq.isp_callbk_arg2[type] = arg2; ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++ switch (type) { ++ case CBK_H3A_AWB_DONE: ++ isp_reg_writel(IRQ0ENABLE_H3A_AWB_DONE_IRQ, ++ OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_H3A_AWB_DONE_IRQ); ++ break; ++ case CBK_H3A_AF_DONE: ++ isp_reg_writel(IRQ0ENABLE_H3A_AF_DONE_IRQ, ++ OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_H3A_AF_DONE_IRQ); ++ break; ++ case CBK_HIST_DONE: ++ isp_reg_writel(IRQ0ENABLE_HIST_DONE_IRQ, ++ OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_HIST_DONE_IRQ); ++ break; ++ case CBK_PREV_DONE: ++ isp_reg_writel(IRQ0ENABLE_PRV_DONE_IRQ, ++ OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_PRV_DONE_IRQ); ++ break; ++ default: ++ break; ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_set_callback); ++ ++/** ++ * isp_unset_callback - Clears the callback for the ISP module done events. ++ * @type: Type of the event for which callback to be cleared. ++ * ++ * This function clears a callback function for a done event in the ISP ++ * module, and disables the corresponding interrupt. ++ **/ ++int isp_unset_callback(enum isp_callback_type type) ++{ ++ unsigned long irqflags = 0; ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ isp_obj.irq.isp_callbk[type] = NULL; ++ isp_obj.irq.isp_callbk_arg1[type] = NULL; ++ isp_obj.irq.isp_callbk_arg2[type] = NULL; ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++ switch (type) { ++ case CBK_H3A_AWB_DONE: ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~IRQ0ENABLE_H3A_AWB_DONE_IRQ); ++ break; ++ case CBK_H3A_AF_DONE: ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~IRQ0ENABLE_H3A_AF_DONE_IRQ); ++ break; ++ case CBK_HIST_DONE: ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~IRQ0ENABLE_HIST_DONE_IRQ); ++ break; ++ case CBK_CSIA: ++ isp_csi2_irq_set(0); ++ break; ++ case CBK_CSIB: ++ isp_reg_writel(IRQ0ENABLE_CSIB_IRQ, OMAP3_ISP_IOMEM_MAIN, ++ ISP_IRQ0STATUS); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ IRQ0ENABLE_CSIB_IRQ); ++ break; ++ case CBK_PREV_DONE: ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~IRQ0ENABLE_PRV_DONE_IRQ); ++ break; ++ default: ++ break; ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_unset_callback); ++ ++/** ++ * isp_set_xclk - Configures the specified cam_xclk to the desired frequency. ++ * @xclk: Desired frequency of the clock in Hz. ++ * @xclksel: XCLK to configure (0 = A, 1 = B). ++ * ++ * Configures the specified MCLK divisor in the ISP timing control register ++ * (TCTRL_CTRL) to generate the desired xclk clock value. ++ * ++ * Divisor = CM_CAM_MCLK_HZ / xclk ++ * ++ * Returns the final frequency that is actually being generated ++ **/ ++u32 isp_set_xclk(u32 xclk, u8 xclksel) ++{ ++ u32 divisor; ++ u32 currentxclk; ++ ++ if (xclk >= CM_CAM_MCLK_HZ) { ++ divisor = ISPTCTRL_CTRL_DIV_BYPASS; ++ currentxclk = CM_CAM_MCLK_HZ; ++ } else if (xclk >= 2) { ++ divisor = CM_CAM_MCLK_HZ / xclk; ++ if (divisor >= ISPTCTRL_CTRL_DIV_BYPASS) ++ divisor = ISPTCTRL_CTRL_DIV_BYPASS - 1; ++ currentxclk = CM_CAM_MCLK_HZ / divisor; ++ } else { ++ divisor = xclk; ++ currentxclk = 0; ++ } ++ ++ switch (xclksel) { ++ case 0: ++ isp_reg_and_or(OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, ++ ~ISPTCTRL_CTRL_DIVA_MASK, ++ divisor << ISPTCTRL_CTRL_DIVA_SHIFT); ++ DPRINTK_ISPCTRL("isp_set_xclk(): cam_xclka set to %d Hz\n", ++ currentxclk); ++ break; ++ case 1: ++ isp_reg_and_or(OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, ++ ~ISPTCTRL_CTRL_DIVB_MASK, ++ divisor << ISPTCTRL_CTRL_DIVB_SHIFT); ++ DPRINTK_ISPCTRL("isp_set_xclk(): cam_xclkb set to %d Hz\n", ++ currentxclk); ++ break; ++ default: ++ DPRINTK_ISPCTRL("ISP_ERR: isp_set_xclk(): Invalid requested " ++ "xclk. Must be 0 (A) or 1 (B)." ++ "\n"); ++ return -EINVAL; ++ } ++ ++ return currentxclk; ++} ++EXPORT_SYMBOL(isp_set_xclk); ++ ++/** ++ * isp_power_settings - Sysconfig settings, for Power Management. ++ * @isp_sysconfig: Structure containing the power settings for ISP to configure ++ * ++ * Sets the power settings for the ISP, and SBL bus. ++ **/ ++static void isp_power_settings(int idle) ++{ ++ if (idle) { ++ isp_reg_writel(ISP_SYSCONFIG_AUTOIDLE | ++ (ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY << ++ ISP_SYSCONFIG_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_MAIN, ++ ISP_SYSCONFIG); ++ if (omap_rev() == OMAP3430_REV_ES1_0) { ++ isp_reg_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIDLEMODE_SMARTSTANDBY << ++ ISPCSI1_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_CSI2A, ++ ISP_CSIA_SYSCONFIG); ++ isp_reg_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIDLEMODE_SMARTSTANDBY << ++ ISPCSI1_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_CCP2, ++ ISP_CSIB_SYSCONFIG); ++ } ++ isp_reg_writel(ISPCTRL_SBL_AUTOIDLE, OMAP3_ISP_IOMEM_MAIN, ++ ISP_CTRL); ++ ++ } else { ++ isp_reg_writel(ISP_SYSCONFIG_AUTOIDLE | ++ (ISP_SYSCONFIG_MIDLEMODE_FORCESTANDBY << ++ ISP_SYSCONFIG_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_MAIN, ++ ISP_SYSCONFIG); ++ if (omap_rev() == OMAP3430_REV_ES1_0) { ++ isp_reg_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIDLEMODE_FORCESTANDBY << ++ ISPCSI1_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_CSI2A, ++ ISP_CSIA_SYSCONFIG); ++ ++ isp_reg_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIDLEMODE_FORCESTANDBY << ++ ISPCSI1_MIDLEMODE_SHIFT), ++ OMAP3_ISP_IOMEM_CCP2, ++ ISP_CSIB_SYSCONFIG); ++ } ++ ++ isp_reg_writel(ISPCTRL_SBL_AUTOIDLE, OMAP3_ISP_IOMEM_MAIN, ++ ISP_CTRL); ++ } ++} ++ ++#define BIT_SET(var, shift, mask, val) \ ++ do { \ ++ var = (var & ~(mask << shift)) \ ++ | (val << shift); \ ++ } while (0) ++ ++static int isp_init_csi(struct isp_interface_config *config) ++{ ++ u32 i = 0, val, reg; ++ int format; ++ ++ switch (config->u.csi.format) { ++ case V4L2_PIX_FMT_SGRBG10: ++ format = 0x16; /* RAW10+VP */ ++ break; ++ case V4L2_PIX_FMT_SGRBG10DPCM8: ++ format = 0x12; /* RAW8+DPCM10+VP */ ++ break; ++ default: ++ printk(KERN_ERR "isp_init_csi: bad csi format\n"); ++ return -EINVAL; ++ } ++ ++ /* Reset the CSI and wait for reset to complete */ ++ isp_reg_writel(isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_SYSCONFIG) | ++ BIT(1), ++ OMAP3_ISP_IOMEM_CCP2, ++ ISPCSI1_SYSCONFIG); ++ while (!(isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_SYSSTATUS) & ++ BIT(0))) { ++ udelay(10); ++ if (i++ > 10) ++ break; ++ } ++ if (!(isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_SYSSTATUS) & ++ BIT(0))) { ++ printk(KERN_WARNING ++ "omap3_isp: timeout waiting for csi reset\n"); ++ } ++ ++ /* ISPCSI1_CTRL */ ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_CTRL); ++ val &= ~BIT(11); /* Enable VP only off -> ++ extract embedded data to interconnect */ ++ BIT_SET(val, 8, 0x3, config->u.csi.vpclk); /* Video port clock */ ++/* val |= BIT(3); */ /* Wait for FEC before disabling interface */ ++ val |= BIT(2); /* I/O cell output is parallel ++ (no effect, but errata says should be enabled ++ for class 1/2) */ ++ val |= BIT(12); /* VP clock polarity to falling edge ++ (needed or bad picture!) */ ++ ++ /* Data/strobe physical layer */ ++ BIT_SET(val, 1, 1, config->u.csi.signalling); ++ BIT_SET(val, 10, 1, config->u.csi.strobe_clock_inv); ++ val |= BIT(4); /* Magic bit to enable CSI1 and strobe mode */ ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_CCP2, ISPCSI1_CTRL); ++ ++ /* ISPCSI1_LCx_CTRL logical channel #0 */ ++ reg = ISPCSI1_LCx_CTRL(0); /* reg = ISPCSI1_CTRL1; */ ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, reg); ++ /* Format = RAW10+VP or RAW8+DPCM10+VP*/ ++ BIT_SET(val, 3, 0x1f, format); ++ /* Enable setting of frame regions of interest */ ++ BIT_SET(val, 1, 1, 1); ++ BIT_SET(val, 2, 1, config->u.csi.crc); ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_CCP2, reg); ++ ++ /* ISPCSI1_DAT_START for logical channel #0 */ ++ reg = ISPCSI1_LCx_DAT_START(0); /* reg = ISPCSI1_DAT_START; */ ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, reg); ++ BIT_SET(val, 16, 0xfff, config->u.csi.data_start); ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_CCP2, reg); ++ ++ /* ISPCSI1_DAT_SIZE for logical channel #0 */ ++ reg = ISPCSI1_LCx_DAT_SIZE(0); /* reg = ISPCSI1_DAT_SIZE; */ ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, reg); ++ BIT_SET(val, 16, 0xfff, config->u.csi.data_size); ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_CCP2, reg); ++ ++ /* Clear status bits for logical channel #0 */ ++ isp_reg_writel(0xFFF & ~BIT(6), OMAP3_ISP_IOMEM_CCP2, ++ ISPCSI1_LC01_IRQSTATUS); ++ ++ /* Enable CSI1 */ ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_CTRL); ++ val |= BIT(0) | BIT(4); ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_CCP2, ISPCSI1_CTRL); ++ ++ if (!(isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ISPCSI1_CTRL) & BIT(4))) { ++ printk(KERN_WARNING "OMAP3 CSI1 bus not available\n"); ++ if (config->u.csi.signalling) /* Strobe mode requires CSI1 */ ++ return -EIO; ++ } ++ ++ return 0; ++} ++ ++/** ++ * isp_configure_interface - Configures ISP Control I/F related parameters. ++ * @config: Pointer to structure containing the desired configuration for the ++ * ISP. ++ * ++ * Configures ISP control register (ISP_CTRL) with the values specified inside ++ * the config structure. Controls: ++ * - Selection of parallel or serial input to the preview hardware. ++ * - Data lane shifter. ++ * - Pixel clock polarity. ++ * - 8 to 16-bit bridge at the input of CCDC module. ++ * - HS or VS synchronization signal detection ++ **/ ++int isp_configure_interface(struct isp_interface_config *config) ++{ ++ u32 ispctrl_val = isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); ++ int r; ++ ++ isp_obj.config = config; ++ ++ ispctrl_val &= ISPCTRL_SHIFT_MASK; ++ ispctrl_val |= config->dataline_shift << ISPCTRL_SHIFT_SHIFT; ++ ispctrl_val &= ~ISPCTRL_PAR_CLK_POL_INV; ++ ++ ispctrl_val &= ISPCTRL_PAR_SER_CLK_SEL_MASK; ++ ++ isp_buf_init(); ++ ++ switch (config->ccdc_par_ser) { ++ case ISP_PARLL: ++ ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL; ++ ispctrl_val |= config->u.par.par_clk_pol ++ << ISPCTRL_PAR_CLK_POL_SHIFT; ++ ispctrl_val &= ~ISPCTRL_PAR_BRIDGE_BENDIAN; ++ ispctrl_val |= config->u.par.par_bridge ++ << ISPCTRL_PAR_BRIDGE_SHIFT; ++ break; ++ case ISP_CSIA: ++ ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIA; ++ ispctrl_val &= ~ISPCTRL_PAR_BRIDGE_BENDIAN; ++ ++ isp_csi2_ctx_config_format(0, config->u.csi.format); ++ isp_csi2_ctx_update(0, false); ++ ++ if (config->u.csi.crc) ++ isp_csi2_ctrl_config_ecc_enable(true); ++ ++ isp_csi2_ctrl_config_vp_out_ctrl(config->u.csi.vpclk); ++ isp_csi2_ctrl_config_vp_only_enable(true); ++ isp_csi2_ctrl_config_vp_clk_enable(true); ++ isp_csi2_ctrl_update(false); ++ ++ isp_csi2_irq_complexio1_set(1); ++ isp_csi2_irq_status_set(1); ++ isp_csi2_irq_set(1); ++ ++ isp_csi2_enable(1); ++ mdelay(3); ++ break; ++ case ISP_CSIB: ++ ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIB; ++ r = isp_init_csi(config); ++ if (r) ++ return r; ++ break; ++ case ISP_NONE: ++ return 0; ++ default: ++ return -EINVAL; ++ } ++ ++ ispctrl_val &= ~ISPCTRL_SYNC_DETECT_VSRISE; ++ ispctrl_val |= config->hsvs_syncdetect; ++ ++ isp_reg_writel(ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); ++ ++ /* Set sensor specific fields in CCDC and Previewer module.*/ ++ isppreview_set_skip(config->prev_sph, config->prev_slv); ++ ispccdc_set_wenlog(config->wenlog); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_configure_interface); ++ ++static int isp_buf_process(struct isp_bufs *bufs); ++ ++/** ++ * omap34xx_isp_isr - Interrupt Service Routine for Camera ISP module. ++ * @irq: Not used currently. ++ * @ispirq_disp: Pointer to the object that is passed while request_irq is ++ * called. This is the isp_obj.irq object containing info on the ++ * callback. ++ * ++ * Handles the corresponding callback if plugged in. ++ * ++ * Returns IRQ_HANDLED when IRQ was correctly handled, or IRQ_NONE when the ++ * IRQ wasn't handled. ++ **/ ++static irqreturn_t omap34xx_isp_isr(int irq, void *_isp) ++{ ++ struct isp *isp = _isp; ++ struct isp_irq *irqdis = &isp->irq; ++ struct isp_bufs *bufs = &isp->bufs; ++ unsigned long flags; ++ u32 irqstatus = 0; ++ unsigned long irqflags = 0; ++ int wait_hs_vs = 0; ++ ++ irqstatus = isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ isp_reg_writel(irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS); ++ ++ spin_lock_irqsave(&bufs->lock, flags); ++ wait_hs_vs = bufs->wait_hs_vs; ++ if (irqstatus & HS_VS && bufs->wait_hs_vs) ++ bufs->wait_hs_vs--; ++ spin_unlock_irqrestore(&bufs->lock, flags); ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ /* ++ * We need to wait for the first HS_VS interrupt from CCDC. ++ * Otherwise our frame (and everything else) might be bad. ++ */ ++ if (wait_hs_vs) ++ goto out_ignore_buff; ++ ++ if (irqstatus & CCDC_VD0) { ++ if (RAW_CAPTURE(&isp_obj)) ++ isp_buf_process(bufs); ++ if (!ispccdc_busy()) ++ ispccdc_config_shadow_registers(); ++ } ++ ++ if (irqstatus & PREV_DONE) { ++ if (irqdis->isp_callbk[CBK_PREV_DONE]) ++ irqdis->isp_callbk[CBK_PREV_DONE]( ++ PREV_DONE, ++ irqdis->isp_callbk_arg1[CBK_PREV_DONE], ++ irqdis->isp_callbk_arg2[CBK_PREV_DONE]); ++ else if (!RAW_CAPTURE(&isp_obj) && !ispresizer_busy()) { ++ if (isp_obj.module.applyCrop) { ++ ispresizer_applycrop(); ++ if (!ispresizer_busy()) ++ isp_obj.module.applyCrop = 0; ++ } ++ if (!isppreview_busy()) { ++ ispresizer_enable(1); ++ if (isppreview_busy()) { ++ /* FIXME: locking! */ ++ ISP_BUF_DONE(bufs)->vb_state = ++ VIDEOBUF_ERROR; ++ printk(KERN_ERR "%s: can't stop" ++ " preview\n", __func__); ++ } ++ } ++ if (!isppreview_busy()) ++ isppreview_config_shadow_registers(); ++ if (!isppreview_busy()) ++ isph3a_update_wb(); ++ } ++ } ++ ++ if (irqstatus & RESZ_DONE) { ++ if (!RAW_CAPTURE(&isp_obj)) { ++ if (!ispresizer_busy()) ++ ispresizer_config_shadow_registers(); ++ isp_buf_process(bufs); ++ } ++ } ++ ++ if (irqstatus & H3A_AWB_DONE) { ++ if (irqdis->isp_callbk[CBK_H3A_AWB_DONE]) ++ irqdis->isp_callbk[CBK_H3A_AWB_DONE]( ++ H3A_AWB_DONE, ++ irqdis->isp_callbk_arg1[CBK_H3A_AWB_DONE], ++ irqdis->isp_callbk_arg2[CBK_H3A_AWB_DONE]); ++ } ++ ++ if (irqstatus & HIST_DONE) { ++ if (irqdis->isp_callbk[CBK_HIST_DONE]) ++ irqdis->isp_callbk[CBK_HIST_DONE]( ++ HIST_DONE, ++ irqdis->isp_callbk_arg1[CBK_HIST_DONE], ++ irqdis->isp_callbk_arg2[CBK_HIST_DONE]); ++ } ++ ++ if (irqstatus & H3A_AF_DONE) { ++ if (irqdis->isp_callbk[CBK_H3A_AF_DONE]) ++ irqdis->isp_callbk[CBK_H3A_AF_DONE]( ++ H3A_AF_DONE, ++ irqdis->isp_callbk_arg1[CBK_H3A_AF_DONE], ++ irqdis->isp_callbk_arg2[CBK_H3A_AF_DONE]); ++ } ++ ++ ++out_ignore_buff: ++ if (irqstatus & LSC_PRE_ERR) { ++ struct isp_buf *buf = ISP_BUF_DONE(bufs); ++ /* Mark buffer faulty. */ ++ buf->vb_state = VIDEOBUF_ERROR; ++ ispccdc_lsc_error_handler(); ++ printk(KERN_ERR "%s: lsc prefetch error\n", __func__); ++ } ++ ++ if (irqstatus & CSIA) { ++ struct isp_buf *buf = ISP_BUF_DONE(bufs); ++ isp_csi2_isr(); ++ buf->vb_state = VIDEOBUF_ERROR; ++ } ++ ++ if (irqstatus & IRQ0STATUS_CSIB_IRQ) { ++ u32 ispcsi1_irqstatus; ++ ++ ispcsi1_irqstatus = isp_reg_readl(OMAP3_ISP_IOMEM_CCP2, ++ ISPCSI1_LC01_IRQSTATUS); ++ DPRINTK_ISPCTRL("%x\n", ispcsi1_irqstatus); ++ } ++ ++ if (irqdis->isp_callbk[CBK_CATCHALL]) { ++ irqdis->isp_callbk[CBK_CATCHALL]( ++ irqstatus, ++ irqdis->isp_callbk_arg1[CBK_CATCHALL], ++ irqdis->isp_callbk_arg2[CBK_CATCHALL]); ++ } ++ ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++#if 1 ++ { ++ static const struct { ++ int num; ++ char *name; ++ } bits[] = { ++ { 31, "HS_VS_IRQ" }, ++ { 30, "SEC_ERR_IRQ" }, ++ { 29, "OCP_ERR_IRQ" }, ++ { 28, "MMU_ERR_IRQ" }, ++ { 27, "res27" }, ++ { 26, "res26" }, ++ { 25, "OVF_IRQ" }, ++ { 24, "RSZ_DONE_IRQ" }, ++ { 23, "res23" }, ++ { 22, "res22" }, ++ { 21, "CBUFF_IRQ" }, ++ { 20, "PRV_DONE_IRQ" }, ++ { 19, "CCDC_LSC_PREFETCH_ERROR" }, ++ { 18, "CCDC_LSC_PREFETCH_COMPLETED" }, ++ { 17, "CCDC_LSC_DONE" }, ++ { 16, "HIST_DONE_IRQ" }, ++ { 15, "res15" }, ++ { 14, "res14" }, ++ { 13, "H3A_AWB_DONE_IRQ" }, ++ { 12, "H3A_AF_DONE_IRQ" }, ++ { 11, "CCDC_ERR_IRQ" }, ++ { 10, "CCDC_VD2_IRQ" }, ++ { 9, "CCDC_VD1_IRQ" }, ++ { 8, "CCDC_VD0_IRQ" }, ++ { 7, "res7" }, ++ { 6, "res6" }, ++ { 5, "res5" }, ++ { 4, "CSIB_IRQ" }, ++ { 3, "CSIB_LCM_IRQ" }, ++ { 2, "res2" }, ++ { 1, "res1" }, ++ { 0, "CSIA_IRQ" }, ++ }; ++ int i; ++ for (i = 0; i < ARRAY_SIZE(bits); i++) { ++ if ((1 << bits[i].num) & irqstatus) ++ DPRINTK_ISPCTRL("%s ", bits[i].name); ++ } ++ DPRINTK_ISPCTRL("\n"); ++ } ++#endif ++ ++ return IRQ_HANDLED; ++} ++ ++/* Device name, needed for resource tracking layer */ ++struct device_driver camera_drv = { ++ .name = "camera" ++}; ++ ++struct device camera_dev = { ++ .driver = &camera_drv, ++}; ++ ++/** ++ * isp_tmp_buf_free - To free allocated 10MB memory ++ * ++ **/ ++static void isp_tmp_buf_free(void) ++{ ++ if (isp_obj.tmp_buf) { ++ ispmmu_vfree(isp_obj.tmp_buf); ++ isp_obj.tmp_buf = 0; ++ isp_obj.tmp_buf_size = 0; ++ } ++} ++ ++/** ++ * isp_tmp_buf_alloc - To allocate a 10MB memory ++ * ++ **/ ++static u32 isp_tmp_buf_alloc(size_t size) ++{ ++ isp_tmp_buf_free(); ++ ++ printk(KERN_INFO "%s: allocating %d bytes\n", __func__, size); ++ ++ isp_obj.tmp_buf = ispmmu_vmalloc(size); ++ if (IS_ERR((void *)isp_obj.tmp_buf)) { ++ printk(KERN_ERR "ispmmu_vmap mapping failed "); ++ return -ENOMEM; ++ } ++ isp_obj.tmp_buf_size = size; ++ ++ isppreview_set_outaddr(isp_obj.tmp_buf); ++ ispresizer_set_inaddr(isp_obj.tmp_buf); ++ ++ return 0; ++} ++ ++/** ++ * isp_start - Starts ISP submodule ++ * ++ * Start the needed isp components assuming these components ++ * are configured correctly. ++ **/ ++void isp_start(void) ++{ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_PREVIEW ++ && is_isppreview_enabled()) ++ isppreview_enable(1); ++ ++ return; ++} ++EXPORT_SYMBOL(isp_start); ++ ++#define ISP_STATISTICS_BUSY \ ++ () ++#define ISP_STOP_TIMEOUT msecs_to_jiffies(1000) ++static int __isp_disable_modules(int suspend) ++{ ++ unsigned long timeout = jiffies + ISP_STOP_TIMEOUT; ++ int reset = 0; ++ ++ /* ++ * We need to stop all the modules after CCDC first or they'll ++ * never stop since they may not get a full frame from CCDC. ++ */ ++ if (suspend) { ++ isp_af_suspend(); ++ isph3a_aewb_suspend(); ++ isp_hist_suspend(); ++ isppreview_suspend(); ++ ispresizer_suspend(); ++ } else { ++ isp_af_enable(0); ++ isph3a_aewb_enable(0); ++ isp_hist_enable(0); ++ isppreview_enable(0); ++ ispresizer_enable(0); ++ } ++ ++ timeout = jiffies + ISP_STOP_TIMEOUT; ++ while (isp_af_busy() ++ || isph3a_aewb_busy() ++ || isp_hist_busy() ++ || isppreview_busy() ++ || ispresizer_busy()) { ++ if (time_after(jiffies, timeout)) { ++ printk(KERN_ERR "%s: can't stop non-ccdc modules\n", ++ __func__); ++ reset = 1; ++ break; ++ } ++ msleep(1); ++ } ++ ++ /* Let's stop CCDC now. */ ++ if (suspend) ++ /* This function supends lsc too */ ++ ispccdc_suspend(); ++ else { ++ ispccdc_enable_lsc(0); ++ ispccdc_enable(0); ++ } ++ ++ timeout = jiffies + ISP_STOP_TIMEOUT; ++ while (ispccdc_busy()) { ++ if (time_after(jiffies, timeout)) { ++ printk(KERN_ERR "%s: can't stop ccdc\n", __func__); ++ reset = 1; ++ break; ++ } ++ msleep(1); ++ } ++ ++ return reset; ++} ++ ++static int isp_stop_modules(void) ++{ ++ return __isp_disable_modules(0); ++} ++ ++static int isp_suspend_modules(void) ++{ ++ return __isp_disable_modules(1); ++} ++ ++static void isp_resume_modules(void) ++{ ++ ispresizer_resume(); ++ isppreview_resume(); ++ isp_hist_resume(); ++ isph3a_aewb_resume(); ++ isp_af_resume(); ++ ispccdc_resume(); ++} ++ ++static void isp_reset(void) ++{ ++ unsigned long timeout = 0; ++ ++ isp_reg_writel(isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG) ++ | ISP_SYSCONFIG_SOFTRESET, ++ OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG); ++ while (!(isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_SYSSTATUS) & 0x1)) { ++ if (timeout++ > 10000) { ++ printk(KERN_ALERT "%s: cannot reset ISP\n", __func__); ++ break; ++ } ++ udelay(1); ++ } ++} ++ ++/** ++ * isp_stop - Stops isp submodules ++ **/ ++void isp_stop() ++{ ++ int reset; ++ ++ isp_disable_interrupts(); ++ reset = isp_stop_modules(); ++ isp_buf_init(); ++ if (!reset) ++ return; ++ ++ isp_save_ctx(); ++ isp_reset(); ++ isp_restore_ctx(); ++} ++EXPORT_SYMBOL(isp_stop); ++ ++static void isp_set_buf(struct isp_buf *buf) ++{ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_RESIZER ++ && is_ispresizer_enabled()) ++ ispresizer_set_outaddr(buf->isp_addr); ++ else if (isp_obj.module.isp_pipeline & OMAP_ISP_CCDC) ++ ispccdc_set_outaddr(buf->isp_addr); ++ ++} ++ ++/** ++ * isp_calc_pipeline - Sets pipeline depending of input and output pixel format ++ * @pix_input: Pointer to V4L2 pixel format structure for input image. ++ * @pix_output: Pointer to V4L2 pixel format structure for output image. ++ **/ ++static u32 isp_calc_pipeline(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ isp_release_resources(); ++ if ((pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10 ++ || pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10DPCM8) ++ && pix_output->pixelformat != V4L2_PIX_FMT_SGRBG10) { ++ isp_obj.module.isp_pipeline = ++ OMAP_ISP_CCDC | OMAP_ISP_PREVIEW | OMAP_ISP_RESIZER; ++ ispccdc_request(); ++ isppreview_request(); ++ ispresizer_request(); ++ ispccdc_config_datapath(CCDC_RAW, CCDC_OTHERS_VP); ++ isppreview_config_datapath(PRV_RAW_CCDC, PREVIEW_MEM); ++ ispresizer_config_datapath(RSZ_MEM_YUV); ++ } else { ++ isp_obj.module.isp_pipeline = OMAP_ISP_CCDC; ++ ispccdc_request(); ++ if (pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10 ++ || pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10DPCM8) ++ ispccdc_config_datapath(CCDC_RAW, CCDC_OTHERS_VP_MEM); ++ else ++ ispccdc_config_datapath(CCDC_YUV_SYNC, ++ CCDC_OTHERS_MEM); ++ } ++ return 0; ++} ++ ++/** ++ * isp_config_pipeline - Configures the image size and ycpos for ISP submodules ++ * @pix_input: Pointer to V4L2 pixel format structure for input image. ++ * @pix_output: Pointer to V4L2 pixel format structure for output image. ++ * ++ * The configuration of ycpos depends on the output pixel format for both the ++ * Preview and Resizer submodules. ++ **/ ++static void isp_config_pipeline(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ ispccdc_config_size(isp_obj.module.ccdc_input_width, ++ isp_obj.module.ccdc_input_height, ++ isp_obj.module.ccdc_output_width, ++ isp_obj.module.ccdc_output_height); ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_PREVIEW) { ++ isppreview_config_size(isp_obj.module.preview_input_width, ++ isp_obj.module.preview_input_height, ++ isp_obj.module.preview_output_width, ++ isp_obj.module.preview_output_height); ++ } ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_RESIZER) { ++ ispresizer_config_size(isp_obj.module.resizer_input_width, ++ isp_obj.module.resizer_input_height, ++ isp_obj.module.resizer_output_width, ++ isp_obj.module.resizer_output_height); ++ } ++ ++ if (pix_output->pixelformat == V4L2_PIX_FMT_UYVY) { ++ isppreview_config_ycpos(YCPOS_YCrYCb); ++ if (is_ispresizer_enabled()) ++ ispresizer_config_ycpos(0); ++ } else { ++ isppreview_config_ycpos(YCPOS_CrYCbY); ++ if (is_ispresizer_enabled()) ++ ispresizer_config_ycpos(1); ++ } ++ ++ return; ++} ++ ++static void isp_buf_init(void) ++{ ++ struct isp_bufs *bufs = &isp_obj.bufs; ++ int sg; ++ ++ bufs->queue = 0; ++ bufs->done = 0; ++ bufs->wait_hs_vs = isp_obj.config->wait_hs_vs; ++ for (sg = 0; sg < NUM_BUFS; sg++) { ++ bufs->buf[sg].complete = NULL; ++ bufs->buf[sg].vb = NULL; ++ bufs->buf[sg].priv = NULL; ++ } ++} ++ ++/** ++ * isp_vbq_sync - Walks the pages table and flushes the cache for ++ * each page. ++ **/ ++static int isp_vbq_sync(struct videobuf_buffer *vb, int when) ++{ ++ flush_cache_all(); ++ ++ return 0; ++} ++ ++static int isp_buf_process(struct isp_bufs *bufs) ++{ ++ struct isp_buf *buf = NULL; ++ unsigned long flags; ++ int last; ++ ++ spin_lock_irqsave(&bufs->lock, flags); ++ ++ if (ISP_BUFS_IS_EMPTY(bufs)) ++ goto out; ++ ++ if (RAW_CAPTURE(&isp_obj) && ispccdc_sbl_wait_idle(1000)) { ++ printk(KERN_ERR "ccdc %d won't become idle!\n", ++ RAW_CAPTURE(&isp_obj)); ++ goto out; ++ } ++ ++ /* We had at least one buffer in queue. */ ++ buf = ISP_BUF_DONE(bufs); ++ last = ISP_BUFS_IS_LAST(bufs); ++ ++ if (!last) { ++ /* Set new buffer address. */ ++ isp_set_buf(ISP_BUF_NEXT_DONE(bufs)); ++ } else { ++ /* Tell ISP not to write any of our buffers. */ ++ isp_disable_interrupts(); ++ if (RAW_CAPTURE(&isp_obj)) ++ ispccdc_enable(0); ++ else ++ ispresizer_enable(0); ++ /* ++ * We must wait for the HS_VS since before that the ++ * CCDC may trigger interrupts even if it's not ++ * receiving a frame. ++ */ ++ bufs->wait_hs_vs = isp_obj.config->wait_hs_vs; ++ } ++ if ((RAW_CAPTURE(&isp_obj) && ispccdc_busy()) ++ || (!RAW_CAPTURE(&isp_obj) && ispresizer_busy())) { ++ /* ++ * Next buffer available: for the transfer to succeed, the ++ * CCDC (RAW capture) or resizer (YUV capture) must be idle ++ * for the duration of transfer setup. Bad things happen ++ * otherwise! ++ * ++ * Next buffer not available: if we fail to stop the ++ * ISP the buffer is probably going to be bad. ++ */ ++ /* Mark this buffer faulty. */ ++ buf->vb_state = VIDEOBUF_ERROR; ++ /* Mark next faulty, too, in case we have one. */ ++ if (!last) { ++ ISP_BUF_NEXT_DONE(bufs)->vb_state = ++ VIDEOBUF_ERROR; ++ printk(KERN_ALERT "OUCH!!!\n"); ++ } else { ++ printk(KERN_ALERT "Ouch!\n"); ++ } ++ } ++ ++ /* Mark the current buffer as done. */ ++ ISP_BUF_MARK_DONE(bufs); ++ ++ DPRINTK_ISPCTRL(KERN_ALERT "%s: finish %d mmu %p\n", __func__, ++ (bufs->done - 1 + NUM_BUFS) % NUM_BUFS, ++ (bufs->buf+((bufs->done - 1 + NUM_BUFS) ++ % NUM_BUFS))->isp_addr); ++ ++out: ++ spin_unlock_irqrestore(&bufs->lock, flags); ++ ++ if (buf != NULL) { ++ /* ++ * We want to dequeue a buffer from the video buffer ++ * queue. Let's do it! ++ */ ++ isp_vbq_sync(buf->vb, DMA_FROM_DEVICE); ++ buf->vb->state = buf->vb_state; ++ buf->complete(buf->vb, buf->priv); ++ } ++ ++ return 0; ++} ++ ++int isp_buf_queue(struct videobuf_buffer *vb, ++ void (*complete)(struct videobuf_buffer *vb, void *priv), ++ void *priv) ++{ ++ unsigned long flags; ++ struct isp_buf *buf; ++ struct videobuf_dmabuf *dma = videobuf_to_dma(vb); ++ const struct scatterlist *sglist = dma->sglist; ++ struct isp_bufs *bufs = &isp_obj.bufs; ++ int sglen = dma->sglen; ++ ++ BUG_ON(sglen < 0 || !sglist); ++ ++ isp_vbq_sync(vb, DMA_TO_DEVICE); ++ ++ spin_lock_irqsave(&bufs->lock, flags); ++ ++ BUG_ON(ISP_BUFS_IS_FULL(bufs)); ++ ++ buf = ISP_BUF_QUEUE(bufs); ++ ++ buf->isp_addr = bufs->isp_addr_capture[vb->i]; ++ buf->complete = complete; ++ buf->vb = vb; ++ buf->priv = priv; ++ buf->vb_state = VIDEOBUF_DONE; ++ ++ if (ISP_BUFS_IS_EMPTY(bufs)) { ++ isp_enable_interrupts(RAW_CAPTURE(&isp_obj)); ++ isp_set_buf(buf); ++ ispccdc_enable(1); ++ isp_start(); ++ } ++ ++ ISP_BUF_MARK_QUEUED(bufs); ++ ++ spin_unlock_irqrestore(&bufs->lock, flags); ++ ++ DPRINTK_ISPCTRL(KERN_ALERT "%s: queue %d vb %d, mmu %p\n", __func__, ++ (bufs->queue - 1 + NUM_BUFS) % NUM_BUFS, vb->i, ++ buf->isp_addr); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_buf_queue); ++ ++int isp_vbq_setup(struct videobuf_queue *vbq, unsigned int *cnt, ++ unsigned int *size) ++{ ++ int rval = 0; ++ size_t tmp_size = PAGE_ALIGN(isp_obj.module.preview_output_width ++ * isp_obj.module.preview_output_height ++ * ISP_BYTES_PER_PIXEL); ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_PREVIEW ++ && isp_obj.tmp_buf_size < tmp_size) ++ rval = isp_tmp_buf_alloc(tmp_size); ++ ++ return rval; ++} ++EXPORT_SYMBOL(isp_vbq_setup); ++ ++/** ++ * isp_vbq_prepare - Videobuffer queue prepare. ++ * @vbq: Pointer to videobuf_queue structure. ++ * @vb: Pointer to videobuf_buffer structure. ++ * @field: Requested Field order for the videobuffer. ++ * ++ * Returns 0 if successful, or -EIO if the ispmmu was unable to map a ++ * scatter-gather linked list data space. ++ **/ ++int isp_vbq_prepare(struct videobuf_queue *vbq, struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ unsigned int isp_addr; ++ struct videobuf_dmabuf *vdma; ++ struct isp_bufs *bufs = &isp_obj.bufs; ++ ++ int err = 0; ++ ++ vdma = videobuf_to_dma(vb); ++ ++ isp_addr = ispmmu_vmap(vdma->sglist, vdma->sglen); ++ ++ if (IS_ERR_VALUE(isp_addr)) ++ err = -EIO; ++ else ++ bufs->isp_addr_capture[vb->i] = isp_addr; ++ ++ return err; ++} ++EXPORT_SYMBOL(isp_vbq_prepare); ++ ++/** ++ * isp_vbq_release - Videobuffer queue release. ++ * @vbq: Pointer to videobuf_queue structure. ++ * @vb: Pointer to videobuf_buffer structure. ++ **/ ++void isp_vbq_release(struct videobuf_queue *vbq, struct videobuf_buffer *vb) ++{ ++ struct isp_bufs *bufs = &isp_obj.bufs; ++ ++ ispmmu_vunmap(bufs->isp_addr_capture[vb->i]); ++ bufs->isp_addr_capture[vb->i] = (dma_addr_t)NULL; ++ return; ++} ++EXPORT_SYMBOL(isp_vbq_release); ++ ++/** ++ * isp_queryctrl - Query V4L2 control from existing controls in ISP. ++ * @a: Pointer to v4l2_queryctrl structure. It only needs the id field filled. ++ * ++ * Returns 0 if successful, or -EINVAL if not found in ISP. ++ **/ ++int isp_queryctrl(struct v4l2_queryctrl *a) ++{ ++ int i; ++ ++ if (a->id & V4L2_CTRL_FLAG_NEXT_CTRL) { ++ a->id &= ~V4L2_CTRL_FLAG_NEXT_CTRL; ++ i = find_next_vctrl(a->id); ++ } else { ++ i = find_vctrl(a->id); ++ } ++ ++ if (i < 0) ++ return -EINVAL; ++ ++ *a = video_control[i].qc; ++ return 0; ++} ++EXPORT_SYMBOL(isp_queryctrl); ++ ++/** ++ * isp_queryctrl - Query V4L2 control from existing controls in ISP. ++ * @a: Pointer to v4l2_queryctrl structure. It only needs the id field filled. ++ * ++ * Returns 0 if successful, or -EINVAL if not found in ISP. ++ **/ ++int isp_querymenu(struct v4l2_querymenu *a) ++{ ++ int i; ++ ++ i = find_vmenu(a->id, a->index); ++ ++ if (i < 0) ++ return -EINVAL; ++ ++ *a = video_menu[i]; ++ return 0; ++} ++EXPORT_SYMBOL(isp_querymenu); ++ ++/** ++ * isp_g_ctrl - Gets value of the desired V4L2 control. ++ * @a: V4L2 control to read actual value from. ++ * ++ * Return 0 if successful, or -EINVAL if chosen control is not found. ++ **/ ++int isp_g_ctrl(struct v4l2_control *a) ++{ ++ u8 current_value; ++ int rval = 0; ++ ++ if (!isp_obj.ref_count) ++ return -EINVAL; ++ ++ switch (a->id) { ++ case V4L2_CID_BRIGHTNESS: ++ isppreview_query_brightness(¤t_value); ++ a->value = current_value / ISPPRV_BRIGHT_UNITS; ++ break; ++ case V4L2_CID_CONTRAST: ++ isppreview_query_contrast(¤t_value); ++ a->value = current_value / ISPPRV_CONTRAST_UNITS; ++ break; ++ case V4L2_CID_COLORFX: ++ isppreview_get_color(¤t_value); ++ a->value = current_value; ++ break; ++ default: ++ rval = -EINVAL; ++ break; ++ } ++ ++ return rval; ++} ++EXPORT_SYMBOL(isp_g_ctrl); ++ ++/** ++ * isp_s_ctrl - Sets value of the desired V4L2 control. ++ * @a: V4L2 control to read actual value from. ++ * ++ * Return 0 if successful, -EINVAL if chosen control is not found or value ++ * is out of bounds, -EFAULT if copy_from_user or copy_to_user operation fails ++ * from camera abstraction layer related controls or the transfered user space ++ * pointer via the value field is not set properly. ++ **/ ++int isp_s_ctrl(struct v4l2_control *a) ++{ ++ int rval = 0; ++ u8 new_value = a->value; ++ ++ if (!isp_obj.ref_count) ++ return -EINVAL; ++ ++ switch (a->id) { ++ case V4L2_CID_BRIGHTNESS: ++ if (new_value > ISPPRV_BRIGHT_HIGH) ++ rval = -EINVAL; ++ else ++ isppreview_update_brightness(&new_value); ++ break; ++ case V4L2_CID_CONTRAST: ++ if (new_value > ISPPRV_CONTRAST_HIGH) ++ rval = -EINVAL; ++ else ++ isppreview_update_contrast(&new_value); ++ break; ++ case V4L2_CID_COLORFX: ++ if (new_value > V4L2_COLORFX_SEPIA) ++ rval = -EINVAL; ++ else ++ isppreview_set_color(&new_value); ++ break; ++ default: ++ rval = -EINVAL; ++ break; ++ } ++ ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_ctrl); ++ ++/** ++ * isp_handle_private - Handle all private ioctls for isp module. ++ * @cmd: ioctl cmd value ++ * @arg: ioctl arg value ++ * ++ * Return 0 if successful, -EINVAL if chosen cmd value is not handled or value ++ * is out of bounds, -EFAULT if ioctl arg value is not valid. ++ * Function simply routes the input ioctl cmd id to the appropriate handler in ++ * the isp module. ++ **/ ++int isp_handle_private(int cmd, void *arg) ++{ ++ int rval = 0; ++ ++ if (!isp_obj.ref_count) ++ return -EINVAL; ++ ++ switch (cmd) { ++ case VIDIOC_PRIVATE_ISP_CCDC_CFG: ++ rval = omap34xx_isp_ccdc_config(arg); ++ break; ++ case VIDIOC_PRIVATE_ISP_PRV_CFG: ++ rval = omap34xx_isp_preview_config(arg); ++ break; ++ case VIDIOC_PRIVATE_ISP_AEWB_CFG: { ++ struct isph3a_aewb_config *params; ++ params = (struct isph3a_aewb_config *)arg; ++ rval = isph3a_aewb_configure(params); ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_AEWB_REQ: { ++ struct isph3a_aewb_data *data; ++ data = (struct isph3a_aewb_data *)arg; ++ rval = isph3a_aewb_request_statistics(data); ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_HIST_CFG: { ++ struct isp_hist_config *params; ++ params = (struct isp_hist_config *)arg; ++ rval = isp_hist_configure(params); ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_HIST_REQ: { ++ struct isp_hist_data *data; ++ data = (struct isp_hist_data *)arg; ++ rval = isp_hist_request_statistics(data); ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_AF_CFG: { ++ struct af_configuration *params; ++ params = (struct af_configuration *)arg; ++ rval = isp_af_configure(params); ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_AF_REQ: { ++ struct isp_af_data *data; ++ data = (struct isp_af_data *)arg; ++ rval = isp_af_request_statistics(data); ++ } ++ break; ++ default: ++ rval = -EINVAL; ++ break; ++ } ++ return rval; ++} ++EXPORT_SYMBOL(isp_handle_private); ++ ++/** ++ * isp_enum_fmt_cap - Gets more information of chosen format index and type ++ * @f: Pointer to structure containing index and type of format to read from. ++ * ++ * Returns 0 if successful, or -EINVAL if format index or format type is ++ * invalid. ++ **/ ++int isp_enum_fmt_cap(struct v4l2_fmtdesc *f) ++{ ++ int index = f->index; ++ enum v4l2_buf_type type = f->type; ++ int rval = -EINVAL; ++ ++ if (index >= NUM_ISP_CAPTURE_FORMATS) ++ goto err; ++ ++ memset(f, 0, sizeof(*f)); ++ f->index = index; ++ f->type = type; ++ ++ switch (f->type) { ++ case V4L2_BUF_TYPE_VIDEO_CAPTURE: ++ rval = 0; ++ break; ++ default: ++ goto err; ++ } ++ ++ f->flags = isp_formats[index].flags; ++ strncpy(f->description, isp_formats[index].description, ++ sizeof(f->description)); ++ f->pixelformat = isp_formats[index].pixelformat; ++err: ++ return rval; ++} ++EXPORT_SYMBOL(isp_enum_fmt_cap); ++ ++/** ++ * isp_g_fmt_cap - Gets current output image format. ++ * @f: Pointer to V4L2 format structure to be filled with current output format ++ **/ ++void isp_g_fmt_cap(struct v4l2_pix_format *pix) ++{ ++ *pix = isp_obj.module.pix; ++ return; ++} ++EXPORT_SYMBOL(isp_g_fmt_cap); ++ ++/** ++ * isp_s_fmt_cap - Sets I/O formats and crop and configures pipeline in ISP ++ * @f: Pointer to V4L2 format structure to be filled with current output format ++ * ++ * Returns 0 if successful, or return value of either isp_try_size or ++ * isp_try_fmt if there is an error. ++ **/ ++int isp_s_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int crop_scaling_w = 0, crop_scaling_h = 0; ++ int rval = 0; ++ ++ if (!isp_obj.ref_count) ++ return -EINVAL; ++ ++ rval = isp_calc_pipeline(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ rval = isp_try_size(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ rval = isp_try_fmt(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ if (ispcroprect.width != pix_output->width) { ++ crop_scaling_w = 1; ++ ispcroprect.left = 0; ++ ispcroprect.width = pix_output->width; ++ } ++ ++ if (ispcroprect.height != pix_output->height) { ++ crop_scaling_h = 1; ++ ispcroprect.top = 0; ++ ispcroprect.height = pix_output->height; ++ } ++ ++ isp_config_pipeline(pix_input, pix_output); ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_RESIZER ++ && (crop_scaling_h || crop_scaling_w)) ++ isp_config_crop(pix_output); ++ ++out: ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_fmt_cap); ++ ++/** ++ * isp_config_crop - Configures crop parameters in isp resizer. ++ * @croppix: Pointer to V4L2 pixel format structure containing crop parameters ++ **/ ++void isp_config_crop(struct v4l2_pix_format *croppix) ++{ ++ u8 crop_scaling_w; ++ u8 crop_scaling_h; ++ unsigned long org_left, num_pix, new_top; ++ ++ struct v4l2_pix_format *pix = croppix; ++ ++ crop_scaling_w = (isp_obj.module.preview_output_width * 10) / ++ pix->width; ++ crop_scaling_h = (isp_obj.module.preview_output_height * 10) / ++ pix->height; ++ ++ cur_rect.left = (ispcroprect.left * crop_scaling_w) / 10; ++ cur_rect.top = (ispcroprect.top * crop_scaling_h) / 10; ++ cur_rect.width = (ispcroprect.width * crop_scaling_w) / 10; ++ cur_rect.height = (ispcroprect.height * crop_scaling_h) / 10; ++ ++ org_left = cur_rect.left; ++ while (((int)cur_rect.left & 0xFFFFFFF0) != (int)cur_rect.left) ++ (int)cur_rect.left--; ++ ++ num_pix = org_left - cur_rect.left; ++ new_top = (int)(num_pix * 3) / 4; ++ cur_rect.top = cur_rect.top - new_top; ++ cur_rect.height = (2 * new_top) + cur_rect.height; ++ ++ cur_rect.width = cur_rect.width + (2 * num_pix); ++ while (((int)cur_rect.width & 0xFFFFFFF0) != (int)cur_rect.width) ++ (int)cur_rect.width--; ++ ++ isp_obj.tmp_buf_offset = ++ cur_rect.left * 2 + ++ isp_obj.module.preview_output_width * 2 * cur_rect.top; ++ ++ ispresizer_trycrop(cur_rect.left, cur_rect.top, cur_rect.width, ++ cur_rect.height, ++ isp_obj.module.resizer_output_width, ++ isp_obj.module.resizer_output_height); ++ ++ return; ++} ++EXPORT_SYMBOL(isp_config_crop); ++ ++/** ++ * isp_g_crop - Gets crop rectangle size and position. ++ * @a: Pointer to V4L2 crop structure to be filled. ++ * ++ * Always returns 0. ++ **/ ++int isp_g_crop(struct v4l2_crop *a) ++{ ++ struct v4l2_crop *crop = a; ++ ++ crop->c = ispcroprect; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_g_crop); ++ ++/** ++ * isp_s_crop - Sets crop rectangle size and position and queues crop operation ++ * @a: Pointer to V4L2 crop structure with desired parameters. ++ * @pix: Pointer to V4L2 pixel format structure with desired parameters. ++ * ++ * Returns 0 if successful, or -EINVAL if crop parameters are out of bounds. ++ **/ ++int isp_s_crop(struct v4l2_crop *a, struct v4l2_pix_format *pix) ++{ ++ struct v4l2_crop *crop = a; ++ int rval = 0; ++ ++ if (!isp_obj.ref_count) ++ return -EINVAL; ++ ++ if (crop->c.left < 0) ++ crop->c.left = 0; ++ if (crop->c.width < 0) ++ crop->c.width = 0; ++ if (crop->c.top < 0) ++ crop->c.top = 0; ++ if (crop->c.height < 0) ++ crop->c.height = 0; ++ ++ if (crop->c.left >= pix->width) ++ crop->c.left = pix->width - 1; ++ if (crop->c.top >= pix->height) ++ crop->c.top = pix->height - 1; ++ ++ if (crop->c.left + crop->c.width > pix->width) ++ crop->c.width = pix->width - crop->c.left; ++ if (crop->c.top + crop->c.height > pix->height) ++ crop->c.height = pix->height - crop->c.top; ++ ++ ispcroprect.left = crop->c.left; ++ ispcroprect.top = crop->c.top; ++ ispcroprect.width = crop->c.width; ++ ispcroprect.height = crop->c.height; ++ ++ isp_config_crop(pix); ++ ++ isp_obj.module.applyCrop = 1; ++ ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_crop); ++ ++/** ++ * isp_try_fmt_cap - Tries desired input/output image formats ++ * @pix_input: Pointer to V4L2 pixel format structure for input image. ++ * @pix_output: Pointer to V4L2 pixel format structure for output image. ++ * ++ * Returns 0 if successful, or return value of either isp_try_size or ++ * isp_try_fmt if there is an error. ++ **/ ++int isp_try_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int rval = 0; ++ ++ rval = isp_calc_pipeline(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ rval = isp_try_size(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ rval = isp_try_fmt(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++out: ++ return rval; ++} ++EXPORT_SYMBOL(isp_try_fmt_cap); ++ ++/** ++ * isp_try_size - Tries size configuration for I/O images of each ISP submodule ++ * @pix_input: Pointer to V4L2 pixel format structure for input image. ++ * @pix_output: Pointer to V4L2 pixel format structure for output image. ++ * ++ * Returns 0 if successful, or return value of ispccdc_try_size, ++ * isppreview_try_size, or ispresizer_try_size (depending on the pipeline ++ * configuration) if there is an error. ++ **/ ++static int isp_try_size(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int rval = 0; ++ ++ if (pix_output->width <= ISPRSZ_MIN_OUTPUT ++ || pix_output->height <= ISPRSZ_MIN_OUTPUT) ++ return -EINVAL; ++ ++ if (pix_output->width >= ISPRSZ_MAX_OUTPUT ++ || pix_output->height > ISPRSZ_MAX_OUTPUT) ++ return -EINVAL; ++ ++ isp_obj.module.ccdc_input_width = pix_input->width; ++ isp_obj.module.ccdc_input_height = pix_input->height; ++ isp_obj.module.resizer_output_width = pix_output->width; ++ isp_obj.module.resizer_output_height = pix_output->height; ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_CCDC) { ++ rval = ispccdc_try_size(isp_obj.module.ccdc_input_width, ++ isp_obj.module.ccdc_input_height, ++ &isp_obj.module.ccdc_output_width, ++ &isp_obj.module.ccdc_output_height); ++ if (rval) { ++ printk(KERN_ERR "ISP_ERR: The dimensions %dx%d are not" ++ " supported\n", pix_input->width, ++ pix_input->height); ++ return rval; ++ } ++ pix_output->width = isp_obj.module.ccdc_output_width; ++ pix_output->height = isp_obj.module.ccdc_output_height; ++ } ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_PREVIEW) { ++ isp_obj.module.preview_input_width = ++ isp_obj.module.ccdc_output_width; ++ isp_obj.module.preview_input_height = ++ isp_obj.module.ccdc_output_height; ++ rval = isppreview_try_size( ++ isp_obj.module.preview_input_width, ++ isp_obj.module.preview_input_height, ++ &isp_obj.module.preview_output_width, ++ &isp_obj.module.preview_output_height); ++ if (rval) { ++ printk(KERN_ERR "ISP_ERR: The dimensions %dx%d are not" ++ " supported\n", pix_input->width, ++ pix_input->height); ++ return rval; ++ } ++ pix_output->width = isp_obj.module.preview_output_width; ++ pix_output->height = isp_obj.module.preview_output_height; ++ } ++ ++ if (isp_obj.module.isp_pipeline & OMAP_ISP_RESIZER) { ++ isp_obj.module.resizer_input_width = ++ isp_obj.module.preview_output_width; ++ isp_obj.module.resizer_input_height = ++ isp_obj.module.preview_output_height; ++ rval = ispresizer_try_size( ++ &isp_obj.module.resizer_input_width, ++ &isp_obj.module.resizer_input_height, ++ &isp_obj.module.resizer_output_width, ++ &isp_obj.module.resizer_output_height); ++ if (rval) { ++ printk(KERN_ERR "ISP_ERR: The dimensions %dx%d are not" ++ " supported\n", pix_input->width, ++ pix_input->height); ++ return rval; ++ } ++ pix_output->width = isp_obj.module.resizer_output_width; ++ pix_output->height = isp_obj.module.resizer_output_height; ++ } ++ ++ return rval; ++} ++ ++/** ++ * isp_try_fmt - Validates input/output format parameters. ++ * @pix_input: Pointer to V4L2 pixel format structure for input image. ++ * @pix_output: Pointer to V4L2 pixel format structure for output image. ++ * ++ * Always returns 0. ++ **/ ++int isp_try_fmt(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int ifmt; ++ ++ for (ifmt = 0; ifmt < NUM_ISP_CAPTURE_FORMATS; ifmt++) { ++ if (pix_output->pixelformat == isp_formats[ifmt].pixelformat) ++ break; ++ } ++ if (ifmt == NUM_ISP_CAPTURE_FORMATS) ++ ifmt = 1; ++ pix_output->pixelformat = isp_formats[ifmt].pixelformat; ++ pix_output->field = V4L2_FIELD_NONE; ++ pix_output->bytesperline = pix_output->width * ISP_BYTES_PER_PIXEL; ++ pix_output->sizeimage = ++ PAGE_ALIGN(pix_output->bytesperline * pix_output->height); ++ pix_output->priv = 0; ++ switch (pix_output->pixelformat) { ++ case V4L2_PIX_FMT_YUYV: ++ case V4L2_PIX_FMT_UYVY: ++ pix_output->colorspace = V4L2_COLORSPACE_JPEG; ++ break; ++ default: ++ pix_output->colorspace = V4L2_COLORSPACE_SRGB; ++ } ++ ++ isp_obj.module.pix.pixelformat = pix_output->pixelformat; ++ isp_obj.module.pix.width = pix_output->width; ++ isp_obj.module.pix.height = pix_output->height; ++ isp_obj.module.pix.field = pix_output->field; ++ isp_obj.module.pix.bytesperline = pix_output->bytesperline; ++ isp_obj.module.pix.sizeimage = pix_output->sizeimage; ++ isp_obj.module.pix.priv = pix_output->priv; ++ isp_obj.module.pix.colorspace = pix_output->colorspace; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_try_fmt); ++ ++/** ++ * isp_save_ctx - Saves ISP, CCDC, HIST, H3A, PREV, RESZ & MMU context. ++ * ++ * Routine for saving the context of each module in the ISP. ++ * CCDC, HIST, H3A, PREV, RESZ and MMU. ++ **/ ++static void isp_save_ctx(void) ++{ ++ isp_save_context(isp_reg_list); ++ ispccdc_save_context(); ++ ispmmu_save_context(); ++ isphist_save_context(); ++ isph3a_save_context(); ++ isppreview_save_context(); ++ ispresizer_save_context(); ++} ++ ++/** ++ * isp_restore_ctx - Restores ISP, CCDC, HIST, H3A, PREV, RESZ & MMU context. ++ * ++ * Routine for restoring the context of each module in the ISP. ++ * CCDC, HIST, H3A, PREV, RESZ and MMU. ++ **/ ++static void isp_restore_ctx(void) ++{ ++ isp_restore_context(isp_reg_list); ++ ispccdc_restore_context(); ++ ispmmu_restore_context(); ++ isphist_restore_context(); ++ isph3a_restore_context(); ++ isppreview_restore_context(); ++ ispresizer_restore_context(); ++} ++ ++static int isp_enable_clocks(void) ++{ ++ int r; ++ ++ r = clk_enable(isp_obj.cam_ick); ++ if (r) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_en for ick failed\n"); ++ goto out_clk_enable_ick; ++ } ++ r = clk_enable(isp_obj.cam_mclk); ++ if (r) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_en for mclk failed\n"); ++ goto out_clk_enable_mclk; ++ } ++ r = clk_enable(isp_obj.csi2_fck); ++ if (r) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_en for csi2_fclk" ++ " failed\n"); ++ goto out_clk_enable_csi2_fclk; ++ } ++ return 0; ++ ++out_clk_enable_csi2_fclk: ++ clk_disable(isp_obj.cam_mclk); ++out_clk_enable_mclk: ++ clk_disable(isp_obj.cam_ick); ++out_clk_enable_ick: ++ return r; ++} ++ ++static void isp_disable_clocks(void) ++{ ++ clk_disable(isp_obj.cam_ick); ++ clk_disable(isp_obj.cam_mclk); ++ clk_disable(isp_obj.csi2_fck); ++} ++ ++/** ++ * isp_get - Adquires the ISP resource. ++ * ++ * Initializes the clocks for the first acquire. ++ **/ ++int isp_get(void) ++{ ++ static int has_context; ++ int ret_err = 0; ++ ++ if (omap3isp == NULL) ++ return -EBUSY; ++ ++ DPRINTK_ISPCTRL("isp_get: old %d\n", isp_obj.ref_count); ++ mutex_lock(&(isp_obj.isp_mutex)); ++ if (isp_obj.ref_count == 0) { ++ ret_err = isp_enable_clocks(); ++ if (ret_err) ++ goto out_err; ++ /* We don't want to restore context before saving it! */ ++ if (has_context) ++ isp_restore_ctx(); ++ else ++ has_context = 1; ++ } else { ++ mutex_unlock(&isp_obj.isp_mutex); ++ return -EBUSY; ++ } ++ isp_obj.ref_count++; ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ ++ DPRINTK_ISPCTRL("isp_get: new %d\n", isp_obj.ref_count); ++ return isp_obj.ref_count; ++ ++out_err: ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ return ret_err; ++} ++EXPORT_SYMBOL(isp_get); ++ ++/** ++ * isp_put - Releases the ISP resource. ++ * ++ * Releases the clocks also for the last release. ++ **/ ++int isp_put(void) ++{ ++ if (omap3isp == NULL) ++ return -EBUSY; ++ ++ DPRINTK_ISPCTRL("isp_put: old %d\n", isp_obj.ref_count); ++ mutex_lock(&(isp_obj.isp_mutex)); ++ if (isp_obj.ref_count) { ++ if (--isp_obj.ref_count == 0) { ++ isp_save_ctx(); ++ isp_tmp_buf_free(); ++ isp_release_resources(); ++ isp_obj.module.isp_pipeline = 0; ++ isp_disable_clocks(); ++ memset(&ispcroprect, 0, sizeof(ispcroprect)); ++ memset(&cur_rect, 0, sizeof(cur_rect)); ++ } ++ } ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ DPRINTK_ISPCTRL("isp_put: new %d\n", isp_obj.ref_count); ++ return isp_obj.ref_count; ++} ++EXPORT_SYMBOL(isp_put); ++ ++/** ++ * isp_save_context - Saves the values of the ISP module registers. ++ * @reg_list: Structure containing pairs of register address and value to ++ * modify on OMAP. ++ **/ ++void isp_save_context(struct isp_reg *reg_list) ++{ ++ struct isp_reg *next = reg_list; ++ ++ for (; next->reg != ISP_TOK_TERM; next++) ++ next->val = isp_reg_readl(next->mmio_range, next->reg); ++} ++EXPORT_SYMBOL(isp_save_context); ++ ++/** ++ * isp_restore_context - Restores the values of the ISP module registers. ++ * @reg_list: Structure containing pairs of register address and value to ++ * modify on OMAP. ++ **/ ++void isp_restore_context(struct isp_reg *reg_list) ++{ ++ struct isp_reg *next = reg_list; ++ ++ for (; next->reg != ISP_TOK_TERM; next++) ++ isp_reg_writel(next->val, next->mmio_range, next->reg); ++} ++EXPORT_SYMBOL(isp_restore_context); ++ ++static int isp_remove(struct platform_device *pdev) ++{ ++ struct isp_device *isp = platform_get_drvdata(pdev); ++ int i; ++ ++ isp_csi2_cleanup(); ++ isp_af_exit(); ++ isp_resizer_cleanup(); ++ isp_preview_cleanup(); ++ ispmmu_cleanup(); ++ isph3a_aewb_cleanup(); ++ isp_hist_cleanup(); ++ isp_ccdc_cleanup(); ++ ++ if (!isp) ++ return 0; ++ ++ clk_put(isp_obj.cam_ick); ++ clk_put(isp_obj.cam_mclk); ++ clk_put(isp_obj.csi2_fck); ++ ++ free_irq(isp->irq, &isp_obj); ++ ++ for (i = 0; i <= OMAP3_ISP_IOMEM_CSI2PHY; i++) { ++ if (isp->mmio_base[i]) { ++ iounmap((void *)isp->mmio_base[i]); ++ isp->mmio_base[i] = 0; ++ } ++ ++ if (isp->mmio_base_phys[i]) { ++ release_mem_region(isp->mmio_base_phys[i], ++ isp->mmio_size[i]); ++ isp->mmio_base_phys[i] = 0; ++ } ++ } ++ ++ omap3isp = NULL; ++ ++ kfree(isp); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++ ++static int isp_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ int reset; ++ ++ mutex_lock(&(isp_obj.isp_mutex)); ++ DPRINTK_ISPCTRL("isp_suspend: starting\n"); ++ if (isp_obj.ref_count == 0) ++ goto out; ++ ++ isp_disable_interrupts(); ++ reset = isp_suspend_modules(); ++ isp_save_ctx(); ++ if (reset) ++ isp_reset(); ++ ++ isp_disable_clocks(); ++ ++out: ++ DPRINTK_ISPCTRL("isp_suspend: done\n"); ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ return 0; ++} ++ ++static int isp_resume(struct platform_device *pdev) ++{ ++ int ret_err = 0; ++ ++ DPRINTK_ISPCTRL("isp_resume: starting\n"); ++ ++ if (omap3isp == NULL) ++ goto out; ++ ++ if (isp_obj.ref_count >= 0) { ++ ret_err = isp_enable_clocks(); ++ if (ret_err) ++ goto out; ++ isp_restore_ctx(); ++ isp_resume_modules(); ++ isp_enable_interrupts(RAW_CAPTURE(&isp_obj)); ++ isp_start(); ++ } ++ ++out: ++ DPRINTK_ISPCTRL("isp_resume: done \n"); ++ return ret_err; ++} ++ ++#else ++ ++#define isp_suspend NULL ++#define isp_resume NULL ++ ++#endif /* CONFIG_PM */ ++ ++ ++static int isp_probe(struct platform_device *pdev) ++{ ++ struct isp_device *isp; ++ int ret_err = 0; ++ int i; ++ ++ isp = kzalloc(sizeof(*isp), GFP_KERNEL); ++ if (!isp) { ++ dev_err(&pdev->dev, "could not allocate memory\n"); ++ return -ENOMEM; ++ } ++ ++ platform_set_drvdata(pdev, isp); ++ ++ isp->dev = &pdev->dev; ++ ++ for (i = 0; i <= OMAP3_ISP_IOMEM_CSI2PHY; i++) { ++ struct resource *mem; ++ /* request the mem region for the camera registers */ ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, i); ++ if (!mem) { ++ dev_err(isp->dev, "no mem resource?\n"); ++ return -ENODEV; ++ } ++ ++ if (!request_mem_region(mem->start, mem->end - mem->start + 1, ++ pdev->name)) { ++ dev_err(isp->dev, ++ "cannot reserve camera register I/O region\n"); ++ return -ENODEV; ++ ++ } ++ isp->mmio_base_phys[i] = mem->start; ++ isp->mmio_size[i] = mem->end - mem->start + 1; ++ ++ /* map the region */ ++ isp->mmio_base[i] = (unsigned long) ++ ioremap_nocache(isp->mmio_base_phys[i], ++ isp->mmio_size[i]); ++ if (!isp->mmio_base[i]) { ++ dev_err(isp->dev, ++ "cannot map camera register I/O region\n"); ++ return -ENODEV; ++ } ++ } ++ ++ isp->irq = platform_get_irq(pdev, 0); ++ if (isp->irq <= 0) { ++ dev_err(isp->dev, "no irq for camera?\n"); ++ return -ENODEV; ++ } ++ ++ isp_obj.cam_ick = clk_get(&camera_dev, "cam_ick"); ++ if (IS_ERR(isp_obj.cam_ick)) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_get for " ++ "cam_ick failed\n"); ++ return PTR_ERR(isp_obj.cam_ick); ++ } ++ isp_obj.cam_mclk = clk_get(&camera_dev, "cam_mclk"); ++ if (IS_ERR(isp_obj.cam_mclk)) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_get for " ++ "cam_mclk failed\n"); ++ ret_err = PTR_ERR(isp_obj.cam_mclk); ++ goto out_clk_get_mclk; ++ } ++ isp_obj.csi2_fck = clk_get(&camera_dev, "csi2_96m_fck"); ++ if (IS_ERR(isp_obj.csi2_fck)) { ++ DPRINTK_ISPCTRL("ISP_ERR: clk_get for csi2_fclk" ++ " failed\n"); ++ ret_err = PTR_ERR(isp_obj.csi2_fck); ++ goto out_clk_get_csi2_fclk; ++ } ++ ++ if (request_irq(isp->irq, omap34xx_isp_isr, IRQF_SHARED, ++ "Omap 3 Camera ISP", &isp_obj)) { ++ DPRINTK_ISPCTRL("Could not install ISR\n"); ++ ret_err = -EINVAL; ++ goto out_request_irq; ++ } ++ ++ isp_obj.ref_count = 0; ++ ++ mutex_init(&(isp_obj.isp_mutex)); ++ spin_lock_init(&isp_obj.lock); ++ spin_lock_init(&isp_obj.bufs.lock); ++ ++ omap3isp = isp; ++ ++ ret_err = ispmmu_init(); ++ if (ret_err) ++ goto out_ispmmu_init; ++ ++ isp_ccdc_init(); ++ isp_hist_init(); ++ isph3a_aewb_init(); ++ isp_preview_init(); ++ isp_resizer_init(); ++ isp_af_init(); ++ isp_csi2_init(); ++ ++ isp_get(); ++ isp_power_settings(1); ++ isp_put(); ++ ++ isph3a_notify(1); ++ isp_af_notify(1); ++ ++ return 0; ++ ++out_ispmmu_init: ++ omap3isp = NULL; ++ free_irq(isp->irq, &isp_obj); ++out_request_irq: ++ clk_put(isp_obj.csi2_fck); ++out_clk_get_csi2_fclk: ++ clk_put(isp_obj.cam_mclk); ++out_clk_get_mclk: ++ clk_put(isp_obj.cam_ick); ++ ++ return ret_err; ++} ++ ++static struct platform_driver omap3isp_driver = { ++ .probe = isp_probe, ++ .remove = isp_remove, ++ .suspend = isp_suspend, ++ .resume = isp_resume, ++ .driver = { ++ .name = "omap3isp", ++ }, ++}; ++ ++/** ++ * isp_init - ISP module initialization. ++ **/ ++static int __init isp_init(void) ++{ ++ return platform_driver_register(&omap3isp_driver); ++} ++ ++/** ++ * isp_cleanup - ISP module cleanup. ++ **/ ++static void __exit isp_cleanup(void) ++{ ++ platform_driver_unregister(&omap3isp_driver); ++} ++ ++/** ++ * isp_print_status - Prints the values of the ISP Control Module registers ++ * ++ * Also prints other debug information stored in the ISP module structure. ++ **/ ++void isp_print_status(void) ++{ ++ if (!is_ispctrl_debug_enabled()) ++ return; ++ ++ DPRINTK_ISPCTRL("###ISP_CTRL=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ DPRINTK_ISPCTRL("###ISP_TCTRL_CTRL=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL)); ++ DPRINTK_ISPCTRL("###ISP_SYSCONFIG=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG)); ++ DPRINTK_ISPCTRL("###ISP_SYSSTATUS=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_SYSSTATUS)); ++ DPRINTK_ISPCTRL("###ISP_IRQ0ENABLE=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE)); ++ DPRINTK_ISPCTRL("###ISP_IRQ0STATUS=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS)); ++} ++EXPORT_SYMBOL(isp_print_status); ++ ++module_init(isp_init); ++module_exit(isp_cleanup); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP Control Module Library"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/media/video/isp/isp.h b/drivers/media/video/isp/isp.h +new file mode 100644 +index 0000000..55c98a9 +--- /dev/null ++++ b/drivers/media/video/isp/isp.h +@@ -0,0 +1,318 @@ ++/* ++ * isp.h ++ * ++ * Top level public header file for ISP Control module in ++ * TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments. ++ * Copyright (C) 2009 Nokia. ++ * ++ * Contributors: ++ * Sameer Venkatraman ++ * Mohit Jalori ++ * Sergio Aguirre ++ * Sakari Ailus ++ * Tuukka Toivonen ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_TOP_H ++#define OMAP_ISP_TOP_H ++#include ++#include ++#include ++#define OMAP_ISP_CCDC (1 << 0) ++#define OMAP_ISP_PREVIEW (1 << 1) ++#define OMAP_ISP_RESIZER (1 << 2) ++#define OMAP_ISP_AEWB (1 << 3) ++#define OMAP_ISP_AF (1 << 4) ++#define OMAP_ISP_HIST (1 << 5) ++ ++#define ISP_TOK_TERM 0xFFFFFFFF /* ++ * terminating token for ISP ++ * modules reg list ++ */ ++#define NUM_BUFS VIDEO_MAX_FRAME ++ ++#ifndef CONFIG_ARCH_OMAP3410 ++#define USE_ISP_PREVIEW ++#define USE_ISP_RESZ ++#define is_isppreview_enabled() 1 ++#define is_ispresizer_enabled() 1 ++#else ++#define is_isppreview_enabled() 0 ++#define is_ispresizer_enabled() 0 ++#endif ++ ++#define ISP_BYTES_PER_PIXEL 2 ++#define NUM_ISP_CAPTURE_FORMATS (sizeof(isp_formats) / \ ++ sizeof(isp_formats[0])) ++typedef int (*isp_vbq_callback_ptr) (struct videobuf_buffer *vb); ++typedef void (*isp_callback_t) (unsigned long status, ++ isp_vbq_callback_ptr arg1, void *arg2); ++ ++enum isp_mem_resources { ++ OMAP3_ISP_IOMEM_MAIN, ++ OMAP3_ISP_IOMEM_CBUFF, ++ OMAP3_ISP_IOMEM_CCP2, ++ OMAP3_ISP_IOMEM_CCDC, ++ OMAP3_ISP_IOMEM_HIST, ++ OMAP3_ISP_IOMEM_H3A, ++ OMAP3_ISP_IOMEM_PREV, ++ OMAP3_ISP_IOMEM_RESZ, ++ OMAP3_ISP_IOMEM_SBL, ++ OMAP3_ISP_IOMEM_CSI2A, ++ OMAP3_ISP_IOMEM_CSI2PHY ++}; ++ ++struct isp_device { ++ struct device *dev; ++ ++ /*** platform HW resources ***/ ++ unsigned int irq; ++ ++#define mmio_base_main mmio_base[OMAP3_ISP_IOMEM_MAIN] ++#define mmio_cbuff_main mmio_base[OMAP3_ISP_IOMEM_CBUFF] ++#define mmio_ccp2_main mmio_base[OMAP3_ISP_IOMEM_CCP2] ++#define mmio_ccdc_main mmio_base[OMAP3_ISP_IOMEM_CCDC] ++#define mmio_hist_main mmio_base[OMAP3_ISP_IOMEM_HIST] ++#define mmio_h3a_main mmio_base[OMAP3_ISP_IOMEM_H3A] ++#define mmio_prev_main mmio_base[OMAP3_ISP_IOMEM_PREV] ++#define mmio_resz_main mmio_base[OMAP3_ISP_IOMEM_RESZ] ++#define mmio_sbl_main mmio_base[OMAP3_ISP_IOMEM_SBL] ++#define mmio_csi2_main mmio_base[OMAP3_ISP_IOMEM_CSI2A] ++#define mmio_csi2phy_main mmio_base[OMAP3_ISP_IOMEM_CSI2PHY] ++ unsigned long mmio_base[OMAP3_ISP_IOMEM_CSI2PHY + 1]; ++ unsigned long mmio_base_phys[OMAP3_ISP_IOMEM_CSI2PHY + 1]; ++ unsigned long mmio_size[OMAP3_ISP_IOMEM_CSI2PHY + 1]; ++}; ++ ++enum isp_interface_type { ++ ISP_PARLL = 1, ++ ISP_CSIA = 2, ++ ISP_CSIB = 4, ++ ISP_NONE = 8 /* memory input to preview / resizer */ ++}; ++ ++enum isp_irqevents { ++ CSIA = 0x01, ++ CSIB = 0x10, ++ CCDC_VD0 = 0x100, ++ CCDC_VD1 = 0x200, ++ CCDC_VD2 = 0x400, ++ CCDC_ERR = 0x800, ++ H3A_AWB_DONE = 0x2000, ++ H3A_AF_DONE = 0x1000, ++ HIST_DONE = 0x10000, ++ PREV_DONE = 0x100000, ++ LSC_DONE = 0x20000, ++ LSC_PRE_COMP = 0x40000, ++ LSC_PRE_ERR = 0x80000, ++ RESZ_DONE = 0x1000000, ++ SBL_OVF = 0x2000000, ++ MMU_ERR = 0x10000000, ++ OCP_ERR = 0x20000000, ++ HS_VS = 0x80000000 ++}; ++ ++enum isp_callback_type { ++ CBK_CCDC_VD0, ++ CBK_CCDC_VD1, ++ CBK_PREV_DONE, ++ CBK_RESZ_DONE, ++ CBK_MMU_ERR, ++ CBK_H3A_AWB_DONE, ++ CBK_HIST_DONE, ++ CBK_HS_VS, ++ CBK_LSC_ISR, ++ CBK_H3A_AF_DONE, ++ CBK_CATCHALL, ++ CBK_CSIA, ++ CBK_CSIB, ++ CBK_END, ++}; ++ ++/** ++ * struct isp_reg - Structure for ISP register values. ++ * @reg: 32-bit Register address. ++ * @val: 32-bit Register value. ++ */ ++struct isp_reg { ++ enum isp_mem_resources mmio_range; ++ u32 reg; ++ u32 val; ++}; ++ ++/** ++ * struct isp_interface_config - ISP interface configuration. ++ * @ccdc_par_ser: ISP interface type. 0 - Parallel, 1 - CSIA, 2 - CSIB to CCDC. ++ * @par_bridge: CCDC Bridge input control. Parallel interface. ++ * 0 - Disable, 1 - Enable, first byte->cam_d(bits 7 to 0) ++ * 2 - Enable, first byte -> cam_d(bits 15 to 8) ++ * @par_clk_pol: Pixel clock polarity on the parallel interface. ++ * 0 - Non Inverted, 1 - Inverted ++ * @dataline_shift: Data lane shifter. ++ * 0 - No Shift, 1 - CAMEXT[13 to 2]->CAM[11 to 0] ++ * 2 - CAMEXT[13 to 4]->CAM[9 to 0] ++ * 3 - CAMEXT[13 to 6]->CAM[7 to 0] ++ * @hsvs_syncdetect: HS or VS synchronization signal detection. ++ * 0 - HS Falling, 1 - HS rising ++ * 2 - VS falling, 3 - VS rising ++ * @strobe: Strobe related parameter. ++ * @prestrobe: PreStrobe related parameter. ++ * @shutter: Shutter related parameter. ++ * @hskip: Horizontal Start Pixel performed in Preview module. ++ * @vskip: Vertical Start Line performed in Preview module. ++ * @wenlog: Store the value for the sensor specific wenlog field. ++ * @wait_hs_vs: Wait for this many hs_vs before anything else in the beginning. ++ */ ++struct isp_interface_config { ++ enum isp_interface_type ccdc_par_ser; ++ u8 dataline_shift; ++ u32 hsvs_syncdetect; ++ int strobe; ++ int prestrobe; ++ int shutter; ++ u32 prev_sph; ++ u32 prev_slv; ++ u32 wenlog; ++ int wait_hs_vs; ++ union { ++ struct par { ++ unsigned par_bridge:2; ++ unsigned par_clk_pol:1; ++ } par; ++ struct csi { ++ unsigned crc:1; ++ unsigned mode:1; ++ unsigned edge:1; ++ unsigned signalling:1; ++ unsigned strobe_clock_inv:1; ++ unsigned vs_edge:1; ++ unsigned channel:3; ++ unsigned vpclk:2; /* Video port output clock */ ++ unsigned int data_start; ++ unsigned int data_size; ++ u32 format; /* V4L2_PIX_FMT_* */ ++ } csi; ++ } u; ++}; ++ ++u32 isp_reg_readl(enum isp_mem_resources isp_mmio_range, u32 reg_offset); ++ ++void isp_reg_writel(u32 reg_value, enum isp_mem_resources isp_mmio_range, ++ u32 reg_offset); ++ ++static inline void isp_reg_and(enum isp_mem_resources mmio_range, u32 reg, ++ u32 and_bits) ++{ ++ u32 v = isp_reg_readl(mmio_range, reg); ++ ++ isp_reg_writel(v & and_bits, mmio_range, reg); ++} ++ ++static inline void isp_reg_or(enum isp_mem_resources mmio_range, u32 reg, ++ u32 or_bits) ++{ ++ u32 v = isp_reg_readl(mmio_range, reg); ++ ++ isp_reg_writel(v | or_bits, mmio_range, reg); ++} ++ ++static inline void isp_reg_and_or(enum isp_mem_resources mmio_range, u32 reg, ++ u32 and_bits, u32 or_bits) ++{ ++ u32 v = isp_reg_readl(mmio_range, reg); ++ ++ isp_reg_writel((v & and_bits) | or_bits, mmio_range, reg); ++} ++ ++void isp_start(void); ++ ++void isp_stop(void); ++ ++int isp_buf_queue(struct videobuf_buffer *vb, ++ void (*complete)(struct videobuf_buffer *vb, void *priv), ++ void *priv); ++ ++int isp_vbq_setup(struct videobuf_queue *vbq, unsigned int *cnt, ++ unsigned int *size); ++ ++int isp_vbq_prepare(struct videobuf_queue *vbq, struct videobuf_buffer *vb, ++ enum v4l2_field field); ++ ++void isp_vbq_release(struct videobuf_queue *vbq, struct videobuf_buffer *vb); ++ ++int isp_set_callback(enum isp_callback_type type, isp_callback_t callback, ++ isp_vbq_callback_ptr arg1, void *arg2); ++ ++int isp_unset_callback(enum isp_callback_type type); ++ ++u32 isp_set_xclk(u32 xclk, u8 xclksel); ++ ++int isp_configure_interface(struct isp_interface_config *config); ++ ++int isp_get(void); ++ ++int isp_put(void); ++ ++int isp_queryctrl(struct v4l2_queryctrl *a); ++ ++int isp_querymenu(struct v4l2_querymenu *a); ++ ++int isp_g_ctrl(struct v4l2_control *a); ++ ++int isp_s_ctrl(struct v4l2_control *a); ++ ++int isp_enum_fmt_cap(struct v4l2_fmtdesc *f); ++ ++int isp_try_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++void isp_g_fmt_cap(struct v4l2_pix_format *pix); ++ ++int isp_s_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++int isp_g_crop(struct v4l2_crop *a); ++ ++int isp_s_crop(struct v4l2_crop *a, struct v4l2_pix_format *pix); ++ ++void isp_config_crop(struct v4l2_pix_format *pix); ++ ++int isp_try_fmt(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++int isp_handle_private(int cmd, void *arg); ++ ++void isp_save_context(struct isp_reg *); ++ ++void isp_restore_context(struct isp_reg *); ++ ++void isp_print_status(void); ++ ++int __init isp_ccdc_init(void); ++int __init isp_hist_init(void); ++int __init isph3a_aewb_init(void); ++int __init isp_preview_init(void); ++int __init isp_resizer_init(void); ++int __init isp_af_init(void); ++int __init isp_csi2_init(void); ++ ++void isp_ccdc_cleanup(void); ++void isp_hist_cleanup(void); ++void isph3a_aewb_cleanup(void); ++void isp_preview_cleanup(void); ++void isp_hist_cleanup(void); ++void isp_resizer_cleanup(void); ++void isp_af_exit(void); ++void isp_csi2_cleanup(void); ++ ++#endif /* OMAP_ISP_TOP_H */ +diff --git a/drivers/media/video/isp/ispreg.h b/drivers/media/video/isp/ispreg.h +new file mode 100644 +index 0000000..4f8e1ef +--- /dev/null ++++ b/drivers/media/video/isp/ispreg.h +@@ -0,0 +1,1674 @@ ++/* ++ * ispreg.h ++ * ++ * Header file for all the ISP module in TI's OMAP3 Camera ISP. ++ * It has the OMAP HW register definitions. ++ * ++ * Copyright (C) 2009 Texas Instruments. ++ * Copyright (C) 2009 Nokia. ++ * ++ * Contributors: ++ * Tuukka Toivonen ++ * Thara Gopinath ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef __ISPREG_H__ ++#define __ISPREG_H__ ++ ++#include ++ ++/* Note: Uncomment below defines as needed for enabling module specific debug ++ * messages ++ */ ++ ++/* ++ #define OMAP_ISPCTRL_DEBUG ++ #define OMAP_ISPCCDC_DEBUG ++ #define OMAP_ISPPREV_DEBUG ++ #define OMAP_ISPRESZ_DEBUG ++ #define OMAP_ISPMMU_DEBUG ++ #define OMAP_ISPH3A_DEBUG ++ #define OMAP_ISP_AF_DEBUG ++ #define OMAP_ISPHIST_DEBUG ++*/ ++ ++#ifdef OMAP_ISPCTRL_DEBUG ++#define DPRINTK_ISPCTRL(format, ...) \ ++ printk(KERN_INFO "ISPCTRL: " format, ## __VA_ARGS__) ++#define is_ispctrl_debug_enabled() 1 ++#else ++#define DPRINTK_ISPCTRL(format, ...) ++#define is_ispctrl_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPCCDC_DEBUG ++#define DPRINTK_ISPCCDC(format, ...) \ ++ printk(KERN_INFO "ISPCCDC: " format, ## __VA_ARGS__) ++#define is_ispccdc_debug_enabled() 1 ++#else ++#define DPRINTK_ISPCCDC(format, ...) ++#define is_ispccdc_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPPREV_DEBUG ++#define DPRINTK_ISPPREV(format, ...) \ ++ printk(KERN_INFO "ISPPREV: " format, ## __VA_ARGS__) ++#define is_ispprev_debug_enabled() 1 ++#else ++#define DPRINTK_ISPPREV(format, ...) ++#define is_ispprev_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPRESZ_DEBUG ++#define DPRINTK_ISPRESZ(format, ...) \ ++ printk(KERN_INFO "ISPRESZ: " format, ## __VA_ARGS__) ++#define is_ispresz_debug_enabled() 1 ++#else ++#define DPRINTK_ISPRESZ(format, ...) ++#define is_ispresz_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPMMU_DEBUG ++#define DPRINTK_ISPMMU(format, ...) \ ++ printk(KERN_INFO "ISPMMU: " format, ## __VA_ARGS__) ++#define is_ispmmu_debug_enabled() 1 ++#else ++#define DPRINTK_ISPMMU(format, ...) ++#define is_ispmmu_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPH3A_DEBUG ++#define DPRINTK_ISPH3A(format, ...) \ ++ printk(KERN_INFO "ISPH3A: " format, ## __VA_ARGS__) ++#define is_isph3a_debug_enabled() 1 ++#else ++#define DPRINTK_ISPH3A(format, ...) ++#define is_isph3a_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISP_AF_DEBUG ++#define DPRINTK_ISP_AF(format, ...) \ ++ printk(KERN_INFO "ISP_AF: " format, ## __VA_ARGS__) ++#define is_isp_af_debug_enabled() 1 ++#else ++#define DPRINTK_ISP_AF(format, ...) ++#define is_isp_af_debug_enabled() 0 ++#endif ++ ++#ifdef OMAP_ISPHIST_DEBUG ++#define DPRINTK_ISPHIST(format, ...) \ ++ printk(KERN_INFO "ISPHIST: " format, ## __VA_ARGS__) ++#define is_isphist_debug_enabled() 1 ++#else ++#define DPRINTK_ISPHIST(format, ...) ++#define is_isphist_debug_enabled() 0 ++#endif ++ ++#define ISP_32B_BOUNDARY_BUF 0xFFFFFFE0 ++#define ISP_32B_BOUNDARY_OFFSET 0x0000FFE0 ++ ++#define CM_CAM_MCLK_HZ 216000000 ++ ++/* ISP Submodules offset */ ++ ++#define OMAP3ISP_REG_BASE OMAP3430_ISP_BASE ++#define OMAP3ISP_REG(offset) (OMAP3ISP_REG_BASE + (offset)) ++ ++#define OMAP3ISP_CBUFF_REG_OFFSET 0x0100 ++#define OMAP3ISP_CBUFF_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_CBUFF_REG_OFFSET) ++#define OMAP3ISP_CBUFF_REG(offset) (OMAP3ISP_CBUFF_REG_BASE + (offset)) ++ ++#define OMAP3ISP_CCP2_REG_OFFSET 0x0400 ++#define OMAP3ISP_CCP2_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_CCP2_REG_OFFSET) ++#define OMAP3ISP_CCP2_REG(offset) (OMAP3ISP_CCP2_REG_BASE + (offset)) ++ ++#define OMAP3ISP_CCDC_REG_OFFSET 0x0600 ++#define OMAP3ISP_CCDC_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_CCDC_REG_OFFSET) ++#define OMAP3ISP_CCDC_REG(offset) (OMAP3ISP_CCDC_REG_BASE + (offset)) ++ ++#define OMAP3ISP_HIST_REG_OFFSET 0x0A00 ++#define OMAP3ISP_HIST_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_HIST_REG_OFFSET) ++#define OMAP3ISP_HIST_REG(offset) (OMAP3ISP_HIST_REG_BASE + (offset)) ++ ++#define OMAP3ISP_H3A_REG_OFFSET 0x0C00 ++#define OMAP3ISP_H3A_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_H3A_REG_OFFSET) ++#define OMAP3ISP_H3A_REG(offset) (OMAP3ISP_H3A_REG_BASE + (offset)) ++ ++#define OMAP3ISP_PREV_REG_OFFSET 0x0E00 ++#define OMAP3ISP_PREV_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_PREV_REG_OFFSET) ++#define OMAP3ISP_PREV_REG(offset) (OMAP3ISP_PREV_REG_BASE + (offset)) ++ ++#define OMAP3ISP_RESZ_REG_OFFSET 0x1000 ++#define OMAP3ISP_RESZ_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_RESZ_REG_OFFSET) ++#define OMAP3ISP_RESZ_REG(offset) (OMAP3ISP_RESZ_REG_BASE + (offset)) ++ ++#define OMAP3ISP_SBL_REG_OFFSET 0x1200 ++#define OMAP3ISP_SBL_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_SBL_REG_OFFSET) ++#define OMAP3ISP_SBL_REG(offset) (OMAP3ISP_SBL_REG_BASE + (offset)) ++ ++#define OMAP3ISP_MMU_REG_OFFSET 0x1400 ++#define OMAP3ISP_MMU_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_MMU_REG_OFFSET) ++#define OMAP3ISP_MMU_REG(offset) (OMAP3ISP_MMU_REG_BASE + (offset)) ++ ++#define OMAP3ISP_CSI2A_REG_OFFSET 0x1800 ++#define OMAP3ISP_CSI2A_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_CSI2A_REG_OFFSET) ++#define OMAP3ISP_CSI2A_REG(offset) (OMAP3ISP_CSI2A_REG_BASE + (offset)) ++ ++#define OMAP3ISP_CSI2PHY_REG_OFFSET 0x1970 ++#define OMAP3ISP_CSI2PHY_REG_BASE (OMAP3ISP_REG_BASE + \ ++ OMAP3ISP_CSI2PHY_REG_OFFSET) ++#define OMAP3ISP_CSI2PHY_REG(offset) (OMAP3ISP_CSI2PHY_REG_BASE + (offset)) ++ ++/* ISP module register offset */ ++ ++#define ISP_REVISION (0x000) ++#define ISP_SYSCONFIG (0x004) ++#define ISP_SYSSTATUS (0x008) ++#define ISP_IRQ0ENABLE (0x00C) ++#define ISP_IRQ0STATUS (0x010) ++#define ISP_IRQ1ENABLE (0x014) ++#define ISP_IRQ1STATUS (0x018) ++#define ISP_TCTRL_GRESET_LENGTH (0x030) ++#define ISP_TCTRL_PSTRB_REPLAY (0x034) ++#define ISP_CTRL (0x040) ++#define ISP_SECURE (0x044) ++#define ISP_TCTRL_CTRL (0x050) ++#define ISP_TCTRL_FRAME (0x054) ++#define ISP_TCTRL_PSTRB_DELAY (0x058) ++#define ISP_TCTRL_STRB_DELAY (0x05C) ++#define ISP_TCTRL_SHUT_DELAY (0x060) ++#define ISP_TCTRL_PSTRB_LENGTH (0x064) ++#define ISP_TCTRL_STRB_LENGTH (0x068) ++#define ISP_TCTRL_SHUT_LENGTH (0x06C) ++#define ISP_PING_PONG_ADDR (0x070) ++#define ISP_PING_PONG_MEM_RANGE (0x074) ++#define ISP_PING_PONG_BUF_SIZE (0x078) ++ ++/* CSI1 receiver registers (ES2.0) */ ++#define ISPCSI1_REVISION (0x000) ++#define ISPCSI1_SYSCONFIG (0x004) ++#define ISPCSI1_SYSSTATUS (0x008) ++#define ISPCSI1_LC01_IRQENABLE (0x00C) ++#define ISPCSI1_LC01_IRQSTATUS (0x010) ++#define ISPCSI1_LC23_IRQENABLE (0x014) ++#define ISPCSI1_LC23_IRQSTATUS (0x018) ++#define ISPCSI1_LCM_IRQENABLE (0x02C) ++#define ISPCSI1_LCM_IRQSTATUS (0x030) ++#define ISPCSI1_CTRL (0x040) ++#define ISPCSI1_DBG (0x044) ++#define ISPCSI1_GNQ (0x048) ++#define ISPCSI1_LCx_CTRL(x) ((0x050)+0x30*(x)) ++#define ISPCSI1_LCx_CODE(x) ((0x054)+0x30*(x)) ++#define ISPCSI1_LCx_STAT_START(x) ((0x058)+0x30*(x)) ++#define ISPCSI1_LCx_STAT_SIZE(x) ((0x05C)+0x30*(x)) ++#define ISPCSI1_LCx_SOF_ADDR(x) ((0x060)+0x30*(x)) ++#define ISPCSI1_LCx_EOF_ADDR(x) ((0x064)+0x30*(x)) ++#define ISPCSI1_LCx_DAT_START(x) ((0x068)+0x30*(x)) ++#define ISPCSI1_LCx_DAT_SIZE(x) ((0x06C)+0x30*(x)) ++#define ISPCSI1_LCx_DAT_PING_ADDR(x) ((0x070)+0x30*(x)) ++#define ISPCSI1_LCx_DAT_PONG_ADDR(x) ((0x074)+0x30*(x)) ++#define ISPCSI1_LCx_DAT_OFST(x) ((0x078)+0x30*(x)) ++#define ISPCSI1_LCM_CTRL (0x1D0) ++#define ISPCSI1_LCM_VSIZE (0x1D4) ++#define ISPCSI1_LCM_HSIZE (0x1D8) ++#define ISPCSI1_LCM_PREFETCH (0x1DC) ++#define ISPCSI1_LCM_SRC_ADDR (0x1E0) ++#define ISPCSI1_LCM_SRC_OFST (0x1E4) ++#define ISPCSI1_LCM_DST_ADDR (0x1E8) ++#define ISPCSI1_LCM_DST_OFST (0x1EC) ++#define ISP_CSIB_SYSCONFIG ISPCSI1_SYSCONFIG ++#define ISP_CSIA_SYSCONFIG ISPCSI2_SYSCONFIG ++ ++/* ISP_CBUFF Registers */ ++ ++#define ISP_CBUFF_SYSCONFIG (0x010) ++#define ISP_CBUFF_IRQENABLE (0x01C) ++ ++#define ISP_CBUFF0_CTRL (0x020) ++#define ISP_CBUFF1_CTRL (0x024) ++ ++#define ISP_CBUFF0_START (0x040) ++#define ISP_CBUFF1_START (0x044) ++ ++#define ISP_CBUFF0_END (0x050) ++#define ISP_CBUFF1_END (0x054) ++ ++#define ISP_CBUFF0_WINDOWSIZE (0x060) ++#define ISP_CBUFF1_WINDOWSIZE (0x064) ++ ++#define ISP_CBUFF0_THRESHOLD (0x070) ++#define ISP_CBUFF1_THRESHOLD (0x074) ++ ++/* CCDC module register offset */ ++ ++#define ISPCCDC_PID (0x000) ++#define ISPCCDC_PCR (0x004) ++#define ISPCCDC_SYN_MODE (0x008) ++#define ISPCCDC_HD_VD_WID (0x00C) ++#define ISPCCDC_PIX_LINES (0x010) ++#define ISPCCDC_HORZ_INFO (0x014) ++#define ISPCCDC_VERT_START (0x018) ++#define ISPCCDC_VERT_LINES (0x01C) ++#define ISPCCDC_CULLING (0x020) ++#define ISPCCDC_HSIZE_OFF (0x024) ++#define ISPCCDC_SDOFST (0x028) ++#define ISPCCDC_SDR_ADDR (0x02C) ++#define ISPCCDC_CLAMP (0x030) ++#define ISPCCDC_DCSUB (0x034) ++#define ISPCCDC_COLPTN (0x038) ++#define ISPCCDC_BLKCMP (0x03C) ++#define ISPCCDC_FPC (0x040) ++#define ISPCCDC_FPC_ADDR (0x044) ++#define ISPCCDC_VDINT (0x048) ++#define ISPCCDC_ALAW (0x04C) ++#define ISPCCDC_REC656IF (0x050) ++#define ISPCCDC_CFG (0x054) ++#define ISPCCDC_FMTCFG (0x058) ++#define ISPCCDC_FMT_HORZ (0x05C) ++#define ISPCCDC_FMT_VERT (0x060) ++#define ISPCCDC_FMT_ADDR0 (0x064) ++#define ISPCCDC_FMT_ADDR1 (0x068) ++#define ISPCCDC_FMT_ADDR2 (0x06C) ++#define ISPCCDC_FMT_ADDR3 (0x070) ++#define ISPCCDC_FMT_ADDR4 (0x074) ++#define ISPCCDC_FMT_ADDR5 (0x078) ++#define ISPCCDC_FMT_ADDR6 (0x07C) ++#define ISPCCDC_FMT_ADDR7 (0x080) ++#define ISPCCDC_PRGEVEN0 (0x084) ++#define ISPCCDC_PRGEVEN1 (0x088) ++#define ISPCCDC_PRGODD0 (0x08C) ++#define ISPCCDC_PRGODD1 (0x090) ++#define ISPCCDC_VP_OUT (0x094) ++ ++#define ISPCCDC_LSC_CONFIG (0x098) ++#define ISPCCDC_LSC_INITIAL (0x09C) ++#define ISPCCDC_LSC_TABLE_BASE (0x0A0) ++#define ISPCCDC_LSC_TABLE_OFFSET (0x0A4) ++ ++/* SBL */ ++#define ISPSBL_CCDC_WR_0 (0x028) ++#define ISPSBL_CCDC_WR_0_DATA_READY (1 << 21) ++#define ISPSBL_CCDC_WR_1 (0x02C) ++#define ISPSBL_CCDC_WR_2 (0x030) ++#define ISPSBL_CCDC_WR_3 (0x034) ++ ++/* Histogram registers */ ++#define ISPHIST_PID (0x000) ++#define ISPHIST_PCR (0x004) ++#define ISPHIST_CNT (0x008) ++#define ISPHIST_WB_GAIN (0x00C) ++#define ISPHIST_R0_HORZ (0x010) ++#define ISPHIST_R0_VERT (0x014) ++#define ISPHIST_R1_HORZ (0x018) ++#define ISPHIST_R1_VERT (0x01C) ++#define ISPHIST_R2_HORZ (0x020) ++#define ISPHIST_R2_VERT (0x024) ++#define ISPHIST_R3_HORZ (0x028) ++#define ISPHIST_R3_VERT (0x02C) ++#define ISPHIST_ADDR (0x030) ++#define ISPHIST_DATA (0x034) ++#define ISPHIST_RADD (0x038) ++#define ISPHIST_RADD_OFF (0x03C) ++#define ISPHIST_H_V_INFO (0x040) ++ ++/* H3A module registers */ ++#define ISPH3A_PID (0x000) ++#define ISPH3A_PCR (0x004) ++#define ISPH3A_AEWWIN1 (0x04C) ++#define ISPH3A_AEWINSTART (0x050) ++#define ISPH3A_AEWINBLK (0x054) ++#define ISPH3A_AEWSUBWIN (0x058) ++#define ISPH3A_AEWBUFST (0x05C) ++#define ISPH3A_AFPAX1 (0x008) ++#define ISPH3A_AFPAX2 (0x00C) ++#define ISPH3A_AFPAXSTART (0x010) ++#define ISPH3A_AFIIRSH (0x014) ++#define ISPH3A_AFBUFST (0x018) ++#define ISPH3A_AFCOEF010 (0x01C) ++#define ISPH3A_AFCOEF032 (0x020) ++#define ISPH3A_AFCOEF054 (0x024) ++#define ISPH3A_AFCOEF076 (0x028) ++#define ISPH3A_AFCOEF098 (0x02C) ++#define ISPH3A_AFCOEF0010 (0x030) ++#define ISPH3A_AFCOEF110 (0x034) ++#define ISPH3A_AFCOEF132 (0x038) ++#define ISPH3A_AFCOEF154 (0x03C) ++#define ISPH3A_AFCOEF176 (0x040) ++#define ISPH3A_AFCOEF198 (0x044) ++#define ISPH3A_AFCOEF1010 (0x048) ++ ++#define ISPPRV_PCR (0x004) ++#define ISPPRV_HORZ_INFO (0x008) ++#define ISPPRV_VERT_INFO (0x00C) ++#define ISPPRV_RSDR_ADDR (0x010) ++#define ISPPRV_RADR_OFFSET (0x014) ++#define ISPPRV_DSDR_ADDR (0x018) ++#define ISPPRV_DRKF_OFFSET (0x01C) ++#define ISPPRV_WSDR_ADDR (0x020) ++#define ISPPRV_WADD_OFFSET (0x024) ++#define ISPPRV_AVE (0x028) ++#define ISPPRV_HMED (0x02C) ++#define ISPPRV_NF (0x030) ++#define ISPPRV_WB_DGAIN (0x034) ++#define ISPPRV_WBGAIN (0x038) ++#define ISPPRV_WBSEL (0x03C) ++#define ISPPRV_CFA (0x040) ++#define ISPPRV_BLKADJOFF (0x044) ++#define ISPPRV_RGB_MAT1 (0x048) ++#define ISPPRV_RGB_MAT2 (0x04C) ++#define ISPPRV_RGB_MAT3 (0x050) ++#define ISPPRV_RGB_MAT4 (0x054) ++#define ISPPRV_RGB_MAT5 (0x058) ++#define ISPPRV_RGB_OFF1 (0x05C) ++#define ISPPRV_RGB_OFF2 (0x060) ++#define ISPPRV_CSC0 (0x064) ++#define ISPPRV_CSC1 (0x068) ++#define ISPPRV_CSC2 (0x06C) ++#define ISPPRV_CSC_OFFSET (0x070) ++#define ISPPRV_CNT_BRT (0x074) ++#define ISPPRV_CSUP (0x078) ++#define ISPPRV_SETUP_YC (0x07C) ++#define ISPPRV_SET_TBL_ADDR (0x080) ++#define ISPPRV_SET_TBL_DATA (0x084) ++#define ISPPRV_CDC_THR0 (0x090) ++#define ISPPRV_CDC_THR1 (ISPPRV_CDC_THR0 + (0x4)) ++#define ISPPRV_CDC_THR2 (ISPPRV_CDC_THR0 + (0x4) * 2) ++#define ISPPRV_CDC_THR3 (ISPPRV_CDC_THR0 + (0x4) * 3) ++ ++#define ISPPRV_REDGAMMA_TABLE_ADDR 0x0000 ++#define ISPPRV_GREENGAMMA_TABLE_ADDR 0x0400 ++#define ISPPRV_BLUEGAMMA_TABLE_ADDR 0x0800 ++#define ISPPRV_NF_TABLE_ADDR 0x0C00 ++#define ISPPRV_YENH_TABLE_ADDR 0x1000 ++#define ISPPRV_CFA_TABLE_ADDR 0x1400 ++ ++#define ISPPRV_MAXOUTPUT_WIDTH 1280 ++#define ISPPRV_MAXOUTPUT_WIDTH_ES2 3300 ++#define ISPRSZ_MIN_OUTPUT 64 ++#define ISPRSZ_MAX_OUTPUT 3312 ++ ++/* Resizer module register offset */ ++#define ISPRSZ_PID (0x000) ++#define ISPRSZ_PCR (0x004) ++#define ISPRSZ_CNT (0x008) ++#define ISPRSZ_OUT_SIZE (0x00C) ++#define ISPRSZ_IN_START (0x010) ++#define ISPRSZ_IN_SIZE (0x014) ++#define ISPRSZ_SDR_INADD (0x018) ++#define ISPRSZ_SDR_INOFF (0x01C) ++#define ISPRSZ_SDR_OUTADD (0x020) ++#define ISPRSZ_SDR_OUTOFF (0x024) ++#define ISPRSZ_HFILT10 (0x028) ++#define ISPRSZ_HFILT32 (0x02C) ++#define ISPRSZ_HFILT54 (0x030) ++#define ISPRSZ_HFILT76 (0x034) ++#define ISPRSZ_HFILT98 (0x038) ++#define ISPRSZ_HFILT1110 (0x03C) ++#define ISPRSZ_HFILT1312 (0x040) ++#define ISPRSZ_HFILT1514 (0x044) ++#define ISPRSZ_HFILT1716 (0x048) ++#define ISPRSZ_HFILT1918 (0x04C) ++#define ISPRSZ_HFILT2120 (0x050) ++#define ISPRSZ_HFILT2322 (0x054) ++#define ISPRSZ_HFILT2524 (0x058) ++#define ISPRSZ_HFILT2726 (0x05C) ++#define ISPRSZ_HFILT2928 (0x060) ++#define ISPRSZ_HFILT3130 (0x064) ++#define ISPRSZ_VFILT10 (0x068) ++#define ISPRSZ_VFILT32 (0x06C) ++#define ISPRSZ_VFILT54 (0x070) ++#define ISPRSZ_VFILT76 (0x074) ++#define ISPRSZ_VFILT98 (0x078) ++#define ISPRSZ_VFILT1110 (0x07C) ++#define ISPRSZ_VFILT1312 (0x080) ++#define ISPRSZ_VFILT1514 (0x084) ++#define ISPRSZ_VFILT1716 (0x088) ++#define ISPRSZ_VFILT1918 (0x08C) ++#define ISPRSZ_VFILT2120 (0x090) ++#define ISPRSZ_VFILT2322 (0x094) ++#define ISPRSZ_VFILT2524 (0x098) ++#define ISPRSZ_VFILT2726 (0x09C) ++#define ISPRSZ_VFILT2928 (0x0A0) ++#define ISPRSZ_VFILT3130 (0x0A4) ++#define ISPRSZ_YENH (0x0A8) ++ ++/* MMU module registers */ ++#define ISPMMU_REVISION (0x000) ++#define ISPMMU_SYSCONFIG (0x010) ++#define ISPMMU_SYSSTATUS (0x014) ++#define ISPMMU_IRQSTATUS (0x018) ++#define ISPMMU_IRQENABLE (0x01C) ++#define ISPMMU_WALKING_ST (0x040) ++#define ISPMMU_CNTL (0x044) ++#define ISPMMU_FAULT_AD (0x048) ++#define ISPMMU_TTB (0x04C) ++#define ISPMMU_LOCK (0x050) ++#define ISPMMU_LD_TLB (0x054) ++#define ISPMMU_CAM (0x058) ++#define ISPMMU_RAM (0x05C) ++#define ISPMMU_GFLUSH (0x060) ++#define ISPMMU_FLUSH_ENTRY (0x064) ++#define ISPMMU_READ_CAM (0x068) ++#define ISPMMU_READ_RAM (0x06c) ++#define ISPMMU_EMU_FAULT_AD (0x070) ++ ++#define ISP_INT_CLR 0xFF113F11 ++#define ISPPRV_PCR_EN 1 ++#define ISPPRV_PCR_BUSY (1 << 1) ++#define ISPPRV_PCR_SOURCE (1 << 2) ++#define ISPPRV_PCR_ONESHOT (1 << 3) ++#define ISPPRV_PCR_WIDTH (1 << 4) ++#define ISPPRV_PCR_INVALAW (1 << 5) ++#define ISPPRV_PCR_DRKFEN (1 << 6) ++#define ISPPRV_PCR_DRKFCAP (1 << 7) ++#define ISPPRV_PCR_HMEDEN (1 << 8) ++#define ISPPRV_PCR_NFEN (1 << 9) ++#define ISPPRV_PCR_CFAEN (1 << 10) ++#define ISPPRV_PCR_CFAFMT_SHIFT 11 ++#define ISPPRV_PCR_CFAFMT_MASK 0x7800 ++#define ISPPRV_PCR_CFAFMT_BAYER (0 << 11) ++#define ISPPRV_PCR_CFAFMT_SONYVGA (1 << 11) ++#define ISPPRV_PCR_CFAFMT_RGBFOVEON (2 << 11) ++#define ISPPRV_PCR_CFAFMT_DNSPL (3 << 11) ++#define ISPPRV_PCR_CFAFMT_HONEYCOMB (4 << 11) ++#define ISPPRV_PCR_CFAFMT_RRGGBBFOVEON (5 << 11) ++#define ISPPRV_PCR_YNENHEN (1 << 15) ++#define ISPPRV_PCR_SUPEN (1 << 16) ++#define ISPPRV_PCR_YCPOS_SHIFT 17 ++#define ISPPRV_PCR_YCPOS_YCrYCb (0 << 17) ++#define ISPPRV_PCR_YCPOS_YCbYCr (1 << 17) ++#define ISPPRV_PCR_YCPOS_CbYCrY (2 << 17) ++#define ISPPRV_PCR_YCPOS_CrYCbY (3 << 17) ++#define ISPPRV_PCR_RSZPORT (1 << 19) ++#define ISPPRV_PCR_SDRPORT (1 << 20) ++#define ISPPRV_PCR_SCOMP_EN (1 << 21) ++#define ISPPRV_PCR_SCOMP_SFT_SHIFT (22) ++#define ISPPRV_PCR_SCOMP_SFT_MASK (~(7 << 22)) ++#define ISPPRV_PCR_GAMMA_BYPASS (1 << 26) ++#define ISPPRV_PCR_DCOREN (1 << 27) ++#define ISPPRV_PCR_DCCOUP (1 << 28) ++#define ISPPRV_PCR_DRK_FAIL (1 << 31) ++ ++#define ISPPRV_HORZ_INFO_EPH_SHIFT 0 ++#define ISPPRV_HORZ_INFO_EPH_MASK 0x3fff ++#define ISPPRV_HORZ_INFO_SPH_SHIFT 16 ++#define ISPPRV_HORZ_INFO_SPH_MASK 0x3fff0 ++ ++#define ISPPRV_VERT_INFO_ELV_SHIFT 0 ++#define ISPPRV_VERT_INFO_ELV_MASK 0x3fff ++#define ISPPRV_VERT_INFO_SLV_SHIFT 16 ++#define ISPPRV_VERT_INFO_SLV_MASK 0x3fff0 ++ ++#define ISPPRV_AVE_EVENDIST_SHIFT 2 ++#define ISPPRV_AVE_EVENDIST_1 0x0 ++#define ISPPRV_AVE_EVENDIST_2 0x1 ++#define ISPPRV_AVE_EVENDIST_3 0x2 ++#define ISPPRV_AVE_EVENDIST_4 0x3 ++#define ISPPRV_AVE_ODDDIST_SHIFT 4 ++#define ISPPRV_AVE_ODDDIST_1 0x0 ++#define ISPPRV_AVE_ODDDIST_2 0x1 ++#define ISPPRV_AVE_ODDDIST_3 0x2 ++#define ISPPRV_AVE_ODDDIST_4 0x3 ++ ++#define ISPPRV_HMED_THRESHOLD_SHIFT 0 ++#define ISPPRV_HMED_EVENDIST (1 << 8) ++#define ISPPRV_HMED_ODDDIST (1 << 9) ++ ++#define ISPPRV_WBGAIN_COEF0_SHIFT 0 ++#define ISPPRV_WBGAIN_COEF1_SHIFT 8 ++#define ISPPRV_WBGAIN_COEF2_SHIFT 16 ++#define ISPPRV_WBGAIN_COEF3_SHIFT 24 ++ ++#define ISPPRV_WBSEL_COEF0 0x0 ++#define ISPPRV_WBSEL_COEF1 0x1 ++#define ISPPRV_WBSEL_COEF2 0x2 ++#define ISPPRV_WBSEL_COEF3 0x3 ++ ++#define ISPPRV_WBSEL_N0_0_SHIFT 0 ++#define ISPPRV_WBSEL_N0_1_SHIFT 2 ++#define ISPPRV_WBSEL_N0_2_SHIFT 4 ++#define ISPPRV_WBSEL_N0_3_SHIFT 6 ++#define ISPPRV_WBSEL_N1_0_SHIFT 8 ++#define ISPPRV_WBSEL_N1_1_SHIFT 10 ++#define ISPPRV_WBSEL_N1_2_SHIFT 12 ++#define ISPPRV_WBSEL_N1_3_SHIFT 14 ++#define ISPPRV_WBSEL_N2_0_SHIFT 16 ++#define ISPPRV_WBSEL_N2_1_SHIFT 18 ++#define ISPPRV_WBSEL_N2_2_SHIFT 20 ++#define ISPPRV_WBSEL_N2_3_SHIFT 22 ++#define ISPPRV_WBSEL_N3_0_SHIFT 24 ++#define ISPPRV_WBSEL_N3_1_SHIFT 26 ++#define ISPPRV_WBSEL_N3_2_SHIFT 28 ++#define ISPPRV_WBSEL_N3_3_SHIFT 30 ++ ++#define ISPPRV_CFA_GRADTH_HOR_SHIFT 0 ++#define ISPPRV_CFA_GRADTH_VER_SHIFT 8 ++ ++#define ISPPRV_BLKADJOFF_B_SHIFT 0 ++#define ISPPRV_BLKADJOFF_G_SHIFT 8 ++#define ISPPRV_BLKADJOFF_R_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT1_MTX_RR_SHIFT 0 ++#define ISPPRV_RGB_MAT1_MTX_GR_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT2_MTX_BR_SHIFT 0 ++#define ISPPRV_RGB_MAT2_MTX_RG_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT3_MTX_GG_SHIFT 0 ++#define ISPPRV_RGB_MAT3_MTX_BG_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT4_MTX_RB_SHIFT 0 ++#define ISPPRV_RGB_MAT4_MTX_GB_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT5_MTX_BB_SHIFT 0 ++ ++#define ISPPRV_RGB_OFF1_MTX_OFFG_SHIFT 0 ++#define ISPPRV_RGB_OFF1_MTX_OFFR_SHIFT 16 ++ ++#define ISPPRV_RGB_OFF2_MTX_OFFB_SHIFT 0 ++ ++#define ISPPRV_CSC0_RY_SHIFT 0 ++#define ISPPRV_CSC0_GY_SHIFT 10 ++#define ISPPRV_CSC0_BY_SHIFT 20 ++ ++#define ISPPRV_CSC1_RCB_SHIFT 0 ++#define ISPPRV_CSC1_GCB_SHIFT 10 ++#define ISPPRV_CSC1_BCB_SHIFT 20 ++ ++#define ISPPRV_CSC2_RCR_SHIFT 0 ++#define ISPPRV_CSC2_GCR_SHIFT 10 ++#define ISPPRV_CSC2_BCR_SHIFT 20 ++ ++#define ISPPRV_CSC_OFFSET_CR_SHIFT 0 ++#define ISPPRV_CSC_OFFSET_CB_SHIFT 8 ++#define ISPPRV_CSC_OFFSET_Y_SHIFT 16 ++ ++#define ISPPRV_CNT_BRT_BRT_SHIFT 0 ++#define ISPPRV_CNT_BRT_CNT_SHIFT 8 ++ ++#define ISPPRV_CONTRAST_MAX 0x10 ++#define ISPPRV_CONTRAST_MIN 0xFF ++#define ISPPRV_BRIGHT_MIN 0x00 ++#define ISPPRV_BRIGHT_MAX 0xFF ++ ++#define ISPPRV_CSUP_CSUPG_SHIFT 0 ++#define ISPPRV_CSUP_THRES_SHIFT 8 ++#define ISPPRV_CSUP_HPYF_SHIFT 16 ++ ++#define ISPPRV_SETUP_YC_MINC_SHIFT 0 ++#define ISPPRV_SETUP_YC_MAXC_SHIFT 8 ++#define ISPPRV_SETUP_YC_MINY_SHIFT 16 ++#define ISPPRV_SETUP_YC_MAXY_SHIFT 24 ++#define ISPPRV_YC_MAX 0xFF ++#define ISPPRV_YC_MIN 0x0 ++ ++/* Define bit fields within selected registers */ ++#define ISP_REVISION_SHIFT 0 ++ ++#define ISP_SYSCONFIG_AUTOIDLE 0 ++#define ISP_SYSCONFIG_SOFTRESET (1 << 1) ++#define ISP_SYSCONFIG_MIDLEMODE_SHIFT 12 ++#define ISP_SYSCONFIG_MIDLEMODE_FORCESTANDBY 0x0 ++#define ISP_SYSCONFIG_MIDLEMODE_NOSTANBY 0x1 ++#define ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY 0x2 ++ ++#define ISP_SYSSTATUS_RESETDONE 0 ++ ++#define IRQ0ENABLE_CSIA_IRQ 1 ++#define IRQ0ENABLE_CSIA_LC1_IRQ (1 << 1) ++#define IRQ0ENABLE_CSIA_LC2_IRQ (1 << 2) ++#define IRQ0ENABLE_CSIA_LC3_IRQ (1 << 3) ++#define IRQ0ENABLE_CSIB_IRQ (1 << 4) ++#define IRQ0ENABLE_CSIB_LC1_IRQ (1 << 5) ++#define IRQ0ENABLE_CSIB_LC2_IRQ (1 << 6) ++#define IRQ0ENABLE_CSIB_LC3_IRQ (1 << 7) ++#define IRQ0ENABLE_CCDC_VD0_IRQ (1 << 8) ++#define IRQ0ENABLE_CCDC_VD1_IRQ (1 << 9) ++#define IRQ0ENABLE_CCDC_VD2_IRQ (1 << 10) ++#define IRQ0ENABLE_CCDC_ERR_IRQ (1 << 11) ++#define IRQ0ENABLE_H3A_AF_DONE_IRQ (1 << 12) ++#define IRQ0ENABLE_H3A_AWB_DONE_IRQ (1 << 13) ++#define IRQ0ENABLE_HIST_DONE_IRQ (1 << 16) ++#define IRQ0ENABLE_CCDC_LSC_DONE_IRQ (1 << 17) ++#define IRQ0ENABLE_CCDC_LSC_PREF_COMP_IRQ (1 << 18) ++#define IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ (1 << 19) ++#define IRQ0ENABLE_PRV_DONE_IRQ (1 << 20) ++#define IRQ0ENABLE_RSZ_DONE_IRQ (1 << 24) ++#define IRQ0ENABLE_OVF_IRQ (1 << 25) ++#define IRQ0ENABLE_PING_IRQ (1 << 26) ++#define IRQ0ENABLE_PONG_IRQ (1 << 27) ++#define IRQ0ENABLE_MMU_ERR_IRQ (1 << 28) ++#define IRQ0ENABLE_OCP_ERR_IRQ (1 << 29) ++#define IRQ0ENABLE_SEC_ERR_IRQ (1 << 30) ++#define IRQ0ENABLE_HS_VS_IRQ (1 << 31) ++ ++#define IRQ0STATUS_CSIA_IRQ 1 ++#define IRQ0STATUS_CSIA_LC1_IRQ (1 << 1) ++#define IRQ0STATUS_CSIA_LC2_IRQ (1 << 2) ++#define IRQ0STATUS_CSIA_LC3_IRQ (1 << 3) ++#define IRQ0STATUS_CSIB_IRQ (1 << 4) ++#define IRQ0STATUS_CSIB_LC1_IRQ (1 << 5) ++#define IRQ0STATUS_CSIB_LC2_IRQ (1 << 6) ++#define IRQ0STATUS_CSIB_LC3_IRQ (1 << 7) ++#define IRQ0STATUS_CCDC_VD0_IRQ (1 << 8) ++#define IRQ0STATUS_CCDC_VD1_IRQ (1 << 9) ++#define IRQ0STATUS_CCDC_VD2_IRQ (1 << 10) ++#define IRQ0STATUS_CCDC_ERR_IRQ (1 << 11) ++#define IRQ0STATUS_H3A_AF_DONE_IRQ (1 << 12) ++#define IRQ0STATUS_H3A_AWB_DONE_IRQ (1 << 13) ++#define IRQ0STATUS_HIST_DONE_IRQ (1 << 16) ++#define IRQ0STATUS_PRV_DONE_IRQ (1 << 20) ++#define IRQ0STATUS_RSZ_DONE_IRQ (1 << 24) ++#define IRQ0STATUS_OVF_IRQ (1 << 25) ++#define IRQ0STATUS_PING_IRQ (1 << 26) ++#define IRQ0STATUS_PONG_IRQ (1 << 27) ++#define IRQ0STATUS_MMU_ERR_IRQ (1 << 28) ++#define IRQ0STATUS_OCP_ERR_IRQ (1 << 29) ++#define IRQ0STATUS_SEC_ERR_IRQ (1 << 30) ++#define IRQ0STATUS_HS_VS_IRQ (1 << 31) ++ ++#define TCTRL_GRESET_LEN 0 ++ ++#define TCTRL_PSTRB_REPLAY_DELAY 0 ++#define TCTRL_PSTRB_REPLAY_COUNTER_SHIFT 25 ++ ++#define ISPCTRL_PAR_SER_CLK_SEL_PARALLEL 0x0 ++#define ISPCTRL_PAR_SER_CLK_SEL_CSIA 0x1 ++#define ISPCTRL_PAR_SER_CLK_SEL_CSIB 0x2 ++#define ISPCTRL_PAR_SER_CLK_SEL_MASK 0xFFFFFFFC ++ ++#define ISPCTRL_PAR_BRIDGE_SHIFT 2 ++#define ISPCTRL_PAR_BRIDGE_DISABLE (0x0 << 2) ++#define ISPCTRL_PAR_BRIDGE_LENDIAN (0x2 << 2) ++#define ISPCTRL_PAR_BRIDGE_BENDIAN (0x3 << 2) ++ ++#define ISPCTRL_PAR_CLK_POL_SHIFT 4 ++#define ISPCTRL_PAR_CLK_POL_INV (1 << 4) ++#define ISPCTRL_PING_PONG_EN (1 << 5) ++#define ISPCTRL_SHIFT_SHIFT 6 ++#define ISPCTRL_SHIFT_0 (0x0 << 6) ++#define ISPCTRL_SHIFT_2 (0x1 << 6) ++#define ISPCTRL_SHIFT_4 (0x2 << 6) ++#define ISPCTRL_SHIFT_MASK (~(0x3 << 6)) ++ ++#define ISPCTRL_CCDC_CLK_EN (1 << 8) ++#define ISPCTRL_SCMP_CLK_EN (1 << 9) ++#define ISPCTRL_H3A_CLK_EN (1 << 10) ++#define ISPCTRL_HIST_CLK_EN (1 << 11) ++#define ISPCTRL_PREV_CLK_EN (1 << 12) ++#define ISPCTRL_RSZ_CLK_EN (1 << 13) ++#define ISPCTRL_SYNC_DETECT_SHIFT 14 ++#define ISPCTRL_SYNC_DETECT_HSFALL (0x0 << ISPCTRL_SYNC_DETECT_SHIFT) ++#define ISPCTRL_SYNC_DETECT_HSRISE (0x1 << ISPCTRL_SYNC_DETECT_SHIFT) ++#define ISPCTRL_SYNC_DETECT_VSFALL (0x2 << ISPCTRL_SYNC_DETECT_SHIFT) ++#define ISPCTRL_SYNC_DETECT_VSRISE (0x3 << ISPCTRL_SYNC_DETECT_SHIFT) ++#define ISPCTRL_SYNC_DETECT_MASK (0x3 << ISPCTRL_SYNC_DETECT_SHIFT) ++ ++#define ISPCTRL_CCDC_RAM_EN (1 << 16) ++#define ISPCTRL_PREV_RAM_EN (1 << 17) ++#define ISPCTRL_SBL_RD_RAM_EN (1 << 18) ++#define ISPCTRL_SBL_WR1_RAM_EN (1 << 19) ++#define ISPCTRL_SBL_WR0_RAM_EN (1 << 20) ++#define ISPCTRL_SBL_AUTOIDLE (1 << 21) ++#define ISPCTRL_SBL_SHARED_RPORTB (1 << 28) ++#define ISPCTRL_JPEG_FLUSH (1 << 30) ++#define ISPCTRL_CCDC_FLUSH (1 << 31) ++ ++#define ISPSECURE_SECUREMODE 0 ++ ++#define ISPTCTRL_CTRL_DIV_LOW 0x0 ++#define ISPTCTRL_CTRL_DIV_HIGH 0x1 ++#define ISPTCTRL_CTRL_DIV_BYPASS 0x1F ++ ++#define ISPTCTRL_CTRL_DIVA_SHIFT 0 ++#define ISPTCTRL_CTRL_DIVA_MASK (0x1F << ISPTCTRL_CTRL_DIVA_SHIFT) ++ ++#define ISPTCTRL_CTRL_DIVB_SHIFT 5 ++#define ISPTCTRL_CTRL_DIVB_MASK (0x1F << ISPTCTRL_CTRL_DIVB_SHIFT) ++ ++#define ISPTCTRL_CTRL_DIVC_SHIFT 10 ++#define ISPTCTRL_CTRL_DIVC_NOCLOCK (0x0 << 10) ++ ++#define ISPTCTRL_CTRL_SHUTEN (1 << 21) ++#define ISPTCTRL_CTRL_PSTRBEN (1 << 22) ++#define ISPTCTRL_CTRL_STRBEN (1 << 23) ++#define ISPTCTRL_CTRL_SHUTPOL (1 << 24) ++#define ISPTCTRL_CTRL_STRBPSTRBPOL (1 << 26) ++ ++#define ISPTCTRL_CTRL_INSEL_SHIFT 27 ++#define ISPTCTRL_CTRL_INSEL_PARALLEL (0x0 << 27) ++#define ISPTCTRL_CTRL_INSEL_CSIA (0x1 << 27) ++#define ISPTCTRL_CTRL_INSEL_CSIB (0x2 << 27) ++ ++#define ISPTCTRL_CTRL_GRESETEn (1 << 29) ++#define ISPTCTRL_CTRL_GRESETPOL (1 << 30) ++#define ISPTCTRL_CTRL_GRESETDIR (1 << 31) ++ ++#define ISPTCTRL_FRAME_SHUT_SHIFT 0 ++#define ISPTCTRL_FRAME_PSTRB_SHIFT 6 ++#define ISPTCTRL_FRAME_STRB_SHIFT 12 ++ ++#define ISPCCDC_PID_PREV_SHIFT 0 ++#define ISPCCDC_PID_CID_SHIFT 8 ++#define ISPCCDC_PID_TID_SHIFT 16 ++ ++#define ISPCCDC_PCR_EN 1 ++#define ISPCCDC_PCR_BUSY (1 << 1) ++ ++#define ISPCCDC_SYN_MODE_VDHDOUT 0x1 ++#define ISPCCDC_SYN_MODE_FLDOUT (1 << 1) ++#define ISPCCDC_SYN_MODE_VDPOL (1 << 2) ++#define ISPCCDC_SYN_MODE_HDPOL (1 << 3) ++#define ISPCCDC_SYN_MODE_FLDPOL (1 << 4) ++#define ISPCCDC_SYN_MODE_EXWEN (1 << 5) ++#define ISPCCDC_SYN_MODE_DATAPOL (1 << 6) ++#define ISPCCDC_SYN_MODE_FLDMODE (1 << 7) ++#define ISPCCDC_SYN_MODE_DATSIZ_MASK 0xFFFFF8FF ++#define ISPCCDC_SYN_MODE_DATSIZ_8_16 (0x0 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_12 (0x4 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_11 (0x5 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_10 (0x6 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_8 (0x7 << 8) ++#define ISPCCDC_SYN_MODE_PACK8 (1 << 11) ++#define ISPCCDC_SYN_MODE_INPMOD_MASK 0xFFFFCFFF ++#define ISPCCDC_SYN_MODE_INPMOD_RAW (0 << 12) ++#define ISPCCDC_SYN_MODE_INPMOD_YCBCR16 (1 << 12) ++#define ISPCCDC_SYN_MODE_INPMOD_YCBCR8 (2 << 12) ++#define ISPCCDC_SYN_MODE_LPF (1 << 14) ++#define ISPCCDC_SYN_MODE_FLDSTAT (1 << 15) ++#define ISPCCDC_SYN_MODE_VDHDEN (1 << 16) ++#define ISPCCDC_SYN_MODE_WEN (1 << 17) ++#define ISPCCDC_SYN_MODE_VP2SDR (1 << 18) ++#define ISPCCDC_SYN_MODE_SDR2RSZ (1 << 19) ++ ++#define ISPCCDC_HD_VD_WID_VDW_SHIFT 0 ++#define ISPCCDC_HD_VD_WID_HDW_SHIFT 16 ++ ++#define ISPCCDC_PIX_LINES_HLPRF_SHIFT 0 ++#define ISPCCDC_PIX_LINES_PPLN_SHIFT 16 ++ ++#define ISPCCDC_HORZ_INFO_NPH_SHIFT 0 ++#define ISPCCDC_HORZ_INFO_NPH_MASK 0xFFFF8000 ++#define ISPCCDC_HORZ_INFO_SPH_MASK 0x1000FFFF ++#define ISPCCDC_HORZ_INFO_SPH_SHIFT 16 ++ ++#define ISPCCDC_VERT_START_SLV0_SHIFT 16 ++#define ISPCCDC_VERT_START_SLV0_MASK 0x1000FFFF ++#define ISPCCDC_VERT_START_SLV1_SHIFT 0 ++ ++#define ISPCCDC_VERT_LINES_NLV_MASK 0xFFFF8000 ++#define ISPCCDC_VERT_LINES_NLV_SHIFT 0 ++ ++#define ISPCCDC_CULLING_CULV_SHIFT 0 ++#define ISPCCDC_CULLING_CULHODD_SHIFT 16 ++#define ISPCCDC_CULLING_CULHEVN_SHIFT 24 ++ ++#define ISPCCDC_HSIZE_OFF_SHIFT 0 ++ ++#define ISPCCDC_SDOFST_FINV (1 << 14) ++#define ISPCCDC_SDOFST_FOFST_1L 0 ++#define ISPCCDC_SDOFST_FOFST_4L (3 << 12) ++#define ISPCCDC_SDOFST_LOFST3_SHIFT 0 ++#define ISPCCDC_SDOFST_LOFST2_SHIFT 3 ++#define ISPCCDC_SDOFST_LOFST1_SHIFT 6 ++#define ISPCCDC_SDOFST_LOFST0_SHIFT 9 ++#define EVENEVEN 1 ++#define ODDEVEN 2 ++#define EVENODD 3 ++#define ODDODD 4 ++ ++#define ISPCCDC_CLAMP_OBGAIN_SHIFT 0 ++#define ISPCCDC_CLAMP_OBST_SHIFT 10 ++#define ISPCCDC_CLAMP_OBSLN_SHIFT 25 ++#define ISPCCDC_CLAMP_OBSLEN_SHIFT 28 ++#define ISPCCDC_CLAMP_CLAMPEN (1 << 31) ++ ++#define ISPCCDC_COLPTN_R_Ye 0x0 ++#define ISPCCDC_COLPTN_Gr_Cy 0x1 ++#define ISPCCDC_COLPTN_Gb_G 0x2 ++#define ISPCCDC_COLPTN_B_Mg 0x3 ++#define ISPCCDC_COLPTN_CP0PLC0_SHIFT 0 ++#define ISPCCDC_COLPTN_CP0PLC1_SHIFT 2 ++#define ISPCCDC_COLPTN_CP0PLC2_SHIFT 4 ++#define ISPCCDC_COLPTN_CP0PLC3_SHIFT 6 ++#define ISPCCDC_COLPTN_CP1PLC0_SHIFT 8 ++#define ISPCCDC_COLPTN_CP1PLC1_SHIFT 10 ++#define ISPCCDC_COLPTN_CP1PLC2_SHIFT 12 ++#define ISPCCDC_COLPTN_CP1PLC3_SHIFT 14 ++#define ISPCCDC_COLPTN_CP2PLC0_SHIFT 16 ++#define ISPCCDC_COLPTN_CP2PLC1_SHIFT 18 ++#define ISPCCDC_COLPTN_CP2PLC2_SHIFT 20 ++#define ISPCCDC_COLPTN_CP2PLC3_SHIFT 22 ++#define ISPCCDC_COLPTN_CP3PLC0_SHIFT 24 ++#define ISPCCDC_COLPTN_CP3PLC1_SHIFT 26 ++#define ISPCCDC_COLPTN_CP3PLC2_SHIFT 28 ++#define ISPCCDC_COLPTN_CP3PLC3_SHIFT 30 ++ ++#define ISPCCDC_BLKCMP_B_MG_SHIFT 0 ++#define ISPCCDC_BLKCMP_GB_G_SHIFT 8 ++#define ISPCCDC_BLKCMP_GR_CY_SHIFT 16 ++#define ISPCCDC_BLKCMP_R_YE_SHIFT 24 ++ ++#define ISPCCDC_FPC_FPNUM_SHIFT 0 ++#define ISPCCDC_FPC_FPCEN (1 << 15) ++#define ISPCCDC_FPC_FPERR (1 << 16) ++ ++#define ISPCCDC_VDINT_1_SHIFT 0 ++#define ISPCCDC_VDINT_0_SHIFT 16 ++#define ISPCCDC_VDINT_0_MASK 0x7FFF ++#define ISPCCDC_VDINT_1_MASK 0x7FFF ++ ++#define ISPCCDC_ALAW_GWDI_SHIFT 0 ++#define ISPCCDC_ALAW_CCDTBL (1 << 3) ++ ++#define ISPCCDC_REC656IF_R656ON 1 ++#define ISPCCDC_REC656IF_ECCFVH (1 << 1) ++ ++#define ISPCCDC_CFG_BW656 (1 << 5) ++#define ISPCCDC_CFG_FIDMD_SHIFT 6 ++#define ISPCCDC_CFG_WENLOG (1 << 8) ++#define ISPCCDC_CFG_WENLOG_AND (0 << 8) ++#define ISPCCDC_CFG_WENLOG_OR (1 << 8) ++#define ISPCCDC_CFG_Y8POS (1 << 11) ++#define ISPCCDC_CFG_BSWD (1 << 12) ++#define ISPCCDC_CFG_MSBINVI (1 << 13) ++#define ISPCCDC_CFG_VDLC (1 << 15) ++ ++#define ISPCCDC_FMTCFG_FMTEN 0x1 ++#define ISPCCDC_FMTCFG_LNALT (1 << 1) ++#define ISPCCDC_FMTCFG_LNUM_SHIFT 2 ++#define ISPCCDC_FMTCFG_PLEN_ODD_SHIFT 4 ++#define ISPCCDC_FMTCFG_PLEN_EVEN_SHIFT 8 ++#define ISPCCDC_FMTCFG_VPIN_MASK 0xFFFF8000 ++#define ISPCCDC_FMTCFG_VPIN_12_3 (0x3 << 12) ++#define ISPCCDC_FMTCFG_VPIN_11_2 (0x4 << 12) ++#define ISPCCDC_FMTCFG_VPIN_10_1 (0x5 << 12) ++#define ISPCCDC_FMTCFG_VPIN_9_0 (0x6 << 12) ++#define ISPCCDC_FMTCFG_VPEN (1 << 15) ++ ++#define ISPCCDC_FMTCF_VPIF_FRQ_MASK 0xFFF8FFFF ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY2 (0x0 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY3 (0x1 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY4 (0x2 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY5 (0x3 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY6 (0x4 << 16) ++ ++#define ISPCCDC_FMT_HORZ_FMTLNH_SHIFT 0 ++#define ISPCCDC_FMT_HORZ_FMTSPH_SHIFT 16 ++ ++#define ISPCCDC_FMT_VERT_FMTLNV_SHIFT 0 ++#define ISPCCDC_FMT_VERT_FMTSLV_SHIFT 16 ++ ++#define ISPCCDC_FMT_HORZ_FMTSPH_MASK 0x1FFF0000 ++#define ISPCCDC_FMT_HORZ_FMTLNH_MASK 0x1FFF ++ ++#define ISPCCDC_FMT_VERT_FMTSLV_MASK 0x1FFF0000 ++#define ISPCCDC_FMT_VERT_FMTLNV_MASK 0x1FFF ++ ++#define ISPCCDC_VP_OUT_HORZ_ST_SHIFT 0 ++#define ISPCCDC_VP_OUT_HORZ_NUM_SHIFT 4 ++#define ISPCCDC_VP_OUT_VERT_NUM_SHIFT 17 ++ ++#define ISPRSZ_PID_PREV_SHIFT 0 ++#define ISPRSZ_PID_CID_SHIFT 8 ++#define ISPRSZ_PID_TID_SHIFT 16 ++ ++#define ISPRSZ_PCR_ENABLE 0x5 ++#define ISPRSZ_PCR_BUSY (1 << 1) ++ ++#define ISPRSZ_CNT_HRSZ_SHIFT 0 ++#define ISPRSZ_CNT_HRSZ_MASK 0x3FF ++#define ISPRSZ_CNT_VRSZ_SHIFT 10 ++#define ISPRSZ_CNT_VRSZ_MASK 0xFFC00 ++#define ISPRSZ_CNT_HSTPH_SHIFT 20 ++#define ISPRSZ_CNT_HSTPH_MASK 0x700000 ++#define ISPRSZ_CNT_VSTPH_SHIFT 23 ++#define ISPRSZ_CNT_VSTPH_MASK 0x3800000 ++#define ISPRSZ_CNT_CBILIN_MASK 0x20000000 ++#define ISPRSZ_CNT_INPTYP_MASK 0x08000000 ++#define ISPRSZ_CNT_PIXFMT_MASK 0x04000000 ++#define ISPRSZ_CNT_YCPOS (1 << 26) ++#define ISPRSZ_CNT_INPTYP (1 << 27) ++#define ISPRSZ_CNT_INPSRC (1 << 28) ++#define ISPRSZ_CNT_CBILIN (1 << 29) ++ ++#define ISPRSZ_OUT_SIZE_HORZ_SHIFT 0 ++#define ISPRSZ_OUT_SIZE_HORZ_MASK 0x7FF ++#define ISPRSZ_OUT_SIZE_VERT_SHIFT 16 ++#define ISPRSZ_OUT_SIZE_VERT_MASK 0x7FF0000 ++ ++ ++#define ISPRSZ_IN_START_HORZ_ST_SHIFT 0 ++#define ISPRSZ_IN_START_HORZ_ST_MASK 0x1FFF ++#define ISPRSZ_IN_START_VERT_ST_SHIFT 16 ++#define ISPRSZ_IN_START_VERT_ST_MASK 0x1FFF0000 ++ ++ ++#define ISPRSZ_IN_SIZE_HORZ_SHIFT 0 ++#define ISPRSZ_IN_SIZE_HORZ_MASK 0x1FFF ++#define ISPRSZ_IN_SIZE_VERT_SHIFT 16 ++#define ISPRSZ_IN_SIZE_VERT_MASK 0x1FFF0000 ++ ++#define ISPRSZ_SDR_INADD_ADDR_SHIFT 0 ++#define ISPRSZ_SDR_INADD_ADDR_MASK 0xFFFFFFFF ++ ++#define ISPRSZ_SDR_INOFF_OFFSET_SHIFT 0 ++#define ISPRSZ_SDR_INOFF_OFFSET_MASK 0xFFFF ++ ++#define ISPRSZ_SDR_OUTADD_ADDR_SHIFT 0 ++#define ISPRSZ_SDR_OUTADD_ADDR_MASK 0xFFFFFFFF ++ ++ ++#define ISPRSZ_SDR_OUTOFF_OFFSET_SHIFT 0 ++#define ISPRSZ_SDR_OUTOFF_OFFSET_MASK 0xFFFF ++ ++#define ISPRSZ_HFILT10_COEF0_SHIFT 0 ++#define ISPRSZ_HFILT10_COEF0_MASK 0x3FF ++#define ISPRSZ_HFILT10_COEF1_SHIFT 16 ++#define ISPRSZ_HFILT10_COEF1_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT32_COEF2_SHIFT 0 ++#define ISPRSZ_HFILT32_COEF2_MASK 0x3FF ++#define ISPRSZ_HFILT32_COEF3_SHIFT 16 ++#define ISPRSZ_HFILT32_COEF3_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT54_COEF4_SHIFT 0 ++#define ISPRSZ_HFILT54_COEF4_MASK 0x3FF ++#define ISPRSZ_HFILT54_COEF5_SHIFT 16 ++#define ISPRSZ_HFILT54_COEF5_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT76_COEFF6_SHIFT 0 ++#define ISPRSZ_HFILT76_COEFF6_MASK 0x3FF ++#define ISPRSZ_HFILT76_COEFF7_SHIFT 16 ++#define ISPRSZ_HFILT76_COEFF7_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT98_COEFF8_SHIFT 0 ++#define ISPRSZ_HFILT98_COEFF8_MASK 0x3FF ++#define ISPRSZ_HFILT98_COEFF9_SHIFT 16 ++#define ISPRSZ_HFILT98_COEFF9_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1110_COEF10_SHIFT 0 ++#define ISPRSZ_HFILT1110_COEF10_MASK 0x3FF ++#define ISPRSZ_HFILT1110_COEF11_SHIFT 16 ++#define ISPRSZ_HFILT1110_COEF11_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1312_COEFF12_SHIFT 0 ++#define ISPRSZ_HFILT1312_COEFF12_MASK 0x3FF ++#define ISPRSZ_HFILT1312_COEFF13_SHIFT 16 ++#define ISPRSZ_HFILT1312_COEFF13_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1514_COEFF14_SHIFT 0 ++#define ISPRSZ_HFILT1514_COEFF14_MASK 0x3FF ++#define ISPRSZ_HFILT1514_COEFF15_SHIFT 16 ++#define ISPRSZ_HFILT1514_COEFF15_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1716_COEF16_SHIFT 0 ++#define ISPRSZ_HFILT1716_COEF16_MASK 0x3FF ++#define ISPRSZ_HFILT1716_COEF17_SHIFT 16 ++#define ISPRSZ_HFILT1716_COEF17_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1918_COEF18_SHIFT 0 ++#define ISPRSZ_HFILT1918_COEF18_MASK 0x3FF ++#define ISPRSZ_HFILT1918_COEF19_SHIFT 16 ++#define ISPRSZ_HFILT1918_COEF19_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2120_COEF20_SHIFT 0 ++#define ISPRSZ_HFILT2120_COEF20_MASK 0x3FF ++#define ISPRSZ_HFILT2120_COEF21_SHIFT 16 ++#define ISPRSZ_HFILT2120_COEF21_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2322_COEF22_SHIFT 0 ++#define ISPRSZ_HFILT2322_COEF22_MASK 0x3FF ++#define ISPRSZ_HFILT2322_COEF23_SHIFT 16 ++#define ISPRSZ_HFILT2322_COEF23_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2524_COEF24_SHIFT 0 ++#define ISPRSZ_HFILT2524_COEF24_MASK 0x3FF ++#define ISPRSZ_HFILT2524_COEF25_SHIFT 16 ++#define ISPRSZ_HFILT2524_COEF25_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2726_COEF26_SHIFT 0 ++#define ISPRSZ_HFILT2726_COEF26_MASK 0x3FF ++#define ISPRSZ_HFILT2726_COEF27_SHIFT 16 ++#define ISPRSZ_HFILT2726_COEF27_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2928_COEF28_SHIFT 0 ++#define ISPRSZ_HFILT2928_COEF28_MASK 0x3FF ++#define ISPRSZ_HFILT2928_COEF29_SHIFT 16 ++#define ISPRSZ_HFILT2928_COEF29_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT3130_COEF30_SHIFT 0 ++#define ISPRSZ_HFILT3130_COEF30_MASK 0x3FF ++#define ISPRSZ_HFILT3130_COEF31_SHIFT 16 ++#define ISPRSZ_HFILT3130_COEF31_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT10_COEF0_SHIFT 0 ++#define ISPRSZ_VFILT10_COEF0_MASK 0x3FF ++#define ISPRSZ_VFILT10_COEF1_SHIFT 16 ++#define ISPRSZ_VFILT10_COEF1_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT32_COEF2_SHIFT 0 ++#define ISPRSZ_VFILT32_COEF2_MASK 0x3FF ++#define ISPRSZ_VFILT32_COEF3_SHIFT 16 ++#define ISPRSZ_VFILT32_COEF3_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT54_COEF4_SHIFT 0 ++#define ISPRSZ_VFILT54_COEF4_MASK 0x3FF ++#define ISPRSZ_VFILT54_COEF5_SHIFT 16 ++#define ISPRSZ_VFILT54_COEF5_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT76_COEFF6_SHIFT 0 ++#define ISPRSZ_VFILT76_COEFF6_MASK 0x3FF ++#define ISPRSZ_VFILT76_COEFF7_SHIFT 16 ++#define ISPRSZ_VFILT76_COEFF7_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT98_COEFF8_SHIFT 0 ++#define ISPRSZ_VFILT98_COEFF8_MASK 0x3FF ++#define ISPRSZ_VFILT98_COEFF9_SHIFT 16 ++#define ISPRSZ_VFILT98_COEFF9_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1110_COEF10_SHIFT 0 ++#define ISPRSZ_VFILT1110_COEF10_MASK 0x3FF ++#define ISPRSZ_VFILT1110_COEF11_SHIFT 16 ++#define ISPRSZ_VFILT1110_COEF11_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1312_COEFF12_SHIFT 0 ++#define ISPRSZ_VFILT1312_COEFF12_MASK 0x3FF ++#define ISPRSZ_VFILT1312_COEFF13_SHIFT 16 ++#define ISPRSZ_VFILT1312_COEFF13_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1514_COEFF14_SHIFT 0 ++#define ISPRSZ_VFILT1514_COEFF14_MASK 0x3FF ++#define ISPRSZ_VFILT1514_COEFF15_SHIFT 16 ++#define ISPRSZ_VFILT1514_COEFF15_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1716_COEF16_SHIFT 0 ++#define ISPRSZ_VFILT1716_COEF16_MASK 0x3FF ++#define ISPRSZ_VFILT1716_COEF17_SHIFT 16 ++#define ISPRSZ_VFILT1716_COEF17_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1918_COEF18_SHIFT 0 ++#define ISPRSZ_VFILT1918_COEF18_MASK 0x3FF ++#define ISPRSZ_VFILT1918_COEF19_SHIFT 16 ++#define ISPRSZ_VFILT1918_COEF19_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2120_COEF20_SHIFT 0 ++#define ISPRSZ_VFILT2120_COEF20_MASK 0x3FF ++#define ISPRSZ_VFILT2120_COEF21_SHIFT 16 ++#define ISPRSZ_VFILT2120_COEF21_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2322_COEF22_SHIFT 0 ++#define ISPRSZ_VFILT2322_COEF22_MASK 0x3FF ++#define ISPRSZ_VFILT2322_COEF23_SHIFT 16 ++#define ISPRSZ_VFILT2322_COEF23_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2524_COEF24_SHIFT 0 ++#define ISPRSZ_VFILT2524_COEF24_MASK 0x3FF ++#define ISPRSZ_VFILT2524_COEF25_SHIFT 16 ++#define ISPRSZ_VFILT2524_COEF25_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2726_COEF26_SHIFT 0 ++#define ISPRSZ_VFILT2726_COEF26_MASK 0x3FF ++#define ISPRSZ_VFILT2726_COEF27_SHIFT 16 ++#define ISPRSZ_VFILT2726_COEF27_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2928_COEF28_SHIFT 0 ++#define ISPRSZ_VFILT2928_COEF28_MASK 0x3FF ++#define ISPRSZ_VFILT2928_COEF29_SHIFT 16 ++#define ISPRSZ_VFILT2928_COEF29_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT3130_COEF30_SHIFT 0 ++#define ISPRSZ_VFILT3130_COEF30_MASK 0x3FF ++#define ISPRSZ_VFILT3130_COEF31_SHIFT 16 ++#define ISPRSZ_VFILT3130_COEF31_MASK 0x3FF0000 ++ ++#define ISPRSZ_YENH_CORE_SHIFT 0 ++#define ISPRSZ_YENH_CORE_MASK 0xFF ++#define ISPRSZ_YENH_SLOP_SHIFT 8 ++#define ISPRSZ_YENH_SLOP_MASK 0xF00 ++#define ISPRSZ_YENH_GAIN_SHIFT 12 ++#define ISPRSZ_YENH_GAIN_MASK 0xF000 ++#define ISPRSZ_YENH_ALGO_SHIFT 16 ++#define ISPRSZ_YENH_ALGO_MASK 0x30000 ++ ++#define ISPH3A_PCR_AEW_ALAW_EN_SHIFT 1 ++#define ISPH3A_PCR_AF_MED_TH_SHIFT 3 ++#define ISPH3A_PCR_AF_RGBPOS_SHIFT 11 ++#define ISPH3A_PCR_AEW_AVE2LMT_SHIFT 22 ++#define ISPH3A_PCR_AEW_AVE2LMT_MASK 0xFFC00000 ++#define ISPH3A_PCR_BUSYAF (1 << 15) ++#define ISPH3A_PCR_BUSYAEAWB (1 << 18) ++ ++#define ISPH3A_AEWWIN1_WINHC_SHIFT 0 ++#define ISPH3A_AEWWIN1_WINHC_MASK 0x3F ++#define ISPH3A_AEWWIN1_WINVC_SHIFT 6 ++#define ISPH3A_AEWWIN1_WINVC_MASK 0x1FC0 ++#define ISPH3A_AEWWIN1_WINW_SHIFT 13 ++#define ISPH3A_AEWWIN1_WINW_MASK 0xFE000 ++#define ISPH3A_AEWWIN1_WINH_SHIFT 24 ++#define ISPH3A_AEWWIN1_WINH_MASK 0x7F000000 ++ ++#define ISPH3A_AEWINSTART_WINSH_SHIFT 0 ++#define ISPH3A_AEWINSTART_WINSH_MASK 0x0FFF ++#define ISPH3A_AEWINSTART_WINSV_SHIFT 16 ++#define ISPH3A_AEWINSTART_WINSV_MASK 0x0FFF0000 ++ ++#define ISPH3A_AEWINBLK_WINH_SHIFT 0 ++#define ISPH3A_AEWINBLK_WINH_MASK 0x7F ++#define ISPH3A_AEWINBLK_WINSV_SHIFT 16 ++#define ISPH3A_AEWINBLK_WINSV_MASK 0x0FFF0000 ++ ++#define ISPH3A_AEWSUBWIN_AEWINCH_SHIFT 0 ++#define ISPH3A_AEWSUBWIN_AEWINCH_MASK 0x0F ++#define ISPH3A_AEWSUBWIN_AEWINCV_SHIFT 8 ++#define ISPH3A_AEWSUBWIN_AEWINCV_MASK 0x0F00 ++ ++#define ISPHIST_PCR_ENABLE_SHIFT 0 ++#define ISPHIST_PCR_ENABLE_MASK 0x01 ++#define ISPHIST_PCR_BUSY 0x02 ++ ++#define ISPHIST_CNT_DATASIZE_SHIFT 8 ++#define ISPHIST_CNT_DATASIZE_MASK 0x0100 ++#define ISPHIST_CNT_CLEAR_SHIFT 7 ++#define ISPHIST_CNT_CLEAR_MASK 0x080 ++#define ISPHIST_CNT_CFA_SHIFT 6 ++#define ISPHIST_CNT_CFA_MASK 0x040 ++#define ISPHIST_CNT_BINS_SHIFT 4 ++#define ISPHIST_CNT_BINS_MASK 0x030 ++#define ISPHIST_CNT_SOURCE_SHIFT 3 ++#define ISPHIST_CNT_SOURCE_MASK 0x08 ++#define ISPHIST_CNT_SHIFT_SHIFT 0 ++#define ISPHIST_CNT_SHIFT_MASK 0x07 ++ ++#define ISPHIST_WB_GAIN_WG00_SHIFT 24 ++#define ISPHIST_WB_GAIN_WG00_MASK 0xFF000000 ++#define ISPHIST_WB_GAIN_WG01_SHIFT 16 ++#define ISPHIST_WB_GAIN_WG01_MASK 0xFF0000 ++#define ISPHIST_WB_GAIN_WG02_SHIFT 8 ++#define ISPHIST_WB_GAIN_WG02_MASK 0xFF00 ++#define ISPHIST_WB_GAIN_WG03_SHIFT 0 ++#define ISPHIST_WB_GAIN_WG03_MASK 0xFF ++ ++#define ISPHIST_REGHORIZ_HSTART_SHIFT 16 /* ++ * REGION 0 to 3 HORZ ++ * and VERT ++ */ ++#define ISPHIST_REGHORIZ_HSTART_MASK 0x3FFF0000 ++#define ISPHIST_REGHORIZ_HEND_SHIFT 0 ++#define ISPHIST_REGHORIZ_HEND_MASK 0x3FFF ++#define ISPHIST_REGVERT_VSTART_SHIFT 16 ++#define ISPHIST_REGVERT_VSTART_MASK 0x3FFF0000 ++#define ISPHIST_REGVERT_VEND_SHIFT 0 ++#define ISPHIST_REGVERT_VEND_MASK 0x3FFF ++ ++#define ISPHIST_REGHORIZ_MASK 0x3FFF3FFF ++#define ISPHIST_REGVERT_MASK 0x3FFF3FFF ++ ++#define ISPHIST_ADDR_SHIFT 0 ++#define ISPHIST_ADDR_MASK 0x3FF ++ ++#define ISPHIST_DATA_SHIFT 0 ++#define ISPHIST_DATA_MASK 0xFFFFF ++ ++#define ISPHIST_RADD_SHIFT 0 ++#define ISPHIST_RADD_MASK 0xFFFFFFFF ++ ++#define ISPHIST_RADD_OFF_SHIFT 0 ++#define ISPHIST_RADD_OFF_MASK 0xFFFF ++ ++#define ISPHIST_HV_INFO_HSIZE_SHIFT 16 ++#define ISPHIST_HV_INFO_HSIZE_MASK 0x3FFF0000 ++#define ISPHIST_HV_INFO_VSIZE_SHIFT 0 ++#define ISPHIST_HV_INFO_VSIZE_MASK 0x3FFF ++ ++#define ISPHIST_HV_INFO_MASK 0x3FFF3FFF ++ ++#define ISPCCDC_LSC_GAIN_MODE_N_MASK 0x700 ++#define ISPCCDC_LSC_GAIN_MODE_N_SHIFT 8 ++#define ISPCCDC_LSC_GAIN_MODE_M_MASK 0x3800 ++#define ISPCCDC_LSC_GAIN_MODE_M_SHIFT 12 ++#define ISPCCDC_LSC_GAIN_FORMAT_MASK 0xE ++#define ISPCCDC_LSC_GAIN_FORMAT_SHIFT 1 ++#define ISPCCDC_LSC_AFTER_REFORMATTER_MASK (1<<6) ++ ++#define ISPCCDC_LSC_INITIAL_X_MASK 0x3F ++#define ISPCCDC_LSC_INITIAL_X_SHIFT 0 ++#define ISPCCDC_LSC_INITIAL_Y_MASK 0x3F0000 ++#define ISPCCDC_LSC_INITIAL_Y_SHIFT 16 ++ ++#define ISPMMU_REVISION_REV_MINOR_MASK 0xF ++#define ISPMMU_REVISION_REV_MAJOR_SHIFT 0x4 ++ ++#define IRQENABLE_MULTIHITFAULT (1<<4) ++#define IRQENABLE_TWFAULT (1<<3) ++#define IRQENABLE_EMUMISS (1<<2) ++#define IRQENABLE_TRANSLNFAULT (1<<1) ++#define IRQENABLE_TLBMISS (1) ++ ++#define ISPMMU_MMUCNTL_MMU_EN (1<<1) ++#define ISPMMU_MMUCNTL_TWL_EN (1<<2) ++#define ISPMMU_MMUCNTL_EMUTLBUPDATE (1<<3) ++#define ISPMMU_AUTOIDLE 0x1 ++#define ISPMMU_SIDLEMODE_FORCEIDLE 0 ++#define ISPMMU_SIDLEMODE_NOIDLE 1 ++#define ISPMMU_SIDLEMODE_SMARTIDLE 2 ++#define ISPMMU_SIDLEMODE_SHIFT 3 ++ ++#define ISPCSI1_AUTOIDLE 0x1 ++#define ISPCSI1_MIDLEMODE_SHIFT 12 ++#define ISPCSI1_MIDLEMODE_FORCESTANDBY 0x0 ++#define ISPCSI1_MIDLEMODE_NOSTANDBY 0x1 ++#define ISPCSI1_MIDLEMODE_SMARTSTANDBY 0x2 ++ ++/* CSI2 receiver registers (ES2.0) */ ++#define ISPCSI2_REVISION (0x000) ++#define ISPCSI2_SYSCONFIG (0x010) ++#define ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SHIFT 12 ++#define ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK \ ++ (0x3 << ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SHIFT) ++#define ISPCSI2_SYSCONFIG_MSTANDBY_MODE_FORCE \ ++ (0x0 << ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SHIFT) ++#define ISPCSI2_SYSCONFIG_MSTANDBY_MODE_NO \ ++ (0x1 << ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SHIFT) ++#define ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SMART \ ++ (0x2 << ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SHIFT) ++#define ISPCSI2_SYSCONFIG_SOFT_RESET_SHIFT 1 ++#define ISPCSI2_SYSCONFIG_SOFT_RESET_MASK \ ++ (0x1 << ISPCSI2_SYSCONFIG_SOFT_RESET_SHIFT) ++#define ISPCSI2_SYSCONFIG_SOFT_RESET_NORMAL \ ++ (0x0 << ISPCSI2_SYSCONFIG_SOFT_RESET_SHIFT) ++#define ISPCSI2_SYSCONFIG_SOFT_RESET_RESET \ ++ (0x1 << ISPCSI2_SYSCONFIG_SOFT_RESET_SHIFT) ++#define ISPCSI2_SYSCONFIG_AUTO_IDLE_SHIFT 0 ++#define ISPCSI2_SYSCONFIG_AUTO_IDLE_MASK \ ++ (0x1 << ISPCSI2_SYSCONFIG_AUTO_IDLE_SHIFT) ++#define ISPCSI2_SYSCONFIG_AUTO_IDLE_FREE \ ++ (0x0 << ISPCSI2_SYSCONFIG_AUTO_IDLE_SHIFT) ++#define ISPCSI2_SYSCONFIG_AUTO_IDLE_AUTO \ ++ (0x1 << ISPCSI2_SYSCONFIG_AUTO_IDLE_SHIFT) ++#define ISPCSI2_SYSSTATUS (0x014) ++#define ISPCSI2_SYSSTATUS_RESET_DONE_SHIFT 0 ++#define ISPCSI2_SYSSTATUS_RESET_DONE_MASK \ ++ (0x1 << ISPCSI2_SYSSTATUS_RESET_DONE_SHIFT) ++#define ISPCSI2_SYSSTATUS_RESET_DONE_ONGOING \ ++ (0x0 << ISPCSI2_SYSSTATUS_RESET_DONE_SHIFT) ++#define ISPCSI2_SYSSTATUS_RESET_DONE_DONE \ ++ (0x1 << ISPCSI2_SYSSTATUS_RESET_DONE_SHIFT) ++#define ISPCSI2_IRQSTATUS (0x018) ++#define ISPCSI2_IRQSTATUS_OCP_ERR_IRQ (1 << 14) ++#define ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ (1 << 13) ++#define ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ (1 << 12) ++#define ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ (1 << 11) ++#define ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ (1 << 10) ++#define ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ (1 << 9) ++#define ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ (1 << 8) ++#define ISPCSI2_IRQSTATUS_CONTEXT(n) (1 << (n)) ++ ++#define ISPCSI2_IRQENABLE (0x01C) ++#define ISPCSI2_CTRL (0x040) ++#define ISPCSI2_CTRL_VP_CLK_EN_SHIFT 15 ++#define ISPCSI2_CTRL_VP_CLK_EN_MASK (0x1 << ISPCSI2_CTRL_VP_CLK_EN_SHIFT) ++#define ISPCSI2_CTRL_VP_CLK_EN_DISABLE (0x0 << ISPCSI2_CTRL_VP_CLK_EN_SHIFT) ++#define ISPCSI2_CTRL_VP_CLK_EN_ENABLE (0x1 << ISPCSI2_CTRL_VP_CLK_EN_SHIFT) ++ ++#define ISPCSI2_CTRL_VP_ONLY_EN_SHIFT 11 ++#define ISPCSI2_CTRL_VP_ONLY_EN_MASK (0x1 << ISPCSI2_CTRL_VP_ONLY_EN_SHIFT) ++#define ISPCSI2_CTRL_VP_ONLY_EN_DISABLE (0x0 << ISPCSI2_CTRL_VP_ONLY_EN_SHIFT) ++#define ISPCSI2_CTRL_VP_ONLY_EN_ENABLE (0x1 << ISPCSI2_CTRL_VP_ONLY_EN_SHIFT) ++ ++#define ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT 8 ++#define ISPCSI2_CTRL_VP_OUT_CTRL_MASK (0x3 << \ ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) ++#define ISPCSI2_CTRL_VP_OUT_CTRL_DISABLE (0x0 << \ ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) ++#define ISPCSI2_CTRL_VP_OUT_CTRL_DIV2 (0x1 << \ ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) ++#define ISPCSI2_CTRL_VP_OUT_CTRL_DIV3 (0x2 << \ ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) ++#define ISPCSI2_CTRL_VP_OUT_CTRL_DIV4 (0x3 << \ ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) ++ ++#define ISPCSI2_CTRL_DBG_EN_SHIFT 7 ++#define ISPCSI2_CTRL_DBG_EN_MASK (0x1 << ISPCSI2_CTRL_DBG_EN_SHIFT) ++#define ISPCSI2_CTRL_DBG_EN_DISABLE (0x0 << ISPCSI2_CTRL_DBG_EN_SHIFT) ++#define ISPCSI2_CTRL_DBG_EN_ENABLE (0x1 << ISPCSI2_CTRL_DBG_EN_SHIFT) ++ ++#define ISPCSI2_CTRL_BURST_SIZE_SHIFT 5 ++#define ISPCSI2_CTRL_BURST_SIZE_MASK (0x3 << \ ++ ISPCSI2_CTRL_BURST_SIZE_SHIFT) ++#define ISPCSI2_CTRL_BURST_SIZE_MYSTERY_VAL (0x2 << \ ++ ISPCSI2_CTRL_BURST_SIZE_SHIFT) ++ ++#define ISPCSI2_CTRL_FRAME_SHIFT 3 ++#define ISPCSI2_CTRL_FRAME_MASK (0x1 << ISPCSI2_CTRL_FRAME_SHIFT) ++#define ISPCSI2_CTRL_FRAME_DISABLE_IMM (0x0 << ISPCSI2_CTRL_FRAME_SHIFT) ++#define ISPCSI2_CTRL_FRAME_DISABLE_FEC (0x1 << ISPCSI2_CTRL_FRAME_SHIFT) ++ ++#define ISPCSI2_CTRL_ECC_EN_SHIFT 2 ++#define ISPCSI2_CTRL_ECC_EN_MASK (0x1 << ISPCSI2_CTRL_ECC_EN_SHIFT) ++#define ISPCSI2_CTRL_ECC_EN_DISABLE (0x0 << ISPCSI2_CTRL_ECC_EN_SHIFT) ++#define ISPCSI2_CTRL_ECC_EN_ENABLE (0x1 << ISPCSI2_CTRL_ECC_EN_SHIFT) ++ ++#define ISPCSI2_CTRL_SECURE_SHIFT 1 ++#define ISPCSI2_CTRL_SECURE_MASK (0x1 << ISPCSI2_CTRL_SECURE_SHIFT) ++#define ISPCSI2_CTRL_SECURE_DISABLE (0x0 << ISPCSI2_CTRL_SECURE_SHIFT) ++#define ISPCSI2_CTRL_SECURE_ENABLE (0x1 << ISPCSI2_CTRL_SECURE_SHIFT) ++ ++#define ISPCSI2_CTRL_IF_EN_SHIFT 0 ++#define ISPCSI2_CTRL_IF_EN_MASK (0x1 << ISPCSI2_CTRL_IF_EN_SHIFT) ++#define ISPCSI2_CTRL_IF_EN_DISABLE (0x0 << ISPCSI2_CTRL_IF_EN_SHIFT) ++#define ISPCSI2_CTRL_IF_EN_ENABLE (0x1 << ISPCSI2_CTRL_IF_EN_SHIFT) ++ ++#define ISPCSI2_DBG_H (0x044) ++#define ISPCSI2_GNQ (0x048) ++#define ISPCSI2_COMPLEXIO_CFG1 (0x050) ++#define ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_SHIFT 29 ++#define ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_MASK \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_ONGOING \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_DONE \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_RESET_DONE_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_SHIFT 27 ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_MASK \ ++ (0x3 << ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_OFF \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_ON \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_ULPW \ ++ (0x2 << ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_SHIFT 25 ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_MASK \ ++ (0x3 << ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_OFF \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_ON \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_ULPW \ ++ (0x2 << ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_SHIFT 24 ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_MASK \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_DISABLE \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_ENABLE \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_SHIFT) ++ ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(n) (3 + ((n) * 4)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POL_MASK(n) \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POL_PN(n) \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POL_NP(n) \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(n)) ++ ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n) ((n) * 4) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_MASK(n) \ ++ (0x7 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_NC(n) \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_1(n) \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_2(n) \ ++ (0x2 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_3(n) \ ++ (0x3 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_4(n) \ ++ (0x4 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++#define ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_5(n) \ ++ (0x5 << ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(n)) ++ ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT 3 ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_MASK \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_PN \ ++ (0x0 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_NP \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT) ++ ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT 0 ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_MASK \ ++ (0x7 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_1 \ ++ (0x1 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_2 \ ++ (0x2 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_3 \ ++ (0x3 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_4 \ ++ (0x4 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++#define ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_5 \ ++ (0x5 << ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT) ++ ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS (0x054) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEALLULPMEXIT (1 << 26) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEALLULPMENTER (1 << 25) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEULPM5 (1 << 24) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEULPM4 (1 << 23) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEULPM3 (1 << 22) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEULPM2 (1 << 21) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_STATEULPM1 (1 << 20) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRCONTROL5 (1 << 19) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRCONTROL4 (1 << 18) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRCONTROL3 (1 << 17) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRCONTROL2 (1 << 16) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRCONTROL1 (1 << 15) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRESC5 (1 << 14) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRESC4 (1 << 13) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRESC3 (1 << 12) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRESC2 (1 << 11) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRESC1 (1 << 10) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTSYNCHS5 (1 << 9) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTSYNCHS4 (1 << 8) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTSYNCHS3 (1 << 7) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTSYNCHS2 (1 << 6) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTSYNCHS1 (1 << 5) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTHS5 (1 << 4) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTHS4 (1 << 3) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTHS3 (1 << 2) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTHS2 (1 << 1) ++#define ISPCSI2_COMPLEXIO1_IRQSTATUS_ERRSOTHS1 1 ++ ++#define ISPCSI2_SHORT_PACKET (0x05C) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE (0x060) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEALLULPMEXIT (1 << 26) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEALLULPMENTER (1 << 25) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM5 (1 << 24) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM4 (1 << 23) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM3 (1 << 22) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM2 (1 << 21) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM1 (1 << 20) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL5 (1 << 19) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL4 (1 << 18) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL3 (1 << 17) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL2 (1 << 16) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL1 (1 << 15) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC5 (1 << 14) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC4 (1 << 13) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC3 (1 << 12) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC2 (1 << 11) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC1 (1 << 10) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS5 (1 << 9) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS4 (1 << 8) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS3 (1 << 7) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS2 (1 << 6) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS1 (1 << 5) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS5 (1 << 4) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS4 (1 << 3) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS3 (1 << 2) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS2 (1 << 1) ++#define ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS1 1 ++#define ISPCSI2_DBG_P (0x068) ++#define ISPCSI2_TIMING (0x06C) ++ ++ ++#define ISPCSI2_TIMING_FORCE_RX_MODE_IO_SHIFT(n) \ ++ ((16 * ((n) - 1)) + 15) ++#define ISPCSI2_TIMING_FORCE_RX_MODE_IO_MASK(n) \ ++ (0x1 << ISPCSI2_TIMING_FORCE_RX_MODE_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_FORCE_RX_MODE_IO_DISABLE(n) \ ++ (0x0 << ISPCSI2_TIMING_FORCE_RX_MODE_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_FORCE_RX_MODE_IO_ENABLE(n) \ ++ (0x1 << ISPCSI2_TIMING_FORCE_RX_MODE_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X16_IO_SHIFT(n) ((16 * ((n) - 1)) + 14) ++#define ISPCSI2_TIMING_STOP_STATE_X16_IO_MASK(n) \ ++ (0x1 << ISPCSI2_TIMING_STOP_STATE_X16_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X16_IO_DISABLE(n) \ ++ (0x0 << ISPCSI2_TIMING_STOP_STATE_X16_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X16_IO_ENABLE(n) \ ++ (0x1 << ISPCSI2_TIMING_STOP_STATE_X16_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X4_IO_SHIFT(n) ((16 * ((n) - 1)) + 13) ++#define ISPCSI2_TIMING_STOP_STATE_X4_IO_MASK(n) \ ++ (0x1 << ISPCSI2_TIMING_STOP_STATE_X4_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X4_IO_DISABLE(n) \ ++ (0x0 << ISPCSI2_TIMING_STOP_STATE_X4_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_X4_IO_ENABLE(n) \ ++ (0x1 << ISPCSI2_TIMING_STOP_STATE_X4_IO_SHIFT(n)) ++#define ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(n) (16 * ((n) - 1)) ++#define ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_MASK(n) \ ++ (0x1fff << ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(n)) ++ ++#define ISPCSI2_CTX_CTRL1(n) ((0x070) + 0x20 * (n)) ++#define ISPCSI2_CTX_CTRL1_COUNT_SHIFT 8 ++#define ISPCSI2_CTX_CTRL1_COUNT_MASK (0xFF << \ ++ ISPCSI2_CTX_CTRL1_COUNT_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOF_EN_SHIFT 7 ++#define ISPCSI2_CTX_CTRL1_EOF_EN_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_EOF_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOF_EN_DISABLE \ ++ (0x0 << ISPCSI2_CTX_CTRL1_EOF_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOF_EN_ENABLE \ ++ (0x1 << ISPCSI2_CTX_CTRL1_EOF_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOL_EN_SHIFT 6 ++#define ISPCSI2_CTX_CTRL1_EOL_EN_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_EOL_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOL_EN_DISABLE \ ++ (0x0 << ISPCSI2_CTX_CTRL1_EOL_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_EOL_EN_ENABLE \ ++ (0x1 << ISPCSI2_CTX_CTRL1_EOL_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CS_EN_SHIFT 5 ++#define ISPCSI2_CTX_CTRL1_CS_EN_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_CS_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CS_EN_DISABLE \ ++ (0x0 << ISPCSI2_CTX_CTRL1_CS_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CS_EN_ENABLE \ ++ (0x1 << ISPCSI2_CTX_CTRL1_CS_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_SHIFT 4 ++#define ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_DISABLE \ ++ (0x0 << ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_ENABLE \ ++ (0x1 << ISPCSI2_CTX_CTRL1_COUNT_UNLOCK_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_PING_PONG_SHIFT 3 ++#define ISPCSI2_CTX_CTRL1_PING_PONG_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_PING_PONG_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CTX_EN_SHIFT 0 ++#define ISPCSI2_CTX_CTRL1_CTX_EN_MASK \ ++ (0x1 << ISPCSI2_CTX_CTRL1_CTX_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CTX_EN_DISABLE \ ++ (0x0 << ISPCSI2_CTX_CTRL1_CTX_EN_SHIFT) ++#define ISPCSI2_CTX_CTRL1_CTX_EN_ENABLE \ ++ (0x1 << ISPCSI2_CTX_CTRL1_CTX_EN_SHIFT) ++ ++#define ISPCSI2_CTX_CTRL2(n) ((0x074) + 0x20 * (n)) ++#define ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT 11 ++#define ISPCSI2_CTX_CTRL2_VIRTUAL_ID_MASK \ ++ (0x3 << ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT) ++#define ISPCSI2_CTX_CTRL2_FORMAT_SHIFT 0 ++#define ISPCSI2_CTX_CTRL2_FORMAT_MASK (0x3FF << \ ++ ISPCSI2_CTX_CTRL2_FORMAT_SHIFT) ++ ++#define ISPCSI2_CTX_DAT_OFST(n) ((0x078) + 0x20 * (n)) ++#define ISPCSI2_CTX_DAT_OFST_OFST_SHIFT 5 ++#define ISPCSI2_CTX_DAT_OFST_OFST_MASK (0x7FF << \ ++ ISPCSI2_CTX_DAT_OFST_OFST_SHIFT) ++ ++#define ISPCSI2_CTX_DAT_PING_ADDR(n) ((0x07C) + 0x20 * (n)) ++#define ISPCSI2_CTX_DAT_PONG_ADDR(n) ((0x080) + 0x20 * (n)) ++#define ISPCSI2_CTX_IRQENABLE(n) ((0x084) + 0x20 * (n)) ++#define ISPCSI2_CTX_IRQENABLE_ECC_CORRECTION_IRQ (1 << 8) ++#define ISPCSI2_CTX_IRQENABLE_LINE_NUMBER_IRQ (1 << 7) ++#define ISPCSI2_CTX_IRQENABLE_FRAME_NUMBER_IRQ (1 << 6) ++#define ISPCSI2_CTX_IRQENABLE_CS_IRQ (1 << 5) ++#define ISPCSI2_CTX_IRQENABLE_LE_IRQ (1 << 3) ++#define ISPCSI2_CTX_IRQENABLE_LS_IRQ (1 << 2) ++#define ISPCSI2_CTX_IRQENABLE_FE_IRQ (1 << 1) ++#define ISPCSI2_CTX_IRQENABLE_FS_IRQ 1 ++#define ISPCSI2_CTX_IRQSTATUS(n) ((0x088) + 0x20 * (n)) ++#define ISPCSI2_CTX_IRQSTATUS_ECC_CORRECTION_IRQ (1 << 8) ++#define ISPCSI2_CTX_IRQSTATUS_LINE_NUMBER_IRQ (1 << 7) ++#define ISPCSI2_CTX_IRQSTATUS_FRAME_NUMBER_IRQ (1 << 6) ++#define ISPCSI2_CTX_IRQSTATUS_CS_IRQ (1 << 5) ++#define ISPCSI2_CTX_IRQSTATUS_LE_IRQ (1 << 3) ++#define ISPCSI2_CTX_IRQSTATUS_LS_IRQ (1 << 2) ++#define ISPCSI2_CTX_IRQSTATUS_FE_IRQ (1 << 1) ++#define ISPCSI2_CTX_IRQSTATUS_FS_IRQ 1 ++ ++#define ISPCSI2_CTX_CTRL3(n) ((0x08C) + 0x20 * (n)) ++#define ISPCSI2_CTX_CTRL3_ALPHA_SHIFT 5 ++#define ISPCSI2_CTX_CTRL3_ALPHA_MASK (0x3FFF << \ ++ ISPCSI2_CTX_CTRL3_ALPHA_SHIFT) ++ ++#define ISPCSI2PHY_CFG0 (0x000) ++#define ISPCSI2PHY_CFG0_THS_TERM_SHIFT 8 ++#define ISPCSI2PHY_CFG0_THS_TERM_MASK \ ++ (0xFF << ISPCSI2PHY_CFG0_THS_TERM_SHIFT) ++#define ISPCSI2PHY_CFG0_THS_TERM_RESETVAL \ ++ (0x04 << ISPCSI2PHY_CFG0_THS_TERM_SHIFT) ++#define ISPCSI2PHY_CFG0_THS_SETTLE_SHIFT 0 ++#define ISPCSI2PHY_CFG0_THS_SETTLE_MASK \ ++ (0xFF << ISPCSI2PHY_CFG0_THS_SETTLE_SHIFT) ++#define ISPCSI2PHY_CFG0_THS_SETTLE_RESETVAL \ ++ (0x27 << ISPCSI2PHY_CFG0_THS_SETTLE_SHIFT) ++#define ISPCSI2PHY_CFG1 (0x004) ++#define ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT 18 ++#define ISPCSI2PHY_CFG1_TCLK_TERM_MASK \ ++ (0x7F << ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT) ++#define ISPCSI2PHY_CFG1_TCLK_TERM__RESETVAL \ ++ (0x00 << ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT) ++#define ISPCSI2PHY_CFG1_RESERVED1_SHIFT 10 ++#define ISPCSI2PHY_CFG1_RESERVED1_MASK \ ++ (0xFF << ISPCSI2PHY_CFG1_RESERVED1_SHIFT) ++#define ISPCSI2PHY_CFG1_RESERVED1__RESETVAL \ ++ (0xB8 << ISPCSI2PHY_CFG1_RESERVED1_SHIFT) ++#define ISPCSI2PHY_CFG1_TCLK_MISS_SHIFT 8 ++#define ISPCSI2PHY_CFG1_TCLK_MISS_MASK \ ++ (0x3 << ISPCSI2PHY_CFG1_TCLK_MISS_SHIFT) ++#define ISPCSI2PHY_CFG1_TCLK_MISS__RESETVAL \ ++ (0x1 << ISPCSI2PHY_CFG1_TCLK_MISS_SHIFT) ++#define ISPCSI2PHY_CFG1_TCLK_SETTLE_SHIFT 0 ++#define ISPCSI2PHY_CFG1_TCLK_SETTLE_MASK \ ++ (0xFF << ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT) ++#define ISPCSI2PHY_CFG1_TCLK_SETTLE__RESETVAL \ ++ (0x0E << ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT) ++#define ISPCSI2PHY_CFG1__RESETVAL (ISPCSI2PHY_CFG1_TCLK_TERM__RESETVAL | \ ++ ISPCSI2PHY_CFG1_RESERVED1__RESETVAL | \ ++ ISPCSI2PHY_CFG1_TCLK_MISS__RESETVAL | \ ++ ISPCSI2PHY_CFG1_TCLK_SETTLE__RESETVAL) ++#define ISPCSI2PHY_CFG1__EDITABLE_MASK (ISPCSI2PHY_CFG1_TCLK_TERM_MASK | \ ++ ISPCSI2PHY_CFG1_RESERVED1_MASK | \ ++ ISPCSI2PHY_CFG1_TCLK_MISS_MASK | \ ++ ISPCSI2PHY_CFG1_TCLK_SETTLE_MASK) ++ ++#endif /* __ISPREG_H__ */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0002-omap3isp-Add-ISP-MMU-wrapper.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0002-omap3isp-Add-ISP-MMU-wrapper.patch new file mode 100644 index 0000000000..cfca26723a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0002-omap3isp-Add-ISP-MMU-wrapper.patch @@ -0,0 +1,209 @@ +From 731527a7dc26533a878c7c5f36fc148fdcaa21b8 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add ISP MMU wrapper + +TODO: + +- The ISP driver should start using the IOMMU directly without this wrapper. + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/ispmmu.c | 141 ++++++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/ispmmu.h | 36 ++++++++++ + 2 files changed, 177 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/ispmmu.c + create mode 100644 drivers/media/video/isp/ispmmu.h + +diff --git a/drivers/media/video/isp/ispmmu.c b/drivers/media/video/isp/ispmmu.c +new file mode 100644 +index 0000000..f872c71 +--- /dev/null ++++ b/drivers/media/video/isp/ispmmu.c +@@ -0,0 +1,141 @@ ++/* ++ * omap iommu wrapper for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008--2009 Nokia. ++ * ++ * Contributors: ++ * Hiroshi Doyu ++ * Sakari Ailus ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++ ++#include "ispmmu.h" ++#include "isp.h" ++ ++#include ++#include ++ ++#define IOMMU_FLAG (IOVMF_ENDIAN_LITTLE | IOVMF_ELSZ_8) ++ ++static struct iommu *isp_iommu; ++ ++dma_addr_t ispmmu_vmalloc(size_t bytes) ++{ ++ return (dma_addr_t)iommu_vmalloc(isp_iommu, 0, bytes, IOMMU_FLAG); ++} ++ ++void ispmmu_vfree(const dma_addr_t da) ++{ ++ iommu_vfree(isp_iommu, (u32)da); ++} ++ ++dma_addr_t ispmmu_kmap(u32 pa, int size) ++{ ++ void *da; ++ ++ da = (void *)iommu_kmap(isp_iommu, 0, pa, size, IOMMU_FLAG); ++ if (IS_ERR(da)) ++ return PTR_ERR(da); ++ ++ return (dma_addr_t)da; ++} ++ ++void ispmmu_kunmap(dma_addr_t da) ++{ ++ iommu_kunmap(isp_iommu, (u32)da); ++} ++ ++dma_addr_t ispmmu_vmap(const struct scatterlist *sglist, ++ int sglen) ++{ ++ int err; ++ void *da; ++ struct sg_table *sgt; ++ unsigned int i; ++ struct scatterlist *sg, *src = (struct scatterlist *)sglist; ++ ++ /* ++ * convert isp sglist to iommu sgt ++ * FIXME: should be fixed in the upper layer? ++ */ ++ sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); ++ if (!sgt) ++ return -ENOMEM; ++ err = sg_alloc_table(sgt, sglen, GFP_KERNEL); ++ if (err) ++ goto err_sg_alloc; ++ ++ for_each_sg(sgt->sgl, sg, sgt->nents, i) ++ sg_set_buf(sg, phys_to_virt(sg_dma_address(src + i)), ++ sg_dma_len(src + i)); ++ ++ da = (void *)iommu_vmap(isp_iommu, 0, sgt, IOMMU_FLAG); ++ if (IS_ERR(da)) ++ goto err_vmap; ++ ++ return (dma_addr_t)da; ++ ++err_vmap: ++ sg_free_table(sgt); ++err_sg_alloc: ++ kfree(sgt); ++ return -ENOMEM; ++} ++EXPORT_SYMBOL_GPL(ispmmu_vmap); ++ ++void ispmmu_vunmap(dma_addr_t da) ++{ ++ struct sg_table *sgt; ++ ++ sgt = iommu_vunmap(isp_iommu, (u32)da); ++ if (!sgt) ++ return; ++ sg_free_table(sgt); ++ kfree(sgt); ++} ++EXPORT_SYMBOL_GPL(ispmmu_vunmap); ++ ++void ispmmu_save_context(void) ++{ ++ if (isp_iommu) ++ iommu_save_ctx(isp_iommu); ++} ++ ++void ispmmu_restore_context(void) ++{ ++ if (isp_iommu) ++ iommu_restore_ctx(isp_iommu); ++} ++ ++int __init ispmmu_init(void) ++{ ++ int err = 0; ++ ++ isp_get(); ++ isp_iommu = iommu_get("isp"); ++ if (IS_ERR(isp_iommu)) { ++ err = PTR_ERR(isp_iommu); ++ isp_iommu = NULL; ++ } ++ isp_put(); ++ ++ return err; ++} ++ ++void ispmmu_cleanup(void) ++{ ++ isp_get(); ++ if (isp_iommu) ++ iommu_put(isp_iommu); ++ isp_put(); ++ isp_iommu = NULL; ++} +diff --git a/drivers/media/video/isp/ispmmu.h b/drivers/media/video/isp/ispmmu.h +new file mode 100644 +index 0000000..0bc5bcb +--- /dev/null ++++ b/drivers/media/video/isp/ispmmu.h +@@ -0,0 +1,36 @@ ++/* ++ * omap iommu wrapper for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008--2009 Nokia. ++ * ++ * Contributors: ++ * Hiroshi Doyu ++ * Sakari Ailus ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_MMU_H ++#define OMAP_ISP_MMU_H ++ ++#include ++#include ++ ++dma_addr_t ispmmu_vmalloc(size_t bytes); ++void ispmmu_vfree(const dma_addr_t da); ++dma_addr_t ispmmu_kmap(u32 pa, int size); ++void ispmmu_kunmap(dma_addr_t da); ++dma_addr_t ispmmu_vmap(const struct scatterlist *sglist, int sglen); ++void ispmmu_vunmap(dma_addr_t da); ++void ispmmu_save_context(void); ++void ispmmu_restore_context(void); ++int ispmmu_init(void); ++void ispmmu_cleanup(void); ++ ++#endif /* OMAP_ISP_MMU_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0003-omap3isp-Add-userspace-header.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0003-omap3isp-Add-userspace-header.patch new file mode 100644 index 0000000000..66c171f544 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0003-omap3isp-Add-userspace-header.patch @@ -0,0 +1,696 @@ +From 98ca1ef8c6e2561989aeef981131cf5077eab1d1 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add userspace header + +Signed-off-by: Sakari Ailus +--- + arch/arm/plat-omap/include/mach/isp_user.h | 676 ++++++++++++++++++++++++++++ + 1 files changed, 676 insertions(+), 0 deletions(-) + create mode 100644 arch/arm/plat-omap/include/mach/isp_user.h + +diff --git a/arch/arm/plat-omap/include/mach/isp_user.h b/arch/arm/plat-omap/include/mach/isp_user.h +new file mode 100644 +index 0000000..b819e26 +--- /dev/null ++++ b/arch/arm/plat-omap/include/mach/isp_user.h +@@ -0,0 +1,676 @@ ++/* ++ * isp_user.h ++ * ++ * Include file for OMAP ISP module in TI's OMAP3. ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Mohit Jalori ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_USER_H ++#define OMAP_ISP_USER_H ++ ++/* ISP Private IOCTLs */ ++#define VIDIOC_PRIVATE_ISP_CCDC_CFG \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct ispccdc_update_config) ++#define VIDIOC_PRIVATE_ISP_PRV_CFG \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 2, struct ispprv_update_config) ++#define VIDIOC_PRIVATE_ISP_AEWB_CFG \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct isph3a_aewb_config) ++#define VIDIOC_PRIVATE_ISP_AEWB_REQ \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct isph3a_aewb_data) ++#define VIDIOC_PRIVATE_ISP_HIST_CFG \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct isp_hist_config) ++#define VIDIOC_PRIVATE_ISP_HIST_REQ \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct isp_hist_data) ++#define VIDIOC_PRIVATE_ISP_AF_CFG \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct af_configuration) ++#define VIDIOC_PRIVATE_ISP_AF_REQ \ ++ _IOWR('V', BASE_VIDIOC_PRIVATE + 9, struct isp_af_data) ++ ++/* AE/AWB related structures and flags*/ ++ ++/* Flags for update field */ ++#define REQUEST_STATISTICS (1 << 0) ++#define SET_COLOR_GAINS (1 << 1) ++#define SET_DIGITAL_GAIN (1 << 2) ++#define SET_EXPOSURE (1 << 3) ++#define SET_ANALOG_GAIN (1 << 4) ++ ++#define MAX_FRAME_COUNT 0x0FFF ++#define MAX_FUTURE_FRAMES 10 ++ ++#define MAX_SATURATION_LIM 1023 ++#define MIN_WIN_H 2 ++#define MAX_WIN_H 256 ++#define MIN_WIN_W 6 ++#define MAX_WIN_W 256 ++#define MAX_WINVC 128 ++#define MAX_WINHC 36 ++#define MAX_WINSTART 4095 ++#define MIN_SUB_INC 2 ++#define MAX_SUB_INC 32 ++ ++/* Range Constants */ ++#define AF_IIRSH_MIN 0 ++#define AF_IIRSH_MAX 4094 ++#define AF_PAXEL_HORIZONTAL_COUNT_MIN 0 ++#define AF_PAXEL_HORIZONTAL_COUNT_MAX 35 ++#define AF_PAXEL_VERTICAL_COUNT_MIN 0 ++#define AF_PAXEL_VERTICAL_COUNT_MAX 127 ++#define AF_PAXEL_INCREMENT_MIN 0 ++#define AF_PAXEL_INCREMENT_MAX 14 ++#define AF_PAXEL_HEIGHT_MIN 0 ++#define AF_PAXEL_HEIGHT_MAX 127 ++#define AF_PAXEL_WIDTH_MIN 0 ++#define AF_PAXEL_WIDTH_MAX 127 ++#define AF_PAXEL_HZSTART_MIN 2 ++#define AF_PAXEL_HZSTART_MAX 4094 ++ ++#define AF_PAXEL_VTSTART_MIN 0 ++#define AF_PAXEL_VTSTART_MAX 4095 ++#define AF_THRESHOLD_MAX 255 ++#define AF_COEF_MAX 4095 ++#define AF_PAXEL_SIZE 48 ++ ++/** ++ * struct isph3a_aewb_config - AE AWB configuration reset values. ++ * saturation_limit: Saturation limit. ++ * @win_height: Window Height. Range 2 - 256, even values only. ++ * @win_width: Window Width. Range 6 - 256, even values only. ++ * @ver_win_count: Vertical Window Count. Range 1 - 128. ++ * @hor_win_count: Horizontal Window Count. Range 1 - 36. ++ * @ver_win_start: Vertical Window Start. Range 0 - 4095. ++ * @hor_win_start: Horizontal Window Start. Range 0 - 4095. ++ * @blk_ver_win_start: Black Vertical Windows Start. Range 0 - 4095. ++ * @blk_win_height: Black Window Height. Range 2 - 256, even values only. ++ * @subsample_ver_inc: Subsample Vertical points increment Range 2 - 32, even ++ * values only. ++ * @subsample_hor_inc: Subsample Horizontal points increment Range 2 - 32, even ++ * values only. ++ * @alaw_enable: AEW ALAW EN flag. ++ * @aewb_enable: AE AWB stats generation EN flag. ++ */ ++struct isph3a_aewb_config { ++ __u16 saturation_limit; ++ __u16 win_height; ++ __u16 win_width; ++ __u16 ver_win_count; ++ __u16 hor_win_count; ++ __u16 ver_win_start; ++ __u16 hor_win_start; ++ __u16 blk_ver_win_start; ++ __u16 blk_win_height; ++ __u16 subsample_ver_inc; ++ __u16 subsample_hor_inc; ++ __u8 alaw_enable; ++ __u8 aewb_enable; ++}; ++ ++/** ++ * struct isph3a_aewb_data - Structure of data sent to or received from user ++ * @h3a_aewb_statistics_buf: Pointer to pass to user. ++ * @shutter: Shutter speed. ++ * @gain: Sensor analog Gain. ++ * @shutter_cap: Shutter speed for capture. ++ * @gain_cap: Sensor Gain for capture. ++ * @dgain: White balance digital gain. ++ * @wb_gain_b: White balance color gain blue. ++ * @wb_gain_r: White balance color gain red. ++ * @wb_gain_gb: White balance color gain green blue. ++ * @wb_gain_gr: White balance color gain green red. ++ * @frame_number: Frame number of requested stats. ++ * @curr_frame: Current frame number being processed. ++ * @update: Bitwise flags to update parameters. ++ * @ts: Timestamp of returned framestats. ++ * @field_count: Sequence number of returned framestats. ++ */ ++struct isph3a_aewb_data { ++ void *h3a_aewb_statistics_buf; ++ __u32 shutter; ++ __u16 gain; ++ __u32 shutter_cap; ++ __u16 gain_cap; ++ __u16 dgain; ++ __u16 wb_gain_b; ++ __u16 wb_gain_r; ++ __u16 wb_gain_gb; ++ __u16 wb_gain_gr; ++ __u16 frame_number; ++ __u16 curr_frame; ++ __u8 update; ++ struct timeval ts; ++ __u32 config_counter; ++ unsigned long field_count; ++}; ++ ++ ++/* Histogram related structs */ ++/* Flags for number of bins */ ++#define BINS_32 0x0 ++#define BINS_64 0x1 ++#define BINS_128 0x2 ++#define BINS_256 0x3 ++ ++struct isp_hist_config { ++ __u8 hist_source; /* CCDC or Memory */ ++ __u8 input_bit_width; /* Needed o know the size per pixel */ ++ __u8 hist_frames; /* Num of frames to be processed and ++ * accumulated ++ */ ++ __u8 hist_h_v_info; /* frame-input width and height if source is ++ * memory ++ */ ++ __u16 hist_radd; /* frame-input address in memory */ ++ __u16 hist_radd_off; /* line-offset for frame-input */ ++ __u16 hist_bins; /* number of bins: 32, 64, 128, or 256 */ ++ __u16 wb_gain_R; /* White Balance Field-to-Pattern Assignments */ ++ __u16 wb_gain_RG; /* White Balance Field-to-Pattern Assignments */ ++ __u16 wb_gain_B; /* White Balance Field-to-Pattern Assignments */ ++ __u16 wb_gain_BG; /* White Balance Field-to-Pattern Assignments */ ++ __u8 num_regions; /* number of regions to be configured */ ++ __u16 reg0_hor; /* Region 0 size and position */ ++ __u16 reg0_ver; /* Region 0 size and position */ ++ __u16 reg1_hor; /* Region 1 size and position */ ++ __u16 reg1_ver; /* Region 1 size and position */ ++ __u16 reg2_hor; /* Region 2 size and position */ ++ __u16 reg2_ver; /* Region 2 size and position */ ++ __u16 reg3_hor; /* Region 3 size and position */ ++ __u16 reg3_ver; /* Region 3 size and position */ ++}; ++ ++struct isp_hist_data { ++ __u32 *hist_statistics_buf; /* Pointer to pass to user */ ++}; ++ ++/* Auto Focus related structs */ ++ ++#define AF_NUMBER_OF_COEF 11 ++ ++/* Flags for update field */ ++#define REQUEST_STATISTICS (1 << 0) ++#define LENS_DESIRED_POSITION (1 << 1) ++#define LENS_CURRENT_POSITION (1 << 2) ++ ++/** ++ * struct isp_af_xtrastats - Extra statistics related to AF generated stats. ++ * @ts: Timestamp when the frame gets delivered to the user. ++ * @field_count: Field count of the frame delivered to the user. ++ * @lens_position: Lens position when the stats are being generated. ++ */ ++struct isp_af_xtrastats { ++ struct timeval ts; ++ unsigned long field_count; ++ __u16 lens_position; /* deprecated */ ++}; ++ ++/** ++ * struct isp_af_data - AF statistics data to transfer between driver and user. ++ * @af_statistics_buf: Pointer to pass to user. ++ * @lens_current_position: Read value of lens absolute position. ++ * @desired_lens_direction: Lens desired location. ++ * @update: Bitwise flags to update parameters. ++ * @frame_number: Data for which frame is desired/given. ++ * @curr_frame: Current frame number being processed by AF module. ++ * @xtrastats: Extra statistics structure. ++ */ ++struct isp_af_data { ++ void *af_statistics_buf; ++ __u16 lens_current_position; /* deprecated */ ++ __u16 desired_lens_direction; /* deprecated */ ++ __u16 update; ++ __u16 frame_number; ++ __u16 curr_frame; ++ __u32 config_counter; ++ struct isp_af_xtrastats xtrastats; ++}; ++ ++/* enum used for status of specific feature */ ++enum af_alaw_enable { ++ H3A_AF_ALAW_DISABLE = 0, ++ H3A_AF_ALAW_ENABLE = 1 ++}; ++ ++enum af_hmf_enable { ++ H3A_AF_HMF_DISABLE = 0, ++ H3A_AF_HMF_ENABLE = 1 ++}; ++ ++enum af_config_flag { ++ H3A_AF_CFG_DISABLE = 0, ++ H3A_AF_CFG_ENABLE = 1 ++}; ++ ++enum af_mode { ++ ACCUMULATOR_SUMMED = 0, ++ ACCUMULATOR_PEAK = 1 ++}; ++ ++/* Red, Green, and blue pixel location in the AF windows */ ++enum rgbpos { ++ GR_GB_BAYER = 0, /* GR and GB as Bayer pattern */ ++ RG_GB_BAYER = 1, /* RG and GB as Bayer pattern */ ++ GR_BG_BAYER = 2, /* GR and BG as Bayer pattern */ ++ RG_BG_BAYER = 3, /* RG and BG as Bayer pattern */ ++ GG_RB_CUSTOM = 4, /* GG and RB as custom pattern */ ++ RB_GG_CUSTOM = 5 /* RB and GG as custom pattern */ ++}; ++ ++/* Contains the information regarding the Horizontal Median Filter */ ++struct af_hmf { ++ enum af_hmf_enable enable; /* Status of Horizontal Median Filter */ ++ unsigned int threshold; /* Threshhold Value for Horizontal Median ++ * Filter ++ */ ++}; ++ ++/* Contains the information regarding the IIR Filters */ ++struct af_iir { ++ unsigned int hz_start_pos; /* IIR Start Register Value */ ++ int coeff_set0[AF_NUMBER_OF_COEF]; /* ++ * IIR Filter Coefficient for ++ * Set 0 ++ */ ++ int coeff_set1[AF_NUMBER_OF_COEF]; /* ++ * IIR Filter Coefficient for ++ * Set 1 ++ */ ++}; ++ ++/* Contains the information regarding the Paxels Structure in AF Engine */ ++struct af_paxel { ++ unsigned int width; /* Width of the Paxel */ ++ unsigned int height; /* Height of the Paxel */ ++ unsigned int hz_start; /* Horizontal Start Position */ ++ unsigned int vt_start; /* Vertical Start Position */ ++ unsigned int hz_cnt; /* Horizontal Count */ ++ unsigned int vt_cnt; /* vertical Count */ ++ unsigned int line_incr; /* Line Increment */ ++}; ++/* Contains the parameters required for hardware set up of AF Engine */ ++struct af_configuration { ++ enum af_alaw_enable alaw_enable; /*ALWAW status */ ++ struct af_hmf hmf_config; /*HMF configurations */ ++ enum rgbpos rgb_pos; /*RGB Positions */ ++ struct af_iir iir_config; /*IIR filter configurations */ ++ struct af_paxel paxel_config; /*Paxel parameters */ ++ enum af_mode mode; /*Accumulator mode */ ++ enum af_config_flag af_config; /*Flag indicates Engine is configured */ ++}; ++ ++/* ISP CCDC structs */ ++ ++/* Abstraction layer CCDC configurations */ ++#define ISP_ABS_CCDC_ALAW (1 << 0) ++#define ISP_ABS_CCDC_LPF (1 << 1) ++#define ISP_ABS_CCDC_BLCLAMP (1 << 2) ++#define ISP_ABS_CCDC_BCOMP (1 << 3) ++#define ISP_ABS_CCDC_FPC (1 << 4) ++#define ISP_ABS_CCDC_CULL (1 << 5) ++#define ISP_ABS_CCDC_COLPTN (1 << 6) ++#define ISP_ABS_CCDC_CONFIG_LSC (1 << 7) ++#define ISP_ABS_TBL_LSC (1 << 8) ++ ++#define RGB_MAX 3 ++ ++/* Enumeration constants for Alaw input width */ ++enum alaw_ipwidth { ++ ALAW_BIT12_3 = 0x3, ++ ALAW_BIT11_2 = 0x4, ++ ALAW_BIT10_1 = 0x5, ++ ALAW_BIT9_0 = 0x6 ++}; ++ ++/* Enumeration constants for Video Port */ ++enum vpin { ++ BIT12_3 = 3, ++ BIT11_2 = 4, ++ BIT10_1 = 5, ++ BIT9_0 = 6 ++}; ++ ++enum vpif_freq { ++ PIXCLKBY2, ++ PIXCLKBY3_5, ++ PIXCLKBY4_5, ++ PIXCLKBY5_5, ++ PIXCLKBY6_5 ++}; ++ ++/** ++ * struct ispccdc_lsc_config - Structure for LSC configuration. ++ * @offset: Table Offset of the gain table. ++ * @gain_mode_n: Vertical dimension of a paxel in LSC configuration. ++ * @gain_mode_m: Horizontal dimension of a paxel in LSC configuration. ++ * @gain_format: Gain table format. ++ * @fmtsph: Start pixel horizontal from start of the HS sync pulse. ++ * @fmtlnh: Number of pixels in horizontal direction to use for the data ++ * reformatter. ++ * @fmtslv: Start line from start of VS sync pulse for the data reformatter. ++ * @fmtlnv: Number of lines in vertical direction for the data reformatter. ++ * @initial_x: X position, in pixels, of the first active pixel in reference ++ * to the first active paxel. Must be an even number. ++ * @initial_y: Y position, in pixels, of the first active pixel in reference ++ * to the first active paxel. Must be an even number. ++ * @size: Size of LSC gain table. Filled when loaded from userspace. ++ */ ++struct ispccdc_lsc_config { ++ __u16 offset; ++ __u8 gain_mode_n; ++ __u8 gain_mode_m; ++ __u8 gain_format; ++ __u16 fmtsph; ++ __u16 fmtlnh; ++ __u16 fmtslv; ++ __u16 fmtlnv; ++ __u8 initial_x; ++ __u8 initial_y; ++ __u32 size; ++}; ++ ++/** ++ * struct ispccdc_bclamp - Structure for Optical & Digital black clamp subtract ++ * @obgain: Optical black average gain. ++ * @obstpixel: Start Pixel w.r.t. HS pulse in Optical black sample. ++ * @oblines: Optical Black Sample lines. ++ * @oblen: Optical Black Sample Length. ++ * @dcsubval: Digital Black Clamp subtract value. ++ */ ++struct ispccdc_bclamp { ++ __u8 obgain; ++ __u8 obstpixel; ++ __u8 oblines; ++ __u8 oblen; ++ __u16 dcsubval; ++}; ++ ++/** ++ * ispccdc_fpc - Structure for FPC ++ * @fpnum: Number of faulty pixels to be corrected in the frame. ++ * @fpcaddr: Memory address of the FPC Table ++ */ ++struct ispccdc_fpc { ++ __u16 fpnum; ++ __u32 fpcaddr; ++}; ++ ++/** ++ * ispccdc_blcomp - Structure for Black Level Compensation parameters. ++ * @b_mg: B/Mg pixels. 2's complement. -128 to +127. ++ * @gb_g: Gb/G pixels. 2's complement. -128 to +127. ++ * @gr_cy: Gr/Cy pixels. 2's complement. -128 to +127. ++ * @r_ye: R/Ye pixels. 2's complement. -128 to +127. ++ */ ++struct ispccdc_blcomp { ++ __u8 b_mg; ++ __u8 gb_g; ++ __u8 gr_cy; ++ __u8 r_ye; ++}; ++ ++/** ++ * struct ispccdc_vp - Structure for Video Port parameters ++ * @bitshift_sel: Video port input select. 3 - bits 12-3, 4 - bits 11-2, ++ * 5 - bits 10-1, 6 - bits 9-0. ++ * @freq_sel: Video port data ready frequency. 1 - 1/3.5, 2 - 1/4.5, ++ * 3 - 1/5.5, 4 - 1/6.5. ++ */ ++struct ispccdc_vp { ++ enum vpin bitshift_sel; ++ enum vpif_freq freq_sel; ++}; ++ ++/** ++ * ispccdc_culling - Structure for Culling parameters. ++ * @v_pattern: Vertical culling pattern. ++ * @h_odd: Horizontal Culling pattern for odd lines. ++ * @h_even: Horizontal Culling pattern for even lines. ++ */ ++struct ispccdc_culling { ++ __u8 v_pattern; ++ __u16 h_odd; ++ __u16 h_even; ++}; ++ ++/** ++ * ispccdc_update_config - Structure for CCDC configuration. ++ * @update: Specifies which CCDC registers should be updated. ++ * @flag: Specifies which CCDC functions should be enabled. ++ * @alawip: Enable/Disable A-Law compression. ++ * @bclamp: Black clamp control register. ++ * @blcomp: Black level compensation value for RGrGbB Pixels. 2's complement. ++ * @fpc: Number of faulty pixels corrected in the frame, address of FPC table. ++ * @cull: Cull control register. ++ * @colptn: Color pattern of the sensor. ++ * @lsc: Pointer to LSC gain table. ++ */ ++struct ispccdc_update_config { ++ __u16 update; ++ __u16 flag; ++ enum alaw_ipwidth alawip; ++ struct ispccdc_bclamp *bclamp; ++ struct ispccdc_blcomp *blcomp; ++ struct ispccdc_fpc *fpc; ++ struct ispccdc_lsc_config *lsc_cfg; ++ struct ispccdc_culling *cull; ++ __u32 colptn; ++ __u8 *lsc; ++}; ++ ++/* Preview configuration */ ++ ++/*Abstraction layer preview configurations*/ ++#define ISP_ABS_PREV_LUMAENH (1 << 0) ++#define ISP_ABS_PREV_INVALAW (1 << 1) ++#define ISP_ABS_PREV_HRZ_MED (1 << 2) ++#define ISP_ABS_PREV_CFA (1 << 3) ++#define ISP_ABS_PREV_CHROMA_SUPP (1 << 4) ++#define ISP_ABS_PREV_WB (1 << 5) ++#define ISP_ABS_PREV_BLKADJ (1 << 6) ++#define ISP_ABS_PREV_RGB2RGB (1 << 7) ++#define ISP_ABS_PREV_COLOR_CONV (1 << 8) ++#define ISP_ABS_PREV_YC_LIMIT (1 << 9) ++#define ISP_ABS_PREV_DEFECT_COR (1 << 10) ++#define ISP_ABS_PREV_GAMMABYPASS (1 << 11) ++#define ISP_ABS_TBL_NF (1 << 12) ++#define ISP_ABS_TBL_REDGAMMA (1 << 13) ++#define ISP_ABS_TBL_GREENGAMMA (1 << 14) ++#define ISP_ABS_TBL_BLUEGAMMA (1 << 15) ++ ++#define ISPPRV_NF_TBL_SIZE 64 ++#define ISPPRV_CFA_TBL_SIZE 576 ++#define ISPPRV_GAMMA_TBL_SIZE 1024 ++#define ISPPRV_YENH_TBL_SIZE 128 ++ ++/** ++ * struct ispprev_hmed - Structure for Horizontal Median Filter. ++ * @odddist: Distance between consecutive pixels of same color in the odd line. ++ * @evendist: Distance between consecutive pixels of same color in the even ++ * line. ++ * @thres: Horizontal median filter threshold. ++ */ ++struct ispprev_hmed { ++ __u8 odddist; ++ __u8 evendist; ++ __u8 thres; ++}; ++ ++/* ++ * Enumeration for CFA Formats supported by preview ++ */ ++enum cfa_fmt { ++ CFAFMT_BAYER, CFAFMT_SONYVGA, CFAFMT_RGBFOVEON, ++ CFAFMT_DNSPL, CFAFMT_HONEYCOMB, CFAFMT_RRGGBBFOVEON ++}; ++ ++/** ++ * struct ispprev_cfa - Structure for CFA Inpterpolation. ++ * @cfafmt: CFA Format Enum value supported by preview. ++ * @cfa_gradthrs_vert: CFA Gradient Threshold - Vertical. ++ * @cfa_gradthrs_horz: CFA Gradient Threshold - Horizontal. ++ * @cfa_table: Pointer to the CFA table. ++ */ ++struct ispprev_cfa { ++ enum cfa_fmt cfafmt; ++ __u8 cfa_gradthrs_vert; ++ __u8 cfa_gradthrs_horz; ++ __u32 *cfa_table; ++}; ++ ++/** ++ * struct ispprev_csup - Structure for Chrominance Suppression. ++ * @gain: Gain. ++ * @thres: Threshold. ++ * @hypf_en: Flag to enable/disable the High Pass Filter. ++ */ ++struct ispprev_csup { ++ __u8 gain; ++ __u8 thres; ++ __u8 hypf_en; ++}; ++ ++/** ++ * struct ispprev_wbal - Structure for White Balance. ++ * @dgain: Digital gain (U10Q8). ++ * @coef3: White balance gain - COEF 3 (U8Q5). ++ * @coef2: White balance gain - COEF 2 (U8Q5). ++ * @coef1: White balance gain - COEF 1 (U8Q5). ++ * @coef0: White balance gain - COEF 0 (U8Q5). ++ */ ++struct ispprev_wbal { ++ __u16 dgain; ++ __u8 coef3; ++ __u8 coef2; ++ __u8 coef1; ++ __u8 coef0; ++}; ++ ++/** ++ * struct ispprev_blkadj - Structure for Black Adjustment. ++ * @red: Black level offset adjustment for Red in 2's complement format ++ * @green: Black level offset adjustment for Green in 2's complement format ++ * @blue: Black level offset adjustment for Blue in 2's complement format ++ */ ++struct ispprev_blkadj { ++ /*Black level offset adjustment for Red in 2's complement format */ ++ __u8 red; ++ /*Black level offset adjustment for Green in 2's complement format */ ++ __u8 green; ++ /* Black level offset adjustment for Blue in 2's complement format */ ++ __u8 blue; ++}; ++ ++/** ++ * struct ispprev_rgbtorgb - Structure for RGB to RGB Blending. ++ * @matrix: Blending values(S12Q8 format) ++ * [RR] [GR] [BR] ++ * [RG] [GG] [BG] ++ * [RB] [GB] [BB] ++ * @offset: Blending offset value for R,G,B in 2's complement integer format. ++ */ ++struct ispprev_rgbtorgb { ++ __u16 matrix[3][3]; ++ __u16 offset[3]; ++}; ++ ++/** ++ * struct ispprev_csc - Structure for Color Space Conversion from RGB-YCbYCr ++ * @matrix: Color space conversion coefficients(S10Q8) ++ * [CSCRY] [CSCGY] [CSCBY] ++ * [CSCRCB] [CSCGCB] [CSCBCB] ++ * [CSCRCR] [CSCGCR] [CSCBCR] ++ * @offset: CSC offset values for Y offset, CB offset and CR offset respectively ++ */ ++struct ispprev_csc { ++ __u16 matrix[RGB_MAX][RGB_MAX]; ++ __s16 offset[RGB_MAX]; ++}; ++ ++/** ++ * struct ispprev_yclimit - Structure for Y, C Value Limit. ++ * @minC: Minimum C value ++ * @maxC: Maximum C value ++ * @minY: Minimum Y value ++ * @maxY: Maximum Y value ++ */ ++struct ispprev_yclimit { ++ __u8 minC; ++ __u8 maxC; ++ __u8 minY; ++ __u8 maxY; ++}; ++ ++/** ++ * struct ispprev_dcor - Structure for Defect correction. ++ * @couplet_mode_en: Flag to enable or disable the couplet dc Correction in NF ++ * @detect_correct: Thresholds for correction bit 0:10 detect 16:25 correct ++ */ ++struct ispprev_dcor { ++ __u8 couplet_mode_en; ++ __u32 detect_correct[4]; ++}; ++ ++/** ++ * struct ispprev_nf - Structure for Noise Filter ++ * @spread: Spread value to be used in Noise Filter ++ * @table: Pointer to the Noise Filter table ++ */ ++struct ispprev_nf { ++ __u8 spread; ++ __u32 table[ISPPRV_NF_TBL_SIZE]; ++}; ++ ++/** ++ * struct ispprv_update_config - Structure for Preview Configuration (user). ++ * @update: Specifies which ISP Preview registers should be updated. ++ * @flag: Specifies which ISP Preview functions should be enabled. ++ * @yen: Pointer to luma enhancement table. ++ * @shading_shift: 3bit value of shift used in shading compensation. ++ * @prev_hmed: Pointer to structure containing the odd and even distance. ++ * between the pixels in the image along with the filter threshold. ++ * @prev_cfa: Pointer to structure containing the CFA interpolation table, CFA. ++ * format in the image, vertical and horizontal gradient threshold. ++ * @csup: Pointer to Structure for Chrominance Suppression coefficients. ++ * @prev_wbal: Pointer to structure for White Balance. ++ * @prev_blkadj: Pointer to structure for Black Adjustment. ++ * @rgb2rgb: Pointer to structure for RGB to RGB Blending. ++ * @prev_csc: Pointer to structure for Color Space Conversion from RGB-YCbYCr. ++ * @yclimit: Pointer to structure for Y, C Value Limit. ++ * @prev_dcor: Pointer to structure for defect correction. ++ * @prev_nf: Pointer to structure for Noise Filter ++ * @red_gamma: Pointer to red gamma correction table. ++ * @green_gamma: Pointer to green gamma correction table. ++ * @blue_gamma: Pointer to blue gamma correction table. ++ */ ++struct ispprv_update_config { ++ __u16 update; ++ __u16 flag; ++ void *yen; ++ __u32 shading_shift; ++ struct ispprev_hmed *prev_hmed; ++ struct ispprev_cfa *prev_cfa; ++ struct ispprev_csup *csup; ++ struct ispprev_wbal *prev_wbal; ++ struct ispprev_blkadj *prev_blkadj; ++ struct ispprev_rgbtorgb *rgb2rgb; ++ struct ispprev_csc *prev_csc; ++ struct ispprev_yclimit *yclimit; ++ struct ispprev_dcor *prev_dcor; ++ struct ispprev_nf *prev_nf; ++ __u32 *red_gamma; ++ __u32 *green_gamma; ++ __u32 *blue_gamma; ++}; ++ ++#endif /* OMAP_ISP_USER_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0004-omap3isp-Add-ISP-frontend-CCDC.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0004-omap3isp-Add-ISP-frontend-CCDC.patch new file mode 100644 index 0000000000..4a161729fd --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0004-omap3isp-Add-ISP-frontend-CCDC.patch @@ -0,0 +1,1875 @@ +From 9ea796fe5383a6961125a6a18185a901fe8627d7 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add ISP frontend (CCDC) + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/ispccdc.c | 1638 +++++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/ispccdc.h | 209 +++++ + 2 files changed, 1847 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/ispccdc.c + create mode 100644 drivers/media/video/isp/ispccdc.h + +diff --git a/drivers/media/video/isp/ispccdc.c b/drivers/media/video/isp/ispccdc.c +new file mode 100644 +index 0000000..2574ea2 +--- /dev/null ++++ b/drivers/media/video/isp/ispccdc.c +@@ -0,0 +1,1638 @@ ++/* ++ * ispccdc.c ++ * ++ * Driver Library for CCDC module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Senthilvadivu Guruswamy ++ * Pallavi Kulkarni ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispccdc.h" ++#include "ispmmu.h" ++ ++#define LSC_TABLE_INIT_SIZE 50052 ++ ++static u32 *fpc_table_add; ++static unsigned long fpc_table_add_m; ++ ++/** ++ * struct isp_ccdc - Structure for the CCDC module to store its own information ++ * @ccdc_inuse: Flag to determine if CCDC has been reserved or not (0 or 1). ++ * @ccdcout_w: CCDC output width. ++ * @ccdcout_h: CCDC output height. ++ * @ccdcin_w: CCDC input width. ++ * @ccdcin_h: CCDC input height. ++ * @ccdcin_woffset: CCDC input horizontal offset. ++ * @ccdcin_hoffset: CCDC input vertical offset. ++ * @crop_w: Crop width. ++ * @crop_h: Crop weight. ++ * @ccdc_inpfmt: CCDC input format. ++ * @ccdc_outfmt: CCDC output format. ++ * @vpout_en: Video port output enable. ++ * @wen: Data write enable. ++ * @exwen: External data write enable. ++ * @refmt_en: Reformatter enable. ++ * @ccdcslave: CCDC slave mode enable. ++ * @syncif_ipmod: Image ++ * @obclamp_en: Data input format. ++ * @mutexlock: Mutex used to get access to the CCDC. ++ */ ++static struct isp_ccdc { ++ u8 ccdc_inuse; ++ u32 ccdcout_w; ++ u32 ccdcout_h; ++ u32 ccdcin_w; ++ u32 ccdcin_h; ++ u32 ccdcin_woffset; ++ u32 ccdcin_hoffset; ++ u32 crop_w; ++ u32 crop_h; ++ u8 ccdc_inpfmt; ++ u8 ccdc_outfmt; ++ u8 vpout_en; ++ u8 wen; ++ u8 exwen; ++ u8 refmt_en; ++ u8 ccdcslave; ++ u8 syncif_ipmod; ++ u8 obclamp_en; ++ u8 pm_state; ++ u8 lsc_enable; ++ int lsc_state; ++ struct mutex mutexlock; /* For checking/modifying ccdc_inuse */ ++ u32 wenlog; ++} ispccdc_obj; ++ ++static struct ispccdc_lsc_config lsc_config; ++static u8 *lsc_gain_table; ++static unsigned long lsc_ispmmu_addr; ++static int lsc_initialized; ++static u8 *lsc_gain_table_tmp; ++ ++/* Structure for saving/restoring CCDC module registers*/ ++static struct isp_reg ispccdc_reg_list[] = { ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HD_VD_WID, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PIX_LINES, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_START, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_LINES, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CULLING, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HSIZE_OFF, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDR_ADDR, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CLAMP, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_DCSUB, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_COLPTN, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_BLKCMP, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC_ADDR, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_ALAW, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_HORZ, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_VERT, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR0, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR1, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR2, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR3, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR4, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR5, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR6, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_ADDR7, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PRGEVEN0, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PRGEVEN1, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PRGODD0, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PRGODD1, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VP_OUT, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_CONFIG, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_INITIAL, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_TABLE_BASE, 0}, ++ {OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_TABLE_OFFSET, 0}, ++ {0, ISP_TOK_TERM, 0} ++}; ++ ++/** ++ * omap34xx_isp_ccdc_config - Sets CCDC configuration from userspace ++ * @userspace_add: Structure containing CCDC configuration sent from userspace. ++ * ++ * Returns 0 if successful, -EINVAL if the pointer to the configuration ++ * structure is null, or the copy_from_user function fails to copy user space ++ * memory to kernel space memory. ++ **/ ++int omap34xx_isp_ccdc_config(void *userspace_add) ++{ ++ struct ispccdc_bclamp bclamp_t; ++ struct ispccdc_blcomp blcomp_t; ++ struct ispccdc_fpc fpc_t; ++ struct ispccdc_culling cull_t; ++ struct ispccdc_update_config *ccdc_struct; ++ ++ if (userspace_add == NULL) ++ return -EINVAL; ++ ++ ccdc_struct = userspace_add; ++ ++ if (ISP_ABS_CCDC_ALAW & ccdc_struct->flag) { ++ if (ISP_ABS_CCDC_ALAW & ccdc_struct->update) ++ ispccdc_config_alaw(ccdc_struct->alawip); ++ ispccdc_enable_alaw(1); ++ } else if (ISP_ABS_CCDC_ALAW & ccdc_struct->update) ++ ispccdc_enable_alaw(0); ++ ++ if (ISP_ABS_CCDC_LPF & ccdc_struct->flag) ++ ispccdc_enable_lpf(1); ++ else ++ ispccdc_enable_lpf(0); ++ ++ if (ISP_ABS_CCDC_BLCLAMP & ccdc_struct->flag) { ++ if (ISP_ABS_CCDC_BLCLAMP & ccdc_struct->update) { ++ if (copy_from_user(&bclamp_t, (struct ispccdc_bclamp *) ++ ccdc_struct->bclamp, ++ sizeof(struct ispccdc_bclamp))) ++ goto copy_from_user_err; ++ ++ ispccdc_enable_black_clamp(1); ++ ispccdc_config_black_clamp(bclamp_t); ++ } else ++ ispccdc_enable_black_clamp(1); ++ } else { ++ if (ISP_ABS_CCDC_BLCLAMP & ccdc_struct->update) { ++ if (copy_from_user(&bclamp_t, (struct ispccdc_bclamp *) ++ ccdc_struct->bclamp, ++ sizeof(struct ispccdc_bclamp))) ++ goto copy_from_user_err; ++ ++ ispccdc_enable_black_clamp(0); ++ ispccdc_config_black_clamp(bclamp_t); ++ } ++ } ++ ++ if (ISP_ABS_CCDC_BCOMP & ccdc_struct->update) { ++ if (copy_from_user(&blcomp_t, (struct ispccdc_blcomp *) ++ ccdc_struct->blcomp, ++ sizeof(blcomp_t))) ++ goto copy_from_user_err; ++ ++ ispccdc_config_black_comp(blcomp_t); ++ } ++ ++ if (ISP_ABS_CCDC_FPC & ccdc_struct->flag) { ++ if (ISP_ABS_CCDC_FPC & ccdc_struct->update) { ++ if (copy_from_user(&fpc_t, (struct ispccdc_fpc *) ++ ccdc_struct->fpc, ++ sizeof(fpc_t))) ++ goto copy_from_user_err; ++ fpc_table_add = kmalloc(64 + fpc_t.fpnum * 4, ++ GFP_KERNEL | GFP_DMA); ++ if (!fpc_table_add) { ++ printk(KERN_ERR "Cannot allocate memory for" ++ " FPC table"); ++ return -ENOMEM; ++ } ++ while (((unsigned long)fpc_table_add & 0xFFFFFFC0) ++ != (unsigned long)fpc_table_add) ++ fpc_table_add++; ++ ++ fpc_table_add_m = ispmmu_kmap(virt_to_phys ++ (fpc_table_add), ++ fpc_t.fpnum * 4); ++ ++ if (copy_from_user(fpc_table_add, (u32 *)fpc_t.fpcaddr, ++ fpc_t.fpnum * 4)) ++ goto copy_from_user_err; ++ ++ fpc_t.fpcaddr = fpc_table_add_m; ++ ispccdc_config_fpc(fpc_t); ++ } ++ ispccdc_enable_fpc(1); ++ } else if (ISP_ABS_CCDC_FPC & ccdc_struct->update) ++ ispccdc_enable_fpc(0); ++ ++ if (ISP_ABS_CCDC_CULL & ccdc_struct->update) { ++ if (copy_from_user(&cull_t, (struct ispccdc_culling *) ++ ccdc_struct->cull, ++ sizeof(cull_t))) ++ goto copy_from_user_err; ++ ispccdc_config_culling(cull_t); ++ } ++ ++ if (is_isplsc_activated()) { ++ if (ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct->flag) { ++ if (ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct->update) { ++ if (copy_from_user( ++ &lsc_config, ++ (struct ispccdc_lsc_config *) ++ ccdc_struct->lsc_cfg, ++ sizeof(struct ispccdc_lsc_config))) ++ goto copy_from_user_err; ++ ispccdc_config_lsc(&lsc_config); ++ } ++ ispccdc_enable_lsc(1); ++ } else if (ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct->update) { ++ ispccdc_enable_lsc(0); ++ } ++ if (ISP_ABS_TBL_LSC & ccdc_struct->update) { ++ if (copy_from_user(lsc_gain_table, ++ ccdc_struct->lsc, lsc_config.size)) ++ goto copy_from_user_err; ++ ispccdc_load_lsc(lsc_gain_table, lsc_config.size); ++ } ++ } ++ ++ if (ISP_ABS_CCDC_COLPTN & ccdc_struct->update) ++ ispccdc_config_imgattr(ccdc_struct->colptn); ++ ++ return 0; ++ ++copy_from_user_err: ++ printk(KERN_ERR "CCDC Config:Copy From User Error"); ++ return -EINVAL ; ++} ++EXPORT_SYMBOL(omap34xx_isp_ccdc_config); ++ ++/** ++ * Set the value to be used for CCDC_CFG.WENLOG. ++ * w - Value of wenlog. ++ */ ++void ispccdc_set_wenlog(u32 wenlog) ++{ ++ ispccdc_obj.wenlog = wenlog; ++} ++EXPORT_SYMBOL(ispccdc_set_wenlog); ++ ++/** ++ * ispccdc_request - Reserves the CCDC module. ++ * ++ * Reserves the CCDC module and assures that is used only once at a time. ++ * ++ * Returns 0 if successful, or -EBUSY if CCDC module is busy. ++ **/ ++int ispccdc_request(void) ++{ ++ mutex_lock(&ispccdc_obj.mutexlock); ++ if (ispccdc_obj.ccdc_inuse) { ++ mutex_unlock(&ispccdc_obj.mutexlock); ++ DPRINTK_ISPCCDC("ISP_ERR : CCDC Module Busy\n"); ++ return -EBUSY; ++ } ++ ++ ispccdc_obj.ccdc_inuse = 1; ++ mutex_unlock(&ispccdc_obj.mutexlock); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ISPCTRL_CCDC_RAM_EN | ++ ISPCTRL_CCDC_CLK_EN | ++ ISPCTRL_SBL_WR1_RAM_EN); ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG, ISPCCDC_CFG_VDLC); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_request); ++ ++/** ++ * ispccdc_free - Frees the CCDC module. ++ * ++ * Frees the CCDC module so it can be used by another process. ++ * ++ * Returns 0 if successful, or -EINVAL if module has been already freed. ++ **/ ++int ispccdc_free(void) ++{ ++ mutex_lock(&ispccdc_obj.mutexlock); ++ if (!ispccdc_obj.ccdc_inuse) { ++ mutex_unlock(&ispccdc_obj.mutexlock); ++ DPRINTK_ISPCCDC("ISP_ERR: CCDC Module already freed\n"); ++ return -EINVAL; ++ } ++ ++ ispccdc_obj.ccdc_inuse = 0; ++ mutex_unlock(&ispccdc_obj.mutexlock); ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ++ ~(ISPCTRL_CCDC_CLK_EN | ++ ISPCTRL_CCDC_RAM_EN | ++ ISPCTRL_SBL_WR1_RAM_EN)); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_free); ++ ++/** ++ * ispccdc_free_lsc - Frees Lens Shading Compensation table ++ * ++ * Always returns 0. ++ **/ ++static int ispccdc_free_lsc(void) ++{ ++ if (!lsc_ispmmu_addr) ++ return 0; ++ ++ ispccdc_enable_lsc(0); ++ lsc_initialized = 0; ++ isp_reg_writel(0, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_TABLE_BASE); ++ ispmmu_kunmap(lsc_ispmmu_addr); ++ kfree(lsc_gain_table); ++ return 0; ++} ++ ++/** ++ * ispccdc_allocate_lsc - Allocate space for Lens Shading Compensation table ++ * @table_size: LSC gain table size. ++ * ++ * Returns 0 if successful, -ENOMEM of its no memory available, or -EINVAL if ++ * table_size is zero. ++ **/ ++static int ispccdc_allocate_lsc(u32 table_size) ++{ ++ if (table_size == 0) ++ return -EINVAL; ++ ++ if ((lsc_config.size >= table_size) && lsc_gain_table) ++ return 0; ++ ++ ispccdc_free_lsc(); ++ ++ lsc_gain_table = kmalloc(table_size, GFP_KERNEL | GFP_DMA); ++ ++ if (!lsc_gain_table) { ++ printk(KERN_ERR "Cannot allocate memory for gain tables \n"); ++ return -ENOMEM; ++ } ++ ++ lsc_ispmmu_addr = ispmmu_kmap(virt_to_phys(lsc_gain_table), table_size); ++ if (lsc_ispmmu_addr <= 0) { ++ printk(KERN_ERR "Cannot map memory for gain tables \n"); ++ kfree(lsc_gain_table); ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++/** ++ * ispccdc_program_lsc - Program Lens Shading Compensation table. ++ * @table_size: LSC gain table size. ++ * ++ * Returns 0 if successful, or -EINVAL if there's no mapped address for the ++ * table yet. ++ **/ ++static int ispccdc_program_lsc(void) ++{ ++ if (!lsc_ispmmu_addr) ++ return -EINVAL; ++ ++ if (lsc_initialized) ++ return 0; ++ ++ isp_reg_writel(lsc_ispmmu_addr, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_TABLE_BASE); ++ lsc_initialized = 1; ++ return 0; ++} ++ ++/** ++ * ispccdc_load_lsc - Load Lens Shading Compensation table. ++ * @table_addr: LSC gain table MMU Mapped address. ++ * @table_size: LSC gain table size. ++ * ++ * Returns 0 if successful, -ENOMEM of its no memory available, or -EINVAL if ++ * table_size is zero. ++ **/ ++int ispccdc_load_lsc(u8 *table_addr, u32 table_size) ++{ ++ int ret; ++ ++ if (!is_isplsc_activated()) ++ return 0; ++ ++ if (!table_addr) ++ return -EINVAL; ++ ++ ret = ispccdc_allocate_lsc(table_size); ++ if (ret) ++ return ret; ++ ++ if (table_addr != lsc_gain_table) ++ memcpy(lsc_gain_table, table_addr, table_size); ++ ret = ispccdc_program_lsc(); ++ if (ret) ++ return ret; ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_load_lsc); ++ ++/** ++ * ispccdc_config_lsc - Configures the lens shading compensation module ++ * @lsc_cfg: LSC configuration structure ++ **/ ++void ispccdc_config_lsc(struct ispccdc_lsc_config *lsc_cfg) ++{ ++ int reg; ++ ++ if (!is_isplsc_activated()) ++ return; ++ ++ ispccdc_enable_lsc(0); ++ isp_reg_writel(lsc_cfg->offset, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_TABLE_OFFSET); ++ ++ reg = 0; ++ reg |= lsc_cfg->gain_mode_n << ISPCCDC_LSC_GAIN_MODE_N_SHIFT; ++ reg |= lsc_cfg->gain_mode_m << ISPCCDC_LSC_GAIN_MODE_M_SHIFT; ++ reg |= lsc_cfg->gain_format << ISPCCDC_LSC_GAIN_FORMAT_SHIFT; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_CONFIG); ++ ++ reg = 0; ++ reg &= ~ISPCCDC_LSC_INITIAL_X_MASK; ++ reg |= lsc_cfg->initial_x << ISPCCDC_LSC_INITIAL_X_SHIFT; ++ reg &= ~ISPCCDC_LSC_INITIAL_Y_MASK; ++ reg |= lsc_cfg->initial_y << ISPCCDC_LSC_INITIAL_Y_SHIFT; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_INITIAL); ++} ++EXPORT_SYMBOL(ispccdc_config_lsc); ++ ++int __ispccdc_enable_lsc(u8 enable) ++{ ++ if (!is_isplsc_activated()) ++ return -ENODEV; ++ ++ if (enable) { ++ if (!ispccdc_busy()) { ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ++ ISPCTRL_SBL_SHARED_RPORTB ++ | ISPCTRL_SBL_RD_RAM_EN); ++ ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_CONFIG, 0x1); ++ ++ ispccdc_obj.lsc_state = 1; ++ } else { ++ /* Postpone enabling LSC */ ++ ispccdc_obj.lsc_enable = 1; ++ return -EBUSY; ++ } ++ } else { ++ isp_reg_and(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_LSC_CONFIG, 0xFFFE); ++ ispccdc_obj.lsc_state = ispccdc_obj.lsc_enable = 0; ++ } ++ ++ return 0; ++} ++ ++/** ++ * ispccdc_enable_lsc - Enables/Disables the Lens Shading Compensation module. ++ * @enable: 0 Disables LSC, 1 Enables LSC. ++ **/ ++void ispccdc_enable_lsc(u8 enable) ++{ ++ if (__ispccdc_enable_lsc(enable)) { ++ if (enable) ++ ispccdc_obj.lsc_state = 1; ++ else ++ ispccdc_obj.lsc_state = ispccdc_obj.lsc_enable = 0; ++ } ++} ++EXPORT_SYMBOL(ispccdc_enable_lsc); ++ ++void ispccdc_lsc_error_handler(void) ++{ ++ int lsc_enable = ispccdc_obj.lsc_state; ++ ++ ispccdc_enable_lsc(0); ++ ++ ispccdc_obj.lsc_enable = lsc_enable; ++} ++ ++/** ++ * ispccdc_config_crop - Configures crop parameters for the ISP CCDC. ++ * @left: Left offset of the crop area. ++ * @top: Top offset of the crop area. ++ * @height: Height of the crop area. ++ * @width: Width of the crop area. ++ * ++ * The following restrictions are applied for the crop settings. If incoming ++ * values do not follow these restrictions then we map the settings to the ++ * closest acceptable crop value. ++ * 1) Left offset is always odd. This can be avoided if we enable byte swap ++ * option for incoming data into CCDC. ++ * 2) Top offset is always even. ++ * 3) Crop height is always even. ++ * 4) Crop width is always a multiple of 16 pixels ++ **/ ++void ispccdc_config_crop(u32 left, u32 top, u32 height, u32 width) ++{ ++ ispccdc_obj.ccdcin_woffset = left + (left % 2); ++ ispccdc_obj.ccdcin_hoffset = top + (top % 2); ++ ++ ispccdc_obj.crop_w = width - (width % 16); ++ ispccdc_obj.crop_h = height + (height % 2); ++ ++ DPRINTK_ISPCCDC("\n\tOffsets L %d T %d W %d H %d\n", ++ ispccdc_obj.ccdcin_woffset, ++ ispccdc_obj.ccdcin_hoffset, ++ ispccdc_obj.crop_w, ++ ispccdc_obj.crop_h); ++} ++ ++/** ++ * ispccdc_config_datapath - Specifies the input and output modules for CCDC. ++ * @input: Indicates the module that inputs the image to the CCDC. ++ * @output: Indicates the module to which the CCDC outputs the image. ++ * ++ * Configures the default configuration for the CCDC to work with. ++ * ++ * The valid values for the input are CCDC_RAW (0), CCDC_YUV_SYNC (1), ++ * CCDC_YUV_BT (2), and CCDC_OTHERS (3). ++ * ++ * The valid values for the output are CCDC_YUV_RSZ (0), CCDC_YUV_MEM_RSZ (1), ++ * CCDC_OTHERS_VP (2), CCDC_OTHERS_MEM (3), CCDC_OTHERS_VP_MEM (4). ++ * ++ * Returns 0 if successful, or -EINVAL if wrong I/O combination or wrong input ++ * or output values. ++ **/ ++int ispccdc_config_datapath(enum ccdc_input input, enum ccdc_output output) ++{ ++ u32 syn_mode = 0; ++ struct ispccdc_vp vpcfg; ++ struct ispccdc_syncif syncif; ++ struct ispccdc_bclamp blkcfg; ++ ++ u32 colptn = ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP0PLC0_SHIFT | ++ ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP0PLC1_SHIFT | ++ ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP0PLC2_SHIFT | ++ ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP0PLC3_SHIFT | ++ ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP1PLC0_SHIFT | ++ ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP1PLC1_SHIFT | ++ ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP1PLC2_SHIFT | ++ ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP1PLC3_SHIFT | ++ ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP2PLC0_SHIFT | ++ ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP2PLC1_SHIFT | ++ ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP2PLC2_SHIFT | ++ ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP2PLC3_SHIFT | ++ ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP3PLC0_SHIFT | ++ ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP3PLC1_SHIFT | ++ ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP3PLC2_SHIFT | ++ ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP3PLC3_SHIFT; ++ ++ /* CCDC does not convert the image format */ ++ if ((input == CCDC_RAW || input == CCDC_OTHERS) && ++ output == CCDC_YUV_RSZ) { ++ DPRINTK_ISPCCDC("ISP_ERR: Wrong CCDC I/O Combination\n"); ++ return -EINVAL; ++ } ++ ++ syn_mode = isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE); ++ ++ switch (output) { ++ case CCDC_YUV_RSZ: ++ syn_mode |= ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode &= ~ISPCCDC_SYN_MODE_WEN; ++ break; ++ ++ case CCDC_YUV_MEM_RSZ: ++ syn_mode |= ISPCCDC_SYN_MODE_SDR2RSZ; ++ ispccdc_obj.wen = 1; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ break; ++ ++ case CCDC_OTHERS_VP: ++ syn_mode &= ~ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode &= ~ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode &= ~ISPCCDC_SYN_MODE_WEN; ++ vpcfg.bitshift_sel = BIT9_0; ++ vpcfg.freq_sel = PIXCLKBY2; ++ ispccdc_config_vp(vpcfg); ++ ispccdc_enable_vp(1); ++ break; ++ ++ case CCDC_OTHERS_MEM: ++ syn_mode &= ~ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode &= ~ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ syn_mode &= ~ISPCCDC_SYN_MODE_EXWEN; ++ isp_reg_and(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG, ++ ~ISPCCDC_CFG_WENLOG); ++ vpcfg.bitshift_sel = BIT11_2; ++ vpcfg.freq_sel = PIXCLKBY2; ++ ispccdc_config_vp(vpcfg); ++ ispccdc_enable_vp(0); ++ break; ++ ++ case CCDC_OTHERS_VP_MEM: ++ syn_mode &= ~ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode &= ~ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ syn_mode &= ~ISPCCDC_SYN_MODE_EXWEN; ++ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG, ++ ~ISPCCDC_CFG_WENLOG, ++ ispccdc_obj.wenlog); ++ vpcfg.bitshift_sel = BIT9_0; ++ vpcfg.freq_sel = PIXCLKBY2; ++ ispccdc_config_vp(vpcfg); ++ ispccdc_enable_vp(1); ++ break; ++ default: ++ DPRINTK_ISPCCDC("ISP_ERR: Wrong CCDC Output\n"); ++ return -EINVAL; ++ }; ++ ++ isp_reg_writel(syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE); ++ ++ switch (input) { ++ case CCDC_RAW: ++ syncif.ccdc_mastermode = 0; ++ syncif.datapol = 0; ++ syncif.datsz = DAT10; ++ syncif.fldmode = 0; ++ syncif.fldout = 0; ++ syncif.fldpol = 0; ++ syncif.fldstat = 0; ++ syncif.hdpol = 0; ++ syncif.ipmod = RAW; ++ syncif.vdpol = 0; ++ ispccdc_config_sync_if(syncif); ++ ispccdc_config_imgattr(colptn); ++ blkcfg.dcsubval = 64; ++ ispccdc_config_black_clamp(blkcfg); ++ if (is_isplsc_activated()) { ++ ispccdc_config_lsc(&lsc_config); ++ ispccdc_load_lsc(lsc_gain_table_tmp, ++ LSC_TABLE_INIT_SIZE); ++ } ++ ++ break; ++ case CCDC_YUV_SYNC: ++ syncif.ccdc_mastermode = 0; ++ syncif.datapol = 0; ++ syncif.datsz = DAT8; ++ syncif.fldmode = 0; ++ syncif.fldout = 0; ++ syncif.fldpol = 0; ++ syncif.fldstat = 0; ++ syncif.hdpol = 0; ++ syncif.ipmod = YUV16; ++ syncif.vdpol = 1; ++ ispccdc_config_imgattr(0); ++ ispccdc_config_sync_if(syncif); ++ blkcfg.dcsubval = 0; ++ ispccdc_config_black_clamp(blkcfg); ++ break; ++ case CCDC_YUV_BT: ++ break; ++ case CCDC_OTHERS: ++ break; ++ default: ++ DPRINTK_ISPCCDC("ISP_ERR: Wrong CCDC Input\n"); ++ return -EINVAL; ++ } ++ ++ ispccdc_obj.ccdc_inpfmt = input; ++ ispccdc_obj.ccdc_outfmt = output; ++ ispccdc_print_status(); ++ isp_print_status(); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_datapath); ++ ++/** ++ * ispccdc_config_sync_if - Sets the sync i/f params between sensor and CCDC. ++ * @syncif: Structure containing the sync parameters like field state, CCDC in ++ * master/slave mode, raw/yuv data, polarity of data, field, hs, vs ++ * signals. ++ **/ ++void ispccdc_config_sync_if(struct ispccdc_syncif syncif) ++{ ++ u32 syn_mode = isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE); ++ ++ syn_mode |= ISPCCDC_SYN_MODE_VDHDEN; ++ ++ if (syncif.fldstat) ++ syn_mode |= ISPCCDC_SYN_MODE_FLDSTAT; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDSTAT; ++ ++ syn_mode &= ISPCCDC_SYN_MODE_INPMOD_MASK; ++ ispccdc_obj.syncif_ipmod = syncif.ipmod; ++ ++ switch (syncif.ipmod) { ++ case RAW: ++ break; ++ case YUV16: ++ syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR16; ++ break; ++ case YUV8: ++ syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR8; ++ break; ++ }; ++ ++ syn_mode &= ISPCCDC_SYN_MODE_DATSIZ_MASK; ++ switch (syncif.datsz) { ++ case DAT8: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_8; ++ break; ++ case DAT10: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_10; ++ break; ++ case DAT11: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_11; ++ break; ++ case DAT12: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_12; ++ break; ++ }; ++ ++ if (syncif.fldmode) ++ syn_mode |= ISPCCDC_SYN_MODE_FLDMODE; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDMODE; ++ ++ if (syncif.datapol) ++ syn_mode |= ISPCCDC_SYN_MODE_DATAPOL; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_DATAPOL; ++ ++ if (syncif.fldpol) ++ syn_mode |= ISPCCDC_SYN_MODE_FLDPOL; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDPOL; ++ ++ if (syncif.hdpol) ++ syn_mode |= ISPCCDC_SYN_MODE_HDPOL; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_HDPOL; ++ ++ if (syncif.vdpol) ++ syn_mode |= ISPCCDC_SYN_MODE_VDPOL; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_VDPOL; ++ ++ if (syncif.ccdc_mastermode) { ++ syn_mode |= ISPCCDC_SYN_MODE_FLDOUT | ISPCCDC_SYN_MODE_VDHDOUT; ++ isp_reg_writel(syncif.hs_width << ISPCCDC_HD_VD_WID_HDW_SHIFT ++ | syncif.vs_width << ISPCCDC_HD_VD_WID_VDW_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_HD_VD_WID); ++ ++ isp_reg_writel(syncif.ppln << ISPCCDC_PIX_LINES_PPLN_SHIFT ++ | syncif.hlprf << ISPCCDC_PIX_LINES_HLPRF_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_PIX_LINES); ++ } else ++ syn_mode &= ~(ISPCCDC_SYN_MODE_FLDOUT | ++ ISPCCDC_SYN_MODE_VDHDOUT); ++ ++ isp_reg_writel(syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE); ++ ++ if (!(syncif.bt_r656_en)) { ++ isp_reg_and(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF, ++ ~ISPCCDC_REC656IF_R656ON); ++ } ++} ++EXPORT_SYMBOL(ispccdc_config_sync_if); ++ ++/** ++ * ispccdc_config_black_clamp - Configures the clamp parameters in CCDC. ++ * @bclamp: Structure containing the optical black average gain, optical black ++ * sample length, sample lines, and the start pixel position of the ++ * samples w.r.t the HS pulse. ++ * Configures the clamp parameters in CCDC. Either if its being used the ++ * optical black clamp, or the digital clamp. If its a digital clamp, then ++ * assures to put a valid DC substraction level. ++ * ++ * Returns always 0 when completed. ++ **/ ++int ispccdc_config_black_clamp(struct ispccdc_bclamp bclamp) ++{ ++ u32 bclamp_val = 0; ++ ++ if (ispccdc_obj.obclamp_en) { ++ bclamp_val |= bclamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT; ++ bclamp_val |= bclamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT; ++ bclamp_val |= bclamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT; ++ bclamp_val |= bclamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT; ++ isp_reg_writel(bclamp_val, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_CLAMP); ++ } else { ++ if (omap_rev() < OMAP3430_REV_ES2_0) ++ if (ispccdc_obj.syncif_ipmod == YUV16 || ++ ispccdc_obj.syncif_ipmod == YUV8 || ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_REC656IF) & ++ ISPCCDC_REC656IF_R656ON) ++ bclamp.dcsubval = 0; ++ isp_reg_writel(bclamp.dcsubval, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_DCSUB); ++ } ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_black_clamp); ++ ++/** ++ * ispccdc_enable_black_clamp - Enables/Disables the optical black clamp. ++ * @enable: 0 Disables optical black clamp, 1 Enables optical black clamp. ++ * ++ * Enables or disables the optical black clamp. When disabled, the digital ++ * clamp operates. ++ **/ ++void ispccdc_enable_black_clamp(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CLAMP, ++ ~ISPCCDC_CLAMP_CLAMPEN, ++ enable ? ISPCCDC_CLAMP_CLAMPEN : 0); ++ ispccdc_obj.obclamp_en = enable; ++} ++EXPORT_SYMBOL(ispccdc_enable_black_clamp); ++ ++/** ++ * ispccdc_config_fpc - Configures the Faulty Pixel Correction parameters. ++ * @fpc: Structure containing the number of faulty pixels corrected in the ++ * frame, address of the FPC table. ++ * ++ * Returns 0 if successful, or -EINVAL if FPC Address is not on the 64 byte ++ * boundary. ++ **/ ++int ispccdc_config_fpc(struct ispccdc_fpc fpc) ++{ ++ u32 fpc_val = 0; ++ ++ fpc_val = isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC); ++ ++ if ((fpc.fpcaddr & 0xFFFFFFC0) == fpc.fpcaddr) { ++ isp_reg_writel(fpc_val & (~ISPCCDC_FPC_FPCEN), ++ OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC); ++ isp_reg_writel(fpc.fpcaddr, ++ OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC_ADDR); ++ } else { ++ DPRINTK_ISPCCDC("FPC Address should be on 64byte boundary\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(fpc_val | (fpc.fpnum << ISPCCDC_FPC_FPNUM_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_fpc); ++ ++/** ++ * ispccdc_enable_fpc - Enables the Faulty Pixel Correction. ++ * @enable: 0 Disables FPC, 1 Enables FPC. ++ **/ ++void ispccdc_enable_fpc(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FPC, ++ ~ISPCCDC_FPC_FPCEN, ++ enable ? ISPCCDC_FPC_FPCEN : 0); ++} ++EXPORT_SYMBOL(ispccdc_enable_fpc); ++ ++/** ++ * ispccdc_config_black_comp - Configures Black Level Compensation parameters. ++ * @blcomp: Structure containing the black level compensation value for RGrGbB ++ * pixels. in 2's complement. ++ **/ ++void ispccdc_config_black_comp(struct ispccdc_blcomp blcomp) ++{ ++ u32 blcomp_val = 0; ++ ++ blcomp_val |= blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT; ++ blcomp_val |= blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT; ++ blcomp_val |= blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT; ++ blcomp_val |= blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT; ++ ++ isp_reg_writel(blcomp_val, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_BLKCMP); ++} ++EXPORT_SYMBOL(ispccdc_config_black_comp); ++ ++/** ++ * ispccdc_config_vp - Configures the Video Port Configuration parameters. ++ * @vpcfg: Structure containing the Video Port input frequency, and the 10 bit ++ * format. ++ **/ ++void ispccdc_config_vp(struct ispccdc_vp vpcfg) ++{ ++ u32 fmtcfg_vp = isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG); ++ ++ fmtcfg_vp &= ISPCCDC_FMTCFG_VPIN_MASK & ISPCCDC_FMTCF_VPIF_FRQ_MASK; ++ ++ switch (vpcfg.bitshift_sel) { ++ case BIT9_0: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_9_0; ++ break; ++ case BIT10_1: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_10_1; ++ break; ++ case BIT11_2: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_11_2; ++ break; ++ case BIT12_3: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_12_3; ++ break; ++ }; ++ switch (vpcfg.freq_sel) { ++ case PIXCLKBY2: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY2; ++ break; ++ case PIXCLKBY3_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY3; ++ break; ++ case PIXCLKBY4_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY4; ++ break; ++ case PIXCLKBY5_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY5; ++ break; ++ case PIXCLKBY6_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY6; ++ break; ++ }; ++ isp_reg_writel(fmtcfg_vp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG); ++} ++EXPORT_SYMBOL(ispccdc_config_vp); ++ ++/** ++ * ispccdc_enable_vp - Enables the Video Port. ++ * @enable: 0 Disables VP, 1 Enables VP ++ **/ ++void ispccdc_enable_vp(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG, ++ ~ISPCCDC_FMTCFG_VPEN, ++ enable ? ISPCCDC_FMTCFG_VPEN : 0); ++} ++EXPORT_SYMBOL(ispccdc_enable_vp); ++ ++/** ++ * ispccdc_config_reformatter - Configures the Reformatter. ++ * @refmt: Structure containing the memory address to format and the bit fields ++ * for the reformatter registers. ++ * ++ * Configures the Reformatter register values if line alternating is disabled. ++ * Else, just enabling line alternating is enough. ++ **/ ++void ispccdc_config_reformatter(struct ispccdc_refmt refmt) ++{ ++ u32 fmtcfg_val = 0; ++ ++ fmtcfg_val = isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG); ++ ++ if (refmt.lnalt) ++ fmtcfg_val |= ISPCCDC_FMTCFG_LNALT; ++ else { ++ fmtcfg_val &= ~ISPCCDC_FMTCFG_LNALT; ++ fmtcfg_val &= 0xFFFFF003; ++ fmtcfg_val |= refmt.lnum << ISPCCDC_FMTCFG_LNUM_SHIFT; ++ fmtcfg_val |= refmt.plen_even << ++ ISPCCDC_FMTCFG_PLEN_EVEN_SHIFT; ++ fmtcfg_val |= refmt.plen_odd << ISPCCDC_FMTCFG_PLEN_ODD_SHIFT; ++ ++ isp_reg_writel(refmt.prgeven0, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_PRGEVEN0); ++ isp_reg_writel(refmt.prgeven1, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_PRGEVEN1); ++ isp_reg_writel(refmt.prgodd0, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_PRGODD0); ++ isp_reg_writel(refmt.prgodd1, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_PRGODD1); ++ isp_reg_writel(refmt.fmtaddr0, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR0); ++ isp_reg_writel(refmt.fmtaddr1, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR1); ++ isp_reg_writel(refmt.fmtaddr2, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR2); ++ isp_reg_writel(refmt.fmtaddr3, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR3); ++ isp_reg_writel(refmt.fmtaddr4, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR4); ++ isp_reg_writel(refmt.fmtaddr5, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR5); ++ isp_reg_writel(refmt.fmtaddr6, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR6); ++ isp_reg_writel(refmt.fmtaddr7, OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_ADDR7); ++ } ++ isp_reg_writel(fmtcfg_val, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG); ++} ++EXPORT_SYMBOL(ispccdc_config_reformatter); ++ ++/** ++ * ispccdc_enable_reformatter - Enables the Reformatter. ++ * @enable: 0 Disables Reformatter, 1- Enables Data Reformatter ++ **/ ++void ispccdc_enable_reformatter(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG, ++ ~ISPCCDC_FMTCFG_FMTEN, ++ enable ? ISPCCDC_FMTCFG_FMTEN : 0); ++ ispccdc_obj.refmt_en = enable; ++} ++EXPORT_SYMBOL(ispccdc_enable_reformatter); ++ ++/** ++ * ispccdc_config_culling - Configures the culling parameters. ++ * @cull: Structure containing the vertical culling pattern, and horizontal ++ * culling pattern for odd and even lines. ++ **/ ++void ispccdc_config_culling(struct ispccdc_culling cull) ++{ ++ u32 culling_val = 0; ++ ++ culling_val |= cull.v_pattern << ISPCCDC_CULLING_CULV_SHIFT; ++ culling_val |= cull.h_even << ISPCCDC_CULLING_CULHEVN_SHIFT; ++ culling_val |= cull.h_odd << ISPCCDC_CULLING_CULHODD_SHIFT; ++ ++ isp_reg_writel(culling_val, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CULLING); ++} ++EXPORT_SYMBOL(ispccdc_config_culling); ++ ++/** ++ * ispccdc_enable_lpf - Enables the Low-Pass Filter (LPF). ++ * @enable: 0 Disables LPF, 1 Enables LPF ++ **/ ++void ispccdc_enable_lpf(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE, ++ ~ISPCCDC_SYN_MODE_LPF, ++ enable ? ISPCCDC_SYN_MODE_LPF : 0); ++} ++EXPORT_SYMBOL(ispccdc_enable_lpf); ++ ++/** ++ * ispccdc_config_alaw - Configures the input width for A-law. ++ * @ipwidth: Input width for A-law ++ **/ ++void ispccdc_config_alaw(enum alaw_ipwidth ipwidth) ++{ ++ isp_reg_writel(ipwidth << ISPCCDC_ALAW_GWDI_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ISPCCDC_ALAW); ++} ++EXPORT_SYMBOL(ispccdc_config_alaw); ++ ++/** ++ * ispccdc_enable_alaw - Enables the A-law compression. ++ * @enable: 0 - Disables A-law, 1 - Enables A-law ++ **/ ++void ispccdc_enable_alaw(u8 enable) ++{ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_ALAW, ++ ~ISPCCDC_ALAW_CCDTBL, ++ enable ? ISPCCDC_ALAW_CCDTBL : 0); ++} ++EXPORT_SYMBOL(ispccdc_enable_alaw); ++ ++/** ++ * ispccdc_config_imgattr - Configures the sensor image specific attributes. ++ * @colptn: Color pattern of the sensor. ++ **/ ++void ispccdc_config_imgattr(u32 colptn) ++{ ++ isp_reg_writel(colptn, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_COLPTN); ++} ++EXPORT_SYMBOL(ispccdc_config_imgattr); ++ ++void ispccdc_config_shadow_registers(void) ++{ ++ if (ispccdc_obj.lsc_enable) { ++ ispccdc_enable_lsc(1); ++ ispccdc_obj.lsc_enable = 0; ++ } ++} ++ ++/** ++ * ispccdc_try_size - Checks if requested Input/output dimensions are valid ++ * @input_w: input width for the CCDC in number of pixels per line ++ * @input_h: input height for the CCDC in number of lines ++ * @output_w: output width from the CCDC in number of pixels per line ++ * @output_h: output height for the CCDC in number of lines ++ * ++ * Calculates the number of pixels cropped if the reformater is disabled, ++ * Fills up the output width and height variables in the isp_ccdc structure. ++ * ++ * Returns 0 if successful, or -EINVAL if the input width is less than 2 pixels ++ **/ ++int ispccdc_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h) ++{ ++ if (input_w < 32 || input_h < 32) { ++ DPRINTK_ISPCCDC("ISP_ERR: CCDC cannot handle input width less" ++ " than 32 pixels or height less than 32\n"); ++ return -EINVAL; ++ } ++ ++ if (ispccdc_obj.crop_w) ++ *output_w = ispccdc_obj.crop_w; ++ else ++ *output_w = input_w; ++ ++ if (ispccdc_obj.crop_h) ++ *output_h = ispccdc_obj.crop_h; ++ else ++ *output_h = input_h; ++ ++ if (!ispccdc_obj.refmt_en ++ && ispccdc_obj.ccdc_outfmt != CCDC_OTHERS_MEM ++ && ispccdc_obj.ccdc_outfmt != CCDC_OTHERS_VP_MEM) ++ *output_h -= 1; ++ ++ if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_MEM ++ || ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP_MEM) { ++ if (*output_w % 16) { ++ *output_w -= (*output_w % 16); ++ *output_w += 16; ++ } ++ } ++ ++ ispccdc_obj.ccdcout_w = *output_w; ++ ispccdc_obj.ccdcout_h = *output_h; ++ ispccdc_obj.ccdcin_w = input_w; ++ ispccdc_obj.ccdcin_h = input_h; ++ ++ DPRINTK_ISPCCDC("try size: ccdcin_w=%u,ccdcin_h=%u,ccdcout_w=%u," ++ " ccdcout_h=%u\n", ++ ispccdc_obj.ccdcin_w, ++ ispccdc_obj.ccdcin_h, ++ ispccdc_obj.ccdcout_w, ++ ispccdc_obj.ccdcout_h); ++ ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_try_size); ++ ++/** ++ * ispccdc_config_size - Configure the dimensions of the CCDC input/output ++ * @input_w: input width for the CCDC in number of pixels per line ++ * @input_h: input height for the CCDC in number of lines ++ * @output_w: output width from the CCDC in number of pixels per line ++ * @output_h: output height for the CCDC in number of lines ++ * ++ * Configures the appropriate values stored in the isp_ccdc structure to ++ * HORZ/VERT_INFO registers and the VP_OUT depending on whether the image ++ * is stored in memory or given to the another module in the ISP pipeline. ++ * ++ * Returns 0 if successful, or -EINVAL if try_size was not called before to ++ * validate the requested dimensions. ++ **/ ++int ispccdc_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) ++{ ++ DPRINTK_ISPCCDC("config size: input_w=%u, input_h=%u, output_w=%u," ++ " output_h=%u\n", ++ input_w, input_h, ++ output_w, output_h); ++ if (output_w != ispccdc_obj.ccdcout_w ++ || output_h != ispccdc_obj.ccdcout_h) { ++ DPRINTK_ISPCCDC("ISP_ERR : ispccdc_try_size should" ++ " be called before config size\n"); ++ return -EINVAL; ++ } ++ ++ if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP) { ++ isp_reg_writel((ispccdc_obj.ccdcin_woffset << ++ ISPCCDC_FMT_HORZ_FMTSPH_SHIFT) | ++ (ispccdc_obj.ccdcin_w << ++ ISPCCDC_FMT_HORZ_FMTLNH_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_HORZ); ++ isp_reg_writel((ispccdc_obj.ccdcin_hoffset << ++ ISPCCDC_FMT_VERT_FMTSLV_SHIFT) | ++ (ispccdc_obj.ccdcin_h << ++ ISPCCDC_FMT_VERT_FMTLNV_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_VERT); ++ isp_reg_writel((ispccdc_obj.ccdcout_w << ++ ISPCCDC_VP_OUT_HORZ_NUM_SHIFT) | ++ (ispccdc_obj.ccdcout_h - 1) << ++ ISPCCDC_VP_OUT_VERT_NUM_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VP_OUT); ++ isp_reg_writel((((ispccdc_obj.ccdcout_h - 25) & ++ ISPCCDC_VDINT_0_MASK) << ++ ISPCCDC_VDINT_0_SHIFT) | ++ ((50 & ISPCCDC_VDINT_1_MASK) << ++ ISPCCDC_VDINT_1_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VDINT); ++ ++ } else if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_MEM) { ++ isp_reg_writel(0, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VP_OUT); ++ if (ispccdc_obj.ccdc_inpfmt == CCDC_RAW) { ++ isp_reg_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | ((ispccdc_obj.ccdcout_w - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_HORZ_INFO); ++ } else { ++ isp_reg_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | ((ispccdc_obj.ccdcout_w - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_HORZ_INFO); ++ } ++ isp_reg_writel(0 << ISPCCDC_VERT_START_SLV0_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_START); ++ isp_reg_writel((ispccdc_obj.ccdcout_h - 1) << ++ ISPCCDC_VERT_LINES_NLV_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_LINES); ++ ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w * 2, 0, 0); ++ isp_reg_writel((((ispccdc_obj.ccdcout_h - 2) & ++ ISPCCDC_VDINT_0_MASK) << ++ ISPCCDC_VDINT_0_SHIFT) | ++ ((100 & ISPCCDC_VDINT_1_MASK) << ++ ISPCCDC_VDINT_1_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VDINT); ++ } else if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP_MEM) { ++ isp_reg_writel((0 << ISPCCDC_FMT_HORZ_FMTSPH_SHIFT) | ++ (ispccdc_obj.ccdcin_w << ++ ISPCCDC_FMT_HORZ_FMTLNH_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_HORZ); ++ isp_reg_writel((0 << ISPCCDC_FMT_VERT_FMTSLV_SHIFT) | ++ ((ispccdc_obj.ccdcin_h) << ++ ISPCCDC_FMT_VERT_FMTLNV_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_FMT_VERT); ++ isp_reg_writel((ispccdc_obj.ccdcout_w ++ << ISPCCDC_VP_OUT_HORZ_NUM_SHIFT) | ++ ((ispccdc_obj.ccdcout_h - 1) << ++ ISPCCDC_VP_OUT_VERT_NUM_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VP_OUT); ++ isp_reg_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT | ++ ((ispccdc_obj.ccdcout_w - 1) << ++ ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_HORZ_INFO); ++ isp_reg_writel(0 << ISPCCDC_VERT_START_SLV0_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_START); ++ isp_reg_writel((ispccdc_obj.ccdcout_h - 1) << ++ ISPCCDC_VERT_LINES_NLV_SHIFT, ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_LINES); ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w * 2, 0, 0); ++ isp_reg_writel((((ispccdc_obj.ccdcout_h - 2) & ++ ISPCCDC_VDINT_0_MASK) << ++ ISPCCDC_VDINT_0_SHIFT) | ++ ((100 & ISPCCDC_VDINT_1_MASK) << ++ ISPCCDC_VDINT_1_SHIFT), ++ OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VDINT); ++ } ++ ++ if (is_isplsc_activated()) { ++ if (ispccdc_obj.ccdc_inpfmt == CCDC_RAW) { ++ ispccdc_config_lsc(&lsc_config); ++ ispccdc_load_lsc(lsc_gain_table, lsc_config.size); ++ } ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_size); ++ ++/** ++ * ispccdc_config_outlineoffset - Configures the output line offset ++ * @offset: Must be twice the Output width and aligned on 32 byte boundary ++ * @oddeven: Specifies the odd/even line pattern to be chosen to store the ++ * output. ++ * @numlines: Set the value 0-3 for +1-4lines, 4-7 for -1-4lines. ++ * ++ * - Configures the output line offset when stored in memory ++ * - Sets the odd/even line pattern to store the output ++ * (EVENEVEN (1), ODDEVEN (2), EVENODD (3), ODDODD (4)) ++ * - Configures the number of even and odd line fields in case of rearranging ++ * the lines. ++ * ++ * Returns 0 if successful, or -EINVAL if the offset is not in 32 byte ++ * boundary. ++ **/ ++int ispccdc_config_outlineoffset(u32 offset, u8 oddeven, u8 numlines) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) { ++ isp_reg_writel((offset & 0xFFFF), OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_HSIZE_OFF); ++ } else { ++ DPRINTK_ISPCCDC("ISP_ERR : Offset should be in 32 byte" ++ " boundary\n"); ++ return -EINVAL; ++ } ++ ++ isp_reg_and(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ ~ISPCCDC_SDOFST_FINV); ++ ++ isp_reg_and(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ ~ISPCCDC_SDOFST_FOFST_4L); ++ ++ switch (oddeven) { ++ case EVENEVEN: ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ (numlines & 0x7) << ISPCCDC_SDOFST_LOFST0_SHIFT); ++ break; ++ case ODDEVEN: ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ (numlines & 0x7) << ISPCCDC_SDOFST_LOFST1_SHIFT); ++ break; ++ case EVENODD: ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ (numlines & 0x7) << ISPCCDC_SDOFST_LOFST2_SHIFT); ++ break; ++ case ODDODD: ++ isp_reg_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST, ++ (numlines & 0x7) << ISPCCDC_SDOFST_LOFST3_SHIFT); ++ break; ++ default: ++ break; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_outlineoffset); ++ ++/** ++ * ispccdc_set_outaddr - Sets the memory address where the output will be saved ++ * @addr: 32-bit memory address aligned on 32 byte boundary. ++ * ++ * Sets the memory address where the output will be saved. ++ * ++ * Returns 0 if successful, or -EINVAL if the address is not in the 32 byte ++ * boundary. ++ **/ ++int ispccdc_set_outaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) { ++ isp_reg_writel(addr, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDR_ADDR); ++ return 0; ++ } else { ++ DPRINTK_ISPCCDC("ISP_ERR : Address should be in 32 byte" ++ " boundary\n"); ++ return -EINVAL; ++ } ++ ++} ++EXPORT_SYMBOL(ispccdc_set_outaddr); ++ ++void __ispccdc_enable(u8 enable) ++{ ++ if (enable) { ++ if (ispccdc_obj.lsc_enable ++ && ispccdc_obj.ccdc_inpfmt == CCDC_RAW) ++ ispccdc_enable_lsc(1); ++ ++ } else { ++ ispccdc_obj.lsc_enable = ispccdc_obj.lsc_state; ++ } ++ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PCR, ~ISPCCDC_PCR_EN, ++ enable ? ISPCCDC_PCR_EN : 0); ++} ++ ++/** ++ * ispccdc_enable - Enables the CCDC module. ++ * @enable: 0 Disables CCDC, 1 Enables CCDC ++ * ++ * Client should configure all the sub modules in CCDC before this. ++ **/ ++void ispccdc_enable(u8 enable) ++{ ++ __ispccdc_enable(enable); ++ ispccdc_obj.pm_state = enable; ++} ++EXPORT_SYMBOL(ispccdc_enable); ++ ++/** ++ * ispccdc_suspend - Suspend the CCDC module. ++ **/ ++void ispccdc_suspend(void) ++{ ++ if (ispccdc_obj.pm_state) { ++ if (ispccdc_obj.lsc_state) ++ __ispccdc_enable_lsc(0); ++ else if (ispccdc_obj.lsc_enable) { ++ ispccdc_obj.lsc_state = 1; ++ ispccdc_obj.lsc_enable = 0; ++ } ++ __ispccdc_enable(0); ++ } ++} ++EXPORT_SYMBOL(ispccdc_suspend); ++ ++/** ++ * ispccdc_resume - Resume the CCDC module. ++ **/ ++void ispccdc_resume(void) ++{ ++ if (ispccdc_obj.pm_state) { ++ if (ispccdc_obj.lsc_state) ++ __ispccdc_enable_lsc(1); ++ __ispccdc_enable(1); ++ } ++} ++EXPORT_SYMBOL(ispccdc_resume); ++ ++/* ++ * Returns zero if the CCDC is idle and the image has been written to ++ * memory, too. ++ */ ++int ispccdc_sbl_busy(void) ++{ ++ return ispccdc_busy() ++ | (isp_reg_readl(OMAP3_ISP_IOMEM_SBL, ISPSBL_CCDC_WR_0) & ++ ISPSBL_CCDC_WR_0_DATA_READY) ++ | (isp_reg_readl(OMAP3_ISP_IOMEM_SBL, ISPSBL_CCDC_WR_1) & ++ ISPSBL_CCDC_WR_0_DATA_READY) ++ | (isp_reg_readl(OMAP3_ISP_IOMEM_SBL, ISPSBL_CCDC_WR_2) & ++ ISPSBL_CCDC_WR_0_DATA_READY) ++ | (isp_reg_readl(OMAP3_ISP_IOMEM_SBL, ISPSBL_CCDC_WR_3) & ++ ISPSBL_CCDC_WR_0_DATA_READY); ++} ++EXPORT_SYMBOL(ispccdc_sbl_busy); ++ ++/** ++ * ispccdc_busy - Gets busy state of the CCDC. ++ **/ ++int ispccdc_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PCR) & ++ ISPCCDC_PCR_BUSY; ++} ++EXPORT_SYMBOL(ispccdc_busy); ++ ++/** ++ * ispccdc_save_context - Saves the values of the CCDC module registers ++ **/ ++void ispccdc_save_context(void) ++{ ++ DPRINTK_ISPCCDC("Saving context\n"); ++ isp_save_context(ispccdc_reg_list); ++} ++EXPORT_SYMBOL(ispccdc_save_context); ++ ++/** ++ * ispccdc_restore_context - Restores the values of the CCDC module registers ++ **/ ++void ispccdc_restore_context(void) ++{ ++ DPRINTK_ISPCCDC("Restoring context\n"); ++ isp_restore_context(ispccdc_reg_list); ++} ++EXPORT_SYMBOL(ispccdc_restore_context); ++ ++/** ++ * ispccdc_print_status - Prints the values of the CCDC Module registers ++ * ++ * Also prints other debug information stored in the CCDC module. ++ **/ ++void ispccdc_print_status(void) ++{ ++ if (!is_ispccdc_debug_enabled()) ++ return; ++ ++ DPRINTK_ISPCCDC("Module in use =%d\n", ispccdc_obj.ccdc_inuse); ++ DPRINTK_ISPCCDC("Accepted CCDC Input (width = %d,Height = %d)\n", ++ ispccdc_obj.ccdcin_w, ++ ispccdc_obj.ccdcin_h); ++ DPRINTK_ISPCCDC("Accepted CCDC Output (width = %d,Height = %d)\n", ++ ispccdc_obj.ccdcout_w, ++ ispccdc_obj.ccdcout_h); ++ DPRINTK_ISPCCDC("###CCDC PCR=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PCR)); ++ DPRINTK_ISPCCDC("ISP_CTRL =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ switch (ispccdc_obj.ccdc_inpfmt) { ++ case CCDC_RAW: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_RAW\n"); ++ break; ++ case CCDC_YUV_SYNC: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_YUV_SYNC\n"); ++ break; ++ case CCDC_YUV_BT: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_YUV_BT\n"); ++ break; ++ } ++ ++ switch (ispccdc_obj.ccdc_outfmt) { ++ case CCDC_OTHERS_VP: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_OTHERS_VP\n"); ++ break; ++ case CCDC_OTHERS_MEM: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_OTHERS_MEM\n"); ++ break; ++ case CCDC_YUV_RSZ: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_YUV_RSZ\n"); ++ break; ++ } ++ ++ DPRINTK_ISPCCDC("###ISP_CTRL in ccdc =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ DPRINTK_ISPCCDC("###ISP_IRQ0ENABLE in ccdc =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE)); ++ DPRINTK_ISPCCDC("###ISP_IRQ0STATUS in ccdc =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS)); ++ DPRINTK_ISPCCDC("###CCDC SYN_MODE=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE)); ++ DPRINTK_ISPCCDC("###CCDC HORZ_INFO=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO)); ++ DPRINTK_ISPCCDC("###CCDC VERT_START=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_START)); ++ DPRINTK_ISPCCDC("###CCDC VERT_LINES=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_LINES)); ++ DPRINTK_ISPCCDC("###CCDC CULLING=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CULLING)); ++ DPRINTK_ISPCCDC("###CCDC HSIZE_OFF=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HSIZE_OFF)); ++ DPRINTK_ISPCCDC("###CCDC SDOFST=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST)); ++ DPRINTK_ISPCCDC("###CCDC SDR_ADDR=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDR_ADDR)); ++ DPRINTK_ISPCCDC("###CCDC CLAMP=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CLAMP)); ++ DPRINTK_ISPCCDC("###CCDC COLPTN=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_COLPTN)); ++ DPRINTK_ISPCCDC("###CCDC CFG=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG)); ++ DPRINTK_ISPCCDC("###CCDC VP_OUT=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VP_OUT)); ++ DPRINTK_ISPCCDC("###CCDC_SDR_ADDR= 0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDR_ADDR)); ++ DPRINTK_ISPCCDC("###CCDC FMTCFG=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG)); ++ DPRINTK_ISPCCDC("###CCDC FMT_HORZ=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_HORZ)); ++ DPRINTK_ISPCCDC("###CCDC FMT_VERT=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMT_VERT)); ++ DPRINTK_ISPCCDC("###CCDC LSC_CONFIG=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_CONFIG)); ++ DPRINTK_ISPCCDC("###CCDC LSC_INIT=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_INITIAL)); ++ DPRINTK_ISPCCDC("###CCDC LSC_TABLE BASE=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_TABLE_BASE)); ++ DPRINTK_ISPCCDC("###CCDC LSC TABLE OFFSET=0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_LSC_TABLE_OFFSET)); ++} ++EXPORT_SYMBOL(ispccdc_print_status); ++ ++/** ++ * isp_ccdc_init - CCDC module initialization. ++ * ++ * Always returns 0 ++ **/ ++int __init isp_ccdc_init(void) ++{ ++ ispccdc_obj.ccdc_inuse = 0; ++ ispccdc_config_crop(0, 0, 0, 0); ++ mutex_init(&ispccdc_obj.mutexlock); ++ ++ if (is_isplsc_activated()) { ++ lsc_gain_table_tmp = kmalloc(LSC_TABLE_INIT_SIZE, GFP_KERNEL | ++ GFP_DMA); ++ memset(lsc_gain_table_tmp, 0x40, LSC_TABLE_INIT_SIZE); ++ lsc_config.initial_x = 0; ++ lsc_config.initial_y = 0; ++ lsc_config.gain_mode_n = 0x6; ++ lsc_config.gain_mode_m = 0x6; ++ lsc_config.gain_format = 0x4; ++ lsc_config.offset = 0x60; ++ lsc_config.size = LSC_TABLE_INIT_SIZE; ++ ispccdc_obj.lsc_enable = 1; ++ } ++ ++ return 0; ++} ++ ++/** ++ * isp_ccdc_cleanup - CCDC module cleanup. ++ **/ ++void isp_ccdc_cleanup(void) ++{ ++ if (is_isplsc_activated()) { ++ ispccdc_free_lsc(); ++ kfree(lsc_gain_table_tmp); ++ } ++ ++ if (fpc_table_add_m != 0) { ++ ispmmu_kunmap(fpc_table_add_m); ++ kfree(fpc_table_add); ++ } ++} +diff --git a/drivers/media/video/isp/ispccdc.h b/drivers/media/video/isp/ispccdc.h +new file mode 100644 +index 0000000..4ef40a6 +--- /dev/null ++++ b/drivers/media/video/isp/ispccdc.h +@@ -0,0 +1,209 @@ ++/* ++ * ispccdc.h ++ * ++ * Driver header file for CCDC module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Senthilvadivu Guruswamy ++ * Pallavi Kulkarni ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_CCDC_H ++#define OMAP_ISP_CCDC_H ++ ++#include ++ ++#define is_isplsc_activated() 1 ++ ++/* Enumeration constants for CCDC input output format */ ++enum ccdc_input { ++ CCDC_RAW, ++ CCDC_YUV_SYNC, ++ CCDC_YUV_BT, ++ CCDC_OTHERS ++}; ++ ++enum ccdc_output { ++ CCDC_YUV_RSZ, ++ CCDC_YUV_MEM_RSZ, ++ CCDC_OTHERS_VP, ++ CCDC_OTHERS_MEM, ++ CCDC_OTHERS_VP_MEM ++}; ++ ++/* Enumeration constants for the sync interface parameters */ ++enum inpmode { ++ RAW, ++ YUV16, ++ YUV8 ++}; ++enum datasize { ++ DAT8, ++ DAT10, ++ DAT11, ++ DAT12 ++}; ++ ++ ++/** ++ * struct ispccdc_syncif - Structure for Sync Interface between sensor and CCDC ++ * @ccdc_mastermode: Master mode. 1 - Master, 0 - Slave. ++ * @fldstat: Field state. 0 - Odd Field, 1 - Even Field. ++ * @ipmod: Input mode. ++ * @datsz: Data size. ++ * @fldmode: 0 - Progressive, 1 - Interlaced. ++ * @datapol: 0 - Positive, 1 - Negative. ++ * @fldpol: 0 - Positive, 1 - Negative. ++ * @hdpol: 0 - Positive, 1 - Negative. ++ * @vdpol: 0 - Positive, 1 - Negative. ++ * @fldout: 0 - Input, 1 - Output. ++ * @hs_width: Width of the Horizontal Sync pulse, used for HS/VS Output. ++ * @vs_width: Width of the Vertical Sync pulse, used for HS/VS Output. ++ * @ppln: Number of pixels per line, used for HS/VS Output. ++ * @hlprf: Number of half lines per frame, used for HS/VS Output. ++ * @bt_r656_en: 1 - Enable ITU-R BT656 mode, 0 - Sync mode. ++ */ ++struct ispccdc_syncif { ++ u8 ccdc_mastermode; ++ u8 fldstat; ++ enum inpmode ipmod; ++ enum datasize datsz; ++ u8 fldmode; ++ u8 datapol; ++ u8 fldpol; ++ u8 hdpol; ++ u8 vdpol; ++ u8 fldout; ++ u8 hs_width; ++ u8 vs_width; ++ u8 ppln; ++ u8 hlprf; ++ u8 bt_r656_en; ++}; ++ ++/** ++ * ispccdc_refmt - Structure for Reformatter parameters ++ * @lnalt: Line alternating mode enable. 0 - Enable, 1 - Disable. ++ * @lnum: Number of output lines from 1 input line. 1 to 4 lines. ++ * @plen_even: Number of program entries in even line minus 1. ++ * @plen_odd: Number of program entries in odd line minus 1. ++ * @prgeven0: Program entries 0-7 for even lines register ++ * @prgeven1: Program entries 8-15 for even lines register ++ * @prgodd0: Program entries 0-7 for odd lines register ++ * @prgodd1: Program entries 8-15 for odd lines register ++ * @fmtaddr0: Output line in which the original pixel is to be placed ++ * @fmtaddr1: Output line in which the original pixel is to be placed ++ * @fmtaddr2: Output line in which the original pixel is to be placed ++ * @fmtaddr3: Output line in which the original pixel is to be placed ++ * @fmtaddr4: Output line in which the original pixel is to be placed ++ * @fmtaddr5: Output line in which the original pixel is to be placed ++ * @fmtaddr6: Output line in which the original pixel is to be placed ++ * @fmtaddr7: Output line in which the original pixel is to be placed ++ */ ++struct ispccdc_refmt { ++ u8 lnalt; ++ u8 lnum; ++ u8 plen_even; ++ u8 plen_odd; ++ u32 prgeven0; ++ u32 prgeven1; ++ u32 prgodd0; ++ u32 prgodd1; ++ u32 fmtaddr0; ++ u32 fmtaddr1; ++ u32 fmtaddr2; ++ u32 fmtaddr3; ++ u32 fmtaddr4; ++ u32 fmtaddr5; ++ u32 fmtaddr6; ++ u32 fmtaddr7; ++}; ++ ++int ispccdc_request(void); ++ ++int ispccdc_free(void); ++ ++int ispccdc_config_datapath(enum ccdc_input input, enum ccdc_output output); ++ ++void ispccdc_config_crop(u32 left, u32 top, u32 height, u32 width); ++ ++void ispccdc_config_sync_if(struct ispccdc_syncif syncif); ++ ++int ispccdc_config_black_clamp(struct ispccdc_bclamp bclamp); ++ ++void ispccdc_enable_black_clamp(u8 enable); ++ ++int ispccdc_config_fpc(struct ispccdc_fpc fpc); ++ ++void ispccdc_enable_fpc(u8 enable); ++ ++void ispccdc_config_black_comp(struct ispccdc_blcomp blcomp); ++ ++void ispccdc_config_vp(struct ispccdc_vp vp); ++ ++void ispccdc_enable_vp(u8 enable); ++ ++void ispccdc_config_reformatter(struct ispccdc_refmt refmt); ++ ++void ispccdc_enable_reformatter(u8 enable); ++ ++void ispccdc_config_culling(struct ispccdc_culling culling); ++ ++void ispccdc_enable_lpf(u8 enable); ++ ++void ispccdc_config_alaw(enum alaw_ipwidth ipwidth); ++ ++void ispccdc_enable_alaw(u8 enable); ++ ++int ispccdc_load_lsc(u8 *table_addr, u32 table_size); ++ ++void ispccdc_config_lsc(struct ispccdc_lsc_config *lsc_cfg); ++ ++void ispccdc_enable_lsc(u8 enable); ++ ++void ispccdc_lsc_error_handler(void); ++ ++void ispccdc_config_imgattr(u32 colptn); ++ ++void ispccdc_config_shadow_registers(void); ++ ++int ispccdc_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h); ++ ++int ispccdc_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h); ++ ++int ispccdc_config_outlineoffset(u32 offset, u8 oddeven, u8 numlines); ++ ++int ispccdc_set_outaddr(u32 addr); ++ ++void ispccdc_enable(u8 enable); ++ ++void ispccdc_suspend(void); ++ ++void ispccdc_resume(void); ++ ++int ispccdc_sbl_busy(void); ++ ++int ispccdc_busy(void); ++ ++void ispccdc_save_context(void); ++ ++void ispccdc_restore_context(void); ++ ++void ispccdc_print_status(void); ++ ++int omap34xx_isp_ccdc_config(void *userspace_add); ++ ++void ispccdc_set_wenlog(u32 wenlog); ++ ++#endif /* OMAP_ISP_CCDC_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch new file mode 100644 index 0000000000..c549eadc88 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch @@ -0,0 +1,3413 @@ +From 926b51afea146826c8076e5fb305eaa0332399b4 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add ISP backend (PRV and RSZ) + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/isppreview.c | 1929 ++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/isppreview.h | 354 +++++++ + drivers/media/video/isp/ispresizer.c | 928 ++++++++++++++++ + drivers/media/video/isp/ispresizer.h | 158 +++ + 4 files changed, 3369 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/isppreview.c + create mode 100644 drivers/media/video/isp/isppreview.h + create mode 100644 drivers/media/video/isp/ispresizer.c + create mode 100644 drivers/media/video/isp/ispresizer.h + +diff --git a/drivers/media/video/isp/isppreview.c b/drivers/media/video/isp/isppreview.c +new file mode 100644 +index 0000000..17f1abc +--- /dev/null ++++ b/drivers/media/video/isp/isppreview.c +@@ -0,0 +1,1929 @@ ++/* ++ * isppreview.c ++ * ++ * Driver Library for Preview module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Senthilvadivu Guruswamy ++ * Pallavi Kulkarni ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isppreview.h" ++ ++static struct ispprev_nf prev_nf_t; ++static struct prev_params *params; ++static int rg_update, gg_update, bg_update, nf_enable, nf_update; ++ ++/* Structure for saving/restoring preview module registers */ ++static struct isp_reg ispprev_reg_list[] = { ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_HORZ_INFO, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_VERT_INFO, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RSDR_ADDR, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RADR_OFFSET, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_DSDR_ADDR, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_DRKF_OFFSET, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_WSDR_ADDR, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_WADD_OFFSET, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_HMED, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_NF, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_WB_DGAIN, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_WBGAIN, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_WBSEL, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_BLKADJOFF, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT1, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT2, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT3, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT4, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT5, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF1, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF2, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC0, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC1, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC2, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC_OFFSET, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CSUP, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_SETUP_YC, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR0, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR1, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR2, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR3, 0x0000}, ++ {OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, 0x0000}, ++ {0, ISP_TOK_TERM, 0x0000} ++}; ++ ++ ++/* Default values in Office Flourescent Light for RGBtoRGB Blending */ ++static struct ispprev_rgbtorgb flr_rgb2rgb = { ++ { /* RGB-RGB Matrix */ ++ {0x01E2, 0x0F30, 0x0FEE}, ++ {0x0F9B, 0x01AC, 0x0FB9}, ++ {0x0FE0, 0x0EC0, 0x0260} ++ }, /* RGB Offset */ ++ {0x0000, 0x0000, 0x0000} ++}; ++ ++/* Default values in Office Flourescent Light for RGB to YUV Conversion*/ ++static struct ispprev_csc flr_prev_csc[] = { ++ { ++ { /* CSC Coef Matrix */ ++ {66, 129, 25}, ++ {-38, -75, 112}, ++ {112, -94 , -18} ++ }, /* CSC Offset */ ++ {0x0, 0x0, 0x0} ++ }, ++ { ++ { /* CSC Coef Matrix BW */ ++ {66, 129, 25}, ++ {0, 0, 0}, ++ {0, 0, 0} ++ }, /* CSC Offset */ ++ {0x0, 0x0, 0x0} ++ }, ++ { ++ { /* CSC Coef Matrix Sepia */ ++ {19, 38, 7}, ++ {0, 0, 0}, ++ {0, 0, 0} ++ }, /* CSC Offset */ ++ {0x0, 0xE7, 0x14} ++ } ++}; ++ ++ ++/* Default values in Office Flourescent Light for CFA Gradient*/ ++#define FLR_CFA_GRADTHRS_HORZ 0x28 ++#define FLR_CFA_GRADTHRS_VERT 0x28 ++ ++/* Default values in Office Flourescent Light for Chroma Suppression*/ ++#define FLR_CSUP_GAIN 0x0D ++#define FLR_CSUP_THRES 0xEB ++ ++/* Default values in Office Flourescent Light for Noise Filter*/ ++#define FLR_NF_STRGTH 0x03 ++ ++/* Default values in Office Flourescent Light for White Balance*/ ++#define FLR_WBAL_DGAIN 0x100 ++#define FLR_WBAL_COEF0 0x20 ++#define FLR_WBAL_COEF1 0x29 ++#define FLR_WBAL_COEF2 0x2d ++#define FLR_WBAL_COEF3 0x20 ++ ++#define FLR_WBAL_COEF0_ES1 0x20 ++#define FLR_WBAL_COEF1_ES1 0x23 ++#define FLR_WBAL_COEF2_ES1 0x39 ++#define FLR_WBAL_COEF3_ES1 0x20 ++ ++/* Default values in Office Flourescent Light for Black Adjustment*/ ++#define FLR_BLKADJ_BLUE 0x0 ++#define FLR_BLKADJ_GREEN 0x0 ++#define FLR_BLKADJ_RED 0x0 ++ ++static int update_color_matrix; ++ ++/** ++ * struct isp_prev - Structure for storing ISP Preview module information ++ * @prev_inuse: Flag to determine if CCDC has been reserved or not (0 or 1). ++ * @prevout_w: Preview output width. ++ * @prevout_h: Preview output height. ++ * @previn_w: Preview input width. ++ * @previn_h: Preview input height. ++ * @prev_inpfmt: Preview input format. ++ * @prev_outfmt: Preview output format. ++ * @hmed_en: Horizontal median filter enable. ++ * @nf_en: Noise filter enable. ++ * @dcor_en: Defect correction enable. ++ * @cfa_en: Color Filter Array (CFA) interpolation enable. ++ * @csup_en: Chrominance suppression enable. ++ * @yenh_en: Luma enhancement enable. ++ * @fmtavg: Number of horizontal pixels to average in input formatter. The ++ * input width should be a multiple of this number. ++ * @brightness: Brightness in preview module. ++ * @contrast: Contrast in preview module. ++ * @color: Color effect in preview module. ++ * @cfafmt: Color Filter Array (CFA) Format. ++ * @ispprev_mutex: Mutex for isp preview. ++ * ++ * This structure is used to store the OMAP ISP Preview module Information. ++ */ ++static struct isp_prev { ++ int pm_state; ++ u8 prev_inuse; ++ u32 prevout_w; ++ u32 prevout_h; ++ u32 previn_w; ++ u32 previn_h; ++ enum preview_input prev_inpfmt; ++ enum preview_output prev_outfmt; ++ u8 hmed_en; ++ u8 nf_en; ++ u8 dcor_en; ++ u8 cfa_en; ++ u8 csup_en; ++ u8 yenh_en; ++ u8 fmtavg; ++ u8 brightness; ++ u8 contrast; ++ enum v4l2_colorfx color; ++ enum cfa_fmt cfafmt; ++ struct mutex ispprev_mutex; /* For checking/modifying prev_inuse */ ++ u32 sph; ++ u32 slv; ++} ispprev_obj; ++ ++/* Saved parameters */ ++static struct prev_params *prev_config_params; ++ ++/* ++ * Coeficient Tables for the submodules in Preview. ++ * Array is initialised with the values from.the tables text file. ++ */ ++ ++/* ++ * CFA Filter Coefficient Table ++ * ++ */ ++static u32 cfa_coef_table[] = { ++#include "cfa_coef_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Red ++ */ ++static u32 redgamma_table[] = { ++#include "redgamma_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Green ++ */ ++static u32 greengamma_table[] = { ++#include "greengamma_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Blue ++ */ ++static u32 bluegamma_table[] = { ++#include "bluegamma_table.h" ++}; ++ ++/* ++ * Noise Filter Threshold table ++ */ ++static u32 noise_filter_table[] = { ++#include "noise_filter_table.h" ++}; ++ ++/* ++ * Luminance Enhancement Table ++ */ ++static u32 luma_enhance_table[] = { ++#include "luma_enhance_table.h" ++}; ++ ++/** ++ * omap34xx_isp_preview_config - Abstraction layer Preview configuration. ++ * @userspace_add: Pointer from Userspace to structure with flags and data to ++ * update. ++ **/ ++int omap34xx_isp_preview_config(void *userspace_add) ++{ ++ struct ispprev_hmed prev_hmed_t; ++ struct ispprev_cfa prev_cfa_t; ++ struct ispprev_csup csup_t; ++ struct ispprev_wbal prev_wbal_t; ++ struct ispprev_blkadj prev_blkadj_t; ++ struct ispprev_rgbtorgb rgb2rgb_t; ++ struct ispprev_csc prev_csc_t; ++ struct ispprev_yclimit yclimit_t; ++ struct ispprev_dcor prev_dcor_t; ++ struct ispprv_update_config *preview_struct; ++ struct isptables_update isp_table_update; ++ int yen_t[ISPPRV_YENH_TBL_SIZE]; ++ ++ if (userspace_add == NULL) ++ return -EINVAL; ++ ++ preview_struct = userspace_add; ++ ++ if (ISP_ABS_PREV_LUMAENH & preview_struct->flag) { ++ if (ISP_ABS_PREV_LUMAENH & preview_struct->update) { ++ if (copy_from_user(yen_t, preview_struct->yen, ++ sizeof(yen_t))) ++ goto err_copy_from_user; ++ isppreview_config_luma_enhancement(yen_t); ++ } ++ params->features |= PREV_LUMA_ENHANCE; ++ } else if (ISP_ABS_PREV_LUMAENH & preview_struct->update) ++ params->features &= ~PREV_LUMA_ENHANCE; ++ ++ if (ISP_ABS_PREV_INVALAW & preview_struct->flag) { ++ isppreview_enable_invalaw(1); ++ params->features |= PREV_INVERSE_ALAW; ++ } else { ++ isppreview_enable_invalaw(0); ++ params->features &= ~PREV_INVERSE_ALAW; ++ } ++ ++ if (ISP_ABS_PREV_HRZ_MED & preview_struct->flag) { ++ if (ISP_ABS_PREV_HRZ_MED & preview_struct->update) { ++ if (copy_from_user(&prev_hmed_t, ++ (struct ispprev_hmed *) ++ preview_struct->prev_hmed, ++ sizeof(struct ispprev_hmed))) ++ goto err_copy_from_user; ++ isppreview_config_hmed(prev_hmed_t); ++ } ++ isppreview_enable_hmed(1); ++ params->features |= PREV_HORZ_MEDIAN_FILTER; ++ } else if (ISP_ABS_PREV_HRZ_MED & preview_struct->update) { ++ isppreview_enable_hmed(0); ++ params->features &= ~PREV_HORZ_MEDIAN_FILTER; ++ } ++ ++ if (ISP_ABS_PREV_CFA & preview_struct->flag) { ++ if (ISP_ABS_PREV_CFA & preview_struct->update) { ++ if (copy_from_user(&prev_cfa_t, ++ (struct ispprev_cfa *) ++ preview_struct->prev_cfa, ++ sizeof(struct ispprev_cfa))) ++ goto err_copy_from_user; ++ ++ isppreview_config_cfa(prev_cfa_t); ++ } ++ isppreview_enable_cfa(1); ++ params->features |= PREV_CFA; ++ } else if (ISP_ABS_PREV_CFA & preview_struct->update) { ++ isppreview_enable_cfa(0); ++ params->features &= ~PREV_CFA; ++ } ++ ++ if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->flag) { ++ if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->update) { ++ if (copy_from_user(&csup_t, ++ (struct ispprev_csup *) ++ preview_struct->csup, ++ sizeof(struct ispprev_csup))) ++ goto err_copy_from_user; ++ isppreview_config_chroma_suppression(csup_t); ++ } ++ isppreview_enable_chroma_suppression(1); ++ params->features |= PREV_CHROMA_SUPPRESS; ++ } else if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->update) { ++ isppreview_enable_chroma_suppression(0); ++ params->features &= ~PREV_CHROMA_SUPPRESS; ++ } ++ ++ if (ISP_ABS_PREV_WB & preview_struct->update) { ++ if (copy_from_user(&prev_wbal_t, (struct ispprev_wbal *) ++ preview_struct->prev_wbal, ++ sizeof(struct ispprev_wbal))) ++ goto err_copy_from_user; ++ isppreview_config_whitebalance(prev_wbal_t); ++ } ++ ++ if (ISP_ABS_PREV_BLKADJ & preview_struct->update) { ++ if (copy_from_user(&prev_blkadj_t, (struct ispprev_blkadjl *) ++ preview_struct->prev_blkadj, ++ sizeof(struct ispprev_blkadj))) ++ goto err_copy_from_user; ++ isppreview_config_blkadj(prev_blkadj_t); ++ } ++ ++ if (ISP_ABS_PREV_RGB2RGB & preview_struct->update) { ++ if (copy_from_user(&rgb2rgb_t, (struct ispprev_rgbtorgb *) ++ preview_struct->rgb2rgb, ++ sizeof(struct ispprev_rgbtorgb))) ++ goto err_copy_from_user; ++ isppreview_config_rgb_blending(rgb2rgb_t); ++ } ++ ++ if (ISP_ABS_PREV_COLOR_CONV & preview_struct->update) { ++ if (copy_from_user(&prev_csc_t, (struct ispprev_csc *) ++ preview_struct->prev_csc, ++ sizeof(struct ispprev_csc))) ++ goto err_copy_from_user; ++ isppreview_config_rgb_to_ycbcr(prev_csc_t); ++ } ++ ++ if (ISP_ABS_PREV_YC_LIMIT & preview_struct->update) { ++ if (copy_from_user(&yclimit_t, (struct ispprev_yclimit *) ++ preview_struct->yclimit, ++ sizeof(struct ispprev_yclimit))) ++ goto err_copy_from_user; ++ isppreview_config_yc_range(yclimit_t); ++ } ++ ++ if (ISP_ABS_PREV_DEFECT_COR & preview_struct->flag) { ++ if (ISP_ABS_PREV_DEFECT_COR & preview_struct->update) { ++ if (copy_from_user(&prev_dcor_t, ++ (struct ispprev_dcor *) ++ preview_struct->prev_dcor, ++ sizeof(struct ispprev_dcor))) ++ goto err_copy_from_user; ++ isppreview_config_dcor(prev_dcor_t); ++ } ++ isppreview_enable_dcor(1); ++ params->features |= PREV_DEFECT_COR; ++ } else if (ISP_ABS_PREV_DEFECT_COR & preview_struct->update) { ++ isppreview_enable_dcor(0); ++ params->features &= ~PREV_DEFECT_COR; ++ } ++ ++ if (ISP_ABS_PREV_GAMMABYPASS & preview_struct->flag) { ++ isppreview_enable_gammabypass(1); ++ params->features |= PREV_GAMMA_BYPASS; ++ } else { ++ isppreview_enable_gammabypass(0); ++ params->features &= ~PREV_GAMMA_BYPASS; ++ } ++ ++ isp_table_update.update = preview_struct->update; ++ isp_table_update.flag = preview_struct->flag; ++ isp_table_update.prev_nf = preview_struct->prev_nf; ++ isp_table_update.red_gamma = preview_struct->red_gamma; ++ isp_table_update.green_gamma = preview_struct->green_gamma; ++ isp_table_update.blue_gamma = preview_struct->blue_gamma; ++ ++ if (omap34xx_isp_tables_update(&isp_table_update)) ++ goto err_copy_from_user; ++ ++ return 0; ++ ++err_copy_from_user: ++ printk(KERN_ERR "Preview Config: Copy From User Error\n"); ++ return -EFAULT; ++} ++EXPORT_SYMBOL_GPL(omap34xx_isp_preview_config); ++ ++/** ++ * omap34xx_isp_tables_update - Abstraction layer Tables update. ++ * @isptables_struct: Pointer from Userspace to structure with flags and table ++ * data to update. ++ **/ ++int omap34xx_isp_tables_update(struct isptables_update *isptables_struct) ++{ ++ ++ if (ISP_ABS_TBL_NF & isptables_struct->flag) { ++ nf_enable = 1; ++ params->features |= PREV_NOISE_FILTER; ++ if (ISP_ABS_TBL_NF & isptables_struct->update) { ++ if (copy_from_user(&prev_nf_t, (struct ispprev_nf *) ++ isptables_struct->prev_nf, ++ sizeof(struct ispprev_nf))) ++ goto err_copy_from_user; ++ ++ nf_update = 1; ++ } else ++ nf_update = 0; ++ } else { ++ nf_enable = 0; ++ params->features &= ~PREV_NOISE_FILTER; ++ if (ISP_ABS_TBL_NF & isptables_struct->update) ++ nf_update = 1; ++ else ++ nf_update = 0; ++ } ++ ++ if (ISP_ABS_TBL_REDGAMMA & isptables_struct->update) { ++ if (copy_from_user(redgamma_table, isptables_struct->red_gamma, ++ sizeof(redgamma_table))) { ++ goto err_copy_from_user; ++ } ++ rg_update = 1; ++ } else ++ rg_update = 0; ++ ++ if (ISP_ABS_TBL_GREENGAMMA & isptables_struct->update) { ++ if (copy_from_user(greengamma_table, ++ isptables_struct->green_gamma, ++ sizeof(greengamma_table))) ++ goto err_copy_from_user; ++ gg_update = 1; ++ } else ++ gg_update = 0; ++ ++ if (ISP_ABS_TBL_BLUEGAMMA & isptables_struct->update) { ++ if (copy_from_user(bluegamma_table, ++ isptables_struct->blue_gamma, ++ sizeof(bluegamma_table))) { ++ goto err_copy_from_user; ++ } ++ bg_update = 1; ++ } else ++ bg_update = 0; ++ ++ return 0; ++ ++err_copy_from_user: ++ printk(KERN_ERR "Preview Tables:Copy From User Error\n"); ++ return -EFAULT; ++} ++ ++/** ++ * isppreview_config_shadow_registers - Program shadow registers for preview. ++ * ++ * Allows user to program shadow registers associated with preview module. ++ **/ ++void isppreview_config_shadow_registers() ++{ ++ u8 current_brightness_contrast; ++ int ctr, prv_disabled; ++ ++ isppreview_query_brightness(¤t_brightness_contrast); ++ if (current_brightness_contrast != ++ (ispprev_obj.brightness * ISPPRV_BRIGHT_UNITS)) { ++ DPRINTK_ISPPREV(" Changing Brightness level to %d\n", ++ ispprev_obj.brightness); ++ isppreview_config_brightness(ispprev_obj.brightness * ++ ISPPRV_BRIGHT_UNITS); ++ } ++ ++ isppreview_query_contrast(¤t_brightness_contrast); ++ if (current_brightness_contrast != ++ (ispprev_obj.contrast * ISPPRV_CONTRAST_UNITS)) { ++ DPRINTK_ISPPREV(" Changing Contrast level to %d\n", ++ ispprev_obj.contrast); ++ isppreview_config_contrast(ispprev_obj.contrast * ++ ISPPRV_CONTRAST_UNITS); ++ } ++ if (update_color_matrix) { ++ isppreview_config_rgb_to_ycbcr(flr_prev_csc[ispprev_obj.color]); ++ update_color_matrix = 0; ++ } ++ if (gg_update || rg_update || bg_update || nf_update) { ++ isppreview_enable(0); ++ prv_disabled = 1; ++ } ++ ++ if (gg_update) { ++ isp_reg_writel(ISPPRV_TBL_ADDR_GREEN_G_START, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) { ++ isp_reg_writel(greengamma_table[ctr], ++ OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_DATA); ++ } ++ gg_update = 0; ++ } ++ ++ if (rg_update) { ++ isp_reg_writel(ISPPRV_TBL_ADDR_RED_G_START, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) { ++ isp_reg_writel(redgamma_table[ctr], ++ OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_DATA); ++ } ++ rg_update = 0; ++ } ++ ++ if (bg_update) { ++ isp_reg_writel(ISPPRV_TBL_ADDR_BLUE_G_START, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) { ++ isp_reg_writel(bluegamma_table[ctr], ++ OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_DATA); ++ } ++ bg_update = 0; ++ } ++ ++ if (nf_update && nf_enable) { ++ isp_reg_writel(0xC00, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ isp_reg_writel(prev_nf_t.spread, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_NF); ++ for (ctr = 0; ctr < ISPPRV_NF_TBL_SIZE; ctr++) { ++ isp_reg_writel(prev_nf_t.table[ctr], ++ OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_DATA); ++ } ++ isppreview_enable_noisefilter(1); ++ nf_update = 0; ++ } ++ ++ if (~nf_update && nf_enable) ++ isppreview_enable_noisefilter(1); ++ ++ if (nf_update && ~nf_enable) ++ isppreview_enable_noisefilter(0); ++ ++ if (prv_disabled) { ++ isppreview_enable(1); ++ prv_disabled = 0; ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_shadow_registers); ++ ++/** ++ * isppreview_request - Reserves the preview module. ++ * ++ * Returns 0 if successful, or -EBUSY if the module was already reserved. ++ **/ ++int isppreview_request() ++{ ++ mutex_lock(&ispprev_obj.ispprev_mutex); ++ if (ispprev_obj.prev_inuse) { ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ printk(KERN_ERR "ISP_ERR : Preview Module Busy\n"); ++ return -EBUSY; ++ } ++ ispprev_obj.prev_inuse = 1; ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ isp_reg_or(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ISPCTRL_PREV_RAM_EN | ++ ISPCTRL_PREV_CLK_EN | ++ ISPCTRL_SBL_WR1_RAM_EN); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_request); ++ ++/** ++ * isppreview_free - Frees the preview module. ++ * ++ * Returns 0 if successful, or -EINVAL if the module was already freed. ++ **/ ++int isppreview_free() ++{ ++ mutex_lock(&ispprev_obj.ispprev_mutex); ++ if (ispprev_obj.prev_inuse) { ++ ispprev_obj.prev_inuse = 0; ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ++ ~(ISPCTRL_PREV_CLK_EN | ++ ISPCTRL_PREV_RAM_EN | ++ ISPCTRL_SBL_WR1_RAM_EN)); ++ return 0; ++ } else { ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ DPRINTK_ISPPREV("ISP_ERR : Preview Module already freed\n"); ++ return -EINVAL; ++ } ++ ++} ++EXPORT_SYMBOL_GPL(isppreview_free); ++ ++/** isppreview_config_datapath - Specifies input and output modules for Preview ++ * @input: Indicates the module that gives the image to preview. ++ * @output: Indicates the module to which the preview outputs to. ++ * ++ * Configures the default configuration for the CCDC to work with. ++ * ++ * The valid values for the input are PRV_RAW_CCDC (0), PRV_RAW_MEM (1), ++ * PRV_RGBBAYERCFA (2), PRV_COMPCFA (3), PRV_CCDC_DRKF (4), PRV_OTHERS (5). ++ * ++ * The valid values for the output are PREVIEW_RSZ (0), PREVIEW_MEM (1). ++ * ++ * Returns 0 if successful, or -EINVAL if wrong input or output values are ++ * specified. ++ **/ ++int isppreview_config_datapath(enum preview_input input, ++ enum preview_output output) ++{ ++ u32 pcr = 0; ++ u8 enable = 0; ++ struct prev_params *params = prev_config_params; ++ struct ispprev_yclimit yclimit; ++ ++ pcr = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ ++ switch (input) { ++ case PRV_RAW_CCDC: ++ pcr &= ~ISPPRV_PCR_SOURCE; ++ pcr &= ~ISPPRV_PCR_ONESHOT; ++ ispprev_obj.prev_inpfmt = PRV_RAW_CCDC; ++ break; ++ case PRV_RAW_MEM: ++ pcr |= ISPPRV_PCR_SOURCE; ++ pcr |= ISPPRV_PCR_ONESHOT; ++ ispprev_obj.prev_inpfmt = PRV_RAW_MEM; ++ break; ++ case PRV_CCDC_DRKF: ++ pcr |= ISPPRV_PCR_DRKFCAP; ++ pcr |= ISPPRV_PCR_ONESHOT; ++ ispprev_obj.prev_inpfmt = PRV_CCDC_DRKF; ++ break; ++ case PRV_COMPCFA: ++ ispprev_obj.prev_inpfmt = PRV_COMPCFA; ++ break; ++ case PRV_OTHERS: ++ ispprev_obj.prev_inpfmt = PRV_OTHERS; ++ break; ++ case PRV_RGBBAYERCFA: ++ ispprev_obj.prev_inpfmt = PRV_RGBBAYERCFA; ++ break; ++ default: ++ printk(KERN_ERR "ISP_ERR : Wrong Input\n"); ++ return -EINVAL; ++ }; ++ ++ switch (output) { ++ case PREVIEW_RSZ: ++ pcr |= ISPPRV_PCR_RSZPORT; ++ pcr &= ~ISPPRV_PCR_SDRPORT; ++ break; ++ case PREVIEW_MEM: ++ pcr &= ~ISPPRV_PCR_RSZPORT; ++ pcr |= ISPPRV_PCR_SDRPORT; ++ break; ++ default: ++ printk(KERN_ERR "ISP_ERR : Wrong Output\n"); ++ return -EINVAL; ++ } ++ ispprev_obj.prev_outfmt = output; ++ ++ isp_reg_writel(pcr, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ ++ isppreview_config_ycpos(params->pix_fmt); ++ ++ if (params->cfa.cfa_table != NULL) ++ isppreview_config_cfa(params->cfa); ++ if (params->csup.hypf_en == 1) ++ isppreview_config_chroma_suppression(params->csup); ++ if (params->ytable != NULL) ++ isppreview_config_luma_enhancement(params->ytable); ++ ++ if (params->gtable.redtable != NULL) ++ isppreview_config_gammacorrn(params->gtable); ++ ++ enable = (params->features & PREV_CFA) ? 1 : 0; ++ isppreview_enable_cfa(enable); ++ ++ enable = (params->features & PREV_CHROMA_SUPPRESS) ? 1 : 0; ++ isppreview_enable_chroma_suppression(enable); ++ ++ enable = (params->features & PREV_LUMA_ENHANCE) ? 1 : 0; ++ isppreview_enable_luma_enhancement(enable); ++ ++ enable = (params->features & PREV_NOISE_FILTER) ? 1 : 0; ++ if (enable) ++ isppreview_config_noisefilter(params->nf); ++ isppreview_enable_noisefilter(enable); ++ ++ enable = (params->features & PREV_DEFECT_COR) ? 1 : 0; ++ if (enable) ++ isppreview_config_dcor(params->dcor); ++ isppreview_enable_dcor(enable); ++ ++ enable = (params->features & PREV_GAMMA_BYPASS) ? 1 : 0; ++ isppreview_enable_gammabypass(enable); ++ ++ isppreview_config_whitebalance(params->wbal); ++ isppreview_config_blkadj(params->blk_adj); ++ isppreview_config_rgb_blending(params->rgb2rgb); ++ isppreview_config_rgb_to_ycbcr(params->rgb2ycbcr); ++ ++ isppreview_config_contrast(params->contrast * ISPPRV_CONTRAST_UNITS); ++ isppreview_config_brightness(params->brightness * ISPPRV_BRIGHT_UNITS); ++ ++ yclimit.minC = ISPPRV_YC_MIN; ++ yclimit.maxC = ISPPRV_YC_MAX; ++ yclimit.minY = ISPPRV_YC_MIN; ++ yclimit.maxY = ISPPRV_YC_MAX; ++ isppreview_config_yc_range(yclimit); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_config_datapath); ++ ++/** ++ * isppreview_set_skip - Set the number of rows/columns that should be skipped. ++ * h - Start Pixel Horizontal. ++ * v - Start Line Vertical. ++ **/ ++void isppreview_set_skip(u32 h, u32 v) ++{ ++ ispprev_obj.sph = h; ++ ispprev_obj.slv = v; ++} ++EXPORT_SYMBOL_GPL(isppreview_set_skip); ++ ++/** ++ * isppreview_config_ycpos - Configure byte layout of YUV image. ++ * @mode: Indicates the required byte layout. ++ **/ ++void isppreview_config_ycpos(enum preview_ycpos_mode mode) ++{ ++ u32 pcr = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ pcr &= ~ISPPRV_PCR_YCPOS_CrYCbY; ++ pcr |= (mode << ISPPRV_PCR_YCPOS_SHIFT); ++ isp_reg_writel(pcr, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_ycpos); ++ ++/** ++ * isppreview_config_averager - Enable / disable / configure averager ++ * @average: Average value to be configured. ++ **/ ++void isppreview_config_averager(u8 average) ++{ ++ int reg = 0; ++ ++ reg = AVE_ODD_PIXEL_DIST | AVE_EVEN_PIXEL_DIST | average; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_averager); ++ ++/** ++ * isppreview_enable_invalaw - Enable/Disable Inverse A-Law module in Preview. ++ * @enable: 1 - Reverse the A-Law done in CCDC. ++ **/ ++void isppreview_enable_invalaw(u8 enable) ++{ ++ u32 pcr_val = 0; ++ pcr_val = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ ++ if (enable) { ++ isp_reg_writel(pcr_val | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ } else { ++ isp_reg_writel(pcr_val & ++ ~(ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_invalaw); ++ ++/** ++ * isppreview_enable_drkframe - Enable/Disable of the darkframe subtract. ++ * @enable: 1 - Acquires memory bandwidth since the pixels in each frame is ++ * subtracted with the pixels in the current frame. ++ * ++ * The proccess is applied for each captured frame. ++ **/ ++void isppreview_enable_drkframe(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_DRKFEN); ++ else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_DRKFEN); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_drkframe); ++ ++/** ++ * isppreview_enable_shadcomp - Enables/Disables the shading compensation. ++ * @enable: 1 - Enables the shading compensation. ++ * ++ * If dark frame subtract won't be used, then enable this shading ++ * compensation. ++ **/ ++void isppreview_enable_shadcomp(u8 enable) ++{ ++ ++ if (enable) { ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ISPPRV_PCR_SCOMP_EN); ++ isppreview_enable_drkframe(1); ++ } else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_SCOMP_EN); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_shadcomp); ++ ++/** ++ * isppreview_config_drkf_shadcomp - Configures shift value in shading comp. ++ * @scomp_shtval: 3bit value of shift used in shading compensation. ++ **/ ++void isppreview_config_drkf_shadcomp(u8 scomp_shtval) ++{ ++ u32 pcr_val = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++ ++ pcr_val &= ISPPRV_PCR_SCOMP_SFT_MASK; ++ isp_reg_writel(pcr_val | (scomp_shtval << ISPPRV_PCR_SCOMP_SFT_SHIFT), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_drkf_shadcomp); ++ ++/** ++ * isppreview_enable_hmed - Enables/Disables of the Horizontal Median Filter. ++ * @enable: 1 - Enables Horizontal Median Filter. ++ **/ ++void isppreview_enable_hmed(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_HMEDEN); ++ else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_HMEDEN); ++ } ++ ispprev_obj.hmed_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_hmed); ++ ++/** ++ * isppreview_config_hmed - Configures the Horizontal Median Filter. ++ * @prev_hmed: Structure containing the odd and even distance between the ++ * pixels in the image along with the filter threshold. ++ **/ ++void isppreview_config_hmed(struct ispprev_hmed prev_hmed) ++{ ++ ++ u32 odddist = 0; ++ u32 evendist = 0; ++ ++ if (prev_hmed.odddist == 1) ++ odddist = ~ISPPRV_HMED_ODDDIST; ++ else ++ odddist = ISPPRV_HMED_ODDDIST; ++ ++ if (prev_hmed.evendist == 1) ++ evendist = ~ISPPRV_HMED_EVENDIST; ++ else ++ evendist = ISPPRV_HMED_EVENDIST; ++ ++ isp_reg_writel(odddist | evendist | (prev_hmed.thres << ++ ISPPRV_HMED_THRESHOLD_SHIFT), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_HMED); ++ ++} ++EXPORT_SYMBOL_GPL(isppreview_config_hmed); ++ ++/** ++ * isppreview_config_noisefilter - Configures the Noise Filter. ++ * @prev_nf: Structure containing the noisefilter table, strength to be used ++ * for the noise filter and the defect correction enable flag. ++ **/ ++void isppreview_config_noisefilter(struct ispprev_nf prev_nf) ++{ ++ int i = 0; ++ ++ isp_reg_writel(prev_nf.spread, OMAP3_ISP_IOMEM_PREV, ISPPRV_NF); ++ isp_reg_writel(ISPPRV_NF_TABLE_ADDR, OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < ISPPRV_NF_TBL_SIZE; i++) { ++ isp_reg_writel(prev_nf.table[i], OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_DATA); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_noisefilter); ++ ++/** ++ * isppreview_config_dcor - Configures the defect correction ++ * @prev_nf: Structure containing the defect correction structure ++ **/ ++void isppreview_config_dcor(struct ispprev_dcor prev_dcor) ++{ ++ if (prev_dcor.couplet_mode_en) { ++ isp_reg_writel(prev_dcor.detect_correct[0], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR0); ++ isp_reg_writel(prev_dcor.detect_correct[1], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR1); ++ isp_reg_writel(prev_dcor.detect_correct[2], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR2); ++ isp_reg_writel(prev_dcor.detect_correct[3], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR3); ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_DCCOUP); ++ } else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_DCCOUP); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_dcor); ++ ++/** ++ * isppreview_config_cfa - Configures the CFA Interpolation parameters. ++ * @prev_cfa: Structure containing the CFA interpolation table, CFA format ++ * in the image, vertical and horizontal gradient threshold. ++ **/ ++void isppreview_config_cfa(struct ispprev_cfa prev_cfa) ++{ ++ int i = 0; ++ ++ ispprev_obj.cfafmt = prev_cfa.cfafmt; ++ ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ (prev_cfa.cfafmt << ISPPRV_PCR_CFAFMT_SHIFT)); ++ ++ isp_reg_writel( ++ (prev_cfa.cfa_gradthrs_vert << ISPPRV_CFA_GRADTH_VER_SHIFT) | ++ (prev_cfa.cfa_gradthrs_horz << ISPPRV_CFA_GRADTH_HOR_SHIFT), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA); ++ ++ isp_reg_writel(ISPPRV_CFA_TABLE_ADDR, OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_SET_TBL_ADDR); ++ ++ for (i = 0; i < ISPPRV_CFA_TBL_SIZE; i++) { ++ isp_reg_writel(prev_cfa.cfa_table[i], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_cfa); ++ ++/** ++ * isppreview_config_gammacorrn - Configures the Gamma Correction table values ++ * @gtable: Structure containing the table for red, blue, green gamma table. ++ **/ ++void isppreview_config_gammacorrn(struct ispprev_gtable gtable) ++{ ++ int i = 0; ++ ++ isp_reg_writel(ISPPRV_REDGAMMA_TABLE_ADDR, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < ISPPRV_GAMMA_TBL_SIZE; i++) { ++ isp_reg_writel(gtable.redtable[i], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); ++ } ++ ++ isp_reg_writel(ISPPRV_GREENGAMMA_TABLE_ADDR, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < ISPPRV_GAMMA_TBL_SIZE; i++) { ++ isp_reg_writel(gtable.greentable[i], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); ++ } ++ ++ isp_reg_writel(ISPPRV_BLUEGAMMA_TABLE_ADDR, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < ISPPRV_GAMMA_TBL_SIZE; i++) { ++ isp_reg_writel(gtable.bluetable[i], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_gammacorrn); ++ ++/** ++ * isppreview_config_luma_enhancement - Sets the Luminance Enhancement table. ++ * @ytable: Structure containing the table for Luminance Enhancement table. ++ **/ ++void isppreview_config_luma_enhancement(u32 *ytable) ++{ ++ int i = 0; ++ ++ isp_reg_writel(ISPPRV_YENH_TABLE_ADDR, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < ISPPRV_YENH_TBL_SIZE; i++) { ++ isp_reg_writel(ytable[i], ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_config_luma_enhancement); ++ ++/** ++ * isppreview_config_chroma_suppression - Configures the Chroma Suppression. ++ * @csup: Structure containing the threshold value for suppression ++ * and the hypass filter enable flag. ++ **/ ++void isppreview_config_chroma_suppression(struct ispprev_csup csup) ++{ ++ isp_reg_writel(csup.gain | (csup.thres << ISPPRV_CSUP_THRES_SHIFT) | ++ (csup.hypf_en << ISPPRV_CSUP_HPYF_SHIFT), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CSUP); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_chroma_suppression); ++ ++/** ++ * isppreview_enable_noisefilter - Enables/Disables the Noise Filter. ++ * @enable: 1 - Enables the Noise Filter. ++ **/ ++void isppreview_enable_noisefilter(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_NFEN); ++ else ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ~ISPPRV_PCR_NFEN); ++ ispprev_obj.nf_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_noisefilter); ++ ++/** ++ * isppreview_enable_dcor - Enables/Disables the defect correction. ++ * @enable: 1 - Enables the defect correction. ++ **/ ++void isppreview_enable_dcor(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_DCOREN); ++ else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_DCOREN); ++ } ++ ispprev_obj.dcor_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_dcor); ++ ++/** ++ * isppreview_enable_cfa - Enable/Disable the CFA Interpolation. ++ * @enable: 1 - Enables the CFA. ++ **/ ++void isppreview_enable_cfa(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_CFAEN); ++ else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_CFAEN); ++ } ++ ispprev_obj.cfa_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_cfa); ++ ++/** ++ * isppreview_enable_gammabypass - Enables/Disables the GammaByPass ++ * @enable: 1 - Bypasses Gamma - 10bit input is cropped to 8MSB. ++ * 0 - Goes through Gamma Correction. input and output is 10bit. ++ **/ ++void isppreview_enable_gammabypass(u8 enable) ++{ ++ if (enable) { ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ISPPRV_PCR_GAMMA_BYPASS); ++ } else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_GAMMA_BYPASS); ++ } ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_gammabypass); ++ ++/** ++ * isppreview_enable_luma_enhancement - Enables/Disables Luminance Enhancement ++ * @enable: 1 - Enable the Luminance Enhancement. ++ **/ ++void isppreview_enable_luma_enhancement(u8 enable) ++{ ++ if (enable) { ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ISPPRV_PCR_YNENHEN); ++ } else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_YNENHEN); ++ } ++ ispprev_obj.yenh_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_luma_enhancement); ++ ++/** ++ * isppreview_enable_chroma_suppression - Enables/Disables Chrominance Suppr. ++ * @enable: 1 - Enable the Chrominance Suppression. ++ **/ ++void isppreview_enable_chroma_suppression(u8 enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_SUPEN); ++ else { ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ++ ~ISPPRV_PCR_SUPEN); ++ } ++ ispprev_obj.csup_en = enable ? 1 : 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable_chroma_suppression); ++ ++/** ++ * isppreview_config_whitebalance - Configures the White Balance parameters. ++ * @prev_wbal: Structure containing the digital gain and white balance ++ * coefficient. ++ * ++ * Coefficient matrix always with default values. ++ **/ ++void isppreview_config_whitebalance(struct ispprev_wbal prev_wbal) ++{ ++ u32 val; ++ ++ isp_reg_writel(prev_wbal.dgain, OMAP3_ISP_IOMEM_PREV, ISPPRV_WB_DGAIN); ++ ++ val = prev_wbal.coef0 << ISPPRV_WBGAIN_COEF0_SHIFT; ++ val |= prev_wbal.coef1 << ISPPRV_WBGAIN_COEF1_SHIFT; ++ val |= prev_wbal.coef2 << ISPPRV_WBGAIN_COEF2_SHIFT; ++ val |= prev_wbal.coef3 << ISPPRV_WBGAIN_COEF3_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_WBGAIN); ++ ++ isp_reg_writel(ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N0_0_SHIFT | ++ ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N0_1_SHIFT | ++ ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N0_2_SHIFT | ++ ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N0_3_SHIFT | ++ ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N1_0_SHIFT | ++ ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N1_1_SHIFT | ++ ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N1_2_SHIFT | ++ ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N1_3_SHIFT | ++ ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N2_0_SHIFT | ++ ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N2_1_SHIFT | ++ ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N2_2_SHIFT | ++ ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N2_3_SHIFT | ++ ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N3_0_SHIFT | ++ ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N3_1_SHIFT | ++ ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N3_2_SHIFT | ++ ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N3_3_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_WBSEL); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_whitebalance); ++ ++/** ++ * isppreview_config_whitebalance2 - Configures the White Balance parameters. ++ * @prev_wbal: Structure containing the digital gain and white balance ++ * coefficient. ++ * ++ * Coefficient matrix can be changed. ++ **/ ++void isppreview_config_whitebalance2(struct prev_white_balance prev_wbal) ++{ ++ isp_reg_writel(prev_wbal.wb_dgain, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_WB_DGAIN); ++ isp_reg_writel(prev_wbal.wb_gain[0] | ++ prev_wbal.wb_gain[1] << ISPPRV_WBGAIN_COEF1_SHIFT | ++ prev_wbal.wb_gain[2] << ISPPRV_WBGAIN_COEF2_SHIFT | ++ prev_wbal.wb_gain[3] << ISPPRV_WBGAIN_COEF3_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_WBGAIN); ++ ++ isp_reg_writel( ++ prev_wbal.wb_coefmatrix[0][0] << ISPPRV_WBSEL_N0_0_SHIFT | ++ prev_wbal.wb_coefmatrix[0][1] << ISPPRV_WBSEL_N0_1_SHIFT | ++ prev_wbal.wb_coefmatrix[0][2] << ISPPRV_WBSEL_N0_2_SHIFT | ++ prev_wbal.wb_coefmatrix[0][3] << ISPPRV_WBSEL_N0_3_SHIFT | ++ prev_wbal.wb_coefmatrix[1][0] << ISPPRV_WBSEL_N1_0_SHIFT | ++ prev_wbal.wb_coefmatrix[1][1] << ISPPRV_WBSEL_N1_1_SHIFT | ++ prev_wbal.wb_coefmatrix[1][2] << ISPPRV_WBSEL_N1_2_SHIFT | ++ prev_wbal.wb_coefmatrix[1][3] << ISPPRV_WBSEL_N1_3_SHIFT | ++ prev_wbal.wb_coefmatrix[2][0] << ISPPRV_WBSEL_N2_0_SHIFT | ++ prev_wbal.wb_coefmatrix[2][1] << ISPPRV_WBSEL_N2_1_SHIFT | ++ prev_wbal.wb_coefmatrix[2][2] << ISPPRV_WBSEL_N2_2_SHIFT | ++ prev_wbal.wb_coefmatrix[2][3] << ISPPRV_WBSEL_N2_3_SHIFT | ++ prev_wbal.wb_coefmatrix[3][0] << ISPPRV_WBSEL_N3_0_SHIFT | ++ prev_wbal.wb_coefmatrix[3][1] << ISPPRV_WBSEL_N3_1_SHIFT | ++ prev_wbal.wb_coefmatrix[3][2] << ISPPRV_WBSEL_N3_2_SHIFT | ++ prev_wbal.wb_coefmatrix[3][3] << ISPPRV_WBSEL_N3_3_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_WBSEL); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_whitebalance2); ++ ++/** ++ * isppreview_config_blkadj - Configures the Black Adjustment parameters. ++ * @prev_blkadj: Structure containing the black adjustment towards red, green, ++ * blue. ++ **/ ++void isppreview_config_blkadj(struct ispprev_blkadj prev_blkadj) ++{ ++ isp_reg_writel(prev_blkadj.blue | ++ (prev_blkadj.green << ISPPRV_BLKADJOFF_G_SHIFT) | ++ (prev_blkadj.red << ISPPRV_BLKADJOFF_R_SHIFT), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_BLKADJOFF); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_blkadj); ++ ++/** ++ * isppreview_config_rgb_blending - Configures the RGB-RGB Blending matrix. ++ * @rgb2rgb: Structure containing the rgb to rgb blending matrix and the rgb ++ * offset. ++ **/ ++void isppreview_config_rgb_blending(struct ispprev_rgbtorgb rgb2rgb) ++{ ++ u32 val = 0; ++ ++ val = (rgb2rgb.matrix[0][0] & 0xfff) << ISPPRV_RGB_MAT1_MTX_RR_SHIFT; ++ val |= (rgb2rgb.matrix[0][1] & 0xfff) << ISPPRV_RGB_MAT1_MTX_GR_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT1); ++ ++ val = (rgb2rgb.matrix[0][2] & 0xfff) << ISPPRV_RGB_MAT2_MTX_BR_SHIFT; ++ val |= (rgb2rgb.matrix[1][0] & 0xfff) << ISPPRV_RGB_MAT2_MTX_RG_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT2); ++ ++ val = (rgb2rgb.matrix[1][1] & 0xfff) << ISPPRV_RGB_MAT3_MTX_GG_SHIFT; ++ val |= (rgb2rgb.matrix[1][2] & 0xfff) << ISPPRV_RGB_MAT3_MTX_BG_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT3); ++ ++ val = (rgb2rgb.matrix[2][0] & 0xfff) << ISPPRV_RGB_MAT4_MTX_RB_SHIFT; ++ val |= (rgb2rgb.matrix[2][1] & 0xfff) << ISPPRV_RGB_MAT4_MTX_GB_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT4); ++ ++ val = (rgb2rgb.matrix[2][2] & 0xfff) << ISPPRV_RGB_MAT5_MTX_BB_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT5); ++ ++ val = (rgb2rgb.offset[0] & 0x3ff) << ISPPRV_RGB_OFF1_MTX_OFFG_SHIFT; ++ val |= (rgb2rgb.offset[1] & 0x3ff) << ISPPRV_RGB_OFF1_MTX_OFFR_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF1); ++ ++ val = (rgb2rgb.offset[2] & 0x3ff) << ISPPRV_RGB_OFF2_MTX_OFFB_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF2); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_rgb_blending); ++ ++/** ++ * Configures the RGB-YCbYCr conversion matrix ++ * @prev_csc: Structure containing the RGB to YCbYCr matrix and the ++ * YCbCr offset. ++ **/ ++void isppreview_config_rgb_to_ycbcr(struct ispprev_csc prev_csc) ++{ ++ u32 val = 0; ++ ++ val = (prev_csc.matrix[0][0] & 0x3ff) << ISPPRV_CSC0_RY_SHIFT; ++ val |= (prev_csc.matrix[0][1] & 0x3ff) << ISPPRV_CSC0_GY_SHIFT; ++ val |= (prev_csc.matrix[0][2] & 0x3ff) << ISPPRV_CSC0_BY_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC0); ++ ++ val = (prev_csc.matrix[1][0] & 0x3ff) << ISPPRV_CSC1_RCB_SHIFT; ++ val |= (prev_csc.matrix[1][1] & 0x3ff) << ISPPRV_CSC1_GCB_SHIFT; ++ val |= (prev_csc.matrix[1][2] & 0x3ff) << ISPPRV_CSC1_BCB_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC1); ++ ++ val = (prev_csc.matrix[2][0] & 0x3ff) << ISPPRV_CSC2_RCR_SHIFT; ++ val |= (prev_csc.matrix[2][1] & 0x3ff) << ISPPRV_CSC2_GCR_SHIFT; ++ val |= (prev_csc.matrix[2][2] & 0x3ff) << ISPPRV_CSC2_BCR_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC2); ++ ++ val = (prev_csc.offset[0] & 0xff) << ISPPRV_CSC_OFFSET_CR_SHIFT; ++ val |= (prev_csc.offset[1] & 0xff) << ISPPRV_CSC_OFFSET_CB_SHIFT; ++ val |= (prev_csc.offset[2] & 0xff) << ISPPRV_CSC_OFFSET_Y_SHIFT; ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC_OFFSET); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_rgb_to_ycbcr); ++ ++/** ++ * isppreview_query_contrast - Query the contrast. ++ * @contrast: Pointer to hold the current programmed contrast value. ++ **/ ++void isppreview_query_contrast(u8 *contrast) ++{ ++ u32 brt_cnt_val = 0; ++ ++ brt_cnt_val = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++ *contrast = (brt_cnt_val >> ISPPRV_CNT_BRT_CNT_SHIFT) & 0xff; ++ DPRINTK_ISPPREV(" Current brt cnt value in hw is %x\n", brt_cnt_val); ++} ++EXPORT_SYMBOL_GPL(isppreview_query_contrast); ++ ++/** ++ * isppreview_update_contrast - Updates the contrast. ++ * @contrast: Pointer to hold the current programmed contrast value. ++ * ++ * Value should be programmed before enabling the module. ++ **/ ++void isppreview_update_contrast(u8 *contrast) ++{ ++ ispprev_obj.contrast = *contrast; ++} ++EXPORT_SYMBOL_GPL(isppreview_update_contrast); ++ ++/** ++ * isppreview_config_contrast - Configures the Contrast. ++ * @contrast: 8 bit value in U8Q4 format. ++ * ++ * Value should be programmed before enabling the module. ++ **/ ++void isppreview_config_contrast(u8 contrast) ++{ ++ u32 brt_cnt_val = 0; ++ ++ brt_cnt_val = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++ brt_cnt_val &= ~(0xff << ISPPRV_CNT_BRT_CNT_SHIFT); ++ contrast &= 0xff; ++ isp_reg_writel(brt_cnt_val | contrast << ISPPRV_CNT_BRT_CNT_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_contrast); ++ ++/** ++ * isppreview_get_contrast_range - Gets the range contrast value. ++ * @min_contrast: Pointer to hold the minimum Contrast value. ++ * @max_contrast: Pointer to hold the maximum Contrast value. ++ **/ ++void isppreview_get_contrast_range(u8 *min_contrast, u8 *max_contrast) ++{ ++ *min_contrast = ISPPRV_CONTRAST_MIN; ++ *max_contrast = ISPPRV_CONTRAST_MAX; ++} ++EXPORT_SYMBOL_GPL(isppreview_get_contrast_range); ++ ++/** ++ * isppreview_update_brightness - Updates the brightness in preview module. ++ * @brightness: Pointer to hold the current programmed brightness value. ++ * ++ **/ ++void isppreview_update_brightness(u8 *brightness) ++{ ++ ispprev_obj.brightness = *brightness; ++} ++EXPORT_SYMBOL_GPL(isppreview_update_brightness); ++ ++/** ++ * isppreview_config_brightness - Configures the brightness. ++ * @contrast: 8bitvalue in U8Q0 format. ++ **/ ++void isppreview_config_brightness(u8 brightness) ++{ ++ u32 brt_cnt_val = 0; ++ ++ DPRINTK_ISPPREV("\tConfiguring brightness in ISP: %d\n", brightness); ++ brt_cnt_val = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++ brt_cnt_val &= ~(0xff << ISPPRV_CNT_BRT_BRT_SHIFT); ++ brightness &= 0xff; ++ isp_reg_writel(brt_cnt_val | brightness << ISPPRV_CNT_BRT_BRT_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_brightness); ++ ++/** ++ * isppreview_query_brightness - Query the brightness. ++ * @brightness: Pointer to hold the current programmed brightness value. ++ **/ ++void isppreview_query_brightness(u8 *brightness) ++{ ++ *brightness = isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL_GPL(isppreview_query_brightness); ++ ++/** ++ * isppreview_get_brightness_range - Gets the range brightness value ++ * @min_brightness: Pointer to hold the minimum brightness value ++ * @max_brightness: Pointer to hold the maximum brightness value ++ **/ ++void isppreview_get_brightness_range(u8 *min_brightness, u8 *max_brightness) ++{ ++ *min_brightness = ISPPRV_BRIGHT_MIN; ++ *max_brightness = ISPPRV_BRIGHT_MAX; ++} ++EXPORT_SYMBOL_GPL(isppreview_get_brightness_range); ++ ++/** ++ * isppreview_set_color - Sets the color effect. ++ * @mode: Indicates the required color effect. ++ **/ ++void isppreview_set_color(u8 *mode) ++{ ++ ispprev_obj.color = *mode; ++ update_color_matrix = 1; ++} ++EXPORT_SYMBOL_GPL(isppreview_set_color); ++ ++/** ++ * isppreview_get_color - Gets the current color effect. ++ * @mode: Indicates the current color effect. ++ **/ ++void isppreview_get_color(u8 *mode) ++{ ++ *mode = ispprev_obj.color; ++} ++EXPORT_SYMBOL_GPL(isppreview_get_color); ++ ++/** ++ * isppreview_config_yc_range - Configures the max and min Y and C values. ++ * @yclimit: Structure containing the range of Y and C values. ++ **/ ++void isppreview_config_yc_range(struct ispprev_yclimit yclimit) ++{ ++ isp_reg_writel(yclimit.maxC << ISPPRV_SETUP_YC_MAXC_SHIFT | ++ yclimit.maxY << ISPPRV_SETUP_YC_MAXY_SHIFT | ++ yclimit.minC << ISPPRV_SETUP_YC_MINC_SHIFT | ++ yclimit.minY << ISPPRV_SETUP_YC_MINY_SHIFT, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_SETUP_YC); ++} ++EXPORT_SYMBOL_GPL(isppreview_config_yc_range); ++ ++/** ++ * isppreview_try_size - Calculates output dimensions with the modules enabled. ++ * @input_w: input width for the preview in number of pixels per line ++ * @input_h: input height for the preview in number of lines ++ * @output_w: output width from the preview in number of pixels per line ++ * @output_h: output height for the preview in number of lines ++ * ++ * Calculates the number of pixels cropped in the submodules that are enabled, ++ * Fills up the output width height variables in the isp_prev structure. ++ **/ ++int isppreview_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h) ++{ ++ u32 prevout_w = input_w; ++ u32 prevout_h = input_h; ++ u32 div = 0; ++ int max_out; ++ ++ ispprev_obj.previn_w = input_w; ++ ispprev_obj.previn_h = input_h; ++ ++ if (input_w < 32 || input_h < 32) { ++ printk(KERN_ERR "ISP_ERR : preview does not support " ++ "width < 16 or height < 32 \n"); ++ return -EINVAL; ++ } ++ if (omap_rev() == OMAP3430_REV_ES1_0) ++ max_out = ISPPRV_MAXOUTPUT_WIDTH; ++ else ++ max_out = ISPPRV_MAXOUTPUT_WIDTH_ES2; ++ ++ ispprev_obj.fmtavg = 0; ++ ++ if (input_w > max_out) { ++ div = (input_w/max_out); ++ if (div >= 2 && div < 4) { ++ ispprev_obj.fmtavg = 1; ++ prevout_w /= 2; ++ } else if (div >= 4 && div < 8) { ++ ispprev_obj.fmtavg = 2; ++ prevout_w /= 4; ++ } else if (div >= 8) { ++ ispprev_obj.fmtavg = 3; ++ prevout_w /= 8; ++ } ++ } ++ ++ if (ispprev_obj.hmed_en) ++ prevout_w -= 4; ++ if (ispprev_obj.nf_en) { ++ prevout_w -= 4; ++ prevout_h -= 4; ++ } ++ if (ispprev_obj.cfa_en) { ++ switch (ispprev_obj.cfafmt) { ++ case CFAFMT_BAYER: ++ case CFAFMT_SONYVGA: ++ prevout_w -= 4; ++ prevout_h -= 4; ++ break; ++ case CFAFMT_RGBFOVEON: ++ case CFAFMT_RRGGBBFOVEON: ++ case CFAFMT_DNSPL: ++ case CFAFMT_HONEYCOMB: ++ prevout_h -= 2; ++ break; ++ }; ++ } ++ if (ispprev_obj.yenh_en || ispprev_obj.csup_en) ++ prevout_w -= 2; ++ ++ /* Start at the correct row/column by skipping ++ * a Sensor specific amount. ++ */ ++ prevout_w -= ispprev_obj.sph; ++ prevout_h -= ispprev_obj.slv; ++ ++ ++ if (prevout_w % 2) ++ prevout_w -= 1; ++ ++ if (ispprev_obj.prev_outfmt == PREVIEW_MEM) { ++ if (((prevout_w * 2) & ISP_32B_BOUNDARY_OFFSET) != ++ (prevout_w * 2)) { ++ prevout_w = ((prevout_w * 2) & ++ ISP_32B_BOUNDARY_OFFSET) / 2; ++ } ++ } ++ *output_w = prevout_w; ++ ispprev_obj.prevout_w = prevout_w; ++ *output_h = prevout_h; ++ ispprev_obj.prevout_h = prevout_h; ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_try_size); ++ ++/** ++ * isppreview_config_size - Sets the size of ISP preview output. ++ * @input_w: input width for the preview in number of pixels per line ++ * @input_h: input height for the preview in number of lines ++ * @output_w: output width from the preview in number of pixels per line ++ * @output_h: output height for the preview in number of lines ++ * ++ * Configures the appropriate values stored in the isp_prev structure to ++ * HORZ/VERT_INFO. Configures PRV_AVE if needed for downsampling as calculated ++ * in trysize. ++ **/ ++int isppreview_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) ++{ ++ u32 prevsdroff; ++ ++ if ((output_w != ispprev_obj.prevout_w) || ++ (output_h != ispprev_obj.prevout_h)) { ++ printk(KERN_ERR "ISP_ERR : isppreview_try_size should " ++ "be called before config size\n"); ++ return -EINVAL; ++ } ++ ++ isp_reg_writel((ispprev_obj.sph << ISPPRV_HORZ_INFO_SPH_SHIFT) | ++ (ispprev_obj.previn_w - 1), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_HORZ_INFO); ++ isp_reg_writel((ispprev_obj.slv << ISPPRV_VERT_INFO_SLV_SHIFT) | ++ (ispprev_obj.previn_h - 2), ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_VERT_INFO); ++ ++ if (ispprev_obj.cfafmt == CFAFMT_BAYER) ++ isp_reg_writel(ISPPRV_AVE_EVENDIST_2 << ++ ISPPRV_AVE_EVENDIST_SHIFT | ++ ISPPRV_AVE_ODDDIST_2 << ++ ISPPRV_AVE_ODDDIST_SHIFT | ++ ispprev_obj.fmtavg, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE); ++ ++ if (ispprev_obj.prev_outfmt == PREVIEW_MEM) { ++ prevsdroff = ispprev_obj.prevout_w * 2; ++ if ((prevsdroff & ISP_32B_BOUNDARY_OFFSET) != prevsdroff) { ++ DPRINTK_ISPPREV("ISP_WARN: Preview output buffer line" ++ " size is truncated" ++ " to 32byte boundary\n"); ++ prevsdroff &= ISP_32B_BOUNDARY_BUF ; ++ } ++ isppreview_config_outlineoffset(prevsdroff); ++ } ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_config_size); ++ ++/** ++ * isppreview_config_inlineoffset - Configures the Read address line offset. ++ * @offset: Line Offset for the input image. ++ **/ ++int isppreview_config_inlineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) { ++ isp_reg_writel(offset & 0xffff, ++ OMAP3_ISP_IOMEM_PREV, ISPPRV_RADR_OFFSET); ++ } else { ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_config_inlineoffset); ++ ++/** ++ * isppreview_set_inaddr - Sets memory address of input frame. ++ * @addr: 32bit memory address aligned on 32byte boundary. ++ * ++ * Configures the memory address from which the input frame is to be read. ++ **/ ++int isppreview_set_inaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) ++ isp_reg_writel(addr, OMAP3_ISP_IOMEM_PREV, ISPPRV_RSDR_ADDR); ++ else { ++ printk(KERN_ERR "ISP_ERR: Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_set_inaddr); ++ ++/** ++ * isppreview_config_outlineoffset - Configures the Write address line offset. ++ * @offset: Line Offset for the preview output. ++ **/ ++int isppreview_config_outlineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) != offset) { ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(offset & 0xffff, OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_WADD_OFFSET); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_config_outlineoffset); ++ ++/** ++ * isppreview_set_outaddr - Sets the memory address to store output frame ++ * @addr: 32bit memory address aligned on 32byte boundary. ++ * ++ * Configures the memory address to which the output frame is written. ++ **/ ++int isppreview_set_outaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) != addr) { ++ printk(KERN_ERR "ISP_ERR: Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(addr, OMAP3_ISP_IOMEM_PREV, ISPPRV_WSDR_ADDR); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_set_outaddr); ++ ++/** ++ * isppreview_config_darklineoffset - Sets the Dark frame address line offset. ++ * @offset: Line Offset for the Darkframe. ++ **/ ++int isppreview_config_darklineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) != offset) { ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(offset & 0xffff, OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_DRKF_OFFSET); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_config_darklineoffset); ++ ++/** ++ * isppreview_set_darkaddr - Sets the memory address to store Dark frame. ++ * @addr: 32bit memory address aligned on 32 bit boundary. ++ **/ ++int isppreview_set_darkaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) != addr) { ++ printk(KERN_ERR "ISP_ERR : Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(addr, OMAP3_ISP_IOMEM_PREV, ISPPRV_DSDR_ADDR); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(isppreview_set_darkaddr); ++ ++void __isppreview_enable(int enable) ++{ ++ if (enable) ++ isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_EN); ++ else ++ isp_reg_and(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ~ISPPRV_PCR_EN); ++} ++ ++/** ++ * isppreview_enable - Enables the Preview module. ++ * @enable: 1 - Enables the preview module. ++ * ++ * Client should configure all the sub modules in Preview before this. ++ **/ ++void isppreview_enable(int enable) ++{ ++ __isppreview_enable(enable); ++ ispprev_obj.pm_state = enable; ++} ++EXPORT_SYMBOL_GPL(isppreview_enable); ++ ++/** ++ * isppreview_suspend - Suspend Preview module. ++ **/ ++void isppreview_suspend(void) ++{ ++ if (ispprev_obj.pm_state) ++ __isppreview_enable(0); ++} ++EXPORT_SYMBOL_GPL(isppreview_suspend); ++ ++/** ++ * isppreview_resume - Resume Preview module. ++ **/ ++void isppreview_resume(void) ++{ ++ if (ispprev_obj.pm_state) ++ __isppreview_enable(1); ++} ++EXPORT_SYMBOL_GPL(isppreview_resume); ++ ++ ++/** ++ * isppreview_busy - Gets busy state of preview module. ++ **/ ++int isppreview_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR) & ++ ISPPRV_PCR_BUSY; ++} ++EXPORT_SYMBOL_GPL(isppreview_busy); ++ ++/** ++ * isppreview_get_config - Gets parameters of preview module. ++ **/ ++struct prev_params *isppreview_get_config(void) ++{ ++ return prev_config_params; ++} ++EXPORT_SYMBOL_GPL(isppreview_get_config); ++ ++/** ++ * isppreview_save_context - Saves the values of the preview module registers. ++ **/ ++void isppreview_save_context(void) ++{ ++ DPRINTK_ISPPREV("Saving context\n"); ++ isp_save_context(ispprev_reg_list); ++} ++EXPORT_SYMBOL_GPL(isppreview_save_context); ++ ++/** ++ * isppreview_restore_context - Restores the values of preview module registers ++ **/ ++void isppreview_restore_context(void) ++{ ++ DPRINTK_ISPPREV("Restoring context\n"); ++ isp_restore_context(ispprev_reg_list); ++} ++EXPORT_SYMBOL_GPL(isppreview_restore_context); ++ ++/** ++ * isppreview_print_status - Prints the values of the Preview Module registers. ++ * ++ * Also prints other debug information stored in the preview moduel. ++ **/ ++void isppreview_print_status(void) ++{ ++ DPRINTK_ISPPREV("Module in use =%d\n", ispprev_obj.prev_inuse); ++ DPRINTK_ISPPREV("Preview Input format =%d, Output Format =%d\n", ++ ispprev_obj.prev_inpfmt, ++ ispprev_obj.prev_outfmt); ++ DPRINTK_ISPPREV("Accepted Preview Input (width = %d,Height = %d)\n", ++ ispprev_obj.previn_w, ++ ispprev_obj.previn_h); ++ DPRINTK_ISPPREV("Accepted Preview Output (width = %d,Height = %d)\n", ++ ispprev_obj.prevout_w, ++ ispprev_obj.prevout_h); ++ DPRINTK_ISPPREV("###ISP_CTRL in preview =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ DPRINTK_ISPPREV("###ISP_IRQ0ENABLE in preview =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE)); ++ DPRINTK_ISPPREV("###ISP_IRQ0STATUS in preview =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS)); ++ DPRINTK_ISPPREV("###PRV PCR =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR)); ++ DPRINTK_ISPPREV("###PRV HORZ_INFO =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_HORZ_INFO)); ++ DPRINTK_ISPPREV("###PRV VERT_INFO =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_VERT_INFO)); ++ DPRINTK_ISPPREV("###PRV WSDR_ADDR =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_WSDR_ADDR)); ++ DPRINTK_ISPPREV("###PRV WADD_OFFSET =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_WADD_OFFSET)); ++ DPRINTK_ISPPREV("###PRV AVE =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE)); ++ DPRINTK_ISPPREV("###PRV HMED =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_HMED)); ++ DPRINTK_ISPPREV("###PRV NF =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_NF)); ++ DPRINTK_ISPPREV("###PRV WB_DGAIN =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_WB_DGAIN)); ++ DPRINTK_ISPPREV("###PRV WBGAIN =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_WBGAIN)); ++ DPRINTK_ISPPREV("###PRV WBSEL =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_WBSEL)); ++ DPRINTK_ISPPREV("###PRV CFA =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA)); ++ DPRINTK_ISPPREV("###PRV BLKADJOFF =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_BLKADJOFF)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT1 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT1)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT2 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT2)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT3 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT3)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT4 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT4)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT5 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_MAT5)); ++ DPRINTK_ISPPREV("###PRV RGB_OFF1 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF1)); ++ DPRINTK_ISPPREV("###PRV RGB_OFF2 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_RGB_OFF2)); ++ DPRINTK_ISPPREV("###PRV CSC0 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC0)); ++ DPRINTK_ISPPREV("###PRV CSC1 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC1)); ++ DPRINTK_ISPPREV("###PRV CSC2 =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC2)); ++ DPRINTK_ISPPREV("###PRV CSC_OFFSET =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CSC_OFFSET)); ++ DPRINTK_ISPPREV("###PRV CNT_BRT =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT)); ++ DPRINTK_ISPPREV("###PRV CSUP =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_CSUP)); ++ DPRINTK_ISPPREV("###PRV SETUP_YC =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_SETUP_YC)); ++} ++EXPORT_SYMBOL_GPL(isppreview_print_status); ++ ++/** ++ * isp_preview_init - Module Initialization. ++ **/ ++int __init isp_preview_init(void) ++{ ++ int i = 0; ++ ++ prev_config_params = kmalloc(sizeof(*prev_config_params), GFP_KERNEL); ++ if (!prev_config_params) { ++ printk(KERN_ERR "Can't get memory for isp_preview params!\n"); ++ return -ENOMEM; ++ } ++ params = prev_config_params; ++ ++ ispprev_obj.prev_inuse = 0; ++ mutex_init(&ispprev_obj.ispprev_mutex); ++ ++ /* Init values */ ++ ispprev_obj.sph = 2; ++ ispprev_obj.slv = 0; ++ ispprev_obj.color = V4L2_COLORFX_NONE; ++ ispprev_obj.contrast = ISPPRV_CONTRAST_DEF; ++ params->contrast = ISPPRV_CONTRAST_DEF; ++ ispprev_obj.brightness = ISPPRV_BRIGHT_DEF; ++ params->brightness = ISPPRV_BRIGHT_DEF; ++ params->average = NO_AVE; ++ params->lens_shading_shift = 0; ++ params->pix_fmt = YCPOS_YCrYCb; ++ params->cfa.cfafmt = CFAFMT_BAYER; ++ params->cfa.cfa_table = cfa_coef_table; ++ params->cfa.cfa_gradthrs_horz = FLR_CFA_GRADTHRS_HORZ; ++ params->cfa.cfa_gradthrs_vert = FLR_CFA_GRADTHRS_VERT; ++ params->csup.gain = FLR_CSUP_GAIN; ++ params->csup.thres = FLR_CSUP_THRES; ++ params->csup.hypf_en = 0; ++ params->ytable = luma_enhance_table; ++ params->nf.spread = FLR_NF_STRGTH; ++ memcpy(params->nf.table, noise_filter_table, sizeof(params->nf.table)); ++ params->dcor.couplet_mode_en = 1; ++ for (i = 0; i < 4; i++) ++ params->dcor.detect_correct[i] = 0xE; ++ params->gtable.bluetable = bluegamma_table; ++ params->gtable.greentable = greengamma_table; ++ params->gtable.redtable = redgamma_table; ++ params->wbal.dgain = FLR_WBAL_DGAIN; ++ if (omap_rev() > OMAP3430_REV_ES1_0) { ++ params->wbal.coef0 = FLR_WBAL_COEF0_ES1; ++ params->wbal.coef1 = FLR_WBAL_COEF1_ES1; ++ params->wbal.coef2 = FLR_WBAL_COEF2_ES1; ++ params->wbal.coef3 = FLR_WBAL_COEF3_ES1; ++ } else { ++ params->wbal.coef0 = FLR_WBAL_COEF0; ++ params->wbal.coef1 = FLR_WBAL_COEF1; ++ params->wbal.coef2 = FLR_WBAL_COEF2; ++ params->wbal.coef3 = FLR_WBAL_COEF3; ++ } ++ params->blk_adj.red = FLR_BLKADJ_RED; ++ params->blk_adj.green = FLR_BLKADJ_GREEN; ++ params->blk_adj.blue = FLR_BLKADJ_BLUE; ++ params->rgb2rgb = flr_rgb2rgb; ++ params->rgb2ycbcr = flr_prev_csc[ispprev_obj.color]; ++ ++ params->features = PREV_CFA | PREV_DEFECT_COR | PREV_NOISE_FILTER; ++ params->features &= ~(PREV_AVERAGER | PREV_INVERSE_ALAW | ++ PREV_HORZ_MEDIAN_FILTER | ++ PREV_GAMMA_BYPASS | ++ PREV_DARK_FRAME_SUBTRACT | ++ PREV_LENS_SHADING | ++ PREV_DARK_FRAME_CAPTURE | ++ PREV_CHROMA_SUPPRESS | ++ PREV_LUMA_ENHANCE); ++ return 0; ++} ++ ++/** ++ * isp_preview_cleanup - Module Cleanup. ++ **/ ++void isp_preview_cleanup(void) ++{ ++ kfree(prev_config_params); ++} +diff --git a/drivers/media/video/isp/isppreview.h b/drivers/media/video/isp/isppreview.h +new file mode 100644 +index 0000000..e88c329 +--- /dev/null ++++ b/drivers/media/video/isp/isppreview.h +@@ -0,0 +1,354 @@ ++/* ++ * isppreview.h ++ * ++ * Driver header file for Preview module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Senthilvadivu Guruswamy ++ * Pallavi Kulkarni ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_PREVIEW_H ++#define OMAP_ISP_PREVIEW_H ++ ++#include ++/* Isp query control structure */ ++ ++#define ISPPRV_BRIGHT_STEP 0x1 ++#define ISPPRV_BRIGHT_DEF 0x0 ++#define ISPPRV_BRIGHT_LOW 0x0 ++#define ISPPRV_BRIGHT_HIGH 0xF ++#define ISPPRV_BRIGHT_UNITS 0x7 ++ ++#define ISPPRV_CONTRAST_STEP 0x1 ++#define ISPPRV_CONTRAST_DEF 0x4 ++#define ISPPRV_CONTRAST_LOW 0x0 ++#define ISPPRV_CONTRAST_HIGH 0xF ++#define ISPPRV_CONTRAST_UNITS 0x4 ++ ++#define NO_AVE 0x0 ++#define AVE_2_PIX 0x1 ++#define AVE_4_PIX 0x2 ++#define AVE_8_PIX 0x3 ++#define AVE_ODD_PIXEL_DIST (1 << 4) /* For Bayer Sensors */ ++#define AVE_EVEN_PIXEL_DIST (1 << 2) ++ ++#define WB_GAIN_MAX 4 ++ ++/* Features list */ ++#define PREV_AVERAGER (1 << 0) ++#define PREV_INVERSE_ALAW (1 << 1) ++#define PREV_HORZ_MEDIAN_FILTER (1 << 2) ++#define PREV_NOISE_FILTER (1 << 3) ++#define PREV_CFA (1 << 4) ++#define PREV_GAMMA_BYPASS (1 << 5) ++#define PREV_LUMA_ENHANCE (1 << 6) ++#define PREV_CHROMA_SUPPRESS (1 << 7) ++#define PREV_DARK_FRAME_SUBTRACT (1 << 8) ++#define PREV_LENS_SHADING (1 << 9) ++#define PREV_DARK_FRAME_CAPTURE (1 << 10) ++#define PREV_DEFECT_COR (1 << 11) ++ ++ ++#define ISP_NF_TABLE_SIZE (1 << 10) ++ ++#define ISP_GAMMA_TABLE_SIZE (1 << 10) ++ ++/* Table addresses */ ++#define ISPPRV_TBL_ADDR_RED_G_START 0x00 ++#define ISPPRV_TBL_ADDR_BLUE_G_START 0x800 ++#define ISPPRV_TBL_ADDR_GREEN_G_START 0x400 ++ ++/* ++ *Enumeration Constants for input and output format ++ */ ++enum preview_input { ++ PRV_RAW_CCDC, ++ PRV_RAW_MEM, ++ PRV_RGBBAYERCFA, ++ PRV_COMPCFA, ++ PRV_CCDC_DRKF, ++ PRV_OTHERS ++}; ++enum preview_output { ++ PREVIEW_RSZ, ++ PREVIEW_MEM ++}; ++/* ++ * Configure byte layout of YUV image ++ */ ++enum preview_ycpos_mode { ++ YCPOS_YCrYCb = 0, ++ YCPOS_YCbYCr = 1, ++ YCPOS_CbYCrY = 2, ++ YCPOS_CrYCbY = 3 ++}; ++ ++/** ++ * struct ispprev_gtable - Structure for Gamma Correction. ++ * @redtable: Pointer to the red gamma table. ++ * @greentable: Pointer to the green gamma table. ++ * @bluetable: Pointer to the blue gamma table. ++ */ ++struct ispprev_gtable { ++ u32 *redtable; ++ u32 *greentable; ++ u32 *bluetable; ++}; ++ ++/** ++ * struct prev_white_balance - Structure for White Balance 2. ++ * @wb_dgain: White balance common gain. ++ * @wb_gain: Individual color gains. ++ * @wb_coefmatrix: Coefficient matrix ++ */ ++struct prev_white_balance { ++ u16 wb_dgain; /* white balance common gain */ ++ u8 wb_gain[WB_GAIN_MAX]; /* individual color gains */ ++ u8 wb_coefmatrix[WB_GAIN_MAX][WB_GAIN_MAX]; ++}; ++ ++/** ++ * struct prev_size_params - Structure for size parameters. ++ * @hstart: Starting pixel. ++ * @vstart: Starting line. ++ * @hsize: Width of input image. ++ * @vsize: Height of input image. ++ * @pixsize: Pixel size of the image in terms of bits. ++ * @in_pitch: Line offset of input image. ++ * @out_pitch: Line offset of output image. ++ */ ++struct prev_size_params { ++ unsigned int hstart; ++ unsigned int vstart; ++ unsigned int hsize; ++ unsigned int vsize; ++ unsigned char pixsize; ++ unsigned short in_pitch; ++ unsigned short out_pitch; ++}; ++ ++/** ++ * struct prev_rgb2ycbcr_coeffs - Structure RGB2YCbCr parameters. ++ * @coeff: Color conversion gains in 3x3 matrix. ++ * @offset: Color conversion offsets. ++ */ ++struct prev_rgb2ycbcr_coeffs { ++ short coeff[RGB_MAX][RGB_MAX]; ++ short offset[RGB_MAX]; ++}; ++ ++/** ++ * struct prev_darkfrm_params - Structure for Dark frame suppression. ++ * @addr: Memory start address. ++ * @offset: Line offset. ++ */ ++struct prev_darkfrm_params { ++ u32 addr; ++ u32 offset; ++ }; ++ ++/** ++ * struct prev_params - Structure for all configuration ++ * @features: Set of features enabled. ++ * @pix_fmt: Output pixel format. ++ * @cfa: CFA coefficients. ++ * @csup: Chroma suppression coefficients. ++ * @ytable: Pointer to Luma enhancement coefficients. ++ * @nf: Noise filter coefficients. ++ * @dcor: Noise filter coefficients. ++ * @gtable: Gamma coefficients. ++ * @wbal: White Balance parameters. ++ * @blk_adj: Black adjustment parameters. ++ * @rgb2rgb: RGB blending parameters. ++ * @rgb2ycbcr: RGB to ycbcr parameters. ++ * @hmf_params: Horizontal median filter. ++ * @size_params: Size parameters. ++ * @drkf_params: Darkframe parameters. ++ * @lens_shading_shift: ++ * @average: Downsampling rate for averager. ++ * @contrast: Contrast. ++ * @brightness: Brightness. ++ */ ++struct prev_params { ++ u16 features; ++ enum preview_ycpos_mode pix_fmt; ++ struct ispprev_cfa cfa; ++ struct ispprev_csup csup; ++ u32 *ytable; ++ struct ispprev_nf nf; ++ struct ispprev_dcor dcor; ++ struct ispprev_gtable gtable; ++ struct ispprev_wbal wbal; ++ struct ispprev_blkadj blk_adj; ++ struct ispprev_rgbtorgb rgb2rgb; ++ struct ispprev_csc rgb2ycbcr; ++ struct ispprev_hmed hmf_params; ++ struct prev_size_params size_params; ++ struct prev_darkfrm_params drkf_params; ++ u8 lens_shading_shift; ++ u8 average; ++ u8 contrast; ++ u8 brightness; ++}; ++ ++/** ++ * struct isptables_update - Structure for Table Configuration. ++ * @update: Specifies which tables should be updated. ++ * @flag: Specifies which tables should be enabled. ++ * @prev_nf: Pointer to structure for Noise Filter ++ * @lsc: Pointer to LSC gain table. (currently not used) ++ * @red_gamma: Pointer to red gamma correction table. ++ * @green_gamma: Pointer to green gamma correction table. ++ * @blue_gamma: Pointer to blue gamma correction table. ++ */ ++struct isptables_update { ++ u16 update; ++ u16 flag; ++ struct ispprev_nf *prev_nf; ++ u32 *lsc; ++ u32 *red_gamma; ++ u32 *green_gamma; ++ u32 *blue_gamma; ++}; ++ ++void isppreview_config_shadow_registers(void); ++ ++int isppreview_request(void); ++ ++int isppreview_free(void); ++ ++int isppreview_config_datapath(enum preview_input input, ++ enum preview_output output); ++ ++void isppreview_config_ycpos(enum preview_ycpos_mode mode); ++ ++void isppreview_config_averager(u8 average); ++ ++void isppreview_enable_invalaw(u8 enable); ++ ++void isppreview_enable_drkframe(u8 enable); ++ ++void isppreview_enable_shadcomp(u8 enable); ++ ++void isppreview_config_drkf_shadcomp(u8 scomp_shtval); ++ ++void isppreview_enable_gammabypass(u8 enable); ++ ++void isppreview_enable_hmed(u8 enable); ++ ++void isppreview_config_hmed(struct ispprev_hmed); ++ ++void isppreview_enable_noisefilter(u8 enable); ++ ++void isppreview_config_noisefilter(struct ispprev_nf prev_nf); ++ ++void isppreview_enable_dcor(u8 enable); ++ ++void isppreview_config_dcor(struct ispprev_dcor prev_dcor); ++ ++ ++void isppreview_config_cfa(struct ispprev_cfa); ++ ++void isppreview_config_gammacorrn(struct ispprev_gtable); ++ ++void isppreview_config_chroma_suppression(struct ispprev_csup csup); ++ ++void isppreview_enable_cfa(u8 enable); ++ ++void isppreview_config_luma_enhancement(u32 *ytable); ++ ++void isppreview_enable_luma_enhancement(u8 enable); ++ ++void isppreview_enable_chroma_suppression(u8 enable); ++ ++void isppreview_config_whitebalance(struct ispprev_wbal); ++ ++void isppreview_config_blkadj(struct ispprev_blkadj); ++ ++void isppreview_config_rgb_blending(struct ispprev_rgbtorgb); ++ ++void isppreview_config_rgb_to_ycbcr(struct ispprev_csc); ++ ++void isppreview_update_contrast(u8 *contrast); ++ ++void isppreview_query_contrast(u8 *contrast); ++ ++void isppreview_config_contrast(u8 contrast); ++ ++void isppreview_get_contrast_range(u8 *min_contrast, u8 *max_contrast); ++ ++void isppreview_update_brightness(u8 *brightness); ++ ++void isppreview_config_brightness(u8 brightness); ++ ++void isppreview_get_brightness_range(u8 *min_brightness, u8 *max_brightness); ++ ++void isppreview_set_color(u8 *mode); ++ ++void isppreview_get_color(u8 *mode); ++ ++void isppreview_query_brightness(u8 *brightness); ++ ++void isppreview_config_yc_range(struct ispprev_yclimit yclimit); ++ ++int isppreview_try_size(u32 input_w, u32 input_h, u32 *output_w, ++ u32 *output_h); ++ ++int isppreview_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h); ++ ++int isppreview_config_inlineoffset(u32 offset); ++ ++int isppreview_set_inaddr(u32 addr); ++ ++int isppreview_config_outlineoffset(u32 offset); ++ ++int isppreview_set_outaddr(u32 addr); ++ ++int isppreview_config_darklineoffset(u32 offset); ++ ++int isppreview_set_darkaddr(u32 addr); ++ ++void isppreview_enable(int enable); ++ ++void isppreview_suspend(void); ++ ++void isppreview_resume(void); ++ ++int isppreview_busy(void); ++ ++struct prev_params *isppreview_get_config(void); ++ ++void isppreview_print_status(void); ++ ++#ifndef CONFIG_ARCH_OMAP3410 ++void isppreview_save_context(void); ++#else ++static inline void isppreview_save_context(void) {} ++#endif ++ ++#ifndef CONFIG_ARCH_OMAP3410 ++void isppreview_restore_context(void); ++#else ++static inline void isppreview_restore_context(void) {} ++#endif ++ ++int omap34xx_isp_preview_config(void *userspace_add); ++ ++int omap34xx_isp_tables_update(struct isptables_update *isptables_struct); ++ ++void isppreview_set_skip(u32 h, u32 v); ++ ++#endif/* OMAP_ISP_PREVIEW_H */ +diff --git a/drivers/media/video/isp/ispresizer.c b/drivers/media/video/isp/ispresizer.c +new file mode 100644 +index 0000000..f78ddb3 +--- /dev/null ++++ b/drivers/media/video/isp/ispresizer.c +@@ -0,0 +1,928 @@ ++/* ++ * ispresizer.c ++ * ++ * Driver Library for Resizer module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C)2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sameer Venkatraman ++ * Mohit Jalori ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispresizer.h" ++ ++/* Default configuration of resizer,filter coefficients,yenh for camera isp */ ++static struct isprsz_yenh ispreszdefaultyenh = {0, 0, 0, 0}; ++static struct isprsz_coef ispreszdefcoef = { ++ { ++ 0x0027, 0x00B2, 0x00B2, 0x0027, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ 0x0027, 0x00B2, 0x0027, 0x00B2, ++ }, ++ { ++ 0x0000, 0x0100, 0x0000, 0x0000, ++ 0x03FA, 0x00F6, 0x0010, 0x0000, ++ 0x03F9, 0x00DB, 0x002C, 0x0000, ++ 0x03FB, 0x00B3, 0x0053, 0x03FF, ++ 0x03FD, 0x0082, 0x0084, 0x03FD, ++ 0x03FF, 0x0053, 0x00B3, 0x03FB, ++ 0x0000, 0x002C, 0x00DB, 0x03F9, ++ 0x0000, 0x0010, 0x00F6, 0x03FA ++ }, ++ { ++ 0x0004, 0x0023, 0x0023, 0x005A, ++ 0x005A, 0x0058, 0x0058, 0x0004, ++ 0x0023, 0x0023, 0x005A, 0x005A, ++ 0x0058, 0x0058, 0x0004, 0x0023, ++ 0x0023, 0x005A, 0x005A, 0x0058, ++ 0x0058, 0x0004, 0x0023, 0x0023, ++ 0x005A, 0x005A, 0x0058, 0x0058 ++ }, ++ { ++ 0x0004, 0x0023, 0x005A, 0x0058, ++ 0x0023, 0x0004, 0x0000, 0x0002, ++ 0x0018, 0x004d, 0x0060, 0x0031, ++ 0x0008, 0x0000, 0x0001, 0x000f, ++ 0x003f, 0x0062, 0x003f, 0x000f, ++ 0x0001, 0x0000, 0x0008, 0x0031, ++ 0x0060, 0x004d, 0x0018, 0x0002 ++ } ++}; ++ ++/** ++ * struct isp_res - Structure for the resizer module to store its information. ++ * @res_inuse: Indicates if resizer module has been reserved. 1 - Reserved, ++ * 0 - Freed. ++ * @h_startphase: Horizontal starting phase. ++ * @v_startphase: Vertical starting phase. ++ * @h_resz: Horizontal resizing value. ++ * @v_resz: Vertical resizing value. ++ * @outputwidth: Output Image Width in pixels. ++ * @outputheight: Output Image Height in pixels. ++ * @inputwidth: Input Image Width in pixels. ++ * @inputheight: Input Image Height in pixels. ++ * @algo: Algorithm select. 0 - Disable, 1 - [-1 2 -1]/2 high-pass filter, ++ * 2 - [-1 -2 6 -2 -1]/4 high-pass filter. ++ * @ipht_crop: Vertical start line for cropping. ++ * @ipwd_crop: Horizontal start pixel for cropping. ++ * @cropwidth: Crop Width. ++ * @cropheight: Crop Height. ++ * @resinput: Resizer input. ++ * @coeflist: Register configuration for Resizer. ++ * @ispres_mutex: Mutex for isp resizer. ++ */ ++static struct isp_res { ++ int pm_state; ++ u8 res_inuse; ++ u8 h_startphase; ++ u8 v_startphase; ++ u16 h_resz; ++ u16 v_resz; ++ u32 outputwidth; ++ u32 outputheight; ++ u32 inputwidth; ++ u32 inputheight; ++ u8 algo; ++ u32 ipht_crop; ++ u32 ipwd_crop; ++ u32 cropwidth; ++ u32 cropheight; ++ dma_addr_t tmp_buf; ++ enum ispresizer_input resinput; ++ struct isprsz_coef coeflist; ++ struct mutex ispres_mutex; /* For checking/modifying res_inuse */ ++} ispres_obj; ++ ++/* Structure for saving/restoring resizer module registers */ ++static struct isp_reg isprsz_reg_list[] = { ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_SIZE, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INOFF, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTADD, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTOFF, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT32, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT54, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT76, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT98, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT1110, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT1312, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT1514, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT1716, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT1918, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT2120, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT2322, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT2524, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT2726, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT2928, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT3130, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT32, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT54, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT76, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT98, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT1110, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT1312, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT1514, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT1716, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT1918, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT2120, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT2322, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT2524, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT2726, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT2928, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT3130, 0x0000}, ++ {OMAP3_ISP_IOMEM_RESZ, ISPRSZ_YENH, 0x0000}, ++ {0, ISP_TOK_TERM, 0x0000} ++}; ++ ++/** ++ * ispresizer_config_shadow_registers - Configure shadow registers. ++ **/ ++void ispresizer_config_shadow_registers() ++{ ++ return; ++} ++EXPORT_SYMBOL(ispresizer_config_shadow_registers); ++ ++/** ++ * ispresizer_trycrop - Validate crop dimensions. ++ * @left: Left distance to start position of crop. ++ * @top: Top distance to start position of crop. ++ * @width: Width of input image. ++ * @height: Height of input image. ++ * @ow: Width of output image. ++ * @oh: Height of output image. ++ **/ ++void ispresizer_trycrop(u32 left, u32 top, u32 width, u32 height, u32 ow, ++ u32 oh) ++{ ++ ispres_obj.cropwidth = width + 6; ++ ispres_obj.cropheight = height + 6; ++ ispresizer_try_size(&ispres_obj.cropwidth, &ispres_obj.cropheight, &ow, ++ &oh); ++ ispres_obj.ipht_crop = top; ++ ispres_obj.ipwd_crop = left; ++} ++EXPORT_SYMBOL(ispresizer_trycrop); ++ ++/** ++ * ispresizer_applycrop - Apply crop to input image. ++ **/ ++void ispresizer_applycrop(void) ++{ ++ ispresizer_config_size(ispres_obj.cropwidth, ispres_obj.cropheight, ++ ispres_obj.outputwidth, ++ ispres_obj.outputheight); ++ return; ++} ++EXPORT_SYMBOL(ispresizer_applycrop); ++ ++/** ++ * ispresizer_request - Reserves the Resizer module. ++ * ++ * Allows only one user at a time. ++ * ++ * Returns 0 if successful, or -EBUSY if resizer module was already requested. ++ **/ ++int ispresizer_request() ++{ ++ mutex_lock(&ispres_obj.ispres_mutex); ++ if (!ispres_obj.res_inuse) { ++ ispres_obj.res_inuse = 1; ++ mutex_unlock(&ispres_obj.ispres_mutex); ++ isp_reg_writel(isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL) | ++ ISPCTRL_SBL_WR0_RAM_EN | ++ ISPCTRL_RSZ_CLK_EN, ++ OMAP3_ISP_IOMEM_MAIN, ISP_CTRL); ++ return 0; ++ } else { ++ mutex_unlock(&ispres_obj.ispres_mutex); ++ printk(KERN_ERR "ISP_ERR : Resizer Module Busy\n"); ++ return -EBUSY; ++ } ++} ++EXPORT_SYMBOL(ispresizer_request); ++ ++/** ++ * ispresizer_free - Makes Resizer module free. ++ * ++ * Returns 0 if successful, or -EINVAL if resizer module was already freed. ++ **/ ++int ispresizer_free() ++{ ++ mutex_lock(&ispres_obj.ispres_mutex); ++ if (ispres_obj.res_inuse) { ++ ispres_obj.res_inuse = 0; ++ mutex_unlock(&ispres_obj.ispres_mutex); ++ isp_reg_and(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, ++ ~(ISPCTRL_RSZ_CLK_EN | ISPCTRL_SBL_WR0_RAM_EN)); ++ return 0; ++ } else { ++ mutex_unlock(&ispres_obj.ispres_mutex); ++ DPRINTK_ISPRESZ("ISP_ERR : Resizer Module already freed\n"); ++ return -EINVAL; ++ } ++} ++EXPORT_SYMBOL(ispresizer_free); ++ ++/** ++ * ispresizer_config_datapath - Specifies which input to use in resizer module ++ * @input: Indicates the module that gives the image to resizer. ++ * ++ * Sets up the default resizer configuration according to the arguments. ++ * ++ * Returns 0 if successful, or -EINVAL if an unsupported input was requested. ++ **/ ++int ispresizer_config_datapath(enum ispresizer_input input) ++{ ++ u32 cnt = 0; ++ DPRINTK_ISPRESZ("ispresizer_config_datapath()+\n"); ++ ispres_obj.resinput = input; ++ switch (input) { ++ case RSZ_OTFLY_YUV: ++ cnt &= ~ISPRSZ_CNT_INPTYP; ++ cnt &= ~ISPRSZ_CNT_INPSRC; ++ ispresizer_set_inaddr(0); ++ ispresizer_config_inlineoffset(0); ++ break; ++ case RSZ_MEM_YUV: ++ cnt |= ISPRSZ_CNT_INPSRC; ++ cnt &= ~ISPRSZ_CNT_INPTYP; ++ break; ++ case RSZ_MEM_COL8: ++ cnt |= ISPRSZ_CNT_INPSRC; ++ cnt |= ISPRSZ_CNT_INPTYP; ++ break; ++ default: ++ printk(KERN_ERR "ISP_ERR : Wrong Input\n"); ++ return -EINVAL; ++ } ++ isp_reg_or(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, cnt); ++ ispresizer_config_ycpos(0); ++ ispresizer_config_filter_coef(&ispreszdefcoef); ++ ispresizer_enable_cbilin(0); ++ ispresizer_config_luma_enhance(&ispreszdefaultyenh); ++ DPRINTK_ISPRESZ("ispresizer_config_datapath()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_datapath); ++ ++/** ++ * ispresizer_try_size - Validates input and output images size. ++ * @input_w: input width for the resizer in number of pixels per line ++ * @input_h: input height for the resizer in number of lines ++ * @output_w: output width from the resizer in number of pixels per line ++ * resizer when writing to memory needs this to be multiple of 16. ++ * @output_h: output height for the resizer in number of lines, must be even. ++ * ++ * Calculates the horizontal and vertical resize ratio, number of pixels to ++ * be cropped in the resizer module and checks the validity of various ++ * parameters. Formula used for calculation is:- ++ * ++ * 8-phase 4-tap mode :- ++ * inputwidth = (32 * sph + (ow - 1) * hrsz + 16) >> 8 + 7 ++ * inputheight = (32 * spv + (oh - 1) * vrsz + 16) >> 8 + 4 ++ * endpahse for width = ((32 * sph + (ow - 1) * hrsz + 16) >> 5) % 8 ++ * endphase for height = ((32 * sph + (oh - 1) * hrsz + 16) >> 5) % 8 ++ * ++ * 4-phase 7-tap mode :- ++ * inputwidth = (64 * sph + (ow - 1) * hrsz + 32) >> 8 + 7 ++ * inputheight = (64 * spv + (oh - 1) * vrsz + 32) >> 8 + 7 ++ * endpahse for width = ((64 * sph + (ow - 1) * hrsz + 32) >> 6) % 4 ++ * endphase for height = ((64 * sph + (oh - 1) * hrsz + 32) >> 6) % 4 ++ * ++ * Where: ++ * sph = Start phase horizontal ++ * spv = Start phase vertical ++ * ow = Output width ++ * oh = Output height ++ * hrsz = Horizontal resize value ++ * vrsz = Vertical resize value ++ * ++ * Fills up the output/input widht/height, horizontal/vertical resize ratio, ++ * horizontal/vertical crop variables in the isp_res structure. ++ **/ ++int ispresizer_try_size(u32 *input_width, u32 *input_height, u32 *output_w, ++ u32 *output_h) ++{ ++ u32 rsz, rsz_7, rsz_4; ++ u32 sph; ++ u32 input_w, input_h; ++ int max_in_otf, max_out_7tap; ++ ++ input_w = *input_width; ++ input_h = *input_height; ++ ++ if (input_w < 32 || input_h < 32) { ++ DPRINTK_ISPCCDC("ISP_ERR: RESIZER cannot handle input width" ++ " less than 32 pixels or height less than" ++ " 32\n"); ++ return -EINVAL; ++ } ++ input_w -= 6; ++ input_h -= 6; ++ ++ if (input_h > MAX_IN_HEIGHT) ++ return -EINVAL; ++ ++ if (*output_w < 16) ++ *output_w = 16; ++ ++ if (*output_h < 2) ++ *output_h = 2; ++ ++ if (omap_rev() == OMAP3430_REV_ES1_0) { ++ max_in_otf = MAX_IN_WIDTH_ONTHEFLY_MODE; ++ max_out_7tap = MAX_7TAP_VRSZ_OUTWIDTH; ++ } else { ++ max_in_otf = MAX_IN_WIDTH_ONTHEFLY_MODE_ES2; ++ max_out_7tap = MAX_7TAP_VRSZ_OUTWIDTH_ES2; ++ } ++ ++ if (ispres_obj.resinput == RSZ_OTFLY_YUV) { ++ if (input_w > max_in_otf) ++ return -EINVAL; ++ } else { ++ if (input_w > MAX_IN_WIDTH_MEMORY_MODE) ++ return -EINVAL; ++ } ++ ++ *output_h &= 0xfffffffe; ++ sph = DEFAULTSTPHASE; ++ ++ rsz_7 = ((input_h - 7) * 256) / (*output_h - 1); ++ rsz_4 = ((input_h - 4) * 256) / (*output_h - 1); ++ ++ rsz = (input_h * 256) / *output_h; ++ ++ if (rsz <= MID_RESIZE_VALUE) { ++ rsz = rsz_4; ++ if (rsz < MINIMUM_RESIZE_VALUE) { ++ rsz = MINIMUM_RESIZE_VALUE; ++ *output_h = (((input_h - 4) * 256) / rsz) + 1; ++ printk(KERN_INFO "%s: using output_h %d instead\n", ++ __func__, *output_h); ++ } ++ } else { ++ rsz = rsz_7; ++ if (*output_w > max_out_7tap) ++ *output_w = max_out_7tap; ++ if (rsz > MAXIMUM_RESIZE_VALUE) { ++ rsz = MAXIMUM_RESIZE_VALUE; ++ *output_h = (((input_h - 7) * 256) / rsz) + 1; ++ printk(KERN_INFO "%s: using output_h %d instead\n", ++ __func__, *output_h); ++ } ++ } ++ ++ if (rsz > MID_RESIZE_VALUE) { ++ input_h = ++ (((64 * sph) + ((*output_h - 1) * rsz) + 32) / 256) + 7; ++ } else { ++ input_h = ++ (((32 * sph) + ((*output_h - 1) * rsz) + 16) / 256) + 4; ++ } ++ ++ ispres_obj.outputheight = *output_h; ++ ispres_obj.v_resz = rsz; ++ ispres_obj.inputheight = input_h; ++ ispres_obj.ipht_crop = DEFAULTSTPIXEL; ++ ispres_obj.v_startphase = sph; ++ ++ *output_w &= 0xfffffff0; ++ sph = DEFAULTSTPHASE; ++ ++ rsz_7 = ((input_w - 7) * 256) / (*output_w - 1); ++ rsz_4 = ((input_w - 4) * 256) / (*output_w - 1); ++ ++ rsz = (input_w * 256) / *output_w; ++ if (rsz > MID_RESIZE_VALUE) { ++ rsz = rsz_7; ++ if (rsz > MAXIMUM_RESIZE_VALUE) { ++ rsz = MAXIMUM_RESIZE_VALUE; ++ *output_w = (((input_w - 7) * 256) / rsz) + 1; ++ *output_w = (*output_w + 0xf) & 0xfffffff0; ++ printk(KERN_INFO "%s: using output_w %d instead\n", ++ __func__, *output_w); ++ } ++ } else { ++ rsz = rsz_4; ++ if (rsz < MINIMUM_RESIZE_VALUE) { ++ rsz = MINIMUM_RESIZE_VALUE; ++ *output_w = (((input_w - 4) * 256) / rsz) + 1; ++ *output_w = (*output_w + 0xf) & 0xfffffff0; ++ printk(KERN_INFO "%s: using output_w %d instead\n", ++ __func__, *output_w); ++ } ++ } ++ ++ /* Recalculate input based on TRM equations */ ++ if (rsz > MID_RESIZE_VALUE) { ++ input_w = ++ (((64 * sph) + ((*output_w - 1) * rsz) + 32) / 256) + 7; ++ } else { ++ input_w = ++ (((32 * sph) + ((*output_w - 1) * rsz) + 16) / 256) + 7; ++ } ++ ++ ispres_obj.outputwidth = *output_w; ++ ispres_obj.h_resz = rsz; ++ ispres_obj.inputwidth = input_w; ++ ispres_obj.ipwd_crop = DEFAULTSTPIXEL; ++ ispres_obj.h_startphase = sph; ++ ++ *input_height = input_h; ++ *input_width = input_w; ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_try_size); ++ ++/** ++ * ispresizer_config_size - Configures input and output image size. ++ * @input_w: input width for the resizer in number of pixels per line. ++ * @input_h: input height for the resizer in number of lines. ++ * @output_w: output width from the resizer in number of pixels per line. ++ * @output_h: output height for the resizer in number of lines. ++ * ++ * Configures the appropriate values stored in the isp_res structure in the ++ * resizer registers. ++ * ++ * Returns 0 if successful, or -EINVAL if passed values haven't been verified ++ * with ispresizer_try_size() previously. ++ **/ ++int ispresizer_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h) ++{ ++ int i, j; ++ u32 res; ++ DPRINTK_ISPRESZ("ispresizer_config_size()+, input_w = %d,input_h =" ++ " %d, output_w = %d, output_h" ++ " = %d,hresz = %d,vresz = %d," ++ " hcrop = %d, vcrop = %d," ++ " hstph = %d, vstph = %d\n", ++ ispres_obj.inputwidth, ++ ispres_obj.inputheight, ++ ispres_obj.outputwidth, ++ ispres_obj.outputheight, ++ ispres_obj.h_resz, ++ ispres_obj.v_resz, ++ ispres_obj.ipwd_crop, ++ ispres_obj.ipht_crop, ++ ispres_obj.h_startphase, ++ ispres_obj.v_startphase); ++ if ((output_w != ispres_obj.outputwidth) ++ || (output_h != ispres_obj.outputheight)) { ++ printk(KERN_ERR "Output parameters passed do not match the" ++ " values calculated by the" ++ " trysize passed w %d, h %d" ++ " \n", output_w , output_h); ++ return -EINVAL; ++ } ++ ++ /* Set Resizer input address and offset adderss */ ++ ispresizer_config_inlineoffset(isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ++ ISPPRV_WADD_OFFSET)); ++ ++ res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ++ ~(ISPRSZ_CNT_HSTPH_MASK | ISPRSZ_CNT_VSTPH_MASK); ++ isp_reg_writel(res | ++ (ispres_obj.h_startphase << ISPRSZ_CNT_HSTPH_SHIFT) | ++ (ispres_obj.v_startphase << ISPRSZ_CNT_VSTPH_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_CNT); ++ /* Set start address for cropping */ ++ isp_reg_writel(ispres_obj.tmp_buf + 2 * ++ (ispres_obj.ipht_crop * ispres_obj.inputwidth + ++ (ispres_obj.ipwd_crop & ~15)), ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD); ++ ++ isp_reg_writel( ++ ((ispres_obj.ipwd_crop & 15) << ISPRSZ_IN_START_HORZ_ST_SHIFT) | ++ (0x00 << ISPRSZ_IN_START_VERT_ST_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START); ++ ++ isp_reg_writel((0x00 << ISPRSZ_IN_START_HORZ_ST_SHIFT) | ++ (0x00 << ISPRSZ_IN_START_VERT_ST_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_IN_START); ++ ++ isp_reg_writel((ispres_obj.inputwidth << ISPRSZ_IN_SIZE_HORZ_SHIFT) | ++ (ispres_obj.inputheight << ++ ISPRSZ_IN_SIZE_VERT_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_IN_SIZE); ++ if (!ispres_obj.algo) { ++ isp_reg_writel((output_w << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | ++ (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_OUT_SIZE); ++ } else { ++ isp_reg_writel(((output_w - 4) << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | ++ (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_OUT_SIZE); ++ } ++ ++ res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ++ ~(ISPRSZ_CNT_HRSZ_MASK | ISPRSZ_CNT_VRSZ_MASK); ++ isp_reg_writel(res | ++ ((ispres_obj.h_resz - 1) << ISPRSZ_CNT_HRSZ_SHIFT) | ++ ((ispres_obj.v_resz - 1) << ISPRSZ_CNT_VRSZ_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_CNT); ++ if (ispres_obj.h_resz <= MID_RESIZE_VALUE) { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ isp_reg_writel( ++ (ispres_obj.coeflist.h_filter_coef_4tap[j] ++ << ISPRSZ_HFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist.h_filter_coef_4tap[j + 1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } else { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ if ((i + 1) % 4 == 0) { ++ isp_reg_writel((ispres_obj.coeflist. ++ h_filter_coef_7tap[j] << ++ ISPRSZ_HFILT10_COEF0_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 1; ++ } else { ++ isp_reg_writel((ispres_obj.coeflist. ++ h_filter_coef_7tap[j] << ++ ISPRSZ_HFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist. ++ h_filter_coef_7tap[j+1] << ++ ISPRSZ_HFILT10_COEF1_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } ++ } ++ if (ispres_obj.v_resz <= MID_RESIZE_VALUE) { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ isp_reg_writel((ispres_obj.coeflist. ++ v_filter_coef_4tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist. ++ v_filter_coef_4tap[j + 1] << ++ ISPRSZ_VFILT10_COEF1_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } else { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ if ((i + 1) % 4 == 0) { ++ isp_reg_writel((ispres_obj.coeflist. ++ v_filter_coef_7tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 1; ++ } else { ++ isp_reg_writel((ispres_obj.coeflist. ++ v_filter_coef_7tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist. ++ v_filter_coef_7tap[j+1] << ++ ISPRSZ_VFILT10_COEF1_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } ++ } ++ ++ ispresizer_config_outlineoffset(output_w*2); ++ DPRINTK_ISPRESZ("ispresizer_config_size()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_size); ++ ++void __ispresizer_enable(int enable) ++{ ++ int val; ++ DPRINTK_ISPRESZ("+ispresizer_enable()+\n"); ++ if (enable) { ++ val = (isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_PCR) & 0x2) | ++ ISPRSZ_PCR_ENABLE; ++ } else { ++ val = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_PCR) & ++ ~ISPRSZ_PCR_ENABLE; ++ } ++ isp_reg_writel(val, OMAP3_ISP_IOMEM_RESZ, ISPRSZ_PCR); ++ DPRINTK_ISPRESZ("+ispresizer_enable()-\n"); ++} ++ ++/** ++ * ispresizer_enable - Enables the resizer module. ++ * @enable: 1 - Enable, 0 - Disable ++ * ++ * Client should configure all the sub modules in resizer before this. ++ **/ ++void ispresizer_enable(int enable) ++{ ++ __ispresizer_enable(enable); ++ ispres_obj.pm_state = enable; ++} ++EXPORT_SYMBOL(ispresizer_enable); ++ ++/** ++ * ispresizer_suspend - Suspend resizer module. ++ **/ ++void ispresizer_suspend(void) ++{ ++ if (ispres_obj.pm_state) ++ __ispresizer_enable(0); ++} ++EXPORT_SYMBOL(ispresizer_suspend); ++ ++/** ++ * ispresizer_resume - Resume resizer module. ++ **/ ++void ispresizer_resume(void) ++{ ++ if (ispres_obj.pm_state) ++ __ispresizer_enable(1); ++} ++EXPORT_SYMBOL(ispresizer_resume); ++ ++/** ++ * ispresizer_busy - Checks if ISP resizer is busy. ++ * ++ * Returns busy field from ISPRSZ_PCR register. ++ **/ ++int ispresizer_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_PCR) & ++ ISPPRV_PCR_BUSY; ++} ++EXPORT_SYMBOL(ispresizer_busy); ++ ++/** ++ * ispresizer_config_startphase - Sets the horizontal and vertical start phase. ++ * @hstartphase: horizontal start phase (0 - 7). ++ * @vstartphase: vertical startphase (0 - 7). ++ * ++ * This API just updates the isp_res struct. Actual register write happens in ++ * ispresizer_config_size. ++ **/ ++void ispresizer_config_startphase(u8 hstartphase, u8 vstartphase) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_startphase()+\n"); ++ ispres_obj.h_startphase = hstartphase; ++ ispres_obj.v_startphase = vstartphase; ++ DPRINTK_ISPRESZ("ispresizer_config_startphase()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_startphase); ++ ++/** ++ * ispresizer_config_ycpos - Specifies if output should be in YC or CY format. ++ * @yc: 0 - YC format, 1 - CY format ++ **/ ++void ispresizer_config_ycpos(u8 yc) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_ycpos()+\n"); ++ isp_reg_and_or(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, ~ISPRSZ_CNT_YCPOS, ++ (yc ? ISPRSZ_CNT_YCPOS : 0)); ++ DPRINTK_ISPRESZ("ispresizer_config_ycpos()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_ycpos); ++ ++/** ++ * Sets the chrominance algorithm ++ * @cbilin: 0 - chrominance uses same processing as luminance, ++ * 1 - bilinear interpolation processing ++ **/ ++void ispresizer_enable_cbilin(u8 enable) ++{ ++ DPRINTK_ISPRESZ("ispresizer_enable_cbilin()+\n"); ++ isp_reg_and_or(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, ~ISPRSZ_CNT_CBILIN, ++ (enable ? ISPRSZ_CNT_CBILIN : 0)); ++ DPRINTK_ISPRESZ("ispresizer_enable_cbilin()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_enable_cbilin); ++ ++/** ++ * ispresizer_config_luma_enhance - Configures luminance enhancer parameters. ++ * @yenh: Pointer to structure containing desired values for core, slope, gain ++ * and algo parameters. ++ **/ ++void ispresizer_config_luma_enhance(struct isprsz_yenh *yenh) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_luma_enhance()+\n"); ++ ispres_obj.algo = yenh->algo; ++ isp_reg_writel((yenh->algo << ISPRSZ_YENH_ALGO_SHIFT) | ++ (yenh->gain << ISPRSZ_YENH_GAIN_SHIFT) | ++ (yenh->slope << ISPRSZ_YENH_SLOP_SHIFT) | ++ (yenh->coreoffset << ISPRSZ_YENH_CORE_SHIFT), ++ OMAP3_ISP_IOMEM_RESZ, ++ ISPRSZ_YENH); ++ DPRINTK_ISPRESZ("ispresizer_config_luma_enhance()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_luma_enhance); ++ ++/** ++ * ispresizer_config_filter_coef - Sets filter coefficients for 4 & 7-tap mode. ++ * This API just updates the isp_res struct.Actual register write happens in ++ * ispresizer_config_size. ++ * @coef: Structure containing horizontal and vertical filter coefficients for ++ * both 4-tap and 7-tap mode. ++ **/ ++void ispresizer_config_filter_coef(struct isprsz_coef *coef) ++{ ++ int i; ++ DPRINTK_ISPRESZ("ispresizer_config_filter_coef()+\n"); ++ for (i = 0; i < 32; i++) { ++ ispres_obj.coeflist.h_filter_coef_4tap[i] = ++ coef->h_filter_coef_4tap[i]; ++ ispres_obj.coeflist.v_filter_coef_4tap[i] = ++ coef->v_filter_coef_4tap[i]; ++ } ++ for (i = 0; i < 28; i++) { ++ ispres_obj.coeflist.h_filter_coef_7tap[i] = ++ coef->h_filter_coef_7tap[i]; ++ ispres_obj.coeflist.v_filter_coef_7tap[i] = ++ coef->v_filter_coef_7tap[i]; ++ } ++ DPRINTK_ISPRESZ("ispresizer_config_filter_coef()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_filter_coef); ++ ++/** ++ * ispresizer_config_inlineoffset - Configures the read address line offset. ++ * @offset: Line Offset for the input image. ++ * ++ * Returns 0 if successful, or -EINVAL if offset is not 32 bits aligned. ++ **/ ++int ispresizer_config_inlineoffset(u32 offset) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_inlineoffset()+\n"); ++ if (offset % 32) ++ return -EINVAL; ++ isp_reg_writel(offset << ISPRSZ_SDR_INOFF_OFFSET_SHIFT, ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INOFF); ++ DPRINTK_ISPRESZ("ispresizer_config_inlineoffset()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_inlineoffset); ++ ++/** ++ * ispresizer_set_inaddr - Sets the memory address of the input frame. ++ * @addr: 32bit memory address aligned on 32byte boundary. ++ * ++ * Returns 0 if successful, or -EINVAL if address is not 32 bits aligned. ++ **/ ++int ispresizer_set_inaddr(u32 addr) ++{ ++ DPRINTK_ISPRESZ("ispresizer_set_inaddr()+\n"); ++ if (addr % 32) ++ return -EINVAL; ++ isp_reg_writel(addr << ISPRSZ_SDR_INADD_ADDR_SHIFT, ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD); ++ ispres_obj.tmp_buf = addr; ++ DPRINTK_ISPRESZ("ispresizer_set_inaddr()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_set_inaddr); ++ ++/** ++ * ispresizer_config_outlineoffset - Configures the write address line offset. ++ * @offset: Line offset for the preview output. ++ * ++ * Returns 0 if successful, or -EINVAL if address is not 32 bits aligned. ++ **/ ++int ispresizer_config_outlineoffset(u32 offset) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_outlineoffset()+\n"); ++ if (offset % 32) ++ return -EINVAL; ++ isp_reg_writel(offset << ISPRSZ_SDR_OUTOFF_OFFSET_SHIFT, ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTOFF); ++ DPRINTK_ISPRESZ("ispresizer_config_outlineoffset()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_outlineoffset); ++ ++/** ++ * Configures the memory address to which the output frame is written. ++ * @addr: 32bit memory address aligned on 32byte boundary. ++ **/ ++int ispresizer_set_outaddr(u32 addr) ++{ ++ DPRINTK_ISPRESZ("ispresizer_set_outaddr()+\n"); ++ if (addr % 32) ++ return -EINVAL; ++ isp_reg_writel(addr << ISPRSZ_SDR_OUTADD_ADDR_SHIFT, ++ OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTADD); ++ DPRINTK_ISPRESZ("ispresizer_set_outaddr()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_set_outaddr); ++ ++/** ++ * ispresizer_save_context - Saves the values of the resizer module registers. ++ **/ ++void ispresizer_save_context(void) ++{ ++ DPRINTK_ISPRESZ("Saving context\n"); ++ isp_save_context(isprsz_reg_list); ++} ++EXPORT_SYMBOL(ispresizer_save_context); ++ ++/** ++ * ispresizer_restore_context - Restores resizer module register values. ++ **/ ++void ispresizer_restore_context(void) ++{ ++ DPRINTK_ISPRESZ("Restoring context\n"); ++ isp_restore_context(isprsz_reg_list); ++} ++EXPORT_SYMBOL(ispresizer_restore_context); ++ ++/** ++ * ispresizer_print_status - Prints the values of the resizer module registers. ++ **/ ++void ispresizer_print_status() ++{ ++ if (!is_ispresz_debug_enabled()) ++ return; ++ DPRINTK_ISPRESZ("###ISP_CTRL inresizer =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ DPRINTK_ISPRESZ("###ISP_IRQ0ENABLE in resizer =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE)); ++ DPRINTK_ISPRESZ("###ISP_IRQ0STATUS in resizer =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS)); ++ DPRINTK_ISPRESZ("###RSZ PCR =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_PCR)); ++ DPRINTK_ISPRESZ("###RSZ CNT =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT)); ++ DPRINTK_ISPRESZ("###RSZ OUT SIZE =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE)); ++ DPRINTK_ISPRESZ("###RSZ IN START =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START)); ++ DPRINTK_ISPRESZ("###RSZ IN SIZE =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_SIZE)); ++ DPRINTK_ISPRESZ("###RSZ SDR INADD =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD)); ++ DPRINTK_ISPRESZ("###RSZ SDR INOFF =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INOFF)); ++ DPRINTK_ISPRESZ("###RSZ SDR OUTADD =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTADD)); ++ DPRINTK_ISPRESZ("###RSZ SDR OTOFF =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_OUTOFF)); ++ DPRINTK_ISPRESZ("###RSZ YENH =0x%x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_YENH)); ++} ++EXPORT_SYMBOL(ispresizer_print_status); ++ ++/** ++ * isp_resizer_init - Module Initialisation. ++ * ++ * Always returns 0. ++ **/ ++int __init isp_resizer_init(void) ++{ ++ mutex_init(&ispres_obj.ispres_mutex); ++ ispres_obj.pm_state = 0; ++ return 0; ++} ++ ++/** ++ * isp_resizer_cleanup - Module Cleanup. ++ **/ ++void isp_resizer_cleanup(void) ++{ ++} +diff --git a/drivers/media/video/isp/ispresizer.h b/drivers/media/video/isp/ispresizer.h +new file mode 100644 +index 0000000..4e92225 +--- /dev/null ++++ b/drivers/media/video/isp/ispresizer.h +@@ -0,0 +1,158 @@ ++/* ++ * ispresizer.h ++ * ++ * Driver header file for Resizer module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sameer Venkatraman ++ * Mohit Jalori ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_RESIZER_H ++#define OMAP_ISP_RESIZER_H ++ ++/* ++ * Resizer Constants ++ */ ++#define MAX_IN_WIDTH_MEMORY_MODE 4095 ++ ++#define MAX_IN_WIDTH_ONTHEFLY_MODE 1280 ++#define MAX_IN_WIDTH_ONTHEFLY_MODE_ES2 4095 ++#define MAX_IN_HEIGHT 4095 ++#define MINIMUM_RESIZE_VALUE 64 ++#define MAXIMUM_RESIZE_VALUE 1024 ++#define MID_RESIZE_VALUE 512 ++ ++#define MAX_7TAP_HRSZ_OUTWIDTH 1280 ++#define MAX_7TAP_VRSZ_OUTWIDTH 640 ++ ++#define MAX_7TAP_HRSZ_OUTWIDTH_ES2 3300 ++#define MAX_7TAP_VRSZ_OUTWIDTH_ES2 1650 ++ ++#define DEFAULTSTPIXEL 0 ++#define DEFAULTSTPHASE 1 ++#define DEFAULTHSTPIXEL4TAPMODE 3 ++#define FOURPHASE 4 ++#define EIGHTPHASE 8 ++#define RESIZECONSTANT 256 ++#define SHIFTER4TAPMODE 0 ++#define SHIFTER7TAPMODE 1 ++#define DEFAULTOFFSET 7 ++#define OFFSETVERT4TAPMODE 4 ++#define OPWDALIGNCONSTANT 0xfffffff0 ++ ++/* ++ * The client is supposed to call resizer API in the following sequence: ++ * - request() ++ * - config_datatpath() ++ * - optionally config/enable sub modules ++ * - try/config size ++ * - setup callback ++ * - setup in/out memory offsets and ptrs ++ * - enable() ++ * ... ++ * - disable() ++ * - free() ++ */ ++ ++enum ispresizer_input { ++ RSZ_OTFLY_YUV, ++ RSZ_MEM_YUV, ++ RSZ_MEM_COL8 ++}; ++ ++/** ++ * struct isprsz_coef - Structure for resizer filter coeffcients. ++ * @h_filter_coef_4tap: Horizontal filter coefficients for 8-phase/4-tap ++ * mode (.5x-4x) ++ * @v_filter_coef_4tap: Vertical filter coefficients for 8-phase/4-tap ++ * mode (.5x-4x) ++ * @h_filter_coef_7tap: Horizontal filter coefficients for 4-phase/7-tap ++ * mode (.25x-.5x) ++ * @v_filter_coef_7tap: Vertical filter coefficients for 4-phase/7-tap ++ * mode (.25x-.5x) ++ */ ++struct isprsz_coef { ++ u16 h_filter_coef_4tap[32]; ++ u16 v_filter_coef_4tap[32]; ++ u16 h_filter_coef_7tap[28]; ++ u16 v_filter_coef_7tap[28]; ++}; ++ ++/** ++ * struct isprsz_yenh - Structure for resizer luminance enhancer parameters. ++ * @algo: Algorithm select. ++ * @gain: Maximum gain. ++ * @slope: Slope. ++ * @coreoffset: Coring offset. ++ */ ++struct isprsz_yenh { ++ u8 algo; ++ u8 gain; ++ u8 slope; ++ u8 coreoffset; ++}; ++ ++void ispresizer_config_shadow_registers(void); ++ ++int ispresizer_request(void); ++ ++int ispresizer_free(void); ++ ++int ispresizer_config_datapath(enum ispresizer_input input); ++ ++void ispresizer_enable_cbilin(u8 enable); ++ ++void ispresizer_config_ycpos(u8 yc); ++ ++void ispresizer_config_startphase(u8 hstartphase, u8 vstartphase); ++ ++void ispresizer_config_filter_coef(struct isprsz_coef *coef); ++ ++void ispresizer_config_luma_enhance(struct isprsz_yenh *yenh); ++ ++int ispresizer_try_size(u32 *input_w, u32 *input_h, u32 *output_w, ++ u32 *output_h); ++ ++void ispresizer_applycrop(void); ++ ++void ispresizer_trycrop(u32 left, u32 top, u32 width, u32 height, u32 ow, ++ u32 oh); ++ ++int ispresizer_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h); ++ ++int ispresizer_config_inlineoffset(u32 offset); ++ ++int ispresizer_set_inaddr(u32 addr); ++ ++int ispresizer_config_outlineoffset(u32 offset); ++ ++int ispresizer_set_outaddr(u32 addr); ++ ++void ispresizer_enable(int enable); ++ ++void ispresizer_suspend(void); ++ ++void ispresizer_resume(void); ++ ++int ispresizer_busy(void); ++ ++void ispresizer_save_context(void); ++ ++void ispresizer_restore_context(void); ++ ++void ispresizer_print_status(void); ++ ++#endif /* OMAP_ISP_RESIZER_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0006-omap3isp-Add-statistics-collection-modules-H3A-and.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0006-omap3isp-Add-statistics-collection-modules-H3A-and.patch new file mode 100644 index 0000000000..876ce780f0 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0006-omap3isp-Add-statistics-collection-modules-H3A-and.patch @@ -0,0 +1,2741 @@ +From 9a39eab5ed1b70711c3b10de95cd90749293ef7a Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add statistics collection modules (H3A and HIST) + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/isp_af.c | 784 +++++++++++++++++++++++++++++++ + drivers/media/video/isp/isp_af.h | 125 +++++ + drivers/media/video/isp/isph3a.c | 932 +++++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/isph3a.h | 127 +++++ + drivers/media/video/isp/isphist.c | 608 ++++++++++++++++++++++++ + drivers/media/video/isp/isphist.h | 105 +++++ + 6 files changed, 2681 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/isp_af.c + create mode 100644 drivers/media/video/isp/isp_af.h + create mode 100644 drivers/media/video/isp/isph3a.c + create mode 100644 drivers/media/video/isp/isph3a.h + create mode 100644 drivers/media/video/isp/isphist.c + create mode 100644 drivers/media/video/isp/isphist.h + +diff --git a/drivers/media/video/isp/isp_af.c b/drivers/media/video/isp/isp_af.c +new file mode 100644 +index 0000000..a607b97 +--- /dev/null ++++ b/drivers/media/video/isp/isp_af.c +@@ -0,0 +1,784 @@ ++/* ++ * isp_af.c ++ * ++ * AF module for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++/* Linux specific include files */ ++#include ++ ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isph3a.h" ++#include "isp_af.h" ++#include "ispmmu.h" ++ ++/** ++ * struct isp_af_buffer - AF frame stats buffer. ++ * @virt_addr: Virtual address to mmap the buffer. ++ * @phy_addr: Physical address of the buffer. ++ * @addr_align: Virtual Address 32 bytes aligned. ++ * @ispmmu_addr: Address of the buffer mapped by the ISPMMU. ++ * @mmap_addr: Mapped memory area of buffer. For userspace access. ++ * @locked: 1 - Buffer locked from write. 0 - Buffer can be overwritten. ++ * @frame_num: Frame number from which the statistics are taken. ++ * @lens_position: Lens position currently set in the DW9710 Coil motor driver. ++ * @next: Pointer to link next buffer. ++ */ ++struct isp_af_buffer { ++ unsigned long virt_addr; ++ unsigned long phy_addr; ++ unsigned long addr_align; ++ unsigned long ispmmu_addr; ++ unsigned long mmap_addr; ++ ++ u8 locked; ++ u16 frame_num; ++ u32 config_counter; ++ struct isp_af_xtrastats xtrastats; ++ struct isp_af_buffer *next; ++}; ++ ++/** ++ * struct isp_af_status - AF status. ++ * @initialized: 1 - Buffers initialized. ++ * @update: 1 - Update registers. ++ * @stats_req: 1 - Future stats requested. ++ * @stats_done: 1 - Stats ready for user. ++ * @frame_req: Number of frame requested for statistics. ++ * @af_buff: Array of statistics buffers to access. ++ * @stats_buf_size: Statistics buffer size. ++ * @curr_cfg_buf_size: Current user configured stats buff size. ++ * @min_buf_size: Minimum statisitics buffer size. ++ * @frame_count: Frame Count. ++ * @stats_wait: Wait primitive for locking/unlocking the stats request. ++ * @buffer_lock: Spinlock for statistics buffers access. ++ */ ++static struct isp_af_status { ++ u8 initialized; ++ u8 update; ++ u8 stats_req; ++ u8 stats_done; ++ u16 frame_req; ++ ++ struct isp_af_buffer af_buff[H3A_MAX_BUFF]; ++ unsigned int stats_buf_size; ++ unsigned int min_buf_size; ++ unsigned int curr_cfg_buf_size; ++ ++ int pm_state; ++ u32 frame_count; ++ wait_queue_head_t stats_wait; ++ atomic_t config_counter; ++ spinlock_t buffer_lock; /* For stats buffers read/write sync */ ++} afstat; ++ ++struct af_device *af_dev_configptr; ++static struct isp_af_buffer *active_buff; ++static int af_major = -1; ++static int camnotify; ++ ++/** ++ * isp_af_setxtrastats - Receives extra statistics from prior frames. ++ * @xtrastats: Pointer to structure containing extra statistics fields like ++ * field count and timestamp of frame. ++ * ++ * Called from update_vbq in camera driver ++ **/ ++void isp_af_setxtrastats(struct isp_af_xtrastats *xtrastats, u8 updateflag) ++{ ++ int i, past_i; ++ ++ if (active_buff == NULL) ++ return; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (afstat.af_buff[i].frame_num == active_buff->frame_num) ++ break; ++ } ++ ++ if (i == H3A_MAX_BUFF) ++ return; ++ ++ if (i == 0) { ++ if (afstat.af_buff[H3A_MAX_BUFF - 1].locked == 0) ++ past_i = H3A_MAX_BUFF - 1; ++ else ++ past_i = H3A_MAX_BUFF - 2; ++ } else if (i == 1) { ++ if (afstat.af_buff[0].locked == 0) ++ past_i = 0; ++ else ++ past_i = H3A_MAX_BUFF - 1; ++ } else { ++ if (afstat.af_buff[i - 1].locked == 0) ++ past_i = i - 1; ++ else ++ past_i = i - 2; ++ } ++ ++ if (updateflag & AF_UPDATEXS_TS) ++ afstat.af_buff[past_i].xtrastats.ts = xtrastats->ts; ++ ++ if (updateflag & AF_UPDATEXS_FIELDCOUNT) ++ afstat.af_buff[past_i].xtrastats.field_count = ++ xtrastats->field_count; ++} ++EXPORT_SYMBOL(isp_af_setxtrastats); ++ ++/* ++ * Helper function to update buffer cache pages ++ */ ++static void isp_af_update_req_buffer(struct isp_af_buffer *buffer) ++{ ++ int size = afstat.stats_buf_size; ++ ++ size = PAGE_ALIGN(size); ++ /* Update the kernel pages of the requested buffer */ ++ dmac_inv_range((void *)buffer->addr_align, (void *)buffer->addr_align + ++ size); ++} ++ ++#define IS_OUT_OF_BOUNDS(value, min, max) \ ++ (((value) < (min)) || ((value) > (max))) ++ ++/* Function to check paxel parameters */ ++int isp_af_check_paxel(void) ++{ ++ struct af_paxel *paxel_cfg = &af_dev_configptr->config->paxel_config; ++ struct af_iir *iir_cfg = &af_dev_configptr->config->iir_config; ++ ++ /* Check horizontal Count */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->hz_cnt, AF_PAXEL_HORIZONTAL_COUNT_MIN, ++ AF_PAXEL_HORIZONTAL_COUNT_MAX)) { ++ DPRINTK_ISP_AF("Error : Horizontal Count is incorrect"); ++ return -AF_ERR_HZ_COUNT; ++ } ++ ++ /*Check Vertical Count */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->vt_cnt, AF_PAXEL_VERTICAL_COUNT_MIN, ++ AF_PAXEL_VERTICAL_COUNT_MAX)) { ++ DPRINTK_ISP_AF("Error : Vertical Count is incorrect"); ++ return -AF_ERR_VT_COUNT; ++ } ++ ++ /*Check Height */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->height, AF_PAXEL_HEIGHT_MIN, ++ AF_PAXEL_HEIGHT_MAX)) { ++ DPRINTK_ISP_AF("Error : Height is incorrect"); ++ return -AF_ERR_HEIGHT; ++ } ++ ++ /*Check width */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->width, AF_PAXEL_WIDTH_MIN, ++ AF_PAXEL_WIDTH_MAX)) { ++ DPRINTK_ISP_AF("Error : Width is incorrect"); ++ return -AF_ERR_WIDTH; ++ } ++ ++ /*Check Line Increment */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->line_incr, AF_PAXEL_INCREMENT_MIN, ++ AF_PAXEL_INCREMENT_MAX)) { ++ DPRINTK_ISP_AF("Error : Line Increment is incorrect"); ++ return -AF_ERR_INCR; ++ } ++ ++ /*Check Horizontal Start */ ++ if ((paxel_cfg->hz_start % 2 != 0) || ++ (paxel_cfg->hz_start < (iir_cfg->hz_start_pos + 2)) || ++ IS_OUT_OF_BOUNDS(paxel_cfg->hz_start, ++ AF_PAXEL_HZSTART_MIN, AF_PAXEL_HZSTART_MAX)) { ++ DPRINTK_ISP_AF("Error : Horizontal Start is incorrect"); ++ return -AF_ERR_HZ_START; ++ } ++ ++ /*Check Vertical Start */ ++ if (IS_OUT_OF_BOUNDS(paxel_cfg->vt_start, AF_PAXEL_VTSTART_MIN, ++ AF_PAXEL_VTSTART_MAX)) { ++ DPRINTK_ISP_AF("Error : Vertical Start is incorrect"); ++ return -AF_ERR_VT_START; ++ } ++ return 0; ++} ++ ++/** ++ * isp_af_check_iir - Function to check IIR Coefficient. ++ **/ ++int isp_af_check_iir(void) ++{ ++ struct af_iir *iir_cfg = &af_dev_configptr->config->iir_config; ++ int index; ++ ++ for (index = 0; index < AF_NUMBER_OF_COEF; index++) { ++ if ((iir_cfg->coeff_set0[index]) > AF_COEF_MAX) { ++ DPRINTK_ISP_AF("Error : Coefficient for set 0 is " ++ "incorrect"); ++ return -AF_ERR_IIR_COEF; ++ } ++ ++ if ((iir_cfg->coeff_set1[index]) > AF_COEF_MAX) { ++ DPRINTK_ISP_AF("Error : Coefficient for set 1 is " ++ "incorrect"); ++ return -AF_ERR_IIR_COEF; ++ } ++ } ++ ++ if (IS_OUT_OF_BOUNDS(iir_cfg->hz_start_pos, AF_IIRSH_MIN, ++ AF_IIRSH_MAX)) { ++ DPRINTK_ISP_AF("Error : IIRSH is incorrect"); ++ return -AF_ERR_IIRSH; ++ } ++ ++ return 0; ++} ++/** ++ * isp_af_unlock_buffers - Helper function to unlock all buffers. ++ **/ ++static void isp_af_unlock_buffers(void) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&afstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) ++ afstat.af_buff[i].locked = 0; ++ ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++} ++ ++/* ++ * Helper function to link allocated buffers ++ */ ++static void isp_af_link_buffers(void) ++{ ++ int i; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((i + 1) < H3A_MAX_BUFF) ++ afstat.af_buff[i].next = &afstat.af_buff[i + 1]; ++ else ++ afstat.af_buff[i].next = &afstat.af_buff[0]; ++ } ++} ++ ++/* Function to perform hardware set up */ ++int isp_af_configure(struct af_configuration *afconfig) ++{ ++ int result; ++ int buff_size, i; ++ unsigned int busyaf; ++ struct af_configuration *af_curr_cfg = af_dev_configptr->config; ++ ++ if (NULL == afconfig) { ++ printk(KERN_ERR "Null argument in configuration. \n"); ++ return -EINVAL; ++ } ++ ++ memcpy(af_curr_cfg, afconfig, sizeof(struct af_configuration)); ++ /* Get the value of PCR register */ ++ busyaf = isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ ++ if ((busyaf & AF_BUSYAF) == AF_BUSYAF) { ++ DPRINTK_ISP_AF("AF_register_setup_ERROR : Engine Busy"); ++ DPRINTK_ISP_AF("\n Configuration cannot be done "); ++ return -AF_ERR_ENGINE_BUSY; ++ } ++ ++ /* Check IIR Coefficient and start Values */ ++ result = isp_af_check_iir(); ++ if (result < 0) ++ return result; ++ ++ /* Check Paxel Values */ ++ result = isp_af_check_paxel(); ++ if (result < 0) ++ return result; ++ ++ /* Check HMF Threshold Values */ ++ if (af_curr_cfg->hmf_config.threshold > AF_THRESHOLD_MAX) { ++ DPRINTK_ISP_AF("Error : HMF Threshold is incorrect"); ++ return -AF_ERR_THRESHOLD; ++ } ++ ++ /* Compute buffer size */ ++ buff_size = (af_curr_cfg->paxel_config.hz_cnt + 1) * ++ (af_curr_cfg->paxel_config.vt_cnt + 1) * AF_PAXEL_SIZE; ++ ++ afstat.curr_cfg_buf_size = buff_size; ++ /* Deallocate the previous buffers */ ++ if (afstat.stats_buf_size && buff_size > afstat.stats_buf_size) { ++ isp_af_enable(0); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ ispmmu_kunmap(afstat.af_buff[i].ispmmu_addr); ++ dma_free_coherent( ++ NULL, afstat.min_buf_size, ++ (void *)afstat.af_buff[i].virt_addr, ++ (dma_addr_t)afstat.af_buff[i].phy_addr); ++ afstat.af_buff[i].virt_addr = 0; ++ } ++ afstat.stats_buf_size = 0; ++ } ++ ++ if (!afstat.af_buff[0].virt_addr) { ++ afstat.stats_buf_size = buff_size; ++ afstat.min_buf_size = PAGE_ALIGN(afstat.stats_buf_size); ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ afstat.af_buff[i].virt_addr = ++ (unsigned long)dma_alloc_coherent( ++ NULL, ++ afstat.min_buf_size, ++ (dma_addr_t *) ++ &afstat.af_buff[i].phy_addr, ++ GFP_KERNEL | GFP_DMA); ++ if (afstat.af_buff[i].virt_addr == 0) { ++ printk(KERN_ERR "Can't acquire memory for " ++ "buffer[%d]\n", i); ++ return -ENOMEM; ++ } ++ afstat.af_buff[i].addr_align = ++ afstat.af_buff[i].virt_addr; ++ while ((afstat.af_buff[i].addr_align & 0xFFFFFFC0) != ++ afstat.af_buff[i].addr_align) ++ afstat.af_buff[i].addr_align++; ++ afstat.af_buff[i].ispmmu_addr = ++ ispmmu_kmap(afstat.af_buff[i].phy_addr, ++ afstat.min_buf_size); ++ } ++ isp_af_unlock_buffers(); ++ isp_af_link_buffers(); ++ ++ /* First active buffer */ ++ if (active_buff == NULL) ++ active_buff = &afstat.af_buff[0]; ++ isp_af_set_address(active_buff->ispmmu_addr); ++ } ++ ++ result = isp_af_register_setup(af_dev_configptr); ++ if (result < 0) ++ return result; ++ af_dev_configptr->size_paxel = buff_size; ++ atomic_inc(&afstat.config_counter); ++ afstat.initialized = 1; ++ afstat.frame_count = 1; ++ active_buff->frame_num = 1; ++ /* Set configuration flag to indicate HW setup done */ ++ if (af_curr_cfg->af_config) ++ isp_af_enable(1); ++ else ++ isp_af_enable(0); ++ ++ /* Success */ ++ return 0; ++} ++EXPORT_SYMBOL(isp_af_configure); ++ ++int isp_af_register_setup(struct af_device *af_dev) ++{ ++ unsigned int pcr = 0, pax1 = 0, pax2 = 0, paxstart = 0; ++ unsigned int coef = 0; ++ unsigned int base_coef_set0 = 0; ++ unsigned int base_coef_set1 = 0; ++ int index; ++ ++ /* Configure Hardware Registers */ ++ /* Read PCR Register */ ++ pcr = isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ ++ /* Set Accumulator Mode */ ++ if (af_dev->config->mode == ACCUMULATOR_PEAK) ++ pcr |= FVMODE; ++ else ++ pcr &= ~FVMODE; ++ ++ /* Set A-law */ ++ if (af_dev->config->alaw_enable == H3A_AF_ALAW_ENABLE) ++ pcr |= AF_ALAW_EN; ++ else ++ pcr &= ~AF_ALAW_EN; ++ ++ /* Set RGB Position */ ++ pcr &= ~RGBPOS; ++ pcr |= af_dev->config->rgb_pos << AF_RGBPOS_SHIFT; ++ ++ /* HMF Configurations */ ++ if (af_dev->config->hmf_config.enable == H3A_AF_HMF_ENABLE) { ++ pcr &= ~AF_MED_EN; ++ /* Enable HMF */ ++ pcr |= AF_MED_EN; ++ ++ /* Set Median Threshold */ ++ pcr &= ~MED_TH; ++ pcr |= af_dev->config->hmf_config.threshold << AF_MED_TH_SHIFT; ++ } else ++ pcr &= ~AF_MED_EN; ++ ++ /* Set PCR Register */ ++ isp_reg_writel(pcr, OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ ++ pax1 &= ~PAXW; ++ pax1 |= af_dev->config->paxel_config.width << AF_PAXW_SHIFT; ++ ++ /* Set height in AFPAX1 */ ++ pax1 &= ~PAXH; ++ pax1 |= af_dev->config->paxel_config.height; ++ ++ isp_reg_writel(pax1, OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAX1); ++ ++ /* Configure AFPAX2 Register */ ++ /* Set Line Increment in AFPAX2 Register */ ++ pax2 &= ~AFINCV; ++ pax2 |= af_dev->config->paxel_config.line_incr << AF_LINE_INCR_SHIFT; ++ /* Set Vertical Count */ ++ pax2 &= ~PAXVC; ++ pax2 |= af_dev->config->paxel_config.vt_cnt << AF_VT_COUNT_SHIFT; ++ /* Set Horizontal Count */ ++ pax2 &= ~PAXHC; ++ pax2 |= af_dev->config->paxel_config.hz_cnt; ++ isp_reg_writel(pax2, OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAX2); ++ ++ /* Configure PAXSTART Register */ ++ /*Configure Horizontal Start */ ++ paxstart &= ~PAXSH; ++ paxstart |= af_dev->config->paxel_config.hz_start << AF_HZ_START_SHIFT; ++ /* Configure Vertical Start */ ++ paxstart &= ~PAXSV; ++ paxstart |= af_dev->config->paxel_config.vt_start; ++ isp_reg_writel(paxstart, OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAXSTART); ++ ++ /*SetIIRSH Register */ ++ isp_reg_writel(af_dev->config->iir_config.hz_start_pos, ++ OMAP3_ISP_IOMEM_H3A, ISPH3A_AFIIRSH); ++ ++ /*Set IIR Filter0 Coefficients */ ++ base_coef_set0 = ISPH3A_AFCOEF010; ++ for (index = 0; index <= 8; index += 2) { ++ coef &= ~COEF_MASK0; ++ coef |= af_dev->config->iir_config.coeff_set0[index]; ++ coef &= ~COEF_MASK1; ++ coef |= af_dev->config->iir_config.coeff_set0[index + 1] << ++ AF_COEF_SHIFT; ++ isp_reg_writel(coef, OMAP3_ISP_IOMEM_H3A, base_coef_set0); ++ base_coef_set0 = base_coef_set0 + AFCOEF_OFFSET; ++ } ++ ++ /* set AFCOEF0010 Register */ ++ isp_reg_writel(af_dev->config->iir_config.coeff_set0[10], ++ OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF010); ++ ++ /*Set IIR Filter1 Coefficients */ ++ ++ base_coef_set1 = ISPH3A_AFCOEF110; ++ for (index = 0; index <= 8; index += 2) { ++ coef &= ~COEF_MASK0; ++ coef |= af_dev->config->iir_config.coeff_set1[index]; ++ coef &= ~COEF_MASK1; ++ coef |= af_dev->config->iir_config.coeff_set1[index + 1] << ++ AF_COEF_SHIFT; ++ isp_reg_writel(coef, OMAP3_ISP_IOMEM_H3A, base_coef_set1); ++ ++ base_coef_set1 = base_coef_set1 + AFCOEF_OFFSET; ++ } ++ isp_reg_writel(af_dev->config->iir_config.coeff_set1[10], ++ OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF1010); ++ ++ return 0; ++} ++ ++/* Function to set address */ ++void isp_af_set_address(unsigned long address) ++{ ++ isp_reg_writel(address, OMAP3_ISP_IOMEM_H3A, ISPH3A_AFBUFST); ++} ++ ++static int isp_af_stats_available(struct isp_af_data *afdata) ++{ ++ int i, ret; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&afstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ DPRINTK_ISP_AF("Checking Stats buff[%d] (%d) for %d\n", ++ i, afstat.af_buff[i].frame_num, ++ afdata->frame_number); ++ if (afdata->frame_number == afstat.af_buff[i].frame_num ++ && afstat.af_buff[i].frame_num != active_buff->frame_num) { ++ afstat.af_buff[i].locked = 1; ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++ isp_af_update_req_buffer(&afstat.af_buff[i]); ++ afstat.af_buff[i].frame_num = 0; ++ ret = copy_to_user((void *)afdata->af_statistics_buf, ++ (void *)afstat.af_buff[i].virt_addr, ++ afstat.curr_cfg_buf_size); ++ if (ret) { ++ printk(KERN_ERR "Failed copy_to_user for " ++ "H3A stats buff, %d\n", ret); ++ } ++ afdata->xtrastats.ts = afstat.af_buff[i].xtrastats.ts; ++ afdata->xtrastats.field_count = ++ afstat.af_buff[i].xtrastats.field_count; ++ return 0; ++ } ++ } ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++ /* Stats unavailable */ ++ ++ return -1; ++} ++ ++void isp_af_notify(int notify) ++{ ++ camnotify = notify; ++ if (camnotify && afstat.initialized) { ++ printk(KERN_DEBUG "Warning Camera Off \n"); ++ afstat.stats_req = 0; ++ afstat.stats_done = 1; ++ wake_up_interruptible(&afstat.stats_wait); ++ } ++} ++EXPORT_SYMBOL(isp_af_notify); ++/* ++ * This API allows the user to update White Balance gains, as well as ++ * exposure time and analog gain. It is also used to request frame ++ * statistics. ++ */ ++int isp_af_request_statistics(struct isp_af_data *afdata) ++{ ++ int ret = 0; ++ u16 frame_diff = 0; ++ u16 frame_cnt = afstat.frame_count; ++ wait_queue_t wqt; ++ ++ if (!af_dev_configptr->config->af_config) { ++ printk(KERN_ERR "AF engine not enabled\n"); ++ return -EINVAL; ++ } ++ ++ if (!(afdata->update & REQUEST_STATISTICS)) { ++ afdata->af_statistics_buf = NULL; ++ goto out; ++ } ++ ++ isp_af_unlock_buffers(); ++ /* Stats available? */ ++ DPRINTK_ISP_AF("Stats available?\n"); ++ ret = isp_af_stats_available(afdata); ++ if (!ret) ++ goto out; ++ ++ /* Stats in near future? */ ++ DPRINTK_ISP_AF("Stats in near future?\n"); ++ if (afdata->frame_number > frame_cnt) ++ frame_diff = afdata->frame_number - frame_cnt; ++ else if (afdata->frame_number < frame_cnt) { ++ if (frame_cnt > MAX_FRAME_COUNT - MAX_FUTURE_FRAMES ++ && afdata->frame_number < MAX_FRAME_COUNT) { ++ frame_diff = afdata->frame_number + MAX_FRAME_COUNT - ++ frame_cnt; ++ } else { ++ /* Frame unavailable */ ++ frame_diff = MAX_FUTURE_FRAMES + 1; ++ } ++ } ++ ++ if (frame_diff > MAX_FUTURE_FRAMES) { ++ printk(KERN_ERR "Invalid frame requested, returning current" ++ " frame stats\n"); ++ afdata->frame_number = frame_cnt; ++ } ++ if (!camnotify) { ++ /* Block until frame in near future completes */ ++ afstat.frame_req = afdata->frame_number; ++ afstat.stats_req = 1; ++ afstat.stats_done = 0; ++ init_waitqueue_entry(&wqt, current); ++ ret = wait_event_interruptible(afstat.stats_wait, ++ afstat.stats_done == 1); ++ if (ret < 0) { ++ afdata->af_statistics_buf = NULL; ++ return ret; ++ } ++ DPRINTK_ISP_AF("ISP AF request status interrupt raised\n"); ++ ++ /* Stats now available */ ++ ret = isp_af_stats_available(afdata); ++ if (ret) { ++ printk(KERN_ERR "After waiting for stats, stats not" ++ " available!!\n"); ++ afdata->af_statistics_buf = NULL; ++ } ++ } ++ ++out: ++ afdata->curr_frame = afstat.frame_count; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_af_request_statistics); ++ ++/* This function will handle the H3A interrupt. */ ++static void isp_af_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ u16 frame_align; ++ ++ if ((H3A_AF_DONE & status) != H3A_AF_DONE) ++ return; ++ ++ /* timestamp stats buffer */ ++ do_gettimeofday(&active_buff->xtrastats.ts); ++ active_buff->config_counter = atomic_read(&afstat.config_counter); ++ ++ /* Exchange buffers */ ++ active_buff = active_buff->next; ++ if (active_buff->locked == 1) ++ active_buff = active_buff->next; ++ isp_af_set_address(active_buff->ispmmu_addr); ++ ++ /* Update frame counter */ ++ afstat.frame_count++; ++ frame_align = afstat.frame_count; ++ if (afstat.frame_count > MAX_FRAME_COUNT) { ++ afstat.frame_count = 1; ++ frame_align++; ++ } ++ active_buff->frame_num = afstat.frame_count; ++ ++ /* Future Stats requested? */ ++ if (afstat.stats_req) { ++ /* Is the frame we want already done? */ ++ if (frame_align >= afstat.frame_req + 1) { ++ afstat.stats_req = 0; ++ afstat.stats_done = 1; ++ wake_up_interruptible(&afstat.stats_wait); ++ } ++ } ++} ++ ++int __isp_af_enable(int enable) ++{ ++ unsigned int pcr; ++ ++ pcr = isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ ++ /* Set AF_EN bit in PCR Register */ ++ if (enable) { ++ if (isp_set_callback(CBK_H3A_AF_DONE, isp_af_isr, ++ (void *)NULL, (void *)NULL)) { ++ printk(KERN_ERR "No callback for AF\n"); ++ return -EINVAL; ++ } ++ ++ pcr |= AF_EN; ++ } else { ++ isp_unset_callback(CBK_H3A_AF_DONE); ++ pcr &= ~AF_EN; ++ } ++ isp_reg_writel(pcr, OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ return 0; ++} ++ ++/* Function to Enable/Disable AF Engine */ ++int isp_af_enable(int enable) ++{ ++ int rval; ++ ++ rval = __isp_af_enable(enable); ++ ++ if (!rval) ++ afstat.pm_state = enable; ++ ++ return rval; ++} ++ ++/* Function to Suspend AF Engine */ ++void isp_af_suspend(void) ++{ ++ if (afstat.pm_state) ++ __isp_af_enable(0); ++} ++ ++/* Function to Resume AF Engine */ ++void isp_af_resume(void) ++{ ++ if (afstat.pm_state) ++ __isp_af_enable(1); ++} ++ ++int isp_af_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR) ++ & ISPH3A_PCR_BUSYAF; ++} ++ ++/* Function to register the AF character device driver. */ ++int __init isp_af_init(void) ++{ ++ /*allocate memory for device structure and initialize it with 0 */ ++ af_dev_configptr = kzalloc(sizeof(struct af_device), GFP_KERNEL); ++ if (!af_dev_configptr) ++ goto err_nomem1; ++ ++ active_buff = NULL; ++ ++ af_dev_configptr->config = (struct af_configuration *) ++ kzalloc(sizeof(struct af_configuration), GFP_KERNEL); ++ ++ if (af_dev_configptr->config == NULL) ++ goto err_nomem2; ++ ++ memset(&afstat, 0, sizeof(afstat)); ++ ++ init_waitqueue_head(&afstat.stats_wait); ++ spin_lock_init(&afstat.buffer_lock); ++ ++ return 0; ++ ++err_nomem2: ++ kfree(af_dev_configptr); ++err_nomem1: ++ printk(KERN_ERR "Error: kmalloc fail"); ++ return -ENOMEM; ++} ++ ++void isp_af_exit(void) ++{ ++ int i; ++ ++ /* Free buffers */ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (!afstat.af_buff[i].phy_addr) ++ continue; ++ ++ ispmmu_kunmap(afstat.af_buff[i].ispmmu_addr); ++ ++ dma_free_coherent(NULL, ++ afstat.min_buf_size, ++ (void *)afstat.af_buff[i].virt_addr, ++ (dma_addr_t)afstat.af_buff[i].phy_addr); ++ } ++ kfree(af_dev_configptr->config); ++ kfree(af_dev_configptr); ++ ++ memset(&afstat, 0, sizeof(afstat)); ++ ++ af_major = -1; ++} +diff --git a/drivers/media/video/isp/isp_af.h b/drivers/media/video/isp/isp_af.h +new file mode 100644 +index 0000000..ee2b89f +--- /dev/null ++++ b/drivers/media/video/isp/isp_af.h +@@ -0,0 +1,125 @@ ++/* ++ * isp_af.h ++ * ++ * Include file for AF module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++/* Device Constants */ ++#ifndef OMAP_ISP_AF_H ++#define OMAP_ISP_AF_H ++ ++#include ++ ++#define AF_MAJOR_NUMBER 0 ++#define ISPAF_NAME "OMAPISP_AF" ++#define AF_NR_DEVS 1 ++#define AF_TIMEOUT ((300 * HZ) / 1000) ++ ++ ++ ++/* Print Macros */ ++/*list of error code */ ++#define AF_ERR_HZ_COUNT 800 /* Invalid Horizontal Count */ ++#define AF_ERR_VT_COUNT 801 /* Invalid Vertical Count */ ++#define AF_ERR_HEIGHT 802 /* Invalid Height */ ++#define AF_ERR_WIDTH 803 /* Invalid width */ ++#define AF_ERR_INCR 804 /* Invalid Increment */ ++#define AF_ERR_HZ_START 805 /* Invalid horizontal Start */ ++#define AF_ERR_VT_START 806 /* Invalud vertical Start */ ++#define AF_ERR_IIRSH 807 /* Invalid IIRSH value */ ++#define AF_ERR_IIR_COEF 808 /* Invalid Coefficient */ ++#define AF_ERR_SETUP 809 /* Setup not done */ ++#define AF_ERR_THRESHOLD 810 /* Invalid Threshold */ ++#define AF_ERR_ENGINE_BUSY 811 /* Engine is busy */ ++ ++#define AFPID 0x0 /* Peripheral Revision ++ * and Class Information ++ */ ++ ++#define AFCOEF_OFFSET 0x00000004 /* COEFFICIENT BASE ++ * ADDRESS ++ */ ++ ++/* ++ * PCR fields ++ */ ++#define AF_BUSYAF (1 << 15) ++#define FVMODE (1 << 14) ++#define RGBPOS (0x7 << 11) ++#define MED_TH (0xFF << 3) ++#define AF_MED_EN (1 << 2) ++#define AF_ALAW_EN (1 << 1) ++#define AF_EN (1 << 0) ++ ++/* ++ * AFPAX1 fields ++ */ ++#define PAXW (0x7F << 16) ++#define PAXH 0x7F ++ ++/* ++ * AFPAX2 fields ++ */ ++#define AFINCV (0xF << 13) ++#define PAXVC (0x7F << 6) ++#define PAXHC 0x3F ++ ++/* ++ * AFPAXSTART fields ++ */ ++#define PAXSH (0xFFF<<16) ++#define PAXSV 0xFFF ++ ++/* ++ * COEFFICIENT MASK ++ */ ++ ++#define COEF_MASK0 0xFFF ++#define COEF_MASK1 (0xFFF<<16) ++ ++/* BIT SHIFTS */ ++#define AF_RGBPOS_SHIFT 11 ++#define AF_MED_TH_SHIFT 3 ++#define AF_PAXW_SHIFT 16 ++#define AF_LINE_INCR_SHIFT 13 ++#define AF_VT_COUNT_SHIFT 6 ++#define AF_HZ_START_SHIFT 16 ++#define AF_COEF_SHIFT 16 ++ ++#define AF_UPDATEXS_TS (1 << 0) ++#define AF_UPDATEXS_FIELDCOUNT (1 << 1) ++#define AF_UPDATEXS_LENSPOS (1 << 2) ++ ++/* Structure for device of AF Engine */ ++struct af_device { ++ struct af_configuration *config; /*Device configuration structure */ ++ int size_paxel; /*Paxel size in bytes */ ++}; ++ ++int isp_af_check_paxel(void); ++int isp_af_check_iir(void); ++int isp_af_register_setup(struct af_device *af_dev); ++int isp_af_enable(int); ++void isp_af_suspend(void); ++void isp_af_resume(void); ++int isp_af_busy(void); ++void isp_af_notify(int notify); ++int isp_af_request_statistics(struct isp_af_data *afdata); ++int isp_af_configure(struct af_configuration *afconfig); ++void isp_af_set_address(unsigned long); ++void isp_af_setxtrastats(struct isp_af_xtrastats *xtrastats, u8 updateflag); ++#endif /* OMAP_ISP_AF_H */ +diff --git a/drivers/media/video/isp/isph3a.c b/drivers/media/video/isp/isph3a.c +new file mode 100644 +index 0000000..7ff1c5b +--- /dev/null ++++ b/drivers/media/video/isp/isph3a.c +@@ -0,0 +1,932 @@ ++/* ++ * isph3a.c ++ * ++ * H3A module for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++ ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isph3a.h" ++#include "ispmmu.h" ++#include "isppreview.h" ++ ++/** ++ * struct isph3a_aewb_buffer - AE, AWB frame stats buffer. ++ * @virt_addr: Virtual address to mmap the buffer. ++ * @phy_addr: Physical address of the buffer. ++ * @addr_align: Virtual Address 32 bytes aligned. ++ * @ispmmu_addr: Address of the buffer mapped by the ISPMMU. ++ * @mmap_addr: Mapped memory area of buffer. For userspace access. ++ * @locked: 1 - Buffer locked from write. 0 - Buffer can be overwritten. ++ * @frame_num: Frame number from which the statistics are taken. ++ * @next: Pointer to link next buffer. ++ */ ++struct isph3a_aewb_buffer { ++ unsigned long virt_addr; ++ unsigned long phy_addr; ++ unsigned long addr_align; ++ unsigned long ispmmu_addr; ++ unsigned long mmap_addr; /* For userspace */ ++ struct timeval ts; ++ u32 config_counter; ++ ++ u8 locked; ++ u16 frame_num; ++ struct isph3a_aewb_buffer *next; ++}; ++ ++/** ++ * struct isph3a_aewb_status - AE, AWB status. ++ * @initialized: 1 - Buffers initialized. ++ * @update: 1 - Update registers. ++ * @stats_req: 1 - Future stats requested. ++ * @stats_done: 1 - Stats ready for user. ++ * @frame_req: Number of frame requested for statistics. ++ * @h3a_buff: Array of statistics buffers to access. ++ * @stats_buf_size: Statistics buffer size. ++ * @min_buf_size: Minimum statisitics buffer size. ++ * @win_count: Window Count. ++ * @frame_count: Frame Count. ++ * @stats_wait: Wait primitive for locking/unlocking the stats request. ++ * @buffer_lock: Spinlock for statistics buffers access. ++ */ ++static struct isph3a_aewb_status { ++ u8 initialized; ++ u8 update; ++ u8 stats_req; ++ u8 stats_done; ++ u16 frame_req; ++ int pm_state; ++ ++ struct isph3a_aewb_buffer h3a_buff[H3A_MAX_BUFF]; ++ unsigned int stats_buf_size; ++ unsigned int min_buf_size; ++ unsigned int curr_cfg_buf_size; ++ ++ atomic_t config_counter; ++ ++ u16 win_count; ++ u32 frame_count; ++ wait_queue_head_t stats_wait; ++ spinlock_t buffer_lock; /* For stats buffers read/write sync */ ++} aewbstat; ++ ++/** ++ * struct isph3a_aewb_regs - Current value of AE, AWB configuration registers. ++ * reg_pcr: Peripheral control register. ++ * reg_win1: Control register. ++ * reg_start: Start position register. ++ * reg_blk: Black line register. ++ * reg_subwin: Configuration register. ++ */ ++static struct isph3a_aewb_regs { ++ u32 reg_pcr; ++ u32 reg_win1; ++ u32 reg_start; ++ u32 reg_blk; ++ u32 reg_subwin; ++} aewb_regs; ++ ++static struct isph3a_aewb_config aewb_config_local = { ++ .saturation_limit = 0x3FF, ++ .win_height = 0, ++ .win_width = 0, ++ .ver_win_count = 0, ++ .hor_win_count = 0, ++ .ver_win_start = 0, ++ .hor_win_start = 0, ++ .blk_ver_win_start = 0, ++ .blk_win_height = 0, ++ .subsample_ver_inc = 0, ++ .subsample_hor_inc = 0, ++ .alaw_enable = 0, ++ .aewb_enable = 0, ++}; ++ ++/* Structure for saving/restoring h3a module registers */ ++static struct isp_reg isph3a_reg_list[] = { ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR, 0}, /* Should be the first one */ ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWWIN1, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINSTART, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINBLK, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWSUBWIN, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWBUFST, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAX1, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAX2, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFPAXSTART, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFIIRSH, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFBUFST, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF010, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF032, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF054, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF076, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF098, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF0010, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF110, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF132, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF154, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF176, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF198, 0}, ++ {OMAP3_ISP_IOMEM_H3A, ISPH3A_AFCOEF1010, 0}, ++ {0, ISP_TOK_TERM, 0} ++}; ++ ++static struct ispprev_wbal h3awb_update; ++static struct isph3a_aewb_buffer *active_buff; ++static struct isph3a_aewb_xtrastats h3a_xtrastats[H3A_MAX_BUFF]; ++static int camnotify; ++static int wb_update; ++static void isph3a_print_status(void); ++ ++/** ++ * isph3a_aewb_setxtrastats - Receives extra statistics from prior frames. ++ * @xtrastats: Pointer to structure containing extra statistics fields like ++ * field count and timestamp of frame. ++ * ++ * Called from update_vbq in camera driver ++ **/ ++void isph3a_aewb_setxtrastats(struct isph3a_aewb_xtrastats *xtrastats) ++{ ++ int i; ++ ++ if (active_buff == NULL) ++ return; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (aewbstat.h3a_buff[i].frame_num != active_buff->frame_num) ++ continue; ++ ++ if (i == 0) { ++ if (aewbstat.h3a_buff[H3A_MAX_BUFF - 1].locked == 0) { ++ h3a_xtrastats[H3A_MAX_BUFF - 1] = ++ *xtrastats; ++ } else { ++ h3a_xtrastats[H3A_MAX_BUFF - 2] = ++ *xtrastats; ++ } ++ } else if (i == 1) { ++ if (aewbstat.h3a_buff[0].locked == 0) ++ h3a_xtrastats[0] = *xtrastats; ++ else { ++ h3a_xtrastats[H3A_MAX_BUFF - 1] = ++ *xtrastats; ++ } ++ } else { ++ if (aewbstat.h3a_buff[i - 1].locked == 0) ++ h3a_xtrastats[i - 1] = *xtrastats; ++ else ++ h3a_xtrastats[i - 2] = *xtrastats; ++ } ++ return; ++ } ++} ++EXPORT_SYMBOL(isph3a_aewb_setxtrastats); ++ ++void __isph3a_aewb_enable(u8 enable) ++{ ++ isp_reg_writel(IRQ0STATUS_H3A_AWB_DONE_IRQ, OMAP3_ISP_IOMEM_MAIN, ++ ISP_IRQ0STATUS); ++ ++ if (enable) { ++ aewb_regs.reg_pcr |= ISPH3A_PCR_AEW_EN; ++ DPRINTK_ISPH3A(" H3A enabled \n"); ++ } else { ++ aewb_regs.reg_pcr &= ~ISPH3A_PCR_AEW_EN; ++ DPRINTK_ISPH3A(" H3A disabled \n"); ++ } ++ isp_reg_and_or(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR, ~ISPH3A_PCR_AEW_EN, ++ (enable ? ISPH3A_PCR_AEW_EN : 0)); ++ aewb_config_local.aewb_enable = enable; ++} ++ ++/** ++ * isph3a_aewb_enable - Enables AE, AWB engine in the H3A module. ++ * @enable: 1 - Enables the AE & AWB engine. ++ * ++ * Client should configure all the AE & AWB registers in H3A before this. ++ **/ ++void isph3a_aewb_enable(u8 enable) ++{ ++ __isph3a_aewb_enable(enable); ++ aewbstat.pm_state = enable; ++} ++ ++/** ++ * isph3a_aewb_suspend - Suspend AE, AWB engine in the H3A module. ++ **/ ++void isph3a_aewb_suspend(void) ++{ ++ if (aewbstat.pm_state) ++ __isph3a_aewb_enable(0); ++} ++ ++/** ++ * isph3a_aewb_resume - Resume AE, AWB engine in the H3A module. ++ **/ ++void isph3a_aewb_resume(void) ++{ ++ if (aewbstat.pm_state) ++ __isph3a_aewb_enable(1); ++} ++ ++int isph3a_aewb_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR) ++ & ISPH3A_PCR_BUSYAEAWB; ++} ++ ++/** ++ * isph3a_update_wb - Updates WB parameters. ++ * ++ * Needs to be called when no ISP Preview processing is taking place. ++ **/ ++void isph3a_update_wb(void) ++{ ++ if (wb_update) { ++ isppreview_config_whitebalance(h3awb_update); ++ wb_update = 0; ++ } ++ return; ++} ++EXPORT_SYMBOL(isph3a_update_wb); ++ ++/** ++ * isph3a_aewb_update_regs - Helper function to update h3a registers. ++ **/ ++static void isph3a_aewb_update_regs(void) ++{ ++ isp_reg_writel(aewb_regs.reg_pcr, OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR); ++ isp_reg_writel(aewb_regs.reg_win1, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWWIN1); ++ isp_reg_writel(aewb_regs.reg_start, OMAP3_ISP_IOMEM_H3A, ++ ISPH3A_AEWINSTART); ++ isp_reg_writel(aewb_regs.reg_blk, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINBLK); ++ isp_reg_writel(aewb_regs.reg_subwin, OMAP3_ISP_IOMEM_H3A, ++ ISPH3A_AEWSUBWIN); ++ ++ aewbstat.update = 0; ++ aewbstat.frame_count = 1; ++} ++ ++/** ++ * isph3a_aewb_update_req_buffer - Helper function to update buffer cache pages ++ * @buffer: Pointer to structure ++ **/ ++static void isph3a_aewb_update_req_buffer(struct isph3a_aewb_buffer *buffer) ++{ ++ int size = aewbstat.stats_buf_size; ++ ++ size = PAGE_ALIGN(size); ++ dmac_inv_range((void *)buffer->addr_align, ++ (void *)buffer->addr_align + size); ++} ++ ++/** ++ * isph3a_aewb_stats_available - Check for stats available of specified frame. ++ * @aewbdata: Pointer to return AE AWB statistics data ++ * ++ * Returns 0 if successful, or -1 if statistics are unavailable. ++ **/ ++static int isph3a_aewb_stats_available(struct isph3a_aewb_data *aewbdata) ++{ ++ int i, ret; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&aewbstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ DPRINTK_ISPH3A("Checking Stats buff[%d] (%d) for %d\n", ++ i, aewbstat.h3a_buff[i].frame_num, ++ aewbdata->frame_number); ++ if ((aewbdata->frame_number != ++ aewbstat.h3a_buff[i].frame_num) || ++ (aewbstat.h3a_buff[i].frame_num == ++ active_buff->frame_num)) ++ continue; ++ aewbstat.h3a_buff[i].locked = 1; ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++ isph3a_aewb_update_req_buffer(&aewbstat.h3a_buff[i]); ++ aewbstat.h3a_buff[i].frame_num = 0; ++ ret = copy_to_user((void *)aewbdata->h3a_aewb_statistics_buf, ++ (void *)aewbstat.h3a_buff[i].virt_addr, ++ aewbstat.curr_cfg_buf_size); ++ if (ret) { ++ printk(KERN_ERR "Failed copy_to_user for " ++ "H3A stats buff, %d\n", ret); ++ } ++ aewbdata->ts = aewbstat.h3a_buff[i].ts; ++ aewbdata->config_counter = aewbstat.h3a_buff[i].config_counter; ++ aewbdata->field_count = h3a_xtrastats[i].field_count; ++ return 0; ++ } ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++ ++ return -1; ++} ++ ++/** ++ * isph3a_aewb_link_buffers - Helper function to link allocated buffers. ++ **/ ++static void isph3a_aewb_link_buffers(void) ++{ ++ int i; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((i + 1) < H3A_MAX_BUFF) { ++ aewbstat.h3a_buff[i].next = &aewbstat.h3a_buff[i + 1]; ++ h3a_xtrastats[i].next = &h3a_xtrastats[i + 1]; ++ } else { ++ aewbstat.h3a_buff[i].next = &aewbstat.h3a_buff[0]; ++ h3a_xtrastats[i].next = &h3a_xtrastats[0]; ++ } ++ } ++} ++ ++/** ++ * isph3a_aewb_unlock_buffers - Helper function to unlock all buffers. ++ **/ ++static void isph3a_aewb_unlock_buffers(void) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&aewbstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) ++ aewbstat.h3a_buff[i].locked = 0; ++ ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++} ++ ++/** ++ * isph3a_aewb_isr - Callback from ISP driver for H3A AEWB interrupt. ++ * @status: IRQ0STATUS in case of MMU error, 0 for H3A interrupt. ++ * @arg1: Not used as of now. ++ * @arg2: Not used as of now. ++ */ ++static void isph3a_aewb_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ u16 frame_align; ++ ++ if ((H3A_AWB_DONE & status) != H3A_AWB_DONE) ++ return; ++ ++ do_gettimeofday(&active_buff->ts); ++ active_buff->config_counter = atomic_read(&aewbstat.config_counter); ++ active_buff = active_buff->next; ++ if (active_buff->locked == 1) ++ active_buff = active_buff->next; ++ isp_reg_writel(active_buff->ispmmu_addr, OMAP3_ISP_IOMEM_H3A, ++ ISPH3A_AEWBUFST); ++ ++ aewbstat.frame_count++; ++ frame_align = aewbstat.frame_count; ++ if (aewbstat.frame_count > MAX_FRAME_COUNT) { ++ aewbstat.frame_count = 1; ++ frame_align++; ++ } ++ active_buff->frame_num = aewbstat.frame_count; ++ ++ if (aewbstat.stats_req) { ++ DPRINTK_ISPH3A("waiting for frame %d\n", aewbstat.frame_req); ++ if (frame_align >= aewbstat.frame_req + 1) { ++ aewbstat.stats_req = 0; ++ aewbstat.stats_done = 1; ++ wake_up_interruptible(&aewbstat.stats_wait); ++ } ++ } ++ ++ if (aewbstat.update) ++ isph3a_aewb_update_regs(); ++} ++ ++/** ++ * isph3a_aewb_set_params - Helper function to check & store user given params. ++ * @user_cfg: Pointer to AE and AWB parameters struct. ++ * ++ * As most of them are busy-lock registers, need to wait until AEW_BUSY = 0 to ++ * program them during ISR. ++ * ++ * Returns 0 if successful, or -EINVAL if any of the parameters are invalid. ++ **/ ++static int isph3a_aewb_set_params(struct isph3a_aewb_config *user_cfg) ++{ ++ if (unlikely(user_cfg->saturation_limit > MAX_SATURATION_LIM)) { ++ printk(KERN_ERR "Invalid Saturation_limit: %d\n", ++ user_cfg->saturation_limit); ++ return -EINVAL; ++ } ++ if (aewb_config_local.saturation_limit != user_cfg->saturation_limit) { ++ WRITE_SAT_LIM(aewb_regs.reg_pcr, user_cfg->saturation_limit); ++ aewb_config_local.saturation_limit = ++ user_cfg->saturation_limit; ++ aewbstat.update = 1; ++ } ++ ++ if (aewb_config_local.alaw_enable != user_cfg->alaw_enable) { ++ WRITE_ALAW(aewb_regs.reg_pcr, user_cfg->alaw_enable); ++ aewb_config_local.alaw_enable = user_cfg->alaw_enable; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->win_height < MIN_WIN_H || ++ user_cfg->win_height > MAX_WIN_H || ++ user_cfg->win_height & 0x01)) { ++ printk(KERN_ERR "Invalid window height: %d\n", ++ user_cfg->win_height); ++ return -EINVAL; ++ } ++ if (aewb_config_local.win_height != user_cfg->win_height) { ++ WRITE_WIN_H(aewb_regs.reg_win1, user_cfg->win_height); ++ aewb_config_local.win_height = user_cfg->win_height; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->win_width < MIN_WIN_W || ++ user_cfg->win_width > MAX_WIN_W || ++ user_cfg->win_width & 0x01)) { ++ printk(KERN_ERR "Invalid window width: %d\n", ++ user_cfg->win_width); ++ return -EINVAL; ++ } ++ if (aewb_config_local.win_width != user_cfg->win_width) { ++ WRITE_WIN_W(aewb_regs.reg_win1, user_cfg->win_width); ++ aewb_config_local.win_width = user_cfg->win_width; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->ver_win_count < 1 || ++ user_cfg->ver_win_count > MAX_WINVC)) { ++ printk(KERN_ERR "Invalid vertical window count: %d\n", ++ user_cfg->ver_win_count); ++ return -EINVAL; ++ } ++ if (aewb_config_local.ver_win_count != user_cfg->ver_win_count) { ++ WRITE_VER_C(aewb_regs.reg_win1, user_cfg->ver_win_count); ++ aewb_config_local.ver_win_count = user_cfg->ver_win_count; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->hor_win_count < 1 || ++ user_cfg->hor_win_count > MAX_WINHC)) { ++ printk(KERN_ERR "Invalid horizontal window count: %d\n", ++ user_cfg->hor_win_count); ++ return -EINVAL; ++ } ++ if (aewb_config_local.hor_win_count != user_cfg->hor_win_count) { ++ WRITE_HOR_C(aewb_regs.reg_win1, user_cfg->hor_win_count); ++ aewb_config_local.hor_win_count = user_cfg->hor_win_count; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->ver_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid vertical window start: %d\n", ++ user_cfg->ver_win_start); ++ return -EINVAL; ++ } ++ if (aewb_config_local.ver_win_start != user_cfg->ver_win_start) { ++ WRITE_VER_WIN_ST(aewb_regs.reg_start, user_cfg->ver_win_start); ++ aewb_config_local.ver_win_start = user_cfg->ver_win_start; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->hor_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid horizontal window start: %d\n", ++ user_cfg->hor_win_start); ++ return -EINVAL; ++ } ++ if (aewb_config_local.hor_win_start != user_cfg->hor_win_start) { ++ WRITE_HOR_WIN_ST(aewb_regs.reg_start, user_cfg->hor_win_start); ++ aewb_config_local.hor_win_start = user_cfg->hor_win_start; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->blk_ver_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid black vertical window start: %d\n", ++ user_cfg->blk_ver_win_start); ++ return -EINVAL; ++ } ++ if (aewb_config_local.blk_ver_win_start != ++ user_cfg->blk_ver_win_start) { ++ WRITE_BLK_VER_WIN_ST(aewb_regs.reg_blk, ++ user_cfg->blk_ver_win_start); ++ aewb_config_local.blk_ver_win_start = ++ user_cfg->blk_ver_win_start; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->blk_win_height < MIN_WIN_H || ++ user_cfg->blk_win_height > MAX_WIN_H || ++ user_cfg->blk_win_height & 0x01)) { ++ printk(KERN_ERR "Invalid black window height: %d\n", ++ user_cfg->blk_win_height); ++ return -EINVAL; ++ } ++ if (aewb_config_local.blk_win_height != user_cfg->blk_win_height) { ++ WRITE_BLK_WIN_H(aewb_regs.reg_blk, user_cfg->blk_win_height); ++ aewb_config_local.blk_win_height = user_cfg->blk_win_height; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->subsample_ver_inc < MIN_SUB_INC || ++ user_cfg->subsample_ver_inc > MAX_SUB_INC || ++ user_cfg->subsample_ver_inc & 0x01)) { ++ printk(KERN_ERR "Invalid vertical subsample increment: %d\n", ++ user_cfg->subsample_ver_inc); ++ return -EINVAL; ++ } ++ if (aewb_config_local.subsample_ver_inc != ++ user_cfg->subsample_ver_inc) { ++ WRITE_SUB_VER_INC(aewb_regs.reg_subwin, ++ user_cfg->subsample_ver_inc); ++ aewb_config_local.subsample_ver_inc = ++ user_cfg->subsample_ver_inc; ++ aewbstat.update = 1; ++ } ++ ++ if (unlikely(user_cfg->subsample_hor_inc < MIN_SUB_INC || ++ user_cfg->subsample_hor_inc > MAX_SUB_INC || ++ user_cfg->subsample_hor_inc & 0x01)) { ++ printk(KERN_ERR "Invalid horizontal subsample increment: %d\n", ++ user_cfg->subsample_hor_inc); ++ return -EINVAL; ++ } ++ if (aewb_config_local.subsample_hor_inc != ++ user_cfg->subsample_hor_inc) { ++ WRITE_SUB_HOR_INC(aewb_regs.reg_subwin, ++ user_cfg->subsample_hor_inc); ++ aewb_config_local.subsample_hor_inc = ++ user_cfg->subsample_hor_inc; ++ aewbstat.update = 1; ++ } ++ ++ if (!aewbstat.initialized || !aewb_config_local.aewb_enable) { ++ isph3a_aewb_update_regs(); ++ aewbstat.initialized = 1; ++ } ++ return 0; ++} ++ ++/** ++ * isph3a_aewb_configure - Configure AEWB regs, enable/disable H3A engine. ++ * @aewbcfg: Pointer to AEWB config structure. ++ * ++ * Returns 0 if successful, -EINVAL if aewbcfg pointer is NULL, -ENOMEM if ++ * was unable to allocate memory for the buffer, of other errors if H3A ++ * callback is not set or the parameters for AEWB are invalid. ++ **/ ++int isph3a_aewb_configure(struct isph3a_aewb_config *aewbcfg) ++{ ++ int ret = 0; ++ int i; ++ int win_count = 0; ++ ++ if (NULL == aewbcfg) { ++ printk(KERN_ERR "Null argument in configuration. \n"); ++ return -EINVAL; ++ } ++ ++ if (!aewbstat.initialized) { ++ DPRINTK_ISPH3A("Setting callback for H3A\n"); ++ ret = isp_set_callback(CBK_H3A_AWB_DONE, isph3a_aewb_isr, ++ (void *)NULL, (void *)NULL); ++ if (ret) { ++ printk(KERN_ERR "No callback for H3A\n"); ++ return ret; ++ } ++ } ++ ++ ret = isph3a_aewb_set_params(aewbcfg); ++ if (ret) { ++ printk(KERN_ERR "Invalid parameters! \n"); ++ return ret; ++ } ++ ++ win_count = aewbcfg->ver_win_count * aewbcfg->hor_win_count; ++ win_count += aewbcfg->hor_win_count; ++ ret = win_count / 8; ++ win_count += win_count % 8 ? 1 : 0; ++ win_count += ret; ++ ++ aewbstat.win_count = win_count; ++ aewbstat.curr_cfg_buf_size = win_count * AEWB_PACKET_SIZE; ++ ++ if (aewbstat.stats_buf_size ++ && win_count * AEWB_PACKET_SIZE > aewbstat.stats_buf_size) { ++ DPRINTK_ISPH3A("There was a previous buffer... " ++ "Freeing/unmapping current stat busffs\n"); ++ isph3a_aewb_enable(0); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ ispmmu_kunmap(aewbstat.h3a_buff[i].ispmmu_addr); ++ dma_free_coherent( ++ NULL, ++ aewbstat.min_buf_size, ++ (void *)aewbstat.h3a_buff[i].virt_addr, ++ (dma_addr_t)aewbstat.h3a_buff[i].phy_addr); ++ aewbstat.h3a_buff[i].virt_addr = 0; ++ } ++ aewbstat.stats_buf_size = 0; ++ } ++ ++ if (!aewbstat.h3a_buff[0].virt_addr) { ++ aewbstat.stats_buf_size = win_count * AEWB_PACKET_SIZE; ++ aewbstat.min_buf_size = PAGE_ALIGN(aewbstat.stats_buf_size); ++ ++ DPRINTK_ISPH3A("Allocating/mapping new stat buffs\n"); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ aewbstat.h3a_buff[i].virt_addr = ++ (unsigned long)dma_alloc_coherent( ++ NULL, ++ aewbstat.min_buf_size, ++ (dma_addr_t *) ++ &aewbstat.h3a_buff[i].phy_addr, ++ GFP_KERNEL | GFP_DMA); ++ if (aewbstat.h3a_buff[i].virt_addr == 0) { ++ printk(KERN_ERR "Can't acquire memory for " ++ "buffer[%d]\n", i); ++ return -ENOMEM; ++ } ++ aewbstat.h3a_buff[i].addr_align = ++ aewbstat.h3a_buff[i].virt_addr; ++ while ((aewbstat.h3a_buff[i].addr_align & 0xFFFFFFC0) != ++ aewbstat.h3a_buff[i].addr_align) ++ aewbstat.h3a_buff[i].addr_align++; ++ aewbstat.h3a_buff[i].ispmmu_addr = ++ ispmmu_kmap(aewbstat.h3a_buff[i].phy_addr, ++ aewbstat.min_buf_size); ++ } ++ isph3a_aewb_unlock_buffers(); ++ isph3a_aewb_link_buffers(); ++ ++ if (active_buff == NULL) ++ active_buff = &aewbstat.h3a_buff[0]; ++ ++ isp_reg_writel(active_buff->ispmmu_addr, OMAP3_ISP_IOMEM_H3A, ++ ISPH3A_AEWBUFST); ++ } ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ DPRINTK_ISPH3A("buff[%d] addr is:\n virt 0x%lX\n" ++ " aligned 0x%lX\n" ++ " phys 0x%lX\n" ++ " ispmmu 0x%08lX\n" ++ " mmapped 0x%lX\n" ++ " frame_num %d\n", i, ++ aewbstat.h3a_buff[i].virt_addr, ++ aewbstat.h3a_buff[i].addr_align, ++ aewbstat.h3a_buff[i].phy_addr, ++ aewbstat.h3a_buff[i].ispmmu_addr, ++ aewbstat.h3a_buff[i].mmap_addr, ++ aewbstat.h3a_buff[i].frame_num); ++ } ++ ++ active_buff->frame_num = 1; ++ ++ atomic_inc(&aewbstat.config_counter); ++ isph3a_aewb_enable(aewbcfg->aewb_enable); ++ isph3a_print_status(); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isph3a_aewb_configure); ++ ++/** ++ * isph3a_aewb_request_statistics - REquest statistics and update gains in AEWB ++ * @aewbdata: Pointer to return AE AWB statistics data. ++ * ++ * This API allows the user to update White Balance gains, as well as ++ * exposure time and analog gain. It is also used to request frame ++ * statistics. ++ * ++ * Returns 0 if successful, -EINVAL when H3A engine is not enabled, or other ++ * errors when setting gains. ++ **/ ++int isph3a_aewb_request_statistics(struct isph3a_aewb_data *aewbdata) ++{ ++ int ret = 0; ++ u16 frame_diff = 0; ++ u16 frame_cnt = aewbstat.frame_count; ++ wait_queue_t wqt; ++ ++ if (!aewb_config_local.aewb_enable) { ++ printk(KERN_ERR "H3A engine not enabled\n"); ++ return -EINVAL; ++ } ++ ++ DPRINTK_ISPH3A("isph3a_aewb_request_statistics: Enter " ++ "(frame req. => %d, current frame => %d," ++ "update => %d)\n", ++ aewbdata->frame_number, frame_cnt, aewbdata->update); ++ DPRINTK_ISPH3A("User data received: \n"); ++ DPRINTK_ISPH3A("Digital gain = 0x%04x\n", aewbdata->dgain); ++ DPRINTK_ISPH3A("WB gain b *= 0x%04x\n", aewbdata->wb_gain_b); ++ DPRINTK_ISPH3A("WB gain r *= 0x%04x\n", aewbdata->wb_gain_r); ++ DPRINTK_ISPH3A("WB gain gb = 0x%04x\n", aewbdata->wb_gain_gb); ++ DPRINTK_ISPH3A("WB gain gr = 0x%04x\n", aewbdata->wb_gain_gr); ++ ++ if (!aewbdata->update) { ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ goto out; ++ } ++ if (aewbdata->update & SET_DIGITAL_GAIN) ++ h3awb_update.dgain = (u16)aewbdata->dgain; ++ if (aewbdata->update & SET_COLOR_GAINS) { ++ h3awb_update.coef0 = (u8)aewbdata->wb_gain_gr; ++ h3awb_update.coef1 = (u8)aewbdata->wb_gain_r; ++ h3awb_update.coef2 = (u8)aewbdata->wb_gain_b; ++ h3awb_update.coef3 = (u8)aewbdata->wb_gain_gb; ++ } ++ if (aewbdata->update & (SET_COLOR_GAINS | SET_DIGITAL_GAIN)) ++ wb_update = 1; ++ ++ if (!(aewbdata->update & REQUEST_STATISTICS)) { ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ goto out; ++ } ++ ++ if (aewbdata->frame_number < 1) { ++ printk(KERN_ERR "Illeagal frame number " ++ "requested (%d)\n", ++ aewbdata->frame_number); ++ return -EINVAL; ++ } ++ ++ isph3a_aewb_unlock_buffers(); ++ ++ DPRINTK_ISPH3A("Stats available?\n"); ++ ret = isph3a_aewb_stats_available(aewbdata); ++ if (!ret) ++ goto out; ++ ++ DPRINTK_ISPH3A("Stats in near future?\n"); ++ if (aewbdata->frame_number > frame_cnt) ++ frame_diff = aewbdata->frame_number - frame_cnt; ++ else if (aewbdata->frame_number < frame_cnt) { ++ if ((frame_cnt > (MAX_FRAME_COUNT - MAX_FUTURE_FRAMES)) && ++ (aewbdata->frame_number < MAX_FRAME_COUNT)) { ++ frame_diff = aewbdata->frame_number + MAX_FRAME_COUNT - ++ frame_cnt; ++ } else ++ frame_diff = MAX_FUTURE_FRAMES + 1; ++ } ++ ++ if (frame_diff > MAX_FUTURE_FRAMES) { ++ printk(KERN_ERR "Invalid frame requested, returning current" ++ " frame stats\n"); ++ aewbdata->frame_number = frame_cnt; ++ } ++ if (camnotify) { ++ DPRINTK_ISPH3A("NOT Waiting on stats IRQ for frame %d " ++ "because camnotify set\n", ++ aewbdata->frame_number); ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ goto out; ++ } ++ DPRINTK_ISPH3A("Waiting on stats IRQ for frame %d\n", ++ aewbdata->frame_number); ++ aewbstat.frame_req = aewbdata->frame_number; ++ aewbstat.stats_req = 1; ++ aewbstat.stats_done = 0; ++ init_waitqueue_entry(&wqt, current); ++ ret = wait_event_interruptible(aewbstat.stats_wait, ++ aewbstat.stats_done == 1); ++ if (ret < 0) { ++ printk(KERN_ERR "isph3a_aewb_request_statistics" ++ " Error on wait event %d\n", ret); ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ return ret; ++ } ++ ++ DPRINTK_ISPH3A("ISP AEWB request status interrupt raised\n"); ++ ret = isph3a_aewb_stats_available(aewbdata); ++ if (ret) { ++ DPRINTK_ISPH3A("After waiting for stats," ++ " stats not available!!\n"); ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ } ++out: ++ DPRINTK_ISPH3A("isph3a_aewb_request_statistics: " ++ "aewbdata->h3a_aewb_statistics_buf => %p\n", ++ aewbdata->h3a_aewb_statistics_buf); ++ aewbdata->curr_frame = aewbstat.frame_count; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isph3a_aewb_request_statistics); ++ ++/** ++ * isph3a_aewb_init - Module Initialisation. ++ * ++ * Always returns 0. ++ **/ ++int __init isph3a_aewb_init(void) ++{ ++ memset(&aewbstat, 0, sizeof(aewbstat)); ++ memset(&aewb_regs, 0, sizeof(aewb_regs)); ++ ++ init_waitqueue_head(&aewbstat.stats_wait); ++ spin_lock_init(&aewbstat.buffer_lock); ++ return 0; ++} ++ ++/** ++ * isph3a_aewb_cleanup - Module exit. ++ **/ ++void isph3a_aewb_cleanup(void) ++{ ++ int i; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (!aewbstat.h3a_buff[i].phy_addr) ++ continue; ++ ++ ispmmu_kunmap(aewbstat.h3a_buff[i].ispmmu_addr); ++ dma_free_coherent(NULL, ++ aewbstat.min_buf_size, ++ (void *)aewbstat.h3a_buff[i].virt_addr, ++ (dma_addr_t)aewbstat.h3a_buff[i].phy_addr); ++ } ++ memset(&aewbstat, 0, sizeof(aewbstat)); ++ memset(&aewb_regs, 0, sizeof(aewb_regs)); ++} ++ ++/** ++ * isph3a_print_status - Debug print. Values of H3A related registers. ++ **/ ++static void isph3a_print_status(void) ++{ ++ DPRINTK_ISPH3A("ISPH3A_PCR = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR)); ++ DPRINTK_ISPH3A("ISPH3A_AEWWIN1 = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWWIN1)); ++ DPRINTK_ISPH3A("ISPH3A_AEWINSTART = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINSTART)); ++ DPRINTK_ISPH3A("ISPH3A_AEWINBLK = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINBLK)); ++ DPRINTK_ISPH3A("ISPH3A_AEWSUBWIN = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWSUBWIN)); ++ DPRINTK_ISPH3A("ISPH3A_AEWBUFST = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWBUFST)); ++ DPRINTK_ISPH3A("stats windows = %d\n", aewbstat.win_count); ++ DPRINTK_ISPH3A("stats buff size = %d\n", aewbstat.stats_buf_size); ++ DPRINTK_ISPH3A("currently configured stats buff size = %d\n", ++ aewbstat.curr_cfg_buf_size); ++} ++ ++/** ++ * isph3a_notify - Unblocks user request for statistics when camera is off ++ * @notify: 1 - Camera is turned off ++ * ++ * Used when the user has requested statistics about a future frame, but the ++ * camera is turned off before it happens, and this function unblocks the ++ * request so the user can continue in its program. ++ **/ ++void isph3a_notify(int notify) ++{ ++ camnotify = notify; ++ if (camnotify && aewbstat.initialized) { ++ printk(KERN_DEBUG "Warning Camera Off \n"); ++ aewbstat.stats_req = 0; ++ aewbstat.stats_done = 1; ++ wake_up_interruptible(&aewbstat.stats_wait); ++ } ++} ++EXPORT_SYMBOL(isph3a_notify); ++ ++/** ++ * isph3a_save_context - Saves the values of the h3a module registers. ++ **/ ++void isph3a_save_context(void) ++{ ++ DPRINTK_ISPH3A(" Saving context\n"); ++ isp_save_context(isph3a_reg_list); ++ /* Avoid enable during restore ctx */ ++ isph3a_reg_list[0].val &= ~ISPH3A_PCR_AEW_EN; ++} ++EXPORT_SYMBOL(isph3a_save_context); ++ ++/** ++ * isph3a_restore_context - Restores the values of the h3a module registers. ++ **/ ++void isph3a_restore_context(void) ++{ ++ DPRINTK_ISPH3A(" Restoring context\n"); ++ isp_restore_context(isph3a_reg_list); ++} ++EXPORT_SYMBOL(isph3a_restore_context); +diff --git a/drivers/media/video/isp/isph3a.h b/drivers/media/video/isp/isph3a.h +new file mode 100644 +index 0000000..7d4c765 +--- /dev/null ++++ b/drivers/media/video/isp/isph3a.h +@@ -0,0 +1,127 @@ ++/* ++ * isph3a.h ++ * ++ * Include file for H3A module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_H3A_H ++#define OMAP_ISP_H3A_H ++ ++#include ++ ++#define AEWB_PACKET_SIZE 16 ++#define H3A_MAX_BUFF 5 ++ ++/* Flags for changed registers */ ++#define PCR_CHNG (1 << 0) ++#define AEWWIN1_CHNG (1 << 1) ++#define AEWINSTART_CHNG (1 << 2) ++#define AEWINBLK_CHNG (1 << 3) ++#define AEWSUBWIN_CHNG (1 << 4) ++#define PRV_WBDGAIN_CHNG (1 << 5) ++#define PRV_WBGAIN_CHNG (1 << 6) ++ ++/* ISPH3A REGISTERS bits */ ++#define ISPH3A_PCR_AF_EN (1 << 0) ++#define ISPH3A_PCR_AF_ALAW_EN (1 << 1) ++#define ISPH3A_PCR_AF_MED_EN (1 << 2) ++#define ISPH3A_PCR_AF_BUSY (1 << 15) ++#define ISPH3A_PCR_AEW_EN (1 << 16) ++#define ISPH3A_PCR_AEW_ALAW_EN (1 << 17) ++#define ISPH3A_PCR_AEW_BUSY (1 << 18) ++ ++#define WRITE_SAT_LIM(reg, sat_limit) \ ++ (reg = (reg & (~(ISPH3A_PCR_AEW_AVE2LMT_MASK))) \ ++ | (sat_limit << ISPH3A_PCR_AEW_AVE2LMT_SHIFT)) ++ ++#define WRITE_ALAW(reg, alaw_en) \ ++ (reg = (reg & (~(ISPH3A_PCR_AEW_ALAW_EN))) \ ++ | ((alaw_en & ISPH3A_PCR_AF_ALAW_EN) \ ++ << ISPH3A_PCR_AEW_ALAW_EN_SHIFT)) ++ ++#define WRITE_WIN_H(reg, height) \ ++ (reg = (reg & (~(ISPH3A_AEWWIN1_WINH_MASK))) \ ++ | (((height >> 1) - 1) << ISPH3A_AEWWIN1_WINH_SHIFT)) ++ ++#define WRITE_WIN_W(reg, width) \ ++ (reg = (reg & (~(ISPH3A_AEWWIN1_WINW_MASK))) \ ++ | (((width >> 1) - 1) << ISPH3A_AEWWIN1_WINW_SHIFT)) ++ ++#define WRITE_VER_C(reg, ver_count) \ ++ (reg = (reg & ~(ISPH3A_AEWWIN1_WINVC_MASK)) \ ++ | ((ver_count - 1) << ISPH3A_AEWWIN1_WINVC_SHIFT)) ++ ++#define WRITE_HOR_C(reg, hor_count) \ ++ (reg = (reg & ~(ISPH3A_AEWWIN1_WINHC_MASK)) \ ++ | ((hor_count - 1) << ISPH3A_AEWWIN1_WINHC_SHIFT)) ++ ++#define WRITE_VER_WIN_ST(reg, ver_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINSTART_WINSV_MASK)) \ ++ | (ver_win_st << ISPH3A_AEWINSTART_WINSV_SHIFT)) ++ ++#define WRITE_HOR_WIN_ST(reg, hor_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINSTART_WINSH_MASK)) \ ++ | (hor_win_st << ISPH3A_AEWINSTART_WINSH_SHIFT)) ++ ++#define WRITE_BLK_VER_WIN_ST(reg, blk_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINBLK_WINSV_MASK)) \ ++ | (blk_win_st << ISPH3A_AEWINBLK_WINSV_SHIFT)) ++ ++#define WRITE_BLK_WIN_H(reg, height) \ ++ (reg = (reg & ~(ISPH3A_AEWINBLK_WINH_MASK)) \ ++ | (((height >> 1) - 1) << ISPH3A_AEWINBLK_WINH_SHIFT)) ++ ++#define WRITE_SUB_VER_INC(reg, sub_ver_inc) \ ++ (reg = (reg & ~(ISPH3A_AEWSUBWIN_AEWINCV_MASK)) \ ++ | (((sub_ver_inc >> 1) - 1) << ISPH3A_AEWSUBWIN_AEWINCV_SHIFT)) ++ ++#define WRITE_SUB_HOR_INC(reg, sub_hor_inc) \ ++ (reg = (reg & ~(ISPH3A_AEWSUBWIN_AEWINCH_MASK)) \ ++ | (((sub_hor_inc >> 1) - 1) << ISPH3A_AEWSUBWIN_AEWINCH_SHIFT)) ++ ++/** ++ * struct isph3a_aewb_xtrastats - Structure with extra statistics sent by cam. ++ * @field_count: Sequence number of returned framestats. ++ * @isph3a_aewb_xtrastats: Pointer to next buffer with extra stats. ++ */ ++struct isph3a_aewb_xtrastats { ++ unsigned long field_count; ++ struct isph3a_aewb_xtrastats *next; ++}; ++ ++void isph3a_aewb_setxtrastats(struct isph3a_aewb_xtrastats *xtrastats); ++ ++int isph3a_aewb_configure(struct isph3a_aewb_config *aewbcfg); ++ ++int isph3a_aewb_request_statistics(struct isph3a_aewb_data *aewbdata); ++ ++void isph3a_save_context(void); ++ ++void isph3a_restore_context(void); ++ ++void isph3a_aewb_enable(u8 enable); ++ ++int isph3a_aewb_busy(void); ++ ++void isph3a_aewb_suspend(void); ++ ++void isph3a_aewb_resume(void); ++ ++void isph3a_update_wb(void); ++ ++void isph3a_notify(int notify); ++#endif /* OMAP_ISP_H3A_H */ +diff --git a/drivers/media/video/isp/isphist.c b/drivers/media/video/isp/isphist.c +new file mode 100644 +index 0000000..c6f6a77 +--- /dev/null ++++ b/drivers/media/video/isp/isphist.c +@@ -0,0 +1,608 @@ ++/* ++ * isphist.c ++ * ++ * HISTOGRAM module for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isphist.h" ++#include "ispmmu.h" ++ ++/** ++ * struct isp_hist_status - Histogram status. ++ * @hist_enable: Enables the histogram module. ++ * @initialized: Flag to indicate that the module is correctly initializated. ++ * @frame_cnt: Actual frame count. ++ * @frame_req: Frame requested by user. ++ * @completed: Flag to indicate if a frame request is completed. ++ */ ++struct isp_hist_status { ++ u8 hist_enable; ++ u8 pm_state; ++ u8 initialized; ++ u8 frame_cnt; ++ u8 frame_req; ++ u8 completed; ++} histstat; ++ ++/** ++ * struct isp_hist_buffer - Frame histogram buffer. ++ * @virt_addr: Virtual address to mmap the buffer. ++ * @phy_addr: Physical address of the buffer. ++ * @addr_align: Virtual Address 32 bytes aligned. ++ * @ispmmu_addr: Address of the buffer mapped by the ISPMMU. ++ * @mmap_addr: Mapped memory area of buffer. For userspace access. ++ */ ++struct isp_hist_buffer { ++ unsigned long virt_addr; ++ unsigned long phy_addr; ++ unsigned long addr_align; ++ unsigned long ispmmu_addr; ++ unsigned long mmap_addr; ++} hist_buff; ++ ++/** ++ * struct isp_hist_regs - Current value of Histogram configuration registers. ++ * @reg_pcr: Peripheral control register. ++ * @reg_cnt: Histogram control register. ++ * @reg_wb_gain: Histogram white balance gain register. ++ * @reg_r0_h: Region 0 horizontal register. ++ * @reg_r0_v: Region 0 vertical register. ++ * @reg_r1_h: Region 1 horizontal register. ++ * @reg_r1_v: Region 1 vertical register. ++ * @reg_r2_h: Region 2 horizontal register. ++ * @reg_r2_v: Region 2 vertical register. ++ * @reg_r3_h: Region 3 horizontal register. ++ * @reg_r3_v: Region 3 vertical register. ++ * @reg_hist_addr: Histogram address register. ++ * @reg_hist_data: Histogram data. ++ * @reg_hist_radd: Address register. When input data comes from mem. ++ * @reg_hist_radd_off: Address offset register. When input data comes from mem. ++ * @reg_h_v_info: Image size register. When input data comes from mem. ++ */ ++static struct isp_hist_regs { ++ u32 reg_pcr; ++ u32 reg_cnt; ++ u32 reg_wb_gain; ++ u32 reg_r0_h; ++ u32 reg_r0_v; ++ u32 reg_r1_h; ++ u32 reg_r1_v; ++ u32 reg_r2_h; ++ u32 reg_r2_v; ++ u32 reg_r3_h; ++ u32 reg_r3_v; ++ u32 reg_hist_addr; ++ u32 reg_hist_data; ++ u32 reg_hist_radd; ++ u32 reg_hist_radd_off; ++ u32 reg_h_v_info; ++} hist_regs; ++ ++/* Structure for saving/restoring histogram module registers */ ++struct isp_reg isphist_reg_list[] = { ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_WB_GAIN, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R0_HORZ, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R0_VERT, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R1_HORZ, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R1_VERT, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R2_HORZ, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R2_VERT, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R3_HORZ, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_R3_VERT, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_ADDR, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_RADD, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_RADD_OFF, 0}, ++ {OMAP3_ISP_IOMEM_HIST, ISPHIST_H_V_INFO, 0}, ++ {0, ISP_TOK_TERM, 0} ++}; ++ ++static void isp_hist_print_status(void); ++ ++void __isp_hist_enable(u8 enable) ++{ ++ if (enable) ++ DPRINTK_ISPHIST(" histogram enabled \n"); ++ else ++ DPRINTK_ISPHIST(" histogram disabled \n"); ++ ++ isp_reg_and_or(OMAP3_ISP_IOMEM_HIST, ISPHIST_PCR, ~ISPHIST_PCR_EN, ++ (enable ? ISPHIST_PCR_EN : 0)); ++ histstat.hist_enable = enable; ++} ++ ++/** ++ * isp_hist_enable - Enables ISP Histogram submodule operation. ++ * @enable: 1 - Enables the histogram submodule. ++ * ++ * Client should configure all the Histogram registers before calling this ++ * function. ++ **/ ++void isp_hist_enable(u8 enable) ++{ ++ __isp_hist_enable(enable); ++ histstat.pm_state = enable; ++} ++ ++/** ++ * isp_hist_suspend - Suspend ISP Histogram submodule. ++ **/ ++void isp_hist_suspend(void) ++{ ++ if (histstat.pm_state) ++ __isp_hist_enable(0); ++} ++ ++/** ++ * isp_hist_resume - Resume ISP Histogram submodule. ++ **/ ++void isp_hist_resume(void) ++{ ++ if (histstat.pm_state) ++ __isp_hist_enable(1); ++} ++ ++int isp_hist_busy(void) ++{ ++ return isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_PCR) & ++ ISPHIST_PCR_BUSY; ++} ++ ++ ++/** ++ * isp_hist_update_regs - Helper function to update Histogram registers. ++ **/ ++static void isp_hist_update_regs(void) ++{ ++ isp_reg_writel(hist_regs.reg_pcr, OMAP3_ISP_IOMEM_HIST, ISPHIST_PCR); ++ isp_reg_writel(hist_regs.reg_cnt, OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT); ++ isp_reg_writel(hist_regs.reg_wb_gain, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_WB_GAIN); ++ isp_reg_writel(hist_regs.reg_r0_h, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R0_HORZ); ++ isp_reg_writel(hist_regs.reg_r0_v, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R0_VERT); ++ isp_reg_writel(hist_regs.reg_r1_h, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R1_HORZ); ++ isp_reg_writel(hist_regs.reg_r1_v, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R1_VERT); ++ isp_reg_writel(hist_regs.reg_r2_h, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R2_HORZ); ++ isp_reg_writel(hist_regs.reg_r2_v, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R2_VERT); ++ isp_reg_writel(hist_regs.reg_r3_h, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R3_HORZ); ++ isp_reg_writel(hist_regs.reg_r3_v, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_R3_VERT); ++ isp_reg_writel(hist_regs.reg_hist_addr, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_ADDR); ++ isp_reg_writel(hist_regs.reg_hist_data, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_DATA); ++ isp_reg_writel(hist_regs.reg_hist_radd, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_RADD); ++ isp_reg_writel(hist_regs.reg_hist_radd_off, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_RADD_OFF); ++ isp_reg_writel(hist_regs.reg_h_v_info, OMAP3_ISP_IOMEM_HIST, ++ ISPHIST_H_V_INFO); ++} ++ ++/** ++ * isp_hist_isr - Callback from ISP driver for HIST interrupt. ++ * @status: IRQ0STATUS in case of MMU error, 0 for hist interrupt. ++ * arg1 and arg2 Not used as of now. ++ **/ ++static void isp_hist_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ isp_hist_enable(0); ++ ++ if (!(status & HIST_DONE)) ++ return; ++ ++ if (!histstat.completed) { ++ if (histstat.frame_req == histstat.frame_cnt) { ++ histstat.frame_cnt = 0; ++ histstat.frame_req = 0; ++ histstat.completed = 1; ++ } else { ++ isp_hist_enable(1); ++ histstat.frame_cnt++; ++ } ++ } ++} ++ ++/** ++ * isp_hist_reset_mem - clear Histogram memory before start stats engine. ++ * ++ * Returns 0 after histogram memory was cleared. ++ **/ ++static int isp_hist_reset_mem(void) ++{ ++ int i; ++ ++ isp_reg_or(OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT, ISPHIST_CNT_CLR_EN); ++ ++ for (i = 0; i < HIST_MEM_SIZE; i++) ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_DATA); ++ ++ isp_reg_and(OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT, ~ISPHIST_CNT_CLR_EN); ++ ++ return 0; ++} ++ ++/** ++ * isp_hist_set_params - Helper function to check and store user given params. ++ * @user_cfg: Pointer to user configuration structure. ++ * ++ * Returns 0 on success configuration. ++ **/ ++static int isp_hist_set_params(struct isp_hist_config *user_cfg) ++{ ++ ++ int reg_num = 0; ++ int bit_shift = 0; ++ ++ ++ if (isp_hist_busy()) ++ return -EINVAL; ++ ++ if (user_cfg->input_bit_width > MIN_BIT_WIDTH) ++ WRITE_DATA_SIZE(hist_regs.reg_cnt, 0); ++ else ++ WRITE_DATA_SIZE(hist_regs.reg_cnt, 1); ++ ++ WRITE_SOURCE(hist_regs.reg_cnt, user_cfg->hist_source); ++ ++ if (user_cfg->hist_source) { ++ WRITE_HV_INFO(hist_regs.reg_h_v_info, user_cfg->hist_h_v_info); ++ ++ if ((user_cfg->hist_radd & ISP_32B_BOUNDARY_BUF) == ++ user_cfg->hist_radd) { ++ WRITE_RADD(hist_regs.reg_hist_radd, ++ user_cfg->hist_radd); ++ } else { ++ printk(KERN_ERR "Address should be in 32 byte boundary" ++ "\n"); ++ return -EINVAL; ++ } ++ ++ if ((user_cfg->hist_radd_off & ISP_32B_BOUNDARY_OFFSET) == ++ user_cfg->hist_radd_off) { ++ WRITE_RADD_OFF(hist_regs.reg_hist_radd_off, ++ user_cfg->hist_radd_off); ++ } else { ++ printk(KERN_ERR "Offset should be in 32 byte boundary" ++ "\n"); ++ return -EINVAL; ++ } ++ ++ } ++ ++ isp_hist_reset_mem(); ++ DPRINTK_ISPHIST("ISPHIST: Memory Cleared\n"); ++ histstat.frame_req = user_cfg->hist_frames; ++ ++ if (unlikely(user_cfg->wb_gain_R > MAX_WB_GAIN || ++ user_cfg->wb_gain_RG > MAX_WB_GAIN || ++ user_cfg->wb_gain_B > MAX_WB_GAIN || ++ user_cfg->wb_gain_BG > MAX_WB_GAIN)) { ++ printk(KERN_ERR "Invalid WB gain\n"); ++ return -EINVAL; ++ } else { ++ WRITE_WB_R(hist_regs.reg_wb_gain, user_cfg->wb_gain_R); ++ WRITE_WB_RG(hist_regs.reg_wb_gain, user_cfg->wb_gain_RG); ++ WRITE_WB_B(hist_regs.reg_wb_gain, user_cfg->wb_gain_B); ++ WRITE_WB_BG(hist_regs.reg_wb_gain, user_cfg->wb_gain_BG); ++ } ++ ++ /* Regions size and position */ ++ ++ if (user_cfg->num_regions > MAX_REGIONS) ++ return -EINVAL; ++ ++ if (likely((user_cfg->reg0_hor & ISPHIST_REGHORIZ_HEND_MASK) - ++ ((user_cfg->reg0_hor & ISPHIST_REGHORIZ_HSTART_MASK) >> ++ ISPHIST_REGHORIZ_HSTART_SHIFT))) { ++ WRITE_REG_HORIZ(hist_regs.reg_r0_h, user_cfg->reg0_hor); ++ reg_num++; ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (likely((user_cfg->reg0_ver & ISPHIST_REGVERT_VEND_MASK) - ++ ((user_cfg->reg0_ver & ISPHIST_REGVERT_VSTART_MASK) >> ++ ISPHIST_REGVERT_VSTART_SHIFT))) { ++ WRITE_REG_VERT(hist_regs.reg_r0_v, user_cfg->reg0_ver); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (user_cfg->num_regions >= 1) { ++ if (likely((user_cfg->reg1_hor & ISPHIST_REGHORIZ_HEND_MASK) - ++ ((user_cfg->reg1_hor & ++ ISPHIST_REGHORIZ_HSTART_MASK) >> ++ ISPHIST_REGHORIZ_HSTART_SHIFT))) { ++ WRITE_REG_HORIZ(hist_regs.reg_r1_h, user_cfg->reg1_hor); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (likely((user_cfg->reg1_ver & ISPHIST_REGVERT_VEND_MASK) - ++ ((user_cfg->reg1_ver & ++ ISPHIST_REGVERT_VSTART_MASK) >> ++ ISPHIST_REGVERT_VSTART_SHIFT))) { ++ WRITE_REG_VERT(hist_regs.reg_r1_v, user_cfg->reg1_ver); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ } ++ ++ if (user_cfg->num_regions >= 2) { ++ if (likely((user_cfg->reg2_hor & ISPHIST_REGHORIZ_HEND_MASK) - ++ ((user_cfg->reg2_hor & ++ ISPHIST_REGHORIZ_HSTART_MASK) >> ++ ISPHIST_REGHORIZ_HSTART_SHIFT))) { ++ WRITE_REG_HORIZ(hist_regs.reg_r2_h, user_cfg->reg2_hor); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (likely((user_cfg->reg2_ver & ISPHIST_REGVERT_VEND_MASK) - ++ ((user_cfg->reg2_ver & ++ ISPHIST_REGVERT_VSTART_MASK) >> ++ ISPHIST_REGVERT_VSTART_SHIFT))) { ++ WRITE_REG_VERT(hist_regs.reg_r2_v, user_cfg->reg2_ver); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ } ++ ++ if (user_cfg->num_regions >= 3) { ++ if (likely((user_cfg->reg3_hor & ISPHIST_REGHORIZ_HEND_MASK) - ++ ((user_cfg->reg3_hor & ++ ISPHIST_REGHORIZ_HSTART_MASK) >> ++ ISPHIST_REGHORIZ_HSTART_SHIFT))) { ++ WRITE_REG_HORIZ(hist_regs.reg_r3_h, user_cfg->reg3_hor); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (likely((user_cfg->reg3_ver & ISPHIST_REGVERT_VEND_MASK) - ++ ((user_cfg->reg3_ver & ++ ISPHIST_REGVERT_VSTART_MASK) >> ++ ISPHIST_REGVERT_VSTART_SHIFT))) { ++ WRITE_REG_VERT(hist_regs.reg_r3_v, user_cfg->reg3_ver); ++ } else { ++ printk(KERN_ERR "Invalid Region parameters\n"); ++ return -EINVAL; ++ } ++ } ++ reg_num = user_cfg->num_regions; ++ if (unlikely(((user_cfg->hist_bins > BINS_256) && ++ (user_cfg->hist_bins != BINS_32)) || ++ ((user_cfg->hist_bins == BINS_256) && ++ reg_num != 0) || ((user_cfg->hist_bins == ++ BINS_128) && reg_num >= 2))) { ++ printk(KERN_ERR "Invalid Bins Number: %d\n", ++ user_cfg->hist_bins); ++ return -EINVAL; ++ } else { ++ WRITE_NUM_BINS(hist_regs.reg_cnt, user_cfg->hist_bins); ++ } ++ ++ if (user_cfg->input_bit_width > MAX_BIT_WIDTH || ++ user_cfg->input_bit_width < MIN_BIT_WIDTH) { ++ printk(KERN_ERR "Invalid Bit Width: %d\n", ++ user_cfg->input_bit_width); ++ return -EINVAL; ++ } else { ++ switch (user_cfg->hist_bins) { ++ case BINS_256: ++ bit_shift = user_cfg->input_bit_width - 8; ++ break; ++ case BINS_128: ++ bit_shift = user_cfg->input_bit_width - 7; ++ break; ++ case BINS_64: ++ bit_shift = user_cfg->input_bit_width - 6; ++ break; ++ case BINS_32: ++ bit_shift = user_cfg->input_bit_width - 5; ++ break; ++ default: ++ return -EINVAL; ++ } ++ WRITE_BIT_SHIFT(hist_regs.reg_cnt, bit_shift); ++ } ++ ++ isp_hist_update_regs(); ++ histstat.initialized = 1; ++ ++ return 0; ++} ++ ++/** ++ * isp_hist_configure - API to configure HIST registers. ++ * @histcfg: Pointer to user configuration structure. ++ * ++ * Returns 0 on success configuration. ++ **/ ++int isp_hist_configure(struct isp_hist_config *histcfg) ++{ ++ ++ int ret = 0; ++ ++ if (NULL == histcfg) { ++ printk(KERN_ERR "Null argument in configuration. \n"); ++ return -EINVAL; ++ } ++ ++ if (!histstat.initialized) { ++ DPRINTK_ISPHIST("Setting callback for HISTOGRAM\n"); ++ ret = isp_set_callback(CBK_HIST_DONE, isp_hist_isr, ++ (void *)NULL, (void *)NULL); ++ if (ret) { ++ printk(KERN_ERR "No callback for HIST\n"); ++ return ret; ++ } ++ } ++ ++ ret = isp_hist_set_params(histcfg); ++ if (ret) { ++ printk(KERN_ERR "Invalid parameters! \n"); ++ return ret; ++ } ++ ++ histstat.frame_cnt = 0; ++ histstat.completed = 0; ++ isp_hist_enable(1); ++ isp_hist_print_status(); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_hist_configure); ++ ++/** ++ * isp_hist_request_statistics - Request statistics in Histogram. ++ * @histdata: Pointer to data structure. ++ * ++ * This API allows the user to request for histogram statistics. ++ * ++ * Returns 0 on successful request. ++ **/ ++int isp_hist_request_statistics(struct isp_hist_data *histdata) ++{ ++ int i, ret; ++ u32 curr; ++ ++ if (isp_hist_busy()) ++ return -EBUSY; ++ ++ if (!histstat.completed && histstat.initialized) ++ return -EINVAL; ++ ++ isp_reg_or(OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT, ISPHIST_CNT_CLR_EN); ++ ++ for (i = 0; i < HIST_MEM_SIZE; i++) { ++ curr = isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_DATA); ++ ret = put_user(curr, histdata->hist_statistics_buf + i); ++ if (ret) { ++ printk(KERN_ERR "Failed copy_to_user for " ++ "HIST stats buff, %d\n", ret); ++ } ++ } ++ ++ isp_reg_and(OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT, ++ ~ISPHIST_CNT_CLR_EN); ++ histstat.completed = 0; ++ return 0; ++} ++EXPORT_SYMBOL(isp_hist_request_statistics); ++ ++/** ++ * isp_hist_init - Module Initialization. ++ * ++ * Returns 0 if successful. ++ **/ ++int __init isp_hist_init(void) ++{ ++ memset(&histstat, 0, sizeof(histstat)); ++ memset(&hist_regs, 0, sizeof(hist_regs)); ++ ++ return 0; ++} ++ ++/** ++ * isp_hist_cleanup - Module cleanup. ++ **/ ++void isp_hist_cleanup(void) ++{ ++ memset(&histstat, 0, sizeof(histstat)); ++ memset(&hist_regs, 0, sizeof(hist_regs)); ++} ++ ++/** ++ * isphist_save_context - Saves the values of the histogram module registers. ++ **/ ++void isphist_save_context(void) ++{ ++ DPRINTK_ISPHIST(" Saving context\n"); ++ isp_save_context(isphist_reg_list); ++} ++EXPORT_SYMBOL(isphist_save_context); ++ ++/** ++ * isphist_restore_context - Restores the values of the histogram module regs. ++ **/ ++void isphist_restore_context(void) ++{ ++ DPRINTK_ISPHIST(" Restoring context\n"); ++ isp_restore_context(isphist_reg_list); ++} ++EXPORT_SYMBOL(isphist_restore_context); ++ ++/** ++ * isp_hist_print_status - Debug print ++ **/ ++static void isp_hist_print_status(void) ++{ ++ DPRINTK_ISPHIST("ISPHIST_PCR = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_PCR)); ++ DPRINTK_ISPHIST("ISPHIST_CNT = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_CNT)); ++ DPRINTK_ISPHIST("ISPHIST_WB_GAIN = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_WB_GAIN)); ++ DPRINTK_ISPHIST("ISPHIST_R0_HORZ = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R0_HORZ)); ++ DPRINTK_ISPHIST("ISPHIST_R0_VERT = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R0_VERT)); ++ DPRINTK_ISPHIST("ISPHIST_R1_HORZ = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R1_HORZ)); ++ DPRINTK_ISPHIST("ISPHIST_R1_VERT = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R1_VERT)); ++ DPRINTK_ISPHIST("ISPHIST_R2_HORZ = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R2_HORZ)); ++ DPRINTK_ISPHIST("ISPHIST_R2_VERT = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R2_VERT)); ++ DPRINTK_ISPHIST("ISPHIST_R3_HORZ = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R3_HORZ)); ++ DPRINTK_ISPHIST("ISPHIST_R3_VERT = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_R3_VERT)); ++ DPRINTK_ISPHIST("ISPHIST_ADDR = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_ADDR)); ++ DPRINTK_ISPHIST("ISPHIST_RADD = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_RADD)); ++ DPRINTK_ISPHIST("ISPHIST_RADD_OFF = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_RADD_OFF)); ++ DPRINTK_ISPHIST("ISPHIST_H_V_INFO = 0x%08x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_HIST, ISPHIST_H_V_INFO)); ++} +diff --git a/drivers/media/video/isp/isphist.h b/drivers/media/video/isp/isphist.h +new file mode 100644 +index 0000000..6b17c4e +--- /dev/null ++++ b/drivers/media/video/isp/isphist.h +@@ -0,0 +1,105 @@ ++/* ++ * isphist.h ++ * ++ * Header file for HISTOGRAM module in TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_HIST_H ++#define OMAP_ISP_HIST_H ++ ++#include ++ ++#define MAX_REGIONS 0x4 ++#define MAX_WB_GAIN 255 ++#define MIN_WB_GAIN 0x0 ++#define MAX_BIT_WIDTH 14 ++#define MIN_BIT_WIDTH 8 ++ ++#define ISPHIST_PCR_EN (1 << 0) ++#define HIST_MEM_SIZE 1024 ++#define ISPHIST_CNT_CLR_EN (1 << 7) ++ ++#define WRITE_SOURCE(reg, source) \ ++ (reg = (reg & ~(ISPHIST_CNT_SOURCE_MASK)) \ ++ | (source << ISPHIST_CNT_SOURCE_SHIFT)) ++ ++#define WRITE_HV_INFO(reg, hv_info) \ ++ (reg = ((reg & ~(ISPHIST_HV_INFO_MASK)) \ ++ | (hv_info & ISPHIST_HV_INFO_MASK))) ++ ++#define WRITE_RADD(reg, radd) \ ++ (reg = (reg & ~(ISPHIST_RADD_MASK)) \ ++ | (radd << ISPHIST_RADD_SHIFT)) ++ ++#define WRITE_RADD_OFF(reg, radd_off) \ ++ (reg = (reg & ~(ISPHIST_RADD_OFF_MASK)) \ ++ | (radd_off << ISPHIST_RADD_OFF_SHIFT)) ++ ++#define WRITE_BIT_SHIFT(reg, bit_shift) \ ++ (reg = (reg & ~(ISPHIST_CNT_SHIFT_MASK)) \ ++ | (bit_shift << ISPHIST_CNT_SHIFT_SHIFT)) ++ ++#define WRITE_DATA_SIZE(reg, data_size) \ ++ (reg = (reg & ~(ISPHIST_CNT_DATASIZE_MASK)) \ ++ | (data_size << ISPHIST_CNT_DATASIZE_SHIFT)) ++ ++#define WRITE_NUM_BINS(reg, num_bins) \ ++ (reg = (reg & ~(ISPHIST_CNT_BINS_MASK)) \ ++ | (num_bins << ISPHIST_CNT_BINS_SHIFT)) ++ ++#define WRITE_WB_R(reg, reg_wb_gain) \ ++ reg = ((reg & ~(ISPHIST_WB_GAIN_WG00_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG00_SHIFT)) ++ ++#define WRITE_WB_RG(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG01_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG01_SHIFT)) ++ ++#define WRITE_WB_B(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG02_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG02_SHIFT)) ++ ++#define WRITE_WB_BG(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG03_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG03_SHIFT)) ++ ++#define WRITE_REG_HORIZ(reg, reg_n_hor) \ ++ (reg = ((reg & ~ISPHIST_REGHORIZ_MASK) \ ++ | (reg_n_hor & ISPHIST_REGHORIZ_MASK))) ++ ++#define WRITE_REG_VERT(reg, reg_n_vert) \ ++ (reg = ((reg & ~ISPHIST_REGVERT_MASK) \ ++ | (reg_n_vert & ISPHIST_REGVERT_MASK))) ++ ++ ++void isp_hist_enable(u8 enable); ++ ++int isp_hist_busy(void); ++ ++int isp_hist_configure(struct isp_hist_config *histcfg); ++ ++int isp_hist_request_statistics(struct isp_hist_data *histdata); ++ ++void isphist_save_context(void); ++ ++void isp_hist_suspend(void); ++ ++void isp_hist_resume(void); ++ ++void isphist_restore_context(void); ++ ++#endif /* OMAP_ISP_HIST */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0007-omap3isp-Add-CSI2-interface-support.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0007-omap3isp-Add-CSI2-interface-support.patch new file mode 100644 index 0000000000..842f395388 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0007-omap3isp-Add-CSI2-interface-support.patch @@ -0,0 +1,2384 @@ +From 9fbe7b786427d981cac890a7407da09232f5d1e2 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add CSI2 interface support + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/ispcsi2.c | 2124 +++++++++++++++++++++++++++++++++++++ + drivers/media/video/isp/ispcsi2.h | 232 ++++ + 2 files changed, 2356 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/ispcsi2.c + create mode 100644 drivers/media/video/isp/ispcsi2.h + +diff --git a/drivers/media/video/isp/ispcsi2.c b/drivers/media/video/isp/ispcsi2.c +new file mode 100644 +index 0000000..5141b5a +--- /dev/null ++++ b/drivers/media/video/isp/ispcsi2.c +@@ -0,0 +1,2124 @@ ++/* ++ * ispcsi2.c ++ * ++ * Driver Library for ISP CSI Control module in TI's OMAP3 Camera ISP ++ * ISP CSI interface and IRQ related APIs are defined here. ++ * ++ * Copyright (C) 2009 Texas Instruments. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Dominic Curran ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++#include ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispcsi2.h" ++ ++static struct isp_csi2_cfg current_csi2_cfg; ++static struct isp_csi2_cfg_update current_csi2_cfg_update; ++ ++static bool update_complexio_cfg1; ++static bool update_phy_cfg0; ++static bool update_phy_cfg1; ++static bool update_ctx_ctrl1[8]; ++static bool update_ctx_ctrl2[8]; ++static bool update_ctx_ctrl3[8]; ++static bool update_timing; ++static bool update_ctrl; ++static bool uses_videoport; ++ ++/** ++ * isp_csi2_complexio_lanes_config - Configuration of CSI2 ComplexIO lanes. ++ * @reqcfg: Pointer to structure containing desired lane configuration ++ * ++ * Validates and saves to internal driver memory the passed configuration. ++ * Returns 0 if successful, or -EINVAL if null pointer is passed, invalid ++ * lane position or polarity is set, and if 2 lanes try to occupy the same ++ * position. To apply this settings, use the isp_csi2_complexio_lanes_update() ++ * function just after calling this function. ++ **/ ++int isp_csi2_complexio_lanes_config(struct isp_csi2_lanes_cfg *reqcfg) ++{ ++ int i; ++ bool pos_occupied[5] = {false, false, false, false, false}; ++ struct isp_csi2_lanes_cfg *currlanes = ¤t_csi2_cfg.lanes; ++ struct isp_csi2_lanes_cfg_update *currlanes_u = ++ ¤t_csi2_cfg_update.lanes; ++ ++ /* Validating parameters sent by driver */ ++ if (reqcfg == NULL) { ++ printk(KERN_ERR "Invalid Complex IO Configuration sent by" ++ " sensor\n"); ++ goto err_einval; ++ } ++ ++ /* Data lanes verification */ ++ for (i = 0; i < 4; i++) { ++ if ((reqcfg->data[i].pol > 1) || (reqcfg->data[i].pos > 5)) { ++ printk(KERN_ERR "Invalid CSI-2 Complex IO configuration" ++ " parameters for data lane #%d\n", i); ++ goto err_einval; ++ } ++ if (pos_occupied[reqcfg->data[i].pos - 1] && ++ reqcfg->data[i].pos > 0) { ++ printk(KERN_ERR "Lane #%d already occupied\n", ++ reqcfg->data[i].pos); ++ goto err_einval; ++ } else ++ pos_occupied[reqcfg->data[i].pos - 1] = true; ++ } ++ ++ /* Clock lane verification */ ++ if ((reqcfg->clk.pol > 1) || (reqcfg->clk.pos > 5) || ++ (reqcfg->clk.pos == 0)) { ++ printk(KERN_ERR "Invalid CSI-2 Complex IO configuration" ++ " parameters for clock lane\n"); ++ goto err_einval; ++ } ++ if (pos_occupied[reqcfg->clk.pos - 1]) { ++ printk(KERN_ERR "Lane #%d already occupied", ++ reqcfg->clk.pos); ++ goto err_einval; ++ } else ++ pos_occupied[reqcfg->clk.pos - 1] = true; ++ ++ for (i = 0; i < 4; i++) { ++ if (currlanes->data[i].pos != reqcfg->data[i].pos) { ++ currlanes->data[i].pos = reqcfg->data[i].pos; ++ currlanes_u->data[i] = true; ++ update_complexio_cfg1 = true; ++ } ++ if (currlanes->data[i].pol != reqcfg->data[i].pol) { ++ currlanes->data[i].pol = reqcfg->data[i].pol; ++ currlanes_u->data[i] = true; ++ update_complexio_cfg1 = true; ++ } ++ } ++ ++ if (currlanes->clk.pos != reqcfg->clk.pos) { ++ currlanes->clk.pos = reqcfg->clk.pos; ++ currlanes_u->clk = true; ++ update_complexio_cfg1 = true; ++ } ++ if (currlanes->clk.pol != reqcfg->clk.pol) { ++ currlanes->clk.pol = reqcfg->clk.pol; ++ currlanes_u->clk = true; ++ update_complexio_cfg1 = true; ++ } ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * isp_csi2_complexio_lanes_update - Applies CSI2 ComplexIO lanes configuration. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_complexio_lanes_config() function. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_complexio_lanes_config() function, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_complexio_lanes_update(bool force_update) ++{ ++ struct isp_csi2_lanes_cfg *currlanes = ¤t_csi2_cfg.lanes; ++ struct isp_csi2_lanes_cfg_update *currlanes_u = ++ ¤t_csi2_cfg_update.lanes; ++ u32 reg; ++ int i; ++ ++ if (!update_complexio_cfg1 && !force_update) ++ return 0; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ for (i = 0; i < 4; i++) { ++ if (currlanes_u->data[i] || force_update) { ++ reg &= ~(ISPCSI2_COMPLEXIO_CFG1_DATA_POL_MASK(i + 1) | ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_MASK(i + ++ 1)); ++ reg |= (currlanes->data[i].pol << ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(i + 1)); ++ reg |= (currlanes->data[i].pos << ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(i + ++ 1)); ++ currlanes_u->data[i] = false; ++ } ++ } ++ ++ if (currlanes_u->clk || force_update) { ++ reg &= ~(ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_MASK | ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_MASK); ++ reg |= (currlanes->clk.pol << ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT); ++ reg |= (currlanes->clk.pos << ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT); ++ currlanes_u->clk = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ ++ update_complexio_cfg1 = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_complexio_lanes_get - Gets CSI2 ComplexIO lanes configuration. ++ * ++ * Gets settings from HW registers and fills in the internal driver memory ++ * Always returns 0. ++ **/ ++int isp_csi2_complexio_lanes_get(void) ++{ ++ struct isp_csi2_lanes_cfg *currlanes = ¤t_csi2_cfg.lanes; ++ struct isp_csi2_lanes_cfg_update *currlanes_u = ++ ¤t_csi2_cfg_update.lanes; ++ u32 reg; ++ int i; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ for (i = 0; i < 4; i++) { ++ currlanes->data[i].pol = (reg & ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POL_MASK(i + 1)) >> ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POL_SHIFT(i + 1); ++ currlanes->data[i].pos = (reg & ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_MASK(i + 1)) >> ++ ISPCSI2_COMPLEXIO_CFG1_DATA_POSITION_SHIFT(i + 1); ++ currlanes_u->data[i] = false; ++ } ++ currlanes->clk.pol = (reg & ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_MASK) >> ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POL_SHIFT; ++ currlanes->clk.pos = (reg & ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_MASK) >> ++ ISPCSI2_COMPLEXIO_CFG1_CLOCK_POSITION_SHIFT; ++ currlanes_u->clk = false; ++ ++ update_complexio_cfg1 = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_complexio_power_status - Gets CSI2 ComplexIO power status. ++ * ++ * Returns 3 possible valid states: ISP_CSI2_POWER_OFF, ISP_CSI2_POWER_ON, ++ * and ISP_CSI2_POWER_ULPW. ++ **/ ++static enum isp_csi2_power_cmds isp_csi2_complexio_power_status(void) ++{ ++ enum isp_csi2_power_cmds ret; ++ u32 reg; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1) & ++ ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_MASK; ++ switch (reg) { ++ case ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_OFF: ++ ret = ISP_CSI2_POWER_OFF; ++ break; ++ case ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_ON: ++ ret = ISP_CSI2_POWER_ON; ++ break; ++ case ISPCSI2_COMPLEXIO_CFG1_PWR_STATUS_ULPW: ++ ret = ISP_CSI2_POWER_ULPW; ++ break; ++ default: ++ return -EINVAL; ++ } ++ return ret; ++} ++ ++/** ++ * isp_csi2_complexio_power_autoswitch - Sets CSI2 ComplexIO power autoswitch. ++ * @enable: Sets or clears the autoswitch function enable flag. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_complexio_power_autoswitch(bool enable) ++{ ++ u32 reg; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ reg &= ~ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_MASK; ++ ++ if (enable) ++ reg |= ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_ENABLE; ++ else ++ reg |= ISPCSI2_COMPLEXIO_CFG1_PWR_AUTO_DISABLE; ++ ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ return 0; ++} ++ ++/** ++ * isp_csi2_complexio_power - Sets the desired power command for CSI2 ComplexIO. ++ * @power_cmd: Power command to be set. ++ * ++ * Returns 0 if successful, or -EBUSY if the retry count is exceeded. ++ **/ ++int isp_csi2_complexio_power(enum isp_csi2_power_cmds power_cmd) ++{ ++ enum isp_csi2_power_cmds current_state; ++ u32 reg; ++ u8 retry_count; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1) & ++ ~ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_MASK; ++ switch (power_cmd) { ++ case ISP_CSI2_POWER_OFF: ++ reg |= ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_OFF; ++ break; ++ case ISP_CSI2_POWER_ON: ++ reg |= ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_ON; ++ break; ++ case ISP_CSI2_POWER_ULPW: ++ reg |= ISPCSI2_COMPLEXIO_CFG1_PWR_CMD_ULPW; ++ break; ++ default: ++ printk(KERN_ERR "CSI2: ERROR - Wrong Power command!\n"); ++ return -EINVAL; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_COMPLEXIO_CFG1); ++ ++ retry_count = 0; ++ do { ++ udelay(50); ++ current_state = isp_csi2_complexio_power_status(); ++ ++ if (current_state != power_cmd) { ++ printk(KERN_DEBUG "CSI2: Complex IO power command not" ++ " yet taken."); ++ if (++retry_count < 100) { ++ printk(KERN_DEBUG " Retrying...\n"); ++ udelay(50); ++ } else { ++ printk(KERN_DEBUG " Retry count exceeded!\n"); ++ } ++ } ++ } while ((current_state != power_cmd) && (retry_count < 100)); ++ ++ if (retry_count == 100) ++ return -EBUSY; ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_frame_mode - Configure if_en behaviour for CSI2 ++ * @frame_mode: Desired action for IF_EN switch off. 0 - disable IF immediately ++ * 1 - disable after all Frame end Code is received in all ++ * contexts. ++ * ++ * Validates and saves to internal driver memory the passed configuration. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_frame_mode(enum isp_csi2_frame_mode frame_mode) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->frame_mode != frame_mode) { ++ currctrl->frame_mode = frame_mode; ++ currctrl_u->frame_mode = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_vp_clk_enable - Enables/disables CSI2 Videoport clock. ++ * @vp_clk_enable: Boolean value to specify the Videoport clock state. ++ * ++ * Validates and saves to internal driver memory the passed configuration. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_vp_clk_enable(bool vp_clk_enable) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->vp_clk_enable != vp_clk_enable) { ++ currctrl->vp_clk_enable = vp_clk_enable; ++ currctrl_u->vp_clk_enable = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_vp_only_enable - Sets CSI2 Videoport clock as exclusive ++ * @vp_only_enable: Boolean value to specify if the Videoport clock is ++ * exclusive, setting the OCP port as disabled. ++ * ++ * Validates and saves to internal driver memory the passed configuration. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_vp_only_enable(bool vp_only_enable) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->vp_only_enable != vp_only_enable) { ++ currctrl->vp_only_enable = vp_only_enable; ++ currctrl_u->vp_only_enable = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_vp_out_ctrl - Sets CSI2 Videoport clock divider ++ * @vp_out_ctrl: Divider value for setting videoport clock frequency based on ++ * OCP port frequency, valid dividers are between 1 and 4. ++ * ++ * Validates and saves to internal driver memory the passed configuration. ++ * Returns 0 if successful, or -EINVAL if wrong divider value is passed. ++ **/ ++int isp_csi2_ctrl_config_vp_out_ctrl(u8 vp_out_ctrl) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if ((vp_out_ctrl == 0) || (vp_out_ctrl > 4)) { ++ printk(KERN_ERR "CSI2: Wrong divisor value. Must be between" ++ " 1 and 4"); ++ return -EINVAL; ++ } ++ ++ if (currctrl->vp_out_ctrl != vp_out_ctrl) { ++ currctrl->vp_out_ctrl = vp_out_ctrl; ++ currctrl_u->vp_out_ctrl = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_debug_enable - Sets CSI2 debug ++ * @debug_enable: Boolean for setting debug configuration on CSI2. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_debug_enable(bool debug_enable) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->debug_enable != debug_enable) { ++ currctrl->debug_enable = debug_enable; ++ currctrl_u->debug_enable = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_burst_size - Sets CSI2 burst size. ++ * @burst_size: Burst size of the memory saving capability of receiver. ++ * ++ * Returns 0 if successful, or -EINVAL if burst size is wrong. ++ **/ ++int isp_csi2_ctrl_config_burst_size(u8 burst_size) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ if (burst_size > 3) { ++ printk(KERN_ERR "CSI2: Wrong burst size. Must be between" ++ " 0 and 3"); ++ return -EINVAL; ++ } ++ ++ if (currctrl->burst_size != burst_size) { ++ currctrl->burst_size = burst_size; ++ currctrl_u->burst_size = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_ecc_enable - Enables ECC on CSI2 Receiver ++ * @ecc_enable: Boolean to enable/disable the CSI2 receiver ECC handling. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_ecc_enable(bool ecc_enable) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->ecc_enable != ecc_enable) { ++ currctrl->ecc_enable = ecc_enable; ++ currctrl_u->ecc_enable = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_ecc_enable - Enables ECC on CSI2 Receiver ++ * @ecc_enable: Boolean to enable/disable the CSI2 receiver ECC handling. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_secure_mode(bool secure_mode) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->secure_mode != secure_mode) { ++ currctrl->secure_mode = secure_mode; ++ currctrl_u->secure_mode = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_config_if_enable - Enables CSI2 Receiver interface. ++ * @if_enable: Boolean to enable/disable the CSI2 receiver interface. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_config_if_enable(bool if_enable) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ ++ if (currctrl->if_enable != if_enable) { ++ currctrl->if_enable = if_enable; ++ currctrl_u->if_enable = true; ++ update_ctrl = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_update - Applies CSI2 control configuration. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_ctrl_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_ctrl_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_update(bool force_update) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ u32 reg; ++ ++ if (update_ctrl || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTRL); ++ if (currctrl_u->frame_mode || force_update) { ++ reg &= ~ISPCSI2_CTRL_FRAME_MASK; ++ if (currctrl->frame_mode) ++ reg |= ISPCSI2_CTRL_FRAME_DISABLE_FEC; ++ else ++ reg |= ISPCSI2_CTRL_FRAME_DISABLE_IMM; ++ currctrl_u->frame_mode = false; ++ } ++ if (currctrl_u->vp_clk_enable || force_update) { ++ reg &= ~ISPCSI2_CTRL_VP_CLK_EN_MASK; ++ if (currctrl->vp_clk_enable) ++ reg |= ISPCSI2_CTRL_VP_CLK_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_VP_CLK_EN_DISABLE; ++ currctrl_u->vp_clk_enable = false; ++ } ++ if (currctrl_u->vp_only_enable || force_update) { ++ reg &= ~ISPCSI2_CTRL_VP_ONLY_EN_MASK; ++ uses_videoport = currctrl->vp_only_enable; ++ if (currctrl->vp_only_enable) ++ reg |= ISPCSI2_CTRL_VP_ONLY_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_VP_ONLY_EN_DISABLE; ++ currctrl_u->vp_only_enable = false; ++ } ++ if (currctrl_u->vp_out_ctrl || force_update) { ++ reg &= ~ISPCSI2_CTRL_VP_OUT_CTRL_MASK; ++ reg |= (currctrl->vp_out_ctrl - 1) << ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT; ++ currctrl_u->vp_out_ctrl = false; ++ } ++ if (currctrl_u->debug_enable || force_update) { ++ reg &= ~ISPCSI2_CTRL_DBG_EN_MASK; ++ if (currctrl->debug_enable) ++ reg |= ISPCSI2_CTRL_DBG_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_DBG_EN_DISABLE; ++ currctrl_u->debug_enable = false; ++ } ++ if (currctrl_u->burst_size || force_update) { ++ reg &= ~ISPCSI2_CTRL_BURST_SIZE_MASK; ++ reg |= currctrl->burst_size << ++ ISPCSI2_CTRL_BURST_SIZE_SHIFT; ++ currctrl_u->burst_size = false; ++ } ++ if (currctrl_u->ecc_enable || force_update) { ++ reg &= ~ISPCSI2_CTRL_ECC_EN_MASK; ++ if (currctrl->ecc_enable) ++ reg |= ISPCSI2_CTRL_ECC_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_ECC_EN_DISABLE; ++ currctrl_u->ecc_enable = false; ++ } ++ if (currctrl_u->secure_mode || force_update) { ++ reg &= ~ISPCSI2_CTRL_SECURE_MASK; ++ if (currctrl->secure_mode) ++ reg |= ISPCSI2_CTRL_SECURE_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_SECURE_DISABLE; ++ currctrl_u->secure_mode = false; ++ } ++ if (currctrl_u->if_enable || force_update) { ++ reg &= ~ISPCSI2_CTRL_IF_EN_MASK; ++ if (currctrl->if_enable) ++ reg |= ISPCSI2_CTRL_IF_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTRL_IF_EN_DISABLE; ++ currctrl_u->if_enable = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTRL); ++ update_ctrl = false; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctrl_get - Gets CSI2 control configuration ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctrl_get(void) ++{ ++ struct isp_csi2_ctrl_cfg *currctrl = ¤t_csi2_cfg.ctrl; ++ struct isp_csi2_ctrl_cfg_update *currctrl_u = ++ ¤t_csi2_cfg_update.ctrl; ++ u32 reg; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTRL); ++ currctrl->frame_mode = (reg & ISPCSI2_CTRL_FRAME_MASK) >> ++ ISPCSI2_CTRL_FRAME_SHIFT; ++ currctrl_u->frame_mode = false; ++ ++ if ((reg & ISPCSI2_CTRL_VP_CLK_EN_MASK) == ++ ISPCSI2_CTRL_VP_CLK_EN_ENABLE) ++ currctrl->vp_clk_enable = true; ++ else ++ currctrl->vp_clk_enable = false; ++ currctrl_u->vp_clk_enable = false; ++ ++ if ((reg & ISPCSI2_CTRL_VP_ONLY_EN_MASK) == ++ ISPCSI2_CTRL_VP_ONLY_EN_ENABLE) ++ currctrl->vp_only_enable = true; ++ else ++ currctrl->vp_only_enable = false; ++ uses_videoport = currctrl->vp_only_enable; ++ currctrl_u->vp_only_enable = false; ++ ++ currctrl->vp_out_ctrl = ((reg & ISPCSI2_CTRL_VP_OUT_CTRL_MASK) >> ++ ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT) + 1; ++ currctrl_u->vp_out_ctrl = false; ++ ++ if ((reg & ISPCSI2_CTRL_DBG_EN_MASK) == ISPCSI2_CTRL_DBG_EN_ENABLE) ++ currctrl->debug_enable = true; ++ else ++ currctrl->debug_enable = false; ++ currctrl_u->debug_enable = false; ++ ++ currctrl->burst_size = (reg & ISPCSI2_CTRL_BURST_SIZE_MASK) >> ++ ISPCSI2_CTRL_BURST_SIZE_SHIFT; ++ currctrl_u->burst_size = false; ++ ++ if ((reg & ISPCSI2_CTRL_ECC_EN_MASK) == ISPCSI2_CTRL_ECC_EN_ENABLE) ++ currctrl->ecc_enable = true; ++ else ++ currctrl->ecc_enable = false; ++ currctrl_u->ecc_enable = false; ++ ++ if ((reg & ISPCSI2_CTRL_SECURE_MASK) == ISPCSI2_CTRL_SECURE_ENABLE) ++ currctrl->secure_mode = true; ++ else ++ currctrl->secure_mode = false; ++ currctrl_u->secure_mode = false; ++ ++ if ((reg & ISPCSI2_CTRL_IF_EN_MASK) == ISPCSI2_CTRL_IF_EN_ENABLE) ++ currctrl->if_enable = true; ++ else ++ currctrl->if_enable = false; ++ currctrl_u->if_enable = false; ++ ++ update_ctrl = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_validate - Validates the context number value ++ * @ctxnum: Pointer to variable containing context number. ++ * ++ * If the value is not in range (3 bits), it is being ANDed with 0x7 to force ++ * it to be on range. ++ **/ ++static void isp_csi2_ctx_validate(u8 *ctxnum) ++{ ++ if (*ctxnum > 7) { ++ printk(KERN_ERR "Invalid context number. Forcing valid" ++ " value...\n"); ++ *ctxnum &= ~(0x7); ++ } ++} ++ ++/** ++ * isp_csi2_ctx_config_virtual_id - Maps a virtual ID with a CSI2 Rx context ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @virtual_id: CSI2 Virtual ID to associate with specified context number. ++ * ++ * Returns 0 if successful, or -EINVAL if Virtual ID is not in range (0-3). ++ **/ ++int isp_csi2_ctx_config_virtual_id(u8 ctxnum, u8 virtual_id) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ if (virtual_id > 3) { ++ printk(KERN_ERR "Wrong requested virtual_id\n"); ++ return -EINVAL; ++ } ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->virtual_id != virtual_id) { ++ selected_ctx->virtual_id = virtual_id; ++ selected_ctx_u->virtual_id = true; ++ update_ctx_ctrl2[ctxnum] = true; ++ } ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_frame_count - Sets frame count to be received in CSI2 Rx. ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @frame_count: Number of frames to acquire. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_frame_count(u8 ctxnum, u8 frame_count) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->frame_count != frame_count) { ++ selected_ctx->frame_count = frame_count; ++ selected_ctx_u->frame_count = true; ++ update_ctx_ctrl1[ctxnum] = true; ++ } ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_format - Maps a pixel format to a specified context. ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @pixformat: V4L2 structure for pixel format. ++ * ++ * Returns 0 if successful, or -EINVAL if the format is not supported by the ++ * receiver. ++ **/ ++int isp_csi2_ctx_config_format(u8 ctxnum, u32 pixformat) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ struct v4l2_pix_format pix; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ pix.pixelformat = pixformat; ++ switch (pix.pixelformat) { ++ case V4L2_PIX_FMT_RGB565: ++ case V4L2_PIX_FMT_RGB565X: ++ case V4L2_PIX_FMT_YUYV: ++ case V4L2_PIX_FMT_UYVY: ++ case V4L2_PIX_FMT_RGB555: ++ case V4L2_PIX_FMT_RGB555X: ++ case V4L2_PIX_FMT_SGRBG10: ++ break; ++ default: ++ printk(KERN_ERR "Context config pixel format unsupported\n"); ++ return -EINVAL; ++ } ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ selected_ctx->format = pix; ++ selected_ctx_u->format = true; ++ update_ctx_ctrl2[ctxnum] = true; ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_alpha - Sets the alpha value for pixel format ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @alpha: Alpha value. ++ * ++ * Returns 0 if successful, or -EINVAL if the alpha value is bigger than 16383. ++ **/ ++int isp_csi2_ctx_config_alpha(u8 ctxnum, u16 alpha) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ if (alpha > 0x3FFF) { ++ printk(KERN_ERR "Wrong alpha value\n"); ++ return -EINVAL; ++ } ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->alpha != alpha) { ++ selected_ctx->alpha = alpha; ++ selected_ctx_u->alpha = true; ++ update_ctx_ctrl3[ctxnum] = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_data_offset - Sets the offset between received lines ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @data_offset: Offset between first pixel of each 2 contiguous lines. ++ * ++ * Returns 0 if successful, or -EINVAL if the line offset is bigger than 1023. ++ **/ ++int isp_csi2_ctx_config_data_offset(u8 ctxnum, u16 data_offset) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ if (data_offset > 0x3FF) { ++ printk(KERN_ERR "Wrong line offset\n"); ++ return -EINVAL; ++ } ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->data_offset != data_offset) { ++ selected_ctx->data_offset = data_offset; ++ selected_ctx_u->data_offset = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_ping_addr - Sets Ping address for CSI2 Rx. buffer saving ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @ping_addr: 32 bit ISP MMU mapped address. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_ping_addr(u8 ctxnum, u32 ping_addr) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ ping_addr &= ~(0x1F); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->ping_addr != ping_addr) { ++ selected_ctx->ping_addr = ping_addr; ++ selected_ctx_u->ping_addr = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_pong_addr - Sets Pong address for CSI2 Rx. buffer saving ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @pong_addr: 32 bit ISP MMU mapped address. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_pong_addr(u8 ctxnum, u32 pong_addr) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ pong_addr &= ~(0x1F); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->pong_addr != pong_addr) { ++ selected_ctx->pong_addr = pong_addr; ++ selected_ctx_u->pong_addr = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_eof_enabled - Enables EOF signal assertion ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @eof_enabled: Boolean to enable/disable EOF signal assertion on received ++ * packets. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_eof_enabled(u8 ctxnum, bool eof_enabled) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->eof_enabled != eof_enabled) { ++ selected_ctx->eof_enabled = eof_enabled; ++ selected_ctx_u->eof_enabled = true; ++ update_ctx_ctrl1[ctxnum] = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_eol_enabled - Enables EOL signal assertion ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @eol_enabled: Boolean to enable/disable EOL signal assertion on received ++ * packets. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_eol_enabled(u8 ctxnum, bool eol_enabled) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->eol_enabled != eol_enabled) { ++ selected_ctx->eol_enabled = eol_enabled; ++ selected_ctx_u->eol_enabled = true; ++ update_ctx_ctrl1[ctxnum] = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_checksum_enabled - Enables Checksum check in rcvd packets ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @checksum_enabled: Boolean to enable/disable Checksum check on received ++ * packets ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_checksum_enabled(u8 ctxnum, bool checksum_enabled) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->checksum_enabled != checksum_enabled) { ++ selected_ctx->checksum_enabled = checksum_enabled; ++ selected_ctx_u->checksum_enabled = true; ++ update_ctx_ctrl1[ctxnum] = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_config_enabled - Enables specified CSI2 context ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @enabled: Boolean to enable/disable specified context. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_config_enabled(u8 ctxnum, bool enabled) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (selected_ctx->enabled != enabled) { ++ selected_ctx->enabled = enabled; ++ selected_ctx_u->enabled = true; ++ update_ctx_ctrl1[ctxnum] = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_update - Applies CSI2 context configuration. ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_ctx_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_ctx_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_update(u8 ctxnum, bool force_update) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ u32 reg; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ if (update_ctx_ctrl1[ctxnum] || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL1(ctxnum)); ++ if (selected_ctx_u->frame_count || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL1_COUNT_MASK); ++ reg |= selected_ctx->frame_count << ++ ISPCSI2_CTX_CTRL1_COUNT_SHIFT; ++ selected_ctx_u->frame_count = false; ++ } ++ if (selected_ctx_u->eof_enabled || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL1_EOF_EN_MASK); ++ if (selected_ctx->eof_enabled) ++ reg |= ISPCSI2_CTX_CTRL1_EOF_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTX_CTRL1_EOF_EN_DISABLE; ++ selected_ctx_u->eof_enabled = false; ++ } ++ if (selected_ctx_u->eol_enabled || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL1_EOL_EN_MASK); ++ if (selected_ctx->eol_enabled) ++ reg |= ISPCSI2_CTX_CTRL1_EOL_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTX_CTRL1_EOL_EN_DISABLE; ++ selected_ctx_u->eol_enabled = false; ++ } ++ if (selected_ctx_u->checksum_enabled || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL1_CS_EN_MASK); ++ if (selected_ctx->checksum_enabled) ++ reg |= ISPCSI2_CTX_CTRL1_CS_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTX_CTRL1_CS_EN_DISABLE; ++ selected_ctx_u->checksum_enabled = false; ++ } ++ if (selected_ctx_u->enabled || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL1_CTX_EN_MASK); ++ if (selected_ctx->enabled) ++ reg |= ISPCSI2_CTX_CTRL1_CTX_EN_ENABLE; ++ else ++ reg |= ISPCSI2_CTX_CTRL1_CTX_EN_DISABLE; ++ selected_ctx_u->enabled = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL1(ctxnum)); ++ update_ctx_ctrl1[ctxnum] = false; ++ } ++ ++ if (update_ctx_ctrl2[ctxnum] || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL2(ctxnum)); ++ if (selected_ctx_u->virtual_id || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL2_VIRTUAL_ID_MASK); ++ reg |= selected_ctx->virtual_id << ++ ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT; ++ selected_ctx_u->virtual_id = false; ++ } ++ ++ if (selected_ctx_u->format || force_update) { ++ struct v4l2_pix_format *pix; ++ u16 new_format = 0; ++ ++ reg &= ~(ISPCSI2_CTX_CTRL2_FORMAT_MASK); ++ pix = &selected_ctx->format; ++ switch (pix->pixelformat) { ++ case V4L2_PIX_FMT_RGB565: ++ case V4L2_PIX_FMT_RGB565X: ++ new_format = 0x22; ++ break; ++ case V4L2_PIX_FMT_YUYV: ++ case V4L2_PIX_FMT_UYVY: ++ if (uses_videoport) ++ new_format = 0x9E; ++ else ++ new_format = 0x1E; ++ break; ++ case V4L2_PIX_FMT_RGB555: ++ case V4L2_PIX_FMT_RGB555X: ++ new_format = 0xA1; ++ break; ++ case V4L2_PIX_FMT_SGRBG10: ++ if (uses_videoport) ++ new_format = 0x12F; ++ else ++ new_format = 0xAB; ++ break; ++ } ++ reg |= (new_format << ISPCSI2_CTX_CTRL2_FORMAT_SHIFT); ++ selected_ctx_u->format = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL2(ctxnum)); ++ update_ctx_ctrl2[ctxnum] = false; ++ } ++ ++ if (update_ctx_ctrl3[ctxnum] || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL3(ctxnum)); ++ if (selected_ctx_u->alpha || force_update) { ++ reg &= ~(ISPCSI2_CTX_CTRL3_ALPHA_MASK); ++ reg |= (selected_ctx->alpha << ++ ISPCSI2_CTX_CTRL3_ALPHA_SHIFT); ++ selected_ctx_u->alpha = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL3(ctxnum)); ++ update_ctx_ctrl3[ctxnum] = false; ++ } ++ ++ if (selected_ctx_u->data_offset) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_OFST(ctxnum)); ++ reg &= ~ISPCSI2_CTX_DAT_OFST_OFST_MASK; ++ reg |= selected_ctx->data_offset << ++ ISPCSI2_CTX_DAT_OFST_OFST_SHIFT; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_OFST(ctxnum)); ++ selected_ctx_u->data_offset = false; ++ } ++ ++ if (selected_ctx_u->ping_addr) { ++ reg = selected_ctx->ping_addr; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PING_ADDR(ctxnum)); ++ selected_ctx_u->ping_addr = false; ++ } ++ ++ if (selected_ctx_u->pong_addr) { ++ reg = selected_ctx->pong_addr; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PONG_ADDR(ctxnum)); ++ selected_ctx_u->pong_addr = false; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_get - Gets specific CSI2 Context configuration ++ * @ctxnum: Context number, valid between 0 and 7 values. ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_get(u8 ctxnum) ++{ ++ struct isp_csi2_ctx_cfg *selected_ctx; ++ struct isp_csi2_ctx_cfg_update *selected_ctx_u; ++ u32 reg; ++ ++ isp_csi2_ctx_validate(&ctxnum); ++ ++ selected_ctx = ¤t_csi2_cfg.contexts[ctxnum]; ++ selected_ctx_u = ¤t_csi2_cfg_update.contexts[ctxnum]; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTX_CTRL1(ctxnum)); ++ selected_ctx->frame_count = (reg & ISPCSI2_CTX_CTRL1_COUNT_MASK) >> ++ ISPCSI2_CTX_CTRL1_COUNT_SHIFT; ++ selected_ctx_u->frame_count = false; ++ ++ if ((reg & ISPCSI2_CTX_CTRL1_EOF_EN_MASK) == ++ ISPCSI2_CTX_CTRL1_EOF_EN_ENABLE) ++ selected_ctx->eof_enabled = true; ++ else ++ selected_ctx->eof_enabled = false; ++ selected_ctx_u->eof_enabled = false; ++ ++ if ((reg & ISPCSI2_CTX_CTRL1_EOL_EN_MASK) == ++ ISPCSI2_CTX_CTRL1_EOL_EN_ENABLE) ++ selected_ctx->eol_enabled = true; ++ else ++ selected_ctx->eol_enabled = false; ++ selected_ctx_u->eol_enabled = false; ++ ++ if ((reg & ISPCSI2_CTX_CTRL1_CS_EN_MASK) == ++ ISPCSI2_CTX_CTRL1_CS_EN_ENABLE) ++ selected_ctx->checksum_enabled = true; ++ else ++ selected_ctx->checksum_enabled = false; ++ selected_ctx_u->checksum_enabled = false; ++ ++ if ((reg & ISPCSI2_CTX_CTRL1_CTX_EN_MASK) == ++ ISPCSI2_CTX_CTRL1_CTX_EN_ENABLE) ++ selected_ctx->enabled = true; ++ else ++ selected_ctx->enabled = false; ++ selected_ctx_u->enabled = false; ++ update_ctx_ctrl1[ctxnum] = false; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTX_CTRL2(ctxnum)); ++ ++ selected_ctx->virtual_id = (reg & ISPCSI2_CTX_CTRL2_VIRTUAL_ID_MASK) >> ++ ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT; ++ selected_ctx_u->virtual_id = false; ++ ++ switch ((reg & ISPCSI2_CTX_CTRL2_FORMAT_MASK) >> ++ ISPCSI2_CTX_CTRL2_FORMAT_SHIFT) { ++ case 0x22: ++ selected_ctx->format.pixelformat = V4L2_PIX_FMT_RGB565; ++ break; ++ case 0x9E: ++ case 0x1E: ++ selected_ctx->format.pixelformat = V4L2_PIX_FMT_YUYV; ++ break; ++ case 0xA1: ++ selected_ctx->format.pixelformat = V4L2_PIX_FMT_RGB555; ++ break; ++ case 0xAB: ++ case 0x12F: ++ selected_ctx->format.pixelformat = V4L2_PIX_FMT_SGRBG10; ++ break; ++ } ++ selected_ctx_u->format = false; ++ update_ctx_ctrl2[ctxnum] = false; ++ ++ selected_ctx->alpha = (isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL3(ctxnum)) & ++ ISPCSI2_CTX_CTRL3_ALPHA_MASK) >> ++ ISPCSI2_CTX_CTRL3_ALPHA_SHIFT; ++ selected_ctx_u->alpha = false; ++ update_ctx_ctrl3[ctxnum] = false; ++ ++ selected_ctx->data_offset = (isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_OFST(ctxnum)) & ++ ISPCSI2_CTX_DAT_OFST_OFST_MASK) >> ++ ISPCSI2_CTX_DAT_OFST_OFST_SHIFT; ++ selected_ctx_u->data_offset = false; ++ ++ selected_ctx->ping_addr = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PING_ADDR(ctxnum)); ++ selected_ctx_u->ping_addr = false; ++ ++ selected_ctx->pong_addr = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PONG_ADDR(ctxnum)); ++ selected_ctx_u->pong_addr = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_update_all - Applies all CSI2 context configuration. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_ctx_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_ctx_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_update_all(bool force_update) ++{ ++ u8 ctxnum; ++ ++ for (ctxnum = 0; ctxnum < 8; ctxnum++) ++ isp_csi2_ctx_update(ctxnum, force_update); ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_ctx_get_all - Gets all CSI2 Context configurations ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_ctx_get_all(void) ++{ ++ u8 ctxnum; ++ ++ for (ctxnum = 0; ctxnum < 8; ctxnum++) ++ isp_csi2_ctx_get(ctxnum); ++ ++ return 0; ++} ++ ++int isp_csi2_phy_config(struct isp_csi2_phy_cfg *desiredphyconfig) ++{ ++ struct isp_csi2_phy_cfg *currphy = ¤t_csi2_cfg.phy; ++ struct isp_csi2_phy_cfg_update *currphy_u = ++ ¤t_csi2_cfg_update.phy; ++ ++ if ((desiredphyconfig->tclk_term > 0x7f) || ++ (desiredphyconfig->tclk_miss > 0x3)) { ++ printk(KERN_ERR "Invalid PHY configuration sent by the" ++ " driver\n"); ++ return -EINVAL; ++ } ++ ++ if (currphy->ths_term != desiredphyconfig->ths_term) { ++ currphy->ths_term = desiredphyconfig->ths_term; ++ currphy_u->ths_term = true; ++ update_phy_cfg0 = true; ++ } ++ if (currphy->ths_settle != desiredphyconfig->ths_settle) { ++ currphy->ths_settle = desiredphyconfig->ths_settle; ++ currphy_u->ths_settle = true; ++ update_phy_cfg0 = true; ++ } ++ if (currphy->tclk_term != desiredphyconfig->tclk_term) { ++ currphy->tclk_term = desiredphyconfig->tclk_term; ++ currphy_u->tclk_term = true; ++ update_phy_cfg1 = true; ++ } ++ if (currphy->tclk_miss != desiredphyconfig->tclk_miss) { ++ currphy->tclk_miss = desiredphyconfig->tclk_miss; ++ currphy_u->tclk_miss = true; ++ update_phy_cfg1 = true; ++ } ++ if (currphy->tclk_settle != desiredphyconfig->tclk_settle) { ++ currphy->tclk_settle = desiredphyconfig->tclk_settle; ++ currphy_u->tclk_settle = true; ++ update_phy_cfg1 = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_calc_phy_cfg0 - Calculates D-PHY config based on the MIPIClk speed. ++ * @mipiclk: MIPI clock frequency being used with CSI2 sensor. ++ * @lbound_hs_settle: Lower bound for CSI2 High Speed Settle transition. ++ * @ubound_hs_settle: Upper bound for CSI2 High Speed Settle transition. ++ * ++ * From TRM, we have the same calculation for HS Termination signal. ++ * THS_TERM = ceil( 12.5ns / DDRCLK period ) - 1 ++ * But for Settle, we use the mid value between the two passed boundaries from ++ * sensor: ++ * THS_SETTLE = (Upper bound + Lower bound) / 2 ++ * ++ * Always returns 0. ++ */ ++int isp_csi2_calc_phy_cfg0(u32 mipiclk, u32 lbound_hs_settle, ++ u32 ubound_hs_settle) ++{ ++ struct isp_csi2_phy_cfg *currphy = ¤t_csi2_cfg.phy; ++ struct isp_csi2_phy_cfg_update *currphy_u = ++ ¤t_csi2_cfg_update.phy; ++ u32 tmp, ddrclk = mipiclk >> 1; ++ ++ /* Calculate THS_TERM */ ++ tmp = ddrclk / 80000000; ++ if ((ddrclk % 80000000) > 0) ++ tmp++; ++ currphy->ths_term = tmp - 1; ++ currphy_u->ths_term = true; ++ ++ /* Calculate THS_SETTLE */ ++ currphy->ths_settle = (ubound_hs_settle + lbound_hs_settle) / 2; ++ ++ currphy_u->ths_settle = true; ++ isp_csi2_phy_update(true); ++ return 0; ++} ++EXPORT_SYMBOL(isp_csi2_calc_phy_cfg0); ++ ++/** ++ * isp_csi2_phy_update - Applies CSI2 D-PHY configuration. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_phy_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_phy_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_phy_update(bool force_update) ++{ ++ struct isp_csi2_phy_cfg *currphy = ¤t_csi2_cfg.phy; ++ struct isp_csi2_phy_cfg_update *currphy_u = ++ ¤t_csi2_cfg_update.phy; ++ u32 reg; ++ ++ if (update_phy_cfg0 || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG0); ++ if (currphy_u->ths_term || force_update) { ++ reg &= ~ISPCSI2PHY_CFG0_THS_TERM_MASK; ++ reg |= (currphy->ths_term << ++ ISPCSI2PHY_CFG0_THS_TERM_SHIFT); ++ currphy_u->ths_term = false; ++ } ++ if (currphy_u->ths_settle || force_update) { ++ reg &= ~ISPCSI2PHY_CFG0_THS_SETTLE_MASK; ++ reg |= (currphy->ths_settle << ++ ISPCSI2PHY_CFG0_THS_SETTLE_SHIFT); ++ currphy_u->ths_settle = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG0); ++ update_phy_cfg0 = false; ++ } ++ ++ if (update_phy_cfg1 || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG1); ++ if (currphy_u->tclk_term || force_update) { ++ reg &= ~ISPCSI2PHY_CFG1_TCLK_TERM_MASK; ++ reg |= (currphy->tclk_term << ++ ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT); ++ currphy_u->tclk_term = false; ++ } ++ if (currphy_u->tclk_miss || force_update) { ++ reg &= ~ISPCSI2PHY_CFG1_TCLK_MISS_MASK; ++ reg |= (currphy->tclk_miss << ++ ISPCSI2PHY_CFG1_TCLK_MISS_SHIFT); ++ currphy_u->tclk_miss = false; ++ } ++ if (currphy_u->tclk_settle || force_update) { ++ reg &= ~ISPCSI2PHY_CFG1_TCLK_SETTLE_MASK; ++ reg |= (currphy->tclk_settle << ++ ISPCSI2PHY_CFG1_TCLK_SETTLE_SHIFT); ++ currphy_u->tclk_settle = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG1); ++ update_phy_cfg1 = false; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_phy_get - Gets CSI2 D-PHY configuration ++ * ++ * Gets settings from HW registers and fills in the internal driver memory ++ * Always returns 0. ++ **/ ++int isp_csi2_phy_get(void) ++{ ++ struct isp_csi2_phy_cfg *currphy = ¤t_csi2_cfg.phy; ++ struct isp_csi2_phy_cfg_update *currphy_u = ++ ¤t_csi2_cfg_update.phy; ++ u32 reg; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG0); ++ currphy->ths_term = (reg & ISPCSI2PHY_CFG0_THS_TERM_MASK) >> ++ ISPCSI2PHY_CFG0_THS_TERM_SHIFT; ++ currphy_u->ths_term = false; ++ ++ currphy->ths_settle = (reg & ISPCSI2PHY_CFG0_THS_SETTLE_MASK) >> ++ ISPCSI2PHY_CFG0_THS_SETTLE_SHIFT; ++ currphy_u->ths_settle = false; ++ update_phy_cfg0 = false; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ISPCSI2PHY_CFG1); ++ ++ currphy->tclk_term = (reg & ISPCSI2PHY_CFG1_TCLK_TERM_MASK) >> ++ ISPCSI2PHY_CFG1_TCLK_TERM_SHIFT; ++ currphy_u->tclk_term = false; ++ ++ currphy->tclk_miss = (reg & ISPCSI2PHY_CFG1_TCLK_MISS_MASK) >> ++ ISPCSI2PHY_CFG1_TCLK_MISS_SHIFT; ++ currphy_u->tclk_miss = false; ++ ++ currphy->tclk_settle = (reg & ISPCSI2PHY_CFG1_TCLK_SETTLE_MASK) >> ++ ISPCSI2PHY_CFG1_TCLK_SETTLE_SHIFT; ++ currphy_u->tclk_settle = false; ++ ++ update_phy_cfg1 = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_config_forcerxmode - Sets Force Rx mode on stop state count ++ * @force_rx_mode: Boolean to enable/disable forcing Rx mode in CSI2 receiver ++ * ++ * Returns 0 if successful, or -EINVAL if wrong ComplexIO number is selected. ++ **/ ++int isp_csi2_timings_config_forcerxmode(u8 io, bool force_rx_mode) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ if (currtimings->force_rx_mode != force_rx_mode) { ++ currtimings->force_rx_mode = force_rx_mode; ++ currtimings_u->force_rx_mode = true; ++ update_timing = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_config_stopstate_16x - Sets 16x factor for L3 cycles ++ * @stop_state_16x: Boolean to use or not use the 16x multiplier for stop count ++ * ++ * Returns 0 if successful, or -EINVAL if wrong ComplexIO number is selected. ++ **/ ++int isp_csi2_timings_config_stopstate_16x(u8 io, bool stop_state_16x) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ if (currtimings->stop_state_16x != stop_state_16x) { ++ currtimings->stop_state_16x = stop_state_16x; ++ currtimings_u->stop_state_16x = true; ++ update_timing = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_config_stopstate_4x - Sets 4x factor for L3 cycles ++ * @stop_state_4x: Boolean to use or not use the 4x multiplier for stop count ++ * ++ * Returns 0 if successful, or -EINVAL if wrong ComplexIO number is selected. ++ **/ ++int isp_csi2_timings_config_stopstate_4x(u8 io, bool stop_state_4x) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ if (currtimings->stop_state_4x != stop_state_4x) { ++ currtimings->stop_state_4x = stop_state_4x; ++ currtimings_u->stop_state_4x = true; ++ update_timing = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_config_stopstate_cnt - Sets L3 cycles ++ * @stop_state_counter: Stop state counter value for L3 cycles ++ * ++ * Returns 0 if successful, or -EINVAL if wrong ComplexIO number is selected. ++ **/ ++int isp_csi2_timings_config_stopstate_cnt(u8 io, u16 stop_state_counter) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ if (currtimings->stop_state_counter != stop_state_counter) { ++ currtimings->stop_state_counter = (stop_state_counter & 0x1FFF); ++ currtimings_u->stop_state_counter = true; ++ update_timing = true; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_update - Applies specified CSI2 timing configuration. ++ * @io: IO number (1 or 2) which specifies which ComplexIO are we updating ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_timings_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_timings_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Returns 0 if successful, or -EINVAL if invalid IO number is passed. ++ **/ ++int isp_csi2_timings_update(u8 io, bool force_update) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ u32 reg; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ ++ if (update_timing || force_update) { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_TIMING); ++ if (currtimings_u->force_rx_mode || force_update) { ++ reg &= ~ISPCSI2_TIMING_FORCE_RX_MODE_IO_MASK(io); ++ if (currtimings->force_rx_mode) ++ reg |= ISPCSI2_TIMING_FORCE_RX_MODE_IO_ENABLE ++ (io); ++ else ++ reg |= ISPCSI2_TIMING_FORCE_RX_MODE_IO_DISABLE ++ (io); ++ currtimings_u->force_rx_mode = false; ++ } ++ if (currtimings_u->stop_state_16x || force_update) { ++ reg &= ~ISPCSI2_TIMING_STOP_STATE_X16_IO_MASK(io); ++ if (currtimings->stop_state_16x) ++ reg |= ISPCSI2_TIMING_STOP_STATE_X16_IO_ENABLE ++ (io); ++ else ++ reg |= ISPCSI2_TIMING_STOP_STATE_X16_IO_DISABLE ++ (io); ++ currtimings_u->stop_state_16x = false; ++ } ++ if (currtimings_u->stop_state_4x || force_update) { ++ reg &= ~ISPCSI2_TIMING_STOP_STATE_X4_IO_MASK(io); ++ if (currtimings->stop_state_4x) { ++ reg |= ISPCSI2_TIMING_STOP_STATE_X4_IO_ENABLE ++ (io); ++ } else { ++ reg |= ISPCSI2_TIMING_STOP_STATE_X4_IO_DISABLE ++ (io); ++ } ++ currtimings_u->stop_state_4x = false; ++ } ++ if (currtimings_u->stop_state_counter || force_update) { ++ reg &= ~ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_MASK(io); ++ reg |= currtimings->stop_state_counter << ++ ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(io); ++ currtimings_u->stop_state_counter = false; ++ } ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_TIMING); ++ update_timing = false; ++ } ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_get - Gets specific CSI2 ComplexIO timing configuration ++ * @io: IO number (1 or 2) which specifies which ComplexIO are we getting ++ * ++ * Gets settings from HW registers and fills in the internal driver memory ++ * Returns 0 if successful, or -EINVAL if invalid IO number is passed. ++ **/ ++int isp_csi2_timings_get(u8 io) ++{ ++ struct isp_csi2_timings_cfg *currtimings; ++ struct isp_csi2_timings_cfg_update *currtimings_u; ++ u32 reg; ++ ++ if (io < 1 || io > 2) { ++ printk(KERN_ERR "CSI2 - Timings config: Invalid IO number\n"); ++ return -EINVAL; ++ } ++ ++ currtimings = ¤t_csi2_cfg.timings[io - 1]; ++ currtimings_u = ¤t_csi2_cfg_update.timings[io - 1]; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_TIMING); ++ if ((reg & ISPCSI2_TIMING_FORCE_RX_MODE_IO_MASK(io)) == ++ ISPCSI2_TIMING_FORCE_RX_MODE_IO_ENABLE(io)) ++ currtimings->force_rx_mode = true; ++ else ++ currtimings->force_rx_mode = false; ++ currtimings_u->force_rx_mode = false; ++ ++ if ((reg & ISPCSI2_TIMING_STOP_STATE_X16_IO_MASK(io)) == ++ ISPCSI2_TIMING_STOP_STATE_X16_IO_ENABLE(io)) ++ currtimings->stop_state_16x = true; ++ else ++ currtimings->stop_state_16x = false; ++ currtimings_u->stop_state_16x = false; ++ ++ if ((reg & ISPCSI2_TIMING_STOP_STATE_X4_IO_MASK(io)) == ++ ISPCSI2_TIMING_STOP_STATE_X4_IO_ENABLE(io)) ++ currtimings->stop_state_4x = true; ++ else ++ currtimings->stop_state_4x = false; ++ currtimings_u->stop_state_4x = false; ++ ++ currtimings->stop_state_counter = (reg & ++ ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_MASK(io)) >> ++ ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(io); ++ currtimings_u->stop_state_counter = false; ++ update_timing = false; ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_update_all - Applies specified CSI2 timing configuration. ++ * @force_update: Flag to force rewrite of registers, even if they haven't been ++ * updated with the isp_csi2_timings_config_*() functions. ++ * ++ * It only saves settings when they were previously updated using the ++ * isp_csi2_timings_config_*() functions, unless the force_update flag is ++ * set to true. ++ * Always returns 0. ++ **/ ++int isp_csi2_timings_update_all(bool force_update) ++{ ++ int i; ++ ++ for (i = 1; i < 3; i++) ++ isp_csi2_timings_update(i, force_update); ++ return 0; ++} ++ ++/** ++ * isp_csi2_timings_get_all - Gets all CSI2 ComplexIO timing configurations ++ * ++ * Always returns 0. ++ **/ ++int isp_csi2_timings_get_all(void) ++{ ++ int i; ++ ++ for (i = 1; i < 3; i++) ++ isp_csi2_timings_get(i); ++ return 0; ++} ++ ++/** ++ * isp_csi2_isr - CSI2 interrupt handling. ++ **/ ++void isp_csi2_isr(void) ++{ ++ u32 csi2_irqstatus, cpxio1_irqstatus, ctxirqstatus; ++ ++ csi2_irqstatus = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_IRQSTATUS); ++ isp_reg_writel(csi2_irqstatus, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_IRQSTATUS); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ) { ++ cpxio1_irqstatus = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO1_IRQSTATUS); ++ isp_reg_writel(cpxio1_irqstatus, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO1_IRQSTATUS); ++ printk(KERN_ERR "CSI2: ComplexIO Error IRQ %x\n", ++ cpxio1_irqstatus); ++ } ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_CONTEXT(0)) { ++ ctxirqstatus = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQSTATUS(0)); ++ isp_reg_writel(ctxirqstatus, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQSTATUS(0)); ++ } ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_OCP_ERR_IRQ) ++ printk(KERN_ERR "CSI2: OCP Transmission Error\n"); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ) ++ printk(KERN_ERR "CSI2: Short packet receive error\n"); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ) ++ printk(KERN_DEBUG "CSI2: ECC correction done\n"); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ) ++ printk(KERN_ERR "CSI2: ECC correction failed\n"); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ) ++ printk(KERN_ERR "CSI2: ComplexIO #2 failed\n"); ++ ++ if (csi2_irqstatus & ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ) ++ printk(KERN_ERR "CSI2: FIFO overflow error\n"); ++ ++ return; ++} ++EXPORT_SYMBOL(isp_csi2_isr); ++ ++/** ++ * isp_csi2_irq_complexio1_set - Enables CSI2 ComplexIO IRQs. ++ * @enable: Enable/disable CSI2 ComplexIO #1 interrupts ++ **/ ++void isp_csi2_irq_complexio1_set(int enable) ++{ ++ u32 reg; ++ reg = ISPCSI2_COMPLEXIO1_IRQENABLE_STATEALLULPMEXIT | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEALLULPMENTER | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM5 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL5 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC5 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS5 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS5 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM4 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL4 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC4 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS4 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS4 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM3 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL3 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC3 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS3 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS3 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM2 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL2 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC2 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS2 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS2 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_STATEULPM1 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRCONTROL1 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRESC1 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTSYNCHS1 | ++ ISPCSI2_COMPLEXIO1_IRQENABLE_ERRSOTHS1; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO1_IRQSTATUS); ++ if (enable) { ++ reg |= isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO1_IRQENABLE); ++ } else ++ reg = 0; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO1_IRQENABLE); ++} ++EXPORT_SYMBOL(isp_csi2_irq_complexio1_set); ++ ++/** ++ * isp_csi2_irq_ctx_set - Enables CSI2 Context IRQs. ++ * @enable: Enable/disable CSI2 Context interrupts ++ **/ ++void isp_csi2_irq_ctx_set(int enable) ++{ ++ u32 reg; ++ int i; ++ ++ reg = ISPCSI2_CTX_IRQSTATUS_FS_IRQ | ISPCSI2_CTX_IRQSTATUS_FE_IRQ; ++ for (i = 0; i < 8; i++) { ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQSTATUS(i)); ++ if (enable) { ++ isp_reg_or(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQENABLE(i), reg); ++ } else { ++ isp_reg_writel(0, OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQENABLE(i)); ++ } ++ } ++ ++} ++EXPORT_SYMBOL(isp_csi2_irq_ctx_set); ++ ++/** ++ * isp_csi2_irq_status_set - Enables CSI2 Status IRQs. ++ * @enable: Enable/disable CSI2 Status interrupts ++ **/ ++void isp_csi2_irq_status_set(int enable) ++{ ++ u32 reg; ++ reg = ISPCSI2_IRQSTATUS_OCP_ERR_IRQ | ++ ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ | ++ ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ | ++ ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ | ++ ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ | ++ ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ | ++ ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ | ++ ISPCSI2_IRQSTATUS_CONTEXT(0); ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_IRQSTATUS); ++ if (enable) ++ reg |= isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_IRQENABLE); ++ else ++ reg = 0; ++ ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_IRQENABLE); ++} ++EXPORT_SYMBOL(isp_csi2_irq_status_set); ++ ++/** ++ * isp_csi2_irq_status_set - Enables main CSI2 IRQ. ++ * @enable: Enable/disable main CSI2 interrupt ++ **/ ++void isp_csi2_irq_set(int enable) ++{ ++ isp_reg_writel(IRQ0STATUS_CSIA_IRQ, OMAP3_ISP_IOMEM_MAIN, ++ ISP_IRQ0STATUS); ++ isp_reg_and_or(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE, ++ ~IRQ0ENABLE_CSIA_IRQ, ++ (enable ? IRQ0ENABLE_CSIA_IRQ : 0)); ++} ++EXPORT_SYMBOL(isp_csi2_irq_set); ++ ++/** ++ * isp_csi2_irq_all_set - Enable/disable CSI2 interrupts. ++ * @enable: 0-Disable, 1-Enable. ++ **/ ++void isp_csi2_irq_all_set(int enable) ++{ ++ if (enable) { ++ isp_csi2_irq_complexio1_set(enable); ++ isp_csi2_irq_ctx_set(enable); ++ isp_csi2_irq_status_set(enable); ++ isp_csi2_irq_set(enable); ++ } else { ++ isp_csi2_irq_set(enable); ++ isp_csi2_irq_status_set(enable); ++ isp_csi2_irq_ctx_set(enable); ++ isp_csi2_irq_complexio1_set(enable); ++ } ++ return; ++} ++EXPORT_SYMBOL(isp_csi2_irq_all_set); ++ ++/** ++ * isp_csi2_reset - Resets the CSI2 module. ++ * ++ * Returns 0 if successful, or -EBUSY if power command didn't respond. ++ **/ ++int isp_csi2_reset(void) ++{ ++ u32 reg; ++ u8 soft_reset_retries = 0; ++ int i; ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_SYSCONFIG); ++ reg |= ISPCSI2_SYSCONFIG_SOFT_RESET_RESET; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_SYSCONFIG); ++ ++ do { ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_SYSSTATUS) & ++ ISPCSI2_SYSSTATUS_RESET_DONE_MASK; ++ if (reg == ISPCSI2_SYSSTATUS_RESET_DONE_DONE) ++ break; ++ soft_reset_retries++; ++ if (soft_reset_retries < 5) ++ udelay(100); ++ } while (soft_reset_retries < 5); ++ ++ if (soft_reset_retries == 5) { ++ printk(KERN_ERR "CSI2: Soft reset try count exceeded!\n"); ++ return -EBUSY; ++ } ++ ++ reg = isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_SYSCONFIG); ++ reg &= ~ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK; ++ reg |= ISPCSI2_SYSCONFIG_MSTANDBY_MODE_NO; ++ reg &= ~ISPCSI2_SYSCONFIG_AUTO_IDLE_MASK; ++ isp_reg_writel(reg, OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_SYSCONFIG); ++ ++ uses_videoport = false; ++ update_complexio_cfg1 = false; ++ update_phy_cfg0 = false; ++ update_phy_cfg1 = false; ++ for (i = 0; i < 8; i++) { ++ update_ctx_ctrl1[i] = false; ++ update_ctx_ctrl2[i] = false; ++ update_ctx_ctrl3[i] = false; ++ } ++ update_timing = false; ++ update_ctrl = false; ++ ++ isp_csi2_complexio_lanes_get(); ++ isp_csi2_ctrl_get(); ++ isp_csi2_ctx_get_all(); ++ isp_csi2_phy_get(); ++ isp_csi2_timings_get_all(); ++ ++ isp_csi2_complexio_power_autoswitch(true); ++ isp_csi2_complexio_power(ISP_CSI2_POWER_ON); ++ ++ isp_csi2_timings_config_forcerxmode(1, true); ++ isp_csi2_timings_config_stopstate_cnt(1, 0x1FF); ++ isp_csi2_timings_update_all(true); ++ ++ return 0; ++} ++ ++/** ++ * isp_csi2_enable - Enables the CSI2 module. ++ * @enable: Enables/disables the CSI2 module. ++ **/ ++void isp_csi2_enable(int enable) ++{ ++ if (enable) { ++ isp_csi2_ctx_config_enabled(0, true); ++ isp_csi2_ctx_config_eof_enabled(0, true); ++ isp_csi2_ctx_config_checksum_enabled(0, true); ++ isp_csi2_ctx_update(0, false); ++ ++ isp_csi2_ctrl_config_ecc_enable(true); ++ isp_csi2_ctrl_config_if_enable(true); ++ isp_csi2_ctrl_update(false); ++ } else { ++ isp_csi2_ctx_config_enabled(0, false); ++ isp_csi2_ctx_config_eof_enabled(0, false); ++ isp_csi2_ctx_config_checksum_enabled(0, false); ++ isp_csi2_ctx_update(0, false); ++ ++ isp_csi2_ctrl_config_ecc_enable(false); ++ isp_csi2_ctrl_config_if_enable(false); ++ isp_csi2_ctrl_update(false); ++ } ++} ++EXPORT_SYMBOL(isp_csi2_enable); ++ ++/** ++ * isp_csi2_regdump - Prints CSI2 debug information. ++ **/ ++void isp_csi2_regdump(void) ++{ ++ printk(KERN_DEBUG "-------------Register dump-------------\n"); ++ ++ printk(KERN_DEBUG "ISP_CTRL: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_CTRL)); ++ printk(KERN_DEBUG "ISP_TCTRL_CTRL: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL)); ++ ++ printk(KERN_DEBUG "ISPCCDC_SDR_ADDR: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDR_ADDR)); ++ printk(KERN_DEBUG "ISPCCDC_SYN_MODE: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE)); ++ printk(KERN_DEBUG "ISPCCDC_CFG: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_CFG)); ++ printk(KERN_DEBUG "ISPCCDC_FMTCFG: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_FMTCFG)); ++ printk(KERN_DEBUG "ISPCCDC_HSIZE_OFF: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HSIZE_OFF)); ++ printk(KERN_DEBUG "ISPCCDC_HORZ_INFO: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO)); ++ printk(KERN_DEBUG "ISPCCDC_VERT_START: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_START)); ++ printk(KERN_DEBUG "ISPCCDC_VERT_LINES: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CCDC, ++ ISPCCDC_VERT_LINES)); ++ ++ printk(KERN_DEBUG "ISPCSI2_COMPLEXIO_CFG1: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_COMPLEXIO_CFG1)); ++ printk(KERN_DEBUG "ISPCSI2_SYSSTATUS: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_SYSSTATUS)); ++ printk(KERN_DEBUG "ISPCSI2_SYSCONFIG: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_SYSCONFIG)); ++ printk(KERN_DEBUG "ISPCSI2_IRQENABLE: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_IRQENABLE)); ++ printk(KERN_DEBUG "ISPCSI2_IRQSTATUS: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_IRQSTATUS)); ++ ++ printk(KERN_DEBUG "ISPCSI2_CTX_IRQENABLE(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQENABLE(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_IRQSTATUS(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_IRQSTATUS(0))); ++ printk(KERN_DEBUG "ISPCSI2_TIMING: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_TIMING)); ++ printk(KERN_DEBUG "ISPCSI2PHY_CFG0: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ++ ISPCSI2PHY_CFG0)); ++ printk(KERN_DEBUG "ISPCSI2PHY_CFG1: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2PHY, ++ ISPCSI2PHY_CFG1)); ++ printk(KERN_DEBUG "ISPCSI2_CTX_CTRL1(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL1(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_CTRL2(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL2(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_CTRL3(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_CTRL3(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_DAT_OFST(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_OFST(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_DAT_PING_ADDR(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PING_ADDR(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTX_DAT_PONG_ADDR(0): %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ++ ISPCSI2_CTX_DAT_PONG_ADDR(0))); ++ printk(KERN_DEBUG "ISPCSI2_CTRL: %x\n", ++ isp_reg_readl(OMAP3_ISP_IOMEM_CSI2A, ISPCSI2_CTRL)); ++ printk(KERN_DEBUG "---------------------------------------\n"); ++} ++ ++/** ++ * isp_csi2_cleanup - Routine for module driver cleanup ++ **/ ++void isp_csi2_cleanup(void) ++{ ++ return; ++} ++ ++/** ++ * isp_csi2_init - Routine for module driver init ++ **/ ++int __init isp_csi2_init(void) ++{ ++ int i; ++ ++ update_complexio_cfg1 = false; ++ update_phy_cfg0 = false; ++ update_phy_cfg1 = false; ++ for (i = 0; i < 8; i++) { ++ update_ctx_ctrl1[i] = false; ++ update_ctx_ctrl2[i] = false; ++ update_ctx_ctrl3[i] = false; ++ } ++ update_timing = false; ++ update_ctrl = false; ++ ++ memset(¤t_csi2_cfg, 0, sizeof(current_csi2_cfg)); ++ memset(¤t_csi2_cfg_update, 0, sizeof(current_csi2_cfg_update)); ++ return 0; ++} ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP CSI2 Receiver Module"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/media/video/isp/ispcsi2.h b/drivers/media/video/isp/ispcsi2.h +new file mode 100644 +index 0000000..4582c96 +--- /dev/null ++++ b/drivers/media/video/isp/ispcsi2.h +@@ -0,0 +1,232 @@ ++/* ++ * ispcsi2.h ++ * ++ * Copyright (C) 2009 Texas Instruments. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Dominic Curran ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_CSI2_API_H ++#define OMAP_ISP_CSI2_API_H ++#include ++ ++enum isp_csi2_irqevents { ++ OCP_ERR_IRQ = 0x4000, ++ SHORT_PACKET_IRQ = 0x2000, ++ ECC_CORRECTION_IRQ = 0x1000, ++ ECC_NO_CORRECTION_IRQ = 0x800, ++ COMPLEXIO2_ERR_IRQ = 0x400, ++ COMPLEXIO1_ERR_IRQ = 0x200, ++ FIFO_OVF_IRQ = 0x100, ++ CONTEXT7 = 0x80, ++ CONTEXT6 = 0x40, ++ CONTEXT5 = 0x20, ++ CONTEXT4 = 0x10, ++ CONTEXT3 = 0x8, ++ CONTEXT2 = 0x4, ++ CONTEXT1 = 0x2, ++ CONTEXT0 = 0x1, ++}; ++ ++enum isp_csi2_ctx_irqevents { ++ CTX_ECC_CORRECTION = 0x100, ++ CTX_LINE_NUMBER = 0x80, ++ CTX_FRAME_NUMBER = 0x40, ++ CTX_CS = 0x20, ++ CTX_LE = 0x8, ++ CTX_LS = 0x4, ++ CTX_FE = 0x2, ++ CTX_FS = 0x1, ++}; ++ ++enum isp_csi2_power_cmds { ++ ISP_CSI2_POWER_OFF, ++ ISP_CSI2_POWER_ON, ++ ISP_CSI2_POWER_ULPW, ++}; ++ ++enum isp_csi2_frame_mode { ++ ISP_CSI2_FRAME_IMMEDIATE, ++ ISP_CSI2_FRAME_AFTERFEC, ++}; ++ ++struct csi2_lanecfg { ++ u8 pos; ++ u8 pol; ++}; ++ ++struct isp_csi2_lanes_cfg { ++ struct csi2_lanecfg data[4]; ++ struct csi2_lanecfg clk; ++}; ++ ++struct isp_csi2_lanes_cfg_update { ++ bool data[4]; ++ bool clk; ++}; ++ ++struct isp_csi2_phy_cfg { ++ u8 ths_term; ++ u8 ths_settle; ++ u8 tclk_term; ++ unsigned tclk_miss:1; ++ u8 tclk_settle; ++}; ++ ++struct isp_csi2_phy_cfg_update { ++ bool ths_term; ++ bool ths_settle; ++ bool tclk_term; ++ bool tclk_miss; ++ bool tclk_settle; ++}; ++ ++struct isp_csi2_ctx_cfg { ++ u8 virtual_id; ++ u8 frame_count; ++ struct v4l2_pix_format format; ++ u16 alpha; ++ u16 data_offset; ++ u32 ping_addr; ++ u32 pong_addr; ++ bool eof_enabled; ++ bool eol_enabled; ++ bool checksum_enabled; ++ bool enabled; ++}; ++ ++struct isp_csi2_ctx_cfg_update { ++ bool virtual_id; ++ bool frame_count; ++ bool format; ++ bool alpha; ++ bool data_offset; ++ bool ping_addr; ++ bool pong_addr; ++ bool eof_enabled; ++ bool eol_enabled; ++ bool checksum_enabled; ++ bool enabled; ++}; ++ ++struct isp_csi2_timings_cfg { ++ bool force_rx_mode; ++ bool stop_state_16x; ++ bool stop_state_4x; ++ u16 stop_state_counter; ++}; ++ ++struct isp_csi2_timings_cfg_update { ++ bool force_rx_mode; ++ bool stop_state_16x; ++ bool stop_state_4x; ++ bool stop_state_counter; ++}; ++ ++struct isp_csi2_ctrl_cfg { ++ bool vp_clk_enable; ++ bool vp_only_enable; ++ u8 vp_out_ctrl; ++ bool debug_enable; ++ u8 burst_size; ++ enum isp_csi2_frame_mode frame_mode; ++ bool ecc_enable; ++ bool secure_mode; ++ bool if_enable; ++}; ++ ++struct isp_csi2_ctrl_cfg_update { ++ bool vp_clk_enable; ++ bool vp_only_enable; ++ bool vp_out_ctrl; ++ bool debug_enable; ++ bool burst_size; ++ bool frame_mode; ++ bool ecc_enable; ++ bool secure_mode; ++ bool if_enable; ++}; ++ ++struct isp_csi2_cfg { ++ struct isp_csi2_lanes_cfg lanes; ++ struct isp_csi2_phy_cfg phy; ++ struct isp_csi2_ctx_cfg contexts[8]; ++ struct isp_csi2_timings_cfg timings[2]; ++ struct isp_csi2_ctrl_cfg ctrl; ++}; ++ ++struct isp_csi2_cfg_update { ++ struct isp_csi2_lanes_cfg_update lanes; ++ struct isp_csi2_phy_cfg_update phy; ++ struct isp_csi2_ctx_cfg_update contexts[8]; ++ struct isp_csi2_timings_cfg_update timings[2]; ++ struct isp_csi2_ctrl_cfg_update ctrl; ++}; ++ ++int isp_csi2_complexio_lanes_config(struct isp_csi2_lanes_cfg *reqcfg); ++int isp_csi2_complexio_lanes_update(bool force_update); ++int isp_csi2_complexio_lanes_get(void); ++int isp_csi2_complexio_power_autoswitch(bool enable); ++int isp_csi2_complexio_power(enum isp_csi2_power_cmds power_cmd); ++int isp_csi2_ctrl_config_frame_mode(enum isp_csi2_frame_mode frame_mode); ++int isp_csi2_ctrl_config_vp_clk_enable(bool vp_clk_enable); ++int isp_csi2_ctrl_config_vp_only_enable(bool vp_only_enable); ++int isp_csi2_ctrl_config_debug_enable(bool debug_enable); ++int isp_csi2_ctrl_config_burst_size(u8 burst_size); ++int isp_csi2_ctrl_config_ecc_enable(bool ecc_enable); ++int isp_csi2_ctrl_config_secure_mode(bool secure_mode); ++int isp_csi2_ctrl_config_if_enable(bool if_enable); ++int isp_csi2_ctrl_config_vp_out_ctrl(u8 vp_out_ctrl); ++int isp_csi2_ctrl_update(bool force_update); ++int isp_csi2_ctrl_get(void); ++int isp_csi2_ctx_config_virtual_id(u8 ctxnum, u8 virtual_id); ++int isp_csi2_ctx_config_frame_count(u8 ctxnum, u8 frame_count); ++int isp_csi2_ctx_config_format(u8 ctxnum, u32 pixformat); ++int isp_csi2_ctx_config_alpha(u8 ctxnum, u16 alpha); ++int isp_csi2_ctx_config_data_offset(u8 ctxnum, u16 data_offset); ++int isp_csi2_ctx_config_ping_addr(u8 ctxnum, u32 ping_addr); ++int isp_csi2_ctx_config_pong_addr(u8 ctxnum, u32 pong_addr); ++int isp_csi2_ctx_config_eof_enabled(u8 ctxnum, bool eof_enabled); ++int isp_csi2_ctx_config_eol_enabled(u8 ctxnum, bool eol_enabled); ++int isp_csi2_ctx_config_checksum_enabled(u8 ctxnum, bool checksum_enabled); ++int isp_csi2_ctx_config_enabled(u8 ctxnum, bool enabled); ++int isp_csi2_ctx_update(u8 ctxnum, bool force_update); ++int isp_csi2_ctx_get(u8 ctxnum); ++int isp_csi2_ctx_update_all(bool force_update); ++int isp_csi2_ctx_get_all(void); ++int isp_csi2_phy_config(struct isp_csi2_phy_cfg *desiredphyconfig); ++int isp_csi2_calc_phy_cfg0(u32 mipiclk, u32 lbound_hs_settle, ++ u32 ubound_hs_settle); ++int isp_csi2_phy_update(bool force_update); ++int isp_csi2_phy_get(void); ++int isp_csi2_timings_config_forcerxmode(u8 io, bool force_rx_mode); ++int isp_csi2_timings_config_stopstate_16x(u8 io, bool stop_state_16x); ++int isp_csi2_timings_config_stopstate_4x(u8 io, bool stop_state_4x); ++int isp_csi2_timings_config_stopstate_cnt(u8 io, u16 stop_state_counter); ++int isp_csi2_timings_update(u8 io, bool force_update); ++int isp_csi2_timings_get(u8 io); ++int isp_csi2_timings_update_all(bool force_update); ++int isp_csi2_timings_get_all(void); ++void isp_csi2_irq_complexio1_set(int enable); ++void isp_csi2_irq_ctx_set(int enable); ++void isp_csi2_irq_status_set(int enable); ++void isp_csi2_irq_set(int enable); ++void isp_csi2_irq_all_set(int enable); ++ ++void isp_csi2_isr(void); ++int isp_csi2_reset(void); ++void isp_csi2_enable(int enable); ++void isp_csi2_regdump(void); ++ ++#endif /* OMAP_ISP_CSI2_H */ ++ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0008-omap3isp-Add-ISP-tables.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0008-omap3isp-Add-ISP-tables.patch new file mode 100644 index 0000000000..db023e514d --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0008-omap3isp-Add-ISP-tables.patch @@ -0,0 +1,4018 @@ +From 5de7cb2cac5f7d76cb025ddc8fb09c99a1007e08 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:02 +0200 +Subject: [PATCH] omap3isp: Add ISP tables + +* Blue Gamma gain table +* CFA gain table +* Green Gamma gain table +* Luma Enhancement gain table +* Noise filter gain table +* Red Gamma gain table + +TODO: + +- Get rid of this kind of tables. Either generate them at runtime or + use a user space program to fill defaults. + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/isp/bluegamma_table.h | 1040 ++++++++++++++++++++++++++ + drivers/media/video/isp/cfa_coef_table.h | 603 +++++++++++++++ + drivers/media/video/isp/greengamma_table.h | 1040 ++++++++++++++++++++++++++ + drivers/media/video/isp/luma_enhance_table.h | 144 ++++ + drivers/media/video/isp/noise_filter_table.h | 79 ++ + drivers/media/video/isp/redgamma_table.h | 1040 ++++++++++++++++++++++++++ + 6 files changed, 3946 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/isp/bluegamma_table.h + create mode 100644 drivers/media/video/isp/cfa_coef_table.h + create mode 100644 drivers/media/video/isp/greengamma_table.h + create mode 100644 drivers/media/video/isp/luma_enhance_table.h + create mode 100644 drivers/media/video/isp/noise_filter_table.h + create mode 100644 drivers/media/video/isp/redgamma_table.h + +diff --git a/drivers/media/video/isp/bluegamma_table.h b/drivers/media/video/isp/bluegamma_table.h +new file mode 100644 +index 0000000..301382a +--- /dev/null ++++ b/drivers/media/video/isp/bluegamma_table.h +@@ -0,0 +1,1040 @@ ++/* ++ * bluegamma_table.h ++ * ++ * Gamma Table values for BLUE for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +diff --git a/drivers/media/video/isp/cfa_coef_table.h b/drivers/media/video/isp/cfa_coef_table.h +new file mode 100644 +index 0000000..8cafa1f +--- /dev/null ++++ b/drivers/media/video/isp/cfa_coef_table.h +@@ -0,0 +1,603 @@ ++/* ++ * cfa_coef_table.h ++ * ++ * Copyright (C) 2009 Nokia Corporation ++ * ++ * Contact: Sakari Ailus ++ * Tuukka Toivonen ++ * ++ * Written by Gjorgji Rosikopulos ++ * ++ * 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 published by the Free Software Foundation. ++ * ++ * 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., 51 Franklin St, Fifth Floor, Boston, MA ++ * 02110-1301 USA ++ * ++ */ ++ ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248 ++ +diff --git a/drivers/media/video/isp/greengamma_table.h b/drivers/media/video/isp/greengamma_table.h +new file mode 100644 +index 0000000..0f5c5e4 +--- /dev/null ++++ b/drivers/media/video/isp/greengamma_table.h +@@ -0,0 +1,1040 @@ ++/* ++ * greengamma_table.h ++ * ++ * Gamma Table values for GREEN for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +diff --git a/drivers/media/video/isp/luma_enhance_table.h b/drivers/media/video/isp/luma_enhance_table.h +new file mode 100644 +index 0000000..99c8b05 +--- /dev/null ++++ b/drivers/media/video/isp/luma_enhance_table.h +@@ -0,0 +1,144 @@ ++/* ++ * luma_enhance_table.h ++ * ++ * Luminance Enhancement table values for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1048575, ++1047551, ++1046527, ++1045503, ++1044479, ++1043455, ++1042431, ++1041407, ++1040383, ++1039359, ++1038335, ++1037311, ++1036287, ++1035263, ++1034239, ++1033215, ++1032191, ++1031167, ++1030143, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028100, ++1032196, ++1036292, ++1040388, ++1044484, ++0, ++0, ++0, ++5, ++5125, ++10245, ++15365, ++20485, ++25605, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++31743, ++30719, ++29695, ++28671, ++27647, ++26623, ++25599, ++24575, ++23551, ++22527, ++21503, ++20479, ++19455, ++18431, ++17407, ++16383, ++15359, ++14335, ++13311, ++12287, ++11263, ++10239, ++9215, ++8191, ++7167, ++6143, ++5119, ++4095, ++3071, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024 +diff --git a/drivers/media/video/isp/noise_filter_table.h b/drivers/media/video/isp/noise_filter_table.h +new file mode 100644 +index 0000000..7345f90 +--- /dev/null ++++ b/drivers/media/video/isp/noise_filter_table.h +@@ -0,0 +1,79 @@ ++/* ++ * noise_filter_table.h ++ * ++ * Noise Filter Table values for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++16, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31, ++31 +diff --git a/drivers/media/video/isp/redgamma_table.h b/drivers/media/video/isp/redgamma_table.h +new file mode 100644 +index 0000000..ad0232a +--- /dev/null ++++ b/drivers/media/video/isp/redgamma_table.h +@@ -0,0 +1,1040 @@ ++/* ++ * redgamma_table.h ++ * ++ * Gamma Table values for RED for TI's OMAP3 Camera ISP ++ * ++ * Copyright (C) 2009 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0009-omap34xxcam-Add-camera-driver.patch b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0009-omap34xxcam-Add-camera-driver.patch new file mode 100644 index 0000000000..22074be148 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/omap3camera/0009-omap34xxcam-Add-camera-driver.patch @@ -0,0 +1,2249 @@ +From 0edf5a50dc0164db5bc71b1a5d1aa8bb1838262c Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Tue, 10 Mar 2009 10:49:03 +0200 +Subject: [PATCH] omap34xxcam: Add camera driver + +This is the camera driver for the OMAP 3 camera ISP and v4l2-int-device +sensors, lenses and (led) flashes. There are a few connections to OMAP +3 left but after those have been broken this is hardware independent. +Namely, the OMAP 3 ISP must offer a standard interface through +v4l2_subdev (or v4l2-int-device) first. + +This driver has originated from the omap24xxcam camera driver written +specifically for OMAP 2. + +TODO: + +- Convert to use v4l2_subdev instead of v4l2-int-device. + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/Kconfig | 9 + + drivers/media/video/Makefile | 2 + + drivers/media/video/omap34xxcam.c | 1966 +++++++++++++++++++++++++++++++++++++ + drivers/media/video/omap34xxcam.h | 207 ++++ + 4 files changed, 2184 insertions(+), 0 deletions(-) + create mode 100644 drivers/media/video/omap34xxcam.c + create mode 100644 drivers/media/video/omap34xxcam.h + +diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig +index 19cf3b8..3cdb5a4 100644 +--- a/drivers/media/video/Kconfig ++++ b/drivers/media/video/Kconfig +@@ -711,6 +711,15 @@ config VIDEO_CAFE_CCIC + CMOS camera controller. This is the controller found on first- + generation OLPC systems. + ++config VIDEO_OMAP3 ++ tristate "OMAP 3 Camera support" ++ select VIDEOBUF_GEN ++ select VIDEOBUF_DMA_SG ++ select OMAP_IOMMU ++ depends on VIDEO_V4L2 && ARCH_OMAP34XX ++ ---help--- ++ Driver for an OMAP 3 camera controller. ++ + config SOC_CAMERA + tristate "SoC camera support" + depends on VIDEO_V4L2 && HAS_DMA +diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile +index e654270..74a684e 100644 +--- a/drivers/media/video/Makefile ++++ b/drivers/media/video/Makefile +@@ -108,6 +108,8 @@ obj-$(CONFIG_VIDEO_OV7670) += ov7670.o + + obj-y += isp/ + ++obj-$(CONFIG_VIDEO_OMAP3) += omap34xxcam.o ++ + obj-$(CONFIG_VIDEO_TCM825X) += tcm825x.o + + obj-$(CONFIG_USB_DABUSB) += dabusb.o +diff --git a/drivers/media/video/omap34xxcam.c b/drivers/media/video/omap34xxcam.c +new file mode 100644 +index 0000000..00fdbf2 +--- /dev/null ++++ b/drivers/media/video/omap34xxcam.c +@@ -0,0 +1,1966 @@ ++/* ++ * omap34xxcam.c ++ * ++ * Copyright (C) 2006--2009 Nokia Corporation ++ * Copyright (C) 2007--2009 Texas Instruments ++ * ++ * Contact: Sakari Ailus ++ * Tuukka Toivonen ++ * ++ * Originally based on the OMAP 2 camera driver. ++ * ++ * Written by Sakari Ailus ++ * Tuukka Toivonen ++ * Sergio Aguirre ++ * Mohit Jalori ++ * Sameer Venkatraman ++ * Leonides Martinez ++ * ++ * 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 published by the Free Software Foundation. ++ * ++ * 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., 51 Franklin St, Fifth Floor, Boston, MA ++ * 02110-1301 USA ++ * ++ */ ++ ++#include ++#include ++#include /* needed for videobufs */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "omap34xxcam.h" ++#include "isp/isp.h" ++#include "isp/ispmmu.h" ++#include "isp/ispreg.h" ++#include "isp/ispccdc.h" ++#include "isp/isph3a.h" ++#include "isp/isp_af.h" ++#include "isp/isphist.h" ++#include "isp/isppreview.h" ++#include "isp/ispresizer.h" ++ ++#define OMAP34XXCAM_VERSION KERNEL_VERSION(0, 0, 0) ++ ++/* global variables */ ++static struct omap34xxcam_device *omap34xxcam; ++ ++/* ++ * ++ * Sensor handling. ++ * ++ */ ++ ++/** ++ * omap34xxcam_slave_power_set - set slave power state ++ * @vdev: per-video device data structure ++ * @power: new power state ++ */ ++static int omap34xxcam_slave_power_set(struct omap34xxcam_videodev *vdev, ++ enum v4l2_power power, ++ int mask) ++{ ++ int rval = 0, i = 0; ++ ++ BUG_ON(!mutex_is_locked(&vdev->mutex)); ++ ++#ifdef OMAP34XXCAM_POWEROFF_DELAY ++ vdev->power_state_wish = -1; ++#endif ++ ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ if (vdev->slave[i] == v4l2_int_device_dummy()) ++ continue; ++ ++ if (!(mask & (1 << i)) ++ || power == vdev->power_state[i]) ++ continue; ++ ++ rval = vidioc_int_s_power(vdev->slave[i], power); ++ ++ if (rval && power != V4L2_POWER_OFF) { ++ power = V4L2_POWER_OFF; ++ goto out; ++ } ++ ++ vdev->power_state[i] = power; ++ } ++ ++ return 0; ++ ++out: ++ for (i--; i >= 0; i--) { ++ if (vdev->slave[i] == v4l2_int_device_dummy()) ++ continue; ++ ++ if (!(mask & (1 << i))) ++ continue; ++ ++ vidioc_int_s_power(vdev->slave[i], power); ++ vdev->power_state[i] = power; ++ } ++ ++ return rval; ++} ++ ++#ifdef OMAP34XXCAM_POWEROFF_DELAY ++static void omap34xxcam_slave_power_work(struct work_struct *work) ++{ ++ struct omap34xxcam_videodev *vdev = ++ container_of(work, struct omap34xxcam_videodev, poweroff_work); ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->power_state_wish != -1) ++ omap34xxcam_slave_power_set(vdev, vdev->power_state_wish, ++ vdev->power_state_mask); ++ ++ mutex_unlock(&vdev->mutex); ++} ++ ++static void omap34xxcam_slave_power_timer(unsigned long ptr) ++{ ++ struct omap34xxcam_videodev *vdev = (void *)ptr; ++ ++ schedule_work(&vdev->poweroff_work); ++} ++ ++/** ++ * omap34xxcam_slave_power_suggest - delayed power state change ++ * ++ * @vdev: per-video device data structure ++ * @power: new power state ++ */ ++static void omap34xxcam_slave_power_suggest(struct omap34xxcam_videodev *vdev, ++ enum v4l2_power power, ++ int mask) ++{ ++ BUG_ON(!mutex_is_locked(&vdev->mutex)); ++ ++ del_timer(&vdev->poweroff_timer); ++ ++ vdev->power_state_wish = power; ++ vdev->power_state_mask = mask; ++ ++ mod_timer(&vdev->poweroff_timer, jiffies + OMAP34XXCAM_POWEROFF_DELAY); ++} ++#else /* OMAP34XXCAM_POWEROFF_DELAY */ ++#define omap34xxcam_slave_power_suggest(a, b, c) do {} while (0) ++#endif /* OMAP34XXCAM_POWEROFF_DELAY */ ++ ++/** ++ * omap34xxcam_update_vbq - Updates VBQ with completed input buffer ++ * @vb: ptr. to standard V4L2 video buffer structure ++ * ++ * Updates video buffer queue with completed buffer passed as ++ * input parameter. Also updates ISP H3A timestamp and field count ++ * statistics. ++ */ ++void omap34xxcam_vbq_complete(struct videobuf_buffer *vb, void *priv) ++{ ++ struct omap34xxcam_fh *fh = priv; ++ ++ do_gettimeofday(&vb->ts); ++ vb->field_count = atomic_add_return(2, &fh->field_count); ++ ++ wake_up(&vb->done); ++} ++ ++/** ++ * omap34xxcam_vbq_setup - Calcs size and num of buffs allowed in queue ++ * @vbq: ptr. to standard V4L2 video buffer queue structure ++ * @cnt: ptr to location to hold the count of buffers to be in the queue ++ * @size: ptr to location to hold the size of a frame ++ * ++ * Calculates the number of buffers of current image size that can be ++ * supported by the available capture memory. ++ */ ++static int omap34xxcam_vbq_setup(struct videobuf_queue *vbq, unsigned int *cnt, ++ unsigned int *size) ++{ ++ struct omap34xxcam_fh *fh = vbq->priv_data; ++ struct omap34xxcam_videodev *vdev = fh->vdev; ++ ++ if (*cnt <= 0) ++ *cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */ ++ ++ if (*cnt > VIDEO_MAX_FRAME) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ *size = vdev->pix.sizeimage; ++ ++ while (*size * *cnt > fh->vdev->vdev_sensor_config.capture_mem) ++ (*cnt)--; ++ ++ return isp_vbq_setup(vbq, cnt, size); ++} ++ ++/** ++ * omap34xxcam_vbq_release - Free resources for input VBQ and VB ++ * @vbq: ptr. to standard V4L2 video buffer queue structure ++ * @vb: ptr to standard V4L2 video buffer structure ++ * ++ * Unmap and free all memory associated with input VBQ and VB, also ++ * unmap the address in ISP MMU. Reset the VB state. ++ */ ++static void omap34xxcam_vbq_release(struct videobuf_queue *vbq, ++ struct videobuf_buffer *vb) ++{ ++ if (!vbq->streaming) { ++ isp_vbq_release(vbq, vb); ++ videobuf_dma_unmap(vbq, videobuf_to_dma(vb)); ++ videobuf_dma_free(videobuf_to_dma(vb)); ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ } ++ return; ++} ++ ++/** ++ * omap34xxcam_vbq_prepare - V4L2 video ops buf_prepare handler ++ * @vbq: ptr. to standard V4L2 video buffer queue structure ++ * @vb: ptr to standard V4L2 video buffer structure ++ * @field: standard V4L2 field enum ++ * ++ * Verifies there is sufficient locked memory for the requested ++ * buffer, or if there is not, allocates, locks and initializes ++ * it. ++ */ ++static int omap34xxcam_vbq_prepare(struct videobuf_queue *vbq, ++ struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ struct omap34xxcam_fh *fh = vbq->priv_data; ++ struct omap34xxcam_videodev *vdev = fh->vdev; ++ int err = 0; ++ ++ /* ++ * Accessing pix here is okay since it's constant while ++ * streaming is on (and we only get called then). ++ */ ++ if (vb->baddr) { ++ /* This is a userspace buffer. */ ++ if (vdev->pix.sizeimage > vb->bsize) ++ /* The buffer isn't big enough. */ ++ return -EINVAL; ++ } else { ++ if (vb->state != VIDEOBUF_NEEDS_INIT ++ && vdev->pix.sizeimage > vb->bsize) ++ /* ++ * We have a kernel bounce buffer that has ++ * already been allocated. ++ */ ++ omap34xxcam_vbq_release(vbq, vb); ++ } ++ ++ vb->size = vdev->pix.bytesperline * vdev->pix.height; ++ vb->width = vdev->pix.width; ++ vb->height = vdev->pix.height; ++ vb->field = field; ++ ++ if (vb->state == VIDEOBUF_NEEDS_INIT) { ++ err = videobuf_iolock(vbq, vb, NULL); ++ if (!err) { ++ /* isp_addr will be stored locally inside isp code */ ++ err = isp_vbq_prepare(vbq, vb, field); ++ } ++ } ++ ++ if (!err) ++ vb->state = VIDEOBUF_PREPARED; ++ else ++ omap34xxcam_vbq_release(vbq, vb); ++ ++ return err; ++} ++ ++/** ++ * omap34xxcam_vbq_queue - V4L2 video ops buf_queue handler ++ * @vbq: ptr. to standard V4L2 video buffer queue structure ++ * @vb: ptr to standard V4L2 video buffer structure ++ * ++ * Maps the video buffer to sgdma and through the isp, sets ++ * the isp buffer done callback and sets the video buffer state ++ * to active. ++ */ ++static void omap34xxcam_vbq_queue(struct videobuf_queue *vbq, ++ struct videobuf_buffer *vb) ++{ ++ struct omap34xxcam_fh *fh = vbq->priv_data; ++ ++ vb->state = VIDEOBUF_ACTIVE; ++ ++ isp_buf_queue(vb, omap34xxcam_vbq_complete, (void *)fh); ++} ++ ++static struct videobuf_queue_ops omap34xxcam_vbq_ops = { ++ .buf_setup = omap34xxcam_vbq_setup, ++ .buf_prepare = omap34xxcam_vbq_prepare, ++ .buf_queue = omap34xxcam_vbq_queue, ++ .buf_release = omap34xxcam_vbq_release, ++}; ++ ++/* ++ * ++ * IOCTL interface. ++ * ++ */ ++ ++/** ++ * vidioc_querycap - V4L2 query capabilities IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @cap: ptr to standard V4L2 capability structure ++ * ++ * Fill in the V4L2 capabliity structure for the camera device ++ */ ++static int vidioc_querycap(struct file *file, void *fh, ++ struct v4l2_capability *cap) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ ++ strlcpy(cap->driver, CAM_SHORT_NAME, sizeof(cap->driver)); ++ strlcpy(cap->card, vdev->vfd->name, sizeof(cap->card)); ++ cap->version = OMAP34XXCAM_VERSION; ++ if (vdev->vdev_sensor != v4l2_int_device_dummy()) ++ cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; ++ ++ return 0; ++} ++ ++/** ++ * vidioc_enum_fmt_vid_cap - V4L2 enumerate format capabilities IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @f: ptr to standard V4L2 format description structure ++ * ++ * Fills in enumerate format capabilities information for sensor (if SOC ++ * sensor attached) or ISP (if raw sensor attached). ++ */ ++static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh, ++ struct v4l2_fmtdesc *f) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) ++ rval = vidioc_int_enum_fmt_cap(vdev->vdev_sensor, f); ++ else ++ rval = isp_enum_fmt_cap(f); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_g_fmt_vid_cap - V4L2 get format capabilities IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @f: ptr to standard V4L2 format structure ++ * ++ * Fills in format capabilities for sensor (if SOC sensor attached) or ISP ++ * (if raw sensor attached). ++ */ ++static int vidioc_g_fmt_vid_cap(struct file *file, void *fh, ++ struct v4l2_format *f) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ f->fmt.pix = vdev->pix; ++ mutex_unlock(&vdev->mutex); ++ ++ return 0; ++} ++ ++static int try_pix_parm(struct omap34xxcam_videodev *vdev, ++ struct v4l2_pix_format *best_pix_in, ++ struct v4l2_pix_format *wanted_pix_out, ++ struct v4l2_fract *best_ival) ++{ ++ int fps; ++ int fmtd_index; ++ int rval; ++ struct v4l2_pix_format best_pix_out; ++ ++ if (best_ival->numerator == 0 ++ || best_ival->denominator == 0) ++ *best_ival = vdev->vdev_sensor_config.ival_default; ++ ++ fps = best_ival->denominator / best_ival->numerator; ++ ++ best_ival->denominator = 0; ++ best_pix_out.height = INT_MAX >> 1; ++ best_pix_out.width = best_pix_out.height; ++ ++ for (fmtd_index = 0; ; fmtd_index++) { ++ int size_index; ++ struct v4l2_fmtdesc fmtd; ++ ++ fmtd.index = fmtd_index; ++ fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ rval = vidioc_int_enum_fmt_cap(vdev->vdev_sensor, &fmtd); ++ if (rval) ++ break; ++ dev_info(&vdev->vfd->dev, "trying fmt %8.8x (%d)\n", ++ fmtd.pixelformat, fmtd_index); ++ /* ++ * Get supported resolutions. ++ */ ++ for (size_index = 0; ; size_index++) { ++ struct v4l2_frmsizeenum frms; ++ struct v4l2_pix_format pix_tmp_in, pix_tmp_out; ++ int ival_index; ++ ++ frms.index = size_index; ++ frms.pixel_format = fmtd.pixelformat; ++ ++ rval = vidioc_int_enum_framesizes(vdev->vdev_sensor, ++ &frms); ++ if (rval) ++ break; ++ ++ pix_tmp_in.pixelformat = frms.pixel_format; ++ pix_tmp_in.width = frms.discrete.width; ++ pix_tmp_in.height = frms.discrete.height; ++ pix_tmp_out = *wanted_pix_out; ++ /* Don't do upscaling. */ ++ if (pix_tmp_out.width > pix_tmp_in.width) ++ pix_tmp_out.width = pix_tmp_in.width; ++ if (pix_tmp_out.height > pix_tmp_in.height) ++ pix_tmp_out.height = pix_tmp_in.height; ++ rval = isp_try_fmt_cap(&pix_tmp_in, &pix_tmp_out); ++ if (rval) ++ return rval; ++ ++ dev_info(&vdev->vfd->dev, "this w %d\th %d\tfmt %8.8x\t" ++ "-> w %d\th %d\t fmt %8.8x" ++ "\twanted w %d\th %d\t fmt %8.8x\n", ++ pix_tmp_in.width, pix_tmp_in.height, ++ pix_tmp_in.pixelformat, ++ pix_tmp_out.width, pix_tmp_out.height, ++ pix_tmp_out.pixelformat, ++ wanted_pix_out->width, wanted_pix_out->height, ++ wanted_pix_out->pixelformat); ++ ++#define IS_SMALLER_OR_EQUAL(pix1, pix2) \ ++ ((pix1)->width + (pix1)->height \ ++ < (pix2)->width + (pix2)->height) ++#define SIZE_DIFF(pix1, pix2) \ ++ (abs((pix1)->width - (pix2)->width) \ ++ + abs((pix1)->height - (pix2)->height)) ++ ++ /* ++ * Don't use modes that are farther from wanted size ++ * that what we already got. ++ */ ++ if (SIZE_DIFF(&pix_tmp_out, wanted_pix_out) ++ > SIZE_DIFF(&best_pix_out, wanted_pix_out)) { ++ dev_info(&vdev->vfd->dev, "size diff bigger: " ++ "w %d\th %d\tw %d\th %d\n", ++ pix_tmp_out.width, pix_tmp_out.height, ++ best_pix_out.width, ++ best_pix_out.height); ++ continue; ++ } ++ ++ /* ++ * There's an input mode that can provide output ++ * closer to wanted. ++ */ ++ if (SIZE_DIFF(&pix_tmp_out, wanted_pix_out) ++ < SIZE_DIFF(&best_pix_out, wanted_pix_out)) { ++ /* Force renegotation of fps etc. */ ++ best_ival->denominator = 0; ++ dev_info(&vdev->vfd->dev, "renegotiate: " ++ "w %d\th %d\tw %d\th %d\n", ++ pix_tmp_out.width, pix_tmp_out.height, ++ best_pix_out.width, ++ best_pix_out.height); ++ } ++ ++ for (ival_index = 0; ; ival_index++) { ++ struct v4l2_frmivalenum frmi; ++ ++ frmi.index = ival_index; ++ frmi.pixel_format = frms.pixel_format; ++ frmi.width = frms.discrete.width; ++ frmi.height = frms.discrete.height; ++ /* FIXME: try to fix standard... */ ++ frmi.reserved[0] = 0xdeafbeef; ++ ++ rval = vidioc_int_enum_frameintervals( ++ vdev->vdev_sensor, &frmi); ++ if (rval) ++ break; ++ ++ dev_info(&vdev->vfd->dev, "fps %d\n", ++ frmi.discrete.denominator ++ / frmi.discrete.numerator); ++ ++ if (best_ival->denominator == 0) ++ goto do_it_now; ++ ++ /* ++ * We aim to use maximum resolution ++ * from the sensor, provided that the ++ * fps is at least as close as on the ++ * current mode. ++ */ ++#define FPS_ABS_DIFF(fps, ival) abs(fps - (ival).denominator / (ival).numerator) ++ ++ /* Select mode with closest fps. */ ++ if (FPS_ABS_DIFF(fps, frmi.discrete) ++ < FPS_ABS_DIFF(fps, *best_ival)) { ++ dev_info(&vdev->vfd->dev, "closer fps: " ++ "fps %d\t fps %d\n", ++ FPS_ABS_DIFF(fps, ++ frmi.discrete), ++ FPS_ABS_DIFF(fps, *best_ival)); ++ goto do_it_now; ++ } ++ ++ /* ++ * Select bigger resolution if it's available ++ * at same fps. ++ */ ++ if (frmi.width + frmi.height ++ > best_pix_in->width + best_pix_in->height ++ && FPS_ABS_DIFF(fps, frmi.discrete) ++ <= FPS_ABS_DIFF(fps, *best_ival)) { ++ dev_info(&vdev->vfd->dev, "bigger res, " ++ "same fps: " ++ "w %d\th %d\tw %d\th %d\n", ++ frmi.width, frmi.height, ++ best_pix_in->width, ++ best_pix_in->height); ++ goto do_it_now; ++ } ++ ++ dev_info(&vdev->vfd->dev, "falling through\n"); ++ ++ continue; ++ ++do_it_now: ++ *best_ival = frmi.discrete; ++ best_pix_out = pix_tmp_out; ++ best_pix_in->width = frmi.width; ++ best_pix_in->height = frmi.height; ++ best_pix_in->pixelformat = frmi.pixel_format; ++ ++ dev_info(&vdev->vfd->dev, ++ "best_pix_in: w %d\th %d\tfmt %8.8x" ++ "\tival %d/%d\n", ++ best_pix_in->width, ++ best_pix_in->height, ++ best_pix_in->pixelformat, ++ best_ival->numerator, ++ best_ival->denominator); ++ } ++ } ++ } ++ ++ if (best_ival->denominator == 0) ++ return -EINVAL; ++ ++ *wanted_pix_out = best_pix_out; ++ ++ dev_info(&vdev->vfd->dev, "w %d, h %d, fmt %8.8x -> w %d, h %d\n", ++ best_pix_in->width, best_pix_in->height, ++ best_pix_in->pixelformat, ++ best_pix_out.width, best_pix_out.height); ++ ++ return isp_try_fmt_cap(best_pix_in, wanted_pix_out); ++} ++ ++static int s_pix_parm(struct omap34xxcam_videodev *vdev, ++ struct v4l2_pix_format *best_pix, ++ struct v4l2_pix_format *pix, ++ struct v4l2_fract *best_ival) ++{ ++ struct v4l2_streamparm a; ++ struct v4l2_format fmt; ++ int rval; ++ ++ rval = try_pix_parm(vdev, best_pix, pix, best_ival); ++ if (rval) ++ return rval; ++ ++ rval = isp_s_fmt_cap(best_pix, pix); ++ if (rval) ++ return rval; ++ ++ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ fmt.fmt.pix = *best_pix; ++ rval = vidioc_int_s_fmt_cap(vdev->vdev_sensor, &fmt); ++ if (rval) ++ return rval; ++ ++ a.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ a.parm.capture.timeperframe = *best_ival; ++ rval = vidioc_int_s_parm(vdev->vdev_sensor, &a); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_s_fmt_vid_cap - V4L2 set format capabilities IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @f: ptr to standard V4L2 format structure ++ * ++ * Attempts to set input format with the sensor driver (first) and then the ++ * ISP. Returns the return code from vidioc_g_fmt_vid_cap(). ++ */ ++static int vidioc_s_fmt_vid_cap(struct file *file, void *fh, ++ struct v4l2_format *f) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct v4l2_pix_format pix_tmp; ++ struct v4l2_fract timeperframe; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming) { ++ rval = -EBUSY; ++ goto out; ++ } ++ ++ vdev->want_pix = f->fmt.pix; ++ ++ timeperframe = vdev->want_timeperframe; ++ ++ rval = s_pix_parm(vdev, &pix_tmp, &f->fmt.pix, &timeperframe); ++ if (!rval) ++ vdev->pix = f->fmt.pix; ++ ++out: ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_try_fmt_vid_cap - V4L2 try format capabilities IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @f: ptr to standard V4L2 format structure ++ * ++ * Checks if the given format is supported by the sensor driver and ++ * by the ISP. ++ */ ++static int vidioc_try_fmt_vid_cap(struct file *file, void *fh, ++ struct v4l2_format *f) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct v4l2_pix_format pix_tmp; ++ struct v4l2_fract timeperframe; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ ++ timeperframe = vdev->want_timeperframe; ++ ++ rval = try_pix_parm(vdev, &pix_tmp, &f->fmt.pix, &timeperframe); ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_reqbufs - V4L2 request buffers IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @b: ptr to standard V4L2 request buffers structure ++ * ++ * Attempts to get a buffer from the buffer queue associated with the ++ * fh through the video buffer library API. ++ */ ++static int vidioc_reqbufs(struct file *file, void *fh, ++ struct v4l2_requestbuffers *b) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming) { ++ mutex_unlock(&vdev->mutex); ++ return -EBUSY; ++ } ++ ++ rval = videobuf_reqbufs(&ofh->vbq, b); ++ ++ mutex_unlock(&vdev->mutex); ++ ++ /* ++ * Either videobuf_reqbufs failed or the buffers are not ++ * memory-mapped (which would need special attention). ++ */ ++ if (rval < 0 || b->memory != V4L2_MEMORY_MMAP) ++ goto out; ++ ++out: ++ return rval; ++} ++ ++/** ++ * vidioc_querybuf - V4L2 query buffer IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @b: ptr to standard V4L2 buffer structure ++ * ++ * Attempts to fill in the v4l2_buffer structure for the buffer queue ++ * associated with the fh through the video buffer library API. ++ */ ++static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ ++ return videobuf_querybuf(&ofh->vbq, b); ++} ++ ++/** ++ * vidioc_qbuf - V4L2 queue buffer IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @b: ptr to standard V4L2 buffer structure ++ * ++ * Attempts to queue the v4l2_buffer on the buffer queue ++ * associated with the fh through the video buffer library API. ++ */ ++static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ ++ return videobuf_qbuf(&ofh->vbq, b); ++} ++ ++/** ++ * vidioc_dqbuf - V4L2 dequeue buffer IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @b: ptr to standard V4L2 buffer structure ++ * ++ * Attempts to dequeue the v4l2_buffer from the buffer queue ++ * associated with the fh through the video buffer library API. If the ++ * buffer is a user space buffer, then this function will also requeue it, ++ * as user does not expect to do this. ++ */ ++static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ int rval; ++ ++videobuf_dqbuf_again: ++ rval = videobuf_dqbuf(&ofh->vbq, b, file->f_flags & O_NONBLOCK); ++ ++ /* ++ * This is a hack. We don't want to show -EIO to the user ++ * space. Requeue the buffer and try again if we're not doing ++ * this in non-blocking mode. ++ */ ++ if (rval == -EIO) { ++ videobuf_qbuf(&ofh->vbq, b); ++ if (!(file->f_flags & O_NONBLOCK)) ++ goto videobuf_dqbuf_again; ++ /* ++ * We don't have a videobuf_buffer now --- maybe next ++ * time... ++ */ ++ rval = -EAGAIN; ++ } ++ ++ return rval; ++} ++ ++/** ++ * vidioc_streamon - V4L2 streamon IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @i: V4L2 buffer type ++ * ++ * Attempts to start streaming by enabling the sensor interface and turning ++ * on video buffer streaming through the video buffer library API. Upon ++ * success the function returns 0, otherwise an error code is returned. ++ */ ++static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming) { ++ rval = -EBUSY; ++ goto out; ++ } ++ ++ rval = omap34xxcam_slave_power_set(vdev, V4L2_POWER_ON, ++ OMAP34XXCAM_SLAVE_POWER_SENSOR_LENS); ++ if (rval) { ++ dev_dbg(&vdev->vfd->dev, ++ "omap34xxcam_slave_power_set failed\n"); ++ goto out; ++ } ++ ++ rval = videobuf_streamon(&ofh->vbq); ++ if (rval) ++ omap34xxcam_slave_power_set( ++ vdev, V4L2_POWER_OFF, ++ OMAP34XXCAM_SLAVE_POWER_SENSOR_LENS); ++ else ++ vdev->streaming = file; ++ ++out: ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_streamoff - V4L2 streamoff IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @i: V4L2 buffer type ++ * ++ * Attempts to stop streaming by flushing all scheduled work, waiting on ++ * any queued buffers to complete and then stopping the ISP and turning ++ * off video buffer streaming through the video buffer library API. Upon ++ * success the function returns 0, otherwise an error code is returned. ++ */ ++static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct videobuf_queue *q = &ofh->vbq; ++ int rval; ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->streaming == file) ++ isp_stop(); ++ ++ rval = videobuf_streamoff(q); ++ if (!rval) { ++ vdev->streaming = NULL; ++ ++ omap34xxcam_slave_power_set(vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_SENSOR); ++ omap34xxcam_slave_power_suggest(vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_LENS); ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_enum_input - V4L2 enumerate input IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @inp: V4L2 input type information structure ++ * ++ * Fills in v4l2_input structure. Returns 0. ++ */ ++static int vidioc_enum_input(struct file *file, void *fh, ++ struct v4l2_input *inp) ++{ ++ if (inp->index > 0) ++ return -EINVAL; ++ ++ strlcpy(inp->name, "camera", sizeof(inp->name)); ++ inp->type = V4L2_INPUT_TYPE_CAMERA; ++ ++ return 0; ++} ++ ++/** ++ * vidioc_g_input - V4L2 get input IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @i: address to hold index of input supported ++ * ++ * Sets index to 0. ++ */ ++static int vidioc_g_input(struct file *file, void *fh, unsigned int *i) ++{ ++ *i = 0; ++ ++ return 0; ++} ++ ++/** ++ * vidioc_s_input - V4L2 set input IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @i: index of input selected ++ * ++ * 0 is only index supported. ++ */ ++static int vidioc_s_input(struct file *file, void *fh, unsigned int i) ++{ ++ if (i > 0) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++/** ++ * vidioc_queryctrl - V4L2 query control IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 query control ioctl structure ++ * ++ * If the requested control is supported, returns the control information ++ * in the v4l2_queryctrl structure. Otherwise, returns -EINVAL if the ++ * control is not supported. If the sensor being used is a "smart sensor", ++ * this request is passed to the sensor driver, otherwise the ISP is ++ * queried and if it does not support the requested control, the request ++ * is forwarded to the "raw" sensor driver to see if it supports it. ++ */ ++static int vidioc_queryctrl(struct file *file, void *fh, ++ struct v4l2_queryctrl *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct v4l2_queryctrl a_tmp; ++ int best_slave = -1; ++ u32 best_ctrl = (u32)-1; ++ int i; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) ++ return vidioc_int_queryctrl(vdev->vdev_sensor, a); ++ ++ /* No next flags: try slaves directly. */ ++ if (!(a->id & V4L2_CTRL_FLAG_NEXT_CTRL)) { ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ if (!vidioc_int_queryctrl(vdev->slave[i], a)) ++ return 0; ++ } ++ return isp_queryctrl(a); ++ } ++ ++ /* Find slave with smallest next control id. */ ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ a_tmp = *a; ++ ++ if (vidioc_int_queryctrl(vdev->slave[i], &a_tmp)) ++ continue; ++ ++ if (a_tmp.id < best_ctrl) { ++ best_slave = i; ++ best_ctrl = a_tmp.id; ++ } ++ } ++ ++ a_tmp = *a; ++ if (!isp_queryctrl(&a_tmp)) { ++ if (a_tmp.id < best_ctrl) { ++ *a = a_tmp; ++ ++ return 0; ++ } ++ } ++ ++ if (best_slave == -1) ++ return -EINVAL; ++ ++ a->id = best_ctrl; ++ return vidioc_int_queryctrl(vdev->slave[best_slave], a); ++} ++ ++/** ++ * vidioc_querymenu - V4L2 query menu IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 query menu ioctl structure ++ * ++ * If the requested control is supported, returns the menu information ++ * in the v4l2_querymenu structure. Otherwise, returns -EINVAL if the ++ * control is not supported or is not a menu. If the sensor being used ++ * is a "smart sensor", this request is passed to the sensor driver, ++ * otherwise the ISP is queried and if it does not support the requested ++ * menu control, the request is forwarded to the "raw" sensor driver to ++ * see if it supports it. ++ */ ++static int vidioc_querymenu(struct file *file, void *fh, ++ struct v4l2_querymenu *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int i; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) ++ return vidioc_int_querymenu(vdev->vdev_sensor, a); ++ ++ /* Try slaves directly. */ ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ if (!vidioc_int_querymenu(vdev->slave[i], a)) ++ return 0; ++ } ++ return isp_querymenu(a); ++} ++ ++static int vidioc_g_ext_ctrls(struct file *file, void *fh, ++ struct v4l2_ext_controls *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int i, ctrl_idx, rval = 0; ++ ++ mutex_lock(&vdev->mutex); ++ ++ for (ctrl_idx = 0; ctrl_idx < a->count; ctrl_idx++) { ++ struct v4l2_control ctrl; ++ ++ ctrl.id = a->controls[ctrl_idx].id; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) { ++ rval = vidioc_int_g_ctrl(vdev->vdev_sensor, &ctrl); ++ } else { ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ rval = vidioc_int_g_ctrl(vdev->slave[i], &ctrl); ++ if (!rval) ++ break; ++ } ++ } ++ ++ if (rval) ++ rval = isp_g_ctrl(&ctrl); ++ ++ if (rval) { ++ a->error_idx = ctrl_idx; ++ break; ++ } ++ ++ a->controls[ctrl_idx].value = ctrl.value; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++static int vidioc_s_ext_ctrls(struct file *file, void *fh, ++ struct v4l2_ext_controls *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int i, ctrl_idx, rval = 0; ++ ++ mutex_lock(&vdev->mutex); ++ ++ for (ctrl_idx = 0; ctrl_idx < a->count; ctrl_idx++) { ++ struct v4l2_control ctrl; ++ ++ ctrl.id = a->controls[ctrl_idx].id; ++ ctrl.value = a->controls[ctrl_idx].value; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) { ++ rval = vidioc_int_s_ctrl(vdev->vdev_sensor, &ctrl); ++ } else { ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ rval = vidioc_int_s_ctrl(vdev->slave[i], &ctrl); ++ if (!rval) ++ break; ++ } ++ } ++ ++ if (rval) ++ rval = isp_s_ctrl(&ctrl); ++ ++ if (rval) { ++ a->error_idx = ctrl_idx; ++ break; ++ } ++ ++ a->controls[ctrl_idx].value = ctrl.value; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_g_parm - V4L2 get parameters IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 stream parameters structure ++ * ++ * If request is for video capture buffer type, handles request by ++ * forwarding to sensor driver. ++ */ ++static int vidioc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval; ++ ++ if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ rval = vidioc_int_g_parm(vdev->vdev_sensor, a); ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_s_parm - V4L2 set parameters IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 stream parameters structure ++ * ++ * If request is for video capture buffer type, handles request by ++ * first getting current stream parameters from sensor, then forwarding ++ * request to set new parameters to sensor driver. It then attempts to ++ * enable the sensor interface with the new parameters. If this fails, it ++ * reverts back to the previous parameters. ++ */ ++static int vidioc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct v4l2_pix_format pix_tmp_sensor, pix_tmp; ++ int rval; ++ ++ if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) ++ return -EINVAL; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming) { ++ rval = -EBUSY; ++ goto out; ++ } ++ ++ vdev->want_timeperframe = a->parm.capture.timeperframe; ++ ++ pix_tmp = vdev->want_pix; ++ ++ rval = s_pix_parm(vdev, &pix_tmp_sensor, &pix_tmp, ++ &a->parm.capture.timeperframe); ++ ++out: ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_cropcap - V4L2 crop capture IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 crop capture structure ++ * ++ * If using a "smart" sensor, just forwards request to the sensor driver, ++ * otherwise fills in the v4l2_cropcap values locally. ++ */ ++static int vidioc_cropcap(struct file *file, void *fh, struct v4l2_cropcap *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ struct v4l2_cropcap *cropcap = a; ++ int rval; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ ++ rval = vidioc_int_cropcap(vdev->vdev_sensor, a); ++ ++ if (rval && !vdev->vdev_sensor_config.sensor_isp) { ++ struct v4l2_format f; ++ ++ /* cropcap failed, try to do this via g_fmt_cap */ ++ rval = vidioc_int_g_fmt_cap(vdev->vdev_sensor, &f); ++ if (!rval) { ++ cropcap->bounds.top = 0; ++ cropcap->bounds.left = 0; ++ cropcap->bounds.width = f.fmt.pix.width; ++ cropcap->bounds.height = f.fmt.pix.height; ++ cropcap->defrect = cropcap->bounds; ++ cropcap->pixelaspect.numerator = 1; ++ cropcap->pixelaspect.denominator = 1; ++ } ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_g_crop - V4L2 get capture crop IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 crop structure ++ * ++ * If using a "smart" sensor, just forwards request to the sensor driver, ++ * otherwise calls the isp functions to fill in current crop values. ++ */ ++static int vidioc_g_crop(struct file *file, void *fh, struct v4l2_crop *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval = 0; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->vdev_sensor_config.sensor_isp) ++ rval = vidioc_int_g_crop(vdev->vdev_sensor, a); ++ else ++ rval = isp_g_crop(a); ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++/** ++ * vidioc_s_crop - V4L2 set capture crop IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @a: standard V4L2 crop structure ++ * ++ * If using a "smart" sensor, just forwards request to the sensor driver, ++ * otherwise calls the isp functions to set the current crop values. ++ */ ++static int vidioc_s_crop(struct file *file, void *fh, struct v4l2_crop *a) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval = 0; ++ ++ if (vdev->vdev_sensor == v4l2_int_device_dummy()) ++ return -EINVAL; ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->vdev_sensor_config.sensor_isp) ++ rval = vidioc_int_s_crop(vdev->vdev_sensor, a); ++ else ++ rval = isp_s_crop(a, &vdev->pix); ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return rval; ++} ++ ++static int vidioc_enum_framesizes(struct file *file, void *fh, ++ struct v4l2_frmsizeenum *frms) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ u32 pixel_format; ++ int rval; ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->vdev_sensor_config.sensor_isp) { ++ rval = vidioc_int_enum_framesizes(vdev->vdev_sensor, frms); ++ } else { ++ pixel_format = frms->pixel_format; ++ frms->pixel_format = -1; /* ISP does format conversion */ ++ rval = vidioc_int_enum_framesizes(vdev->vdev_sensor, frms); ++ frms->pixel_format = pixel_format; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ return rval; ++} ++ ++static int vidioc_enum_frameintervals(struct file *file, void *fh, ++ struct v4l2_frmivalenum *frmi) ++{ ++ struct omap34xxcam_fh *ofh = fh; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ u32 pixel_format; ++ int rval; ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->vdev_sensor_config.sensor_isp) { ++ rval = vidioc_int_enum_frameintervals(vdev->vdev_sensor, frmi); ++ } else { ++ pixel_format = frmi->pixel_format; ++ frmi->pixel_format = -1; /* ISP does format conversion */ ++ rval = vidioc_int_enum_frameintervals(vdev->vdev_sensor, frmi); ++ frmi->pixel_format = pixel_format; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ return rval; ++} ++ ++/** ++ * vidioc_default - private IOCTL handler ++ * @file: ptr. to system file structure ++ * @fh: ptr to hold address of omap34xxcam_fh struct (per-filehandle data) ++ * @cmd: ioctl cmd value ++ * @arg: ioctl arg value ++ * ++ * If the sensor being used is a "smart sensor", this request is returned to ++ * caller with -EINVAL err code. Otherwise if the control id is the private ++ * VIDIOC_PRIVATE_ISP_AEWB_REQ to update the analog gain or exposure, ++ * then this request is forwared directly to the sensor to incorporate the ++ * feedback. The request is then passed on to the ISP private IOCTL handler, ++ * isp_handle_private() ++ */ ++static long vidioc_default(struct file *file, void *fh, int cmd, void *arg) ++{ ++ struct omap34xxcam_fh *ofh = file->private_data; ++ struct omap34xxcam_videodev *vdev = ofh->vdev; ++ int rval; ++ ++ if (vdev->vdev_sensor_config.sensor_isp) { ++ rval = -EINVAL; ++ } else { ++ switch (cmd) { ++ case VIDIOC_PRIVATE_ISP_AEWB_REQ: ++ { ++ /* Need to update sensor first */ ++ struct isph3a_aewb_data *data; ++ struct v4l2_control vc; ++ ++ data = (struct isph3a_aewb_data *) arg; ++ if (data->update & SET_EXPOSURE) { ++ dev_info(&vdev->vfd->dev, "using " ++ "VIDIOC_PRIVATE_ISP_AEWB_REQ to set " ++ "exposure is deprecated!\n"); ++ vc.id = V4L2_CID_EXPOSURE; ++ vc.value = data->shutter; ++ mutex_lock(&vdev->mutex); ++ rval = vidioc_int_s_ctrl(vdev->vdev_sensor, ++ &vc); ++ mutex_unlock(&vdev->mutex); ++ if (rval) ++ goto out; ++ } ++ if (data->update & SET_ANALOG_GAIN) { ++ dev_info(&vdev->vfd->dev, "using " ++ "VIDIOC_PRIVATE_ISP_AEWB_REQ to set " ++ "gain is deprecated!\n"); ++ vc.id = V4L2_CID_GAIN; ++ vc.value = data->gain; ++ mutex_lock(&vdev->mutex); ++ rval = vidioc_int_s_ctrl(vdev->vdev_sensor, ++ &vc); ++ mutex_unlock(&vdev->mutex); ++ if (rval) ++ goto out; ++ } ++ } ++ break; ++ case VIDIOC_PRIVATE_ISP_AF_REQ: { ++ /* Need to update lens first */ ++ struct isp_af_data *data; ++ struct v4l2_control vc; ++ ++ if (!vdev->vdev_lens) { ++ rval = -EINVAL; ++ goto out; ++ } ++ data = (struct isp_af_data *) arg; ++ if (data->update & LENS_DESIRED_POSITION) { ++ dev_info(&vdev->vfd->dev, "using " ++ "VIDIOC_PRIVATE_ISP_AF_REQ to set " ++ "lens position is deprecated!\n"); ++ vc.id = V4L2_CID_FOCUS_ABSOLUTE; ++ vc.value = data->desired_lens_direction; ++ mutex_lock(&vdev->mutex); ++ rval = vidioc_int_s_ctrl(vdev->vdev_lens, &vc); ++ mutex_unlock(&vdev->mutex); ++ if (rval) ++ goto out; ++ } ++ } ++ break; ++ } ++ ++ mutex_lock(&vdev->mutex); ++ rval = isp_handle_private(cmd, arg); ++ mutex_unlock(&vdev->mutex); ++ } ++out: ++ return rval; ++} ++ ++/* ++ * ++ * File operations. ++ * ++ */ ++ ++/** ++ * omap34xxcam_poll - file operations poll handler ++ * @file: ptr. to system file structure ++ * @wait: system poll table structure ++ * ++ */ ++static unsigned int omap34xxcam_poll(struct file *file, ++ struct poll_table_struct *wait) ++{ ++ struct omap34xxcam_fh *fh = file->private_data; ++ struct omap34xxcam_videodev *vdev = fh->vdev; ++ struct videobuf_buffer *vb; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming != file) { ++ mutex_unlock(&vdev->mutex); ++ return POLLERR; ++ } ++ mutex_unlock(&vdev->mutex); ++ ++ mutex_lock(&fh->vbq.vb_lock); ++ if (list_empty(&fh->vbq.stream)) { ++ mutex_unlock(&fh->vbq.vb_lock); ++ return POLLERR; ++ } ++ vb = list_entry(fh->vbq.stream.next, struct videobuf_buffer, stream); ++ mutex_unlock(&fh->vbq.vb_lock); ++ ++ poll_wait(file, &vb->done, wait); ++ ++ if (vb->state == VIDEOBUF_DONE || vb->state == VIDEOBUF_ERROR) ++ return POLLIN | POLLRDNORM; ++ ++ return 0; ++} ++ ++/** ++ * omap34xxcam_mmap - file operations mmap handler ++ * @file: ptr. to system file structure ++ * @vma: system virt. mem. area structure ++ * ++ * Maps a virtual memory area via the video buffer API ++ */ ++static int omap34xxcam_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ struct omap34xxcam_fh *fh = file->private_data; ++ return videobuf_mmap_mapper(&fh->vbq, vma); ++} ++ ++/** ++ * omap34xxcam_open - file operations open handler ++ * @inode: ptr. to system inode structure ++ * @file: ptr. to system file structure ++ * ++ * Allocates and initializes the per-filehandle data (omap34xxcam_fh), ++ * enables the sensor, opens/initializes the ISP interface and the ++ * video buffer queue. Note that this function will allow multiple ++ * file handles to be open simultaneously, however only the first ++ * handle opened will initialize the ISP. It is the application ++ * responsibility to only use one handle for streaming and the others ++ * for control only. ++ * This function returns 0 upon success and -ENODEV upon error. ++ */ ++static int omap34xxcam_open(struct file *file) ++{ ++ int rval = 0; ++ struct omap34xxcam_videodev *vdev = NULL; ++ struct omap34xxcam_device *cam = omap34xxcam; ++ struct omap34xxcam_fh *fh; ++ struct v4l2_format format; ++ int i; ++ ++ for (i = 0; i < OMAP34XXCAM_VIDEODEVS; i++) { ++ if (cam->vdevs[i].vfd ++ && cam->vdevs[i].vfd->minor == ++ iminor(file->f_dentry->d_inode)) { ++ vdev = &cam->vdevs[i]; ++ break; ++ } ++ } ++ ++ if (!vdev || !vdev->vfd) ++ return -ENODEV; ++ ++ fh = kzalloc(sizeof(*fh), GFP_KERNEL); ++ if (fh == NULL) ++ return -ENOMEM; ++ ++ mutex_lock(&vdev->mutex); ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ if (vdev->slave[i] != v4l2_int_device_dummy() ++ && !try_module_get(vdev->slave[i]->module)) { ++ mutex_unlock(&vdev->mutex); ++ dev_err(&vdev->vfd->dev, "can't try_module_get %s\n", ++ vdev->slave[i]->name); ++ rval = -ENODEV; ++ goto out_try_module_get; ++ } ++ } ++ ++ if (atomic_inc_return(&vdev->users) == 1) { ++ rval = isp_get(); ++ if (rval < 0) { ++ dev_err(&vdev->vfd->dev, "can't get isp\n"); ++ goto out_isp_get; ++ } ++ if (omap34xxcam_slave_power_set(vdev, V4L2_POWER_ON, ++ OMAP34XXCAM_SLAVE_POWER_ALL)) { ++ dev_err(&vdev->vfd->dev, "can't power up slaves\n"); ++ rval = -EBUSY; ++ goto out_slave_power_set_standby; ++ } ++ omap34xxcam_slave_power_set( ++ vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_SENSOR); ++ omap34xxcam_slave_power_suggest( ++ vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_LENS); ++ } ++ ++ fh->vdev = vdev; ++ ++ if (!vdev->pix.width ++ && vdev->vdev_sensor != v4l2_int_device_dummy()) { ++ memset(&format, 0, sizeof(format)); ++ if (vidioc_int_g_fmt_cap(vdev->vdev_sensor, &format)) { ++ dev_err(&vdev->vfd->dev, ++ "can't get current pix from sensor!\n"); ++ goto out_vidioc_int_g_fmt_cap; ++ } ++ if (!vdev->vdev_sensor_config.sensor_isp) { ++ struct v4l2_pix_format pix = format.fmt.pix; ++ if (isp_s_fmt_cap(&pix, &format.fmt.pix)) { ++ dev_err(&vdev->vfd->dev, ++ "isp doesn't like the sensor!\n"); ++ goto out_isp_s_fmt_cap; ++ } ++ } ++ vdev->pix = format.fmt.pix; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ ++ file->private_data = fh; ++ ++ spin_lock_init(&fh->vbq_lock); ++ ++ videobuf_queue_sg_init(&fh->vbq, &omap34xxcam_vbq_ops, NULL, ++ &fh->vbq_lock, V4L2_BUF_TYPE_VIDEO_CAPTURE, ++ V4L2_FIELD_NONE, ++ sizeof(struct videobuf_buffer), fh); ++ ++ return 0; ++ ++out_isp_s_fmt_cap: ++out_vidioc_int_g_fmt_cap: ++ omap34xxcam_slave_power_set(vdev, V4L2_POWER_OFF, ++ OMAP34XXCAM_SLAVE_POWER_ALL); ++out_slave_power_set_standby: ++ isp_put(); ++ ++out_isp_get: ++ atomic_dec(&vdev->users); ++ mutex_unlock(&vdev->mutex); ++ ++out_try_module_get: ++ for (i--; i >= 0; i--) ++ if (vdev->slave[i] != v4l2_int_device_dummy()) ++ module_put(vdev->slave[i]->module); ++ ++ kfree(fh); ++ ++ return rval; ++} ++ ++/** ++ * omap34xxcam_release - file operations release handler ++ * @inode: ptr. to system inode structure ++ * @file: ptr. to system file structure ++ * ++ * Complement of omap34xxcam_open. This function will flush any scheduled ++ * work, disable the sensor, close the ISP interface, stop the ++ * video buffer queue from streaming and free the per-filehandle data ++ * (omap34xxcam_fh). Note that because multiple open file handles ++ * are allowed, this function will only close the ISP and disable the ++ * sensor when the last open file handle (by count) is closed. ++ * This function returns 0. ++ */ ++static int omap34xxcam_release(struct file *file) ++{ ++ struct omap34xxcam_fh *fh = file->private_data; ++ struct omap34xxcam_videodev *vdev = fh->vdev; ++ int i; ++ ++ mutex_lock(&vdev->mutex); ++ if (vdev->streaming == file) { ++ isp_stop(); ++ videobuf_streamoff(&fh->vbq); ++ omap34xxcam_slave_power_set( ++ vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_SENSOR); ++ omap34xxcam_slave_power_suggest( ++ vdev, V4L2_POWER_STANDBY, ++ OMAP34XXCAM_SLAVE_POWER_LENS); ++ vdev->streaming = NULL; ++ } ++ ++ if (atomic_dec_return(&vdev->users) == 0) { ++ omap34xxcam_slave_power_set(vdev, V4L2_POWER_OFF, ++ OMAP34XXCAM_SLAVE_POWER_ALL); ++ isp_put(); ++ } ++ mutex_unlock(&vdev->mutex); ++ ++ file->private_data = NULL; ++ ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) ++ if (vdev->slave[i] != v4l2_int_device_dummy()) ++ module_put(vdev->slave[i]->module); ++ ++ kfree(fh); ++ ++ return 0; ++} ++ ++static struct v4l2_file_operations omap34xxcam_fops = { ++ .owner = THIS_MODULE, ++ .unlocked_ioctl = video_ioctl2, ++ .poll = omap34xxcam_poll, ++ .mmap = omap34xxcam_mmap, ++ .open = omap34xxcam_open, ++ .release = omap34xxcam_release, ++}; ++ ++static void omap34xxcam_vfd_name_update(struct omap34xxcam_videodev *vdev) ++{ ++ struct video_device *vfd = vdev->vfd; ++ int i; ++ ++ strlcpy(vfd->name, CAM_SHORT_NAME, sizeof(vfd->name)); ++ for (i = 0; i <= OMAP34XXCAM_SLAVE_FLASH; i++) { ++ strlcat(vfd->name, "/", sizeof(vfd->name)); ++ if (vdev->slave[i] == v4l2_int_device_dummy()) ++ continue; ++ strlcat(vfd->name, vdev->slave[i]->name, sizeof(vfd->name)); ++ } ++ dev_info(&vdev->vfd->dev, "video%d is now %s\n", vfd->num, vfd->name); ++} ++ ++/** ++ * omap34xxcam_device_unregister - V4L2 detach handler ++ * @s: ptr. to standard V4L2 device information structure ++ * ++ * Detach sensor and unregister and release the video device. ++ */ ++static void omap34xxcam_device_unregister(struct v4l2_int_device *s) ++{ ++ struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; ++ struct omap34xxcam_hw_config hwc; ++ ++ BUG_ON(vidioc_int_g_priv(s, &hwc) < 0); ++ ++ mutex_lock(&vdev->mutex); ++ ++ if (vdev->slave[hwc.dev_type] != v4l2_int_device_dummy()) { ++ vdev->slave[hwc.dev_type] = v4l2_int_device_dummy(); ++ vdev->slaves--; ++ omap34xxcam_vfd_name_update(vdev); ++ } ++ ++ if (vdev->slaves == 0 && vdev->vfd) { ++ if (vdev->vfd->minor == -1) { ++ /* ++ * The device was never registered, so release the ++ * video_device struct directly. ++ */ ++ video_device_release(vdev->vfd); ++ } else { ++ /* ++ * The unregister function will release the ++ * video_device struct as well as ++ * unregistering it. ++ */ ++ video_unregister_device(vdev->vfd); ++ } ++ vdev->vfd = NULL; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++} ++ ++static const struct v4l2_ioctl_ops omap34xxcam_ioctl_ops = { ++ .vidioc_querycap = vidioc_querycap, ++ .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, ++ .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, ++ .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, ++ .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, ++ .vidioc_reqbufs = vidioc_reqbufs, ++ .vidioc_querybuf = vidioc_querybuf, ++ .vidioc_qbuf = vidioc_qbuf, ++ .vidioc_dqbuf = vidioc_dqbuf, ++ .vidioc_streamon = vidioc_streamon, ++ .vidioc_streamoff = vidioc_streamoff, ++ .vidioc_enum_input = vidioc_enum_input, ++ .vidioc_g_input = vidioc_g_input, ++ .vidioc_s_input = vidioc_s_input, ++ .vidioc_queryctrl = vidioc_queryctrl, ++ .vidioc_querymenu = vidioc_querymenu, ++ .vidioc_g_ext_ctrls = vidioc_g_ext_ctrls, ++ .vidioc_s_ext_ctrls = vidioc_s_ext_ctrls, ++ .vidioc_g_parm = vidioc_g_parm, ++ .vidioc_s_parm = vidioc_s_parm, ++ .vidioc_cropcap = vidioc_cropcap, ++ .vidioc_g_crop = vidioc_g_crop, ++ .vidioc_s_crop = vidioc_s_crop, ++ .vidioc_enum_framesizes = vidioc_enum_framesizes, ++ .vidioc_enum_frameintervals = vidioc_enum_frameintervals, ++ .vidioc_default = vidioc_default, ++}; ++ ++/** ++ * omap34xxcam_device_register - V4L2 attach handler ++ * @s: ptr. to standard V4L2 device information structure ++ * ++ * Allocates and initializes the V4L2 video_device structure, initializes ++ * the sensor, and finally ++ registers the device with V4L2 based on the ++ * video_device structure. ++ * ++ * Returns 0 on success, otherwise an appropriate error code on ++ * failure. ++ */ ++static int omap34xxcam_device_register(struct v4l2_int_device *s) ++{ ++ struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; ++ struct omap34xxcam_hw_config hwc; ++ int rval; ++ ++ /* We need to check rval just once. The place is here. */ ++ if (vidioc_int_g_priv(s, &hwc)) ++ return -ENODEV; ++ ++ if (vdev->index != hwc.dev_index) ++ return -ENODEV; ++ ++ if (hwc.dev_type < 0 || hwc.dev_type > OMAP34XXCAM_SLAVE_FLASH) ++ return -EINVAL; ++ ++ if (vdev->slave[hwc.dev_type] != v4l2_int_device_dummy()) ++ return -EBUSY; ++ ++ mutex_lock(&vdev->mutex); ++ if (atomic_read(&vdev->users)) { ++ printk(KERN_ERR "%s: we're open (%d), can't register\n", ++ __func__, atomic_read(&vdev->users)); ++ mutex_unlock(&vdev->mutex); ++ return -EBUSY; ++ } ++ ++ vdev->slaves++; ++ vdev->slave[hwc.dev_type] = s; ++ vdev->slave_config[hwc.dev_type] = hwc; ++ ++ if (hwc.dev_type == OMAP34XXCAM_SLAVE_SENSOR) { ++ rval = isp_get(); ++ if (rval < 0) { ++ printk(KERN_ERR "%s: can't get ISP, " ++ "sensor init failed\n", __func__); ++ goto err; ++ } ++ } ++ rval = omap34xxcam_slave_power_set(vdev, V4L2_POWER_ON, ++ 1 << hwc.dev_type); ++ if (rval) ++ goto err_omap34xxcam_slave_power_set; ++ if (hwc.dev_type == OMAP34XXCAM_SLAVE_SENSOR) { ++ struct v4l2_format format; ++ ++ format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ rval = vidioc_int_g_fmt_cap(vdev->vdev_sensor, &format); ++ if (rval) ++ rval = -EBUSY; ++ ++ vdev->want_pix = format.fmt.pix; ++ } ++ omap34xxcam_slave_power_set(vdev, V4L2_POWER_OFF, 1 << hwc.dev_type); ++ if (hwc.dev_type == OMAP34XXCAM_SLAVE_SENSOR) ++ isp_put(); ++ ++ if (rval) ++ goto err; ++ ++ /* Are we the first slave? */ ++ if (vdev->slaves == 1) { ++ /* initialize the video_device struct */ ++ vdev->vfd = video_device_alloc(); ++ if (!vdev->vfd) { ++ printk(KERN_ERR "%s: could not allocate " ++ "video device struct\n", __func__); ++ rval = -ENOMEM; ++ goto err; ++ } ++ vdev->vfd->release = video_device_release; ++ vdev->vfd->minor = -1; ++ vdev->vfd->fops = &omap34xxcam_fops; ++ vdev->vfd->ioctl_ops = &omap34xxcam_ioctl_ops; ++ video_set_drvdata(vdev->vfd, vdev); ++ ++ if (video_register_device(vdev->vfd, VFL_TYPE_GRABBER, ++ hwc.dev_minor) < 0) { ++ printk(KERN_ERR "%s: could not register V4L device\n", ++ __func__); ++ vdev->vfd->minor = -1; ++ rval = -EBUSY; ++ goto err; ++ } ++ } ++ ++ omap34xxcam_vfd_name_update(vdev); ++ ++ mutex_unlock(&vdev->mutex); ++ ++ return 0; ++ ++err_omap34xxcam_slave_power_set: ++ if (hwc.dev_type == OMAP34XXCAM_SLAVE_SENSOR) ++ isp_put(); ++ ++err: ++ if (s == vdev->slave[hwc.dev_type]) { ++ vdev->slave[hwc.dev_type] = v4l2_int_device_dummy(); ++ vdev->slaves--; ++ } ++ ++ mutex_unlock(&vdev->mutex); ++ omap34xxcam_device_unregister(s); ++ ++ return rval; ++} ++ ++static struct v4l2_int_master omap34xxcam_master = { ++ .attach = omap34xxcam_device_register, ++ .detach = omap34xxcam_device_unregister, ++}; ++ ++/* ++ * ++ * Module initialisation and deinitialisation ++ * ++ */ ++ ++static void omap34xxcam_exit(void) ++{ ++ struct omap34xxcam_device *cam = omap34xxcam; ++ int i; ++ ++ if (!cam) ++ return; ++ ++ for (i = 0; i < OMAP34XXCAM_VIDEODEVS; i++) { ++ if (cam->vdevs[i].cam == NULL) ++ continue; ++ ++ v4l2_int_device_unregister(&cam->vdevs[i].master); ++ cam->vdevs[i].cam = NULL; ++ } ++ ++ omap34xxcam = NULL; ++ ++ kfree(cam); ++} ++ ++static int __init omap34xxcam_init(void) ++{ ++ struct omap34xxcam_device *cam; ++ int i; ++ ++ cam = kzalloc(sizeof(*cam), GFP_KERNEL); ++ if (!cam) { ++ printk(KERN_ERR "%s: could not allocate memory\n", __func__); ++ return -ENOMEM; ++ } ++ ++ omap34xxcam = cam; ++ ++ for (i = 0; i < OMAP34XXCAM_VIDEODEVS; i++) { ++ struct omap34xxcam_videodev *vdev = &cam->vdevs[i]; ++ struct v4l2_int_device *m = &vdev->master; ++ ++ m->module = THIS_MODULE; ++ strlcpy(m->name, CAM_NAME, sizeof(m->name)); ++ m->type = v4l2_int_type_master; ++ m->u.master = &omap34xxcam_master; ++ m->priv = vdev; ++ ++ mutex_init(&vdev->mutex); ++ vdev->index = i; ++ vdev->cam = cam; ++ vdev->vdev_sensor = ++ vdev->vdev_lens = ++ vdev->vdev_flash = v4l2_int_device_dummy(); ++#ifdef OMAP34XXCAM_POWEROFF_DELAY ++ setup_timer(&vdev->poweroff_timer, ++ omap34xxcam_slave_power_timer, (unsigned long)vdev); ++ INIT_WORK(&vdev->poweroff_work, omap34xxcam_slave_power_work); ++#endif /* OMAP34XXCAM_POWEROFF_DELAY */ ++ ++ if (v4l2_int_device_register(m)) ++ goto err; ++ } ++ ++ return 0; ++ ++err: ++ omap34xxcam_exit(); ++ return -ENODEV; ++} ++ ++MODULE_AUTHOR("Sakari Ailus "); ++MODULE_DESCRIPTION("OMAP34xx Video for Linux camera driver"); ++MODULE_LICENSE("GPL"); ++ ++late_initcall(omap34xxcam_init); ++module_exit(omap34xxcam_exit); +diff --git a/drivers/media/video/omap34xxcam.h b/drivers/media/video/omap34xxcam.h +new file mode 100644 +index 0000000..9859d15 +--- /dev/null ++++ b/drivers/media/video/omap34xxcam.h +@@ -0,0 +1,207 @@ ++/* ++ * omap34xxcam.h ++ * ++ * Copyright (C) 2006--2009 Nokia Corporation ++ * Copyright (C) 2007--2009 Texas Instruments ++ * ++ * Contact: Sakari Ailus ++ * Tuukka Toivonen ++ * ++ * Originally based on the OMAP 2 camera driver. ++ * ++ * Written by Sakari Ailus ++ * Tuukka Toivonen ++ * Sergio Aguirre ++ * Mohit Jalori ++ * Sameer Venkatraman ++ * Leonides Martinez ++ * ++ * 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 published by the Free Software Foundation. ++ * ++ * 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., 51 Franklin St, Fifth Floor, Boston, MA ++ * 02110-1301 USA ++ * ++ */ ++ ++#ifndef OMAP34XXCAM_H ++#define OMAP34XXCAM_H ++ ++#include ++#include "isp/isp.h" ++ ++#define CAM_NAME "omap34xxcam" ++#define CAM_SHORT_NAME "omap3" ++ ++#define OMAP_ISP_AF (1 << 4) ++#define OMAP_ISP_HIST (1 << 5) ++#define OMAP34XXCAM_XCLK_NONE -1 ++#define OMAP34XXCAM_XCLK_A 0 ++#define OMAP34XXCAM_XCLK_B 1 ++ ++#define OMAP34XXCAM_SLAVE_SENSOR 0 ++#define OMAP34XXCAM_SLAVE_LENS 1 ++#define OMAP34XXCAM_SLAVE_FLASH 2 /* This is the last slave! */ ++ ++/* mask for omap34xxcam_slave_power_set */ ++#define OMAP34XXCAM_SLAVE_POWER_SENSOR (1 << OMAP34XXCAM_SLAVE_SENSOR) ++#define OMAP34XXCAM_SLAVE_POWER_LENS (1 << OMAP34XXCAM_SLAVE_LENS) ++#define OMAP34XXCAM_SLAVE_POWER_SENSOR_LENS \ ++ (OMAP34XXCAM_SLAVE_POWER_SENSOR | OMAP34XXCAM_SLAVE_POWER_LENS) ++#define OMAP34XXCAM_SLAVE_POWER_FLASH (1 << OMAP34XXCAM_SLAVE_FLASH) ++#define OMAP34XXCAM_SLAVE_POWER_ALL -1 ++ ++#define OMAP34XXCAM_VIDEODEVS 4 ++ ++/* #define OMAP34XXCAM_POWEROFF_DELAY (2 * HZ) */ ++ ++struct omap34xxcam_device; ++struct omap34xxcam_videodev; ++ ++struct omap34xxcam_sensor_config { ++ int xclk; ++ int sensor_isp; ++ u32 capture_mem; ++ struct v4l2_fract ival_default; ++}; ++ ++struct omap34xxcam_lens_config { ++}; ++ ++struct omap34xxcam_flash_config { ++}; ++ ++/** ++ * struct omap34xxcam_hw_config - struct for vidioc_int_g_priv ioctl ++ * @xclk: OMAP34XXCAM_XCLK_A or OMAP34XXCAM_XCLK_B ++ * @sensor_isp: Is sensor smart/SOC or raw ++ * @s_pix_sparm: Access function to set pix and sparm. ++ * Pix will override sparm ++ */ ++struct omap34xxcam_hw_config { ++ int dev_index; /* Index in omap34xxcam_sensors */ ++ int dev_minor; /* Video device minor number */ ++ int dev_type; /* OMAP34XXCAM_SLAVE_* */ ++ union { ++ struct omap34xxcam_sensor_config sensor; ++ struct omap34xxcam_lens_config lens; ++ struct omap34xxcam_flash_config flash; ++ } u; ++}; ++ ++/** ++ * struct omap34xxcam_videodev - per /dev/video* structure ++ * @mutex: serialises access to this structure ++ * @cam: pointer to cam hw structure ++ * @master: we are v4l2_int_device master ++ * @sensor: sensor device ++ * @lens: lens device ++ * @flash: flash device ++ * @slaves: how many slaves we have at the moment ++ * @vfd: our video device ++ * @capture_mem: maximum kernel-allocated capture memory ++ * @if_u: sensor interface stuff ++ * @index: index of this structure in cam->vdevs ++ * @users: how many users we have ++ * @power_state: Current power state ++ * @power_state_wish: New power state when poweroff_timer expires ++ * @power_state_mask: Bitmask of devices to set the new power state ++ * @poweroff_timer: Timer for dispatching poweroff_work ++ * @poweroff_work: Work for slave power state change ++ * @sensor_config: ISP-speicific sensor configuration ++ * @lens_config: ISP-speicific lens configuration ++ * @flash_config: ISP-speicific flash configuration ++ * @want_timeperframe: Desired timeperframe ++ * @want_pix: Desired pix ++ * @pix: Current pix ++ * @streaming: streaming file handle, if streaming is enabled ++ */ ++struct omap34xxcam_videodev { ++ struct mutex mutex; /* serialises access to this structure */ ++ ++ struct omap34xxcam_device *cam; ++ struct v4l2_int_device master; ++ ++#define vdev_sensor slave[OMAP34XXCAM_SLAVE_SENSOR] ++#define vdev_lens slave[OMAP34XXCAM_SLAVE_LENS] ++#define vdev_flash slave[OMAP34XXCAM_SLAVE_FLASH] ++ struct v4l2_int_device *slave[OMAP34XXCAM_SLAVE_FLASH + 1]; ++ ++ /* number of slaves attached */ ++ int slaves; ++ ++ /*** video device parameters ***/ ++ struct video_device *vfd; ++ int capture_mem; ++ ++ /*** general driver state information ***/ ++ int index; ++ atomic_t users; ++ enum v4l2_power power_state[OMAP34XXCAM_SLAVE_FLASH + 1]; ++#ifdef OMAP34XXCAM_POWEROFF_DELAY ++ enum v4l2_power power_state_wish; ++ int power_state_mask; ++ struct timer_list poweroff_timer; ++ struct work_struct poweroff_work; ++#endif /* OMAP34XXCAM_POWEROFF_DELAY */ ++ ++#define vdev_sensor_config slave_config[OMAP34XXCAM_SLAVE_SENSOR].u.sensor ++#define vdev_lens_config slave_config[OMAP34XXCAM_SLAVE_LENS].u.lens ++#define vdev_flash_config slave_config[OMAP34XXCAM_SLAVE_FLASH].u.flash ++ struct omap34xxcam_hw_config slave_config[OMAP34XXCAM_SLAVE_FLASH + 1]; ++ ++ /*** capture data ***/ ++ struct file *streaming; ++ struct v4l2_fract want_timeperframe; ++ struct v4l2_pix_format want_pix; ++ spinlock_t pix_lock; ++ struct v4l2_pix_format pix; ++}; ++ ++/** ++ * struct omap34xxcam_device - per-device data structure ++ * @mutex: mutex serialises access to this structure ++ * @sgdma_in_queue: Number or sgdma requests in scatter-gather queue, ++ * protected by the lock above. ++ * @sgdma: ISP sgdma subsystem information structure ++ * @dma_notify: DMA notify flag ++ * @dev: device structure ++ * @vdevs: /dev/video specific structures ++ * @fck: camera module fck clock information ++ * @ick: camera module ick clock information ++ */ ++struct omap34xxcam_device { ++ struct mutex mutex; /* serialises access to this structure */ ++ ++ /*** interfaces and device ***/ ++ struct omap34xxcam_videodev vdevs[OMAP34XXCAM_VIDEODEVS]; ++ ++ /*** camera module clocks ***/ ++ struct clk *fck; ++ struct clk *ick; ++ bool sensor_if_enabled; ++}; ++ ++/** ++ * struct omap34xxcam_fh - per-filehandle data structure ++ * @vbq_lock: spinlock for the videobuf queue ++ * @vbq: V4L2 video buffer queue structure ++ * @field_count: field counter for videobuf_buffer ++ * @vdev: our /dev/video specific structure ++ */ ++struct omap34xxcam_fh { ++ spinlock_t vbq_lock; /* spinlock for the videobuf queue */ ++ struct videobuf_queue vbq; ++ atomic_t field_count; ++ struct omap34xxcam_videodev *vdev; ++}; ++ ++#endif /* ifndef OMAP34XXCAM_H */ +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch b/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch new file mode 100644 index 0000000000..77b273c789 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch @@ -0,0 +1,2915 @@ +From 3041daa54b49bcb6ab444c7b9e14bc6a1ade6236 Mon Sep 17 00:00:00 2001 +From: Vaibhav Hiremath +Date: Fri, 13 Feb 2009 14:44:20 +0530 +Subject: [PATCH 1/2] Resizer and Previewer driver added to commit + +The Resizer and Previewer driver added to the commit +from the patch submitted by Sergio on 12 Dec 2008. + +The new WTBU code base and Nokia fixes package doesn't contain +standalone resizer driver support. + +Following major changes done - + + - Added stand-alone resizer driver support + in isp.c file. + - Seperate Kconfig file created + - hardware access of resizer module fixed as per new + isp.c + +Signed-off-by: Vaibhav Hiremath +--- + drivers/media/video/Kconfig | 5 +- + drivers/media/video/isp/Kconfig | 16 + + drivers/media/video/isp/Makefile | 7 + + drivers/media/video/isp/isp.c | 12 + + drivers/media/video/isp/ispmmu.c | 1 + + drivers/media/video/isp/omap_previewer.c | 825 +++++++++++++++ + drivers/media/video/isp/omap_previewer.h | 162 +++ + drivers/media/video/isp/omap_resizer.c | 1634 ++++++++++++++++++++++++++++++ + include/linux/omap_resizer.h | 136 +++ + 9 files changed, 2794 insertions(+), 4 deletions(-) + create mode 100644 drivers/media/video/isp/Kconfig + create mode 100644 drivers/media/video/isp/omap_previewer.c + create mode 100644 drivers/media/video/isp/omap_previewer.h + create mode 100644 drivers/media/video/isp/omap_resizer.c + create mode 100644 include/linux/omap_resizer.h + +diff --git a/drivers/media/video/isp/Kconfig b/drivers/media/video/isp/Kconfig +new file mode 100644 +index 0000000..acda63b +--- /dev/null ++++ b/drivers/media/video/isp/Kconfig +@@ -0,0 +1,16 @@ ++# Kconfig for OMAP3 ISP driver ++ ++config VIDEO_OMAP3_ISP ++ tristate ++ select VIDEOBUF_GEN ++ select VIDEOBUF_DMA_SG ++ ++config VIDEO_OMAP34XX_ISP_PREVIEWER ++ tristate "OMAP ISP Previewer" ++ depends on !ARCH_OMAP3410 ++ select VIDEO_OMAP3_ISP ++ ++config VIDEO_OMAP34XX_ISP_RESIZER ++ tristate "OMAP ISP Resizer" ++ depends on !ARCH_OMAP3410 ++ select VIDEO_OMAP3_ISP +diff --git a/drivers/media/video/isp/Makefile b/drivers/media/video/isp/Makefile +index 0f9301c..ed10a51 100644 +--- a/drivers/media/video/isp/Makefile ++++ b/drivers/media/video/isp/Makefile +@@ -7,6 +7,13 @@ else + isp-mod-objs += \ + isp.o ispccdc.o ispmmu.o \ + isppreview.o ispresizer.o isph3a.o isphist.o isp_af.o ispcsi2.o ++ ++obj-$(CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER) += \ ++ omap_previewer.o ++ ++obj-$(CONFIG_VIDEO_OMAP34XX_ISP_RESIZER) += \ ++ omap_resizer.o ++ + endif + + obj-$(CONFIG_VIDEO_OMAP3_ISP) += isp-mod.o +diff --git a/drivers/media/video/isp/isp.c b/drivers/media/video/isp/isp.c +index 6034a56..09a1792 100644 +--- a/drivers/media/video/isp/isp.c ++++ b/drivers/media/video/isp/isp.c +@@ -521,6 +521,13 @@ int isp_set_callback(enum isp_callback_type type, isp_callback_t callback, + OMAP3_ISP_IOMEM_MAIN, + ISP_IRQ0ENABLE); + break; ++ case CBK_RESZ_DONE: ++ isp_reg_writel(IRQ0ENABLE_RSZ_DONE_IRQ, OMAP3_ISP_IOMEM_MAIN, ++ ISP_IRQ0STATUS); ++ isp_reg_writel(isp_reg_readl(OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_RSZ_DONE_IRQ, OMAP3_ISP_IOMEM_MAIN, ++ ISP_IRQ0ENABLE); ++ break; + default: + break; + } +@@ -996,6 +1003,11 @@ static irqreturn_t omap34xx_isp_isr(int irq, void *_isp) + if (!ispresizer_busy()) + ispresizer_config_shadow_registers(); + isp_buf_process(bufs); ++ } else { ++ if (irqdis->isp_callbk[CBK_RESZ_DONE]) ++ irqdis->isp_callbk[CBK_RESZ_DONE](RESZ_DONE, ++ irqdis->isp_callbk_arg1[CBK_RESZ_DONE], ++ irqdis->isp_callbk_arg2[CBK_RESZ_DONE]); + } + } + +diff --git a/drivers/media/video/isp/ispmmu.c b/drivers/media/video/isp/ispmmu.c +index 076aea1..b943d5b 100644 +--- a/drivers/media/video/isp/ispmmu.c ++++ b/drivers/media/video/isp/ispmmu.c +@@ -289,6 +289,7 @@ int ispmmu_get_mapeable_space(void) + return (L2P_TABLE_NR - no_of_l2p_alloted) * ISPMMU_TTB_ENTRIES_NR * + ISPMMU_L2D_ENTRIES_NR; + } ++EXPORT_SYMBOL_GPL(ispmmu_get_mapeable_space); + + /** + * ispmmu_map - Map a physically contiguous buffer to ISP space. +diff --git a/drivers/media/video/isp/omap_previewer.c b/drivers/media/video/isp/omap_previewer.c +new file mode 100644 +index 0000000..634a056 +--- /dev/null ++++ b/drivers/media/video/isp/omap_previewer.c +@@ -0,0 +1,825 @@ ++/* ++ * drivers/media/video/isp/omap_previewer.c ++ * ++ * Wrapper for Preview module in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Leonides Martinez ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispmmu.h" ++#include "ispreg.h" ++#include "omap_previewer.h" ++ ++#define OMAP_PREV_NAME "omap-previewer" ++ ++static int prev_major = -1; ++static struct device *prev_dev; ++static struct class *prev_class; ++static struct prev_device *prevdevice; ++static struct platform_driver omap_previewer_driver; ++ ++static u32 prev_bufsize; ++ ++/** ++ * prev_calculate_crop - Calculate crop size according to device parameters ++ * @device: Structure containing ISP preview wrapper global information ++ * @crop: Structure containing crop size ++ * ++ * This function is used to calculate frame size reduction depending on ++ * the features enabled by the application. ++ **/ ++static void prev_calculate_crop(struct prev_device *device, ++ struct prev_cropsize *crop) ++{ ++ dev_dbg(prev_dev, "prev_calculate_crop E\n"); ++ ++ if (!device || !crop) { ++ dev_err(prev_dev, "\nErron in argument"); ++ return; ++ } ++ ++ isppreview_try_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ &crop->hcrop, &crop->vcrop); ++ crop->hcrop &= PREV_16PIX_ALIGN_MASK; ++ dev_dbg(prev_dev, "prev_calculate_crop L\n"); ++} ++ ++/** ++ * prev_get_status - Get status of ISP preview module ++ * @status: Structure containing the busy state. ++ * ++ * Checks if the ISP preview module is busy. ++ * ++ * Returns 0 if successful, or -EINVAL if the status parameter is invalid. ++ **/ ++static int prev_get_status(struct prev_status *status) ++{ ++ if (!status) { ++ dev_err(prev_dev, "get_status: invalid parameter\n"); ++ return -EINVAL; ++ } ++ status->hw_busy = (char)isppreview_busy(); ++ return 0; ++} ++ ++/** ++ * prev_hw_setup - Stores the desired configuration in the proper HW registers ++ * @config: Structure containing the desired configuration for ISP preview ++ * module. ++ * ++ * Reads the structure sent, and modifies the desired registers. ++ * ++ * Always returns 0. ++ **/ ++static int prev_hw_setup(struct prev_params *config) ++{ ++ dev_dbg(prev_dev, "prev_hw_setup E\n"); ++ ++ if (config->features & PREV_AVERAGER) ++ isppreview_config_averager(config->average); ++ else ++ isppreview_config_averager(0); ++ ++ if (config->features & PREV_INVERSE_ALAW) ++ isppreview_enable_invalaw(1); ++ else ++ isppreview_enable_invalaw(0); ++ ++ if (config->features & PREV_HORZ_MEDIAN_FILTER) { ++ isppreview_config_hmed(config->hmf_params); ++ isppreview_enable_hmed(1); ++ } else ++ isppreview_enable_hmed(0); ++ ++ if (config->features & PREV_DARK_FRAME_SUBTRACT) { ++ isppreview_set_darkaddr(config->drkf_params.addr); ++ isppreview_config_darklineoffset(config->drkf_params.offset); ++ isppreview_enable_drkframe(1); ++ } else ++ isppreview_enable_drkframe(0); ++ ++ if (config->features & PREV_LENS_SHADING) { ++ isppreview_config_drkf_shadcomp(config->lens_shading_shift); ++ isppreview_enable_shadcomp(1); ++ } else ++ isppreview_enable_shadcomp(0); ++ ++ dev_dbg(prev_dev, "prev_hw_setup L\n"); ++ return 0; ++} ++ ++/** ++ * prev_validate_params - Validate configuration parameters for Preview Wrapper ++ * @params: Structure containing configuration parameters ++ * ++ * Validate configuration parameters for Preview Wrapper ++ * ++ * Returns 0 if successful, or -EINVAL if a parameter value is invalid. ++ **/ ++static int prev_validate_params(struct prev_params *params) ++{ ++ if (!params) { ++ dev_err(prev_dev, "validate_params: error in argument"); ++ goto err_einval; ++ } ++ ++ if ((params->features & PREV_AVERAGER) == PREV_AVERAGER) { ++ if ((params->average != NO_AVE) ++ && (params->average != AVE_2_PIX) ++ && (params->average != AVE_4_PIX) ++ && (params->average != AVE_8_PIX)) { ++ dev_err(prev_dev, "validate_params: wrong pix " ++ "average\n"); ++ goto err_einval; ++ } else if (((params->average == AVE_2_PIX) ++ && (params->size_params.hsize % 2)) ++ || ((params->average == AVE_4_PIX) ++ && (params->size_params.hsize % 4)) ++ || ((params->average == AVE_8_PIX) ++ && (params->size_params.hsize % 8))) { ++ dev_err(prev_dev, "validate_params: " ++ "wrong pix average for input size\n"); ++ goto err_einval; ++ } ++ } ++ ++ if ((params->size_params.pixsize != PREV_INWIDTH_8BIT) ++ && (params->size_params.pixsize ++ != PREV_INWIDTH_10BIT)) { ++ dev_err(prev_dev, "validate_params: wrong pixsize\n"); ++ goto err_einval; ++ } ++ ++ if (params->size_params.hsize > MAX_IMAGE_WIDTH ++ || params->size_params.hsize < 0) { ++ dev_err(prev_dev, "validate_params: wrong hsize\n"); ++ goto err_einval; ++ } ++ ++ if ((params->pix_fmt != YCPOS_YCrYCb) ++ && (YCPOS_YCbYCr != params->pix_fmt) ++ && (YCPOS_CbYCrY != params->pix_fmt) ++ && (YCPOS_CrYCbY != params->pix_fmt)) { ++ dev_err(prev_dev, "validate_params: wrong pix_fmt"); ++ goto err_einval; ++ } ++ ++ if ((params->features & PREV_DARK_FRAME_SUBTRACT) ++ && (params->features ++ & PREV_DARK_FRAME_CAPTURE)) { ++ dev_err(prev_dev, "validate_params: DARK FRAME CAPTURE and " ++ "SUBSTRACT cannot be enabled " ++ "at same time\n"); ++ goto err_einval; ++ } ++ ++ if (params->features & PREV_DARK_FRAME_SUBTRACT) ++ if (!params->drkf_params.addr ++ || (params->drkf_params.offset % 32)) { ++ dev_err(prev_dev, "validate_params: dark frame " ++ "address\n"); ++ goto err_einval; ++ } ++ ++ if (params->features & PREV_LENS_SHADING) ++ if ((params->lens_shading_shift > 7) ++ || !params->drkf_params.addr ++ || (params->drkf_params.offset % 32)) { ++ dev_err(prev_dev, "validate_params: lens shading " ++ "shift\n"); ++ goto err_einval; ++ } ++ ++ if ((params->size_params.in_pitch <= 0) ++ || (params->size_params.in_pitch % 32)) { ++ params->size_params.in_pitch = ++ (params->size_params.hsize * 2) & 0xFFE0; ++ dev_err(prev_dev, "\nError in in_pitch; new value = %d", ++ params->size_params.in_pitch); ++ } ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * preview_isr - Callback from ISP driver for ISP Preview Interrupt ++ * @status: ISP IRQ0STATUS register value ++ * @arg1: Structure containing ISP preview wrapper global information ++ * @arg2: Currently not used ++ **/ ++static void preview_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ struct prev_device *device = (struct prev_device *)arg1; ++ ++ if ((status & PREV_DONE) != PREV_DONE) ++ return; ++ ++ if (device) ++ complete(&device->wfc); ++} ++ ++/** ++ * prev_do_preview - Performs the Preview process ++ * @device: Structure containing ISP preview wrapper global information ++ * @arg: Currently not used ++ * ++ * Returns 0 if successful, or -EINVAL if the sent parameters are invalid. ++ **/ ++static int prev_do_preview(struct prev_device *device, int *arg) ++{ ++ int bpp, size; ++ int ret = 0; ++ u32 out_hsize, out_vsize, out_line_offset; ++ ++ dev_dbg(prev_dev, "prev_do_preview E\n"); ++ ++ if (!device) { ++ dev_err(prev_dev, "preview: invalid parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (device->params->size_params.pixsize == PREV_INWIDTH_8BIT) ++ bpp = 1; ++ else ++ bpp = 2; ++ ++ size = device->params->size_params.hsize * ++ device->params->size_params.vsize * bpp; ++ ++ ret = isppreview_set_inaddr(device->isp_addr_read); ++ if (ret) ++ goto out; ++ ++ ret = isppreview_set_outaddr(device->isp_addr_read); ++ if (ret) ++ goto out; ++ ++ isppreview_try_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ &out_hsize, &out_vsize); ++ ++ ret = isppreview_config_inlineoffset(device->params->size_params.hsize ++ * bpp); ++ if (ret) ++ goto out; ++ ++ out_line_offset = (out_hsize * bpp) & PREV_32BYTES_ALIGN_MASK; ++ ++ ret = isppreview_config_outlineoffset(out_line_offset); ++ if (ret) ++ goto out; ++ ++ ret = isppreview_config_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ out_hsize, out_vsize); ++ if (ret) ++ goto out; ++ ++ isppreview_config_datapath(PRV_RAW_MEM, PREVIEW_MEM); ++ ++ ret = isp_set_callback(CBK_PREV_DONE, preview_isr, (void *)device, ++ (void *)NULL); ++ if (ret) { ++ dev_err(prev_dev, "ERROR while setting Previewer callback!\n"); ++ goto out; ++ } ++ isppreview_enable(1); ++ ++ wait_for_completion_interruptible(&device->wfc); ++ ++ if (device->isp_addr_read) { ++ ispmmu_unmap(device->isp_addr_read); ++ device->isp_addr_read = 0; ++ } ++ ++ ret = isp_unset_callback(CBK_PREV_DONE); ++ ++ dev_dbg(prev_dev, "prev_do_preview L\n"); ++out: ++ return ret; ++} ++ ++/** ++ * previewer_vbq_release - Videobuffer queue release ++ * @q: Structure containing the videobuffer queue. ++ * @vb: Structure containing the videobuffer used for previewer processing. ++ **/ ++static void previewer_vbq_release(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ ++ ispmmu_unmap(device->isp_addr_read); ++ device->isp_addr_read = 0; ++ spin_lock(&device->vbq_lock); ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ spin_unlock(&device->vbq_lock); ++ dev_dbg(prev_dev, "previewer_vbq_release\n"); ++} ++ ++/** ++ * previewer_vbq_setup - Sets up the videobuffer size and validates count. ++ * @q: Structure containing the videobuffer queue. ++ * @cnt: Number of buffers requested ++ * @size: Size in bytes of the buffer used for previewing ++ * ++ * Always returns 0. ++ **/ ++static int previewer_vbq_setup(struct videobuf_queue *q, ++ unsigned int *cnt, ++ unsigned int *size) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ u32 bpp = 1; ++ ++ spin_lock(&device->vbq_lock); ++ if (*cnt <= 0) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ if (*cnt > VIDEO_MAX_FRAME) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ if (!device->params->size_params.hsize || ++ !device->params->size_params.vsize) { ++ dev_err(prev_dev, "Can't setup buffer size\n"); ++ spin_unlock(&device->vbq_lock); ++ return -EINVAL; ++ } ++ ++ if (device->params->size_params.pixsize == PREV_INWIDTH_10BIT) ++ bpp = 2; ++ *size = prev_bufsize = bpp * device->params->size_params.hsize ++ * device->params->size_params.vsize; ++ spin_unlock(&device->vbq_lock); ++ dev_dbg(prev_dev, "previewer_vbq_setup\n"); ++ return 0; ++} ++ ++/** ++ * previewer_vbq_prepare - Videobuffer is prepared and mmapped. ++ * @q: Structure containing the videobuffer queue. ++ * @vb: Structure containing the videobuffer used for previewer processing. ++ * @field: Type of field to set in videobuffer device. ++ * ++ * Returns 0 if successful, or -EINVAL if buffer couldn't get allocated, or ++ * -EIO if the ISP MMU mapping fails ++ **/ ++static int previewer_vbq_prepare(struct videobuf_queue *q, ++ struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ int err = -EINVAL; ++ unsigned int isp_addr; ++ struct videobuf_dmabuf *dma = videobuf_to_dma(vb); ++ ++ dev_dbg(prev_dev, "previewer_vbq_prepare E\n"); ++ spin_lock(&device->vbq_lock); ++ if (vb->baddr) { ++ vb->size = prev_bufsize; ++ vb->bsize = prev_bufsize; ++ } else { ++ spin_unlock(&device->vbq_lock); ++ dev_err(prev_dev, "No user buffer allocated\n"); ++ goto out; ++ } ++ ++ vb->width = device->params->size_params.hsize; ++ vb->height = device->params->size_params.vsize; ++ vb->field = field; ++ spin_unlock(&device->vbq_lock); ++ ++ if (vb->state == VIDEOBUF_NEEDS_INIT) { ++ err = videobuf_iolock(q, vb, NULL); ++ if (!err) { ++ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ if (!isp_addr) ++ err = -EIO; ++ else ++ device->isp_addr_read = isp_addr; ++ } ++ } ++ ++ if (!err) { ++ vb->state = VIDEOBUF_PREPARED; ++ flush_cache_user_range(NULL, vb->baddr, ++ (vb->baddr + vb->bsize)); ++ } else ++ previewer_vbq_release(q, vb); ++ ++ dev_dbg(prev_dev, "previewer_vbq_prepare L\n"); ++out: ++ return err; ++} ++ ++static void previewer_vbq_queue(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ return; ++} ++ ++/** ++ * previewer_open - Initializes and opens the Preview Wrapper ++ * @inode: Inode structure associated with the Preview Wrapper ++ * @filp: File structure associated with the Preview Wrapper ++ * ++ * Returns 0 if successful, -EACCES if its unable to initialize default config, ++ * -EBUSY if its already opened or the ISP module is not available, or -ENOMEM ++ * if its unable to allocate the device in kernel space memory. ++ **/ ++static int previewer_open(struct inode *inode, struct file *filp) ++{ ++ int ret = 0; ++ struct prev_device *device = prevdevice; ++ struct prev_params *config = isppreview_get_config(); ++ struct prev_fh *fh; ++ ++ if (config == NULL) { ++ dev_err(prev_dev, "Unable to initialize default config " ++ "from isppreviewer\n\n"); ++ return -EACCES; ++ } ++ ++ if (device->opened || (filp->f_flags & O_NONBLOCK)) { ++ dev_err(prev_dev, "previewer_open: device is already " ++ "opened\n"); ++ return -EBUSY; ++ } ++ ++ fh = kzalloc(sizeof(struct prev_fh), GFP_KERNEL); ++ if (NULL == fh) ++ return -ENOMEM; ++ ++ isp_get(); ++ ret = isppreview_request(); ++ if (ret) { ++ isp_put(); ++ dev_err(prev_dev, "Can't acquire isppreview\n"); ++ return ret; ++ } ++ ++ device->params = config; ++ device->opened = 1; ++ ++ filp->private_data = fh; ++ fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ fh->device = device; ++ ++ videobuf_queue_sg_init(&fh->vbq, &device->vbq_ops, NULL, ++ &device->vbq_lock, fh->type, ++ V4L2_FIELD_NONE, ++ sizeof(struct videobuf_buffer), fh); ++ ++ init_completion(&device->wfc); ++ device->wfc.done = 0; ++ mutex_init(&device->prevwrap_mutex); ++ ++ return 0; ++} ++ ++/** ++ * previewer_release - Releases Preview Wrapper and frees up allocated memory ++ * @inode: Inode structure associated with the Preview Wrapper ++ * @filp: File structure associated with the Preview Wrapper ++ * ++ * Always returns 0. ++ **/ ++static int previewer_release(struct inode *inode, struct file *filp) ++{ ++ struct prev_fh *fh = filp->private_data; ++ struct prev_device *device = fh->device; ++ struct videobuf_queue *q = &fh->vbq; ++ ++ device->opened = 0; ++ device->params = NULL; ++ isppreview_free(); ++ videobuf_mmap_free(q); ++ isp_put(); ++ prev_bufsize = 0; ++ filp->private_data = NULL; ++ kfree(fh); ++ ++ dev_dbg(prev_dev, "previewer_release\n"); ++ return 0; ++} ++ ++/** ++ * previewer_mmap - Memory maps the Preview Wrapper module. ++ * @file: File structure associated with the Preview Wrapper ++ * @vma: Virtual memory area structure. ++ * ++ * Returns 0 if successful, or returned value by the videobuf_mmap_mapper() ++ * function. ++ **/ ++static int previewer_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ struct prev_fh *fh = file->private_data; ++ dev_dbg(prev_dev, "previewer_mmap\n"); ++ ++ return videobuf_mmap_mapper(&fh->vbq, vma); ++} ++ ++/** ++ * previewer_ioctl - I/O control function for Preview Wrapper ++ * @inode: Inode structure associated with the Preview Wrapper. ++ * @file: File structure associated with the Preview Wrapper. ++ * @cmd: Type of command to execute. ++ * @arg: Argument to send to requested command. ++ * ++ * Returns 0 if successful, -1 if bad command passed or access is denied, ++ * -EFAULT if copy_from_user() or copy_to_user() fails, -EINVAL if parameter ++ * validation fails or parameter structure is not present ++ **/ ++static int previewer_ioctl(struct inode *inode, struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ int ret = 0; ++ struct prev_params params; ++ struct prev_fh *fh = file->private_data; ++ struct prev_device *device = fh->device; ++ ++ dev_dbg(prev_dev, "Entering previewer_ioctl()\n"); ++ ++ if ((_IOC_TYPE(cmd) != PREV_IOC_BASE) ++ || (_IOC_NR(cmd) > PREV_IOC_MAXNR)) { ++ dev_err(prev_dev, "Bad command Value \n"); ++ goto err_minusone; ++ } ++ ++ if (_IOC_DIR(cmd) & _IOC_READ) ++ ret = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); ++ else if (_IOC_DIR(cmd) & _IOC_WRITE) ++ ret = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); ++ if (ret) { ++ dev_err(prev_dev, "access denied\n"); ++ goto err_minusone; ++ } ++ ++ switch (cmd) { ++ case PREV_REQBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_reqbufs(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_QUERYBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_querybuf(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_QUEUEBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_qbuf(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_SET_PARAM: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ if (copy_from_user(¶ms, (struct prev_params *)arg, ++ sizeof(struct prev_params))) { ++ mutex_unlock(&device->prevwrap_mutex); ++ return -EFAULT; ++ } ++ ret = prev_validate_params(¶ms); ++ if (ret < 0) { ++ dev_err(prev_dev, "Error validating parameters!\n"); ++ mutex_unlock(&device->prevwrap_mutex); ++ goto out; ++ } ++ if (device->params) ++ memcpy(device->params, ¶ms, ++ sizeof(struct prev_params)); ++ else { ++ mutex_unlock(&device->prevwrap_mutex); ++ return -EINVAL; ++ } ++ ++ ret = prev_hw_setup(device->params); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_GET_PARAM: ++ if (copy_to_user((struct prev_params *)arg, device->params, ++ sizeof(struct prev_params))) ++ ret = -EFAULT; ++ break; ++ ++ case PREV_GET_STATUS: ++ ret = prev_get_status((struct prev_status *)arg); ++ break; ++ ++ case PREV_PREVIEW: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = prev_do_preview(device, (int *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_GET_CROPSIZE: ++ { ++ struct prev_cropsize outputsize; ++ prev_calculate_crop(device, &outputsize); ++ if (copy_to_user((struct prev_cropsize *)arg, &outputsize, ++ sizeof(struct prev_cropsize))) ++ ret = -EFAULT; ++ } ++ break; ++ ++ default: ++ dev_err(prev_dev, "previewer_ioctl: Invalid Command Value\n"); ++ ret = -EINVAL; ++ } ++out: ++ return ret; ++err_minusone: ++ return -1; ++err_eintr: ++ return -EINTR; ++} ++ ++/** ++ * previewer_platform_release - Acts when Reference count is zero ++ * @device: Structure containing ISP preview wrapper global information ++ * ++ * This is called when the reference count goes to zero ++ **/ ++static void previewer_platform_release(struct device *device) ++{ ++ dev_dbg(prev_dev, "previewer_platform_release()\n"); ++} ++ ++static struct file_operations prev_fops = { ++ .owner = THIS_MODULE, ++ .open = previewer_open, ++ .release = previewer_release, ++ .mmap = previewer_mmap, ++ .ioctl = previewer_ioctl, ++}; ++ ++static struct platform_device omap_previewer_device = { ++ .name = OMAP_PREV_NAME, ++ .id = -1, ++ .dev = { ++ .release = previewer_platform_release, ++ } ++}; ++ ++/** ++ * previewer_probe - Checks for device presence ++ * @pdev: Structure containing details of the current device. ++ * ++ * Always returns 0 ++ **/ ++static int __init previewer_probe(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++/** ++ * previewer_remove - Handles the removal of the driver ++ * @pdev: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int previewer_remove(struct platform_device *pdev) ++{ ++ dev_dbg(prev_dev, "previewer_remove()\n"); ++ ++ platform_device_unregister(&omap_previewer_device); ++ platform_driver_unregister(&omap_previewer_driver); ++ unregister_chrdev(prev_major, OMAP_PREV_NAME); ++ return 0; ++} ++ ++static struct platform_driver omap_previewer_driver = { ++ .probe = previewer_probe, ++ .remove = previewer_remove, ++ .driver = { ++ .owner = THIS_MODULE, ++ .name = OMAP_PREV_NAME, ++ }, ++}; ++ ++/** ++ * omap_previewer_init - Initialization of Preview Wrapper ++ * ++ * Returns 0 if successful, -ENOMEM if could not allocate memory, -ENODEV if ++ * could not register the wrapper as a character device, or other errors if the ++ * device or driver can't register. ++ **/ ++static int __init omap_previewer_init(void) ++{ ++ int ret; ++ struct prev_device *device; ++ ++ device = kzalloc(sizeof(struct prev_device), GFP_KERNEL); ++ if (!device) { ++ dev_err(prev_dev, OMAP_PREV_NAME ": could not allocate" ++ " memory\n"); ++ return -ENOMEM; ++ } ++ prev_major = register_chrdev(0, OMAP_PREV_NAME, &prev_fops); ++ ++ if (prev_major < 0) { ++ dev_err(prev_dev, OMAP_PREV_NAME ": initialization " ++ "failed. could not register character " ++ "device\n"); ++ return -ENODEV; ++ } ++ ++ ret = platform_driver_register(&omap_previewer_driver); ++ if (ret) { ++ dev_err(prev_dev, OMAP_PREV_NAME ++ ": failed to register platform driver!\n"); ++ goto fail2; ++ } ++ ret = platform_device_register(&omap_previewer_device); ++ if (ret) { ++ dev_err(prev_dev, OMAP_PREV_NAME ++ ": failed to register platform device!\n"); ++ goto fail3; ++ } ++ ++ prev_class = class_create(THIS_MODULE, OMAP_PREV_NAME); ++ if (!prev_class) ++ goto fail4; ++ ++ prev_dev = device_create(prev_class, prev_dev, ++ (MKDEV(prev_major, 0)), NULL, ++ OMAP_PREV_NAME); ++ dev_dbg(prev_dev, OMAP_PREV_NAME ": Registered Previewer Wrapper\n"); ++ device->opened = 0; ++ ++ device->vbq_ops.buf_setup = previewer_vbq_setup; ++ device->vbq_ops.buf_prepare = previewer_vbq_prepare; ++ device->vbq_ops.buf_release = previewer_vbq_release; ++ device->vbq_ops.buf_queue = previewer_vbq_queue; ++ spin_lock_init(&device->vbq_lock); ++ ++ prevdevice = device; ++ return 0; ++ ++fail4: ++ platform_device_unregister(&omap_previewer_device); ++fail3: ++ platform_driver_unregister(&omap_previewer_driver); ++fail2: ++ unregister_chrdev(prev_major, OMAP_PREV_NAME); ++ ++ return ret; ++} ++ ++/** ++ * omap_previewer_exit - Close of Preview Wrapper ++ **/ ++static void __exit omap_previewer_exit(void) ++{ ++ previewer_remove(&omap_previewer_device); ++ kfree(prevdevice); ++ prev_major = -1; ++} ++ ++module_init(omap_previewer_init); ++module_exit(omap_previewer_exit); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("OMAP ISP Previewer"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/media/video/isp/omap_previewer.h b/drivers/media/video/isp/omap_previewer.h +new file mode 100644 +index 0000000..0bb31cd +--- /dev/null ++++ b/drivers/media/video/isp/omap_previewer.h +@@ -0,0 +1,162 @@ ++/* ++ * drivers/media/video/isp/omap_previewer.h ++ * ++ * Header file for Preview module wrapper in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Leonides Martinez ++ * Sergio Aguirre ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include "isppreview.h" ++ ++#ifndef OMAP_ISP_PREVIEW_WRAP_H ++#define OMAP_ISP_PREVIEW_WRAP_H ++ ++#define PREV_IOC_BASE 'P' ++#define PREV_REQBUF _IOWR(PREV_IOC_BASE, 1,\ ++ struct v4l2_requestbuffers) ++#define PREV_QUERYBUF _IOWR(PREV_IOC_BASE, 2,\ ++ struct v4l2_buffer) ++#define PREV_SET_PARAM _IOW(PREV_IOC_BASE, 3,\ ++ struct prev_params) ++#define PREV_GET_PARAM _IOWR(PREV_IOC_BASE, 4,\ ++ struct prev_params) ++#define PREV_PREVIEW _IOR(PREV_IOC_BASE, 5, int) ++#define PREV_GET_STATUS _IOR(PREV_IOC_BASE, 6, char) ++#define PREV_GET_CROPSIZE _IOR(PREV_IOC_BASE, 7,\ ++ struct prev_cropsize) ++#define PREV_QUEUEBUF _IOWR(PREV_IOC_BASE, 8,\ ++ struct v4l2_buffer) ++#define PREV_IOC_MAXNR 8 ++ ++#define LUMA_TABLE_SIZE 128 ++#define GAMMA_TABLE_SIZE 1024 ++#define CFA_COEFF_TABLE_SIZE 576 ++#define NOISE_FILTER_TABLE_SIZE 256 ++ ++#define MAX_IMAGE_WIDTH 3300 ++ ++#define PREV_INWIDTH_8BIT 0 /* pixel width of 8 bits */ ++#define PREV_INWIDTH_10BIT 1 /* pixel width of 10 bits */ ++ ++#define PREV_32BYTES_ALIGN_MASK 0xFFFFFFE0 ++#define PREV_16PIX_ALIGN_MASK 0xFFFFFFF0 ++ ++/** ++ * struct prev_rgbblending - Structure for RGB2RGB blending parameters ++ * @blending: Color correlation 3x3 matrix. ++ * @offset: Color correlation offsets. ++ */ ++struct prev_rgbblending { ++ short blending[RGB_MAX][RGB_MAX]; /* color correlation 3x3 ++ * matrix. ++ */ ++ short offset[RGB_MAX]; /* color correlation offsets */ ++}; ++ ++/** ++ * struct prev_cfa_coeffs - Structure for CFA coefficients ++ * @hthreshold: Horizontal threshold. ++ * @vthreshold: Vertical threshold. ++ * @coeffs: CFA coefficients ++ */ ++struct prev_cfa_coeffs { ++ char hthreshold, vthreshold; ++ int coeffs[CFA_COEFF_TABLE_SIZE]; ++}; ++ ++/** ++ * struct prev_gamma_coeffs - Structure for Gamma Coefficients ++ * @red: Table of gamma correction values for red color. ++ * @green: Table of gamma correction values for green color. ++ * @blue: Table of gamma correction values for blue color. ++ */ ++struct prev_gamma_coeffs { ++ unsigned char red[GAMMA_TABLE_SIZE]; ++ unsigned char green[GAMMA_TABLE_SIZE]; ++ unsigned char blue[GAMMA_TABLE_SIZE]; ++}; ++ ++/** ++ * struct prev_noiseflt_coeffs - Structure for Noise Filter Coefficients. ++ * @noise: Noise filter table. ++ * @strength: Used to find out weighted average. ++ */ ++struct prev_noiseflt_coeffs { ++ unsigned char noise[NOISE_FILTER_TABLE_SIZE]; ++ unsigned char strength; ++}; ++ ++/** ++ * struct prev_chroma_spr - Structure for Chroma Suppression. ++ * @hpfy: High passed version of Y or normal Y. ++ * @threshold: Threshold for chroma suppress. ++ * @gain: Chroma suppression gain ++ */ ++struct prev_chroma_spr { ++ unsigned char hpfy; ++ char threshold; ++ unsigned char gain; ++}; ++ ++/** ++ * struct prev_status - Structure to know status of the hardware ++ * @hw_busy: Flag to indicate if Hardware is Busy. ++ */ ++struct prev_status { ++ char hw_busy; ++}; ++ ++/** ++ * struct prev_cropsize - Structure to know crop size. ++ * @hcrop: Horizontal size of crop window. ++ * @vcrop: Vertical size of crop window. ++ */ ++struct prev_cropsize { ++ int hcrop; ++ int vcrop; ++}; ++ ++/** ++ * struct prev_device - Global device information structure. ++ * @params: Pointer to structure containing preview parameters. ++ * @opened: State of the device. ++ * @wfc: Wait for completion. Used for locking operations. ++ * @prevwrap_mutex: Mutex for preview wrapper use. ++ * @vbq_lock: Spinlock for videobuf queues. ++ * @vbq_ops: Videobuf queue operations ++ * @isp_addr_read: Input/Output address ++ */ ++struct prev_device { ++ struct prev_params *params; ++ unsigned char opened; ++ struct completion wfc; ++ struct mutex prevwrap_mutex; /* For generic internal use */ ++ spinlock_t vbq_lock; /* For videobuffer queue handling */ ++ struct videobuf_queue_ops vbq_ops; ++ dma_addr_t isp_addr_read; ++}; ++ ++/** ++ * struct prev_fh - Per-filehandle data structure ++ * @type: Used buffer type. ++ * @vbq: Videobuffer queue. ++ * @device: Pointer to device information structure. ++ */ ++struct prev_fh { ++ enum v4l2_buf_type type; ++ struct videobuf_queue vbq; ++ struct prev_device *device; ++}; ++#endif +diff --git a/drivers/media/video/isp/omap_resizer.c b/drivers/media/video/isp/omap_resizer.c +new file mode 100644 +index 0000000..54bc425 +--- /dev/null ++++ b/drivers/media/video/isp/omap_resizer.c +@@ -0,0 +1,1634 @@ ++/* ++ * drivers/media/video/isp/omap_resizer.c ++ * ++ * Wrapper for Resizer module in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * Contributors: ++ * Sergio Aguirre ++ * Troy Laramy ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "isp.h" ++#include "ispmmu.h" ++#include "ispreg.h" ++#include "ispresizer.h" ++#include ++ ++#define OMAP_REZR_NAME "omap-resizer" ++ ++/* Defines and Constants*/ ++#define MAX_CHANNELS 16 ++#define MAX_IMAGE_WIDTH 2047 ++#define MAX_IMAGE_WIDTH_HIGH 2047 ++#define ALIGNMENT 16 ++#define CHANNEL_BUSY 1 ++#define CHANNEL_FREE 0 ++#define PIXEL_EVEN 2 ++#define RATIO_MULTIPLIER 256 ++/* Bit position Macro */ ++/* macro for bit set and clear */ ++#define BITSET(variable, bit) ((variable) | (1 << bit)) ++#define BITRESET(variable, bit) ((variable) & ~(0x00000001 << (bit))) ++#define SET_BIT_INPUTRAM 28 ++#define SET_BIT_CBLIN 29 ++#define SET_BIT_INPTYP 27 ++#define SET_BIT_YCPOS 26 ++#define INPUT_RAM 1 ++#define UP_RSZ_RATIO 64 ++#define DOWN_RSZ_RATIO 512 ++#define UP_RSZ_RATIO1 513 ++#define DOWN_RSZ_RATIO1 1024 ++#define RSZ_IN_SIZE_VERT_SHIFT 16 ++#define MAX_HORZ_PIXEL_8BIT 31 ++#define MAX_HORZ_PIXEL_16BIT 15 ++#define NUM_PHASES 8 ++#define NUM_TAPS 4 ++#define NUM_D2PH 4 /* for downsampling * 2+x ~ 4x, ++ * number of phases ++ */ ++#define NUM_D2TAPS 7 /* for downsampling * 2+x ~ 4x, ++ * number of taps ++ */ ++#define ALIGN32 32 ++#define MAX_COEF_COUNTER 16 ++#define COEFF_ADDRESS_OFFSET 0x04 ++ ++/* Global structure which contains information about number of channels ++ and protection variables */ ++struct device_params { ++ ++ unsigned char opened; /* state of the device */ ++ struct completion compl_isr; /* Completion for interrupt */ ++ struct mutex reszwrap_mutex; /* Semaphore for array */ ++ ++ struct videobuf_queue_ops vbq_ops; /* videobuf queue operations */ ++}; ++ ++/* Register mapped structure which contains the every register ++ information */ ++struct resizer_config { ++ u32 rsz_pcr; /* pcr register mapping ++ * variable. ++ */ ++ u32 rsz_in_start; /* in_start register mapping ++ * variable. ++ */ ++ u32 rsz_in_size; /* in_size register mapping ++ * variable. ++ */ ++ u32 rsz_out_size; /* out_size register mapping ++ * variable. ++ */ ++ u32 rsz_cnt; /* rsz_cnt register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inadd; /* sdr_inadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inoff; /* sdr_inoff register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outadd; /* sdr_outadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outoff; /* sdr_outbuff register ++ * mapping variable. ++ */ ++ u32 rsz_coeff_horz[16]; /* horizontal coefficients ++ * mapping array. ++ */ ++ u32 rsz_coeff_vert[16]; /* vertical coefficients ++ * mapping array. ++ */ ++ u32 rsz_yehn; /* yehn(luma)register mapping ++ * variable. ++ */ ++}; ++ ++struct rsz_mult { ++ int in_hsize; /* input frame horizontal ++ * size. ++ */ ++ int in_vsize; /* input frame vertical size. ++ */ ++ int out_hsize; /* output frame horizontal ++ * size. ++ */ ++ int out_vsize; /* output frame vertical ++ * size. ++ */ ++ int in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ int out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ int end_hsize; ++ int end_vsize; ++ int num_htap; /* 0 = 7tap; 1 = 4tap */ ++ int num_vtap; /* 0 = 7tap; 1 = 4tap */ ++ int active; ++ int inptyp; ++ int vrsz; ++ int hrsz; ++ int hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ int vstph; ++ int pix_fmt; /* # defined, UYVY or YUYV. */ ++ int cbilin; /* # defined, filter with luma ++ * or bi-linear. ++ */ ++ u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++}; ++/* Channel specific structure contains information regarding ++ the every channel */ ++struct channel_config { ++ struct resizer_config register_config; /* Instance of register set ++ * mapping structure ++ */ ++ int status; /* Specifies whether the ++ * channel is busy or not ++ */ ++ struct mutex chanprotection_mutex; ++ enum config_done config_state; ++ u8 input_buf_index; ++ u8 output_buf_index; ++ ++}; ++ ++/* per-filehandle data structure */ ++struct rsz_fh { ++ struct rsz_params *params; ++ struct channel_config *config; ++ struct rsz_mult *multipass; /* Multipass to support ++ * resizing ration outside ++ * of 0.25x to 4x ++ */ ++ spinlock_t vbq_lock; /* spinlock for videobuf ++ * queues. ++ */ ++ enum v4l2_buf_type type; ++ struct videobuf_queue vbq; ++ struct device_params *device; ++ ++ dma_addr_t isp_addr_read; /* Input/Output address */ ++ dma_addr_t isp_addr_write; /* Input/Output address */ ++ u32 rsz_bufsize; /* channel specific buffersize ++ */ ++}; ++ ++static struct device_params *device_config; ++static struct device *rsz_device; ++static int rsz_major = -1; ++/* functions declaration */ ++static void rsz_hardware_setup(struct channel_config *rsz_conf_chan); ++static int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *, ++ struct channel_config *); ++static int rsz_get_params(struct rsz_params *, struct channel_config *); ++static void rsz_copy_data(struct rsz_mult *multipass, ++ struct rsz_params *params); ++static void rsz_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2); ++static void rsz_calculate_crop(struct channel_config *rsz_conf_chan, ++ struct rsz_cropsize *cropsize); ++static int rsz_set_multipass(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++static int rsz_set_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++static void rsz_config_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++ ++/** ++ * rsz_hardware_setup - Sets hardware configuration registers ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Set hardware configuration registers ++ **/ ++static void rsz_hardware_setup(struct channel_config *rsz_conf_chan) ++{ ++ int coeffcounter; ++ int coeffoffset = 0; ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_cnt, ++ OMAP3ISP_RESZ_REG(ISPRSZ_CNT)); ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_in_start, ++ OMAP3ISP_RESZ_REG(ISPRSZ_IN_START)); ++ omap_writel(rsz_conf_chan->register_config.rsz_in_size, ++ OMAP3ISP_RESZ_REG(ISPRSZ_IN_SIZE)); ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_out_size, ++ OMAP3ISP_RESZ_REG(ISPRSZ_OUT_SIZE)); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_inadd, ++ OMAP3ISP_RESZ_REG(ISPRSZ_SDR_INADD)); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_inoff, ++ OMAP3ISP_RESZ_REG(ISPRSZ_SDR_INOFF)); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_outadd, ++ OMAP3ISP_RESZ_REG(ISPRSZ_SDR_OUTADD)); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_outoff, ++ OMAP3ISP_RESZ_REG(ISPRSZ_SDR_OUTOFF)); ++ omap_writel(rsz_conf_chan->register_config.rsz_yehn, OMAP3ISP_RESZ_REG(ISPRSZ_YENH)); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ omap_writel(rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter], ++ OMAP3ISP_RESZ_REG(ISPRSZ_HFILT10 ++ + coeffoffset)); ++ ++ omap_writel(rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter], ++ OMAP3ISP_RESZ_REG(ISPRSZ_VFILT10 ++ + coeffoffset)); ++ coeffoffset = coeffoffset + COEFF_ADDRESS_OFFSET; ++ } ++} ++ ++/** ++ * rsz_start - Enables Resizer Wrapper ++ * @arg: Currently not used. ++ * @device: Structure containing ISP resizer wrapper global information ++ * ++ * Submits a resizing task specified by the rsz_resize structure. The call can ++ * either be blocked until the task is completed or returned immediately based ++ * on the value of the blocking argument in the rsz_resize structure. If it is ++ * blocking, the status of the task can be checked by calling ioctl ++ * RSZ_G_STATUS. Only one task can be outstanding for each logical channel. ++ * ++ * Returns 0 if successful, or -EINVAL if could not set callback for RSZR IRQ ++ * event or the state of the channel is not configured. ++ **/ ++int rsz_start(int *arg, struct rsz_fh *fh) ++{ ++ struct channel_config *rsz_conf_chan = fh->config; ++ struct rsz_mult *multipass = fh->multipass; ++ struct videobuf_queue *q = &fh->vbq; ++ int ret; ++ ++ if (rsz_conf_chan->config_state) { ++ dev_err(rsz_device, "State not configured \n"); ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->status = CHANNEL_BUSY; ++ ++ rsz_hardware_setup(rsz_conf_chan); ++ ++ if (isp_set_callback(CBK_RESZ_DONE, rsz_isr, (void *) NULL, ++ (void *)NULL)) { ++ dev_err(rsz_device, "No callback for RSZR\n"); ++ goto err_einval; ++ } ++mult: ++ device_config->compl_isr.done = 0; ++ ++ ispresizer_enable(1); ++ ++ ret = wait_for_completion_interruptible(&device_config->compl_isr); ++ if (ret != 0) { ++ dev_dbg(rsz_device, "Unexpected exit from " ++ "wait_for_completion_interruptible\n"); ++ wait_for_completion(&device_config->compl_isr); ++ } ++ ++ if (multipass->active) { ++ rsz_set_multipass(multipass, rsz_conf_chan); ++ goto mult; ++ } ++ ++ if (fh->isp_addr_read) { ++ ispmmu_unmap(fh->isp_addr_read); ++ fh->isp_addr_read = 0; ++ } ++ if (fh->isp_addr_write) { ++ ispmmu_unmap(fh->isp_addr_write); ++ fh->isp_addr_write = 0; ++ } ++ ++ rsz_conf_chan->status = CHANNEL_FREE; ++ q->bufs[rsz_conf_chan->input_buf_index]->state = VIDEOBUF_NEEDS_INIT; ++ q->bufs[rsz_conf_chan->output_buf_index]->state = VIDEOBUF_NEEDS_INIT; ++ rsz_conf_chan->register_config.rsz_sdr_outadd = 0; ++ rsz_conf_chan->register_config.rsz_sdr_inadd = 0; ++ ++ /* Unmap and free the DMA memory allocated for buffers */ ++ videobuf_dma_unmap(q, videobuf_to_dma( ++ q->bufs[rsz_conf_chan->input_buf_index])); ++ videobuf_dma_unmap(q, videobuf_to_dma( ++ q->bufs[rsz_conf_chan->output_buf_index])); ++ videobuf_dma_free(videobuf_to_dma( ++ q->bufs[rsz_conf_chan->input_buf_index])); ++ videobuf_dma_free(videobuf_to_dma( ++ q->bufs[rsz_conf_chan->output_buf_index])); ++ ++ isp_unset_callback(CBK_RESZ_DONE); ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_set_multipass - Set resizer multipass ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Returns always 0 ++ **/ ++static int rsz_set_multipass(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan) ++{ ++ multipass->in_hsize = multipass->out_hsize; ++ multipass->in_vsize = multipass->out_vsize; ++ multipass->out_hsize = multipass->end_hsize; ++ multipass->out_vsize = multipass->end_vsize; ++ ++ multipass->out_pitch = (multipass->inptyp ? multipass->out_hsize ++ : (multipass->out_hsize * 2)); ++ multipass->in_pitch = (multipass->inptyp ? multipass->in_hsize ++ : (multipass->in_hsize * 2)); ++ ++ rsz_set_ratio(multipass, rsz_conf_chan); ++ rsz_config_ratio(multipass, rsz_conf_chan); ++ rsz_hardware_setup(rsz_conf_chan); ++ return 0; ++} ++ ++/** ++ * rsz_copy_data - Copy data ++ * @params: Structure containing the Resizer Wrapper parameters ++ * ++ * Copy data ++ **/ ++static void rsz_copy_data(struct rsz_mult *multipass, struct rsz_params *params) ++{ ++ int i; ++ multipass->in_hsize = params->in_hsize; ++ multipass->in_vsize = params->in_vsize; ++ multipass->out_hsize = params->out_hsize; ++ multipass->out_vsize = params->out_vsize; ++ multipass->end_hsize = params->out_hsize; ++ multipass->end_vsize = params->out_vsize; ++ multipass->in_pitch = params->in_pitch; ++ multipass->out_pitch = params->out_pitch; ++ multipass->hstph = params->hstph; ++ multipass->vstph = params->vstph; ++ multipass->inptyp = params->inptyp; ++ multipass->pix_fmt = params->pix_fmt; ++ multipass->cbilin = params->cbilin; ++ ++ for (i = 0; i < 32; i++) { ++ multipass->tap4filt_coeffs[i] = params->tap4filt_coeffs[i]; ++ multipass->tap7filt_coeffs[i] = params->tap7filt_coeffs[i]; ++ } ++} ++ ++/** ++ * rsz_set_params - Set parameters for resizer wrapper ++ * @params: Structure containing the Resizer Wrapper parameters ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Used to set the parameters of the Resizer hardware, including input and ++ * output image size, horizontal and vertical poly-phase filter coefficients, ++ * luma enchancement filter coefficients, etc. ++ **/ ++static int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *params, ++ struct channel_config *rsz_conf_chan) ++{ ++ int mul = 1; ++ if ((params->yenh_params.type < 0) || (params->yenh_params.type > 2)) { ++ dev_err(rsz_device, "rsz_set_params: Wrong yenh type\n"); ++ return -EINVAL; ++ } ++ if ((params->in_vsize <= 0) || (params->in_hsize <= 0) || ++ (params->out_vsize <= 0) || (params->out_hsize <= 0) || ++ (params->in_pitch <= 0) || (params->out_pitch <= 0)) { ++ dev_err(rsz_device, "rsz_set_params: Invalid size params\n"); ++ return -EINVAL; ++ } ++ if ((params->inptyp != RSZ_INTYPE_YCBCR422_16BIT) && ++ (params->inptyp != RSZ_INTYPE_PLANAR_8BIT)) { ++ dev_err(rsz_device, "rsz_set_params: Invalid input type\n"); ++ return -EINVAL; ++ } ++ if ((params->pix_fmt != RSZ_PIX_FMT_UYVY) && ++ (params->pix_fmt != RSZ_PIX_FMT_YUYV)) { ++ dev_err(rsz_device, "rsz_set_params: Invalid pixel format\n"); ++ return -EINVAL; ++ } ++ if (params->inptyp == RSZ_INTYPE_YCBCR422_16BIT) ++ mul = 2; ++ else ++ mul = 1; ++ if (params->in_pitch < (params->in_hsize * mul)) { ++ dev_err(rsz_device, "rsz_set_params: Pitch is incorrect\n"); ++ return -EINVAL; ++ } ++ if (params->out_pitch < (params->out_hsize * mul)) { ++ dev_err(rsz_device, "rsz_set_params: Out pitch cannot be less" ++ " than out hsize\n"); ++ return -EINVAL; ++ } ++ /* Output H size should be even */ ++ if ((params->out_hsize % PIXEL_EVEN) != 0) { ++ dev_err(rsz_device, "rsz_set_params: Output H size should" ++ " be even\n"); ++ return -EINVAL; ++ } ++ if (params->horz_starting_pixel < 0) { ++ dev_err(rsz_device, "rsz_set_params: Horz start pixel cannot" ++ " be less than zero\n"); ++ return -EINVAL; ++ } ++ ++ rsz_copy_data(multipass, params); ++ if (0 != rsz_set_ratio(multipass, rsz_conf_chan)) ++ goto err_einval; ++ ++ if (params->yenh_params.type) { ++ if ((multipass->num_htap && multipass->out_hsize > ++ 1280) || ++ (!multipass->num_htap && multipass->out_hsize > ++ 640)) ++ goto err_einval; ++ } ++ ++ if (INPUT_RAM) ++ params->vert_starting_pixel = 0; ++ ++ rsz_conf_chan->register_config.rsz_in_start = ++ (params->vert_starting_pixel ++ << ISPRSZ_IN_SIZE_VERT_SHIFT) ++ & ISPRSZ_IN_SIZE_VERT_MASK; ++ ++ if (params->inptyp == RSZ_INTYPE_PLANAR_8BIT) { ++ if (params->horz_starting_pixel > MAX_HORZ_PIXEL_8BIT) ++ goto err_einval; ++ } ++ if (params->inptyp == RSZ_INTYPE_YCBCR422_16BIT) { ++ if (params->horz_starting_pixel > MAX_HORZ_PIXEL_16BIT) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_in_start |= ++ params->horz_starting_pixel ++ & ISPRSZ_IN_START_HORZ_ST_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn = ++ (params->yenh_params.type ++ << ISPRSZ_YENH_ALGO_SHIFT) ++ & ISPRSZ_YENH_ALGO_MASK; ++ ++ if (params->yenh_params.type) { ++ rsz_conf_chan->register_config.rsz_yehn |= ++ params->yenh_params.core ++ & ISPRSZ_YENH_CORE_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn |= ++ (params->yenh_params.gain ++ << ISPRSZ_YENH_GAIN_SHIFT) ++ & ISPRSZ_YENH_GAIN_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn |= ++ (params->yenh_params.slop ++ << ISPRSZ_YENH_SLOP_SHIFT) ++ & ISPRSZ_YENH_SLOP_MASK; ++ } ++ ++ rsz_config_ratio(multipass, rsz_conf_chan); ++ ++ rsz_conf_chan->config_state = STATE_CONFIGURED; ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_set_ratio - Set ratio ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Returns 0 if successful, -EINVAL if invalid output size, upscaling ratio is ++ * being requested, or other ratio configuration value is out of bounds ++ **/ ++static int rsz_set_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan) ++{ ++ int alignment = 0; ++ ++ rsz_conf_chan->register_config.rsz_cnt = 0; ++ ++ if ((multipass->out_hsize > MAX_IMAGE_WIDTH) || ++ (multipass->out_vsize > MAX_IMAGE_WIDTH)) { ++ dev_err(rsz_device, "Invalid output size!"); ++ goto err_einval; ++ } ++ if (multipass->cbilin) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_CBLIN); ++ } ++ if (INPUT_RAM) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_INPUTRAM); ++ } ++ if (multipass->inptyp == RSZ_INTYPE_PLANAR_8BIT) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_INPTYP); ++ } else { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITRESET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_INPTYP); ++ ++ if (multipass->pix_fmt == RSZ_PIX_FMT_UYVY) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITRESET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_YCPOS); ++ } else if (multipass->pix_fmt == RSZ_PIX_FMT_YUYV) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_YCPOS); ++ } ++ ++ } ++ multipass->vrsz = ++ (multipass->in_vsize * RATIO_MULTIPLIER) / multipass->out_vsize; ++ multipass->hrsz = ++ (multipass->in_hsize * RATIO_MULTIPLIER) / multipass->out_hsize; ++ if (UP_RSZ_RATIO > multipass->vrsz || UP_RSZ_RATIO > multipass->hrsz) { ++ dev_err(rsz_device, "Upscaling ratio not supported!"); ++ goto err_einval; ++ } ++ multipass->vrsz = (multipass->in_vsize - NUM_D2TAPS) * RATIO_MULTIPLIER ++ / (multipass->out_vsize - 1); ++ multipass->hrsz = ((multipass->in_hsize - NUM_D2TAPS) ++ * RATIO_MULTIPLIER) / ++ (multipass->out_hsize - 1); ++ ++ if (multipass->hrsz <= 512) { ++ multipass->hrsz = (multipass->in_hsize - NUM_TAPS) ++ * RATIO_MULTIPLIER ++ / (multipass->out_hsize - 1); ++ if (multipass->hrsz < 64) ++ multipass->hrsz = 64; ++ if (multipass->hrsz > 512) ++ multipass->hrsz = 512; ++ if (multipass->hstph > NUM_PHASES) ++ goto err_einval; ++ multipass->num_htap = 1; ++ } else if (multipass->hrsz >= 513 && multipass->hrsz <= 1024) { ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_htap = 0; ++ } ++ ++ if (multipass->vrsz <= 512) { ++ multipass->vrsz = (multipass->in_vsize - NUM_TAPS) ++ * RATIO_MULTIPLIER ++ / (multipass->out_vsize - 1); ++ if (multipass->vrsz < 64) ++ multipass->vrsz = 64; ++ if (multipass->vrsz > 512) ++ multipass->vrsz = 512; ++ if (multipass->vstph > NUM_PHASES) ++ goto err_einval; ++ multipass->num_vtap = 1; ++ } else if (multipass->vrsz >= 513 && multipass->vrsz <= 1024) { ++ if (multipass->vstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_vtap = 0; ++ } ++ ++ if ((multipass->in_pitch) % ALIGN32) { ++ dev_err(rsz_device, "Invalid input pitch: %d \n", ++ multipass->in_pitch); ++ goto err_einval; ++ } ++ if ((multipass->out_pitch) % ALIGN32) { ++ dev_err(rsz_device, "Invalid output pitch %d \n", ++ multipass->out_pitch); ++ goto err_einval; ++ } ++ ++ if (multipass->vrsz < 256 && ++ (multipass->in_vsize < multipass->out_vsize)) { ++ if (multipass->inptyp == RSZ_INTYPE_PLANAR_8BIT) ++ alignment = ALIGNMENT; ++ else if (multipass->inptyp == RSZ_INTYPE_YCBCR422_16BIT) ++ alignment = (ALIGNMENT / 2); ++ else ++ dev_err(rsz_device, "Invalid input type\n"); ++ ++ if (!(((multipass->out_hsize % PIXEL_EVEN) == 0) ++ && (multipass->out_hsize % alignment) == 0)) { ++ dev_err(rsz_device, "wrong hsize\n"); ++ goto err_einval; ++ } ++ } ++ if (multipass->hrsz >= 64 && multipass->hrsz <= 1024) { ++ if (multipass->out_hsize > MAX_IMAGE_WIDTH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ multipass->active = 0; ++ ++ } else if (multipass->hrsz > 1024) { ++ if (multipass->out_hsize > MAX_IMAGE_WIDTH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_htap = 0; ++ multipass->out_hsize = multipass->in_hsize * 256 / 1024; ++ if (multipass->out_hsize % ALIGN32) { ++ multipass->out_hsize += ++ abs((multipass->out_hsize % ALIGN32) - ALIGN32); ++ } ++ multipass->out_pitch = ((multipass->inptyp) ? ++ multipass->out_hsize : ++ (multipass->out_hsize * 2)); ++ multipass->hrsz = ((multipass->in_hsize - NUM_D2TAPS) ++ * RATIO_MULTIPLIER) ++ / (multipass->out_hsize - 1); ++ multipass->active = 1; ++ ++ } ++ ++ if (multipass->vrsz > 1024) { ++ if (multipass->out_vsize > MAX_IMAGE_WIDTH_HIGH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ ++ multipass->out_vsize = multipass->in_vsize * 256 / 1024; ++ multipass->vrsz = ((multipass->in_vsize - NUM_D2TAPS) ++ * RATIO_MULTIPLIER) ++ / (multipass->out_vsize - 1); ++ multipass->active = 1; ++ multipass->num_vtap = 0; ++ ++ } ++ rsz_conf_chan->register_config.rsz_out_size = ++ multipass->out_hsize ++ & ISPRSZ_OUT_SIZE_HORZ_MASK; ++ ++ rsz_conf_chan->register_config.rsz_out_size |= ++ (multipass->out_vsize ++ << ISPRSZ_OUT_SIZE_VERT_SHIFT) ++ & ISPRSZ_OUT_SIZE_VERT_MASK; ++ ++ rsz_conf_chan->register_config.rsz_sdr_inoff = ++ multipass->in_pitch ++ & ISPRSZ_SDR_INOFF_OFFSET_MASK; ++ ++ rsz_conf_chan->register_config.rsz_sdr_outoff = ++ multipass->out_pitch ++ & ISPRSZ_SDR_OUTOFF_OFFSET_MASK; ++ ++ if (multipass->hrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->hstph > NUM_PHASES) ++ goto err_einval; ++ } else if (multipass->hrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->hstph ++ << ISPRSZ_CNT_HSTPH_SHIFT) ++ & ISPRSZ_CNT_HSTPH_MASK; ++ ++ if (multipass->vrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->vstph > NUM_PHASES) ++ goto err_einval; ++ } else if (multipass->vrsz >= 64 && multipass->vrsz <= 512) { ++ if (multipass->vstph > NUM_D2PH) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->vstph ++ << ISPRSZ_CNT_VSTPH_SHIFT) ++ & ISPRSZ_CNT_VSTPH_MASK; ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->hrsz - 1) ++ & ISPRSZ_CNT_HRSZ_MASK; ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ ((multipass->vrsz - 1) ++ << ISPRSZ_CNT_VRSZ_SHIFT) ++ & ISPRSZ_CNT_VRSZ_MASK; ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_config_ratio - Configure ratio ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Configure ratio ++ **/ ++static void rsz_config_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan) ++{ ++ int hsize; ++ int vsize; ++ int coeffcounter; ++ ++ if (multipass->hrsz <= 512) { ++ hsize = ((32 * multipass->hstph + (multipass->out_hsize - 1) ++ * multipass->hrsz + 16) >> 8) + 7; ++ } else { ++ hsize = ((64 * multipass->hstph + (multipass->out_hsize - 1) ++ * multipass->hrsz + 32) >> 8) + 7; ++ } ++ if (multipass->vrsz <= 512) { ++ vsize = ((32 * multipass->vstph + (multipass->out_vsize - 1) ++ * multipass->vrsz + 16) >> 8) + 4; ++ } else { ++ vsize = ((64 * multipass->vstph + (multipass->out_vsize - 1) ++ * multipass->vrsz + 32) >> 8) + 7; ++ } ++ rsz_conf_chan->register_config.rsz_in_size = hsize; ++ ++ rsz_conf_chan->register_config.rsz_in_size |= ++ ((vsize << ISPRSZ_IN_SIZE_VERT_SHIFT) ++ & ISPRSZ_IN_SIZE_VERT_MASK); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ if (multipass->num_htap) { ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] = ++ (multipass->tap4filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK); ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] |= ++ ((multipass->tap4filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT) ++ & ISPRSZ_HFILT10_COEF1_MASK); ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] = ++ (multipass->tap7filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK); ++ ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] |= ++ ((multipass->tap7filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT) ++ & ISPRSZ_HFILT10_COEF1_MASK); ++ } ++ ++ if (multipass->num_vtap) { ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] = ++ (multipass->tap4filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK); ++ ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] |= ++ ((multipass->tap4filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_VFILT10_COEF1_SHIFT) & ++ ISPRSZ_VFILT10_COEF1_MASK); ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] = ++ (multipass->tap7filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK); ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] |= ++ ((multipass->tap7filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_VFILT10_COEF1_SHIFT) ++ & ISPRSZ_VFILT10_COEF1_MASK); ++ } ++ } ++} ++ ++/** ++ * rsz_get_params - Gets the parameter values ++ * @params: Structure containing the Resizer Wrapper parameters ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Used to get the Resizer hardware settings associated with the ++ * current logical channel represented by fd. ++ **/ ++static int rsz_get_params(struct rsz_params *params, ++ struct channel_config *rsz_conf_chan) ++{ ++ int coeffcounter; ++ ++ if (rsz_conf_chan->config_state) { ++ dev_err(rsz_device, "state not configured\n"); ++ return -EINVAL; ++ } ++ ++ params->in_hsize = rsz_conf_chan->register_config.rsz_in_size ++ & ISPRSZ_IN_SIZE_HORZ_MASK; ++ params->in_vsize = (rsz_conf_chan->register_config.rsz_in_size ++ & ISPRSZ_IN_SIZE_VERT_MASK) ++ >> ISPRSZ_IN_SIZE_VERT_SHIFT; ++ ++ params->in_pitch = rsz_conf_chan->register_config.rsz_sdr_inoff ++ & ISPRSZ_SDR_INOFF_OFFSET_MASK; ++ ++ params->out_hsize = rsz_conf_chan->register_config.rsz_out_size ++ & ISPRSZ_OUT_SIZE_HORZ_MASK; ++ ++ params->out_vsize = (rsz_conf_chan->register_config.rsz_out_size ++ & ISPRSZ_OUT_SIZE_VERT_MASK) ++ >> ISPRSZ_OUT_SIZE_VERT_SHIFT; ++ ++ params->out_pitch = rsz_conf_chan->register_config.rsz_sdr_outoff ++ & ISPRSZ_SDR_OUTOFF_OFFSET_MASK; ++ ++ params->cbilin = (rsz_conf_chan->register_config.rsz_cnt ++ & SET_BIT_CBLIN) >> SET_BIT_CBLIN; ++ ++ params->inptyp = (rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_INPTYP_MASK) ++ >> SET_BIT_INPTYP; ++ params->horz_starting_pixel = ((rsz_conf_chan->register_config. ++ rsz_in_start ++ & ISPRSZ_IN_START_HORZ_ST_MASK)); ++ params->vert_starting_pixel = ((rsz_conf_chan->register_config. ++ rsz_in_start ++ & ISPRSZ_IN_START_VERT_ST_MASK) ++ >> ISPRSZ_IN_START_VERT_ST_SHIFT); ++ ++ params->hstph = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_HSTPH_MASK ++ >> ISPRSZ_CNT_HSTPH_SHIFT)); ++ params->vstph = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_VSTPH_MASK ++ >> ISPRSZ_CNT_VSTPH_SHIFT)); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ params->tap4filt_coeffs[2 * coeffcounter] = ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK; ++ ++ params->tap4filt_coeffs[2 * coeffcounter + 1] = ++ (rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] ++ & ISPRSZ_HFILT10_COEF1_MASK) ++ >> ISPRSZ_HFILT10_COEF1_SHIFT; ++ ++ params->tap7filt_coeffs[2 * coeffcounter] = ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK; ++ ++ params->tap7filt_coeffs[2 * coeffcounter + 1] = ++ (rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] ++ & ISPRSZ_VFILT10_COEF1_MASK) ++ >> ISPRSZ_VFILT10_COEF1_SHIFT; ++ ++ } ++ ++ params->yenh_params.type = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_ALGO_MASK) ++ >> ISPRSZ_YENH_ALGO_SHIFT; ++ ++ params->yenh_params.core = rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_CORE_MASK; ++ ++ params->yenh_params.gain = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_GAIN_MASK) ++ >> ISPRSZ_YENH_GAIN_SHIFT; ++ ++ params->yenh_params.slop = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_SLOP_MASK) ++ >> ISPRSZ_YENH_SLOP_SHIFT; ++ ++ params->pix_fmt = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_PIXFMT_MASK) ++ >> SET_BIT_YCPOS); ++ ++ if (params->pix_fmt) ++ params->pix_fmt = RSZ_PIX_FMT_UYVY; ++ else ++ params->pix_fmt = RSZ_PIX_FMT_YUYV; ++ ++ return 0; ++} ++ ++/** ++ * rsz_calculate_crop - Calculate Crop values ++ * @rsz_conf_chan: Structure containing channel configuration ++ * @cropsize: Structure containing crop parameters ++ * ++ * Calculate Crop values ++ **/ ++static void rsz_calculate_crop(struct channel_config *rsz_conf_chan, ++ struct rsz_cropsize *cropsize) ++{ ++ int luma_enable; ++ ++ cropsize->hcrop = 0; ++ cropsize->vcrop = 0; ++ ++ luma_enable = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_ALGO_MASK) ++ >> ISPRSZ_YENH_ALGO_SHIFT; ++ ++ if (luma_enable) ++ cropsize->hcrop += 2; ++} ++ ++/** ++ * rsz_vbq_release - Videobuffer queue release ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @vb: Structure containing the videobuffer used for resizer processing. ++ **/ ++static void rsz_vbq_release(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ int i; ++ struct rsz_fh *fh = q->priv_data; ++ ++ for (i = 0; i < VIDEO_MAX_FRAME; i++) { ++ struct videobuf_dmabuf *dma = NULL; ++ if (!q->bufs[i]) ++ continue; ++ if (q->bufs[i]->memory != V4L2_MEMORY_MMAP) ++ continue; ++ dma = videobuf_to_dma(q->bufs[i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ } ++ ++ ispmmu_unmap(fh->isp_addr_read); ++ ispmmu_unmap(fh->isp_addr_write); ++ fh->isp_addr_read = 0; ++ fh->isp_addr_write = 0; ++ spin_lock(&fh->vbq_lock); ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ spin_unlock(&fh->vbq_lock); ++ ++} ++ ++/** ++ * rsz_vbq_setup - Sets up the videobuffer size and validates count. ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @cnt: Number of buffers requested ++ * @size: Size in bytes of the buffer used for previewing ++ * ++ * Always returns 0. ++ **/ ++static int rsz_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, ++ unsigned int *size) ++{ ++ struct rsz_fh *fh = q->priv_data; ++ struct rsz_mult *multipass = fh->multipass; ++ u32 insize, outsize; ++ ++ spin_lock(&fh->vbq_lock); ++ if (*cnt <= 0) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ if (*cnt > VIDEO_MAX_FRAME) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ outsize = multipass->out_pitch * multipass->out_vsize; ++ insize = multipass->in_pitch * multipass->in_vsize; ++ if (*cnt == 1 && (outsize > insize)) { ++ dev_err(rsz_device, "2 buffers are required for Upscaling " ++ "mode\n"); ++ goto err_einval; ++ } ++ if (!fh->params->in_hsize || !fh->params->in_vsize) { ++ dev_err(rsz_device, "Can't setup buffer size\n"); ++ goto err_einval; ++ } else { ++ if (outsize > insize) ++ *size = outsize; ++ else ++ *size = insize; ++ ++ fh->rsz_bufsize = *size; ++ } ++ spin_unlock(&fh->vbq_lock); ++ ++ return 0; ++err_einval: ++ spin_unlock(&fh->vbq_lock); ++ return -EINVAL; ++} ++ ++/** ++ * rsz_vbq_prepare - Videobuffer is prepared and mmapped. ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @vb: Structure containing the videobuffer used for resizer processing. ++ * @field: Type of field to set in videobuffer device. ++ * ++ * Returns 0 if successful, or -EINVAL if buffer couldn't get allocated, or ++ * -EIO if the ISP MMU mapping fails ++ **/ ++static int rsz_vbq_prepare(struct videobuf_queue *q, ++ struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ struct rsz_fh *fh = q->priv_data; ++ struct channel_config *rsz_conf_chan = fh->config; ++ struct rsz_mult *multipass = fh->multipass; ++ int err = 0; ++ unsigned int isp_addr, insize, outsize; ++ struct videobuf_dmabuf *dma = videobuf_to_dma(vb); ++ ++ spin_lock(&fh->vbq_lock); ++ if (vb->baddr) { ++ vb->size = fh->rsz_bufsize; ++ vb->bsize = fh->rsz_bufsize; ++ } else { ++ spin_unlock(&fh->vbq_lock); ++ dev_err(rsz_device, "No user buffer allocated\n"); ++ goto out; ++ } ++ if (vb->i) { ++ vb->width = fh->params->out_hsize; ++ vb->height = fh->params->out_vsize; ++ } else { ++ vb->width = fh->params->in_hsize; ++ vb->height = fh->params->in_vsize; ++ } ++ ++ vb->field = field; ++ spin_unlock(&fh->vbq_lock); ++ ++ if (vb->state == VIDEOBUF_NEEDS_INIT) { ++ err = videobuf_iolock(q, vb, NULL); ++ if (!err) { ++ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ if (!isp_addr) ++ err = -EIO; ++ else { ++ if (vb->i) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = isp_addr; ++ fh->isp_addr_write = isp_addr; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_sdr_inadd ++ = isp_addr; ++ rsz_conf_chan->input_buf_index = vb->i; ++ outsize = multipass->out_pitch * ++ multipass->out_vsize; ++ insize = multipass->in_pitch * ++ multipass->in_vsize; ++ if (outsize < insize) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = isp_addr; ++ rsz_conf_chan-> ++ output_buf_index = ++ vb->i; ++ } ++ ++ fh->isp_addr_read = isp_addr; ++ } ++ } ++ } ++ ++ } ++ ++ if (!err) { ++ spin_lock(&fh->vbq_lock); ++ vb->state = VIDEOBUF_PREPARED; ++ spin_unlock(&fh->vbq_lock); ++ flush_cache_user_range(NULL, vb->baddr, (vb->baddr ++ + vb->bsize)); ++ } else ++ rsz_vbq_release(q, vb); ++ ++out: ++ return err; ++} ++ ++static void rsz_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) ++{ ++ return; ++} ++ ++/** ++ * rsz_open - Initializes and opens the Resizer Wrapper ++ * @inode: Inode structure associated with the Resizer Wrapper ++ * @filp: File structure associated with the Resizer Wrapper ++ * ++ * Returns 0 if successful, -EBUSY if its already opened or the ISP module is ++ * not available, or -ENOMEM if its unable to allocate the device in kernel ++ * space memory. ++ **/ ++static int rsz_open(struct inode *inode, struct file *filp) ++{ ++ int ret = 0; ++ struct channel_config *rsz_conf_chan; ++ struct rsz_fh *fh; ++ struct device_params *device = device_config; ++ struct rsz_params *params; ++ struct rsz_mult *multipass; ++ ++ if ((filp->f_flags & O_NONBLOCK) == O_NONBLOCK) { ++ printk(KERN_DEBUG "omap-resizer: Device is opened in " ++ "non blocking mode\n"); ++ } else { ++ printk(KERN_DEBUG "omap-resizer: Device is opened in blocking " ++ "mode\n"); ++ } ++ fh = kzalloc(sizeof(struct rsz_fh), GFP_KERNEL); ++ if (NULL == fh) ++ return -ENOMEM; ++ ++ isp_get(); ++ ++ rsz_conf_chan = kzalloc(sizeof(struct channel_config), GFP_KERNEL); ++ if (rsz_conf_chan == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to config"); ++ ret = -ENOMEM; ++ goto err_enomem0; ++ } ++ params = kzalloc(sizeof(struct rsz_params), GFP_KERNEL); ++ if (params == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to params"); ++ ret = -ENOMEM; ++ goto err_enomem1; ++ } ++ multipass = kzalloc(sizeof(struct rsz_mult), GFP_KERNEL); ++ if (multipass == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to multipass"); ++ ret = -ENOMEM; ++ goto err_enomem2; ++ } ++ ++ fh->multipass = multipass; ++ fh->params = params; ++ fh->config = rsz_conf_chan; ++ ++ if (mutex_lock_interruptible(&device->reszwrap_mutex)) { ++ ret = -EINTR; ++ goto err_enomem2; ++ } ++ device->opened++; ++ mutex_unlock(&device->reszwrap_mutex); ++ ++ rsz_conf_chan->config_state = STATE_NOT_CONFIGURED; ++ rsz_conf_chan->status = CHANNEL_FREE; ++ ++ filp->private_data = fh; ++ fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ fh->device = device; ++ ++ videobuf_queue_sg_init(&fh->vbq, &device->vbq_ops, NULL, ++ &fh->vbq_lock, fh->type, ++ V4L2_FIELD_NONE, ++ sizeof(struct videobuf_buffer), fh); ++ ++ spin_lock_init(&fh->vbq_lock); ++ mutex_init(&rsz_conf_chan->chanprotection_mutex); ++ ++ return 0; ++err_enomem2: ++ kfree(params); ++err_enomem1: ++ kfree(rsz_conf_chan); ++err_enomem0: ++ kfree(fh); ++ return ret; ++} ++ ++/** ++ * rsz_release - Releases Resizer Wrapper and frees up allocated memory ++ * @inode: Inode structure associated with the Resizer Wrapper ++ * @filp: File structure associated with the Resizer Wrapper ++ * ++ * Returns 0 if successful, or -EBUSY if channel is being used. ++ **/ ++static int rsz_release(struct inode *inode, struct file *filp) ++{ ++ u32 timeout = 0; ++ struct rsz_fh *fh = filp->private_data; ++ struct channel_config *rsz_conf_chan = fh->config; ++ struct rsz_params *params = fh->params; ++ struct rsz_mult *multipass = fh->multipass; ++ struct videobuf_queue *q = &fh->vbq; ++ ++ while ((rsz_conf_chan->status != CHANNEL_FREE) && (timeout < 20)) { ++ timeout++; ++ schedule(); ++ } ++ if (mutex_lock_interruptible(&device_config->reszwrap_mutex)) ++ return -EINTR; ++ device_config->opened--; ++ mutex_unlock(&device_config->reszwrap_mutex); ++ /* This will Free memory allocated to the buffers, ++ * and flushes the queue ++ */ ++ videobuf_queue_cancel(q); ++ fh->params = NULL; ++ fh->config = NULL; ++ ++ fh->rsz_bufsize = 0; ++ filp->private_data = NULL; ++ ++ kfree(rsz_conf_chan); ++ kfree(params); ++ kfree(multipass); ++ kfree(fh); ++ ++ isp_put(); ++ ++ return 0; ++} ++ ++/** ++ * rsz_mmap - Memory maps the Resizer Wrapper module. ++ * @file: File structure associated with the Resizer Wrapper ++ * @vma: Virtual memory area structure. ++ * ++ * Returns 0 if successful, or returned value by the videobuf_mmap_mapper() ++ * function. ++ **/ ++static int rsz_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ struct rsz_fh *fh = file->private_data; ++ ++ return videobuf_mmap_mapper(&fh->vbq, vma); ++} ++ ++/** ++ * rsz_ioctl - I/O control function for Resizer Wrapper ++ * @inode: Inode structure associated with the Resizer Wrapper. ++ * @file: File structure associated with the Resizer Wrapper. ++ * @cmd: Type of command to execute. ++ * @arg: Argument to send to requested command. ++ * ++ * Returns 0 if successful, -EBUSY if channel is being used, -1 if bad command ++ * passed or access is denied, -EFAULT if copy_from_user() or copy_to_user() ++ * fails, -EINVAL if parameter validation fails or parameter structure is not ++ * present. ++ **/ ++static long rsz_unlocked_ioctl(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ int ret = 0; ++ struct rsz_fh *fh = file->private_data; ++ struct device_params *device = fh->device; ++ struct channel_config *rsz_conf_chan = fh->config; ++ ++ if ((_IOC_TYPE(cmd) != RSZ_IOC_BASE) ++ || (_IOC_NR(cmd) > RSZ_IOC_MAXNR)) { ++ dev_err(rsz_device, "Bad command value \n"); ++ return -1; ++ } ++ ++ if (_IOC_DIR(cmd) & _IOC_READ) ++ ret = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); ++ else if (_IOC_DIR(cmd) & _IOC_WRITE) ++ ret = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); ++ ++ if (ret) { ++ dev_err(rsz_device, "Access denied\n"); ++ return -1; ++ } ++ ++ switch (cmd) { ++ case RSZ_REQBUF: ++ { ++ struct v4l2_requestbuffers req_buf; ++ if (copy_from_user(&req_buf, (struct v4l2_requestbuffers *)arg, ++ sizeof(struct v4l2_requestbuffers))) { ++ return -EFAULT; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan-> ++ chanprotection_mutex)) ++ return -EINTR; ++ ret = videobuf_reqbufs(&fh->vbq, (void *)&req_buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ } ++ case RSZ_QUERYBUF: ++ { ++ struct v4l2_buffer buf; ++ if (copy_from_user(&buf, (struct v4l2_buffer *)arg, ++ sizeof(struct v4l2_buffer))) { ++ return -EFAULT; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan-> ++ chanprotection_mutex)) ++ return -EINTR; ++ ret = videobuf_querybuf(&fh->vbq, (void *)&buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ if (copy_to_user((struct v4l2_buffer *)arg, &buf, ++ sizeof(struct v4l2_buffer))) ++ return -EFAULT; ++ break; ++ } ++ case RSZ_QUEUEBUF: ++ { ++ struct v4l2_buffer buf; ++ if (copy_from_user(&buf, (struct v4l2_buffer *)arg, ++ sizeof(struct v4l2_buffer))) { ++ return -EFAULT; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan-> ++ chanprotection_mutex)) ++ return -EINTR; ++ ret = videobuf_qbuf(&fh->vbq, (void *)&buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ } ++ case RSZ_S_PARAM: ++ { ++ struct rsz_params *params = fh->params; ++ if (copy_from_user(params, (struct rsz_params *)arg, ++ sizeof(struct rsz_params))) { ++ return -EFAULT; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan-> ++ chanprotection_mutex)) ++ return -EINTR; ++ ret = rsz_set_params(fh->multipass, params, rsz_conf_chan); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ } ++ case RSZ_G_PARAM: ++ ret = rsz_get_params((struct rsz_params *)arg, rsz_conf_chan); ++ break; ++ ++ case RSZ_G_STATUS: ++ { ++ struct rsz_status *status; ++ status = (struct rsz_status *)arg; ++ status->chan_busy = rsz_conf_chan->status; ++ status->hw_busy = ispresizer_busy(); ++ status->src = INPUT_RAM; ++ break; ++ } ++ case RSZ_RESIZE: ++ if (file->f_flags & O_NONBLOCK) { ++ if (ispresizer_busy()) ++ return -EBUSY; ++ else { ++ if (!mutex_trylock(&device->reszwrap_mutex)) ++ return -EBUSY; ++ } ++ } else { ++ if (mutex_lock_interruptible(&device->reszwrap_mutex)) ++ return -EINTR; ++ } ++ ret = rsz_start((int *)arg, fh); ++ mutex_unlock(&device->reszwrap_mutex); ++ break; ++ case RSZ_GET_CROPSIZE: ++ rsz_calculate_crop(rsz_conf_chan, (struct rsz_cropsize *)arg); ++ break; ++ ++ default: ++ dev_err(rsz_device, "resizer_ioctl: Invalid Command Value"); ++ return -EINVAL; ++ } ++ ++ return (long)ret; ++} ++ ++static struct file_operations rsz_fops = { ++ .owner = THIS_MODULE, ++ .open = rsz_open, ++ .release = rsz_release, ++ .mmap = rsz_mmap, ++ .unlocked_ioctl = rsz_unlocked_ioctl, ++}; ++ ++/** ++ * rsz_isr - Interrupt Service Routine for Resizer wrapper ++ * @status: ISP IRQ0STATUS register value ++ * @arg1: Currently not used ++ * @arg2: Currently not used ++ * ++ * Interrupt Service Routine for Resizer wrapper ++ **/ ++static void rsz_isr(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2) ++{ ++ ++ if ((status & RESZ_DONE) != RESZ_DONE) ++ return; ++ ++ complete(&(device_config->compl_isr)); ++ ++} ++ ++/** ++ * resizer_platform_release - Acts when Reference count is zero ++ * @device: Structure containing ISP resizer wrapper global information ++ * ++ * This is called when the reference count goes to zero. ++ **/ ++static void resizer_platform_release(struct device *device) ++{ ++} ++ ++/** ++ * resizer_probe - Checks for device presence ++ * @device: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int __init resizer_probe(struct platform_device *device) ++{ ++ return 0; ++} ++ ++/** ++ * resizer_remove - Handles the removal of the driver ++ * @omap_resizer_device: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int resizer_remove(struct platform_device *omap_resizer_device) ++{ ++ return 0; ++} ++ ++static struct class *rsz_class; ++static struct cdev c_dev; ++static dev_t dev; ++static struct platform_device omap_resizer_device = { ++ .name = OMAP_REZR_NAME, ++ .id = 2, ++ .dev = { ++ .release = resizer_platform_release,} ++}; ++ ++static struct platform_driver omap_resizer_driver = { ++ .probe = resizer_probe, ++ .remove = resizer_remove, ++ .driver = { ++ .bus = &platform_bus_type, ++ .name = OMAP_REZR_NAME, ++ }, ++}; ++ ++/** ++ * omap_rsz_init - Initialization of Resizer Wrapper ++ * ++ * Returns 0 if successful, -ENOMEM if could not allocate memory, -ENODEV if ++ * could not register the wrapper as a character device, or other errors if the ++ * device or driver can't register. ++ **/ ++static int __init omap_rsz_init(void) ++{ ++ int ret = 0; ++ struct device_params *device; ++ device = kzalloc(sizeof(struct device_params), GFP_KERNEL); ++ if (!device) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": could not allocate " ++ "memory\n"); ++ return -ENOMEM; ++ } ++ ++ ret = alloc_chrdev_region(&dev, 0, 1, OMAP_REZR_NAME); ++ if (ret < 0) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": intialization failed. " ++ "Could not allocate region " ++ "for character device\n"); ++ kfree(device); ++ return -ENODEV; ++ } ++ ++ /* Register the driver in the kernel */ ++ /* Initialize of character device */ ++ cdev_init(&c_dev, &rsz_fops); ++ c_dev.owner = THIS_MODULE; ++ c_dev.ops = &rsz_fops; ++ ++ /* Addding character device */ ++ ret = cdev_add(&c_dev, dev, 1); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": Error adding " ++ "device - %d\n", ret); ++ goto fail2; ++ } ++ rsz_major = MAJOR(dev); ++ ++ /* register driver as a platform driver */ ++ ret = platform_driver_register(&omap_resizer_driver); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": Failed to register platform driver!\n"); ++ goto fail3; ++ } ++ ++ /* Register the drive as a platform device */ ++ ret = platform_device_register(&omap_resizer_device); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": Failed to register platform device!\n"); ++ goto fail4; ++ } ++ ++ rsz_class = class_create(THIS_MODULE, OMAP_REZR_NAME); ++ if (!rsz_class) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": Failed to create class!\n"); ++ goto fail5; ++ } ++ ++ /* make entry in the devfs */ ++ rsz_device = device_create(rsz_class, rsz_device, ++ MKDEV(rsz_major, 0), NULL, ++ OMAP_REZR_NAME); ++ dev_dbg(rsz_device, OMAP_REZR_NAME ": Registered Resizer Wrapper\n"); ++ device->opened = 0; ++ ++ device->vbq_ops.buf_setup = rsz_vbq_setup; ++ device->vbq_ops.buf_prepare = rsz_vbq_prepare; ++ device->vbq_ops.buf_release = rsz_vbq_release; ++ device->vbq_ops.buf_queue = rsz_vbq_queue; ++ init_completion(&device->compl_isr); ++ mutex_init(&device->reszwrap_mutex); ++ ++ device_config = device; ++ return 0; ++ ++fail5: ++ platform_device_unregister(&omap_resizer_device); ++fail4: ++ platform_driver_unregister(&omap_resizer_driver); ++fail3: ++ cdev_del(&c_dev); ++fail2: ++ unregister_chrdev_region(dev, 1); ++ kfree(device); ++ return ret; ++} ++ ++/** ++ * omap_rsz_exit - Close of Resizer Wrapper ++ **/ ++void __exit omap_rsz_exit(void) ++{ ++ device_destroy(rsz_class, dev); ++ class_destroy(rsz_class); ++ platform_device_unregister(&omap_resizer_device); ++ platform_driver_unregister(&omap_resizer_driver); ++ cdev_del(&c_dev); ++ unregister_chrdev_region(dev, 1); ++ kfree(device_config); ++} ++ ++module_init(omap_rsz_init) ++module_exit(omap_rsz_exit) ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("OMAP ISP Resizer"); ++MODULE_LICENSE("GPL"); +diff --git a/include/linux/omap_resizer.h b/include/linux/omap_resizer.h +new file mode 100644 +index 0000000..5ac0c88 +--- /dev/null ++++ b/include/linux/omap_resizer.h +@@ -0,0 +1,136 @@ ++/* ++ * drivers/media/video/isp/omap_resizer.h ++ * ++ * Include file for Resizer module wrapper in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_RESIZER_H ++#define OMAP_RESIZER_H ++ ++#include ++ ++/* ioctls definition */ ++#define RSZ_IOC_BASE 'R' ++#define RSZ_IOC_MAXNR 8 ++ ++/*Ioctl options which are to be passed while calling the ioctl*/ ++#define RSZ_REQBUF _IOWR(RSZ_IOC_BASE, 1,\ ++ struct v4l2_requestbuffers) ++#define RSZ_QUERYBUF _IOWR(RSZ_IOC_BASE, 2, struct v4l2_buffer) ++#define RSZ_S_PARAM _IOWR(RSZ_IOC_BASE, 3, struct rsz_params) ++#define RSZ_G_PARAM _IOWR(RSZ_IOC_BASE, 4, struct rsz_params) ++#define RSZ_RESIZE _IOWR(RSZ_IOC_BASE, 5, __s32) ++#define RSZ_G_STATUS _IOWR(RSZ_IOC_BASE, 6, struct rsz_status) ++#define RSZ_QUEUEBUF _IOWR(RSZ_IOC_BASE, 7, struct v4l2_buffer) ++#define RSZ_GET_CROPSIZE _IOWR(RSZ_IOC_BASE, 8, struct rsz_cropsize) ++ ++#define RSZ_INTYPE_YCBCR422_16BIT 0 ++#define RSZ_INTYPE_PLANAR_8BIT 1 ++#define RSZ_PIX_FMT_UYVY 1 /* cb:y:cr:y */ ++#define RSZ_PIX_FMT_YUYV 0 /* y:cb:y:cr */ ++ ++enum config_done { ++ STATE_CONFIGURED, /* Resizer driver configured ++ * by application. ++ */ ++ STATE_NOT_CONFIGURED /* Resizer driver not ++ * configured by application. ++ */ ++}; ++ ++/* Structure Definitions */ ++ ++/* used to luma enhancement options */ ++ ++struct rsz_yenh { ++ __s32 type; /* represents luma enable or ++ * disable. ++ */ ++ __u8 gain; /* represents gain. */ ++ __u8 slop; /* represents slop. */ ++ __u8 core; /* Represents core value. */ ++}; ++ ++/* Conatins all the parameters for resizing. This structure ++ * is used to configure resiser parameters ++ */ ++struct rsz_params { ++ __s32 in_hsize; /* input frame horizontal ++ * size. ++ */ ++ __s32 in_vsize; /* input frame vertical size */ ++ __s32 in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ __s32 inptyp; /* for determining 16 bit or ++ * 8 bit data. ++ */ ++ __s32 vert_starting_pixel; /* for specifying vertical ++ * starting pixel in input. ++ */ ++ __s32 horz_starting_pixel; /* for specyfing horizontal ++ * starting pixel in input. ++ */ ++ __s32 cbilin; /* # defined, filter with luma ++ * or bi-linear interpolation. ++ */ ++ __s32 pix_fmt; /* # defined, UYVY or YUYV */ ++ __s32 out_hsize; /* output frame horizontal ++ * size. ++ */ ++ __s32 out_vsize; /* output frame vertical ++ * size. ++ */ ++ __s32 out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ __s32 hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ __s32 vstph; /* for specifying vertical ++ * starting phase. ++ */ ++ __u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ __u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++ struct rsz_yenh yenh_params; ++}; ++ ++/* Contains the status of hardware and channel */ ++struct rsz_status { ++ __s32 chan_busy; /* 1: channel is busy, ++ * 0: channel is not busy ++ */ ++ __s32 hw_busy; /* 1: hardware is busy, ++ * 0: hardware is not busy ++ */ ++ __s32 src; /* # defined, can be either ++ * SD-RAM or CCDC/PREVIEWER ++ */ ++}; ++ ++/* Passed by application for getting crop size */ ++struct rsz_cropsize { ++ __u32 hcrop; /* Number of pixels per line ++ * cropped in output image. ++ */ ++ ++ __u32 vcrop; /* Number of lines cropped ++ * in output image. ++ */ ++}; ++ ++#endif +-- +1.6.0.3 + +--- /tmp/Kconfig 2009-04-06 10:56:27.000000000 +0200 ++++ git/drivers/media/video/Kconfig 2009-04-06 10:57:25.000000000 +0200 +@@ -711,6 +711,9 @@ + CMOS camera controller. This is the controller found on first- + generation OLPC systems. + ++ ++source "drivers/media/video/isp/Kconfig" ++ + config VIDEO_OMAP3 + tristate "OMAP 3 Camera support" + select VIDEOBUF_GEN diff --git a/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch b/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch new file mode 100644 index 0000000000..e14da9986a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch @@ -0,0 +1,730 @@ +From 20d79137ecaa6c7dad007d9ea1d7be5550db4839 Mon Sep 17 00:00:00 2001 +From: Vaibhav Hiremath +Date: Fri, 13 Feb 2009 15:40:25 +0530 +Subject: [PATCH 2/2] Resizer bug fixes on top of 1.0.2 release + +This commit contains resizer bug fixes on top of + PSP1.0.2 release - + - 4096 aligned address constraint + - workaround for extra page allocation for page aligned + size buffers + +Signed-off-by: Vaibhav Hiremath +--- + drivers/media/video/isp/omap_resizer.c | 417 ++++++++++++++++++++++++-------- + include/linux/omap_resizer.h | 3 +- + 2 files changed, 321 insertions(+), 99 deletions(-) + +diff --git a/drivers/media/video/isp/omap_resizer.c b/drivers/media/video/isp/omap_resizer.c +index 54bc425..8059c70 100644 +--- a/drivers/media/video/isp/omap_resizer.c ++++ b/drivers/media/video/isp/omap_resizer.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -76,6 +77,10 @@ + #define MAX_COEF_COUNTER 16 + #define COEFF_ADDRESS_OFFSET 0x04 + ++#define RSZ_DEF_REQ_EXP 0xE /* Default read operation expand ++ * for the Resizer driver; value ++ * taken from Davinci. ++ */ + /* Global structure which contains information about number of channels + and protection variables */ + struct device_params { +@@ -85,6 +90,7 @@ struct device_params { + struct mutex reszwrap_mutex; /* Semaphore for array */ + + struct videobuf_queue_ops vbq_ops; /* videobuf queue operations */ ++ unsigned long extra_page_addr; + }; + + /* Register mapped structure which contains the every register +@@ -126,6 +132,9 @@ struct resizer_config { + u32 rsz_yehn; /* yehn(luma)register mapping + * variable. + */ ++ u32 sdr_req_exp; /* Configuration for Non ++ * real time read expand ++ */ + }; + + struct rsz_mult { +@@ -179,6 +188,7 @@ struct channel_config { + * channel is busy or not + */ + struct mutex chanprotection_mutex; ++ int buf_address[VIDEO_MAX_FRAME]; + enum config_done config_state; + u8 input_buf_index; + u8 output_buf_index; +@@ -200,8 +210,6 @@ struct rsz_fh { + struct videobuf_queue vbq; + struct device_params *device; + +- dma_addr_t isp_addr_read; /* Input/Output address */ +- dma_addr_t isp_addr_write; /* Input/Output address */ + u32 rsz_bufsize; /* channel specific buffersize + */ + }; +@@ -227,6 +235,10 @@ static int rsz_set_ratio(struct rsz_mult *multipass, + static void rsz_config_ratio(struct rsz_mult *multipass, + struct channel_config *rsz_conf_chan); + ++static void inline rsz_set_exp(unsigned int exp) ++{ ++ omap_writel(((exp & 0x3FF) << 10), OMAP3ISP_SBL_REG(0xF8)); ++} + /** + * rsz_hardware_setup - Sets hardware configuration registers + * @rsz_conf_chan: Structure containing channel configuration +@@ -271,12 +283,15 @@ static void rsz_hardware_setup(struct channel_config *rsz_conf_chan) + + coeffoffset)); + coeffoffset = coeffoffset + COEFF_ADDRESS_OFFSET; + } ++ /* Configure the read expand register */ ++ rsz_set_exp(rsz_conf_chan->register_config.sdr_req_exp); + } + + /** + * rsz_start - Enables Resizer Wrapper + * @arg: Currently not used. +- * @device: Structure containing ISP resizer wrapper global information ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. + * + * Submits a resizing task specified by the rsz_resize structure. The call can + * either be blocked until the task is completed or returned immediately based +@@ -292,12 +307,18 @@ int rsz_start(int *arg, struct rsz_fh *fh) + struct channel_config *rsz_conf_chan = fh->config; + struct rsz_mult *multipass = fh->multipass; + struct videobuf_queue *q = &fh->vbq; ++ struct videobuf_buffer *buf; + int ret; + + if (rsz_conf_chan->config_state) { + dev_err(rsz_device, "State not configured \n"); + goto err_einval; + } ++ if (!rsz_conf_chan->register_config.rsz_sdr_inadd || ++ !rsz_conf_chan->register_config.rsz_sdr_outadd) { ++ dev_err(rsz_device, "address is null\n"); ++ goto err_einval; ++ } + + rsz_conf_chan->status = CHANNEL_BUSY; + +@@ -325,33 +346,22 @@ mult: + goto mult; + } + +- if (fh->isp_addr_read) { +- ispmmu_unmap(fh->isp_addr_read); +- fh->isp_addr_read = 0; +- } +- if (fh->isp_addr_write) { +- ispmmu_unmap(fh->isp_addr_write); +- fh->isp_addr_write = 0; +- } +- + rsz_conf_chan->status = CHANNEL_FREE; +- q->bufs[rsz_conf_chan->input_buf_index]->state = VIDEOBUF_NEEDS_INIT; +- q->bufs[rsz_conf_chan->output_buf_index]->state = VIDEOBUF_NEEDS_INIT; + rsz_conf_chan->register_config.rsz_sdr_outadd = 0; + rsz_conf_chan->register_config.rsz_sdr_inadd = 0; + +- /* Unmap and free the DMA memory allocated for buffers */ +- videobuf_dma_unmap(q, videobuf_to_dma( +- q->bufs[rsz_conf_chan->input_buf_index])); +- videobuf_dma_unmap(q, videobuf_to_dma( +- q->bufs[rsz_conf_chan->output_buf_index])); +- videobuf_dma_free(videobuf_to_dma( +- q->bufs[rsz_conf_chan->input_buf_index])); +- videobuf_dma_free(videobuf_to_dma( +- q->bufs[rsz_conf_chan->output_buf_index])); +- + isp_unset_callback(CBK_RESZ_DONE); + ++ /* Empty the Videobuf queue which was filled during the qbuf */ ++ buf = q->bufs[rsz_conf_chan->input_buf_index]; ++ buf->state = VIDEOBUF_IDLE; ++ list_del(&buf->stream); ++ if (rsz_conf_chan->input_buf_index != rsz_conf_chan->output_buf_index) { ++ buf = q->bufs[rsz_conf_chan->output_buf_index]; ++ buf->state = VIDEOBUF_IDLE; ++ list_del(&buf->stream); ++ } ++ + return 0; + err_einval: + return -EINVAL; +@@ -359,6 +369,8 @@ err_einval: + + /** + * rsz_set_multipass - Set resizer multipass ++ * @multipass: Structure containing channel configuration ++ for multipass support + * @rsz_conf_chan: Structure containing channel configuration + * + * Returns always 0 +@@ -384,6 +396,8 @@ static int rsz_set_multipass(struct rsz_mult *multipass, + + /** + * rsz_copy_data - Copy data ++ * @multipass: Structure containing channel configuration ++ for multipass support + * @params: Structure containing the Resizer Wrapper parameters + * + * Copy data +@@ -413,6 +427,8 @@ static void rsz_copy_data(struct rsz_mult *multipass, struct rsz_params *params) + + /** + * rsz_set_params - Set parameters for resizer wrapper ++ * @multipass: Structure containing channel configuration ++ for multipass support + * @params: Structure containing the Resizer Wrapper parameters + * @rsz_conf_chan: Structure containing channel configuration + * +@@ -524,6 +540,8 @@ static int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *params, + } + + rsz_config_ratio(multipass, rsz_conf_chan); ++ /* Default value for read expand:Taken from Davinci */ ++ rsz_conf_chan->register_config.sdr_req_exp = RSZ_DEF_REQ_EXP; + + rsz_conf_chan->config_state = STATE_CONFIGURED; + +@@ -534,6 +552,8 @@ err_einval: + + /** + * rsz_set_ratio - Set ratio ++ * @multipass: Structure containing channel configuration ++ for multipass support + * @rsz_conf_chan: Structure containing channel configuration + * + * Returns 0 if successful, -EINVAL if invalid output size, upscaling ratio is +@@ -548,7 +568,8 @@ static int rsz_set_ratio(struct rsz_mult *multipass, + + if ((multipass->out_hsize > MAX_IMAGE_WIDTH) || + (multipass->out_vsize > MAX_IMAGE_WIDTH)) { +- dev_err(rsz_device, "Invalid output size!"); ++ dev_err(rsz_device, "Invalid output size! - %d", \ ++ multipass->out_hsize); + goto err_einval; + } + if (multipass->cbilin) { +@@ -758,6 +779,8 @@ err_einval: + + /** + * rsz_config_ratio - Configure ratio ++ * @multipass: Structure containing channel configuration ++ for multipass support + * @rsz_conf_chan: Structure containing channel configuration + * + * Configure ratio +@@ -789,6 +812,20 @@ static void rsz_config_ratio(struct rsz_mult *multipass, + ((vsize << ISPRSZ_IN_SIZE_VERT_SHIFT) + & ISPRSZ_IN_SIZE_VERT_MASK); + ++ /* This is another workaround for the ISP-MMU translation fault. ++ For the parameters whose image size comes exactly to PAGE_SIZE ++ generates ISP-MMU translation fault. The root-cause is the equation ++ input width = (32*sph + (ow - 1)*hrsz + 16) >> 8 + 7 ++ = (64*sph + (ow - 1)*hrsz + 32) >> 8 + 7 ++ input height = (32*spv + (oh - 1)*vrsz + 16) >> 8 + 4 ++ = (64*spv + (oh - 1)*vrsz + 32) >> 8 + 7 ++ ++ we are adjusting the input width to suit for Resizer module, ++ application should use this configuration henceforth. ++ */ ++ multipass->in_hsize = hsize; ++ multipass->in_vsize = vsize; ++ + for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; + coeffcounter++) { + if (multipass->num_htap) { +@@ -990,24 +1027,15 @@ static void rsz_calculate_crop(struct channel_config *rsz_conf_chan, + static void rsz_vbq_release(struct videobuf_queue *q, + struct videobuf_buffer *vb) + { +- int i; + struct rsz_fh *fh = q->priv_data; ++ struct videobuf_dmabuf *dma = NULL; + +- for (i = 0; i < VIDEO_MAX_FRAME; i++) { +- struct videobuf_dmabuf *dma = NULL; +- if (!q->bufs[i]) +- continue; +- if (q->bufs[i]->memory != V4L2_MEMORY_MMAP) +- continue; +- dma = videobuf_to_dma(q->bufs[i]); +- videobuf_dma_unmap(q, dma); +- videobuf_dma_free(dma); +- } ++ dma = videobuf_to_dma(q->bufs[vb->i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ ispmmu_unmap(fh->config->buf_address[vb->i]); ++ fh->config->buf_address[vb->i] = 0; + +- ispmmu_unmap(fh->isp_addr_read); +- ispmmu_unmap(fh->isp_addr_write); +- fh->isp_addr_read = 0; +- fh->isp_addr_write = 0; + spin_lock(&fh->vbq_lock); + vb->state = VIDEOBUF_NEEDS_INIT; + spin_unlock(&fh->vbq_lock); +@@ -1062,7 +1090,105 @@ err_einval: + spin_unlock(&fh->vbq_lock); + return -EINVAL; + } ++/* ++ * This function is work around for the videobuf_iolock API, ++ * for User memory allocated with ioremap (VM_IO flag) the API ++ * get_user_pages fails. ++ * ++ * To fulfill this requirement, we have completely ignored VM layer of ++ * Linux, and configuring the ISP MMU with physical address. ++ */ ++static int omap_videobuf_dma_init_user(struct videobuf_buffer *vb, ++ unsigned long physp, unsigned long asize) ++{ ++ struct videobuf_dmabuf *dma; ++ struct scatterlist *sglist; ++ unsigned long data, first, last; ++ int len, i = 0; ++ ++ dma = videobuf_to_dma(vb); ++ data = vb->baddr; ++ ++ first = (data & PAGE_MASK) >> PAGE_SHIFT; ++ last = ((data+asize-1) & PAGE_MASK) >> PAGE_SHIFT; ++ dma->offset = data & ~PAGE_MASK; ++ dma->nr_pages = last-first+1; ++ ++ dma->direction = PCI_DMA_FROMDEVICE; ++ /* ++ * Allocate array of sglen + 1, to add entry of extra page ++ * for input buffer. Driver always uses 0th buffer as input buffer. ++ */ ++ len = dma->nr_pages + (vb->i ? 0 : 1); ++ sglist = kcalloc(len, sizeof(*sglist), GFP_KERNEL); ++ if (NULL == sglist) ++ return -ENOMEM; ++ ++ sglist[0].offset = 0; ++ sglist[0].length = PAGE_SIZE - dma->offset; ++ sglist[0].dma_address = (dma_addr_t)physp; ++ physp += sglist[0].length; ++ /* ++ * Iterate in a loop for the number of pages ++ */ ++ for (i = 1; i < (len - (vb->i ? 0 : 1)); i++) { ++ sglist[i].offset = 0; ++ sglist[i].length = PAGE_SIZE; ++ sglist[i].dma_address = (dma_addr_t)physp; ++ physp += PAGE_SIZE; ++ } ++ if (0 == vb->i) { ++ sglist[i].offset = 0; ++ sglist[i].length = PAGE_SIZE; ++ sglist[i].dma_address = ++ (dma_addr_t)device_config->extra_page_addr; ++ } ++ dma->sglist = sglist; ++ dma->sglen = len; ++ return 0; ++ ++ } ++/* ++ * This function is workaround for the issue, where ISP-MMU generated ++ * translation fault for specific params whose size is aligned to PAGE_SIZE. ++ ++ * As a workaround we are padding one extra page for input buffer. This page ++ * we are allocating during init time and will not be released through-out ++ * life time of resizer driver. Please note that Resizer module only reads ++ * from this extra page. ++ */ ++int omap_create_sg(struct videobuf_queue *q, struct videobuf_dmabuf *dma) ++{ ++ struct scatterlist *sglist; ++ int sglen; + ++ sglen = dma->sglen; ++ sglist = kcalloc(sglen + 1, sizeof(*sglist), GFP_KERNEL); ++ if (NULL == sglist) ++ return -ENOMEM; ++ /* ++ * Copy the sglist locally ++ */ ++ memcpy(sglist, dma->sglist, sglen * sizeof(*sglist)); ++ /* ++ * Release the old sglist, since we already copied it locally ++ */ ++ videobuf_dma_unmap(q, dma); ++ /* ++ * Add extra entry to sglist to work with specific params, whose ++ * buffer address alined to PAGE_SIZE. ++ */ ++ sglist[sglen].offset = 0; ++ sglist[sglen].length = PAGE_SIZE; ++ sglist[sglen].dma_address = (dma_addr_t)device_config->extra_page_addr; ++ sglen++; ++ /* ++ * Save the sglist for mapping to ISP-MMU space ++ */ ++ dma->sglist = sglist; ++ dma->sglen = sglen; ++ return 0; ++} + /** + * rsz_vbq_prepare - Videobuffer is prepared and mmapped. + * @q: Structure containing the videobuffer queue file handle, and device +@@ -1079,19 +1205,24 @@ static int rsz_vbq_prepare(struct videobuf_queue *q, + { + struct rsz_fh *fh = q->priv_data; + struct channel_config *rsz_conf_chan = fh->config; +- struct rsz_mult *multipass = fh->multipass; + int err = 0; + unsigned int isp_addr, insize, outsize; +- struct videobuf_dmabuf *dma = videobuf_to_dma(vb); +- ++ struct rsz_mult *multipass = fh->multipass; + spin_lock(&fh->vbq_lock); + if (vb->baddr) { ++ /* Check for 32 byte alignement */ ++ if (vb->baddr != (vb->baddr & ~0x1F)) { ++ spin_unlock(&fh->vbq_lock); ++ dev_err(rsz_device, "Buffer address should be aligned \ ++ to 32 byte\n"); ++ return -EINVAL; ++ } + vb->size = fh->rsz_bufsize; + vb->bsize = fh->rsz_bufsize; + } else { + spin_unlock(&fh->vbq_lock); + dev_err(rsz_device, "No user buffer allocated\n"); +- goto out; ++ return -EINVAL; + } + if (vb->i) { + vb->width = fh->params->out_hsize; +@@ -1103,55 +1234,128 @@ static int rsz_vbq_prepare(struct videobuf_queue *q, + + vb->field = field; + spin_unlock(&fh->vbq_lock); ++ /* ++ * Calculate input and output sizes, will be used while mapping ++ * user pages ++ */ ++ outsize = multipass->out_pitch * multipass->out_vsize; ++ insize = multipass->in_pitch * multipass->in_vsize; + + if (vb->state == VIDEOBUF_NEEDS_INIT) { +- err = videobuf_iolock(q, vb, NULL); +- if (!err) { +- isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); +- if (!isp_addr) +- err = -EIO; +- else { +- if (vb->i) { +- rsz_conf_chan->register_config. +- rsz_sdr_outadd +- = isp_addr; +- fh->isp_addr_write = isp_addr; +- rsz_conf_chan->output_buf_index = vb->i; +- } else { ++ struct videobuf_dmabuf *dma; ++ struct vm_area_struct *vma; ++ spin_lock(&fh->vbq_lock); ++ dma = videobuf_to_dma(vb); ++ vma = find_vma(current->mm, vb->baddr); ++ if ((vma) && (vma->vm_flags & VM_IO) && (vma->vm_pgoff)) { ++ /* This will catch ioremaped buffers to the kernel. ++ * It gives two possible scenarios - ++ * - Driver allocates buffer using either ++ * dma_alloc_coherent or get_free_pages, ++ * and maps to user space using ++ * io_remap_pfn_range/remap_pfn_range ++ * - Drivers maps memory outside from Linux using ++ * io_remap ++ */ ++ unsigned long physp = 0, asize; ++ asize = vb->i ? outsize : insize; ++ if ((vb->baddr + asize) > vma->vm_end) { ++ spin_unlock(&fh->vbq_lock); ++ dev_err(rsz_device, "User Buffer Allocation:" \ ++ "err=%lu[%lu]\n",\ ++ (vma->vm_end - vb->baddr), asize); ++ return -ENOMEM; ++ } ++ physp = (vma->vm_pgoff << PAGE_SHIFT) + ++ (vb->baddr - vma->vm_start); ++ err = omap_videobuf_dma_init_user(vb, physp, asize); ++ spin_unlock(&fh->vbq_lock); ++ if (0 != err) ++ return err; ++ } else { ++ err = videobuf_iolock(q, vb, NULL); ++ /* ++ * In case of user pointer mode, the get_user_pages ++ * will fail if user has allocated less memory than ++ * vb->size. But it is not error from resizer driver ++ * point of view. so handled seperately ++ */ ++ if ((err < 0) && (dma->nr_pages > 0)) ++ err = videobuf_dma_map(q, dma); ++ if (err) ++ goto buf_release; ++ /* ++ * Add one extra page for input buffer ++ */ ++ if (0 == vb->i) ++ err = omap_create_sg(q, dma); ++ if (err) ++ goto buf_release; ++ spin_unlock(&fh->vbq_lock); ++ } ++ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ if (!isp_addr) ++ err = -EIO; ++ else { ++ if (vb->i) { ++ rsz_conf_chan->buf_address[vb->i] = isp_addr; ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = isp_addr; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } else { ++ rsz_conf_chan->buf_address[vb->i] = isp_addr; ++ rsz_conf_chan->register_config. ++ rsz_sdr_inadd ++ = isp_addr; ++ rsz_conf_chan->input_buf_index = vb->i; ++ if (outsize < insize && rsz_conf_chan-> ++ register_config. ++ rsz_sdr_outadd == 0) { + rsz_conf_chan->register_config. +- rsz_sdr_inadd +- = isp_addr; +- rsz_conf_chan->input_buf_index = vb->i; +- outsize = multipass->out_pitch * +- multipass->out_vsize; +- insize = multipass->in_pitch * +- multipass->in_vsize; +- if (outsize < insize) { +- rsz_conf_chan->register_config. +- rsz_sdr_outadd +- = isp_addr; +- rsz_conf_chan-> +- output_buf_index = +- vb->i; +- } +- +- fh->isp_addr_read = isp_addr; ++ rsz_sdr_outadd ++ = isp_addr; ++ rsz_conf_chan-> ++ output_buf_index = ++ vb->i; + } + } + } + +- } ++ } else { ++ if(vb->i) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd = ++ rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_sdr_inadd = ++ rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->input_buf_index = vb->i; ++ if(outsize < insize && rsz_conf_chan-> ++ register_config. ++ rsz_sdr_outadd == 0) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } ++ ++ } + ++ } + if (!err) { + spin_lock(&fh->vbq_lock); + vb->state = VIDEOBUF_PREPARED; + spin_unlock(&fh->vbq_lock); +- flush_cache_user_range(NULL, vb->baddr, (vb->baddr +- + vb->bsize)); + } else + rsz_vbq_release(q, vb); + +-out: ++ return err; ++buf_release: ++ spin_unlock(&fh->vbq_lock); ++ rsz_vbq_release(q, vb); + return err; + } + +@@ -1255,7 +1459,8 @@ err_enomem0: + **/ + static int rsz_release(struct inode *inode, struct file *filp) + { +- u32 timeout = 0; ++ int i; ++ unsigned int timeout = 0; + struct rsz_fh *fh = filp->private_data; + struct channel_config *rsz_conf_chan = fh->config; + struct rsz_params *params = fh->params; +@@ -1266,17 +1471,17 @@ static int rsz_release(struct inode *inode, struct file *filp) + timeout++; + schedule(); + } +- if (mutex_lock_interruptible(&device_config->reszwrap_mutex)) +- return -EINTR; +- device_config->opened--; +- mutex_unlock(&device_config->reszwrap_mutex); +- /* This will Free memory allocated to the buffers, +- * and flushes the queue +- */ +- videobuf_queue_cancel(q); +- fh->params = NULL; +- fh->config = NULL; ++ /* Free memory allocated to the buffers */ ++ for (i = 0 ; i < VIDEO_MAX_FRAME ; i++) { ++ struct videobuf_dmabuf *dma = NULL; ++ if (!q->bufs[i]) ++ continue; ++ dma = videobuf_to_dma(q->bufs[i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ } + ++ videobuf_mmap_free(q); + fh->rsz_bufsize = 0; + filp->private_data = NULL; + +@@ -1286,7 +1491,8 @@ static int rsz_release(struct inode *inode, struct file *filp) + kfree(fh); + + isp_put(); +- ++ fh->params = NULL; ++ fh->config = NULL; + return 0; + } + +@@ -1353,6 +1559,12 @@ static long rsz_unlocked_ioctl(struct file *file, unsigned int cmd, + chanprotection_mutex)) + return -EINTR; + ret = videobuf_reqbufs(&fh->vbq, (void *)&req_buf); ++ if (ret >= 0) { ++ if (copy_to_user((struct v4l2_requestbuffers *)arg, ++ &req_buf, sizeof(struct ++ v4l2_requestbuffers))) ++ return -EFAULT; ++ } + mutex_unlock(&rsz_conf_chan->chanprotection_mutex); + break; + } +@@ -1394,11 +1606,7 @@ static long rsz_unlocked_ioctl(struct file *file, unsigned int cmd, + sizeof(struct rsz_params))) { + return -EFAULT; + } +- if (mutex_lock_interruptible(&rsz_conf_chan-> +- chanprotection_mutex)) +- return -EINTR; +- ret = rsz_set_params(fh->multipass, params, rsz_conf_chan); +- mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ ret = rsz_set_params(fh->multipass, fh->params, rsz_conf_chan); + break; + } + case RSZ_G_PARAM: +@@ -1433,6 +1641,12 @@ static long rsz_unlocked_ioctl(struct file *file, unsigned int cmd, + rsz_calculate_crop(rsz_conf_chan, (struct rsz_cropsize *)arg); + break; + ++ case RSZ_S_EXP: ++ if (mutex_lock_interruptible(&rsz_conf_chan->chanprotection_mutex)) ++ return -EINTR; ++ rsz_conf_chan->register_config.sdr_req_exp = *((unsigned int *)arg); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; + default: + dev_err(rsz_device, "resizer_ioctl: Invalid Command Value"); + return -EINVAL; +@@ -1535,14 +1749,18 @@ static int __init omap_rsz_init(void) + "memory\n"); + return -ENOMEM; + } +- ++ device->extra_page_addr = __get_free_pages(GFP_KERNEL | GFP_DMA, 0); ++ if (!device->extra_page_addr) { ++ dev_err(rsz_device, OMAP_REZR_NAME ":Allocation failed. "); ++ kfree(device); ++ return -ENOMEM; ++ } + ret = alloc_chrdev_region(&dev, 0, 1, OMAP_REZR_NAME); + if (ret < 0) { + dev_err(rsz_device, OMAP_REZR_NAME ": intialization failed. " + "Could not allocate region " + "for character device\n"); +- kfree(device); +- return -ENODEV; ++ goto fail1; + } + + /* Register the driver in the kernel */ +@@ -1608,6 +1826,8 @@ fail3: + cdev_del(&c_dev); + fail2: + unregister_chrdev_region(dev, 1); ++fail1: ++ free_pages((unsigned long)device->extra_page_addr, 0); + kfree(device); + return ret; + } +@@ -1623,6 +1843,7 @@ void __exit omap_rsz_exit(void) + platform_driver_unregister(&omap_resizer_driver); + cdev_del(&c_dev); + unregister_chrdev_region(dev, 1); ++ free_pages((unsigned long)device_config->extra_page_addr, 0); + kfree(device_config); + } + +diff --git a/include/linux/omap_resizer.h b/include/linux/omap_resizer.h +index 5ac0c88..47b8dd8 100644 +--- a/include/linux/omap_resizer.h ++++ b/include/linux/omap_resizer.h +@@ -21,7 +21,7 @@ + + /* ioctls definition */ + #define RSZ_IOC_BASE 'R' +-#define RSZ_IOC_MAXNR 8 ++#define RSZ_IOC_MAXNR 9 + + /*Ioctl options which are to be passed while calling the ioctl*/ + #define RSZ_REQBUF _IOWR(RSZ_IOC_BASE, 1,\ +@@ -33,6 +33,7 @@ + #define RSZ_G_STATUS _IOWR(RSZ_IOC_BASE, 6, struct rsz_status) + #define RSZ_QUEUEBUF _IOWR(RSZ_IOC_BASE, 7, struct v4l2_buffer) + #define RSZ_GET_CROPSIZE _IOWR(RSZ_IOC_BASE, 8, struct rsz_cropsize) ++#define RSZ_S_EXP _IOWR(RSZ_IOC_BASE, 9, __s32) + + #define RSZ_INTYPE_YCBCR422_16BIT 0 + #define RSZ_INTYPE_PLANAR_8BIT 1 +-- +1.6.0.3 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/v4l/0001-V4L2-Add-COLORFX-user-control.patch b/recipes/linux/linux-omap-2.6.29/isp/v4l/0001-V4L2-Add-COLORFX-user-control.patch new file mode 100644 index 0000000000..d9e4243b4a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/v4l/0001-V4L2-Add-COLORFX-user-control.patch @@ -0,0 +1,44 @@ +From ad422f476ce04636f911557bbfd066c516e9b472 Mon Sep 17 00:00:00 2001 +From: Aguirre Rodriguez, Sergio Alberto +Date: Tue, 20 Jan 2009 16:29:26 -0600 +Subject: [PATCH] V4L2: Add COLORFX user control + +From 07396d67b39bf7bcc81440d3e72d253ad6c54f11 Mon Sep 17 00:00:00 2001 +From: Sergio Aguirre +Date: Tue, 20 Jan 2009 15:34:43 -0600 +Subject: [PATCH v2] V4L2: Add COLORFX user control + +This is a common feature on many cameras. the options are: +Default colors, +B & W, +Sepia + +Signed-off-by: Sergio Aguirre +--- + include/linux/videodev2.h | 9 ++++++++- + 1 files changed, 8 insertions(+), 1 deletions(-) + +diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h +index 5571dbe..8e4e25e 100644 +--- a/include/linux/videodev2.h ++++ b/include/linux/videodev2.h +@@ -879,8 +879,15 @@ enum v4l2_power_line_frequency { + #define V4L2_CID_BACKLIGHT_COMPENSATION (V4L2_CID_BASE+28) + #define V4L2_CID_CHROMA_AGC (V4L2_CID_BASE+29) + #define V4L2_CID_COLOR_KILLER (V4L2_CID_BASE+30) ++#define V4L2_CID_COLORFX (V4L2_CID_BASE+31) ++enum v4l2_colorfx { ++ V4L2_COLORFX_NONE = 0, ++ V4L2_COLORFX_BW = 1, ++ V4L2_COLORFX_SEPIA = 2, ++}; ++ + /* last CID + 1 */ +-#define V4L2_CID_LASTP1 (V4L2_CID_BASE+31) ++#define V4L2_CID_LASTP1 (V4L2_CID_BASE+32) + + /* MPEG-class control IDs defined by V4L2 */ + #define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/v4l/0002-V4L-Int-if-v4l2_int_device_try_attach_all-requires.patch b/recipes/linux/linux-omap-2.6.29/isp/v4l/0002-V4L-Int-if-v4l2_int_device_try_attach_all-requires.patch new file mode 100644 index 0000000000..45e27a2fda --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/v4l/0002-V4L-Int-if-v4l2_int_device_try_attach_all-requires.patch @@ -0,0 +1,50 @@ +From 5b007183d51543624bc9f582966f245a64157b57 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Fri, 31 Oct 2008 11:51:30 +0200 +Subject: [PATCH] V4L: Int if: v4l2_int_device_try_attach_all requires mutex + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/v4l2-int-device.c | 12 ++++++++++-- + 1 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/video/v4l2-int-device.c b/drivers/media/video/v4l2-int-device.c +index a935bae..eb8dc84 100644 +--- a/drivers/media/video/v4l2-int-device.c ++++ b/drivers/media/video/v4l2-int-device.c +@@ -32,7 +32,7 @@ + static DEFINE_MUTEX(mutex); + static LIST_HEAD(int_list); + +-void v4l2_int_device_try_attach_all(void) ++static void __v4l2_int_device_try_attach_all(void) + { + struct v4l2_int_device *m, *s; + +@@ -66,6 +66,14 @@ void v4l2_int_device_try_attach_all(void) + } + } + } ++ ++void v4l2_int_device_try_attach_all(void) ++{ ++ mutex_lock(&mutex); ++ __v4l2_int_device_try_attach_all(); ++ mutex_unlock(&mutex); ++} ++ + EXPORT_SYMBOL_GPL(v4l2_int_device_try_attach_all); + + static int ioctl_sort_cmp(const void *a, const void *b) +@@ -89,7 +97,7 @@ int v4l2_int_device_register(struct v4l2_int_device *d) + &ioctl_sort_cmp, NULL); + mutex_lock(&mutex); + list_add(&d->head, &int_list); +- v4l2_int_device_try_attach_all(); ++ __v4l2_int_device_try_attach_all(); + mutex_unlock(&mutex); + + return 0; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/v4l/0003-V4L-Int-if-Dummy-slave.patch b/recipes/linux/linux-omap-2.6.29/isp/v4l/0003-V4L-Int-if-Dummy-slave.patch new file mode 100644 index 0000000000..829810fab0 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/v4l/0003-V4L-Int-if-Dummy-slave.patch @@ -0,0 +1,61 @@ +From cc1d76e0f50321e80f7f50e9e214de2c9a45628a Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Wed, 22 Oct 2008 18:41:20 +0300 +Subject: [PATCH] V4L: Int if: Dummy slave + +This patch implements a dummy slave that has no functionality. Helps +managing slaves in the OMAP 3 camera driver; no need to check for NULL +pointers. + +Signed-off-by: Sakari Ailus +--- + drivers/media/video/v4l2-int-device.c | 19 +++++++++++++++++++ + include/media/v4l2-int-device.h | 2 ++ + 2 files changed, 21 insertions(+), 0 deletions(-) + +diff --git a/drivers/media/video/v4l2-int-device.c b/drivers/media/video/v4l2-int-device.c +index eb8dc84..483ee2e 100644 +--- a/drivers/media/video/v4l2-int-device.c ++++ b/drivers/media/video/v4l2-int-device.c +@@ -67,6 +67,25 @@ static void __v4l2_int_device_try_attach_all(void) + } + } + ++static struct v4l2_int_slave dummy_slave = { ++ /* Dummy pointer to avoid underflow in find_ioctl. */ ++ .ioctls = (void *)sizeof(struct v4l2_int_ioctl_desc), ++ .num_ioctls = 0, ++}; ++ ++static struct v4l2_int_device dummy = { ++ .type = v4l2_int_type_slave, ++ .u = { ++ .slave = &dummy_slave, ++ }, ++}; ++ ++struct v4l2_int_device *v4l2_int_device_dummy() ++{ ++ return &dummy; ++} ++EXPORT_SYMBOL_GPL(v4l2_int_device_dummy); ++ + void v4l2_int_device_try_attach_all(void) + { + mutex_lock(&mutex); +diff --git a/include/media/v4l2-int-device.h b/include/media/v4l2-int-device.h +index fbf5855..5d254c4 100644 +--- a/include/media/v4l2-int-device.h ++++ b/include/media/v4l2-int-device.h +@@ -84,6 +84,8 @@ struct v4l2_int_device { + void *priv; + }; + ++struct v4l2_int_device *v4l2_int_device_dummy(void); ++ + void v4l2_int_device_try_attach_all(void); + + int v4l2_int_device_register(struct v4l2_int_device *d); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/v4l/0004-V4L-int-device-add-support-for-VIDIOC_QUERYMENU.patch b/recipes/linux/linux-omap-2.6.29/isp/v4l/0004-V4L-int-device-add-support-for-VIDIOC_QUERYMENU.patch new file mode 100644 index 0000000000..b81b20419e --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/v4l/0004-V4L-int-device-add-support-for-VIDIOC_QUERYMENU.patch @@ -0,0 +1,33 @@ +From e041e57cafca24cf92430cdf3cc091060a271e19 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Fri, 31 Oct 2008 10:20:31 +0200 +Subject: [PATCH] V4L: int device: add support for VIDIOC_QUERYMENU + +Signed-off-by: Tuukka Toivonen +--- + include/media/v4l2-int-device.h | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/include/media/v4l2-int-device.h b/include/media/v4l2-int-device.h +index 5d254c4..81f4863 100644 +--- a/include/media/v4l2-int-device.h ++++ b/include/media/v4l2-int-device.h +@@ -178,6 +178,7 @@ enum v4l2_int_ioctl_num { + vidioc_int_s_fmt_cap_num, + vidioc_int_try_fmt_cap_num, + vidioc_int_queryctrl_num, ++ vidioc_int_querymenu_num, + vidioc_int_g_ctrl_num, + vidioc_int_s_ctrl_num, + vidioc_int_cropcap_num, +@@ -282,6 +283,7 @@ V4L2_INT_WRAPPER_1(g_fmt_cap, struct v4l2_format, *); + V4L2_INT_WRAPPER_1(s_fmt_cap, struct v4l2_format, *); + V4L2_INT_WRAPPER_1(try_fmt_cap, struct v4l2_format, *); + V4L2_INT_WRAPPER_1(queryctrl, struct v4l2_queryctrl, *); ++V4L2_INT_WRAPPER_1(querymenu, struct v4l2_querymenu, *); + V4L2_INT_WRAPPER_1(g_ctrl, struct v4l2_control, *); + V4L2_INT_WRAPPER_1(s_ctrl, struct v4l2_control, *); + V4L2_INT_WRAPPER_1(cropcap, struct v4l2_cropcap, *); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/isp/v4l/0005-V4L-Int-if-Add-vidioc_int_querycap.patch b/recipes/linux/linux-omap-2.6.29/isp/v4l/0005-V4L-Int-if-Add-vidioc_int_querycap.patch new file mode 100644 index 0000000000..a9e06290fa --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/isp/v4l/0005-V4L-Int-if-Add-vidioc_int_querycap.patch @@ -0,0 +1,35 @@ +From dc05ee10583dca44e0f8d4109bd1397ee3c5ffae Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Thu, 2 Oct 2008 11:55:07 +0300 +Subject: [PATCH] V4L: Int if: Add vidioc_int_querycap + +Signed-off-by: Sakari Ailus +--- + include/media/v4l2-int-device.h | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +diff --git a/include/media/v4l2-int-device.h b/include/media/v4l2-int-device.h +index 81f4863..2830ae1 100644 +--- a/include/media/v4l2-int-device.h ++++ b/include/media/v4l2-int-device.h +@@ -173,7 +173,8 @@ enum v4l2_int_ioctl_num { + * "Proper" V4L ioctls, as in struct video_device. + * + */ +- vidioc_int_enum_fmt_cap_num = 1, ++ vidioc_int_querycap_num = 1, ++ vidioc_int_enum_fmt_cap_num, + vidioc_int_g_fmt_cap_num, + vidioc_int_s_fmt_cap_num, + vidioc_int_try_fmt_cap_num, +@@ -278,6 +279,7 @@ enum v4l2_int_ioctl_num { + return desc; \ + } + ++V4L2_INT_WRAPPER_1(querycap, struct v4l2_capability, *); + V4L2_INT_WRAPPER_1(enum_fmt_cap, struct v4l2_fmtdesc, *); + V4L2_INT_WRAPPER_1(g_fmt_cap, struct v4l2_format, *); + V4L2_INT_WRAPPER_1(s_fmt_cap, struct v4l2_format, *); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0001-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch b/recipes/linux/linux-omap-2.6.29/musb/0001-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch new file mode 100644 index 0000000000..a7898d1440 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0001-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch @@ -0,0 +1,43 @@ +From a9199e8ab6d6fb105aa251d6bf2192e7eafac8ee Mon Sep 17 00:00:00 2001 +From: Ajay Kumar Gupta +Date: Tue, 24 Mar 2009 17:22:53 -0700 +Subject: [PATCH] USB: musb: only turn off vbus in OTG hosts + +Except on DaVinci, VBUS is now switched off as part of idling the +USB link (after a_wait_bcon) whenever a device is disconnected +from host. This is correct for OTG hosts, where either SRP or +an ID interrupt could turn VBUS on again. + +However, for non-OTG hosts there's no way to turn VBUS on again, +so the host becomes unusable. And the procfs entry which once +allowed a manual workaround for this is now gone. + +This patch adds an is_otg_enabled() check before scheduling the +switch-off timer in disconnect path, supporting a "classic host" +mode where SRP is unavailable. + +[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: tweak patch description ] + +Signed-off-by: Ajay Kumar Gupta +Signed-off-by: David Brownell +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/musb/musb_core.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index af77e46..338cd16 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -769,7 +769,7 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + case OTG_STATE_A_SUSPEND: + usb_hcd_resume_root_hub(musb_to_hcd(musb)); + musb_root_disconnect(musb); +- if (musb->a_wait_bcon != 0) ++ if (musb->a_wait_bcon != 0 && is_otg_enabled(musb)) + musb_platform_try_idle(musb, jiffies + + msecs_to_jiffies(musb->a_wait_bcon)); + break; +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0002-USB-composite-avoid-inconsistent-lock-state.patch b/recipes/linux/linux-omap-2.6.29/musb/0002-USB-composite-avoid-inconsistent-lock-state.patch new file mode 100644 index 0000000000..5cb7bcb065 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0002-USB-composite-avoid-inconsistent-lock-state.patch @@ -0,0 +1,76 @@ +From 83eb44b1c84f99d9a5c67612bd94b4ed7c43f64c Mon Sep 17 00:00:00 2001 +From: Felipe Balbi +Date: Tue, 24 Mar 2009 17:22:49 -0700 +Subject: [PATCH] USB: composite: avoid inconsistent lock state + +Avoid the following INFO from lock debugging: + +[ 369.126112] ================================= +[ 369.132063] [ INFO: inconsistent lock state ] +[ 369.136457] 2.6.28-maemo1 #1 +[ 369.139387] --------------------------------- +[ 369.143782] inconsistent {hardirq-on-W} -> {in-hardirq-W} usage. +[ 369.149855] swapper/0 [HC1[1]:SC0[0]:HE0:SE1] takes: +[ 369.154890] (&cdev->lock){+-..}, at: [] composite_disconnect+0x1c/0] +[ 369.163404] {hardirq-on-W} state was registered at: +[ 369.168348] [] __lock_acquire+0x5d0/0x7d8 +[ 369.173506] [] lock_acquire+0x64/0x78 +[ 369.178266] [] _spin_lock+0x4c/0x80 +[ 369.182905] [] usb_function_deactivate+0x20/0x70 [g_nokia] +[ 369.189527] [] 0xbf1a0a88 +[ 369.193281] [] 0xbf19f450 +[ 369.197004] [] 0xbf19fa3c +[ 369.200758] [] 0xbf1a03a0 +[ 369.204481] [] 0xbf19f254 +[ 369.208204] [] 0xbf1a0158 +[ 369.211927] [] 0xbf1a130c +[ 369.215650] [] usb_gadget_register_driver+0x12c/0x28c +[ 369.221846] [] 0xbf1a06bc +[ 369.225569] [] 0xbf1a06e8 +[ 369.229322] [] __exception_text_end+0x64/0x19c +[ 369.234877] [] sys_init_module+0x9c/0x194 +[ 369.240004] [] ret_fast_syscall+0x0/0x2c +[ 369.245039] [] 0xffffffff +[ 369.248793] irq event stamp: 218356 +[ 369.252302] hardirqs last enabled at (218355): [] omap3_enter_idle+8 +[ 369.260420] hardirqs last disabled at (218356): [] __irq_svc+0x34/0x0 +[ 369.267927] softirqs last enabled at (218348): [] __do_softirq+0x134 +[ 369.275892] softirqs last disabled at (218335): [] irq_exit+0x60/0xb0 +[ 369.283308] +[ 369.283308] other info that might help us debug this: +[ 369.289930] no locks held by swapper/0. + +Cc: David Brownell +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/composite.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c +index 5d11c29..40f1da7 100644 +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -149,16 +149,17 @@ done: + int usb_function_deactivate(struct usb_function *function) + { + struct usb_composite_dev *cdev = function->config->cdev; ++ unsigned long flags; + int status = 0; + +- spin_lock(&cdev->lock); ++ spin_lock_irqsave(&cdev->lock, flags); + + if (cdev->deactivations == 0) + status = usb_gadget_disconnect(cdev->gadget); + if (status == 0) + cdev->deactivations++; + +- spin_unlock(&cdev->lock); ++ spin_unlock_irqrestore(&cdev->lock, flags); + return status; + } + +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0003-USB-musb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch b/recipes/linux/linux-omap-2.6.29/musb/0003-USB-musb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch new file mode 100644 index 0000000000..fadad9e44a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0003-USB-musb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch @@ -0,0 +1,218 @@ +From ba7b26e69f4bb41f10be444c5fded853330f82b5 Mon Sep 17 00:00:00 2001 +From: Ajay Kumar Gupta +Date: Tue, 24 Mar 2009 17:22:51 -0700 +Subject: [PATCH] USB: musb: NAK timeout scheme on bulk RX endpoint + +Fixes endpoint starvation issue when more than one bulk QH is +multiplexed on the reserved bulk RX endpoint, which is normal +for cases like serial and ethernet adapters. + +This patch sets the NAK timeout interval for such QHs, and when +a timeout triggers the next QH will be scheduled. (This resembles +the bulk scheduling done in hardware by EHCI, OHCI, and UHCI.) + +This scheme doesn't work for devices which are connected to a +high to full speed tree (transaction translator) as there is +no NAK timeout interrupt from the musb controller from such +devices. + +Tested with PIO, Inventra DMA, CPPI DMA. + +[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: fold in start_urb() update; + clarify only for bulk RX; don't accidentally clear WZC bits ] + +Signed-off-by: Ajay Kumar Gupta +Cc: Felipe Balbi +Signed-off-by: David Brownell +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/musb/musb_host.c | 112 ++++++++++++++++++++++++++++++++---------- + 1 files changed, 85 insertions(+), 27 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 6dbbd07..bd1d5ae 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -64,11 +64,8 @@ + * + * - DMA (Mentor/OMAP) ...has at least toggle update problems + * +- * - Still no traffic scheduling code to make NAKing for bulk or control +- * transfers unable to starve other requests; or to make efficient use +- * of hardware with periodic transfers. (Note that network drivers +- * commonly post bulk reads that stay pending for a long time; these +- * would make very visible trouble.) ++ * - [23-feb-2009] minimal traffic scheduling to avoid bulk RX packet ++ * starvation ... nothing yet for TX, interrupt, or bulk. + * + * - Not tested with HNP, but some SRP paths seem to behave. + * +@@ -88,11 +85,8 @@ + * + * CONTROL transfers all go through ep0. BULK ones go through dedicated IN + * and OUT endpoints ... hardware is dedicated for those "async" queue(s). +- * + * (Yes, bulk _could_ use more of the endpoints than that, and would even +- * benefit from it ... one remote device may easily be NAKing while others +- * need to perform transfers in that same direction. The same thing could +- * be done in software though, assuming dma cooperates.) ++ * benefit from it.) + * + * INTERUPPT and ISOCHRONOUS transfers are scheduled to the other endpoints. + * So far that scheduling is both dumb and optimistic: the endpoint will be +@@ -201,8 +195,9 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + len = urb->iso_frame_desc[0].length; + break; + default: /* bulk, interrupt */ +- buf = urb->transfer_buffer; +- len = urb->transfer_buffer_length; ++ /* actual_length may be nonzero on retry paths */ ++ buf = urb->transfer_buffer + urb->actual_length; ++ len = urb->transfer_buffer_length - urb->actual_length; + } + + DBG(4, "qh %p urb %p dev%d ep%d%s%s, hw_ep %d, %p/%d\n", +@@ -1045,7 +1040,8 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) + + /* NOTE: this code path would be a good place to PAUSE a + * control transfer, if another one is queued, so that +- * ep0 is more likely to stay busy. ++ * ep0 is more likely to stay busy. That's already done ++ * for bulk RX transfers. + * + * if (qh->ring.next != &musb->control), then + * we have a candidate... NAKing is *NOT* an error +@@ -1197,6 +1193,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) + /* NOTE: this code path would be a good place to PAUSE a + * transfer, if there's some other (nonperiodic) tx urb + * that could use this fifo. (dma complicates it...) ++ * That's already done for bulk RX transfers. + * + * if (bulk && qh->ring.next != &musb->out_bulk), then + * we have a candidate... NAKing is *NOT* an error +@@ -1358,6 +1355,50 @@ finish: + + #endif + ++/* Schedule next QH from musb->in_bulk and move the current qh to ++ * the end; avoids starvation for other endpoints. ++ */ ++static void musb_bulk_rx_nak_timeout(struct musb *musb, struct musb_hw_ep *ep) ++{ ++ struct dma_channel *dma; ++ struct urb *urb; ++ void __iomem *mbase = musb->mregs; ++ void __iomem *epio = ep->regs; ++ struct musb_qh *cur_qh, *next_qh; ++ u16 rx_csr; ++ ++ musb_ep_select(mbase, ep->epnum); ++ dma = is_dma_capable() ? ep->rx_channel : NULL; ++ ++ /* clear nak timeout bit */ ++ rx_csr = musb_readw(epio, MUSB_RXCSR); ++ rx_csr |= MUSB_RXCSR_H_WZC_BITS; ++ rx_csr &= ~MUSB_RXCSR_DATAERROR; ++ musb_writew(epio, MUSB_RXCSR, rx_csr); ++ ++ cur_qh = first_qh(&musb->in_bulk); ++ if (cur_qh) { ++ urb = next_urb(cur_qh); ++ if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { ++ dma->status = MUSB_DMA_STATUS_CORE_ABORT; ++ musb->dma_controller->channel_abort(dma); ++ urb->actual_length += dma->actual_len; ++ dma->actual_len = 0L; ++ } ++ musb_save_toggle(ep, 1, urb); ++ ++ /* move cur_qh to end of queue */ ++ list_move_tail(&cur_qh->ring, &musb->in_bulk); ++ ++ /* get the next qh from musb->in_bulk */ ++ next_qh = first_qh(&musb->in_bulk); ++ ++ /* set rx_reinit and schedule the next qh */ ++ ep->rx_reinit = 1; ++ musb_start_urb(musb, 1, next_qh); ++ } ++} ++ + /* + * Service an RX interrupt for the given IN endpoint; docs cover bulk, iso, + * and high-bandwidth IN transfer cases. +@@ -1421,18 +1462,26 @@ void musb_host_rx(struct musb *musb, u8 epnum) + } else if (rx_csr & MUSB_RXCSR_DATAERROR) { + + if (USB_ENDPOINT_XFER_ISOC != qh->type) { +- /* NOTE this code path would be a good place to PAUSE a +- * transfer, if there's some other (nonperiodic) rx urb +- * that could use this fifo. (dma complicates it...) ++ DBG(6, "RX end %d NAK timeout\n", epnum); ++ ++ /* NOTE: NAKing is *NOT* an error, so we want to ++ * continue. Except ... if there's a request for ++ * another QH, use that instead of starving it. + * +- * if (bulk && qh->ring.next != &musb->in_bulk), then +- * we have a candidate... NAKing is *NOT* an error ++ * Devices like Ethernet and serial adapters keep ++ * reads posted at all times, which will starve ++ * other devices without this logic. + */ +- DBG(6, "RX end %d NAK timeout\n", epnum); ++ if (usb_pipebulk(urb->pipe) ++ && qh->mux == 1 ++ && !list_is_singular(&musb->in_bulk)) { ++ musb_bulk_rx_nak_timeout(musb, hw_ep); ++ return; ++ } + musb_ep_select(mbase, epnum); +- musb_writew(epio, MUSB_RXCSR, +- MUSB_RXCSR_H_WZC_BITS +- | MUSB_RXCSR_H_REQPKT); ++ rx_csr |= MUSB_RXCSR_H_WZC_BITS; ++ rx_csr &= ~MUSB_RXCSR_DATAERROR; ++ musb_writew(epio, MUSB_RXCSR, rx_csr); + + goto finish; + } else { +@@ -1756,6 +1805,17 @@ static int musb_schedule( + head = &musb->in_bulk; + else + head = &musb->out_bulk; ++ ++ /* Enable bulk RX NAK timeout scheme when bulk requests are ++ * multiplexed. This scheme doen't work in high speed to full ++ * speed scenario as NAK interrupts are not coming from a ++ * full speed device connected to a high speed device. ++ * NAK timeout interval is 8 (128 uframe or 16ms) for HS and ++ * 4 (8 frame or 8ms) for FS device. ++ */ ++ if (is_in && qh->dev) ++ qh->intv_reg = ++ (USB_SPEED_HIGH == qh->dev->speed) ? 8 : 4; + goto success; + } else if (best_end < 0) { + return -ENOSPC; +@@ -1888,13 +1948,11 @@ static int musb_urb_enqueue( + * + * The downside of disabling this is that transfer scheduling + * gets VERY unfair for nonperiodic transfers; a misbehaving +- * peripheral could make that hurt. Or for reads, one that's +- * perfectly normal: network and other drivers keep reads +- * posted at all times, having one pending for a week should +- * be perfectly safe. ++ * peripheral could make that hurt. That's perfectly normal ++ * for reads from network or serial adapters ... so we have ++ * partial NAKlimit support for bulk RX. + * +- * The upside of disabling it is avoidng transfer scheduling +- * code to put this aside for while. ++ * The upside of disabling it is simpler transfer scheduling. + */ + interval = 0; + } +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch b/recipes/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch new file mode 100644 index 0000000000..438f11cf7a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch @@ -0,0 +1,106 @@ +From 9ebf351bcd28a89a0b1ba8d0496fffbc72421611 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Tue, 24 Mar 2009 17:22:50 -0700 +Subject: [PATCH] USB: musb: rewrite host periodic endpoint allocation + +The current MUSB host code doesn't make use of all the available +FIFOs in for periodic transfers since it wrongly assumes the RX +and TX sides of any given hw_ep always share one FIFO. + +Change: use 'in_qh' and 'out_qh' fields of the 'struct musb_hw_ep' +to check the endpoint's business; get rid of the now-unused 'periodic' +array in the 'struct musb'. Also optimize a loop induction variable +in the endpoint lookup code. + +(Based on a previous patch from Ajay Kumar Gupta ) + +[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: clarify description and origin + of this fix; whitespace ] + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +Cc: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/musb/musb_core.h | 1 - + drivers/usb/musb/musb_host.c | 28 +++++++++++----------------- + 2 files changed, 11 insertions(+), 18 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h +index 630946a..adf1806 100644 +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -331,7 +331,6 @@ struct musb { + struct list_head control; /* of musb_qh */ + struct list_head in_bulk; /* of musb_qh */ + struct list_head out_bulk; /* of musb_qh */ +- struct musb_qh *periodic[32]; /* tree of interrupt+iso */ + #endif + + /* called with IRQs blocked; ON/nonzero implies starting a session, +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index bd1d5ae..499c431 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -390,7 +390,6 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + * de-allocated if it's tracked and allocated; + * and where we'd update the schedule tree... + */ +- musb->periodic[ep->epnum] = NULL; + kfree(qh); + qh = NULL; + break; +@@ -1760,31 +1759,27 @@ static int musb_schedule( + + /* else, periodic transfers get muxed to other endpoints */ + +- /* FIXME this doesn't consider direction, so it can only +- * work for one half of the endpoint hardware, and assumes +- * the previous cases handled all non-shared endpoints... +- */ +- +- /* we know this qh hasn't been scheduled, so all we need to do ++ /* ++ * We know this qh hasn't been scheduled, so all we need to do + * is choose which hardware endpoint to put it on ... + * + * REVISIT what we really want here is a regular schedule tree +- * like e.g. OHCI uses, but for now musb->periodic is just an +- * array of the _single_ logical endpoint associated with a +- * given physical one (identity mapping logical->physical). +- * +- * that simplistic approach makes TT scheduling a lot simpler; +- * there is none, and thus none of its complexity... ++ * like e.g. OHCI uses. + */ + best_diff = 4096; + best_end = -1; + +- for (epnum = 1; epnum < musb->nr_endpoints; epnum++) { ++ for (epnum = 1, hw_ep = musb->endpoints + 1; ++ epnum < musb->nr_endpoints; ++ epnum++, hw_ep++) { + int diff; + +- if (musb->periodic[epnum]) ++ if (is_in || hw_ep->is_shared_fifo) { ++ if (hw_ep->in_qh != NULL) ++ continue; ++ } else if (hw_ep->out_qh != NULL) + continue; +- hw_ep = &musb->endpoints[epnum]; ++ + if (hw_ep == musb->bulk_ep) + continue; + +@@ -1824,7 +1819,6 @@ static int musb_schedule( + idle = 1; + qh->mux = 0; + hw_ep = musb->endpoints + best_end; +- musb->periodic[best_end] = qh; + DBG(4, "qh %p periodic slot %d\n", qh, best_end); + success: + if (head) { +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0005-USB-TWL-disable-VUSB-regulators-when-cable-unplugg.patch b/recipes/linux/linux-omap-2.6.29/musb/0005-USB-TWL-disable-VUSB-regulators-when-cable-unplugg.patch new file mode 100644 index 0000000000..db3481b87b --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0005-USB-TWL-disable-VUSB-regulators-when-cable-unplugg.patch @@ -0,0 +1,181 @@ +From 60e7ce93befe795357db05001fe4caab522a421d Mon Sep 17 00:00:00 2001 +From: Jouni Hogander +Date: Tue, 24 Mar 2009 17:22:57 -0700 +Subject: [PATCH] USB: TWL: disable VUSB regulators when cable unplugged + +This patch disables USB regulators VUSB1V5, VUSB1V8, and VUSB3V1 +when the USB cable is unplugged to reduce power consumption. +Added a depencency from twl4030 usb driver to TWL_REGULATOR. + +Signed-off-by: Jouni Hogander +Signed-off-by: Kalle Jokiniemi +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/otg/Kconfig | 2 +- + drivers/usb/otg/twl4030-usb.c | 73 ++++++++++++++++++++++++++++++++++++----- + 2 files changed, 65 insertions(+), 10 deletions(-) + +diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig +index ee55b44..5790a5b 100644 +--- a/drivers/usb/otg/Kconfig ++++ b/drivers/usb/otg/Kconfig +@@ -43,7 +43,7 @@ config ISP1301_OMAP + + config TWL4030_USB + tristate "TWL4030 USB Transceiver Driver" +- depends on TWL4030_CORE ++ depends on TWL4030_CORE && REGULATOR_TWL4030 + select USB_OTG_UTILS + help + Enable this to support the USB OTG transceiver on TWL4030 +diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c +index 416e441..d9478d0 100644 +--- a/drivers/usb/otg/twl4030-usb.c ++++ b/drivers/usb/otg/twl4030-usb.c +@@ -34,6 +34,8 @@ + #include + #include + #include ++#include ++#include + + + /* Register defines */ +@@ -246,6 +248,11 @@ struct twl4030_usb { + struct otg_transceiver otg; + struct device *dev; + ++ /* TWL4030 internal USB regulator supplies */ ++ struct regulator *usb1v5; ++ struct regulator *usb1v8; ++ struct regulator *usb3v1; ++ + /* for vbus reporting with irqs disabled */ + spinlock_t lock; + +@@ -434,6 +441,18 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on) + + pwr = twl4030_usb_read(twl, PHY_PWR_CTRL); + if (on) { ++ regulator_enable(twl->usb3v1); ++ regulator_enable(twl->usb1v8); ++ /* ++ * Disabling usb3v1 regulator (= writing 0 to VUSB3V1_DEV_GRP ++ * in twl4030) resets the VUSB_DEDICATED2 register. This reset ++ * enables VUSB3V1_SLEEP bit that remaps usb3v1 ACTIVE state to ++ * SLEEP. We work around this by clearing the bit after usv3v1 ++ * is re-activated. This ensures that VUSB3V1 is really active. ++ */ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, ++ VUSB_DEDICATED2); ++ regulator_enable(twl->usb1v5); + pwr &= ~PHY_PWR_PHYPWD; + WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); + twl4030_usb_write(twl, PHY_CLK_CTRL, +@@ -443,6 +462,9 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on) + } else { + pwr |= PHY_PWR_PHYPWD; + WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); ++ regulator_disable(twl->usb1v5); ++ regulator_disable(twl->usb1v8); ++ regulator_disable(twl->usb3v1); + } + } + +@@ -468,7 +490,7 @@ static void twl4030_phy_resume(struct twl4030_usb *twl) + twl->asleep = 0; + } + +-static void twl4030_usb_ldo_init(struct twl4030_usb *twl) ++static int twl4030_usb_ldo_init(struct twl4030_usb *twl) + { + /* Enable writing to power configuration registers */ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY); +@@ -480,20 +502,45 @@ static void twl4030_usb_ldo_init(struct twl4030_usb *twl) + /* input to VUSB3V1 LDO is from VBAT, not VBUS */ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1); + +- /* turn on 3.1V regulator */ +- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x20, VUSB3V1_DEV_GRP); ++ /* Initialize 3.1V regulator */ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB3V1_DEV_GRP); ++ ++ twl->usb3v1 = regulator_get(twl->dev, "usb3v1"); ++ if (IS_ERR(twl->usb3v1)) ++ return -ENODEV; ++ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB3V1_TYPE); + +- /* turn on 1.5V regulator */ +- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x20, VUSB1V5_DEV_GRP); ++ /* Initialize 1.5V regulator */ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V5_DEV_GRP); ++ ++ twl->usb1v5 = regulator_get(twl->dev, "usb1v5"); ++ if (IS_ERR(twl->usb1v5)) ++ goto fail1; ++ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V5_TYPE); + +- /* turn on 1.8V regulator */ +- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x20, VUSB1V8_DEV_GRP); ++ /* Initialize 1.8V regulator */ ++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V8_DEV_GRP); ++ ++ twl->usb1v8 = regulator_get(twl->dev, "usb1v8"); ++ if (IS_ERR(twl->usb1v8)) ++ goto fail2; ++ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V8_TYPE); + + /* disable access to power configuration registers */ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, PROTECT_KEY); ++ ++ return 0; ++ ++fail2: ++ regulator_put(twl->usb1v5); ++ twl->usb1v5 = NULL; ++fail1: ++ regulator_put(twl->usb3v1); ++ twl->usb3v1 = NULL; ++ return -ENODEV; + } + + static ssize_t twl4030_usb_vbus_show(struct device *dev, +@@ -598,7 +645,7 @@ static int __init twl4030_usb_probe(struct platform_device *pdev) + { + struct twl4030_usb_data *pdata = pdev->dev.platform_data; + struct twl4030_usb *twl; +- int status; ++ int status, err; + + if (!pdata) { + dev_dbg(&pdev->dev, "platform_data not available\n"); +@@ -622,7 +669,12 @@ static int __init twl4030_usb_probe(struct platform_device *pdev) + /* init spinlock for workqueue */ + spin_lock_init(&twl->lock); + +- twl4030_usb_ldo_init(twl); ++ err = twl4030_usb_ldo_init(twl); ++ if (err) { ++ dev_err(&pdev->dev, "ldo init failed\n"); ++ kfree(twl); ++ return err; ++ } + otg_set_transceiver(&twl->otg); + + platform_set_drvdata(pdev, twl); +@@ -688,6 +740,9 @@ static int __exit twl4030_usb_remove(struct platform_device *pdev) + twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB); + + twl4030_phy_power(twl, 0); ++ regulator_put(twl->usb1v5); ++ regulator_put(twl->usb1v8); ++ regulator_put(twl->usb3v1); + + kfree(twl); + +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0006-USB-gadget-composite-device-level-suspend-resume-h.patch b/recipes/linux/linux-omap-2.6.29/musb/0006-USB-gadget-composite-device-level-suspend-resume-h.patch new file mode 100644 index 0000000000..3f49a4d636 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0006-USB-gadget-composite-device-level-suspend-resume-h.patch @@ -0,0 +1,84 @@ +From 7eef82d231578140c6000d04846a48bdaf341a65 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 24 Mar 2009 17:23:19 -0700 +Subject: [PATCH] USB: gadget: composite device-level suspend/resume hooks + +Address one open question in the composite gadget framework: +Yes, we should have device-level suspend/resume callbacks +in addition to the function-level ones. We have at least one +scenario (with gadget zero in OTG test mode) that's awkward +to handle without it. + +Signed-off-by: David Brownell +Cc: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/composite.c | 8 ++++++-- + include/linux/usb/composite.h | 8 ++++++++ + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c +index 40f1da7..59e8523 100644 +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -1014,7 +1014,7 @@ composite_suspend(struct usb_gadget *gadget) + struct usb_composite_dev *cdev = get_gadget_data(gadget); + struct usb_function *f; + +- /* REVISIT: should we have config and device level ++ /* REVISIT: should we have config level + * suspend/resume callbacks? + */ + DBG(cdev, "suspend\n"); +@@ -1024,6 +1024,8 @@ composite_suspend(struct usb_gadget *gadget) + f->suspend(f); + } + } ++ if (composite->suspend) ++ composite->suspend(cdev); + } + + static void +@@ -1032,10 +1034,12 @@ composite_resume(struct usb_gadget *gadget) + struct usb_composite_dev *cdev = get_gadget_data(gadget); + struct usb_function *f; + +- /* REVISIT: should we have config and device level ++ /* REVISIT: should we have config level + * suspend/resume callbacks? + */ + DBG(cdev, "resume\n"); ++ if (composite->resume) ++ composite->resume(cdev); + if (cdev->config) { + list_for_each_entry(f, &cdev->config->functions, list) { + if (f->resume) +diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h +index 935c380..acd7b0f 100644 +--- a/include/linux/usb/composite.h ++++ b/include/linux/usb/composite.h +@@ -244,6 +244,10 @@ int usb_add_config(struct usb_composite_dev *, + * value; it should return zero on successful initialization. + * @unbind: Reverses @bind(); called as a side effect of unregistering + * this driver. ++ * @suspend: Notifies when the host stops sending USB traffic, ++ * after function notifications ++ * @resume: Notifies configuration when the host restarts USB traffic, ++ * before function notifications + * + * Devices default to reporting self powered operation. Devices which rely + * on bus powered operation should report this in their @bind() method. +@@ -268,6 +272,10 @@ struct usb_composite_driver { + + int (*bind)(struct usb_composite_dev *); + int (*unbind)(struct usb_composite_dev *); ++ ++ /* global suspend hooks */ ++ void (*suspend)(struct usb_composite_dev *); ++ void (*resume)(struct usb_composite_dev *); + }; + + extern int usb_composite_register(struct usb_composite_driver *); +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0007-usb-gadget-fix-ethernet-link-reports-to-ethtool.patch b/recipes/linux/linux-omap-2.6.29/musb/0007-usb-gadget-fix-ethernet-link-reports-to-ethtool.patch new file mode 100644 index 0000000000..a89bc2ff5c --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0007-usb-gadget-fix-ethernet-link-reports-to-ethtool.patch @@ -0,0 +1,47 @@ +From 00c4bd07a64061ec9ab9c35f5bf01ec6187138f4 Mon Sep 17 00:00:00 2001 +From: Jonathan McDowell +Date: Thu, 26 Mar 2009 00:45:27 -0700 +Subject: [PATCH] usb gadget: fix ethernet link reports to ethtool + +The g_ether USB gadget driver currently decides whether or not there's a +link to report back for eth_get_link based on if the USB link speed is +set. The USB gadget speed is however often set even before the device is +enumerated. It seems more sensible to only report a "link" if we're +actually connected to a host that wants to talk to us. The patch below +does this for me - tested with the PXA27x UDC driver. + +Signed-Off-By: Jonathan McDowell +Signed-off-by: David Brownell +--- + drivers/usb/gadget/u_ether.c | 8 +------- + 1 files changed, 1 insertions(+), 7 deletions(-) + +diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c +index 96d65ca..4007770 100644 +--- a/drivers/usb/gadget/u_ether.c ++++ b/drivers/usb/gadget/u_ether.c +@@ -175,12 +175,6 @@ static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p) + strlcpy(p->bus_info, dev_name(&dev->gadget->dev), sizeof p->bus_info); + } + +-static u32 eth_get_link(struct net_device *net) +-{ +- struct eth_dev *dev = netdev_priv(net); +- return dev->gadget->speed != USB_SPEED_UNKNOWN; +-} +- + /* REVISIT can also support: + * - WOL (by tracking suspends and issuing remote wakeup) + * - msglevel (implies updated messaging) +@@ -189,7 +183,7 @@ static u32 eth_get_link(struct net_device *net) + + static struct ethtool_ops ops = { + .get_drvinfo = eth_get_drvinfo, +- .get_link = eth_get_link ++ .get_link = ethtool_op_get_link, + }; + + static void defer_kevent(struct eth_dev *dev, int flag) +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0008-usb-musb_host-minor-enqueue-locking-fix-v2.patch b/recipes/linux/linux-omap-2.6.29/musb/0008-usb-musb_host-minor-enqueue-locking-fix-v2.patch new file mode 100644 index 0000000000..8627825b5a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0008-usb-musb_host-minor-enqueue-locking-fix-v2.patch @@ -0,0 +1,60 @@ +From c3b527a21104b6bb61558fba6c65aa80f63e0772 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Thu, 26 Mar 2009 17:36:57 -0700 +Subject: [PATCH] usb: musb_host, minor enqueue locking fix (v2) + +Someone noted that the enqueue path used an unlocked access +for usb_host_endpoint->hcpriv ... fix that, by being safe +and always accessing it under spinlock protection. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 17 ++++++++--------- + 1 files changed, 8 insertions(+), 9 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 499c431..ff09595 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -1841,7 +1841,7 @@ static int musb_urb_enqueue( + unsigned long flags; + struct musb *musb = hcd_to_musb(hcd); + struct usb_host_endpoint *hep = urb->ep; +- struct musb_qh *qh = hep->hcpriv; ++ struct musb_qh *qh; + struct usb_endpoint_descriptor *epd = &hep->desc; + int ret; + unsigned type_reg; +@@ -1853,22 +1853,21 @@ static int musb_urb_enqueue( + + spin_lock_irqsave(&musb->lock, flags); + ret = usb_hcd_link_urb_to_ep(hcd, urb); ++ qh = ret ? NULL : hep->hcpriv; ++ if (qh) ++ urb->hcpriv = qh; + spin_unlock_irqrestore(&musb->lock, flags); +- if (ret) +- return ret; + + /* DMA mapping was already done, if needed, and this urb is on +- * hep->urb_list ... so there's little to do unless hep wasn't +- * yet scheduled onto a live qh. ++ * hep->urb_list now ... so we're done, unless hep wasn't yet ++ * scheduled onto a live qh. + * + * REVISIT best to keep hep->hcpriv valid until the endpoint gets + * disabled, testing for empty qh->ring and avoiding qh setup costs + * except for the first urb queued after a config change. + */ +- if (qh) { +- urb->hcpriv = qh; +- return 0; +- } ++ if (qh || ret) ++ return ret; + + /* Allocate and initialize qh, minimizing the work done each time + * hw_ep gets reprogrammed, or with irqs blocked. Then schedule it. +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0009-usb-musb_host-fix-ep0-fifo-flushing.patch b/recipes/linux/linux-omap-2.6.29/musb/0009-usb-musb_host-fix-ep0-fifo-flushing.patch new file mode 100644 index 0000000000..09fc0a17d0 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0009-usb-musb_host-fix-ep0-fifo-flushing.patch @@ -0,0 +1,93 @@ +From 48ce47b15bfd420982ee275c595a9139eb6fabf7 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Thu, 26 Mar 2009 17:38:30 -0700 +Subject: [PATCH] usb: musb_host, fix ep0 fifo flushing + +The MUSB host side can't share generic TX FIFO flush logic +with EP0; the EP0 TX status register bits are different +from those for other entpoints. + +Resolve this issue by providing a new EP0-specific routine +to flush and reset the FIFO, which pays careful attention to +restrictions listed in the latest programmer's guide. This +gets rid of an open issue whereby the usbtest control write +test (#14) failed. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 38 +++++++++++++++++++++++++------------- + 1 files changed, 25 insertions(+), 13 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index ff09595..a5d75aa 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -125,6 +125,29 @@ static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep) + } + } + ++static void musb_h_ep0_flush_fifo(struct musb_hw_ep *ep) ++{ ++ void __iomem *epio = ep->regs; ++ u16 csr; ++ int retries = 5; ++ ++ /* scrub any data left in the fifo */ ++ do { ++ csr = musb_readw(epio, MUSB_TXCSR); ++ if (!(csr & (MUSB_CSR0_TXPKTRDY | MUSB_CSR0_RXPKTRDY))) ++ break; ++ musb_writew(epio, MUSB_TXCSR, MUSB_CSR0_FLUSHFIFO); ++ csr = musb_readw(epio, MUSB_TXCSR); ++ udelay(10); ++ } while (--retries); ++ ++ WARN(!retries, "Could not flush host TX%d fifo: csr: %04x\n", ++ ep->epnum, csr); ++ ++ /* and reset for the next transfer */ ++ musb_writew(epio, MUSB_TXCSR, 0); ++} ++ + /* + * Start transmit. Caller is responsible for locking shared resources. + * musb must be locked. +@@ -693,11 +716,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + musb_writew(epio, MUSB_TXCSR, csr); + csr = musb_readw(epio, MUSB_TXCSR); + } else { +- /* endpoint 0: just flush */ +- musb_writew(epio, MUSB_CSR0, +- csr | MUSB_CSR0_FLUSHFIFO); +- musb_writew(epio, MUSB_CSR0, +- csr | MUSB_CSR0_FLUSHFIFO); ++ musb_h_ep0_flush_fifo(hw_ep); + } + + /* target addr and (for multipoint) hub addr/port */ +@@ -1063,11 +1082,7 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) + csr &= ~MUSB_CSR0_H_NAKTIMEOUT; + musb_writew(epio, MUSB_CSR0, csr); + } else { +- csr |= MUSB_CSR0_FLUSHFIFO; +- musb_writew(epio, MUSB_CSR0, csr); +- musb_writew(epio, MUSB_CSR0, csr); +- csr &= ~MUSB_CSR0_H_NAKTIMEOUT; +- musb_writew(epio, MUSB_CSR0, csr); ++ musb_h_ep0_flush_fifo(hw_ep); + } + + musb_writeb(epio, MUSB_NAKLIMIT0, 0); +@@ -1081,9 +1096,6 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) + * SHOULD NEVER HAPPEN! */ + ERR("no URB for end 0\n"); + +- musb_writew(epio, MUSB_CSR0, MUSB_CSR0_FLUSHFIFO); +- musb_writew(epio, MUSB_CSR0, MUSB_CSR0_FLUSHFIFO); +- musb_writew(epio, MUSB_CSR0, 0); + + goto done; + } +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0010-musb-sanitize-clearing-TXCSR-DMA-bits-take-2.patch b/recipes/linux/linux-omap-2.6.29/musb/0010-musb-sanitize-clearing-TXCSR-DMA-bits-take-2.patch new file mode 100644 index 0000000000..bcbe3bbe39 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0010-musb-sanitize-clearing-TXCSR-DMA-bits-take-2.patch @@ -0,0 +1,361 @@ +From c99f4a68268801a2e2ffbef9766c3ac89e4fb22c Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Thu, 26 Mar 2009 18:27:47 -0700 +Subject: [PATCH] musb: sanitize clearing TXCSR DMA bits (take 2) + +The MUSB code clears TXCSR_DMAMODE incorrectly in several +places, either asserting that TXCSR_DMAENAB is clear (when +sometimes it isn't) or clearing both bits together. Recent +versions of the programmer's guide require DMAENAB to be +cleared first, although some older ones didn't. + +Fix this and while at it: + + - In musb_gadget::txstate(), stop clearing the AUTOSET + and DMAMODE bits for the CPPI case since they never + get set anyway (the former bit is reserved on DaVinci); + but do clear the DMAENAB bit on the DMA error path. + + - In musb_host::musb_ep_program(), remove the duplicate + DMA controller specific code code clearing the TXCSR + previous state, add the code to clear TXCSR DMA bits + on the Inventra DMA error path, to replace such code + (executed late) on the PIO path. + + - In musbhsdma::dma_channel_abort()/dma_controller_irq(), + add/use the 'offset' variable to avoid MUSB_EP_OFFSET() + invocations on every RXCSR/TXCSR access. + +[dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: don't introduce CamelCase, +shrink diff] + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_gadget.c | 33 +++++++++++------ + drivers/usb/musb/musb_host.c | 79 ++++++++++++++++------------------------ + drivers/usb/musb/musbhsdma.c | 59 ++++++++++++++++++------------ + 3 files changed, 90 insertions(+), 81 deletions(-) + +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index c7ebd08..f79440c 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -165,9 +165,15 @@ static void nuke(struct musb_ep *ep, const int status) + if (is_dma_capable() && ep->dma) { + struct dma_controller *c = ep->musb->dma_controller; + int value; ++ + if (ep->is_in) { ++ /* ++ * The programming guide says that we must not clear ++ * the DMAMODE bit before DMAENAB, so we only ++ * clear it in the second write... ++ */ + musb_writew(epio, MUSB_TXCSR, +- 0 | MUSB_TXCSR_FLUSHFIFO); ++ MUSB_TXCSR_DMAMODE | MUSB_TXCSR_FLUSHFIFO); + musb_writew(epio, MUSB_TXCSR, + 0 | MUSB_TXCSR_FLUSHFIFO); + } else { +@@ -230,7 +236,7 @@ static inline int max_ep_writesize(struct musb *musb, struct musb_ep *ep) + | IN token(s) are recd from Host. + | -> DMA interrupt on completion + | calls TxAvail. +- | -> stop DMA, ~DmaEenab, ++ | -> stop DMA, ~DMAENAB, + | -> set TxPktRdy for last short pkt or zlp + | -> Complete Request + | -> Continue next request (call txstate) +@@ -315,9 +321,17 @@ static void txstate(struct musb *musb, struct musb_request *req) + request->dma, request_size); + if (use_dma) { + if (musb_ep->dma->desired_mode == 0) { +- /* ASSERT: DMAENAB is clear */ +- csr &= ~(MUSB_TXCSR_AUTOSET | +- MUSB_TXCSR_DMAMODE); ++ /* ++ * We must not clear the DMAMODE bit ++ * before the DMAENAB bit -- and the ++ * latter doesn't always get cleared ++ * before we get here... ++ */ ++ csr &= ~(MUSB_TXCSR_AUTOSET ++ | MUSB_TXCSR_DMAENAB); ++ musb_writew(epio, MUSB_TXCSR, csr ++ | MUSB_TXCSR_P_WZC_BITS); ++ csr &= ~MUSB_TXCSR_DMAMODE; + csr |= (MUSB_TXCSR_DMAENAB | + MUSB_TXCSR_MODE); + /* against programming guide */ +@@ -334,10 +348,7 @@ static void txstate(struct musb *musb, struct musb_request *req) + + #elif defined(CONFIG_USB_TI_CPPI_DMA) + /* program endpoint CSR first, then setup DMA */ +- csr &= ~(MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAMODE +- | MUSB_TXCSR_P_UNDERRUN +- | MUSB_TXCSR_TXPKTRDY); ++ csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); + csr |= MUSB_TXCSR_MODE | MUSB_TXCSR_DMAENAB; + musb_writew(epio, MUSB_TXCSR, + (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN) +@@ -364,8 +375,8 @@ static void txstate(struct musb *musb, struct musb_request *req) + if (!use_dma) { + c->channel_release(musb_ep->dma); + musb_ep->dma = NULL; +- /* ASSERT: DMAENAB clear */ +- csr &= ~(MUSB_TXCSR_DMAMODE | MUSB_TXCSR_MODE); ++ csr &= ~MUSB_TXCSR_DMAENAB; ++ musb_writew(epio, MUSB_TXCSR, csr); + /* invariant: prequest->buf is non-null */ + } + #elif defined(CONFIG_USB_TUSB_OMAP_DMA) +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index a5d75aa..6591282 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -590,10 +590,17 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) + csr = musb_readw(ep->regs, MUSB_TXCSR); + if (csr & MUSB_TXCSR_MODE) { + musb_h_tx_flush_fifo(ep); ++ csr = musb_readw(ep->regs, MUSB_TXCSR); + musb_writew(ep->regs, MUSB_TXCSR, +- MUSB_TXCSR_FRCDATATOG); ++ csr | MUSB_TXCSR_FRCDATATOG); + } +- /* clear mode (and everything else) to enable Rx */ ++ ++ /* ++ * Clear the MODE bit (and everything else) to enable Rx. ++ * NOTE: we mustn't clear the DMAMODE bit before DMAENAB. ++ */ ++ if (csr & MUSB_TXCSR_DMAMODE) ++ musb_writew(ep->regs, MUSB_TXCSR, MUSB_TXCSR_DMAMODE); + musb_writew(ep->regs, MUSB_TXCSR, 0); + + /* scrub all previous state, clearing toggle */ +@@ -690,12 +697,17 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + + /* general endpoint setup */ + if (epnum) { +- /* ASSERT: TXCSR_DMAENAB was already cleared */ +- + /* flush all old state, set default */ + musb_h_tx_flush_fifo(hw_ep); ++ ++ /* ++ * We must not clear the DMAMODE bit before or in ++ * the same cycle with the DMAENAB bit, so we clear ++ * the latter first... ++ */ + csr &= ~(MUSB_TXCSR_H_NAKTIMEOUT +- | MUSB_TXCSR_DMAMODE ++ | MUSB_TXCSR_AUTOSET ++ | MUSB_TXCSR_DMAENAB + | MUSB_TXCSR_FRCDATATOG + | MUSB_TXCSR_H_RXSTALL + | MUSB_TXCSR_H_ERROR +@@ -703,16 +715,15 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + ); + csr |= MUSB_TXCSR_MODE; + +- if (usb_gettoggle(urb->dev, +- qh->epnum, 1)) ++ if (usb_gettoggle(urb->dev, qh->epnum, 1)) + csr |= MUSB_TXCSR_H_WR_DATATOGGLE + | MUSB_TXCSR_H_DATATOGGLE; + else + csr |= MUSB_TXCSR_CLRDATATOG; + +- /* twice in case of double packet buffering */ + musb_writew(epio, MUSB_TXCSR, csr); + /* REVISIT may need to clear FLUSHFIFO ... */ ++ csr &= ~MUSB_TXCSR_DMAMODE; + musb_writew(epio, MUSB_TXCSR, csr); + csr = musb_readw(epio, MUSB_TXCSR); + } else { +@@ -755,34 +766,19 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + + #ifdef CONFIG_USB_INVENTRA_DMA + if (dma_channel) { +- +- /* clear previous state */ +- csr = musb_readw(epio, MUSB_TXCSR); +- csr &= ~(MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAMODE +- | MUSB_TXCSR_DMAENAB); +- csr |= MUSB_TXCSR_MODE; +- musb_writew(epio, MUSB_TXCSR, +- csr | MUSB_TXCSR_MODE); +- + qh->segsize = min(len, dma_channel->max_len); +- + if (qh->segsize <= packet_sz) + dma_channel->desired_mode = 0; + else + dma_channel->desired_mode = 1; + +- + if (dma_channel->desired_mode == 0) { +- csr &= ~(MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAMODE); ++ /* Against the programming guide */ + csr |= (MUSB_TXCSR_DMAENAB); +- /* against programming guide */ + } else + csr |= (MUSB_TXCSR_AUTOSET + | MUSB_TXCSR_DMAENAB + | MUSB_TXCSR_DMAMODE); +- + musb_writew(epio, MUSB_TXCSR, csr); + + dma_ok = dma_controller->channel_program( +@@ -799,6 +795,17 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + else + hw_ep->rx_channel = NULL; + dma_channel = NULL; ++ ++ /* ++ * The programming guide says that we must ++ * clear the DMAENAB bit before DMAMODE... ++ */ ++ csr = musb_readw(epio, MUSB_TXCSR); ++ csr &= ~(MUSB_TXCSR_DMAENAB ++ | MUSB_TXCSR_AUTOSET); ++ musb_writew(epio, MUSB_TXCSR, csr); ++ csr &= ~MUSB_TXCSR_DMAMODE; ++ musb_writew(epio, MUSB_TXCSR, csr); + } + } + #endif +@@ -806,18 +813,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + /* candidate for DMA */ + if ((is_cppi_enabled() || tusb_dma_omap()) && dma_channel) { + +- /* program endpoint CSRs first, then setup DMA. +- * assume CPPI setup succeeds. +- * defer enabling dma. +- */ +- csr = musb_readw(epio, MUSB_TXCSR); +- csr &= ~(MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAMODE +- | MUSB_TXCSR_DMAENAB); +- csr |= MUSB_TXCSR_MODE; +- musb_writew(epio, MUSB_TXCSR, +- csr | MUSB_TXCSR_MODE); +- ++ /* Defer enabling DMA */ + dma_channel->actual_len = 0L; + qh->segsize = len; + +@@ -846,20 +842,9 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + } + + if (load_count) { +- /* ASSERT: TXCSR_DMAENAB was already cleared */ +- + /* PIO to load FIFO */ + qh->segsize = load_count; + musb_write_fifo(hw_ep, load_count, buf); +- csr = musb_readw(epio, MUSB_TXCSR); +- csr &= ~(MUSB_TXCSR_DMAENAB +- | MUSB_TXCSR_DMAMODE +- | MUSB_TXCSR_AUTOSET); +- /* write CSR */ +- csr |= MUSB_TXCSR_MODE; +- +- if (epnum) +- musb_writew(epio, MUSB_TXCSR, csr); + } + + /* re-enable interrupt */ +diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c +index 8662e9e..40709c3 100644 +--- a/drivers/usb/musb/musbhsdma.c ++++ b/drivers/usb/musb/musbhsdma.c +@@ -195,30 +195,32 @@ static int dma_channel_abort(struct dma_channel *channel) + void __iomem *mbase = musb_channel->controller->base; + + u8 bchannel = musb_channel->idx; ++ int offset; + u16 csr; + + if (channel->status == MUSB_DMA_STATUS_BUSY) { + if (musb_channel->transmit) { +- +- csr = musb_readw(mbase, +- MUSB_EP_OFFSET(musb_channel->epnum, +- MUSB_TXCSR)); +- csr &= ~(MUSB_TXCSR_AUTOSET | +- MUSB_TXCSR_DMAENAB | +- MUSB_TXCSR_DMAMODE); +- musb_writew(mbase, +- MUSB_EP_OFFSET(musb_channel->epnum, MUSB_TXCSR), +- csr); ++ offset = MUSB_EP_OFFSET(musb_channel->epnum, ++ MUSB_TXCSR); ++ ++ /* ++ * The programming guide says that we must clear ++ * the DMAENAB bit before the DMAMODE bit... ++ */ ++ csr = musb_readw(mbase, offset); ++ csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAENAB); ++ musb_writew(mbase, offset, csr); ++ csr &= ~MUSB_TXCSR_DMAMODE; ++ musb_writew(mbase, offset, csr); + } else { +- csr = musb_readw(mbase, +- MUSB_EP_OFFSET(musb_channel->epnum, +- MUSB_RXCSR)); ++ offset = MUSB_EP_OFFSET(musb_channel->epnum, ++ MUSB_RXCSR); ++ ++ csr = musb_readw(mbase, offset); + csr &= ~(MUSB_RXCSR_AUTOCLEAR | + MUSB_RXCSR_DMAENAB | + MUSB_RXCSR_DMAMODE); +- musb_writew(mbase, +- MUSB_EP_OFFSET(musb_channel->epnum, MUSB_RXCSR), +- csr); ++ musb_writew(mbase, offset, csr); + } + + musb_writew(mbase, +@@ -296,14 +298,25 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) + && ((channel->desired_mode == 0) + || (channel->actual_len & + (musb_channel->max_packet_sz - 1))) +- ) { ++ ) { ++ u8 epnum = musb_channel->epnum; ++ int offset = MUSB_EP_OFFSET(epnum, ++ MUSB_TXCSR); ++ u16 txcsr; ++ ++ /* ++ * The programming guide says that we ++ * must clear DMAENAB before DMAMODE. ++ */ ++ musb_ep_select(mbase, epnum); ++ txcsr = musb_readw(mbase, offset); ++ txcsr &= ~(MUSB_TXCSR_DMAENAB ++ | MUSB_TXCSR_AUTOSET); ++ musb_writew(mbase, offset, txcsr); + /* Send out the packet */ +- musb_ep_select(mbase, +- musb_channel->epnum); +- musb_writew(mbase, MUSB_EP_OFFSET( +- musb_channel->epnum, +- MUSB_TXCSR), +- MUSB_TXCSR_TXPKTRDY); ++ txcsr &= ~MUSB_TXCSR_DMAMODE; ++ txcsr |= MUSB_TXCSR_TXPKTRDY; ++ musb_writew(mbase, offset, txcsr); + } else { + musb_dma_completion( + musb, +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0011-musb-fix-isochronous-TXDMA-take-2.patch b/recipes/linux/linux-omap-2.6.29/musb/0011-musb-fix-isochronous-TXDMA-take-2.patch new file mode 100644 index 0000000000..7d546e10b0 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0011-musb-fix-isochronous-TXDMA-take-2.patch @@ -0,0 +1,417 @@ +From 035cd4a26e9b1638b4b0419b98409026176563ca Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Thu, 26 Mar 2009 18:29:19 -0700 +Subject: [PATCH] musb: fix isochronous TXDMA (take 2) + +Multi-frame isochronous TX URBs transfers in DMA mode never +complete with CPPI DMA because musb_host_tx() doesn't restart +DMA on the second frame, only emitting a debug message. +With Inventra DMA they complete, but in PIO mode. To fix: + + - Factor out programming of the DMA transfer from + musb_ep_program() into musb_tx_dma_program(); + + - Reorder the code at the end of musb_host_tx() to + facilitate the fallback to PIO iff DMA fails; + + - Handle the buffer offset consistently for both + PIO and DMA modes; + + - Add an argument to musb_ep_program() for the same + reason (it only worked correctly with non-zero + offset of the first frame in PIO mode); + + - Set the completed isochronous frame descriptor's + 'actual_length' and 'status' fields correctly in + DMA mode. + +Also, since CPPI reportedly doesn't like sending isochronous +packets in the RNDIS mode, change the criterion for this +mode to be used only for multi-packet transfers. (There's +no need for that mode in the single-packet case anyway.) + +[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: split comment paragraph +into bullet list, shrink patch delta, style tweaks ] + +Signed-off-by: Pavel Kiryukhin +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/cppi_dma.c | 1 + + drivers/usb/musb/musb_host.c | 227 +++++++++++++++++++----------------------- + 2 files changed, 105 insertions(+), 123 deletions(-) + +diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c +index 569ef0f..ac7227c 100644 +--- a/drivers/usb/musb/cppi_dma.c ++++ b/drivers/usb/musb/cppi_dma.c +@@ -579,6 +579,7 @@ cppi_next_tx_segment(struct musb *musb, struct cppi_channel *tx) + * trigger the "send a ZLP?" confusion. + */ + rndis = (maxpacket & 0x3f) == 0 ++ && length > maxpacket + && length < 0xffff + && (length % maxpacket) != 0; + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 6591282..f6e84a0 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -96,8 +96,8 @@ + + + static void musb_ep_program(struct musb *musb, u8 epnum, +- struct urb *urb, unsigned int nOut, +- u8 *buf, u32 len); ++ struct urb *urb, int is_out, ++ u8 *buf, u32 offset, u32 len); + + /* + * Clear TX fifo. Needed to avoid BABBLE errors. +@@ -189,9 +189,10 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + { + u16 frame; + u32 len; +- void *buf; + void __iomem *mbase = musb->mregs; + struct urb *urb = next_urb(qh); ++ void *buf = urb->transfer_buffer; ++ u32 offset = 0; + struct musb_hw_ep *hw_ep = qh->hw_ep; + unsigned pipe = urb->pipe; + u8 address = usb_pipedevice(pipe); +@@ -214,7 +215,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + case USB_ENDPOINT_XFER_ISOC: + qh->iso_idx = 0; + qh->frame = 0; +- buf = urb->transfer_buffer + urb->iso_frame_desc[0].offset; ++ offset = urb->iso_frame_desc[0].offset; + len = urb->iso_frame_desc[0].length; + break; + default: /* bulk, interrupt */ +@@ -232,14 +233,14 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + case USB_ENDPOINT_XFER_ISOC: s = "-iso"; break; + default: s = "-intr"; break; + }; s; }), +- epnum, buf, len); ++ epnum, buf + offset, len); + + /* Configure endpoint */ + if (is_in || hw_ep->is_shared_fifo) + hw_ep->in_qh = qh; + else + hw_ep->out_qh = qh; +- musb_ep_program(musb, epnum, urb, !is_in, buf, len); ++ musb_ep_program(musb, epnum, urb, !is_in, buf, offset, len); + + /* transmit may have more work: start it when it is time */ + if (is_in) +@@ -250,7 +251,6 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + case USB_ENDPOINT_XFER_ISOC: + case USB_ENDPOINT_XFER_INT: + DBG(3, "check whether there's still time for periodic Tx\n"); +- qh->iso_idx = 0; + frame = musb_readw(mbase, MUSB_FRAME); + /* FIXME this doesn't implement that scheduling policy ... + * or handle framecounter wrapping +@@ -631,14 +631,68 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) + ep->rx_reinit = 0; + } + ++static bool musb_tx_dma_program(struct dma_controller *dma, ++ struct musb_hw_ep *hw_ep, struct musb_qh *qh, ++ struct urb *urb, u32 offset, u32 length) ++{ ++ struct dma_channel *channel = hw_ep->tx_channel; ++ void __iomem *epio = hw_ep->regs; ++ u16 pkt_size = qh->maxpacket; ++ u16 csr; ++ u8 mode; ++ ++#ifdef CONFIG_USB_INVENTRA_DMA ++ if (length > channel->max_len) ++ length = channel->max_len; ++ ++ csr = musb_readw(epio, MUSB_TXCSR); ++ if (length > pkt_size) { ++ mode = 1; ++ csr |= MUSB_TXCSR_AUTOSET ++ | MUSB_TXCSR_DMAMODE ++ | MUSB_TXCSR_DMAENAB; ++ } else { ++ mode = 0; ++ csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE); ++ csr |= MUSB_TXCSR_DMAENAB; /* against programmer's guide */ ++ } ++ channel->desired_mode = mode; ++ musb_writew(epio, MUSB_TXCSR, csr); ++#else ++ if (!is_cppi_enabled() && !tusb_dma_omap()) ++ return false; ++ ++ channel->actual_len = 0; ++ ++ /* ++ * TX uses "RNDIS" mode automatically but needs help ++ * to identify the zero-length-final-packet case. ++ */ ++ mode = (urb->transfer_flags & URB_ZERO_PACKET) ? 1 : 0; ++#endif ++ ++ qh->segsize = length; ++ ++ if (!dma->channel_program(channel, pkt_size, mode, ++ urb->transfer_dma + offset, length)) { ++ dma->channel_release(channel); ++ hw_ep->tx_channel = NULL; ++ ++ csr = musb_readw(epio, MUSB_TXCSR); ++ csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAENAB); ++ musb_writew(epio, MUSB_TXCSR, csr | MUSB_TXCSR_H_WZC_BITS); ++ return false; ++ } ++ return true; ++} + + /* + * Program an HDRC endpoint as per the given URB + * Context: irqs blocked, controller lock held + */ + static void musb_ep_program(struct musb *musb, u8 epnum, +- struct urb *urb, unsigned int is_out, +- u8 *buf, u32 len) ++ struct urb *urb, int is_out, ++ u8 *buf, u32 offset, u32 len) + { + struct dma_controller *dma_controller; + struct dma_channel *dma_channel; +@@ -764,82 +818,9 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + else + load_count = min((u32) packet_sz, len); + +-#ifdef CONFIG_USB_INVENTRA_DMA +- if (dma_channel) { +- qh->segsize = min(len, dma_channel->max_len); +- if (qh->segsize <= packet_sz) +- dma_channel->desired_mode = 0; +- else +- dma_channel->desired_mode = 1; +- +- if (dma_channel->desired_mode == 0) { +- /* Against the programming guide */ +- csr |= (MUSB_TXCSR_DMAENAB); +- } else +- csr |= (MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAENAB +- | MUSB_TXCSR_DMAMODE); +- musb_writew(epio, MUSB_TXCSR, csr); +- +- dma_ok = dma_controller->channel_program( +- dma_channel, packet_sz, +- dma_channel->desired_mode, +- urb->transfer_dma, +- qh->segsize); +- if (dma_ok) { +- load_count = 0; +- } else { +- dma_controller->channel_release(dma_channel); +- if (is_out) +- hw_ep->tx_channel = NULL; +- else +- hw_ep->rx_channel = NULL; +- dma_channel = NULL; +- +- /* +- * The programming guide says that we must +- * clear the DMAENAB bit before DMAMODE... +- */ +- csr = musb_readw(epio, MUSB_TXCSR); +- csr &= ~(MUSB_TXCSR_DMAENAB +- | MUSB_TXCSR_AUTOSET); +- musb_writew(epio, MUSB_TXCSR, csr); +- csr &= ~MUSB_TXCSR_DMAMODE; +- musb_writew(epio, MUSB_TXCSR, csr); +- } +- } +-#endif +- +- /* candidate for DMA */ +- if ((is_cppi_enabled() || tusb_dma_omap()) && dma_channel) { +- +- /* Defer enabling DMA */ +- dma_channel->actual_len = 0L; +- qh->segsize = len; +- +- /* TX uses "rndis" mode automatically, but needs help +- * to identify the zero-length-final-packet case. +- */ +- dma_ok = dma_controller->channel_program( +- dma_channel, packet_sz, +- (urb->transfer_flags +- & URB_ZERO_PACKET) +- == URB_ZERO_PACKET, +- urb->transfer_dma, +- qh->segsize); +- if (dma_ok) { +- load_count = 0; +- } else { +- dma_controller->channel_release(dma_channel); +- hw_ep->tx_channel = NULL; +- dma_channel = NULL; +- +- /* REVISIT there's an error path here that +- * needs handling: can't do dma, but +- * there's no pio buffer address... +- */ +- } +- } ++ if (dma_channel && musb_tx_dma_program(dma_controller, ++ hw_ep, qh, urb, offset, len)) ++ load_count = 0; + + if (load_count) { + /* PIO to load FIFO */ +@@ -899,7 +880,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + dma_channel, packet_sz, + !(urb->transfer_flags + & URB_SHORT_NOT_OK), +- urb->transfer_dma, ++ urb->transfer_dma + offset, + qh->segsize); + if (!dma_ok) { + dma_controller->channel_release( +@@ -1142,8 +1123,8 @@ void musb_host_tx(struct musb *musb, u8 epnum) + int pipe; + bool done = false; + u16 tx_csr; +- size_t wLength = 0; +- u8 *buf = NULL; ++ size_t length = 0; ++ size_t offset = 0; + struct urb *urb; + struct musb_hw_ep *hw_ep = musb->endpoints + epnum; + void __iomem *epio = hw_ep->regs; +@@ -1161,7 +1142,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) + /* with CPPI, DMA sometimes triggers "extra" irqs */ + if (!urb) { + DBG(4, "extra TX%d ready, csr %04x\n", epnum, tx_csr); +- goto finish; ++ return; + } + + pipe = urb->pipe; +@@ -1198,7 +1179,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) + musb_writew(epio, MUSB_TXCSR, + MUSB_TXCSR_H_WZC_BITS + | MUSB_TXCSR_TXPKTRDY); +- goto finish; ++ return; + } + + if (status) { +@@ -1230,29 +1211,28 @@ void musb_host_tx(struct musb *musb, u8 epnum) + /* second cppi case */ + if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { + DBG(4, "extra TX%d ready, csr %04x\n", epnum, tx_csr); +- goto finish; +- ++ return; + } + +- /* REVISIT this looks wrong... */ + if (!status || dma || usb_pipeisoc(pipe)) { + if (dma) +- wLength = dma->actual_len; ++ length = dma->actual_len; + else +- wLength = qh->segsize; +- qh->offset += wLength; ++ length = qh->segsize; ++ qh->offset += length; + + if (usb_pipeisoc(pipe)) { + struct usb_iso_packet_descriptor *d; + + d = urb->iso_frame_desc + qh->iso_idx; +- d->actual_length = qh->segsize; ++ d->actual_length = length; ++ d->status = status; + if (++qh->iso_idx >= urb->number_of_packets) { + done = true; + } else { + d++; +- buf = urb->transfer_buffer + d->offset; +- wLength = d->length; ++ offset = d->offset; ++ length = d->length; + } + } else if (dma) { + done = true; +@@ -1265,10 +1245,8 @@ void musb_host_tx(struct musb *musb, u8 epnum) + & URB_ZERO_PACKET)) + done = true; + if (!done) { +- buf = urb->transfer_buffer +- + qh->offset; +- wLength = urb->transfer_buffer_length +- - qh->offset; ++ offset = qh->offset; ++ length = urb->transfer_buffer_length - offset; + } + } + } +@@ -1287,28 +1265,31 @@ void musb_host_tx(struct musb *musb, u8 epnum) + urb->status = status; + urb->actual_length = qh->offset; + musb_advance_schedule(musb, urb, hw_ep, USB_DIR_OUT); ++ return; ++ } else if (usb_pipeisoc(pipe) && dma) { ++ if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, ++ offset, length)) ++ return; ++ } else if (tx_csr & MUSB_TXCSR_DMAENAB) { ++ DBG(1, "not complete, but DMA enabled?\n"); ++ return; ++ } + +- } else if (!(tx_csr & MUSB_TXCSR_DMAENAB)) { +- /* WARN_ON(!buf); */ +- +- /* REVISIT: some docs say that when hw_ep->tx_double_buffered, +- * (and presumably, fifo is not half-full) we should write TWO +- * packets before updating TXCSR ... other docs disagree ... +- */ +- /* PIO: start next packet in this URB */ +- if (wLength > qh->maxpacket) +- wLength = qh->maxpacket; +- musb_write_fifo(hw_ep, wLength, buf); +- qh->segsize = wLength; +- +- musb_ep_select(mbase, epnum); +- musb_writew(epio, MUSB_TXCSR, +- MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); +- } else +- DBG(1, "not complete, but dma enabled?\n"); ++ /* ++ * PIO: start next packet in this URB. ++ * ++ * REVISIT: some docs say that when hw_ep->tx_double_buffered, ++ * (and presumably, FIFO is not half-full) we should write *two* ++ * packets before updating TXCSR; other docs disagree... ++ */ ++ if (length > qh->maxpacket) ++ length = qh->maxpacket; ++ musb_write_fifo(hw_ep, length, urb->transfer_buffer + offset); ++ qh->segsize = length; + +-finish: +- return; ++ musb_ep_select(mbase, epnum); ++ musb_writew(epio, MUSB_TXCSR, ++ MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); + } + + +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0012-musb-fix-possible-panic-while-resuming.patch b/recipes/linux/linux-omap-2.6.29/musb/0012-musb-fix-possible-panic-while-resuming.patch new file mode 100644 index 0000000000..2bbde84c16 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0012-musb-fix-possible-panic-while-resuming.patch @@ -0,0 +1,56 @@ +From b9a61b80ea89d9d6d78a23d96a28df94fd612298 Mon Sep 17 00:00:00 2001 +From: Kim Kyuwon +Date: Thu, 26 Mar 2009 18:56:51 -0700 +Subject: [PATCH] musb: fix possible panic while resuming + +During driver resume processing, musb could cause a kernel panic. +Fix by enabling the clock earlier, with the resume_early method. + +Signed-off-by: Kim Kyuwon +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_core.c | 8 ++------ + 1 files changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index 338cd16..3019725 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -2170,16 +2170,13 @@ static int musb_suspend(struct platform_device *pdev, pm_message_t message) + return 0; + } + +-static int musb_resume(struct platform_device *pdev) ++static int musb_resume_early(struct platform_device *pdev) + { +- unsigned long flags; + struct musb *musb = dev_to_musb(&pdev->dev); + + if (!musb->clock) + return 0; + +- spin_lock_irqsave(&musb->lock, flags); +- + if (musb->set_clock) + musb->set_clock(musb->clock, 1); + else +@@ -2189,7 +2186,6 @@ static int musb_resume(struct platform_device *pdev) + * unless for some reason the whole soc powered down and we're + * not treating that as a whole-system restart (e.g. swsusp) + */ +- spin_unlock_irqrestore(&musb->lock, flags); + return 0; + } + +@@ -2207,7 +2203,7 @@ static struct platform_driver musb_driver = { + .remove = __devexit_p(musb_remove), + .shutdown = musb_shutdown, + .suspend = musb_suspend, +- .resume = musb_resume, ++ .resume_early = musb_resume_early, + }; + + /*-------------------------------------------------------------------------*/ +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0013-musb_host-refactor-musb_save_toggle-take-2.patch b/recipes/linux/linux-omap-2.6.29/musb/0013-musb_host-refactor-musb_save_toggle-take-2.patch new file mode 100644 index 0000000000..0202871d41 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0013-musb_host-refactor-musb_save_toggle-take-2.patch @@ -0,0 +1,91 @@ +From 2658f7c9029967501cd4d749364f2e02d02eebd5 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:54:21 -0700 +Subject: [PATCH] musb_host: refactor musb_save_toggle() (take 2) + +Refactor musb_save_toggle() as follows: + + - replace 'struct musb_hw_ep *ep' parameter by 'struct + musb_qh *qh' to avoid re-calculating this value + + - move usb_settogle() call out of the *if* operator. + +This is a net minor shrink of source and object code. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 35 ++++++++++++----------------------- + 1 files changed, 12 insertions(+), 23 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index f6e84a0..dc32ce4 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -318,35 +318,24 @@ __acquires(musb->lock) + spin_lock(&musb->lock); + } + +-/* for bulk/interrupt endpoints only */ +-static inline void +-musb_save_toggle(struct musb_hw_ep *ep, int is_in, struct urb *urb) ++/* For bulk/interrupt endpoints only */ ++static inline void musb_save_toggle(struct musb_qh *qh, int is_in, ++ struct urb *urb) + { +- struct usb_device *udev = urb->dev; ++ void __iomem *epio = qh->hw_ep->regs; + u16 csr; +- void __iomem *epio = ep->regs; +- struct musb_qh *qh; + +- /* FIXME: the current Mentor DMA code seems to have ++ /* ++ * FIXME: the current Mentor DMA code seems to have + * problems getting toggle correct. + */ + +- if (is_in || ep->is_shared_fifo) +- qh = ep->in_qh; ++ if (is_in) ++ csr = musb_readw(epio, MUSB_RXCSR) & MUSB_RXCSR_H_DATATOGGLE; + else +- qh = ep->out_qh; ++ csr = musb_readw(epio, MUSB_TXCSR) & MUSB_TXCSR_H_DATATOGGLE; + +- if (!is_in) { +- csr = musb_readw(epio, MUSB_TXCSR); +- usb_settoggle(udev, qh->epnum, 1, +- (csr & MUSB_TXCSR_H_DATATOGGLE) +- ? 1 : 0); +- } else { +- csr = musb_readw(epio, MUSB_RXCSR); +- usb_settoggle(udev, qh->epnum, 0, +- (csr & MUSB_RXCSR_H_DATATOGGLE) +- ? 1 : 0); +- } ++ usb_settoggle(urb->dev, qh->epnum, !is_in, csr ? 1 : 0); + } + + /* caller owns controller lock, irqs are blocked */ +@@ -362,7 +351,7 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + switch (qh->type) { + case USB_ENDPOINT_XFER_BULK: + case USB_ENDPOINT_XFER_INT: +- musb_save_toggle(ep, is_in, urb); ++ musb_save_toggle(qh, is_in, urb); + break; + case USB_ENDPOINT_XFER_ISOC: + if (status == 0 && urb->error_count) +@@ -1362,7 +1351,7 @@ static void musb_bulk_rx_nak_timeout(struct musb *musb, struct musb_hw_ep *ep) + urb->actual_length += dma->actual_len; + dma->actual_len = 0L; + } +- musb_save_toggle(ep, 1, urb); ++ musb_save_toggle(cur_qh, 1, urb); + + /* move cur_qh to end of queue */ + list_move_tail(&cur_qh->ring, &musb->in_bulk); +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0014-musb_gadget-suppress-parasitic-TX-interrupts-with.patch b/recipes/linux/linux-omap-2.6.29/musb/0014-musb_gadget-suppress-parasitic-TX-interrupts-with.patch new file mode 100644 index 0000000000..08e08a8538 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0014-musb_gadget-suppress-parasitic-TX-interrupts-with.patch @@ -0,0 +1,32 @@ +From 7766f2ea909b73f56d21746485069e02839b75f1 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:53:32 -0700 +Subject: [PATCH] musb_gadget: suppress "parasitic" TX interrupts with CPPI + +Suppress "parasitic" endpoint interrupts in the DMA mode +when using CPPI DMA driver; they're caused by the MUSB gadget +driver using the DMA request mode 0 instead of the mode 1. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_gadget.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index f79440c..bc197b2 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -349,7 +349,8 @@ static void txstate(struct musb *musb, struct musb_request *req) + #elif defined(CONFIG_USB_TI_CPPI_DMA) + /* program endpoint CSR first, then setup DMA */ + csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); +- csr |= MUSB_TXCSR_MODE | MUSB_TXCSR_DMAENAB; ++ csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE | ++ MUSB_TXCSR_MODE; + musb_writew(epio, MUSB_TXCSR, + (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN) + | csr); +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0015-musb_gadget-fix-unhandled-endpoint-0-IRQs.patch b/recipes/linux/linux-omap-2.6.29/musb/0015-musb_gadget-fix-unhandled-endpoint-0-IRQs.patch new file mode 100644 index 0000000000..7115b152d9 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0015-musb_gadget-fix-unhandled-endpoint-0-IRQs.patch @@ -0,0 +1,202 @@ +From 5424305125492a2417bde7c6d23ee4b84e25f6be Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:52:43 -0700 +Subject: [PATCH] musb_gadget: fix unhandled endpoint 0 IRQs + +The gadget EP0 code routinely ignores an interrupt at end of +the data phase because of musb_g_ep0_giveback() resetting the +state machine to "idle, waiting for SETUP" phase prematurely. + +The driver also prematurely leaves the status phase on +receiving the SetupEnd interrupt. + +As there were still unhandled endpoint 0 interrupts happening +from time to time after fixing these issues, there turned to +be yet another culprit: two distinct gadget states collapsed +into one. + +The (missing) state that comes after STATUS IN/OUT states was +typically indiscernible from them since the corresponding +interrupts tend to happen within too little period of time +(due to only a zero-length status packet in between) and so +they got coalesced; yet this state is not the same as the next +one which is associated with the reception of a SETUP packet. + +Adding this extra state seems to have fixed the rest of the +unhandled interrupts that generic_interrupt() and +davinci_interrupt() hid by faking their result and only +emitting a debug message -- so, stop doing that. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/davinci.c | 7 +---- + drivers/usb/musb/musb_core.c | 8 +----- + drivers/usb/musb/musb_core.h | 3 +- + drivers/usb/musb/musb_gadget_ep0.c | 45 +++++++++++++++++++++++++++++++---- + 4 files changed, 43 insertions(+), 20 deletions(-) + +diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c +index 2dc7606..399c435 100644 +--- a/drivers/usb/musb/davinci.c ++++ b/drivers/usb/musb/davinci.c +@@ -357,12 +357,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) + + spin_unlock_irqrestore(&musb->lock, flags); + +- /* REVISIT we sometimes get unhandled IRQs +- * (e.g. ep0). not clear why... +- */ +- if (retval != IRQ_HANDLED) +- DBG(5, "unhandled? %08x\n", tmp); +- return IRQ_HANDLED; ++ return retval; + } + + int musb_platform_set_mode(struct musb *musb, u8 mode) +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index 3019725..a1de43b 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -1481,13 +1481,7 @@ static irqreturn_t generic_interrupt(int irq, void *__hci) + + spin_unlock_irqrestore(&musb->lock, flags); + +- /* REVISIT we sometimes get spurious IRQs on g_ep0 +- * not clear why... +- */ +- if (retval != IRQ_HANDLED) +- DBG(5, "spurious?\n"); +- +- return IRQ_HANDLED; ++ return retval; + } + + #else +diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h +index adf1806..f56a56c 100644 +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -171,7 +171,8 @@ enum musb_h_ep0_state { + + /* peripheral side ep0 states */ + enum musb_g_ep0_state { +- MUSB_EP0_STAGE_SETUP, /* idle, waiting for setup */ ++ MUSB_EP0_STAGE_IDLE, /* idle, waiting for SETUP */ ++ MUSB_EP0_STAGE_SETUP, /* received SETUP */ + MUSB_EP0_STAGE_TX, /* IN data */ + MUSB_EP0_STAGE_RX, /* OUT data */ + MUSB_EP0_STAGE_STATUSIN, /* (after OUT data) */ +diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c +index 3f5e30d..ec0e899 100644 +--- a/drivers/usb/musb/musb_gadget_ep0.c ++++ b/drivers/usb/musb/musb_gadget_ep0.c +@@ -4,6 +4,7 @@ + * Copyright 2005 Mentor Graphics Corporation + * Copyright (C) 2005-2006 by Texas Instruments + * Copyright (C) 2006-2007 Nokia Corporation ++ * Copyright (C) 2008-2009 MontaVista Software, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License +@@ -58,7 +59,8 @@ + static char *decode_ep0stage(u8 stage) + { + switch (stage) { +- case MUSB_EP0_STAGE_SETUP: return "idle"; ++ case MUSB_EP0_STAGE_IDLE: return "idle"; ++ case MUSB_EP0_STAGE_SETUP: return "setup"; + case MUSB_EP0_STAGE_TX: return "in"; + case MUSB_EP0_STAGE_RX: return "out"; + case MUSB_EP0_STAGE_ACKWAIT: return "wait"; +@@ -628,7 +630,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) + musb_writew(regs, MUSB_CSR0, + csr & ~MUSB_CSR0_P_SENTSTALL); + retval = IRQ_HANDLED; +- musb->ep0_state = MUSB_EP0_STAGE_SETUP; ++ musb->ep0_state = MUSB_EP0_STAGE_IDLE; + csr = musb_readw(regs, MUSB_CSR0); + } + +@@ -636,7 +638,18 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) + if (csr & MUSB_CSR0_P_SETUPEND) { + musb_writew(regs, MUSB_CSR0, MUSB_CSR0_P_SVDSETUPEND); + retval = IRQ_HANDLED; +- musb->ep0_state = MUSB_EP0_STAGE_SETUP; ++ /* Transition into the early status phase */ ++ switch (musb->ep0_state) { ++ case MUSB_EP0_STAGE_TX: ++ musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; ++ break; ++ case MUSB_EP0_STAGE_RX: ++ musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; ++ break; ++ default: ++ ERR("SetupEnd came in a wrong ep0stage %s", ++ decode_ep0stage(musb->ep0_state)); ++ } + csr = musb_readw(regs, MUSB_CSR0); + /* NOTE: request may need completion */ + } +@@ -697,11 +710,31 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) + if (req) + musb_g_ep0_giveback(musb, req); + } ++ ++ /* ++ * In case when several interrupts can get coalesced, ++ * check to see if we've already received a SETUP packet... ++ */ ++ if (csr & MUSB_CSR0_RXPKTRDY) ++ goto setup; ++ ++ retval = IRQ_HANDLED; ++ musb->ep0_state = MUSB_EP0_STAGE_IDLE; ++ break; ++ ++ case MUSB_EP0_STAGE_IDLE: ++ /* ++ * This state is typically (but not always) indiscernible ++ * from the status states since the corresponding interrupts ++ * tend to happen within too little period of time (with only ++ * a zero-length packet in between) and so get coalesced... ++ */ + retval = IRQ_HANDLED; + musb->ep0_state = MUSB_EP0_STAGE_SETUP; + /* FALLTHROUGH */ + + case MUSB_EP0_STAGE_SETUP: ++setup: + if (csr & MUSB_CSR0_RXPKTRDY) { + struct usb_ctrlrequest setup; + int handled = 0; +@@ -783,7 +816,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) + stall: + DBG(3, "stall (%d)\n", handled); + musb->ackpend |= MUSB_CSR0_P_SENDSTALL; +- musb->ep0_state = MUSB_EP0_STAGE_SETUP; ++ musb->ep0_state = MUSB_EP0_STAGE_IDLE; + finish: + musb_writew(regs, MUSB_CSR0, + musb->ackpend); +@@ -803,7 +836,7 @@ finish: + /* "can't happen" */ + WARN_ON(1); + musb_writew(regs, MUSB_CSR0, MUSB_CSR0_P_SENDSTALL); +- musb->ep0_state = MUSB_EP0_STAGE_SETUP; ++ musb->ep0_state = MUSB_EP0_STAGE_IDLE; + break; + } + +@@ -959,7 +992,7 @@ static int musb_g_ep0_halt(struct usb_ep *e, int value) + + csr |= MUSB_CSR0_P_SENDSTALL; + musb_writew(regs, MUSB_CSR0, csr); +- musb->ep0_state = MUSB_EP0_STAGE_SETUP; ++ musb->ep0_state = MUSB_EP0_STAGE_IDLE; + musb->ackpend = 0; + break; + default: +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0016-musb_host-factor-out-musb_ep_-get-set-_qh.patch b/recipes/linux/linux-omap-2.6.29/musb/0016-musb_host-factor-out-musb_ep_-get-set-_qh.patch new file mode 100644 index 0000000000..a2f54ff47b --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0016-musb_host-factor-out-musb_ep_-get-set-_qh.patch @@ -0,0 +1,146 @@ +From f9ca8154cf395ec00129f12016697ef610a826ff Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:55:16 -0700 +Subject: [PATCH] musb_host: factor out musb_ep_{get|set}_qh() + +Factor out the often used code to get/set the active 'qh' +pointer for the hardware endpoint. Change the way the case +of a shared FIFO is handled by setting *both* 'in_qh' and +'out_qh' fields of 'struct musb_hw_ep'. That seems more +consistent and makes getting to the current 'qh' easy when +the code knows the direction beforehand. + +While at it, turn some assignments into intializers and +fix declaration style in the vicinity. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 56 ++++++++++++++++------------------------- + 1 files changed, 22 insertions(+), 34 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index dc32ce4..bc89079 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -178,6 +178,19 @@ static inline void cppi_host_txdma_start(struct musb_hw_ep *ep) + musb_writew(ep->regs, MUSB_TXCSR, txcsr); + } + ++static void musb_ep_set_qh(struct musb_hw_ep *ep, int is_in, struct musb_qh *qh) ++{ ++ if (is_in != 0 || ep->is_shared_fifo) ++ ep->in_qh = qh; ++ if (is_in == 0 || ep->is_shared_fifo) ++ ep->out_qh = qh; ++} ++ ++static struct musb_qh *musb_ep_get_qh(struct musb_hw_ep *ep, int is_in) ++{ ++ return is_in ? ep->in_qh : ep->out_qh; ++} ++ + /* + * Start the URB at the front of an endpoint's queue + * end must be claimed from the caller. +@@ -207,7 +220,6 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + case USB_ENDPOINT_XFER_CONTROL: + /* control transfers always start with SETUP */ + is_in = 0; +- hw_ep->out_qh = qh; + musb->ep0_stage = MUSB_EP0_START; + buf = urb->setup_packet; + len = 8; +@@ -236,10 +248,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) + epnum, buf + offset, len); + + /* Configure endpoint */ +- if (is_in || hw_ep->is_shared_fifo) +- hw_ep->in_qh = qh; +- else +- hw_ep->out_qh = qh; ++ musb_ep_set_qh(hw_ep, is_in, qh); + musb_ep_program(musb, epnum, urb, !is_in, buf, offset, len); + + /* transmit may have more work: start it when it is time */ +@@ -374,11 +383,8 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + else + ep->tx_reinit = 1; + +- /* clobber old pointers to this qh */ +- if (is_in || ep->is_shared_fifo) +- ep->in_qh = NULL; +- else +- ep->out_qh = NULL; ++ /* Clobber old pointers to this qh */ ++ musb_ep_set_qh(ep, is_in, NULL); + qh->hep->hcpriv = NULL; + + switch (qh->type) { +@@ -421,12 +427,7 @@ static void + musb_advance_schedule(struct musb *musb, struct urb *urb, + struct musb_hw_ep *hw_ep, int is_in) + { +- struct musb_qh *qh; +- +- if (is_in || hw_ep->is_shared_fifo) +- qh = hw_ep->in_qh; +- else +- qh = hw_ep->out_qh; ++ struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in); + + if (urb->status == -EINPROGRESS) + qh = musb_giveback(qh, urb, 0); +@@ -689,15 +690,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum, + void __iomem *mbase = musb->mregs; + struct musb_hw_ep *hw_ep = musb->endpoints + epnum; + void __iomem *epio = hw_ep->regs; +- struct musb_qh *qh; +- u16 packet_sz; +- +- if (!is_out || hw_ep->is_shared_fifo) +- qh = hw_ep->in_qh; +- else +- qh = hw_ep->out_qh; +- +- packet_sz = qh->maxpacket; ++ struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out); ++ u16 packet_sz = qh->maxpacket; + + DBG(3, "%s hw%d urb %p spd%d dev%d ep%d%s " + "h_addr%02x h_port%02x bytes %d\n", +@@ -1114,17 +1108,14 @@ void musb_host_tx(struct musb *musb, u8 epnum) + u16 tx_csr; + size_t length = 0; + size_t offset = 0; +- struct urb *urb; + struct musb_hw_ep *hw_ep = musb->endpoints + epnum; + void __iomem *epio = hw_ep->regs; +- struct musb_qh *qh = hw_ep->is_shared_fifo ? hw_ep->in_qh +- : hw_ep->out_qh; ++ struct musb_qh *qh = hw_ep->out_qh; ++ struct urb *urb = next_urb(qh); + u32 status = 0; + void __iomem *mbase = musb->mregs; + struct dma_channel *dma; + +- urb = next_urb(qh); +- + musb_ep_select(mbase, epnum); + tx_csr = musb_readw(epio, MUSB_TXCSR); + +@@ -1741,10 +1732,7 @@ static int musb_schedule( + epnum++, hw_ep++) { + int diff; + +- if (is_in || hw_ep->is_shared_fifo) { +- if (hw_ep->in_qh != NULL) +- continue; +- } else if (hw_ep->out_qh != NULL) ++ if (musb_ep_get_qh(hw_ep, is_in) != NULL) + continue; + + if (hw_ep == musb->bulk_ep) +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0017-musb_host-refactor-URB-giveback.patch b/recipes/linux/linux-omap-2.6.29/musb/0017-musb_host-refactor-URB-giveback.patch new file mode 100644 index 0000000000..4a520dff87 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0017-musb_host-refactor-URB-giveback.patch @@ -0,0 +1,132 @@ +From 013056a09afd324e729d64b9a0e66a004604e1d6 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:58:31 -0700 +Subject: [PATCH] musb_host: refactor URB giveback + +As musb_advance_schedule() is now the only remaning +caller of musb_giveback() (and the only valid context +of such call), just fold the latter into the former +and then rename __musb_giveback() into musb_giveback(). + +This is a net minor shrink. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 54 +++++++++++++++-------------------------- + 1 files changed, 20 insertions(+), 34 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index bc89079..e833959 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -292,9 +292,8 @@ start: + } + } + +-/* caller owns controller lock, irqs are blocked */ +-static void +-__musb_giveback(struct musb *musb, struct urb *urb, int status) ++/* Context: caller owns controller lock, IRQs are blocked */ ++static void musb_giveback(struct musb *musb, struct urb *urb, int status) + __releases(musb->lock) + __acquires(musb->lock) + { +@@ -347,14 +346,22 @@ static inline void musb_save_toggle(struct musb_qh *qh, int is_in, + usb_settoggle(urb->dev, qh->epnum, !is_in, csr ? 1 : 0); + } + +-/* caller owns controller lock, irqs are blocked */ +-static struct musb_qh * +-musb_giveback(struct musb_qh *qh, struct urb *urb, int status) ++/* ++ * Advance this hardware endpoint's queue, completing the specified URB and ++ * advancing to either the next URB queued to that qh, or else invalidating ++ * that qh and advancing to the next qh scheduled after the current one. ++ * ++ * Context: caller owns controller lock, IRQs are blocked ++ */ ++static void musb_advance_schedule(struct musb *musb, struct urb *urb, ++ struct musb_hw_ep *hw_ep, int is_in) + { ++ struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in); + struct musb_hw_ep *ep = qh->hw_ep; +- struct musb *musb = ep->musb; +- int is_in = usb_pipein(urb->pipe); + int ready = qh->is_ready; ++ int status; ++ ++ status = (urb->status == -EINPROGRESS) ? 0 : urb->status; + + /* save toggle eagerly, for paranoia */ + switch (qh->type) { +@@ -363,13 +370,13 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + musb_save_toggle(qh, is_in, urb); + break; + case USB_ENDPOINT_XFER_ISOC: +- if (status == 0 && urb->error_count) ++ if (urb->error_count) + status = -EXDEV; + break; + } + + qh->is_ready = 0; +- __musb_giveback(musb, urb, status); ++ musb_giveback(musb, urb, status); + qh->is_ready = ready; + + /* reclaim resources (and bandwidth) ASAP; deschedule it, and +@@ -413,31 +420,10 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + break; + } + } +- return qh; +-} +- +-/* +- * Advance this hardware endpoint's queue, completing the specified urb and +- * advancing to either the next urb queued to that qh, or else invalidating +- * that qh and advancing to the next qh scheduled after the current one. +- * +- * Context: caller owns controller lock, irqs are blocked +- */ +-static void +-musb_advance_schedule(struct musb *musb, struct urb *urb, +- struct musb_hw_ep *hw_ep, int is_in) +-{ +- struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in); +- +- if (urb->status == -EINPROGRESS) +- qh = musb_giveback(qh, urb, 0); +- else +- qh = musb_giveback(qh, urb, urb->status); + + if (qh != NULL && qh->is_ready) { + DBG(4, "... next ep%d %cX urb %p\n", +- hw_ep->epnum, is_in ? 'R' : 'T', +- next_urb(qh)); ++ hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); + musb_start_urb(musb, is_in, qh); + } + } +@@ -2080,7 +2066,7 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + + ret = 0; + qh->is_ready = 0; +- __musb_giveback(musb, urb, 0); ++ musb_giveback(musb, urb, 0); + qh->is_ready = ready; + + /* If nothing else (usually musb_giveback) is using it +@@ -2164,7 +2150,7 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) + * will activate any of these as it advances. + */ + while (!list_empty(&hep->urb_list)) +- __musb_giveback(musb, next_urb(qh), -ESHUTDOWN); ++ musb_giveback(musb, next_urb(qh), -ESHUTDOWN); + + hep->hcpriv = NULL; + list_del(&qh->ring); +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0018-musb-split-out-CPPI-interrupt-handler.patch b/recipes/linux/linux-omap-2.6.29/musb/0018-musb-split-out-CPPI-interrupt-handler.patch new file mode 100644 index 0000000000..bf3d6e7021 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0018-musb-split-out-CPPI-interrupt-handler.patch @@ -0,0 +1,167 @@ +From b91b067c531c9322f3719951b07303e790b13475 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:59:46 -0700 +Subject: [PATCH] musb: split out CPPI interrupt handler + +As DaVinci DM646x has a dedicated CPPI DMA interrupt, replace +cppi_completion() (which has always been kind of layering +violation) by a complete CPPI interrupt handler. + +[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: only cppi_dma.c needs platform +device header, not cppi_dma.h ] + +Signed-off-by: Dmitry Krivoschekov +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/cppi_dma.c | 34 +++++++++++++++++++++++++++++++--- + drivers/usb/musb/cppi_dma.h | 6 ++++-- + drivers/usb/musb/davinci.c | 14 ++++---------- + 3 files changed, 39 insertions(+), 15 deletions(-) + +diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c +index ac7227c..6ff3c67 100644 +--- a/drivers/usb/musb/cppi_dma.c ++++ b/drivers/usb/musb/cppi_dma.c +@@ -6,6 +6,7 @@ + * The TUSB6020, using VLYNQ, has CPPI that looks much like DaVinci. + */ + ++#include + #include + + #include "musb_core.h" +@@ -1145,17 +1146,27 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch) + return completed; + } + +-void cppi_completion(struct musb *musb, u32 rx, u32 tx) ++irqreturn_t cppi_interrupt(int irq, void *dev_id) + { +- void __iomem *tibase; +- int i, index; ++ struct musb *musb = dev_id; + struct cppi *cppi; ++ void __iomem *tibase; + struct musb_hw_ep *hw_ep = NULL; ++ u32 rx, tx; ++ int i, index; + + cppi = container_of(musb->dma_controller, struct cppi, controller); + + tibase = musb->ctrl_base; + ++ tx = musb_readl(tibase, DAVINCI_TXCPPI_MASKED_REG); ++ rx = musb_readl(tibase, DAVINCI_RXCPPI_MASKED_REG); ++ ++ if (!tx && !rx) ++ return IRQ_NONE; ++ ++ DBG(4, "CPPI IRQ Tx%x Rx%x\n", tx, rx); ++ + /* process TX channels */ + for (index = 0; tx; tx = tx >> 1, index++) { + struct cppi_channel *tx_ch; +@@ -1293,6 +1304,8 @@ void cppi_completion(struct musb *musb, u32 rx, u32 tx) + + /* write to CPPI EOI register to re-enable interrupts */ + musb_writel(tibase, DAVINCI_CPPI_EOI_REG, 0); ++ ++ return IRQ_HANDLED; + } + + /* Instantiate a software object representing a DMA controller. */ +@@ -1300,6 +1313,9 @@ struct dma_controller *__init + dma_controller_create(struct musb *musb, void __iomem *mregs) + { + struct cppi *controller; ++ struct device *dev = musb->controller; ++ struct platform_device *pdev = to_platform_device(dev); ++ int irq = platform_get_irq(pdev, 1); + + controller = kzalloc(sizeof *controller, GFP_KERNEL); + if (!controller) +@@ -1330,6 +1346,15 @@ dma_controller_create(struct musb *musb, void __iomem *mregs) + return NULL; + } + ++ if (irq > 0) { ++ if (request_irq(irq, cppi_interrupt, 0, "cppi-dma", musb)) { ++ dev_err(dev, "request_irq %d failed!\n", irq); ++ dma_controller_destroy(&controller->controller); ++ return NULL; ++ } ++ controller->irq = irq; ++ } ++ + return &controller->controller; + } + +@@ -1342,6 +1367,9 @@ void dma_controller_destroy(struct dma_controller *c) + + cppi = container_of(c, struct cppi, controller); + ++ if (cppi->irq) ++ free_irq(cppi->irq, cppi->musb); ++ + /* assert: caller stopped the controller first */ + dma_pool_destroy(cppi->pool); + +diff --git a/drivers/usb/musb/cppi_dma.h b/drivers/usb/musb/cppi_dma.h +index 729b407..8a39de3 100644 +--- a/drivers/usb/musb/cppi_dma.h ++++ b/drivers/usb/musb/cppi_dma.h +@@ -119,6 +119,8 @@ struct cppi { + void __iomem *mregs; /* Mentor regs */ + void __iomem *tibase; /* TI/CPPI regs */ + ++ int irq; ++ + struct cppi_channel tx[4]; + struct cppi_channel rx[4]; + +@@ -127,7 +129,7 @@ struct cppi { + struct list_head tx_complete; + }; + +-/* irq handling hook */ +-extern void cppi_completion(struct musb *, u32 rx, u32 tx); ++/* CPPI IRQ handler */ ++extern irqreturn_t cppi_interrupt(int, void *); + + #endif /* end of ifndef _CPPI_DMA_H_ */ +diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c +index 399c435..9fd74bf 100644 +--- a/drivers/usb/musb/davinci.c ++++ b/drivers/usb/musb/davinci.c +@@ -250,6 +250,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) + irqreturn_t retval = IRQ_NONE; + struct musb *musb = __hci; + void __iomem *tibase = musb->ctrl_base; ++ struct cppi *cppi; + u32 tmp; + + spin_lock_irqsave(&musb->lock, flags); +@@ -266,16 +267,9 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) + /* CPPI interrupts share the same IRQ line, but have their own + * mask, state, "vector", and EOI registers. + */ +- if (is_cppi_enabled()) { +- u32 cppi_tx = musb_readl(tibase, DAVINCI_TXCPPI_MASKED_REG); +- u32 cppi_rx = musb_readl(tibase, DAVINCI_RXCPPI_MASKED_REG); +- +- if (cppi_tx || cppi_rx) { +- DBG(4, "CPPI IRQ t%x r%x\n", cppi_tx, cppi_rx); +- cppi_completion(musb, cppi_rx, cppi_tx); +- retval = IRQ_HANDLED; +- } +- } ++ cppi = container_of(musb->dma_controller, struct cppi, controller); ++ if (is_cppi_enabled() && musb->dma_controller && !cppi->irq) ++ retval = cppi_interrupt(irq, __hci); + + /* ack and handle non-CPPI interrupts */ + tmp = musb_readl(tibase, DAVINCI_USB_INT_SRC_MASKED_REG); +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0019-musb_host-simplify-check-for-active-URB.patch b/recipes/linux/linux-omap-2.6.29/musb/0019-musb_host-simplify-check-for-active-URB.patch new file mode 100644 index 0000000000..c0e57155c8 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0019-musb_host-simplify-check-for-active-URB.patch @@ -0,0 +1,158 @@ +From 69242ddd26151d45f46011cf7abc581b14699fb2 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:56:26 -0700 +Subject: [PATCH] musb_host: simplify check for active URB + +The existance of the scheduling list shouldn't matter in +determining whether there's currectly an URB executing on a +hardware endpoint. What should actually matter is the 'in_qh' +or 'out_qh' fields of the 'struct musb_hw_ep' -- those are +set in musb_start_urb() and cleared in musb_giveback() when +the endpoint's URB list drains. Hence we should be able to +replace the big *switch* statements in musb_urb_dequeue() +and musb_h_disable() with mere musb_ep_get_qh() calls... + +While at it, do some more changes: + + - add 'is_in' variable to musb_urb_dequeue(); + + - remove the unnecessary 'epnum' variable from musb_h_disable(); + + - fix the comment style in the vicinity. + +This is a minor shrink of source and object code. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 72 ++++++++--------------------------------- + 1 files changed, 14 insertions(+), 58 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index e833959..e121e0e 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -2008,14 +2008,14 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + { + struct musb *musb = hcd_to_musb(hcd); + struct musb_qh *qh; +- struct list_head *sched; + unsigned long flags; ++ int is_in = usb_pipein(urb->pipe); + int ret; + + DBG(4, "urb=%p, dev%d ep%d%s\n", urb, + usb_pipedevice(urb->pipe), + usb_pipeendpoint(urb->pipe), +- usb_pipein(urb->pipe) ? "in" : "out"); ++ is_in ? "in" : "out"); + + spin_lock_irqsave(&musb->lock, flags); + ret = usb_hcd_check_unlink_urb(hcd, urb, status); +@@ -2026,45 +2026,23 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + if (!qh) + goto done; + +- /* Any URB not actively programmed into endpoint hardware can be ++ /* ++ * Any URB not actively programmed into endpoint hardware can be + * immediately given back; that's any URB not at the head of an + * endpoint queue, unless someday we get real DMA queues. And even + * if it's at the head, it might not be known to the hardware... + * +- * Otherwise abort current transfer, pending dma, etc.; urb->status ++ * Otherwise abort current transfer, pending DMA, etc.; urb->status + * has already been updated. This is a synchronous abort; it'd be + * OK to hold off until after some IRQ, though. ++ * ++ * NOTE: qh is invalid unless !list_empty(&hep->urb_list) + */ +- if (!qh->is_ready || urb->urb_list.prev != &qh->hep->urb_list) +- ret = -EINPROGRESS; +- else { +- switch (qh->type) { +- case USB_ENDPOINT_XFER_CONTROL: +- sched = &musb->control; +- break; +- case USB_ENDPOINT_XFER_BULK: +- if (qh->mux == 1) { +- if (usb_pipein(urb->pipe)) +- sched = &musb->in_bulk; +- else +- sched = &musb->out_bulk; +- break; +- } +- default: +- /* REVISIT when we get a schedule tree, periodic +- * transfers won't always be at the head of a +- * singleton queue... +- */ +- sched = NULL; +- break; +- } +- } +- +- /* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */ +- if (ret < 0 || (sched && qh != first_qh(sched))) { ++ if (!qh->is_ready ++ || urb->urb_list.prev != &qh->hep->urb_list ++ || musb_ep_get_qh(qh->hw_ep, is_in) != qh) { + int ready = qh->is_ready; + +- ret = 0; + qh->is_ready = 0; + musb_giveback(musb, urb, 0); + qh->is_ready = ready; +@@ -2088,13 +2066,11 @@ done: + static void + musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) + { +- u8 epnum = hep->desc.bEndpointAddress; ++ u8 is_in = hep->desc.bEndpointAddress & USB_DIR_IN; + unsigned long flags; + struct musb *musb = hcd_to_musb(hcd); +- u8 is_in = epnum & USB_DIR_IN; + struct musb_qh *qh; + struct urb *urb; +- struct list_head *sched; + + spin_lock_irqsave(&musb->lock, flags); + +@@ -2102,31 +2078,11 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) + if (qh == NULL) + goto exit; + +- switch (qh->type) { +- case USB_ENDPOINT_XFER_CONTROL: +- sched = &musb->control; +- break; +- case USB_ENDPOINT_XFER_BULK: +- if (qh->mux == 1) { +- if (is_in) +- sched = &musb->in_bulk; +- else +- sched = &musb->out_bulk; +- break; +- } +- default: +- /* REVISIT when we get a schedule tree, periodic transfers +- * won't always be at the head of a singleton queue... +- */ +- sched = NULL; +- break; +- } +- +- /* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */ ++ /* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */ + +- /* kick first urb off the hardware, if needed */ ++ /* Kick the first URB off the hardware, if needed */ + qh->is_ready = 0; +- if (!sched || qh == first_qh(sched)) { ++ if (musb_ep_get_qh(qh->hw_ep, is_in) == qh) { + urb = next_urb(qh); + + /* make software (then hardware) stop ASAP */ +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0020-musb_host-streamline-musb_cleanup_urb-calls.patch b/recipes/linux/linux-omap-2.6.29/musb/0020-musb_host-streamline-musb_cleanup_urb-calls.patch new file mode 100644 index 0000000000..d89eaadd61 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0020-musb_host-streamline-musb_cleanup_urb-calls.patch @@ -0,0 +1,58 @@ +From d408894fa4263440ed8a9e68566bacea7e6f6bed Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Fri, 27 Mar 2009 12:57:50 -0700 +Subject: [PATCH] musb_host: streamline musb_cleanup_urb() calls + +The argument for the 'is_in' parameter of musb_cleanup_urb() +is always extracted from an URB that's passed to the function. +So that parameter is superfluous; remove it. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_host.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index e121e0e..71e835e 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -1950,14 +1950,15 @@ done: + * called with controller locked, irqs blocked + * that hardware queue advances to the next transfer, unless prevented + */ +-static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh, int is_in) ++static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) + { + struct musb_hw_ep *ep = qh->hw_ep; + void __iomem *epio = ep->regs; + unsigned hw_end = ep->epnum; + void __iomem *regs = ep->musb->mregs; +- u16 csr; ++ int is_in = usb_pipein(urb->pipe); + int status = 0; ++ u16 csr; + + musb_ep_select(regs, hw_end); + +@@ -2056,7 +2057,7 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + kfree(qh); + } + } else +- ret = musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN); ++ ret = musb_cleanup_urb(urb, qh); + done: + spin_unlock_irqrestore(&musb->lock, flags); + return ret; +@@ -2090,7 +2091,7 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) + urb->status = -ESHUTDOWN; + + /* cleanup */ +- musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN); ++ musb_cleanup_urb(urb, qh); + + /* Then nuke all the others ... and advance the + * queue on hw_ep (e.g. bulk ring) when we're done. +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0021-twl4030-usb-fix-minor-reporting-goofage.patch b/recipes/linux/linux-omap-2.6.29/musb/0021-twl4030-usb-fix-minor-reporting-goofage.patch new file mode 100644 index 0000000000..d9733f92b0 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0021-twl4030-usb-fix-minor-reporting-goofage.patch @@ -0,0 +1,70 @@ +From c4804e5a447275553c55bbb0ab1748954cb8fbfc Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 31 Mar 2009 12:26:10 -0700 +Subject: [PATCH] twl4030-usb: fix minor reporting goofage + +Fix a reporting glitch in the twl4030 USB transceiver code. +It wasn't properly distinguishing the two types of active +USB link: ID grounded, vs not. In the current code that +distinction doesn't much matter; in the future this bugfix +should help support better USB controller communications. + +Provide a comment sorting out some of the cryptic bits of +the manual: different sections use different names for +key signals, and the register definitions don't help much +without the explanations and diagrams. + +Signed-off-by: David Brownell +--- + drivers/usb/otg/twl4030-usb.c | 26 +++++++++++++++++++------- + 1 files changed, 19 insertions(+), 7 deletions(-) + +diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c +index d9478d0..f740390 100644 +--- a/drivers/usb/otg/twl4030-usb.c ++++ b/drivers/usb/otg/twl4030-usb.c +@@ -217,6 +217,7 @@ + + /* In module TWL4030_MODULE_PM_MASTER */ + #define PROTECT_KEY 0x0E ++#define STS_HW_CONDITIONS 0x0F + + /* In module TWL4030_MODULE_PM_RECEIVER */ + #define VUSB_DEDICATED1 0x7D +@@ -351,15 +352,26 @@ static enum linkstat twl4030_usb_linkstat(struct twl4030_usb *twl) + int status; + int linkstat = USB_LINK_UNKNOWN; + +- /* STS_HW_CONDITIONS */ +- status = twl4030_readb(twl, TWL4030_MODULE_PM_MASTER, 0x0f); ++ /* ++ * For ID/VBUS sensing, see manual section 15.4.8 ... ++ * except when using only battery backup power, two ++ * comparators produce VBUS_PRES and ID_PRES signals, ++ * which don't match docs elsewhere. But ... BIT(7) ++ * and BIT(2) of STS_HW_CONDITIONS, respectively, do ++ * seem to match up. If either is true the USB_PRES ++ * signal is active, the OTG module is activated, and ++ * its interrupt may be raised (may wake the system). ++ */ ++ status = twl4030_readb(twl, TWL4030_MODULE_PM_MASTER, ++ STS_HW_CONDITIONS); + if (status < 0) + dev_err(twl->dev, "USB link status err %d\n", status); +- else if (status & BIT(7)) +- linkstat = USB_LINK_VBUS; +- else if (status & BIT(2)) +- linkstat = USB_LINK_ID; +- else ++ else if (status & (BIT(7) | BIT(2))) { ++ if (status & BIT(2)) ++ linkstat = USB_LINK_ID; ++ else ++ linkstat = USB_LINK_VBUS; ++ } else + linkstat = USB_LINK_NONE; + + dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n", +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0022-musb-use-dma-mode-1-for-TX-if-transfer-size-equals.patch b/recipes/linux/linux-omap-2.6.29/musb/0022-musb-use-dma-mode-1-for-TX-if-transfer-size-equals.patch new file mode 100644 index 0000000000..16b5b9908b --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0022-musb-use-dma-mode-1-for-TX-if-transfer-size-equals.patch @@ -0,0 +1,38 @@ +From ba59a0812ba0e223bd0af8f4dea6c971b6289696 Mon Sep 17 00:00:00 2001 +From: Anand Gadiyar +Date: Thu, 2 Apr 2009 12:07:08 -0700 +Subject: [PATCH] musb: use dma mode 1 for TX if transfer size equals maxpacket (v2) + +Currently, with Inventra DMA, we use Mode 0 if transfer size is less +than or equal to the endpoint's maxpacket size. This requires that +we explicitly set TXPKTRDY for that transfer. + +However the musb_g_tx code will not set TXPKTRDY twice if the last +transfer is exactly equal to maxpacket, even if request->zero is set. +Using Mode 1 will solve this; a better fix might be in musb_g_tx(). + +Without this change, musb will not correctly send out a ZLP if the +last transfer is the maxpacket size and request->zero is set. + +Signed-off-by: Anand Gadiyar +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_gadget.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index bc197b2..e8f920c 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -310,7 +310,7 @@ static void txstate(struct musb *musb, struct musb_request *req) + /* setup DMA, then program endpoint CSR */ + request_size = min(request->length, + musb_ep->dma->max_len); +- if (request_size <= musb_ep->packet_sz) ++ if (request_size < musb_ep->packet_sz) + musb_ep->dma->desired_mode = 0; + else + musb_ep->dma->desired_mode = 1; +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0023-musb-add-high-bandwidth-ISO-support.patch b/recipes/linux/linux-omap-2.6.29/musb/0023-musb-add-high-bandwidth-ISO-support.patch new file mode 100644 index 0000000000..3038dd171d --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0023-musb-add-high-bandwidth-ISO-support.patch @@ -0,0 +1,187 @@ +From 2e049a88b729ae2fdc0ecdabad1857810bd62737 Mon Sep 17 00:00:00 2001 +From: Ajay Kumar Gupta +Date: Fri, 3 Apr 2009 16:16:17 -0700 +Subject: [PATCH] musb: add high bandwidth ISO support + +Tested on OMAP3 host side with Creative (Live! Cam Optia) USB camera +which uses high bandwidth isochronous IN endpoints. FIFO mode 4 is +updated to provide the needed 4K endpoint buffer without breaking +the g_nokia composite gadget configuration. (This is the only +gadget driver known to use enough endpoints to notice the change.) + +Signed-off-by: Ajay Kumar Gupta +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_core.c | 19 ++++++++--------- + drivers/usb/musb/musb_core.h | 3 ++ + drivers/usb/musb/musb_host.c | 47 +++++++++++++++++++++++++++++++---------- + drivers/usb/musb/musb_host.h | 1 + + 4 files changed, 48 insertions(+), 22 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index a1de43b..d953305 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -1068,14 +1068,13 @@ static struct fifo_cfg __initdata mode_4_cfg[] = { + { .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 512, }, + { .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 512, }, + { .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 512, }, ++{ .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 64, }, ++{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 64, }, ++{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 64, }, ++{ .hw_ep_num = 13, .style = FIFO_RXTX, .maxpacket = 4096, }, + { .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, }, + { .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, }, + }; +@@ -1335,11 +1334,11 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) + } + if (reg & MUSB_CONFIGDATA_HBRXE) { + strcat(aInfo, ", HB-ISO Rx"); +- strcat(aInfo, " (X)"); /* no driver support */ ++ musb->hb_iso_rx = true; + } + if (reg & MUSB_CONFIGDATA_HBTXE) { + strcat(aInfo, ", HB-ISO Tx"); +- strcat(aInfo, " (X)"); /* no driver support */ ++ musb->hb_iso_tx = true; + } + if (reg & MUSB_CONFIGDATA_SOFTCONE) + strcat(aInfo, ", SoftConn"); +diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h +index f56a56c..0ac4faf 100644 +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -387,6 +387,9 @@ struct musb { + unsigned is_multipoint:1; + unsigned ignore_disconnect:1; /* during bus resets */ + ++ unsigned hb_iso_rx:1; /* high bandwidth iso rx? */ ++ unsigned hb_iso_tx:1; /* high bandwidth iso tx? */ ++ + #ifdef C_MP_TX + unsigned bulk_split:1; + #define can_bulk_split(musb,type) \ +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 71e835e..ece5122 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -602,7 +602,8 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) + musb_writeb(ep->regs, MUSB_RXTYPE, qh->type_reg); + musb_writeb(ep->regs, MUSB_RXINTERVAL, qh->intv_reg); + /* NOTE: bulk combining rewrites high bits of maxpacket */ +- musb_writew(ep->regs, MUSB_RXMAXP, qh->maxpacket); ++ musb_writew(ep->regs, MUSB_RXMAXP, ++ qh->maxpacket | ((qh->hb_mult - 1) << 11)); + + ep->rx_reinit = 0; + } +@@ -624,9 +625,10 @@ static bool musb_tx_dma_program(struct dma_controller *dma, + csr = musb_readw(epio, MUSB_TXCSR); + if (length > pkt_size) { + mode = 1; +- csr |= MUSB_TXCSR_AUTOSET +- | MUSB_TXCSR_DMAMODE +- | MUSB_TXCSR_DMAENAB; ++ csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB; ++ /* autoset shouldn't be set in high bandwidth */ ++ if (qh->hb_mult == 1) ++ csr |= MUSB_TXCSR_AUTOSET; + } else { + mode = 0; + csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE); +@@ -1432,6 +1434,10 @@ void musb_host_rx(struct musb *musb, u8 epnum) + /* packet error reported later */ + iso_err = true; + } ++ } else if (rx_csr & MUSB_RXCSR_INCOMPRX) { ++ DBG(3, "end %d high bandwidth incomplete ISO packet RX\n", ++ epnum); ++ status = -EPROTO; + } + + /* faults abort the transfer */ +@@ -1639,7 +1645,11 @@ void musb_host_rx(struct musb *musb, u8 epnum) + val &= ~MUSB_RXCSR_H_AUTOREQ; + else + val |= MUSB_RXCSR_H_AUTOREQ; +- val |= MUSB_RXCSR_AUTOCLEAR | MUSB_RXCSR_DMAENAB; ++ val |= MUSB_RXCSR_DMAENAB; ++ ++ /* autoclear shouldn't be set in high bandwidth */ ++ if (qh->hb_mult == 1) ++ val |= MUSB_RXCSR_AUTOCLEAR; + + musb_writew(epio, MUSB_RXCSR, + MUSB_RXCSR_H_WZC_BITS | val); +@@ -1725,9 +1735,10 @@ static int musb_schedule( + continue; + + if (is_in) +- diff = hw_ep->max_packet_sz_rx - qh->maxpacket; ++ diff = hw_ep->max_packet_sz_rx; + else +- diff = hw_ep->max_packet_sz_tx - qh->maxpacket; ++ diff = hw_ep->max_packet_sz_tx; ++ diff -= (qh->maxpacket * qh->hb_mult); + + if (diff >= 0 && best_diff > diff) { + best_diff = diff; +@@ -1830,15 +1841,27 @@ static int musb_urb_enqueue( + qh->is_ready = 1; + + qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize); ++ qh->type = usb_endpoint_type(epd); + +- /* no high bandwidth support yet */ +- if (qh->maxpacket & ~0x7ff) { +- ret = -EMSGSIZE; +- goto done; ++ /* Bits 11 & 12 of wMaxPacketSize encode high bandwidth multiplier. ++ * Some musb cores don't support high bandwidth ISO transfers; and ++ * we don't (yet!) support high bandwidth interrupt transfers. ++ */ ++ qh->hb_mult = 1 + ((qh->maxpacket >> 11) & 0x03); ++ if (qh->hb_mult > 1) { ++ int ok = (qh->type == USB_ENDPOINT_XFER_ISOC); ++ ++ if (ok) ++ ok = (usb_pipein(urb->pipe) && musb->hb_iso_rx) ++ || (usb_pipeout(urb->pipe) && musb->hb_iso_tx); ++ if (!ok) { ++ ret = -EMSGSIZE; ++ goto done; ++ } ++ qh->maxpacket &= 0x7ff; + } + + qh->epnum = usb_endpoint_num(epd); +- qh->type = usb_endpoint_type(epd); + + /* NOTE: urb->dev->devnum is wrong during SET_ADDRESS */ + qh->addr_reg = (u8) usb_pipedevice(urb->pipe); +diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h +index 0b7fbcd..14b0077 100644 +--- a/drivers/usb/musb/musb_host.h ++++ b/drivers/usb/musb/musb_host.h +@@ -67,6 +67,7 @@ struct musb_qh { + u8 is_ready; /* safe to modify hw_ep */ + u8 type; /* XFERTYPE_* */ + u8 epnum; ++ u8 hb_mult; /* high bandwidth pkts per uf */ + u16 maxpacket; + u16 frame; /* for periodic schedule */ + unsigned iso_idx; /* in urb->iso_frame_desc[] */ +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0024-USB-otg-adding-nop-usb-transceiver.patch b/recipes/linux/linux-omap-2.6.29/musb/0024-USB-otg-adding-nop-usb-transceiver.patch new file mode 100644 index 0000000000..67004d7ec6 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0024-USB-otg-adding-nop-usb-transceiver.patch @@ -0,0 +1,259 @@ +From de835357b3597af5304742cbd89771d70533292a Mon Sep 17 00:00:00 2001 +From: Ajay Kumar Gupta +Date: Fri, 6 Feb 2009 17:32:35 +0530 +Subject: [PATCH] USB: otg: adding nop usb transceiver + +NOP transceiver is used by all the usb transceiver which are mostly +autonomous and doesn't require any programming or which are built +into the usb ip itself.NOP transceiver only allocates the memory +for struct xceiv and calls otg_set_transceiver() so function call +to otg_get_transceiver() will return a valid transceiver. + +NOP transceiver device should be registered by calling +usb_nop_xceiv_register() from platform files. + +Signed-off-by: Ajay Kumar Gupta +Cc: Felipe Balbi +Cc: David Brownell +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/otg/Kconfig | 8 ++ + drivers/usb/otg/Makefile | 1 + + drivers/usb/otg/nop-usb-xceiv.c | 180 +++++++++++++++++++++++++++++++++++++++ + include/linux/usb/otg.h | 4 + + 4 files changed, 193 insertions(+), 0 deletions(-) + create mode 100644 drivers/usb/otg/nop-usb-xceiv.c + +diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig +index 5790a5b..aa884d0 100644 +--- a/drivers/usb/otg/Kconfig ++++ b/drivers/usb/otg/Kconfig +@@ -51,4 +51,12 @@ config TWL4030_USB + This transceiver supports high and full speed devices plus, + in host mode, low speed. + ++config NOP_USB_XCEIV ++ tristate "NOP USB Transceiver Driver" ++ select USB_OTG_UTILS ++ help ++ this driver is to be used by all the usb transceiver which are either ++ built-in with usb ip or which are autonomous and doesn't require any ++ phy programming such as ISP1x04 etc. ++ + endif # USB || OTG +diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile +index d73c7cf..2081678 100644 +--- a/drivers/usb/otg/Makefile ++++ b/drivers/usb/otg/Makefile +@@ -9,6 +9,7 @@ obj-$(CONFIG_USB_OTG_UTILS) += otg.o + obj-$(CONFIG_USB_GPIO_VBUS) += gpio_vbus.o + obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o + obj-$(CONFIG_TWL4030_USB) += twl4030-usb.o ++obj-$(CONFIG_NOP_USB_XCEIV) += nop-usb-xceiv.o + + ccflags-$(CONFIG_USB_DEBUG) += -DDEBUG + ccflags-$(CONFIG_USB_GADGET_DEBUG) += -DDEBUG +diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c +new file mode 100644 +index 0000000..4b933f6 +--- /dev/null ++++ b/drivers/usb/otg/nop-usb-xceiv.c +@@ -0,0 +1,180 @@ ++/* ++ * drivers/usb/otg/nop-usb-xceiv.c ++ * ++ * NOP USB transceiver for all USB transceiver which are either built-in ++ * into USB IP or which are mostly autonomous. ++ * ++ * Copyright (C) 2009 Texas Instruments Inc ++ * Author: Ajay Kumar Gupta ++ * ++ * 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ * Current status: ++ * this is to add "nop" transceiver for all those phy which is ++ * autonomous such as isp1504 etc. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++struct nop_usb_xceiv { ++ struct otg_transceiver otg; ++ struct device *dev; ++}; ++ ++static u64 nop_xceiv_dmamask = DMA_32BIT_MASK; ++ ++static struct platform_device nop_xceiv_device = { ++ .name = "nop_usb_xceiv", ++ .id = -1, ++ .dev = { ++ .dma_mask = &nop_xceiv_dmamask, ++ .coherent_dma_mask = DMA_32BIT_MASK, ++ .platform_data = NULL, ++ }, ++}; ++ ++void usb_nop_xceiv_register(void) ++{ ++ if (platform_device_register(&nop_xceiv_device) < 0) { ++ printk(KERN_ERR "Unable to register usb nop transceiver\n"); ++ return; ++ } ++} ++ ++void usb_nop_xceiv_unregister(void) ++{ ++ platform_device_unregister(&nop_xceiv_device); ++} ++ ++static inline struct nop_usb_xceiv *xceiv_to_nop(struct otg_transceiver *x) ++{ ++ return container_of(x, struct nop_usb_xceiv, otg); ++} ++ ++static int nop_set_suspend(struct otg_transceiver *x, int suspend) ++{ ++ return 0; ++} ++ ++static int nop_set_peripheral(struct otg_transceiver *x, ++ struct usb_gadget *gadget) ++{ ++ struct nop_usb_xceiv *nop; ++ ++ if (!x) ++ return -ENODEV; ++ ++ nop = xceiv_to_nop(x); ++ ++ if (!gadget) { ++ nop->otg.gadget = NULL; ++ return -ENODEV; ++ } ++ ++ nop->otg.gadget = gadget; ++ nop->otg.state = OTG_STATE_B_IDLE; ++ return 0; ++} ++ ++static int nop_set_host(struct otg_transceiver *x, struct usb_bus *host) ++{ ++ struct nop_usb_xceiv *nop; ++ ++ if (!x) ++ return -ENODEV; ++ ++ nop = xceiv_to_nop(x); ++ ++ if (!host) { ++ nop->otg.host = NULL; ++ return -ENODEV; ++ } ++ ++ nop->otg.host = host; ++ return 0; ++} ++ ++static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev) ++{ ++ struct nop_usb_xceiv *nop; ++ int err; ++ ++ nop = kzalloc(sizeof *nop, GFP_KERNEL); ++ if (!nop) ++ return -ENOMEM; ++ ++ nop->dev = &pdev->dev; ++ nop->otg.dev = nop->dev; ++ nop->otg.label = "nop-xceiv"; ++ nop->otg.state = OTG_STATE_UNDEFINED; ++ nop->otg.set_host = nop_set_host; ++ nop->otg.set_peripheral = nop_set_peripheral; ++ nop->otg.set_suspend = nop_set_suspend; ++ ++ err = otg_set_transceiver(&nop->otg); ++ if (err) { ++ dev_err(&pdev->dev, "can't register transceiver, err: %d\n", ++ err); ++ goto exit; ++ } ++ ++ platform_set_drvdata(pdev, nop); ++ ++ return 0; ++exit: ++ kfree(nop); ++ return err; ++} ++ ++static int __devexit nop_usb_xceiv_remove(struct platform_device *pdev) ++{ ++ struct nop_usb_xceiv *nop = platform_get_drvdata(pdev); ++ ++ otg_set_transceiver(NULL); ++ ++ platform_set_drvdata(pdev, NULL); ++ kfree(nop); ++ ++ return 0; ++} ++ ++static struct platform_driver nop_usb_xceiv_driver = { ++ .probe = nop_usb_xceiv_probe, ++ .remove = __devexit_p(nop_usb_xceiv_remove), ++ .driver = { ++ .name = "nop_usb_xceiv", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init nop_usb_xceiv_init(void) ++{ ++ return platform_driver_register(&nop_usb_xceiv_driver); ++} ++subsys_initcall(nop_usb_xceiv_init); ++ ++static void __exit nop_usb_xceiv_exit(void) ++{ ++ platform_driver_unregister(&nop_usb_xceiv_driver); ++} ++module_exit(nop_usb_xceiv_exit); ++ ++MODULE_ALIAS("platform:nop_usb_xceiv"); ++MODULE_AUTHOR("Texas Instruments Inc"); ++MODULE_DESCRIPTION("NOP USB Transceiver driver"); ++MODULE_LICENSE("GPL"); +diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h +index 94df4fe..54f2424 100644 +--- a/include/linux/usb/otg.h ++++ b/include/linux/usb/otg.h +@@ -80,6 +80,10 @@ struct otg_transceiver { + + /* for board-specific init logic */ + extern int otg_set_transceiver(struct otg_transceiver *); ++#ifdef CONFIG_NOP_USB_XCEIV ++extern void usb_nop_xceiv_register(void); ++extern void usb_nop_xceiv_unregister(void); ++#endif + + + /* for usb host and peripheral controller drivers */ +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0025-nop-usb-xceiv-behave-when-linked-as-a-module.patch b/recipes/linux/linux-omap-2.6.29/musb/0025-nop-usb-xceiv-behave-when-linked-as-a-module.patch new file mode 100644 index 0000000000..21fe7bea17 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0025-nop-usb-xceiv-behave-when-linked-as-a-module.patch @@ -0,0 +1,90 @@ +From ae4f027580168814f734cf3c41a662a7f10c744c Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 31 Mar 2009 12:28:31 -0700 +Subject: [PATCH] nop-usb-xceiv: behave when linked as a module + +The NOP OTG transceiver driver needs to be usable from modules. +Make sure its symbols are always accessible at both compile and +link time, and make sure the device instance is allocated from +the heap so that device lifetime rules are obeyed. + +Signed-off-by: David Brownell +--- + drivers/usb/otg/nop-usb-xceiv.c | 25 ++++++++++--------------- + include/linux/usb/otg.h | 4 ++-- + 2 files changed, 12 insertions(+), 17 deletions(-) + +diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c +index 4b933f6..9ed5ea5 100644 +--- a/drivers/usb/otg/nop-usb-xceiv.c ++++ b/drivers/usb/otg/nop-usb-xceiv.c +@@ -22,8 +22,8 @@ + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Current status: +- * this is to add "nop" transceiver for all those phy which is +- * autonomous such as isp1504 etc. ++ * This provides a "nop" transceiver for PHYs which are ++ * autonomous such as isp1504, isp1707, etc. + */ + + #include +@@ -36,30 +36,25 @@ struct nop_usb_xceiv { + struct device *dev; + }; + +-static u64 nop_xceiv_dmamask = DMA_32BIT_MASK; +- +-static struct platform_device nop_xceiv_device = { +- .name = "nop_usb_xceiv", +- .id = -1, +- .dev = { +- .dma_mask = &nop_xceiv_dmamask, +- .coherent_dma_mask = DMA_32BIT_MASK, +- .platform_data = NULL, +- }, +-}; ++static struct platform_device *pd; + + void usb_nop_xceiv_register(void) + { +- if (platform_device_register(&nop_xceiv_device) < 0) { ++ if (pd) ++ return; ++ pd = platform_device_register_simple("nop_usb_xceiv", -1, NULL, 0); ++ if (!pd) { + printk(KERN_ERR "Unable to register usb nop transceiver\n"); + return; + } + } ++EXPORT_SYMBOL(usb_nop_xceiv_register); + + void usb_nop_xceiv_unregister(void) + { +- platform_device_unregister(&nop_xceiv_device); ++ platform_device_unregister(pd); + } ++EXPORT_SYMBOL(usb_nop_xceiv_unregister); + + static inline struct nop_usb_xceiv *xceiv_to_nop(struct otg_transceiver *x) + { +diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h +index 54f2424..7df8bae 100644 +--- a/include/linux/usb/otg.h ++++ b/include/linux/usb/otg.h +@@ -80,10 +80,10 @@ struct otg_transceiver { + + /* for board-specific init logic */ + extern int otg_set_transceiver(struct otg_transceiver *); +-#ifdef CONFIG_NOP_USB_XCEIV ++ ++/* sometimes transceivers are accessed only through e.g. ULPI */ + extern void usb_nop_xceiv_register(void); + extern void usb_nop_xceiv_unregister(void); +-#endif + + + /* for usb host and peripheral controller drivers */ +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0026-musb-proper-hookup-to-transceiver-drivers.patch b/recipes/linux/linux-omap-2.6.29/musb/0026-musb-proper-hookup-to-transceiver-drivers.patch new file mode 100644 index 0000000000..035a6c7676 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0026-musb-proper-hookup-to-transceiver-drivers.patch @@ -0,0 +1,1109 @@ +From 43ee46723ffa9dd43d611362064d235440aa04e7 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 31 Mar 2009 12:30:04 -0700 +Subject: [PATCH] musb: proper hookup to transceiver drivers + +Let the otg_transceiver in MUSB be managed by an external driver; +don't assume it's integrated. OMAP3 chips need it to be external, +and there may be ways to interact with the transceiver which add +functionality to the system. + +Platform init code is responsible for setting up the transeciver, +probably using the NOP transceiver for integrated transceivers. +External ones will use whatever the board init code provided, +such as twl4030 or something more hands-off. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/Kconfig | 2 + + drivers/usb/musb/blackfin.c | 11 +++- + drivers/usb/musb/davinci.c | 33 +++++++++----- + drivers/usb/musb/musb_core.c | 96 +++++++++++++++++++++------------------ + drivers/usb/musb/musb_core.h | 2 +- + drivers/usb/musb/musb_gadget.c | 38 +++++++-------- + drivers/usb/musb/musb_host.c | 2 +- + drivers/usb/musb/musb_virthub.c | 20 ++++---- + drivers/usb/musb/omap2430.c | 62 +++++++++---------------- + drivers/usb/musb/tusb6010.c | 70 ++++++++++++++++++----------- + 10 files changed, 181 insertions(+), 155 deletions(-) + +diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig +index 9985db0..9eea991 100644 +--- a/drivers/usb/musb/Kconfig ++++ b/drivers/usb/musb/Kconfig +@@ -10,6 +10,7 @@ comment "Enable Host or Gadget support to see Inventra options" + config USB_MUSB_HDRC + depends on (USB || USB_GADGET) && HAVE_CLK + depends on !SUPERH ++ select NOP_USB_XCEIV if ARCH_DAVINCI + select TWL4030_USB if MACH_OMAP_3430SDP + select USB_OTG_UTILS + tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' +@@ -55,6 +56,7 @@ comment "Blackfin high speed USB Support" + config USB_TUSB6010 + boolean "TUSB 6010 support" + depends on USB_MUSB_HDRC && !USB_MUSB_SOC ++ select NOP_USB_XCEIV + default y + help + The TUSB 6010 chip, from Texas Instruments, connects a discrete +diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c +index 7861348..f2f66eb 100644 +--- a/drivers/usb/musb/blackfin.c ++++ b/drivers/usb/musb/blackfin.c +@@ -143,7 +143,7 @@ static void musb_conn_timer_handler(unsigned long _musb) + u16 val; + + spin_lock_irqsave(&musb->lock, flags); +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_IDLE: + case OTG_STATE_A_WAIT_BCON: + /* Start a new session */ +@@ -154,7 +154,7 @@ static void musb_conn_timer_handler(unsigned long _musb) + val = musb_readw(musb->mregs, MUSB_DEVCTL); + if (!(val & MUSB_DEVCTL_BDEVICE)) { + gpio_set_value(musb->config->gpio_vrsel, 1); +- musb->xceiv.state = OTG_STATE_A_WAIT_BCON; ++ musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + } else { + gpio_set_value(musb->config->gpio_vrsel, 0); + +@@ -247,6 +247,11 @@ int __init musb_platform_init(struct musb *musb) + } + gpio_direction_output(musb->config->gpio_vrsel, 0); + ++ usb_nop_xceiv_register(); ++ musb->xceiv = otg_get_transceiver(); ++ if (!musb->xceiv) ++ return -ENODEV; ++ + if (ANOMALY_05000346) { + bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value); + SSYNC(); +@@ -291,7 +296,7 @@ int __init musb_platform_init(struct musb *musb) + musb_conn_timer_handler, (unsigned long) musb); + } + if (is_peripheral_enabled(musb)) +- musb->xceiv.set_power = bfin_set_power; ++ musb->xceiv->set_power = bfin_set_power; + + musb->isr = blackfin_interrupt; + +diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c +index 9fd74bf..81de742 100644 +--- a/drivers/usb/musb/davinci.c ++++ b/drivers/usb/musb/davinci.c +@@ -200,7 +200,7 @@ static void otg_timer(unsigned long _musb) + DBG(7, "poll devctl %02x (%s)\n", devctl, otg_state_string(musb)); + + spin_lock_irqsave(&musb->lock, flags); +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_WAIT_VFALL: + /* Wait till VBUS falls below SessionEnd (~0.2V); the 1.3 RTL + * seems to mis-handle session "start" otherwise (or in our +@@ -211,7 +211,7 @@ static void otg_timer(unsigned long _musb) + mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); + break; + } +- musb->xceiv.state = OTG_STATE_A_WAIT_VRISE; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; + musb_writel(musb->ctrl_base, DAVINCI_USB_INT_SET_REG, + MUSB_INTR_VBUSERROR << DAVINCI_USB_USBINT_SHIFT); + break; +@@ -236,7 +236,7 @@ static void otg_timer(unsigned long _musb) + if (devctl & MUSB_DEVCTL_BDEVICE) + mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); + else +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + break; + default: + break; +@@ -310,21 +310,21 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) + * to stop registering in devctl. + */ + musb->int_usb &= ~MUSB_INTR_VBUSERROR; +- musb->xceiv.state = OTG_STATE_A_WAIT_VFALL; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; + mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); + WARNING("VBUS error workaround (delay coming)\n"); + } else if (is_host_enabled(musb) && drvvbus) { + musb->is_active = 1; + MUSB_HST_MODE(musb); +- musb->xceiv.default_a = 1; +- musb->xceiv.state = OTG_STATE_A_WAIT_VRISE; ++ musb->xceiv->default_a = 1; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; + portstate(musb->port1_status |= USB_PORT_STAT_POWER); + del_timer(&otg_workaround); + } else { + musb->is_active = 0; + MUSB_DEV_MODE(musb); +- musb->xceiv.default_a = 0; +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->default_a = 0; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); + } + +@@ -346,7 +346,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) + + /* poll for ID change */ + if (is_otg_enabled(musb) +- && musb->xceiv.state == OTG_STATE_B_IDLE) ++ && musb->xceiv->state == OTG_STATE_B_IDLE) + mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); + + spin_unlock_irqrestore(&musb->lock, flags); +@@ -365,6 +365,11 @@ int __init musb_platform_init(struct musb *musb) + void __iomem *tibase = musb->ctrl_base; + u32 revision; + ++ usb_nop_xceiv_register(); ++ musb->xceiv = otg_get_transceiver(); ++ if (!musb->xceiv) ++ return -ENODEV; ++ + musb->mregs += DAVINCI_BASE_OFFSET; + + clk_enable(musb->clock); +@@ -372,7 +377,7 @@ int __init musb_platform_init(struct musb *musb) + /* returns zero if e.g. not clocked */ + revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG); + if (revision == 0) +- return -ENODEV; ++ goto fail; + + if (is_host_enabled(musb)) + setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); +@@ -396,6 +401,10 @@ int __init musb_platform_init(struct musb *musb) + + musb->isr = davinci_interrupt; + return 0; ++ ++fail: ++ usb_nop_xceiv_unregister(); ++ return -ENODEV; + } + + int musb_platform_exit(struct musb *musb) +@@ -406,7 +415,7 @@ int musb_platform_exit(struct musb *musb) + davinci_source_power(musb, 0 /*off*/, 1); + + /* delay, to avoid problems with module reload */ +- if (is_host_enabled(musb) && musb->xceiv.default_a) { ++ if (is_host_enabled(musb) && musb->xceiv->default_a) { + int maxdelay = 30; + u8 devctl, warn = 0; + +@@ -435,5 +444,7 @@ int musb_platform_exit(struct musb *musb) + + clk_disable(musb->clock); + ++ usb_nop_xceiv_unregister(); ++ + return 0; + } +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index d953305..ac150af 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -267,7 +267,7 @@ void musb_load_testpacket(struct musb *musb) + + const char *otg_state_string(struct musb *musb) + { +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_IDLE: return "a_idle"; + case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise"; + case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon"; +@@ -302,11 +302,11 @@ void musb_otg_timer_func(unsigned long data) + unsigned long flags; + + spin_lock_irqsave(&musb->lock, flags); +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_B_WAIT_ACON: + DBG(1, "HNP: b_wait_acon timeout; back to b_peripheral\n"); + musb_g_disconnect(musb); +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->is_active = 0; + break; + case OTG_STATE_A_WAIT_BCON: +@@ -331,20 +331,20 @@ void musb_hnp_stop(struct musb *musb) + void __iomem *mbase = musb->mregs; + u8 reg; + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_PERIPHERAL: + case OTG_STATE_A_WAIT_VFALL: + case OTG_STATE_A_WAIT_BCON: + DBG(1, "HNP: Switching back to A-host\n"); + musb_g_disconnect(musb); +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + MUSB_HST_MODE(musb); + musb->is_active = 0; + break; + case OTG_STATE_B_HOST: + DBG(1, "HNP: Disabling HR\n"); + hcd->self.is_b_host = 0; +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + MUSB_DEV_MODE(musb); + reg = musb_readb(mbase, MUSB_POWER); + reg |= MUSB_POWER_SUSPENDM; +@@ -402,7 +402,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + + if (devctl & MUSB_DEVCTL_HM) { + #ifdef CONFIG_USB_MUSB_HDRC_HCD +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_SUSPEND: + /* remote wakeup? later, GetPortStatus + * will stop RESUME signaling +@@ -425,12 +425,12 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + musb->rh_timer = jiffies + + msecs_to_jiffies(20); + +- musb->xceiv.state = OTG_STATE_A_HOST; ++ musb->xceiv->state = OTG_STATE_A_HOST; + musb->is_active = 1; + usb_hcd_resume_root_hub(musb_to_hcd(musb)); + break; + case OTG_STATE_B_WAIT_ACON: +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->is_active = 1; + MUSB_DEV_MODE(musb); + break; +@@ -441,11 +441,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + } + #endif + } else { +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + #ifdef CONFIG_USB_MUSB_HDRC_HCD + case OTG_STATE_A_SUSPEND: + /* possibly DISCONNECT is upcoming */ +- musb->xceiv.state = OTG_STATE_A_HOST; ++ musb->xceiv->state = OTG_STATE_A_HOST; + usb_hcd_resume_root_hub(musb_to_hcd(musb)); + break; + #endif +@@ -490,7 +490,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + */ + musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION); + musb->ep0_stage = MUSB_EP0_START; +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + MUSB_HST_MODE(musb); + musb_set_vbus(musb, 1); + +@@ -516,7 +516,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + * REVISIT: do delays from lots of DEBUG_KERNEL checks + * make trouble here, keeping VBUS < 4.4V ? + */ +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_HOST: + /* recovery is dicey once we've gotten past the + * initial stages of enumeration, but if VBUS +@@ -602,11 +602,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + MUSB_HST_MODE(musb); + + /* indicate new connection to OTG machine */ +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_B_PERIPHERAL: + if (int_usb & MUSB_INTR_SUSPEND) { + DBG(1, "HNP: SUSPEND+CONNECT, now b_host\n"); +- musb->xceiv.state = OTG_STATE_B_HOST; ++ musb->xceiv->state = OTG_STATE_B_HOST; + hcd->self.is_b_host = 1; + int_usb &= ~MUSB_INTR_SUSPEND; + } else +@@ -614,13 +614,13 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + break; + case OTG_STATE_B_WAIT_ACON: + DBG(1, "HNP: Waiting to switch to b_host state\n"); +- musb->xceiv.state = OTG_STATE_B_HOST; ++ musb->xceiv->state = OTG_STATE_B_HOST; + hcd->self.is_b_host = 1; + break; + default: + if ((devctl & MUSB_DEVCTL_VBUS) + == (3 << MUSB_DEVCTL_VBUS_SHIFT)) { +- musb->xceiv.state = OTG_STATE_A_HOST; ++ musb->xceiv->state = OTG_STATE_A_HOST; + hcd->self.is_b_host = 0; + } + break; +@@ -650,7 +650,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + } + } else if (is_peripheral_capable()) { + DBG(1, "BUS RESET as %s\n", otg_state_string(musb)); +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + #ifdef CONFIG_USB_OTG + case OTG_STATE_A_SUSPEND: + /* We need to ignore disconnect on suspend +@@ -673,12 +673,12 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + case OTG_STATE_B_WAIT_ACON: + DBG(1, "HNP: RESET (%s), to b_peripheral\n", + otg_state_string(musb)); +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb_g_reset(musb); + break; + #endif + case OTG_STATE_B_IDLE: +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + /* FALLTHROUGH */ + case OTG_STATE_B_PERIPHERAL: + musb_g_reset(musb); +@@ -763,7 +763,7 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + MUSB_MODE(musb), devctl); + handled = IRQ_HANDLED; + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + #ifdef CONFIG_USB_MUSB_HDRC_HCD + case OTG_STATE_A_HOST: + case OTG_STATE_A_SUSPEND: +@@ -805,7 +805,7 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + otg_state_string(musb), devctl, power); + handled = IRQ_HANDLED; + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + #ifdef CONFIG_USB_MUSB_OTG + case OTG_STATE_A_PERIPHERAL: + /* +@@ -817,10 +817,10 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + case OTG_STATE_B_PERIPHERAL: + musb_g_suspend(musb); + musb->is_active = is_otg_enabled(musb) +- && musb->xceiv.gadget->b_hnp_enable; ++ && musb->xceiv->gadget->b_hnp_enable; + if (musb->is_active) { + #ifdef CONFIG_USB_MUSB_OTG +- musb->xceiv.state = OTG_STATE_B_WAIT_ACON; ++ musb->xceiv->state = OTG_STATE_B_WAIT_ACON; + DBG(1, "HNP: Setting timer for b_ase0_brst\n"); + musb_otg_timer.data = (unsigned long)musb; + mod_timer(&musb_otg_timer, jiffies +@@ -834,9 +834,9 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + + msecs_to_jiffies(musb->a_wait_bcon)); + break; + case OTG_STATE_A_HOST: +- musb->xceiv.state = OTG_STATE_A_SUSPEND; ++ musb->xceiv->state = OTG_STATE_A_SUSPEND; + musb->is_active = is_otg_enabled(musb) +- && musb->xceiv.host->b_hnp_enable; ++ && musb->xceiv->host->b_hnp_enable; + break; + case OTG_STATE_B_HOST: + /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ +@@ -1681,7 +1681,7 @@ musb_vbus_store(struct device *dev, struct device_attribute *attr, + + spin_lock_irqsave(&musb->lock, flags); + musb->a_wait_bcon = val; +- if (musb->xceiv.state == OTG_STATE_A_WAIT_BCON) ++ if (musb->xceiv->state == OTG_STATE_A_WAIT_BCON) + musb->is_active = 0; + musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val)); + spin_unlock_irqrestore(&musb->lock, flags); +@@ -1742,8 +1742,8 @@ static void musb_irq_work(struct work_struct *data) + struct musb *musb = container_of(data, struct musb, irq_work); + static int old_state; + +- if (musb->xceiv.state != old_state) { +- old_state = musb->xceiv.state; ++ if (musb->xceiv->state != old_state) { ++ old_state = musb->xceiv->state; + sysfs_notify(&musb->controller->kobj, NULL, "mode"); + } + } +@@ -1840,7 +1840,7 @@ static void musb_free(struct musb *musb) + } + + #ifdef CONFIG_USB_MUSB_OTG +- put_device(musb->xceiv.dev); ++ put_device(musb->xceiv->dev); + #endif + + #ifdef CONFIG_USB_MUSB_HDRC_HCD +@@ -1921,10 +1921,18 @@ bad_config: + } + } + +- /* assume vbus is off */ +- +- /* platform adjusts musb->mregs and musb->isr if needed, +- * and activates clocks ++ /* The musb_platform_init() call: ++ * - adjusts musb->mregs and musb->isr if needed, ++ * - may initialize an integrated tranceiver ++ * - initializes musb->xceiv, usually by otg_get_transceiver() ++ * - activates clocks. ++ * - stops powering VBUS ++ * - assigns musb->board_set_vbus if host mode is enabled ++ * ++ * There are various transciever configurations. Blackfin, ++ * DaVinci, TUSB60x0, and others integrate them. OMAP3 uses ++ * external/discrete ones in various flavors (twl4030 family, ++ * isp1504, non-OTG, etc) mostly hooking up through ULPI. + */ + musb->isr = generic_interrupt; + status = musb_platform_init(musb); +@@ -1992,17 +2000,17 @@ bad_config: + ? "DMA" : "PIO", + musb->nIrq); + +-#ifdef CONFIG_USB_MUSB_HDRC_HCD +- /* host side needs more setup, except for no-host modes */ +- if (musb->board_mode != MUSB_PERIPHERAL) { ++ /* host side needs more setup */ ++ if (is_host_enabled(musb)) { + struct usb_hcd *hcd = musb_to_hcd(musb); + +- if (musb->board_mode == MUSB_OTG) ++ otg_set_host(musb->xceiv, &hcd->self); ++ ++ if (is_otg_enabled(musb)) + hcd->self.otg_port = 1; +- musb->xceiv.host = &hcd->self; ++ musb->xceiv->host = &hcd->self; + hcd->power_budget = 2 * (plat->power ? : 250); + } +-#endif /* CONFIG_USB_MUSB_HDRC_HCD */ + + /* For the host-only role, we can activate right away. + * (We expect the ID pin to be forcibly grounded!!) +@@ -2010,8 +2018,8 @@ bad_config: + */ + if (!is_otg_enabled(musb) && is_host_enabled(musb)) { + MUSB_HST_MODE(musb); +- musb->xceiv.default_a = 1; +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->default_a = 1; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + + status = usb_add_hcd(musb_to_hcd(musb), -1, 0); + if (status) +@@ -2026,8 +2034,8 @@ bad_config: + + } else /* peripheral is enabled */ { + MUSB_DEV_MODE(musb); +- musb->xceiv.default_a = 0; +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->default_a = 0; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + + status = musb_gadget_setup(musb); + if (status) +diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h +index 0ac4faf..c3ee348 100644 +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -356,7 +356,7 @@ struct musb { + u16 int_rx; + u16 int_tx; + +- struct otg_transceiver xceiv; ++ struct otg_transceiver *xceiv; + + int nIrq; + unsigned irq_wake:1; +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index e8f920c..2fbfba5 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -1406,7 +1406,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) + + spin_lock_irqsave(&musb->lock, flags); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_B_PERIPHERAL: + /* NOTE: OTG state machine doesn't include B_SUSPENDED; + * that's part of the standard usb 1.1 state machine, and +@@ -1508,9 +1508,9 @@ static int musb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA) + { + struct musb *musb = gadget_to_musb(gadget); + +- if (!musb->xceiv.set_power) ++ if (!musb->xceiv->set_power) + return -EOPNOTSUPP; +- return otg_set_power(&musb->xceiv, mA); ++ return otg_set_power(musb->xceiv, mA); + } + + static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) +@@ -1733,11 +1733,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) + + spin_lock_irqsave(&musb->lock, flags); + +- /* REVISIT always use otg_set_peripheral(), handling +- * issues including the root hub one below ... +- */ +- musb->xceiv.gadget = &musb->g; +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ otg_set_peripheral(musb->xceiv, &musb->g); + musb->is_active = 1; + + /* FIXME this ignores the softconnect flag. Drivers are +@@ -1749,6 +1745,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) + if (!is_otg_enabled(musb)) + musb_start(musb); + ++ otg_set_peripheral(musb->xceiv, &musb->g); ++ + spin_unlock_irqrestore(&musb->lock, flags); + + if (is_otg_enabled(musb)) { +@@ -1762,8 +1760,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) + if (retval < 0) { + DBG(1, "add_hcd failed, %d\n", retval); + spin_lock_irqsave(&musb->lock, flags); +- musb->xceiv.gadget = NULL; +- musb->xceiv.state = OTG_STATE_UNDEFINED; ++ otg_set_peripheral(musb->xceiv, NULL); + musb->gadget_driver = NULL; + musb->g.dev.driver = NULL; + spin_unlock_irqrestore(&musb->lock, flags); +@@ -1846,8 +1843,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) + + (void) musb_gadget_vbus_draw(&musb->g, 0); + +- musb->xceiv.state = OTG_STATE_UNDEFINED; ++ musb->xceiv->state = OTG_STATE_UNDEFINED; + stop_activity(musb, driver); ++ otg_set_peripheral(musb->xceiv, NULL); + + DBG(3, "unregistering driver %s\n", driver->function); + spin_unlock_irqrestore(&musb->lock, flags); +@@ -1883,7 +1881,7 @@ EXPORT_SYMBOL(usb_gadget_unregister_driver); + void musb_g_resume(struct musb *musb) + { + musb->is_suspended = 0; +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_B_IDLE: + break; + case OTG_STATE_B_WAIT_ACON: +@@ -1909,10 +1907,10 @@ void musb_g_suspend(struct musb *musb) + devctl = musb_readb(musb->mregs, MUSB_DEVCTL); + DBG(3, "devctl %02x\n", devctl); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_B_IDLE: + if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + break; + case OTG_STATE_B_PERIPHERAL: + musb->is_suspended = 1; +@@ -1958,22 +1956,22 @@ void musb_g_disconnect(struct musb *musb) + spin_lock(&musb->lock); + } + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + default: + #ifdef CONFIG_USB_MUSB_OTG + DBG(2, "Unhandled disconnect %s, setting a_idle\n", + otg_state_string(musb)); +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + break; + case OTG_STATE_A_PERIPHERAL: +- musb->xceiv.state = OTG_STATE_A_WAIT_VFALL; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; + break; + case OTG_STATE_B_WAIT_ACON: + case OTG_STATE_B_HOST: + #endif + case OTG_STATE_B_PERIPHERAL: + case OTG_STATE_B_IDLE: +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + break; + case OTG_STATE_B_SRP_INIT: + break; +@@ -2029,10 +2027,10 @@ __acquires(musb->lock) + * or else after HNP, as A-Device + */ + if (devctl & MUSB_DEVCTL_BDEVICE) { +- musb->xceiv.state = OTG_STATE_B_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->g.is_a_peripheral = 0; + } else if (is_otg_enabled(musb)) { +- musb->xceiv.state = OTG_STATE_A_PERIPHERAL; ++ musb->xceiv->state = OTG_STATE_A_PERIPHERAL; + musb->g.is_a_peripheral = 1; + } else + WARN_ON(1); +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index ece5122..795dabe 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -2169,7 +2169,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd) + { + struct musb *musb = hcd_to_musb(hcd); + +- if (musb->xceiv.state == OTG_STATE_A_SUSPEND) ++ if (musb->xceiv->state == OTG_STATE_A_SUSPEND) + return 0; + + if (is_host_active(musb) && musb->is_active) { +diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c +index e0e9ce5..7e7900f 100644 +--- a/drivers/usb/musb/musb_virthub.c ++++ b/drivers/usb/musb/musb_virthub.c +@@ -78,18 +78,18 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) + DBG(3, "Root port suspended, power %02x\n", power); + + musb->port1_status |= USB_PORT_STAT_SUSPEND; +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_HOST: +- musb->xceiv.state = OTG_STATE_A_SUSPEND; ++ musb->xceiv->state = OTG_STATE_A_SUSPEND; + musb->is_active = is_otg_enabled(musb) +- && musb->xceiv.host->b_hnp_enable; ++ && musb->xceiv->host->b_hnp_enable; + musb_platform_try_idle(musb, 0); + break; + #ifdef CONFIG_USB_MUSB_OTG + case OTG_STATE_B_HOST: +- musb->xceiv.state = OTG_STATE_B_WAIT_ACON; ++ musb->xceiv->state = OTG_STATE_B_WAIT_ACON; + musb->is_active = is_otg_enabled(musb) +- && musb->xceiv.host->b_hnp_enable; ++ && musb->xceiv->host->b_hnp_enable; + musb_platform_try_idle(musb, 0); + break; + #endif +@@ -116,7 +116,7 @@ static void musb_port_reset(struct musb *musb, bool do_reset) + void __iomem *mbase = musb->mregs; + + #ifdef CONFIG_USB_MUSB_OTG +- if (musb->xceiv.state == OTG_STATE_B_IDLE) { ++ if (musb->xceiv->state == OTG_STATE_B_IDLE) { + DBG(2, "HNP: Returning from HNP; no hub reset from b_idle\n"); + musb->port1_status &= ~USB_PORT_STAT_RESET; + return; +@@ -186,14 +186,14 @@ void musb_root_disconnect(struct musb *musb) + usb_hcd_poll_rh_status(musb_to_hcd(musb)); + musb->is_active = 0; + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_HOST: + case OTG_STATE_A_SUSPEND: +- musb->xceiv.state = OTG_STATE_A_WAIT_BCON; ++ musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + musb->is_active = 0; + break; + case OTG_STATE_A_WAIT_VFALL: +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + break; + default: + DBG(1, "host disconnect (%s)\n", otg_state_string(musb)); +@@ -332,7 +332,7 @@ int musb_hub_control( + musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16; + usb_hcd_poll_rh_status(musb_to_hcd(musb)); + /* NOTE: it might really be A_WAIT_BCON ... */ +- musb->xceiv.state = OTG_STATE_A_HOST; ++ musb->xceiv->state = OTG_STATE_A_HOST; + } + + put_unaligned(cpu_to_le32(musb->port1_status +diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c +index 901dffd..5f67b03 100644 +--- a/drivers/usb/musb/omap2430.c ++++ b/drivers/usb/musb/omap2430.c +@@ -62,17 +62,17 @@ static void musb_do_idle(unsigned long _musb) + + devctl = musb_readb(musb->mregs, MUSB_DEVCTL); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_WAIT_BCON: + devctl &= ~MUSB_DEVCTL_SESSION; + musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); + + devctl = musb_readb(musb->mregs, MUSB_DEVCTL); + if (devctl & MUSB_DEVCTL_BDEVICE) { +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + MUSB_DEV_MODE(musb); + } else { +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + MUSB_HST_MODE(musb); + } + break; +@@ -90,7 +90,7 @@ static void musb_do_idle(unsigned long _musb) + musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16; + usb_hcd_poll_rh_status(musb_to_hcd(musb)); + /* NOTE: it might really be A_WAIT_BCON ... */ +- musb->xceiv.state = OTG_STATE_A_HOST; ++ musb->xceiv->state = OTG_STATE_A_HOST; + } + break; + #endif +@@ -98,9 +98,9 @@ static void musb_do_idle(unsigned long _musb) + case OTG_STATE_A_HOST: + devctl = musb_readb(musb->mregs, MUSB_DEVCTL); + if (devctl & MUSB_DEVCTL_BDEVICE) +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + else +- musb->xceiv.state = OTG_STATE_A_WAIT_BCON; ++ musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + #endif + default: + break; +@@ -119,7 +119,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout) + + /* Never idle if active, or when VBUS timeout is not set as host */ + if (musb->is_active || ((musb->a_wait_bcon == 0) +- && (musb->xceiv.state == OTG_STATE_A_WAIT_BCON))) { ++ && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { + DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); + del_timer(&musb_idle_timer); + last_timer = jiffies; +@@ -164,8 +164,8 @@ static void omap_set_vbus(struct musb *musb, int is_on) + + if (is_on) { + musb->is_active = 1; +- musb->xceiv.default_a = 1; +- musb->xceiv.state = OTG_STATE_A_WAIT_VRISE; ++ musb->xceiv->default_a = 1; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; + devctl |= MUSB_DEVCTL_SESSION; + + MUSB_HST_MODE(musb); +@@ -176,8 +176,8 @@ static void omap_set_vbus(struct musb *musb, int is_on) + * jumping right to B_IDLE... + */ + +- musb->xceiv.default_a = 0; +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->default_a = 0; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + devctl &= ~MUSB_DEVCTL_SESSION; + + MUSB_DEV_MODE(musb); +@@ -189,10 +189,6 @@ static void omap_set_vbus(struct musb *musb, int is_on) + otg_state_string(musb), + musb_readb(musb->mregs, MUSB_DEVCTL)); + } +-static int omap_set_power(struct otg_transceiver *x, unsigned mA) +-{ +- return 0; +-} + + static int musb_platform_resume(struct musb *musb); + +@@ -203,24 +199,6 @@ int musb_platform_set_mode(struct musb *musb, u8 musb_mode) + devctl |= MUSB_DEVCTL_SESSION; + musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); + +- switch (musb_mode) { +-#ifdef CONFIG_USB_MUSB_HDRC_HCD +- case MUSB_HOST: +- otg_set_host(&musb->xceiv, musb->xceiv.host); +- break; +-#endif +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +- case MUSB_PERIPHERAL: +- otg_set_peripheral(&musb->xceiv, musb->xceiv.gadget); +- break; +-#endif +-#ifdef CONFIG_USB_MUSB_OTG +- case MUSB_OTG: +- break; +-#endif +- default: +- return -EINVAL; +- } + return 0; + } + +@@ -232,6 +210,16 @@ int __init musb_platform_init(struct musb *musb) + omap_cfg_reg(AE5_2430_USB0HS_STP); + #endif + ++ /* We require some kind of external transceiver, hooked ++ * up through ULPI. TWL4030-family PMICs include one, ++ * which needs a driver, drivers aren't always needed. ++ */ ++ musb->xceiv = otg_get_transceiver(); ++ if (!musb->xceiv) { ++ pr_err("HS USB OTG: no transceiver configured\n"); ++ return -ENODEV; ++ } ++ + musb_platform_resume(musb); + + l = omap_readl(OTG_SYSCONFIG); +@@ -258,8 +246,6 @@ int __init musb_platform_init(struct musb *musb) + + if (is_host_enabled(musb)) + musb->board_set_vbus = omap_set_vbus; +- if (is_peripheral_enabled(musb)) +- musb->xceiv.set_power = omap_set_power; + musb->a_wait_bcon = MUSB_TIMEOUT_A_WAIT_BCON; + + setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); +@@ -283,8 +269,7 @@ int musb_platform_suspend(struct musb *musb) + l |= ENABLEWAKEUP; /* enable wakeup */ + omap_writel(l, OTG_SYSCONFIG); + +- if (musb->xceiv.set_suspend) +- musb->xceiv.set_suspend(&musb->xceiv, 1); ++ otg_set_suspend(musb->xceiv, 1); + + if (musb->set_clock) + musb->set_clock(musb->clock, 0); +@@ -301,8 +286,7 @@ static int musb_platform_resume(struct musb *musb) + if (!musb->clock) + return 0; + +- if (musb->xceiv.set_suspend) +- musb->xceiv.set_suspend(&musb->xceiv, 0); ++ otg_set_suspend(musb->xceiv, 0); + + if (musb->set_clock) + musb->set_clock(musb->clock, 1); +diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c +index 9e20fd0..c473dec 100644 +--- a/drivers/usb/musb/tusb6010.c ++++ b/drivers/usb/musb/tusb6010.c +@@ -260,6 +260,8 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *buf) + tusb_fifo_read_unaligned(fifo, buf, len); + } + ++static struct musb *the_musb; ++ + #ifdef CONFIG_USB_GADGET_MUSB_HDRC + + /* This is used by gadget drivers, and OTG transceiver logic, allowing +@@ -270,7 +272,7 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *buf) + */ + static int tusb_draw_power(struct otg_transceiver *x, unsigned mA) + { +- struct musb *musb = container_of(x, struct musb, xceiv); ++ struct musb *musb = the_musb; + void __iomem *tbase = musb->ctrl_base; + u32 reg; + +@@ -420,7 +422,7 @@ static void musb_do_idle(unsigned long _musb) + + spin_lock_irqsave(&musb->lock, flags); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_WAIT_BCON: + if ((musb->a_wait_bcon != 0) + && (musb->idle_timeout == 0 +@@ -484,7 +486,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout) + + /* Never idle if active, or when VBUS timeout is not set as host */ + if (musb->is_active || ((musb->a_wait_bcon == 0) +- && (musb->xceiv.state == OTG_STATE_A_WAIT_BCON))) { ++ && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { + DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); + del_timer(&musb_idle_timer); + last_timer = jiffies; +@@ -533,8 +535,8 @@ static void tusb_source_power(struct musb *musb, int is_on) + if (musb->set_clock) + musb->set_clock(musb->clock, 1); + timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE); +- musb->xceiv.default_a = 1; +- musb->xceiv.state = OTG_STATE_A_WAIT_VRISE; ++ musb->xceiv->default_a = 1; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; + devctl |= MUSB_DEVCTL_SESSION; + + conf |= TUSB_DEV_CONF_USB_HOST_MODE; +@@ -547,24 +549,24 @@ static void tusb_source_power(struct musb *musb, int is_on) + /* If ID pin is grounded, we want to be a_idle */ + otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT); + if (!(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS)) { +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_WAIT_VRISE: + case OTG_STATE_A_WAIT_BCON: +- musb->xceiv.state = OTG_STATE_A_WAIT_VFALL; ++ musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; + break; + case OTG_STATE_A_WAIT_VFALL: +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + break; + default: +- musb->xceiv.state = OTG_STATE_A_IDLE; ++ musb->xceiv->state = OTG_STATE_A_IDLE; + } + musb->is_active = 0; +- musb->xceiv.default_a = 1; ++ musb->xceiv->default_a = 1; + MUSB_HST_MODE(musb); + } else { + musb->is_active = 0; +- musb->xceiv.default_a = 0; +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->default_a = 0; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + MUSB_DEV_MODE(musb); + } + +@@ -675,7 +677,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + else + default_a = is_host_enabled(musb); + DBG(2, "Default-%c\n", default_a ? 'A' : 'B'); +- musb->xceiv.default_a = default_a; ++ musb->xceiv->default_a = default_a; + tusb_source_power(musb, default_a); + + /* Don't allow idling immediately */ +@@ -687,7 +689,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + if (int_src & TUSB_INT_SRC_VBUS_SENSE_CHNG) { + + /* B-dev state machine: no vbus ~= disconnect */ +- if ((is_otg_enabled(musb) && !musb->xceiv.default_a) ++ if ((is_otg_enabled(musb) && !musb->xceiv->default_a) + || !is_host_enabled(musb)) { + #ifdef CONFIG_USB_MUSB_HDRC_HCD + /* ? musb_root_disconnect(musb); */ +@@ -702,9 +704,9 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + + if (otg_stat & TUSB_DEV_OTG_STAT_SESS_END) { + DBG(1, "Forcing disconnect (no interrupt)\n"); +- if (musb->xceiv.state != OTG_STATE_B_IDLE) { ++ if (musb->xceiv->state != OTG_STATE_B_IDLE) { + /* INTR_DISCONNECT can hide... */ +- musb->xceiv.state = OTG_STATE_B_IDLE; ++ musb->xceiv->state = OTG_STATE_B_IDLE; + musb->int_usb |= MUSB_INTR_DISCONNECT; + } + musb->is_active = 0; +@@ -718,7 +720,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + DBG(2, "vbus change, %s, otg %03x\n", + otg_state_string(musb), otg_stat); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_IDLE: + DBG(2, "Got SRP, turning on VBUS\n"); + musb_set_vbus(musb, 1); +@@ -766,7 +768,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + + DBG(4, "%s timer, %03x\n", otg_state_string(musb), otg_stat); + +- switch (musb->xceiv.state) { ++ switch (musb->xceiv->state) { + case OTG_STATE_A_WAIT_VRISE: + /* VBUS has probably been valid for a while now, + * but may well have bounced out of range a bit +@@ -778,7 +780,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) + DBG(2, "devctl %02x\n", devctl); + break; + } +- musb->xceiv.state = OTG_STATE_A_WAIT_BCON; ++ musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + musb->is_active = 0; + idle_timeout = jiffies + + msecs_to_jiffies(musb->a_wait_bcon); +@@ -1094,9 +1096,14 @@ int __init musb_platform_init(struct musb *musb) + { + struct platform_device *pdev; + struct resource *mem; +- void __iomem *sync; ++ void __iomem *sync = NULL; + int ret; + ++ usb_nop_xceiv_register(); ++ musb->xceiv = otg_get_transceiver(); ++ if (!musb->xceiv) ++ return -ENODEV; ++ + pdev = to_platform_device(musb->controller); + + /* dma address for async dma */ +@@ -1107,14 +1114,16 @@ int __init musb_platform_init(struct musb *musb) + mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!mem) { + pr_debug("no sync dma resource?\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto done; + } + musb->sync = mem->start; + + sync = ioremap(mem->start, mem->end - mem->start + 1); + if (!sync) { + pr_debug("ioremap for sync failed\n"); +- return -ENOMEM; ++ ret = -ENOMEM; ++ goto done; + } + musb->sync_va = sync; + +@@ -1127,28 +1136,37 @@ int __init musb_platform_init(struct musb *musb) + if (ret) { + printk(KERN_ERR "Could not start tusb6010 (%d)\n", + ret); +- return -ENODEV; ++ goto done; + } + musb->isr = tusb_interrupt; + + if (is_host_enabled(musb)) + musb->board_set_vbus = tusb_source_power; +- if (is_peripheral_enabled(musb)) +- musb->xceiv.set_power = tusb_draw_power; ++ if (is_peripheral_enabled(musb)) { ++ musb->xceiv->set_power = tusb_draw_power; ++ the_musb = musb; ++ } + + setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); + ++done: ++ if (ret < 0) { ++ if (sync) ++ iounmap(sync); ++ usb_nop_xceiv_unregister(); ++ } + return ret; + } + + int musb_platform_exit(struct musb *musb) + { + del_timer_sync(&musb_idle_timer); ++ the_musb = NULL; + + if (musb->board_set_power) + musb->board_set_power(0); + + iounmap(musb->sync_va); +- ++ usb_nop_xceiv_unregister(); + return 0; + } +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0027-musb-otg-timer-cleanup.patch b/recipes/linux/linux-omap-2.6.29/musb/0027-musb-otg-timer-cleanup.patch new file mode 100644 index 0000000000..f41b766cfe --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0027-musb-otg-timer-cleanup.patch @@ -0,0 +1,198 @@ +From b4b8c1e7604784b9877f07400ff2a718118ef05c Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 31 Mar 2009 12:32:12 -0700 +Subject: [PATCH] musb: otg timer cleanup + +Minor cleanup of OTG timer handling: + * unify decls for OTG time constants, in the core header + * set up and use that timer in a more normal way + * move to the driver struct, so it's usable outside core + +And tighten use and setup of T(a_wait_bcon) so that if it's used, +it's always valid. (If that timer expires, the A-device will +stop powering VBUS. For non-OTG systems, that will be a surprise.) +No behavioral changes, other than more consistency when applying +that core HNP timeout. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_core.c | 41 ++++++++++++++++++++++------------------- + drivers/usb/musb/musb_core.h | 14 +++++++++++--- + drivers/usb/musb/omap2430.c | 2 -- + 3 files changed, 33 insertions(+), 24 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index ac150af..05c5dd3 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -112,6 +112,7 @@ + #include "davinci.h" + #endif + ++#define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON) + + + unsigned musb_debug; +@@ -288,12 +289,6 @@ const char *otg_state_string(struct musb *musb) + #ifdef CONFIG_USB_MUSB_OTG + + /* +- * See also USB_OTG_1-3.pdf 6.6.5 Timers +- * REVISIT: Are the other timers done in the hardware? +- */ +-#define TB_ASE0_BRST 100 /* Min 3.125 ms */ +- +-/* + * Handles OTG hnp timeouts, such as b_ase0_brst + */ + void musb_otg_timer_func(unsigned long data) +@@ -320,10 +315,8 @@ void musb_otg_timer_func(unsigned long data) + spin_unlock_irqrestore(&musb->lock, flags); + } + +-static DEFINE_TIMER(musb_otg_timer, musb_otg_timer_func, 0, 0); +- + /* +- * Stops the B-device HNP state. Caller must take care of locking. ++ * Stops the HNP transition. Caller must take care of locking. + */ + void musb_hnp_stop(struct musb *musb) + { +@@ -661,11 +654,12 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + musb_g_reset(musb); + /* FALLTHROUGH */ + case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */ +- DBG(1, "HNP: Setting timer as %s\n", +- otg_state_string(musb)); +- musb_otg_timer.data = (unsigned long)musb; +- mod_timer(&musb_otg_timer, jiffies +- + msecs_to_jiffies(100)); ++ /* never use invalid T(a_wait_bcon) */ ++ DBG(1, "HNP: in %s, %d msec timeout\n", ++ otg_state_string(musb), ++ TA_WAIT_BCON(musb)); ++ mod_timer(&musb->otg_timer, jiffies ++ + msecs_to_jiffies(TA_WAIT_BCON(musb))); + break; + case OTG_STATE_A_PERIPHERAL: + musb_hnp_stop(musb); +@@ -822,9 +816,9 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + #ifdef CONFIG_USB_MUSB_OTG + musb->xceiv->state = OTG_STATE_B_WAIT_ACON; + DBG(1, "HNP: Setting timer for b_ase0_brst\n"); +- musb_otg_timer.data = (unsigned long)musb; +- mod_timer(&musb_otg_timer, jiffies +- + msecs_to_jiffies(TB_ASE0_BRST)); ++ mod_timer(&musb->otg_timer, jiffies ++ + msecs_to_jiffies( ++ OTG_TIME_B_ASE0_BRST)); + #endif + } + break; +@@ -1680,7 +1674,8 @@ musb_vbus_store(struct device *dev, struct device_attribute *attr, + } + + spin_lock_irqsave(&musb->lock, flags); +- musb->a_wait_bcon = val; ++ /* force T(a_wait_bcon) to be zero/unlimited *OR* valid */ ++ musb->a_wait_bcon = val ? max_t(int, val, OTG_TIME_A_WAIT_BCON) : 0 ; + if (musb->xceiv->state == OTG_STATE_A_WAIT_BCON) + musb->is_active = 0; + musb_platform_try_idle(musb, jiffies + msecs_to_jiffies(val)); +@@ -1699,10 +1694,13 @@ musb_vbus_show(struct device *dev, struct device_attribute *attr, char *buf) + + spin_lock_irqsave(&musb->lock, flags); + val = musb->a_wait_bcon; ++ /* FIXME get_vbus_status() is normally #defined as false... ++ * and is effectively TUSB-specific. ++ */ + vbus = musb_platform_get_vbus_status(musb); + spin_unlock_irqrestore(&musb->lock, flags); + +- return sprintf(buf, "Vbus %s, timeout %lu\n", ++ return sprintf(buf, "Vbus %s, timeout %lu msec\n", + vbus ? "on" : "off", val); + } + static DEVICE_ATTR(vbus, 0644, musb_vbus_show, musb_vbus_store); +@@ -1775,6 +1773,7 @@ allocate_instance(struct device *dev, + hcd->uses_new_polling = 1; + + musb->vbuserr_retry = VBUSERR_RETRY_COUNT; ++ musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; + #else + musb = kzalloc(sizeof *musb, GFP_KERNEL); + if (!musb) +@@ -1969,6 +1968,10 @@ bad_config: + if (status < 0) + goto fail2; + ++#ifdef CONFIG_USB_OTG ++ setup_timer(&musb->otg_timer, musb_otg_timer_func, (unsigned long) musb); ++#endif ++ + /* Init IRQ workqueue before request_irq */ + INIT_WORK(&musb->irq_work, musb_irq_work); + +diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h +index c3ee348..cf3ccb0 100644 +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -180,10 +181,15 @@ enum musb_g_ep0_state { + MUSB_EP0_STAGE_ACKWAIT, /* after zlp, before statusin */ + } __attribute__ ((packed)); + +-/* OTG protocol constants */ ++/* ++ * OTG protocol constants. See USB OTG 1.3 spec, ++ * sections 5.5 "Device Timings" and 6.6.5 "Timers". ++ */ + #define OTG_TIME_A_WAIT_VRISE 100 /* msec (max) */ +-#define OTG_TIME_A_WAIT_BCON 0 /* 0=infinite; min 1000 msec */ +-#define OTG_TIME_A_IDLE_BDIS 200 /* msec (min) */ ++#define OTG_TIME_A_WAIT_BCON 1100 /* min 1 second */ ++#define OTG_TIME_A_AIDL_BDIS 200 /* min 200 msec */ ++#define OTG_TIME_B_ASE0_BRST 100 /* min 3.125 ms */ ++ + + /*************************** REGISTER ACCESS ********************************/ + +@@ -332,6 +338,8 @@ struct musb { + struct list_head control; /* of musb_qh */ + struct list_head in_bulk; /* of musb_qh */ + struct list_head out_bulk; /* of musb_qh */ ++ ++ struct timer_list otg_timer; + #endif + + /* called with IRQs blocked; ON/nonzero implies starting a session, +diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c +index 5f67b03..3fbc807 100644 +--- a/drivers/usb/musb/omap2430.c ++++ b/drivers/usb/musb/omap2430.c +@@ -45,7 +45,6 @@ + #define get_cpu_rev() 2 + #endif + +-#define MUSB_TIMEOUT_A_WAIT_BCON 1100 + + static struct timer_list musb_idle_timer; + +@@ -246,7 +245,6 @@ int __init musb_platform_init(struct musb *musb) + + if (is_host_enabled(musb)) + musb->board_set_vbus = omap_set_vbus; +- musb->a_wait_bcon = MUSB_TIMEOUT_A_WAIT_BCON; + + setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); + +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0028-musb-make-initial-HNP-roleswitch-work-v2.patch b/recipes/linux/linux-omap-2.6.29/musb/0028-musb-make-initial-HNP-roleswitch-work-v2.patch new file mode 100644 index 0000000000..6269016223 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0028-musb-make-initial-HNP-roleswitch-work-v2.patch @@ -0,0 +1,133 @@ +From a637c5056ef52fbb7c41eb7537a9ec3d150231ad Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Thu, 2 Apr 2009 10:16:11 -0700 +Subject: [PATCH] musb: make initial HNP roleswitch work (v2) + +Minor HNP bugfixes, so the initial role switch works: + + - A-Device: + * disconnect-during-suspend enters A_PERIPHERAL state + * kill OTG timer after reset as A_PERIPHERAL ... + * ... and also pass that reset to the gadget + * once HNP succeeds, clear the "ignore_disconnect" flag + * from A_PERIPHERAL, disconnect transitions to A_WAIT_BCON + + - B-Device: + * kill OTG timer on entry to B_HOST state (HNP succeeded) + * once HNP succeeds, clear "ignore_disconnect" flag + * kick the root hub only _after_ the state is adjusted + +Other state transitions are left alone. Notably, exit paths from +the "roles have switched" state ... A_PERIPHERAL handling of that +stays seriously broken. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_core.c | 27 ++++++++++++++++----------- + drivers/usb/musb/musb_gadget.c | 2 +- + drivers/usb/musb/musb_virthub.c | 11 ++++++++++- + 3 files changed, 27 insertions(+), 13 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index 05c5dd3..9dc995a 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -587,28 +587,23 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + if (devctl & MUSB_DEVCTL_LSDEV) + musb->port1_status |= USB_PORT_STAT_LOW_SPEED; + +- if (hcd->status_urb) +- usb_hcd_poll_rh_status(hcd); +- else +- usb_hcd_resume_root_hub(hcd); +- +- MUSB_HST_MODE(musb); +- + /* indicate new connection to OTG machine */ + switch (musb->xceiv->state) { + case OTG_STATE_B_PERIPHERAL: + if (int_usb & MUSB_INTR_SUSPEND) { + DBG(1, "HNP: SUSPEND+CONNECT, now b_host\n"); +- musb->xceiv->state = OTG_STATE_B_HOST; +- hcd->self.is_b_host = 1; + int_usb &= ~MUSB_INTR_SUSPEND; ++ goto b_host; + } else + DBG(1, "CONNECT as b_peripheral???\n"); + break; + case OTG_STATE_B_WAIT_ACON: +- DBG(1, "HNP: Waiting to switch to b_host state\n"); ++ DBG(1, "HNP: CONNECT, now b_host\n"); ++b_host: + musb->xceiv->state = OTG_STATE_B_HOST; + hcd->self.is_b_host = 1; ++ musb->ignore_disconnect = 0; ++ del_timer(&musb->otg_timer); + break; + default: + if ((devctl & MUSB_DEVCTL_VBUS) +@@ -618,6 +613,14 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + } + break; + } ++ ++ /* poke the root hub */ ++ MUSB_HST_MODE(musb); ++ if (hcd->status_urb) ++ usb_hcd_poll_rh_status(hcd); ++ else ++ usb_hcd_resume_root_hub(hcd); ++ + DBG(1, "CONNECT (%s) devctl %02x\n", + otg_state_string(musb), devctl); + } +@@ -662,7 +665,9 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, + + msecs_to_jiffies(TA_WAIT_BCON(musb))); + break; + case OTG_STATE_A_PERIPHERAL: +- musb_hnp_stop(musb); ++ musb->ignore_disconnect = 0; ++ del_timer(&musb->otg_timer); ++ musb_g_reset(musb); + break; + case OTG_STATE_B_WAIT_ACON: + DBG(1, "HNP: RESET (%s), to b_peripheral\n", +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index 2fbfba5..7dd3d59 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -1964,7 +1964,7 @@ void musb_g_disconnect(struct musb *musb) + musb->xceiv->state = OTG_STATE_A_IDLE; + break; + case OTG_STATE_A_PERIPHERAL: +- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; ++ musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + break; + case OTG_STATE_B_WAIT_ACON: + case OTG_STATE_B_HOST: +diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c +index 7e7900f..14f7cf3 100644 +--- a/drivers/usb/musb/musb_virthub.c ++++ b/drivers/usb/musb/musb_virthub.c +@@ -187,8 +187,17 @@ void musb_root_disconnect(struct musb *musb) + musb->is_active = 0; + + switch (musb->xceiv->state) { +- case OTG_STATE_A_HOST: + case OTG_STATE_A_SUSPEND: ++#ifdef CONFIG_USB_MUSB_OTG ++ if (is_otg_enabled(musb) ++ && musb->xceiv->host->b_hnp_enable) { ++ musb->xceiv->state = OTG_STATE_A_PERIPHERAL; ++ musb->g.is_a_peripheral = 1; ++ break; ++ } ++#endif ++ /* FALLTHROUGH */ ++ case OTG_STATE_A_HOST: + musb->xceiv->state = OTG_STATE_A_WAIT_BCON; + musb->is_active = 0; + break; +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap-2.6.29/musb/0029-musb-support-disconnect-after-HNP-roleswitch.patch b/recipes/linux/linux-omap-2.6.29/musb/0029-musb-support-disconnect-after-HNP-roleswitch.patch new file mode 100644 index 0000000000..fc34fb983e --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/musb/0029-musb-support-disconnect-after-HNP-roleswitch.patch @@ -0,0 +1,145 @@ +From 4288b7df4ae6629a4fb14aca2c489da01d4d19c3 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Tue, 31 Mar 2009 12:35:09 -0700 +Subject: [PATCH] musb: support disconnect after HNP roleswitch + +Adjust HNP state machines in MUSB driver so that they handle the +case where the cable is disconnected. The A-side machine was +very wrong (unrecoverable); the B-Side was much less so. + + - A_PERIPHERAL ... as usual, the non-observability of the ID + pin through Mentor's registers makes trouble. We can't go + directly to A_WAIT_VFALL to end the session and start the + disconnect processing. We can however sense link suspending, + go to A_WAIT_BCON, and from there use OTG timeouts to finally + trigger that A_WAIT_VFALL transition. (Hoping that nobody + reconnects quickly to that port and notices the wrong state.) + + - B_HOST ... actually clear the Host Request (HR) bit as the + messages say, disconnect the peripheral from the root hub, + and don't detour through a suspend state. (In some cases + this would eventually have cleaned up.) + +Also adjust the A_SUSPEND transition to respect the A_AIDL_BDIS +timeout, so if HNP doesn't trigger quickly enough the A_WAIT_VFALL +transition happens as it should. + +Signed-off-by: David Brownell +--- + drivers/usb/musb/musb_core.c | 41 +++++++++++++++++++++++++++----------- + drivers/usb/musb/musb_gadget.c | 2 + + drivers/usb/musb/musb_virthub.c | 4 +++ + 3 files changed, 35 insertions(+), 12 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index 9dc995a..5770ccb 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -304,9 +304,11 @@ void musb_otg_timer_func(unsigned long data) + musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->is_active = 0; + break; ++ case OTG_STATE_A_SUSPEND: + case OTG_STATE_A_WAIT_BCON: +- DBG(1, "HNP: a_wait_bcon timeout; back to a_host\n"); +- musb_hnp_stop(musb); ++ DBG(1, "HNP: %s timeout\n", otg_state_string(musb)); ++ musb_set_vbus(musb, 0); ++ musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; + break; + default: + DBG(1, "HNP: Unhandled mode %s\n", otg_state_string(musb)); +@@ -324,15 +326,12 @@ void musb_hnp_stop(struct musb *musb) + void __iomem *mbase = musb->mregs; + u8 reg; + ++ DBG(1, "HNP: stop from %s\n", otg_state_string(musb)); ++ + switch (musb->xceiv->state) { + case OTG_STATE_A_PERIPHERAL: +- case OTG_STATE_A_WAIT_VFALL: +- case OTG_STATE_A_WAIT_BCON: +- DBG(1, "HNP: Switching back to A-host\n"); + musb_g_disconnect(musb); +- musb->xceiv->state = OTG_STATE_A_IDLE; +- MUSB_HST_MODE(musb); +- musb->is_active = 0; ++ DBG(1, "HNP: back to %s\n", otg_state_string(musb)); + break; + case OTG_STATE_B_HOST: + DBG(1, "HNP: Disabling HR\n"); +@@ -775,7 +774,16 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + #endif /* HOST */ + #ifdef CONFIG_USB_MUSB_OTG + case OTG_STATE_B_HOST: +- musb_hnp_stop(musb); ++ /* REVISIT this behaves for "real disconnect" ++ * cases; make sure the other transitions from ++ * from B_HOST act right too. The B_HOST code ++ * in hnp_stop() is currently not used... ++ */ ++ musb_root_disconnect(musb); ++ musb_to_hcd(musb)->self.is_b_host = 0; ++ musb->xceiv->state = OTG_STATE_B_PERIPHERAL; ++ MUSB_DEV_MODE(musb); ++ musb_g_disconnect(musb); + break; + case OTG_STATE_A_PERIPHERAL: + musb_hnp_stop(musb); +@@ -807,10 +815,19 @@ static irqreturn_t musb_stage2_irq(struct musb *musb, u8 int_usb, + switch (musb->xceiv->state) { + #ifdef CONFIG_USB_MUSB_OTG + case OTG_STATE_A_PERIPHERAL: +- /* +- * We cannot stop HNP here, devctl BDEVICE might be +- * still set. ++ /* We also come here if the cable is removed, since ++ * this silicon doesn't report ID-no-longer-grounded. ++ * ++ * We depend on T(a_wait_bcon) to shut us down, and ++ * hope users don't do anything dicey during this ++ * undesired detour through A_WAIT_BCON. + */ ++ musb_hnp_stop(musb); ++ usb_hcd_resume_root_hub(musb_to_hcd(musb)); ++ musb_root_disconnect(musb); ++ musb_platform_try_idle(musb, jiffies ++ + msecs_to_jiffies(musb->a_wait_bcon ++ ? : OTG_TIME_A_WAIT_BCON)); + break; + #endif + case OTG_STATE_B_PERIPHERAL: +diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c +index 7dd3d59..8b3c4e2 100644 +--- a/drivers/usb/musb/musb_gadget.c ++++ b/drivers/usb/musb/musb_gadget.c +@@ -1962,9 +1962,11 @@ void musb_g_disconnect(struct musb *musb) + DBG(2, "Unhandled disconnect %s, setting a_idle\n", + otg_state_string(musb)); + musb->xceiv->state = OTG_STATE_A_IDLE; ++ MUSB_HST_MODE(musb); + break; + case OTG_STATE_A_PERIPHERAL: + musb->xceiv->state = OTG_STATE_A_WAIT_BCON; ++ MUSB_HST_MODE(musb); + break; + case OTG_STATE_B_WAIT_ACON: + case OTG_STATE_B_HOST: +diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c +index 14f7cf3..e8ef925 100644 +--- a/drivers/usb/musb/musb_virthub.c ++++ b/drivers/usb/musb/musb_virthub.c +@@ -83,6 +83,10 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) + musb->xceiv->state = OTG_STATE_A_SUSPEND; + musb->is_active = is_otg_enabled(musb) + && musb->xceiv->host->b_hnp_enable; ++ if (musb->is_active) ++ mod_timer(&musb->otg_timer, jiffies ++ + msecs_to_jiffies( ++ OTG_TIME_A_AIDL_BDIS)); + musb_platform_try_idle(musb, 0); + break; + #ifdef CONFIG_USB_MUSB_OTG +-- +1.6.0.4 + diff --git a/recipes/linux/linux-omap_2.6.28.bb b/recipes/linux/linux-omap_2.6.28.bb index bc085c7e06..92de11eb9b 100644 --- a/recipes/linux/linux-omap_2.6.28.bb +++ b/recipes/linux/linux-omap_2.6.28.bb @@ -12,7 +12,6 @@ DEFAULT_PREFERENCE_omap5912osk = "1" SRCREV = "79d042a081d3e467c735bb0d9569ed6296f85a3c" PV = "2.6.28" -PR = "r19" SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git;branch=omap-2.6.28;protocol=git \ file://defconfig" diff --git a/recipes/linux/linux-omap_2.6.29.bb b/recipes/linux/linux-omap_2.6.29.bb index a2391ee522..6300e0d708 100644 --- a/recipes/linux/linux-omap_2.6.29.bb +++ b/recipes/linux/linux-omap_2.6.29.bb @@ -10,7 +10,7 @@ DEFAULT_PREFERENCE_overo = "1" SRCREV = "58cf2f1425abfd3a449f9fe985e48be2d2555022" -PR = "r7+gitr${SRCREV}" +PR_append = "+gitr${SRCREV}" SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git;protocol=git \ file://defconfig" @@ -20,7 +20,19 @@ SRC_URI_append = " \ file://no-cortex-deadlock.patch;patch=1 \ file://read_die_ids.patch;patch=1 \ file://fix-install.patch;patch=1 \ - file://DSS2.diff;patch=1 \ + file://dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch;patch=1 \ + file://dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch;patch=1 \ + file://dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch;patch=1 \ + file://dss2/0004-DSS2-OMAP-framebuffer-driver.patch;patch=1 \ + file://dss2/0005-DSS2-Add-panel-drivers.patch;patch=1 \ + file://dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch;patch=1 \ + file://dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch;patch=1 \ + file://dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch;patch=1 \ + file://dss2/0009-DSS2-Add-acx565akm-panel.patch;patch=1 \ + file://dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch;patch=1 \ + file://dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch;patch=1 \ + file://dss2/0012-DSS2-Fix-DMA-rotation.patch;patch=1 \ + file://dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch;patch=1 \ file://0001-board-ldp-add-regulator-info-to-get-the-microSD-slo.patch;patch=1 \ file://fix-unaligned-access.diff;patch=1 \ file://make-alignment-visible.diff;patch=1 \ @@ -28,6 +40,60 @@ SRC_URI_append = " \ file://ehci.patch;patch=1 \ file://fix-audio-capture.patch;patch=1 \ file://ads7846-detection.patch;patch=1 \ + file://musb/0001-USB-musb-only-turn-off-vbus-in-OTG-hosts.patch;patch=1 \ + file://musb/0002-USB-composite-avoid-inconsistent-lock-state.patch;patch=1 \ + file://musb/0003-USB-musb-NAK-timeout-scheme-on-bulk-RX-endpoint.patch;patch=1 \ + file://musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch;patch=1 \ + file://musb/0005-USB-TWL-disable-VUSB-regulators-when-cable-unplugg.patch;patch=1 \ + file://musb/0006-USB-gadget-composite-device-level-suspend-resume-h.patch;patch=1 \ + file://musb/0007-usb-gadget-fix-ethernet-link-reports-to-ethtool.patch;patch=1 \ + file://musb/0008-usb-musb_host-minor-enqueue-locking-fix-v2.patch;patch=1 \ + file://musb/0009-usb-musb_host-fix-ep0-fifo-flushing.patch;patch=1 \ + file://musb/0010-musb-sanitize-clearing-TXCSR-DMA-bits-take-2.patch;patch=1 \ + file://musb/0011-musb-fix-isochronous-TXDMA-take-2.patch;patch=1 \ + file://musb/0012-musb-fix-possible-panic-while-resuming.patch;patch=1 \ + file://musb/0013-musb_host-refactor-musb_save_toggle-take-2.patch;patch=1 \ + file://musb/0014-musb_gadget-suppress-parasitic-TX-interrupts-with.patch;patch=1 \ + file://musb/0015-musb_gadget-fix-unhandled-endpoint-0-IRQs.patch;patch=1 \ + file://musb/0016-musb_host-factor-out-musb_ep_-get-set-_qh.patch;patch=1 \ + file://musb/0017-musb_host-refactor-URB-giveback.patch;patch=1 \ + file://musb/0018-musb-split-out-CPPI-interrupt-handler.patch;patch=1 \ + file://musb/0019-musb_host-simplify-check-for-active-URB.patch;patch=1 \ + file://musb/0020-musb_host-streamline-musb_cleanup_urb-calls.patch;patch=1 \ + file://musb/0021-twl4030-usb-fix-minor-reporting-goofage.patch;patch=1 \ + file://musb/0022-musb-use-dma-mode-1-for-TX-if-transfer-size-equals.patch;patch=1 \ + file://musb/0023-musb-add-high-bandwidth-ISO-support.patch;patch=1 \ + file://musb/0024-USB-otg-adding-nop-usb-transceiver.patch;patch=1 \ + file://musb/0025-nop-usb-xceiv-behave-when-linked-as-a-module.patch;patch=1 \ + file://musb/0026-musb-proper-hookup-to-transceiver-drivers.patch;patch=1 \ + file://musb/0027-musb-otg-timer-cleanup.patch;patch=1 \ + file://musb/0028-musb-make-initial-HNP-roleswitch-work-v2.patch;patch=1 \ + file://musb/0029-musb-support-disconnect-after-HNP-roleswitch.patch;patch=1 \ + file://isp/v4l/0001-V4L2-Add-COLORFX-user-control.patch;patch=1 \ + file://isp/v4l/0002-V4L-Int-if-v4l2_int_device_try_attach_all-requires.patch;patch=1 \ + file://isp/v4l/0003-V4L-Int-if-Dummy-slave.patch;patch=1 \ + file://isp/v4l/0004-V4L-int-device-add-support-for-VIDIOC_QUERYMENU.patch;patch=1 \ + file://isp/v4l/0005-V4L-Int-if-Add-vidioc_int_querycap.patch;patch=1 \ + file://isp/iommu/0001-omap-iommu-tlb-and-pagetable-primitives.patch;patch=1 \ + file://isp/iommu/0002-omap-iommu-omap2-architecture-specific-functions.patch;patch=1 \ + file://isp/iommu/0003-omap-iommu-omap3-iommu-device-registration.patch;patch=1 \ + file://isp/iommu/0004-omap-iommu-simple-virtual-address-space-management.patch;patch=1 \ + file://isp/iommu/0005-omap-iommu-entries-for-Kconfig-and-Makefile.patch;patch=1 \ + file://isp/iommu/0006-omap-iommu-Don-t-try-BUG_ON-in_interrupt.patch;patch=1 \ + file://isp/iommu/0007-omap-iommu-We-support-chained-scatterlists-probabl.patch;patch=1 \ + file://isp/iommu/0008-omap2-iommu-entries-for-Kconfig-and-Makefile.patch;patch=1 \ + file://isp/omap3camera/0001-omap3isp-Add-ISP-main-driver-and-register-definitio.patch;patch=1 \ + file://isp/omap3camera/0002-omap3isp-Add-ISP-MMU-wrapper.patch;patch=1 \ + file://isp/omap3camera/0003-omap3isp-Add-userspace-header.patch;patch=1 \ + file://isp/omap3camera/0004-omap3isp-Add-ISP-frontend-CCDC.patch;patch=1 \ + file://isp/omap3camera/0005-omap3isp-Add-ISP-backend-PRV-and-RSZ.patch;patch=1 \ + file://isp/omap3camera/0006-omap3isp-Add-statistics-collection-modules-H3A-and.patch;patch=1 \ + file://isp/omap3camera/0007-omap3isp-Add-CSI2-interface-support.patch;patch=1 \ + file://isp/omap3camera/0008-omap3isp-Add-ISP-tables.patch;patch=1 \ + file://isp/omap3camera/0009-omap34xxcam-Add-camera-driver.patch;patch=1 \ +# file://isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch;patch=1 \ +# file://isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch;patch=1 \ +# file://isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch;patch=1 \ " -- cgit v1.2.3 From 121da71778dbd602250e0d52fdae15d359d4a50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 10:24:10 +0000 Subject: libnl: use LDFLAGS (fixes QA error) --- .../files/local-includes-and-avoid-wrong-ldflags.patch | 13 ------------- recipes/libnl/files/local-includes.patch | 12 ++++++++++++ recipes/libnl/files/respect-ldflags.patch | 12 ++++++++++++ recipes/libnl/libnl_1.1.bb | 5 +++-- 4 files changed, 27 insertions(+), 15 deletions(-) delete mode 100644 recipes/libnl/files/local-includes-and-avoid-wrong-ldflags.patch create mode 100644 recipes/libnl/files/local-includes.patch create mode 100644 recipes/libnl/files/respect-ldflags.patch diff --git a/recipes/libnl/files/local-includes-and-avoid-wrong-ldflags.patch b/recipes/libnl/files/local-includes-and-avoid-wrong-ldflags.patch deleted file mode 100644 index 428df53a94..0000000000 --- a/recipes/libnl/files/local-includes-and-avoid-wrong-ldflags.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- libnl-1.0-pre8/Makefile.opts.in.orig 2007-11-21 18:25:39.000000000 +0100 -+++ libnl-1.0-pre8/Makefile.opts.in 2008-04-04 23:38:40.000000000 +0200 -@@ -10,8 +10,8 @@ - # - - CC := @CC@ --CFLAGS := @CFLAGS@ --LDFLAGS := @LDFLAGS@ -+CFLAGS := -I./include -I. -I../include @CFLAGS@ -+LDFLAGS := - CPPFLAGS := @CPPFLAGS@ - PACKAGE_NAME := @PACKAGE_NAME@ - PACKAGE_VERSION := @PACKAGE_VERSION@ diff --git a/recipes/libnl/files/local-includes.patch b/recipes/libnl/files/local-includes.patch new file mode 100644 index 0000000000..85659db6d7 --- /dev/null +++ b/recipes/libnl/files/local-includes.patch @@ -0,0 +1,12 @@ +diff -urN libnl-1.1.orig/Makefile.opts.in libnl-1.1/Makefile.opts.in +--- libnl-1.1.orig/Makefile.opts.in 2008-01-14 15:48:45.000000000 +0000 ++++ libnl-1.1/Makefile.opts.in 2009-04-06 10:20:40.000000000 +0000 +@@ -10,7 +10,7 @@ + # + + CC := @CC@ +-CFLAGS := @CFLAGS@ ++CFLAGS := -I./include -I. -I../include @CFLAGS@ + LDFLAGS := @LDFLAGS@ + CPPFLAGS := @CPPFLAGS@ + PACKAGE_NAME := @PACKAGE_NAME@ diff --git a/recipes/libnl/files/respect-ldflags.patch b/recipes/libnl/files/respect-ldflags.patch new file mode 100644 index 0000000000..ba97dc6724 --- /dev/null +++ b/recipes/libnl/files/respect-ldflags.patch @@ -0,0 +1,12 @@ +diff -urN libnl-1.1.orig/lib/Makefile libnl-1.1/lib/Makefile +--- libnl-1.1.orig/lib/Makefile 2008-01-14 15:48:45.000000000 +0000 ++++ libnl-1.1/lib/Makefile 2009-04-06 10:16:21.000000000 +0000 +@@ -48,7 +48,7 @@ + + $(OUT_SLIB): ../Makefile.opts $(OBJ) + @echo " LD $(OUT_SLIB)"; \ +- $(CC) -shared -Wl,-soname,libnl.so.1 -o $(OUT_SLIB) $(OBJ) $(LIBNL_LIB) -lc ++ $(CC) $(LDFLAGS) -shared -Wl,-soname,libnl.so.1 -o $(OUT_SLIB) $(OBJ) $(LIBNL_LIB) -lc + @echo " LN $(OUT_SLIB) $(LN1_SLIB)"; \ + rm -f $(LN1_SLIB) ; $(LN) -s $(OUT_SLIB) $(LN1_SLIB) + @echo " LN $(LN1_SLIB) $(LN_SLIB)"; \ diff --git a/recipes/libnl/libnl_1.1.bb b/recipes/libnl/libnl_1.1.bb index dcca3c6e92..5f2d6f1a07 100644 --- a/recipes/libnl/libnl_1.1.bb +++ b/recipes/libnl/libnl_1.1.bb @@ -2,7 +2,7 @@ DESCRIPTION = "libnl is a library for applications dealing with netlink sockets" SECTION = "libs/network" LICENSE = "LGPL" HOMEPAGE = "http://people.suug.ch/~tgr/libnl" -PR = "r1" +PR = "r2" inherit autotools pkgconfig @@ -10,8 +10,9 @@ CFLAGS += '-DVLAN_FLAG_REORDER_HDR=1' SRC_URI = "\ http://people.suug.ch/~tgr/libnl/files/libnl-${PV}.tar.gz \ - file://local-includes-and-avoid-wrong-ldflags.patch;patch=1 \ + file://local-includes.patch;patch=1 \ file://fix-includes.patch;patch=1 \ + file://respect-ldflags.patch;patch=1 \ " do_stage () { -- cgit v1.2.3 From af0a5237360814352bc7eb6f92e1d4b9b002a7c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 11:00:35 +0000 Subject: tcp-wrappers: use LDFLAGS (fixes QA error) --- recipes/tcp-wrappers/tcp-wrappers-7.6/ldflags | 43 +++++++++++++++++++++++++++ recipes/tcp-wrappers/tcp-wrappers_7.6.bb | 3 +- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 recipes/tcp-wrappers/tcp-wrappers-7.6/ldflags diff --git a/recipes/tcp-wrappers/tcp-wrappers-7.6/ldflags b/recipes/tcp-wrappers/tcp-wrappers-7.6/ldflags new file mode 100644 index 0000000000..2e897650e0 --- /dev/null +++ b/recipes/tcp-wrappers/tcp-wrappers-7.6/ldflags @@ -0,0 +1,43 @@ +Index: tcp_wrappers_7.6.orig/Makefile +=================================================================== +--- tcp_wrappers_7.6.orig.orig/Makefile 2009-04-06 10:55:47.000000000 +0000 ++++ tcp_wrappers_7.6.orig/Makefile 2009-04-06 10:57:04.000000000 +0000 +@@ -748,31 +748,31 @@ + + $(SHLIB): $(SHLIB_OBJ) + rm -f $(SHLIB) +- $(CC) -o $(SHLIB) $(SHLINKFLAGS) $(SHLIB_OBJ) ++ $(CC) $(LDFLAGS) -o $(SHLIB) $(SHLINKFLAGS) $(SHLIB_OBJ) + ln -sf $(notdir $(SHLIB)) $(SHLIBSOMAJ) + ln -sf $(notdir $(SHLIBSOMAJ)) $(SHLIBSO) + + tcpd: tcpd.o $(SHLIB) +- $(CC) $(CFLAGS) -o $@ tcpd.o $(SHLIBFLAGS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ tcpd.o $(SHLIBFLAGS) + + miscd: miscd.o $(LIB) +- $(CC) $(CFLAGS) -o $@ miscd.o $(LIB) $(LIBS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ miscd.o $(LIB) $(LIBS) + + safe_finger: safe_finger.o $(SHLIB) +- $(CC) $(CFLAGS) -o $@ safe_finger.o $(SHLIBFLAGS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ safe_finger.o $(SHLIBFLAGS) + + TCPDMATCH_OBJ = tcpdmatch.o fakelog.o inetcf.o scaffold.o + + tcpdmatch: $(TCPDMATCH_OBJ) $(SHLIB) +- $(CC) $(CFLAGS) -o $@ $(TCPDMATCH_OBJ) $(SHLIBFLAGS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(TCPDMATCH_OBJ) $(SHLIBFLAGS) + + try-from: try-from.o fakelog.o $(SHLIB) +- $(CC) $(CFLAGS) -o $@ try-from.o fakelog.o $(SHLIBFLAGS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ try-from.o fakelog.o $(SHLIBFLAGS) + + TCPDCHK_OBJ = tcpdchk.o fakelog.o inetcf.o scaffold.o + + tcpdchk: $(TCPDCHK_OBJ) $(SHLIB) +- $(CC) $(CFLAGS) -o $@ $(TCPDCHK_OBJ) $(SHLIBFLAGS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(TCPDCHK_OBJ) $(SHLIBFLAGS) + + shar: $(KIT) + @shar $(KIT) diff --git a/recipes/tcp-wrappers/tcp-wrappers_7.6.bb b/recipes/tcp-wrappers/tcp-wrappers_7.6.bb index a047c55a26..1f1afc1342 100644 --- a/recipes/tcp-wrappers/tcp-wrappers_7.6.bb +++ b/recipes/tcp-wrappers/tcp-wrappers_7.6.bb @@ -3,7 +3,7 @@ DESCRIPTION = "Tools for monitoring and filtering incoming requests for tcp \ LICENSE = "tcp-wrappers" PRIORITY = "optional" SECTION = "console/network" -PR ="r2" +PR ="r3" PACKAGES = "${PN}-dbg libwrap libwrap-doc libwrap-dev tcp-wrappers tcp-wrappers-doc" @@ -35,6 +35,7 @@ SRC_URI = "ftp://ftp.porcupine.org/pub/security/tcp_wrappers_${PV}.tar.gz \ file://siglongjmp;patch=1 \ file://size_t;patch=1 \ file://tcpdchk_libwrapped;patch=1 \ + file://ldflags;patch=1 \ \ file://try-from.8 \ file://safe_finger.8" -- cgit v1.2.3 From 95cd55f0b71a8620bcd70dfb2fa8c053a4f1a39f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 11:44:40 +0000 Subject: cups: use LDFLAGS for shared libs (fixes QA error) --- recipes/cups/cups.inc | 4 +--- recipes/cups/cups_1.2.12.bb | 2 +- recipes/cups/cups_1.3.8.bb | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/recipes/cups/cups.inc b/recipes/cups/cups.inc index bbf2377ced..59075fb042 100644 --- a/recipes/cups/cups.inc +++ b/recipes/cups/cups.inc @@ -8,8 +8,6 @@ SRC_URI = "ftp://ftp.easysw.com/pub/cups/${PV}/cups-${PV}-source.tar.bz2 \ inherit autotools binconfig -LDFLAGS += " -L${STAGING_LIBDIR} " - EXTRA_OECONF = " \ --enable-gnutls \ --enable-dbus \ @@ -26,7 +24,7 @@ EXTRA_OECONF = " \ do_configure() { gnu-configize libtoolize --force - oe_runconf + DSOFLAGS="${LDFLAGS}" oe_runconf } do_compile () { diff --git a/recipes/cups/cups_1.2.12.bb b/recipes/cups/cups_1.2.12.bb index bbe3c5d84f..4f7d0d49b6 100644 --- a/recipes/cups/cups_1.2.12.bb +++ b/recipes/cups/cups_1.2.12.bb @@ -1,2 +1,2 @@ require cups.inc -PR = "r1" +PR = "r2" diff --git a/recipes/cups/cups_1.3.8.bb b/recipes/cups/cups_1.3.8.bb index e9fd9850e9..79cbc32715 100644 --- a/recipes/cups/cups_1.3.8.bb +++ b/recipes/cups/cups_1.3.8.bb @@ -1,7 +1,7 @@ require cups.inc SRC_URI += "file://use_echo_only_in_init.patch;patch=1" -PR = "r1" +PR = "r2" DEFAULT_PREFERENCE = "-1" -- cgit v1.2.3 From 5ad39eb0bc5bbf7ebe716009c4551ff44b1d0f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 11:52:55 +0000 Subject: libmng: use LDFLAGS (fixes QA error) --- recipes/libmng/libmng/ldflags.patch | 12 ++++++++++++ recipes/libmng/libmng_1.0.8.bb | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 recipes/libmng/libmng/ldflags.patch diff --git a/recipes/libmng/libmng/ldflags.patch b/recipes/libmng/libmng/ldflags.patch new file mode 100644 index 0000000000..078f552c8d --- /dev/null +++ b/recipes/libmng/libmng/ldflags.patch @@ -0,0 +1,12 @@ +diff -urN libmng-1.0.8.orig/makefiles/makefile.linux libmng-1.0.8/makefiles/makefile.linux +--- libmng-1.0.8.orig/makefiles/makefile.linux 2004-08-06 07:17:40.000000000 +0000 ++++ libmng-1.0.8/makefiles/makefile.linux 2009-04-06 11:49:45.000000000 +0000 +@@ -105,7 +105,7 @@ + libmng.so.$(MNGVER): $(OBJSDLL) + # $(CC) -shared -Wl,-soname,libmng.so.$(MNGMAJ) -o libmng.so.$(MNGVER) \ + # $(OBJSDLL) -L$(ZLIBLIB) -L$(JPEGLIB) -L$(LCMSLIB) -lz -lm -lc +- $(CC) -shared -Wl,-soname,libmng.so.$(MNGMAJ) -o libmng.so.$(MNGVER) \ ++ $(CC) $(LDFLAGS) -shared -Wl,-soname,libmng.so.$(MNGMAJ) -o libmng.so.$(MNGVER) \ + $(OBJSDLL) -L$(ZLIBLIB) -L$(JPEGLIB) -ljpeg -L$(LCMSLIB) -llcms \ + -lz -lm -lc + diff --git a/recipes/libmng/libmng_1.0.8.bb b/recipes/libmng/libmng_1.0.8.bb index 9619cf4c53..d737e3366b 100644 --- a/recipes/libmng/libmng_1.0.8.bb +++ b/recipes/libmng/libmng_1.0.8.bb @@ -2,7 +2,10 @@ DESCRIPTION = "MNG Library" SECTION = "libs" DEPENDS = "zlib jpeg lcms" LICENSE = "libmng" -SRC_URI = "${SOURCEFORGE_MIRROR}/libmng/libmng-${PV}.tar.gz" +PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/libmng/libmng-${PV}.tar.gz \ + file://ldflags.patch;patch=1" inherit pkgconfig @@ -10,13 +13,12 @@ EXTRA_OEMAKE_append = " ZLIBINC=${STAGING_INCDIR} ZLIBLIB=${STAGING_LIBDIR} \ JPEGINC= JPEGLIB= LCMSINC= LCMSLIB=" do_compile() { - unset LDFLAGS oe_runmake -f makefiles/makefile.linux } do_stage() { oe_libinstall -so libmng ${STAGING_LIBDIR} - install -m 0644 ${S}/libmng.h ${STAGING_INCDIR}/ + install -m 0644 ${S}/libmng.h ${STAGING_INCDIR}/ install -m 0644 ${S}/libmng_conf.h ${STAGING_INCDIR}/ install -m 0644 ${S}/libmng_types.h ${STAGING_INCDIR}/ } @@ -24,7 +26,6 @@ do_stage() { do_install() { install -d ${D}${bindir} ${D}${mandir} \ ${D}${libdir} ${D}${includedir} - unset LDFLAGS oe_runmake -f makefiles/makefile.linux install \ INCPATH="${D}${includedir}" LIBPATH="${D}${libdir}" prefix=${prefix} } -- cgit v1.2.3 From 42b3663b07fedb2e7bd19328fbc872cc561b3ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 12:00:46 +0000 Subject: dhclient: use LDFLAGS (fixes QA error) --- recipes/dhclient/dhclient_2.0pl5.bb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes/dhclient/dhclient_2.0pl5.bb b/recipes/dhclient/dhclient_2.0pl5.bb index 20b0dfc440..0b1f614bd4 100644 --- a/recipes/dhclient/dhclient_2.0pl5.bb +++ b/recipes/dhclient/dhclient_2.0pl5.bb @@ -1,12 +1,14 @@ SECTION = "console/network" DESCRIPTION = "ISC DHCP Distribution (client and server)." LICENSE = "BSD" +PR = "r1" SRC_URI = "ftp://ftp.isc.org/isc/dhcp/dhcp-2.0-history/dhcp-${PV}.tar.gz \ file://make.patch;patch=1" S = "${WORKDIR}/dhcp-${PV}" export BINDIR = "${sbindir}" +export LFLAGS = "${LDFLAGS}" do_configure () { ./configure ${TARGET_SYS} -- cgit v1.2.3 From fd2069004f0d17c0edd3dd4130a58419d6b524ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 12:16:20 +0000 Subject: pth: use LDFLAGS (fixes QA error) --- recipes/pth/files/ldflags.patch | 16 ++++++++++++++++ recipes/pth/pth_2.0.2.bb | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 recipes/pth/files/ldflags.patch diff --git a/recipes/pth/files/ldflags.patch b/recipes/pth/files/ldflags.patch new file mode 100644 index 0000000000..9537ca8e19 --- /dev/null +++ b/recipes/pth/files/ldflags.patch @@ -0,0 +1,16 @@ +diff -urN pth-2.0.2.orig/Makefile.in pth-2.0.2/Makefile.in +--- pth-2.0.2.orig/Makefile.in 2004-07-13 10:48:10.000000000 +0000 ++++ pth-2.0.2/Makefile.in 2009-04-06 12:12:37.000000000 +0000 +@@ -168,10 +168,10 @@ + + # build the static and possibly shared libraries + libpth.la: $(LOBJS) +- $(LIBTOOL) --mode=link --quiet $(CC) -o libpth.la $(LOBJS) \ ++ $(LIBTOOL) --mode=link --quiet $(CC) $(LDFLAGS) -o libpth.la $(LOBJS) \ + -rpath $(libdir) -version-info `$(SHTOOL) version -lc -dlibtool $(_VERSION_FILE)` + libpthread.la: pthread.lo $(LOBJS) +- $(LIBTOOL) --mode=link --quiet $(CC) -o libpthread.la pthread.lo $(LOBJS) \ ++ $(LIBTOOL) --mode=link --quiet $(CC) $(LDFLAGS) -o libpthread.la pthread.lo $(LOBJS) \ + -rpath $(libdir) -version-info `$(SHTOOL) version -lc -dlibtool $(_VERSION_FILE)` + + # build the manual pages diff --git a/recipes/pth/pth_2.0.2.bb b/recipes/pth/pth_2.0.2.bb index 81b8a71b63..2583e030fd 100644 --- a/recipes/pth/pth_2.0.2.bb +++ b/recipes/pth/pth_2.0.2.bb @@ -2,10 +2,11 @@ DESCRIPTION = "GNU Portable Threads" SECTION = "libs" PRIORITY = "optional" LICENSE = "GPL LGPL FDL" -PR = "r1" +PR = "r2" SRC_URI = "${GNU_MIRROR}/pth/pth-${PV}.tar.gz \ file://m4-warning.patch;patch=1 \ + file://ldflags.patch;patch=1 \ " PARALLEL_MAKE="" -- cgit v1.2.3 From 877213524a17c032f8eec9c84c791ab3da46216e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 12:50:11 +0000 Subject: gd: use LDFLAGS (fixes QA error) --- recipes/gd/gd_2.0.33.bb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/gd/gd_2.0.33.bb b/recipes/gd/gd_2.0.33.bb index 7c1f7c3d19..7e47b0883e 100644 --- a/recipes/gd/gd_2.0.33.bb +++ b/recipes/gd/gd_2.0.33.bb @@ -2,7 +2,7 @@ SECTION = "libs" LICENSE = "GD" DESCRIPTION = "gd is a library used to create PNG, JPEG, or WBMP images." DEPENDS = "libpng jpeg zlib" -PR = "r1" +PR = "r2" SRC_URI = "http://www.boutell.com/gd/http/gd-${PV}.tar.gz" S = "${WORKDIR}/gd-${PV}" @@ -17,7 +17,7 @@ EXTRA_OECONF += " --with-zlib=${STAGING_LIBDIR}/.. \ --without-xpm \ --without-x" -EXTRA_OEMAKE = "LDFLAGS=-L${STAGING_LIBDIR}" +EXTRA_OEMAKE = 'LDFLAGS="${LDFLAGS}"' headers = "gd.h gdcache.h gd_io.h gdfx.h gdfontmb.h \ gdfontg.h gdfontl.h gdfonts.h gdfontt.h" -- cgit v1.2.3 From c273263b147da671b5ee105eb85d4302daf33555 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 6 Apr 2009 15:12:47 +0200 Subject: u-boot git: update overo and beagleboard to 2009.03 --- recipes/u-boot/files/dss2.patch | 61 +++++++++++++++++++++++++++++++++++++++ recipes/u-boot/files/fw-env.patch | 12 ++++++++ recipes/u-boot/u-boot_git.bb | 16 ++++++++-- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 recipes/u-boot/files/dss2.patch create mode 100644 recipes/u-boot/files/fw-env.patch diff --git a/recipes/u-boot/files/dss2.patch b/recipes/u-boot/files/dss2.patch new file mode 100644 index 0000000000..4dfc5d6b10 --- /dev/null +++ b/recipes/u-boot/files/dss2.patch @@ -0,0 +1,61 @@ +diff --git a/include/configs/omap3_overo.h b/include/configs/omap3_overo.h +index dee0417..2f8a952 100644 +--- a/include/configs/omap3_overo.h ++++ b/include/configs/omap3_overo.h +@@ -149,14 +149,21 @@ + #define CONFIG_EXTRA_ENV_SETTINGS \ + "loadaddr=0x82000000\0" \ + "console=ttyS2,115200n8\0" \ +- "videomode=1024x768@60,vxres=1024,vyres=768\0" \ +- "videospec=omapfb:vram:2M,vram:4M\0" \ ++ "vram=12M\0" \ ++ "dvimode=1024x768MR-16@60\0" \ ++ "defaultdisplay=dvi\0" \ + "mmcargs=setenv bootargs console=${console} " \ +- "video=${videospec},mode:${videomode} " \ ++ "vram=${vram} " \ ++ "omapfb.mode=dvi:${dvimode} " \ ++ "omapfb.debug=y " \ ++ "omapdss.def_disp=${defaultdisplay} " \ + "root=/dev/mmcblk0p2 rw " \ + "rootfstype=ext3 rootwait\0" \ + "nandargs=setenv bootargs console=${console} " \ +- "video=${videospec},mode:${videomode} " \ ++ "vram=${vram} " \ ++ "omapfb.mode=dvi:${dvimode} " \ ++ "omapfb.debug=y " \ ++ "omapdss.def_disp=${defaultdisplay} " \ + "root=/dev/mtdblock4 rw " \ + "rootfstype=jffs2\0" \ + "loadbootscript=fatload mmc 0 ${loadaddr} boot.scr\0" \ +diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h +index dee0417..2f8a952 100644 +--- a/include/configs/omap3_beagle.h ++++ b/include/configs/omap3_beagle.h +@@ -149,14 +149,21 @@ + #define CONFIG_EXTRA_ENV_SETTINGS \ + "loadaddr=0x82000000\0" \ + "console=ttyS2,115200n8\0" \ +- "videomode=1024x768@60,vxres=1024,vyres=768\0" \ +- "videospec=omapfb:vram:2M,vram:4M\0" \ ++ "vram=12M\0" \ ++ "dvimode=1024x768MR-16@60\0" \ ++ "defaultdisplay=dvi\0" \ + "mmcargs=setenv bootargs console=${console} " \ +- "video=${videospec},mode:${videomode} " \ ++ "vram=${vram} " \ ++ "omapfb.mode=dvi:${dvimode} " \ ++ "omapfb.debug=y " \ ++ "omapdss.def_disp=${defaultdisplay} " \ + "root=/dev/mmcblk0p2 rw " \ + "rootfstype=ext3 rootwait\0" \ + "nandargs=setenv bootargs console=${console} " \ +- "video=${videospec},mode:${videomode} " \ ++ "vram=${vram} " \ ++ "omapfb.mode=dvi:${dvimode} " \ ++ "omapfb.debug=y " \ ++ "omapdss.def_disp=${defaultdisplay} " \ + "root=/dev/mtdblock4 rw " \ + "rootfstype=jffs2\0" \ + "loadbootscript=fatload mmc 0 ${loadaddr} boot.scr\0" \ + diff --git a/recipes/u-boot/files/fw-env.patch b/recipes/u-boot/files/fw-env.patch new file mode 100644 index 0000000000..f3dd33597b --- /dev/null +++ b/recipes/u-boot/files/fw-env.patch @@ -0,0 +1,12 @@ +--- git/tools/env/fw_env.config.orig 2009-02-04 09:42:50.000000000 -0700 ++++ git/tools/env/fw_env.config 2009-02-04 14:25:09.000000000 -0700 +@@ -4,8 +4,4 @@ + # Notice, that the "Number of sectors" is ignored on NOR. + + # MTD device name Device offset Env. size Flash sector size Number of sectors +-/dev/mtd1 0x0000 0x4000 0x4000 +-/dev/mtd2 0x0000 0x4000 0x4000 +- +-# NAND example +-#/dev/mtd0 0x4000 0x4000 0x20000 2 ++/dev/mtd2 0x0000 0x20000 0x40000 diff --git a/recipes/u-boot/u-boot_git.bb b/recipes/u-boot/u-boot_git.bb index e5a8d5d327..4b5d5af710 100644 --- a/recipes/u-boot/u-boot_git.bb +++ b/recipes/u-boot/u-boot_git.bb @@ -9,9 +9,12 @@ SRCREV_spitz = "9bf86baaa3b35b25baa2d664e2f7f6cafad689ee" SRCREV_c7x0 = "9bf86baaa3b35b25baa2d664e2f7f6cafad689ee" SRCREV_afeb9260 = "2077e348c2a84901022ad95311b47b70361e6daa" -SRC_URI_beagleboard = "git://www.sakoman.net/git/u-boot-omap3.git;branch=omap3-dev;protocol=git" -SRCREV_beagleboard = "b7038cff739684bb95853eb5bee924c2574a222e" -PV_beagleboard = "2008.10+${PR}+gitr${SRCREV}" +SRC_URI_beagleboard = "git://gitorious.org/u-boot-omap3/mainline.git;branch=omap3-dev;protocol=git \ + file://fw-env.patch;patch=1 \ + file://dss2.patch;patch=1 \ +" +SRCREV_beagleboard = "2dea1db2a3b7c12ed70bbf8ee50755089c5e5170" +PV_beagleboard = "2009.03+${PR}+gitr${SRCREV}" SRC_URI_omap3evm = "git://www.sakoman.net/git/u-boot-omap3.git;branch=omap3;protocol=git" SRCREV_omap3evm = "1e329ec630b31803ee191d2ee335214662b5bfea" @@ -21,6 +24,13 @@ SRC_URI_omapzoom = "git://www.sakoman.net/git/u-boot-omap3.git;branch=omap3-dev; SRCREV_omapzoom = "d691b424f1f5bf7eea3a4131dfc578d272e8f335" PV_omapzoom = "2009.01+${PR}+gitr${SRCREV}" +SRC_URI_overo = "git://gitorious.org/u-boot-omap3/mainline.git;branch=omap3-dev;protocol=git \ + file://fw-env.patch;patch=1 \ + file://dss2.patch;patch=1 \ +" +SRCREV_overo = "2dea1db2a3b7c12ed70bbf8ee50755089c5e5170" +PV_overo = "2009.03+${PR}+gitr${SRCREV}" + SRC_URI_neuros-osd2 = "git://github.com/neuros/u-boot.git;protocol=git;branch=neuros" SRCREV_neuros-osd2 = "8de979d346624c0e4cfe2e5c0f08ce20ca4b5d14" -- cgit v1.2.3 From 66fe0d8e7fdf7ac665ed8d1facae3143aacf4de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 13:38:24 +0000 Subject: postgresql: use LDFLAGS for shared libs (fixes QA error) --- recipes/postgresql/postgresql.inc | 3 +++ recipes/postgresql/postgresql_8.1.4.bb | 2 +- recipes/postgresql/postgresql_8.1.8.bb | 2 +- recipes/postgresql/postgresql_8.2.4.bb | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/recipes/postgresql/postgresql.inc b/recipes/postgresql/postgresql.inc index da74516830..4a11e2a420 100644 --- a/recipes/postgresql/postgresql.inc +++ b/recipes/postgresql/postgresql.inc @@ -11,6 +11,9 @@ SRC_URI = "ftp://ftp-archives.postgresql.org/pub/source/v${PV}/${P}.tar.bz2" LEAD_SONAME = "libpq.so" +# LDFLAGS for shared libraries +export LDFLAGS_SL = "${LDFLAGS}" + inherit autotools pkgconfig do_compile_append() { diff --git a/recipes/postgresql/postgresql_8.1.4.bb b/recipes/postgresql/postgresql_8.1.4.bb index cfb0162bb4..42ba3770ad 100644 --- a/recipes/postgresql/postgresql_8.1.4.bb +++ b/recipes/postgresql/postgresql_8.1.4.bb @@ -1,3 +1,3 @@ require postgresql.inc -PR = "r3" +PR = "r4" diff --git a/recipes/postgresql/postgresql_8.1.8.bb b/recipes/postgresql/postgresql_8.1.8.bb index cfb0162bb4..42ba3770ad 100644 --- a/recipes/postgresql/postgresql_8.1.8.bb +++ b/recipes/postgresql/postgresql_8.1.8.bb @@ -1,3 +1,3 @@ require postgresql.inc -PR = "r3" +PR = "r4" diff --git a/recipes/postgresql/postgresql_8.2.4.bb b/recipes/postgresql/postgresql_8.2.4.bb index 9b60b2b6a7..7e2c370471 100644 --- a/recipes/postgresql/postgresql_8.2.4.bb +++ b/recipes/postgresql/postgresql_8.2.4.bb @@ -1,6 +1,6 @@ require postgresql.inc -PR = "r3" +PR = "r4" DEFAULT_PREFERENCE = "-1" SRC_URI = "http://ftp.de.postgresql.org/mirror/postgresql/source/v${PV}/${P}.tar.bz2 \ -- cgit v1.2.3 From 616a026e640dc5b322a3f4ba6f8de757f389f127 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 6 Apr 2009 15:21:25 +0200 Subject: linux-omap 2.6.29: fixes * add patch to fix leds * tweak ISP patches to handle new API * tweak beagleboard defconfig --- conf/machine/include/omap3.inc | 2 +- .../0124-leds-gpio-broken-with-current-git.patch | 79 ++++++++++++++++++++++ .../linux/linux-omap-2.6.29/beagleboard/defconfig | 12 +++- ...izer-and-Previewer-driver-added-to-commit.patch | 16 ++--- ...Resizer-bug-fixes-on-top-of-1.0.2-release.patch | 14 ++-- recipes/linux/linux-omap_2.6.29.bb | 1 + 6 files changed, 105 insertions(+), 19 deletions(-) create mode 100644 recipes/linux/linux-omap-2.6.29/0124-leds-gpio-broken-with-current-git.patch diff --git a/conf/machine/include/omap3.inc b/conf/machine/include/omap3.inc index f6cf895c52..4e95fb15e4 100644 --- a/conf/machine/include/omap3.inc +++ b/conf/machine/include/omap3.inc @@ -1,6 +1,6 @@ require conf/machine/include/tune-cortexa8.inc PREFERRED_PROVIDER_virtual/kernel = "linux-omap" -MACHINE_KERNEL_PR = "r20" +MACHINE_KERNEL_PR = "r21" KERNEL_IMAGETYPE = "uImage" diff --git a/recipes/linux/linux-omap-2.6.29/0124-leds-gpio-broken-with-current-git.patch b/recipes/linux/linux-omap-2.6.29/0124-leds-gpio-broken-with-current-git.patch new file mode 100644 index 0000000000..dc6e190e89 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/0124-leds-gpio-broken-with-current-git.patch @@ -0,0 +1,79 @@ +From c810e850d830330cf04225a4cff8e981e153f269 Mon Sep 17 00:00:00 2001 +From: David Brownell +Date: Mon, 23 Feb 2009 14:08:14 -0800 +Subject: [PATCH 124/133] leds-gpio broken with current git? +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +On Monday 23 February 2009, David Brownell wrote: +> +> > Perhaps something broke with Tony's RC1 merge? +> > The LEDs are broken for me as well. +> +> Still works for me.  Did you maybe not enable the twl4030 +> GPIO support in Kconfig? + +Oh, and if you did *not*, please give this patch a try. +I've been meaning to test it. + +- Dave + +============== +Sometimes it's awkward to make sure that the array in the +platform_data handed to the leds-gpio driver has only valid +data ... some leds may not be always available, and coping +with that currently requires patching or rebuilding the array. + +This patch fixes that by making it be OK to pass an invalid +GPIO (such as "-EINVAL") ... such table entries are skipped. +--- + drivers/leds/leds-gpio.c | 12 +++++++++++- + 1 files changed, 11 insertions(+), 1 deletions(-) + +diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c +index b13bd29..83737e6 100644 +--- a/drivers/leds/leds-gpio.c ++++ b/drivers/leds/leds-gpio.c +@@ -90,13 +90,19 @@ static int gpio_led_probe(struct platform_device *pdev) + cur_led = &pdata->leds[i]; + led_dat = &leds_data[i]; + ++ /* skip leds that aren't available */ ++ led_dat->gpio = cur_led->gpio; ++ if (!gpio_is_valid(led_dat->gpio)) { ++ dev_dbg(&pdev->dev, "skipping %s\n", cur_led->name); ++ continue; ++ } ++ + ret = gpio_request(cur_led->gpio, cur_led->name); + if (ret < 0) + goto err; + + led_dat->cdev.name = cur_led->name; + led_dat->cdev.default_trigger = cur_led->default_trigger; +- led_dat->gpio = cur_led->gpio; + led_dat->can_sleep = gpio_cansleep(cur_led->gpio); + led_dat->active_low = cur_led->active_low; + if (pdata->gpio_blink_set) { +@@ -124,6 +130,8 @@ static int gpio_led_probe(struct platform_device *pdev) + err: + if (i > 0) { + for (i = i - 1; i >= 0; i--) { ++ if (!gpio_is_valid(leds_data[i].gpio)) ++ continue; + led_classdev_unregister(&leds_data[i].cdev); + cancel_work_sync(&leds_data[i].work); + gpio_free(leds_data[i].gpio); +@@ -144,6 +152,8 @@ static int __devexit gpio_led_remove(struct platform_device *pdev) + leds_data = platform_get_drvdata(pdev); + + for (i = 0; i < pdata->num_leds; i++) { ++ if (!gpio_is_valid(leds_data[i].gpio)) ++ continue; + led_classdev_unregister(&leds_data[i].cdev); + cancel_work_sync(&leds_data[i].work); + gpio_free(leds_data[i].gpio); +-- +1.6.0.4.790.gaa14a + diff --git a/recipes/linux/linux-omap-2.6.29/beagleboard/defconfig b/recipes/linux/linux-omap-2.6.29/beagleboard/defconfig index eb36c0d481..fcbe27c803 100644 --- a/recipes/linux/linux-omap-2.6.29/beagleboard/defconfig +++ b/recipes/linux/linux-omap-2.6.29/beagleboard/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.29-omap1 -# Sat Apr 4 14:17:07 2009 +# Mon Apr 6 15:31:26 2009 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -200,6 +200,7 @@ CONFIG_OMAP_BOOT_REASON=y # CONFIG_OMAP_MUX is not set CONFIG_OMAP_MCBSP=y # CONFIG_OMAP_MBOX_FWK is not set +# CONFIG_OMAP_IOMMU is not set # CONFIG_OMAP_MPU_TIMER is not set CONFIG_OMAP_32K_TIMER=y CONFIG_OMAP_32K_TIMER_HZ=128 @@ -1157,6 +1158,7 @@ CONFIG_VIDEO_CX2341X=m # CONFIG_VIDEO_SAA5246A is not set # CONFIG_VIDEO_SAA5249 is not set # CONFIG_VIDEO_AU0828 is not set +# CONFIG_VIDEO_OMAP3 is not set # CONFIG_SOC_CAMERA is not set CONFIG_V4L_USB_DRIVERS=y CONFIG_USB_VIDEO_CLASS=m @@ -1392,7 +1394,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_MB862XX is not set # CONFIG_FB_OMAP_BOOTLOADER_INIT is not set CONFIG_OMAP2_DSS=y -CONFIG_OMAP2_DSS_VRAM_SIZE=4 +CONFIG_OMAP2_DSS_VRAM_SIZE=14 CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y # CONFIG_OMAP2_DSS_RFBI is not set CONFIG_OMAP2_DSS_VENC=y @@ -1467,7 +1469,7 @@ CONFIG_SND_DRIVERS=y # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set -CONFIG_SND_ARM=y +# CONFIG_SND_ARM is not set CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y @@ -1475,8 +1477,11 @@ CONFIG_SND_USB_CAIAQ=m CONFIG_SND_USB_CAIAQ_INPUT=y CONFIG_SND_SOC=y CONFIG_SND_OMAP_SOC=y +CONFIG_SND_OMAP_SOC_MCBSP=y +CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE=y CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_ALL_CODECS is not set +CONFIG_SND_SOC_TWL4030=y # CONFIG_SOUND_PRIME is not set CONFIG_HID_SUPPORT=y CONFIG_HID=y @@ -1733,6 +1738,7 @@ CONFIG_USB_OTG_UTILS=y CONFIG_USB_GPIO_VBUS=y # CONFIG_ISP1301_OMAP is not set CONFIG_TWL4030_USB=y +# CONFIG_NOP_USB_XCEIV is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_MMC_UNSAFE_RESUME=y diff --git a/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch b/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch index 77b273c789..f796ce8346 100644 --- a/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch +++ b/recipes/linux/linux-omap-2.6.29/isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch @@ -443,7 +443,7 @@ index 0000000..634a056 + wait_for_completion_interruptible(&device->wfc); + + if (device->isp_addr_read) { -+ ispmmu_unmap(device->isp_addr_read); ++ ispmmu_vunmap(device->isp_addr_read); + device->isp_addr_read = 0; + } + @@ -465,7 +465,7 @@ index 0000000..634a056 + struct prev_fh *fh = q->priv_data; + struct prev_device *device = fh->device; + -+ ispmmu_unmap(device->isp_addr_read); ++ ispmmu_vunmap(device->isp_addr_read); + device->isp_addr_read = 0; + spin_lock(&device->vbq_lock); + vb->state = VIDEOBUF_NEEDS_INIT; @@ -550,7 +550,7 @@ index 0000000..634a056 + if (vb->state == VIDEOBUF_NEEDS_INIT) { + err = videobuf_iolock(q, vb, NULL); + if (!err) { -+ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ isp_addr = ispmmu_vmap(dma->sglist, dma->sglen); + if (!isp_addr) + err = -EIO; + else @@ -1450,11 +1450,11 @@ index 0000000..54bc425 + } + + if (fh->isp_addr_read) { -+ ispmmu_unmap(fh->isp_addr_read); ++ ispmmu_vunmap(fh->isp_addr_read); + fh->isp_addr_read = 0; + } + if (fh->isp_addr_write) { -+ ispmmu_unmap(fh->isp_addr_write); ++ ispmmu_vunmap(fh->isp_addr_write); + fh->isp_addr_write = 0; + } + @@ -2128,8 +2128,8 @@ index 0000000..54bc425 + videobuf_dma_free(dma); + } + -+ ispmmu_unmap(fh->isp_addr_read); -+ ispmmu_unmap(fh->isp_addr_write); ++ ispmmu_vunmap(fh->isp_addr_read); ++ ispmmu_vunmap(fh->isp_addr_write); + fh->isp_addr_read = 0; + fh->isp_addr_write = 0; + spin_lock(&fh->vbq_lock); @@ -2231,7 +2231,7 @@ index 0000000..54bc425 + if (vb->state == VIDEOBUF_NEEDS_INIT) { + err = videobuf_iolock(q, vb, NULL); + if (!err) { -+ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ isp_addr = ispmmu_vmap(dma->sglist, dma->sglen); + if (!isp_addr) + err = -EIO; + else { diff --git a/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch b/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch index e14da9986a..631b05f417 100644 --- a/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch +++ b/recipes/linux/linux-omap-2.6.29/isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch @@ -125,11 +125,11 @@ index 54bc425..8059c70 100644 } - if (fh->isp_addr_read) { -- ispmmu_unmap(fh->isp_addr_read); +- ispmmu_vunmap(fh->isp_addr_read); - fh->isp_addr_read = 0; - } - if (fh->isp_addr_write) { -- ispmmu_unmap(fh->isp_addr_write); +- ispmmu_vunmap(fh->isp_addr_write); - fh->isp_addr_write = 0; - } - @@ -270,11 +270,11 @@ index 54bc425..8059c70 100644 + dma = videobuf_to_dma(q->bufs[vb->i]); + videobuf_dma_unmap(q, dma); + videobuf_dma_free(dma); -+ ispmmu_unmap(fh->config->buf_address[vb->i]); ++ ispmmu_vunmap(fh->config->buf_address[vb->i]); + fh->config->buf_address[vb->i] = 0; -- ispmmu_unmap(fh->isp_addr_read); -- ispmmu_unmap(fh->isp_addr_write); +- ispmmu_vunmap(fh->isp_addr_read); +- ispmmu_vunmap(fh->isp_addr_write); - fh->isp_addr_read = 0; - fh->isp_addr_write = 0; spin_lock(&fh->vbq_lock); @@ -429,7 +429,7 @@ index 54bc425..8059c70 100644 if (vb->state == VIDEOBUF_NEEDS_INIT) { - err = videobuf_iolock(q, vb, NULL); - if (!err) { -- isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); +- isp_addr = ispmmu_vmap(dma->sglist, dma->sglen); - if (!isp_addr) - err = -EIO; - else { @@ -491,7 +491,7 @@ index 54bc425..8059c70 100644 + goto buf_release; + spin_unlock(&fh->vbq_lock); + } -+ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ isp_addr = ispmmu_vmap(dma->sglist, dma->sglen); + if (!isp_addr) + err = -EIO; + else { diff --git a/recipes/linux/linux-omap_2.6.29.bb b/recipes/linux/linux-omap_2.6.29.bb index 6300e0d708..23768690c6 100644 --- a/recipes/linux/linux-omap_2.6.29.bb +++ b/recipes/linux/linux-omap_2.6.29.bb @@ -94,6 +94,7 @@ SRC_URI_append = " \ # file://isp/base/0001-omap3-Add-base-address-definitions-and-resources-fo.patch;patch=1 \ # file://isp/standalone/0001-Resizer-and-Previewer-driver-added-to-commit.patch;patch=1 \ # file://isp/standalone/0002-Resizer-bug-fixes-on-top-of-1.0.2-release.patch;patch=1 \ + file://0124-leds-gpio-broken-with-current-git.patch;patch=1 \ " -- cgit v1.2.3 From b3d66c0976e383ec689b2a4893fdfa69ac255f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 13:40:57 +0000 Subject: postgresql-8.2.4: fix SRC_URI and checksums.ini --- conf/checksums.ini | 6 +++--- recipes/postgresql/postgresql_8.2.4.bb | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/conf/checksums.ini b/conf/checksums.ini index 8a7fc457e1..6ded5a9a5d 100644 --- a/conf/checksums.ini +++ b/conf/checksums.ini @@ -18658,9 +18658,9 @@ sha256=ac7e7d311b07abd27b084041bcc943398df303bc86601f281891537bdf1a4e0b md5=b05e1d7f0cac9cc4e096aa21409dee55 sha256=91f75eb29c07271fcbfa2082c8300690efe4a72f2fbf35dace98108b0c6f7ba3 -[ftp://ftp.us.postgresql.org/pub/mirrors/postgresql/source/v8.1.8/postgresql-8.1.8.tar.bz2] -md5=b05e1d7f0cac9cc4e096aa21409dee55 -sha256=91f75eb29c07271fcbfa2082c8300690efe4a72f2fbf35dace98108b0c6f7ba3 +[ftp://ftp-archives.postgresql.org/pub/source/v8.2.4/postgresql-8.2.4.tar.bz2] +md5=af7ec100a33c41bfb8d87b5e0ec2f44a +sha256=8ff6afab743e894c0d96e668dcf9b3d3c1044719d6def45ef7390c64b54ed268 [http://www.povray.org/redirect/www.povray.org/ftp/pub/povray/Official/Unix/povray-3.6.1.tar.bz2] md5=b5789bb7eeaed0809c5c82d0efda571d diff --git a/recipes/postgresql/postgresql_8.2.4.bb b/recipes/postgresql/postgresql_8.2.4.bb index 7e2c370471..b4e4033ed8 100644 --- a/recipes/postgresql/postgresql_8.2.4.bb +++ b/recipes/postgresql/postgresql_8.2.4.bb @@ -3,5 +3,4 @@ require postgresql.inc PR = "r4" DEFAULT_PREFERENCE = "-1" -SRC_URI = "http://ftp.de.postgresql.org/mirror/postgresql/source/v${PV}/${P}.tar.bz2 \ - file://no-ecpg-test.patch;patch=1" +SRC_URI += "file://no-ecpg-test.patch;patch=1" -- cgit v1.2.3 From 0fa410aa02fa0532d24bcf0c6049112272189152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 14:26:30 +0000 Subject: gsoap: use LDFLAGS (fixes QA error) --- recipes/gsoap/gsoap/rename_bogus_ldflags.patch | 12 ++++++++++++ recipes/gsoap/gsoap_2.7.7.bb | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 recipes/gsoap/gsoap/rename_bogus_ldflags.patch diff --git a/recipes/gsoap/gsoap/rename_bogus_ldflags.patch b/recipes/gsoap/gsoap/rename_bogus_ldflags.patch new file mode 100644 index 0000000000..5e4a01c022 --- /dev/null +++ b/recipes/gsoap/gsoap/rename_bogus_ldflags.patch @@ -0,0 +1,12 @@ +diff -urN gsoap-2.7.orig/soapcpp2/wsdl/Makefile.am gsoap-2.7/soapcpp2/wsdl/Makefile.am +--- gsoap-2.7.orig/soapcpp2/wsdl/Makefile.am 2005-07-15 21:04:42.000000000 +0000 ++++ gsoap-2.7/soapcpp2/wsdl/Makefile.am 2009-04-06 14:22:23.000000000 +0000 +@@ -6,7 +6,7 @@ + AUTOMAKE_OPTIONS = foreign 1.4 + + INCLUDES=-I$(top_builddir)/soapcpp2 +-LDFLAGS=$(INCLUDES) ++AM_LDFLAGS=$(INCLUDES) + SOAP=$(top_builddir)/soapcpp2/src/soapcpp2 + SOAP_CPP_LIB=$(top_builddir)/soapcpp2/libgsoap++.a + SOAP_CPP_SRC=wsdlC.cpp diff --git a/recipes/gsoap/gsoap_2.7.7.bb b/recipes/gsoap/gsoap_2.7.7.bb index dc6ff6e320..21a0ace2e3 100644 --- a/recipes/gsoap/gsoap_2.7.7.bb +++ b/recipes/gsoap/gsoap_2.7.7.bb @@ -3,9 +3,10 @@ for the development of SOAP Web Services and clients." SECTION = "devel" LICENSE = "GPL" DEPENDS = "gsoap-native" -PR = "r1" +PR = "r2" -SRC_URI = "${SOURCEFORGE_MIRROR}/gsoap2/gsoap_${PV}.tar.gz" +SRC_URI = "${SOURCEFORGE_MIRROR}/gsoap2/gsoap_${PV}.tar.gz \ + file://rename_bogus_ldflags.patch;patch=1" S = "${WORKDIR}/gsoap-2.7" inherit autotools -- cgit v1.2.3 From 188eaf36733f85c35da2034ec651df17cb9bb773 Mon Sep 17 00:00:00 2001 From: John Lee Date: Fri, 27 Mar 2009 05:15:53 +0800 Subject: openmoko.conf: update sources mirror URL Someone changed the location of om sources mirror without modifying related settings, nor posting a proper notice on any mailing list. --- conf/distro/openmoko.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/distro/openmoko.conf b/conf/distro/openmoko.conf index cb1513de4b..36461087bd 100644 --- a/conf/distro/openmoko.conf +++ b/conf/distro/openmoko.conf @@ -20,9 +20,9 @@ OVERRIDES = "local:${MACHINE}:openmoko:angstrom:${TARGET_OS}:${TARGET_ARCH}:buil INHERIT += "packaged-staging" -CVS_TARBALL_STASH += "http://downloads.openmoko.org/sources/" +CVS_TARBALL_STASH += "http://downloads.openmoko.org/developer/sources/" -PREMIRRORS = "(ftp|https?)$://.*/.* http://downloads.openmoko.org/sources/" +PREMIRRORS = "(ftp|https?)$://.*/.* http://downloads.openmoko.org/developer/sources/" DISTRO_FEED_PREFIX ?= "om-dev" DISTRO_FEED_URI ?= "http://downloads.openmoko.org/repository/testing" -- cgit v1.2.3 From 5820b5762a5a930d85c107a2cad601639883ff9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 15:07:29 +0000 Subject: flite-1.3: use LDFLAGS (fixes QA error) --- recipes/flite/flite-1.3/flite-1.3-Makefile.patch | 3 ++- recipes/flite/flite_1.3.bb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes/flite/flite-1.3/flite-1.3-Makefile.patch b/recipes/flite/flite-1.3/flite-1.3-Makefile.patch index 9a1a82e13b..5b532fd7a8 100644 --- a/recipes/flite/flite-1.3/flite-1.3-Makefile.patch +++ b/recipes/flite/flite-1.3/flite-1.3-Makefile.patch @@ -317,9 +317,10 @@ Index: config/common_make_rules @ rm -rf shared_os && mkdir shared_os @ rm -f $@ $(LIBDIR)/$@.${PROJECT_VERSION} $(LIBDIR)/$@.${PROJECT_SHLIB_VERSION} @ (cd shared_os && ar x ../$<) - @ (cd shared_os && $(CC) -shared -Wl,-soname,$@.${PROJECT_SHLIB_VERSION} -o ../$@.${PROJECT_VERSION} *.os) +- @ (cd shared_os && $(CC) -shared -Wl,-soname,$@.${PROJECT_SHLIB_VERSION} -o ../$@.${PROJECT_VERSION} *.os) - @ ln -s $(LIBDIR)/$@.${PROJECT_VERSION} $(LIBDIR)/$@.${PROJECT_SHLIB_VERSION} - @ ln -s $(LIBDIR)/$@.${PROJECT_SHLIB_VERSION} $(LIBDIR)/$@ ++ @ (cd shared_os && $(CC) $(LDFLAGS) -shared -Wl,-soname,$@.${PROJECT_SHLIB_VERSION} -o ../$@.${PROJECT_VERSION} *.os) + #@ ln -s $(LIBDIR)/$@.${PROJECT_VERSION} $(LIBDIR)/$@.${PROJECT_SHLIB_VERSION} + #@ ln -s $(LIBDIR)/$@.${PROJECT_SHLIB_VERSION} $(LIBDIR)/$@ + @ ln -s $@.${PROJECT_VERSION} $@.${PROJECT_SHLIB_VERSION} diff --git a/recipes/flite/flite_1.3.bb b/recipes/flite/flite_1.3.bb index 360ccb0c23..b553689a4e 100644 --- a/recipes/flite/flite_1.3.bb +++ b/recipes/flite/flite_1.3.bb @@ -1,6 +1,6 @@ require flite.inc -PR = "r3" +PR = "r4" EXTRA_OECONF = "--with-audio=oss --enable-shared" -- cgit v1.2.3 From 442dcb5cfd89de0797354a38cd56f56967a3ad5c Mon Sep 17 00:00:00 2001 From: Marcin Juszkiewicz Date: Mon, 6 Apr 2009 17:01:19 +0200 Subject: pw-am.sh: script to import patches from patchwork into git repository --- contrib/patchwork/pw-am.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 contrib/patchwork/pw-am.sh diff --git a/contrib/patchwork/pw-am.sh b/contrib/patchwork/pw-am.sh new file mode 100755 index 0000000000..2ce6dc4066 --- /dev/null +++ b/contrib/patchwork/pw-am.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Idea and implementation: Koen Kooi +# Multiple patches support: Marcin Juszkiewicz +# +# This script will fetch an 'mbox' patch from patchwork and git am it +# usage: pw-am.sh +# example: 'pw-am.sh 221' will get the patch from http://patchwork.openembedded.org/patch/221/ + +for patchnumber in $@; +do + wget -nv http://patchwork.openembedded.org/patch/$patchnumber/mbox/ -O pw-am-$patchnumber.patch + git am pw-am-$patchnumber.patch +done -- cgit v1.2.3 From dd286ca541427a5f06599947cdd531c5cb79e096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 16:00:46 +0000 Subject: gsoap: actually stage headers and libraries.. --- recipes/gsoap/gsoap_2.7.7.bb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recipes/gsoap/gsoap_2.7.7.bb b/recipes/gsoap/gsoap_2.7.7.bb index 21a0ace2e3..83c7cbb331 100644 --- a/recipes/gsoap/gsoap_2.7.7.bb +++ b/recipes/gsoap/gsoap_2.7.7.bb @@ -3,7 +3,7 @@ for the development of SOAP Web Services and clients." SECTION = "devel" LICENSE = "GPL" DEPENDS = "gsoap-native" -PR = "r2" +PR = "r3" SRC_URI = "${SOURCEFORGE_MIRROR}/gsoap2/gsoap_${PV}.tar.gz \ file://rename_bogus_ldflags.patch;patch=1" @@ -23,5 +23,9 @@ do_install_append() { done } +do_stage() { + autotools_stage_all +} + PACKAGES = "${PN}-dbg ${PN}-dev ${PN} ${PN}-doc ${PN}-locale" FILES_gsoap-dev = "${bindir}/wsdl2h ${bindir}/soapcpp2 ${libdir}" -- cgit v1.2.3 From fe6822f3e85d5b14586d747c72b4e0395d981ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jeremy=20Lain=C3=A9?= Date: Mon, 6 Apr 2009 16:54:42 +0000 Subject: libsoup-2.4: add missing DEPENDS on sqlite3 --- recipes/gnome/libsoup-2.4_2.26.0.bb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/gnome/libsoup-2.4_2.26.0.bb b/recipes/gnome/libsoup-2.4_2.26.0.bb index 5413d49bf8..73824f9da7 100644 --- a/recipes/gnome/libsoup-2.4_2.26.0.bb +++ b/recipes/gnome/libsoup-2.4_2.26.0.bb @@ -1,9 +1,9 @@ DESCRIPTION = "An HTTP library implementation in C" SECTION = "x11/gnome/libs" LICENSE = "GPL" -DEPENDS = "libproxy glib-2.0 gnutls libxml2" +DEPENDS = "libproxy glib-2.0 gnutls libxml2 sqlite3" -Pr = "r1" +PR = "r2" inherit gnome -- cgit v1.2.3 From 877fed8078d379d213290b791a8a1282867f5061 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Mon, 6 Apr 2009 12:16:23 -0700 Subject: gcc-svn: Add recipe to build bleeding edge gcc. --- recipes/gcc/gcc-cross-initial_svn.bb | 9 + recipes/gcc/gcc-cross-intermediate_svn.bb | 8 + recipes/gcc/gcc-cross-sdk_svn.bb | 14 + recipes/gcc/gcc-cross_svn.bb | 11 + recipes/gcc/gcc-svn.inc | 34 + recipes/gcc/gcc-svn/100-uclibc-conf.patch | 37 + .../gcc/gcc-svn/103-uclibc-conf-noupstream.patch | 11 + recipes/gcc/gcc-svn/110-arm-eabi.patch | 27 + recipes/gcc/gcc-svn/200-uclibc-locale.patch | 2833 + recipes/gcc/gcc-svn/203-uclibc-locale-no__x.patch | 233 + .../gcc/gcc-svn/204-uclibc-locale-wchar_fix.patch | 48 + recipes/gcc/gcc-svn/205-uclibc-locale-update.patch | 519 + recipes/gcc/gcc-svn/300-libstdc++-pic.patch | 46 + recipes/gcc/gcc-svn/301-missing-execinfo_h.patch | 11 + recipes/gcc/gcc-svn/302-c99-snprintf.patch | 13 + .../gcc/gcc-svn/303-c99-complex-ugly-hack.patch | 12 + recipes/gcc/gcc-svn/304-index_macro.patch | 24 + .../gcc/gcc-svn/305-libmudflap-susv3-legacy.patch | 49 + recipes/gcc/gcc-svn/306-libstdc++-namespace.patch | 36 + recipes/gcc/gcc-svn/307-locale_facets.patch | 19 + .../gcc-svn/402-libbackend_dep_gcov-iov.h.patch | 13 + .../gcc/gcc-svn/602-sdk-libstdc++-includes.patch | 20 + recipes/gcc/gcc-svn/740-sh-pr24836.patch | 25 + recipes/gcc/gcc-svn/800-arm-bigendian.patch | 34 + .../gcc/gcc-svn/904-flatten-switch-stmt-00.patch | 153 + recipes/gcc/gcc-svn/arm-nolibfloat.patch | 24 + recipes/gcc/gcc-svn/arm-softfloat.patch | 16 + recipes/gcc/gcc-svn/arm-thumb-cache.patch | 29 + recipes/gcc/gcc-svn/arm-thumb.patch | 43 + recipes/gcc/gcc-svn/cache-amnesia.patch | 31 + recipes/gcc/gcc-svn/debian/ada-acats.dpatch | 78 + recipes/gcc/gcc-svn/debian/ada-alpha.dpatch | 88 + .../gcc-svn/debian/ada-default-project-path.dpatch | 147 + recipes/gcc/gcc-svn/debian/ada-driver-check.dpatch | 50 + recipes/gcc/gcc-svn/debian/ada-driver.dpatch | 42 + recipes/gcc/gcc-svn/debian/ada-gcc-name.dpatch | 87 + recipes/gcc/gcc-svn/debian/ada-gnatvsn.dpatch | 46 + recipes/gcc/gcc-svn/debian/ada-libgnatprj.dpatch | 4809 + recipes/gcc/gcc-svn/debian/ada-libgnatvsn.dpatch | 1598 + recipes/gcc/gcc-svn/debian/ada-link-lib.dpatch | 1932 + recipes/gcc/gcc-svn/debian/ada-sjlj.dpatch | 1307 + .../gcc-svn/debian/ada-symbolic-tracebacks.dpatch | 346 + recipes/gcc/gcc-svn/debian/alpha-ieee-doc.dpatch | 44 + recipes/gcc/gcc-svn/debian/alpha-ieee.dpatch | 57 + .../gcc-svn/debian/alpha-no-ev4-directive.dpatch | 49 + .../gcc-svn/debian/arm-unbreak-eabi-armv4t.dpatch | 36 + .../gcc/gcc-svn/debian/boehm-gc-getnprocs.dpatch | 39 + recipes/gcc/gcc-svn/debian/boehm-gc-nocheck.dpatch | 37 + recipes/gcc/gcc-svn/debian/config-ml.dpatch | 94 + recipes/gcc/gcc-svn/debian/cpu-default-i486.dpatch | 37 + recipes/gcc/gcc-svn/debian/cross-fixes.dpatch | 129 + recipes/gcc/gcc-svn/debian/cross-include.dpatch | 39 + recipes/gcc/gcc-svn/debian/deb-protoize.dpatch | 47 + recipes/gcc/gcc-svn/debian/gcc-d-lang.dpatch | 246 + .../gcc-svn/debian/gcc-driver-extra-langs.dpatch | 40 + .../gcc/gcc-svn/debian/gcc-hash-style-both.dpatch | 163 + .../gcc/gcc-svn/debian/gcc-hash-style-gnu.dpatch | 163 + .../gcc/gcc-svn/debian/gcc-i386-emit-cld.dpatch | 179 + recipes/gcc/gcc-svn/debian/gcc-ice-apport.dpatch | 44 + recipes/gcc/gcc-svn/debian/gcc-ice-hack.dpatch | 331 + .../gcc/gcc-svn/debian/gcc-multilib64dir.dpatch | 62 + recipes/gcc/gcc-svn/debian/gcc-pascal-lang.dpatch | 726 + recipes/gcc/gcc-svn/debian/gcc-ssp-default.dpatch | 209 + recipes/gcc/gcc-svn/debian/gcc-textdomain.dpatch | 103 + .../gcc-svn/debian/gdc-fix-build-kbsd-gnu.dpatch | 87 + recipes/gcc/gcc-svn/debian/gpc-4.1.dpatch | 28 + recipes/gcc/gcc-svn/debian/gpc-gcc-4.x.dpatch | 32 + recipes/gcc/gcc-svn/debian/gpc-names.dpatch | 117 + recipes/gcc/gcc-svn/debian/hurd-changes.dpatch | 72 + recipes/gcc/gcc-svn/debian/ignore-comp-fail.dpatch | 38 + recipes/gcc/gcc-svn/debian/kbsd-gnu-ada.dpatch | 231 + recipes/gcc/gcc-svn/debian/kbsd-gnu.dpatch | 99 + recipes/gcc/gcc-svn/debian/libffi-configure.dpatch | 45 + .../gcc-svn/debian/libjava-armel-ldflags.dpatch | 38 + .../gcc/gcc-svn/debian/libjava-debuginfo.dpatch | 43 + .../gcc-svn/debian/libjava-disable-static.dpatch | 45 + recipes/gcc/gcc-svn/debian/libjava-jar.dpatch | 227 + recipes/gcc/gcc-svn/debian/libjava-jnipath.dpatch | 94 + .../debian/libjava-loading-constraints.dpatch | 431 + .../gcc-svn/debian/libjava-nobiarch-check.dpatch | 44 + .../gcc/gcc-svn/debian/libjava-realloc-leak.dpatch | 79 + recipes/gcc/gcc-svn/debian/libjava-rpath.dpatch | 49 + recipes/gcc/gcc-svn/debian/libjava-sjlj.dpatch | 65 + recipes/gcc/gcc-svn/debian/libjava-soname.dpatch | 34 + .../gcc/gcc-svn/debian/libjava-stacktrace.dpatch | 70 + recipes/gcc/gcc-svn/debian/libjava-subdir.dpatch | 246 + .../gcc/gcc-svn/debian/libjava-xulrunner1.9.dpatch | 41 + recipes/gcc/gcc-svn/debian/libobjc-gc-link.dpatch | 73 + recipes/gcc/gcc-svn/debian/libssp-gnu.dpatch | 52 + .../gcc/gcc-svn/debian/libstdc++-doclink.dpatch | 51 + recipes/gcc/gcc-svn/debian/libstdc++-pic.dpatch | 71 + .../gcc-svn/debian/libstdc++-symbols-hppa.dpatch | 369 + recipes/gcc/gcc-svn/debian/link-libs.dpatch | 157 + recipes/gcc/gcc-svn/debian/mips-triarch.dpatch | 61 + recipes/gcc/gcc-svn/debian/mudflap-nocheck.dpatch | 36 + .../gcc/gcc-svn/debian/multiarch-include.dpatch | 138 + recipes/gcc/gcc-svn/debian/multiarch-lib.dpatch | 52 + recipes/gcc/gcc-svn/debian/note-gnu-stack.dpatch | 316 + recipes/gcc/gcc-svn/debian/powerpc-biarch.dpatch | 47 + recipes/gcc/gcc-svn/debian/ppc64-ada.dpatch | 257 + recipes/gcc/gcc-svn/debian/pr24170.dpatch | 88 + recipes/gcc/gcc-svn/debian/pr27880.dpatch | 90 + recipes/gcc/gcc-svn/debian/pr28102.dpatch | 45 + recipes/gcc/gcc-svn/debian/pr28322.dpatch | 151 + recipes/gcc/gcc-svn/debian/pr30961.dpatch | 179 + recipes/gcc/gcc-svn/debian/pr33148.dpatch | 94 + recipes/gcc/gcc-svn/debian/pr34571.dpatch | 63 + .../gcc/gcc-svn/debian/rename-info-files.dpatch | 710 + recipes/gcc/gcc-svn/debian/s390-biarch.dpatch | 36 + recipes/gcc/gcc-svn/debian/sparc-biarch.dpatch | 80 + .../gcc/gcc-svn/debian/svn-class-updates.dpatch | 55 + recipes/gcc/gcc-svn/debian/svn-doc-updates.dpatch | 79 + recipes/gcc/gcc-svn/debian/svn-gdc-updates.dpatch | 137 + recipes/gcc/gcc-svn/debian/svn-updates.dpatch | 569584 ++++++++++++++++++ recipes/gcc/gcc-svn/debian/template.dpatch | 33 + .../gcc-svn/fedora/gcc43-c++-builtin-redecl.patch | 102 + recipes/gcc/gcc-svn/fedora/gcc43-cpp-pragma.patch | 284 + .../gcc/gcc-svn/fedora/gcc43-i386-libgomp.patch | 61 + .../gcc/gcc-svn/fedora/gcc43-ia64-libunwind.patch | 538 + .../fedora/gcc43-java-debug-iface-type.patch | 17 + .../gcc/gcc-svn/fedora/gcc43-java-nomulti.patch | 44 + .../gcc/gcc-svn/fedora/gcc43-libgomp-speedup.patch | 2797 + .../gcc/gcc-svn/fedora/gcc43-ppc32-retaddr.patch | 86 + recipes/gcc/gcc-svn/fedora/gcc43-pr27898.patch | 16 + recipes/gcc/gcc-svn/fedora/gcc43-pr32139.patch | 19 + recipes/gcc/gcc-svn/fedora/gcc43-pr33763.patch | 153 + recipes/gcc/gcc-svn/fedora/gcc43-pr35440.patch | 56 + recipes/gcc/gcc-svn/fedora/gcc43-pr35751.patch | 114 + recipes/gcc/gcc-svn/fedora/gcc43-rh251682.patch | 89 + recipes/gcc/gcc-svn/fedora/gcc43-rh330771.patch | 34 + recipes/gcc/gcc-svn/fedora/gcc43-rh341221.patch | 28 + .../gcc-svn/fix-ICE-in-arm_unwind_emit_set.diff | 28 + .../gcc/gcc-svn/fortran-cross-compile-hack.patch | 30 + recipes/gcc/gcc-svn/fortran-static-linking.patch | 48 + recipes/gcc/gcc-svn/gcc-4.0.2-e300c2c3.patch | 319 + .../gcc/gcc-svn/gcc-4.2.3-linux-multilib-fix.patch | 23 + .../gcc-svn/gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch | 31 + .../gcc-4.3.1-SYSROOT_CFLAGS_FOR_TARGET.patch | 6691 + .../gcc/gcc-svn/gcc-arm-frename-registers.patch | 25 + recipes/gcc/gcc-svn/gcc-flags-for-build.patch | 279 + .../gcc-release-branch/PR-36500-fix-neon.patch | 265 + recipes/gcc/gcc-svn/gcc41-configure.in.patch | 22 + recipes/gcc/gcc-svn/gcc43-build-id.patch | 74 + .../gcc/gcc-svn/gcc43-ppc64-ia64-GNU-stack.patch | 86 + recipes/gcc/gcc-svn/ldflags.patch | 22 + recipes/gcc/gcc-svn/pr34130.patch | 16 + recipes/gcc/gcc-svn/sdk-libstdc++-includes.patch | 22 + .../gcc/gcc-svn/sh3-installfix-fixheaders.patch | 11 + recipes/gcc/gcc-svn/sh_unwind.patch | 18 + recipes/gcc/gcc-svn/unbreak-armv4t.patch | 12 + recipes/gcc/gcc-svn/zecke-no-host-includes.patch | 31 + recipes/gcc/gcc-svn/zecke-xgcc-cpp.patch | 28 + recipes/gcc/gcc_svn.bb | 13 + 153 files changed, 605677 insertions(+) create mode 100644 recipes/gcc/gcc-cross-initial_svn.bb create mode 100644 recipes/gcc/gcc-cross-intermediate_svn.bb create mode 100644 recipes/gcc/gcc-cross-sdk_svn.bb create mode 100644 recipes/gcc/gcc-cross_svn.bb create mode 100644 recipes/gcc/gcc-svn.inc create mode 100644 recipes/gcc/gcc-svn/100-uclibc-conf.patch create mode 100644 recipes/gcc/gcc-svn/103-uclibc-conf-noupstream.patch create mode 100644 recipes/gcc/gcc-svn/110-arm-eabi.patch create mode 100644 recipes/gcc/gcc-svn/200-uclibc-locale.patch create mode 100644 recipes/gcc/gcc-svn/203-uclibc-locale-no__x.patch create mode 100644 recipes/gcc/gcc-svn/204-uclibc-locale-wchar_fix.patch create mode 100644 recipes/gcc/gcc-svn/205-uclibc-locale-update.patch create mode 100644 recipes/gcc/gcc-svn/300-libstdc++-pic.patch create mode 100644 recipes/gcc/gcc-svn/301-missing-execinfo_h.patch create mode 100644 recipes/gcc/gcc-svn/302-c99-snprintf.patch create mode 100644 recipes/gcc/gcc-svn/303-c99-complex-ugly-hack.patch create mode 100644 recipes/gcc/gcc-svn/304-index_macro.patch create mode 100644 recipes/gcc/gcc-svn/305-libmudflap-susv3-legacy.patch create mode 100644 recipes/gcc/gcc-svn/306-libstdc++-namespace.patch create mode 100644 recipes/gcc/gcc-svn/307-locale_facets.patch create mode 100644 recipes/gcc/gcc-svn/402-libbackend_dep_gcov-iov.h.patch create mode 100644 recipes/gcc/gcc-svn/602-sdk-libstdc++-includes.patch create mode 100644 recipes/gcc/gcc-svn/740-sh-pr24836.patch create mode 100644 recipes/gcc/gcc-svn/800-arm-bigendian.patch create mode 100644 recipes/gcc/gcc-svn/904-flatten-switch-stmt-00.patch create mode 100644 recipes/gcc/gcc-svn/arm-nolibfloat.patch create mode 100644 recipes/gcc/gcc-svn/arm-softfloat.patch create mode 100644 recipes/gcc/gcc-svn/arm-thumb-cache.patch create mode 100644 recipes/gcc/gcc-svn/arm-thumb.patch create mode 100644 recipes/gcc/gcc-svn/cache-amnesia.patch create mode 100644 recipes/gcc/gcc-svn/debian/ada-acats.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-alpha.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-default-project-path.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-driver-check.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-driver.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-gcc-name.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-gnatvsn.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-libgnatprj.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-libgnatvsn.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-link-lib.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-sjlj.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ada-symbolic-tracebacks.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/alpha-ieee-doc.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/alpha-ieee.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/alpha-no-ev4-directive.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/arm-unbreak-eabi-armv4t.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/boehm-gc-getnprocs.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/boehm-gc-nocheck.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/config-ml.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/cpu-default-i486.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/cross-fixes.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/cross-include.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/deb-protoize.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-d-lang.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-driver-extra-langs.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-hash-style-both.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-hash-style-gnu.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-i386-emit-cld.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-ice-apport.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-ice-hack.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-multilib64dir.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-pascal-lang.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-ssp-default.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gcc-textdomain.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gdc-fix-build-kbsd-gnu.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gpc-4.1.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gpc-gcc-4.x.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/gpc-names.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/hurd-changes.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ignore-comp-fail.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/kbsd-gnu-ada.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/kbsd-gnu.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libffi-configure.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-armel-ldflags.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-debuginfo.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-disable-static.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-jar.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-jnipath.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-loading-constraints.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-nobiarch-check.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-realloc-leak.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-rpath.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-sjlj.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-soname.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-stacktrace.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-subdir.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libjava-xulrunner1.9.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libobjc-gc-link.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libssp-gnu.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libstdc++-doclink.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libstdc++-pic.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/libstdc++-symbols-hppa.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/link-libs.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/mips-triarch.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/mudflap-nocheck.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/multiarch-include.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/multiarch-lib.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/note-gnu-stack.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/powerpc-biarch.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/ppc64-ada.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr24170.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr27880.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr28102.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr28322.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr30961.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr33148.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/pr34571.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/rename-info-files.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/s390-biarch.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/sparc-biarch.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/svn-class-updates.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/svn-doc-updates.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/svn-gdc-updates.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/svn-updates.dpatch create mode 100644 recipes/gcc/gcc-svn/debian/template.dpatch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-c++-builtin-redecl.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-cpp-pragma.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-i386-libgomp.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-ia64-libunwind.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-java-debug-iface-type.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-java-nomulti.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-libgomp-speedup.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-ppc32-retaddr.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-pr27898.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-pr32139.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-pr33763.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-pr35440.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-pr35751.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-rh251682.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-rh330771.patch create mode 100644 recipes/gcc/gcc-svn/fedora/gcc43-rh341221.patch create mode 100644 recipes/gcc/gcc-svn/fix-ICE-in-arm_unwind_emit_set.diff create mode 100644 recipes/gcc/gcc-svn/fortran-cross-compile-hack.patch create mode 100644 recipes/gcc/gcc-svn/fortran-static-linking.patch create mode 100644 recipes/gcc/gcc-svn/gcc-4.0.2-e300c2c3.patch create mode 100644 recipes/gcc/gcc-svn/gcc-4.2.3-linux-multilib-fix.patch create mode 100644 recipes/gcc/gcc-svn/gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch create mode 100644 recipes/gcc/gcc-svn/gcc-4.3.1-SYSROOT_CFLAGS_FOR_TARGET.patch create mode 100644 recipes/gcc/gcc-svn/gcc-arm-frename-registers.patch create mode 100644 recipes/gcc/gcc-svn/gcc-flags-for-build.patch create mode 100644 recipes/gcc/gcc-svn/gcc-release-branch/PR-36500-fix-neon.patch create mode 100644 recipes/gcc/gcc-svn/gcc41-configure.in.patch create mode 100644 recipes/gcc/gcc-svn/gcc43-build-id.patch create mode 100644 recipes/gcc/gcc-svn/gcc43-ppc64-ia64-GNU-stack.patch create mode 100644 recipes/gcc/gcc-svn/ldflags.patch create mode 100644 recipes/gcc/gcc-svn/pr34130.patch create mode 100644 recipes/gcc/gcc-svn/sdk-libstdc++-includes.patch create mode 100644 recipes/gcc/gcc-svn/sh3-installfix-fixheaders.patch create mode 100644 recipes/gcc/gcc-svn/sh_unwind.patch create mode 100644 recipes/gcc/gcc-svn/unbreak-armv4t.patch create mode 100644 recipes/gcc/gcc-svn/zecke-no-host-includes.patch create mode 100644 recipes/gcc/gcc-svn/zecke-xgcc-cpp.patch create mode 100644 recipes/gcc/gcc_svn.bb diff --git a/recipes/gcc/gcc-cross-initial_svn.bb b/recipes/gcc/gcc-cross-initial_svn.bb new file mode 100644 index 0000000000..067ab61be3 --- /dev/null +++ b/recipes/gcc/gcc-cross-initial_svn.bb @@ -0,0 +1,9 @@ +require gcc-cross_${PV}.bb +require gcc-cross-initial.inc + +DEPENDS += "gmp-native mpfr-native" + +EXTRA_OECONF += " --disable-libmudflap \ + --disable-libgomp \ + --enable-decimal-float=no \ + --disable-libssp" diff --git a/recipes/gcc/gcc-cross-intermediate_svn.bb b/recipes/gcc/gcc-cross-intermediate_svn.bb new file mode 100644 index 0000000000..a9ae5bdf20 --- /dev/null +++ b/recipes/gcc/gcc-cross-intermediate_svn.bb @@ -0,0 +1,8 @@ +require gcc-cross_${PV}.bb +require gcc-cross-intermediate.inc + +DEPENDS += "gmp-native mpfr-native" + +EXTRA_OECONF += " --disable-libmudflap \ + --disable-libgomp \ + --disable-libssp" diff --git a/recipes/gcc/gcc-cross-sdk_svn.bb b/recipes/gcc/gcc-cross-sdk_svn.bb new file mode 100644 index 0000000000..29ee187785 --- /dev/null +++ b/recipes/gcc/gcc-cross-sdk_svn.bb @@ -0,0 +1,14 @@ +PR = "r1" + +inherit sdk + +require gcc-${PV}.inc +require gcc-cross-sdk.inc +require gcc-configure-sdk.inc +require gcc-package-sdk.inc + +DEPENDS += "gmp-native mpfr-native" + +EXTRA_OECONF += "--disable-libunwind-exceptions --disable-libssp \ + --disable-libgomp --disable-libmudflap \ + --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/recipes/gcc/gcc-cross_svn.bb b/recipes/gcc/gcc-cross_svn.bb new file mode 100644 index 0000000000..a7df4842b9 --- /dev/null +++ b/recipes/gcc/gcc-cross_svn.bb @@ -0,0 +1,11 @@ +PR = "r0" +require gcc-${PV}.inc +require gcc-cross4.inc +require gcc-configure-cross.inc +require gcc-package-cross.inc + +SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " + +EXTRA_OECONF += " --disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" + +ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_DIR_TARGET}${layout_includedir}" diff --git a/recipes/gcc/gcc-svn.inc b/recipes/gcc/gcc-svn.inc new file mode 100644 index 0000000000..94ee5a1ff1 --- /dev/null +++ b/recipes/gcc/gcc-svn.inc @@ -0,0 +1,34 @@ +# No armeb and thumb patches - really needs checking +DEFAULT_PREFERENCE = "-999" +ARM_INSTRUCTION_SET = "arm" + +require gcc-common.inc + +DEPENDS = "mpfr gmp" + +GCC_BASE ?= "4.5" +PV = "${GCC_BASE}+svnr${SRCREV}" +PR = "r0" +#DEFAULT_PREFERENCE is 0 (empty), releases have a preference of 1 so take +# precedence. + +FILESPATHPKG .= ":gcc-svn" + +SRC_URI = "svn://gcc.gnu.org/svn/gcc;module=trunk \ + " +# Language Overrides +FORTRAN = "" +JAVA = "" + +EXTRA_OECONF_BASE = " --enable-libssp \ + --disable-bootstrap --disable-libgomp \ + --disable-libmudflap" + +rename_srcdir (){ + mv ${WORKDIR}/trunk ${WORKDIR}/gcc-${PV} +} + +do_unpack_append() { + bb.build.exec_func('rename_srcdir', d) +} + diff --git a/recipes/gcc/gcc-svn/100-uclibc-conf.patch b/recipes/gcc/gcc-svn/100-uclibc-conf.patch new file mode 100644 index 0000000000..0b799607e8 --- /dev/null +++ b/recipes/gcc/gcc-svn/100-uclibc-conf.patch @@ -0,0 +1,37 @@ +Index: gcc-4.3.1/contrib/regression/objs-gcc.sh +=================================================================== +--- gcc-4.3.1.orig/contrib/regression/objs-gcc.sh 2007-12-24 15:18:57.000000000 -0800 ++++ gcc-4.3.1/contrib/regression/objs-gcc.sh 2008-08-16 01:15:12.000000000 -0700 +@@ -105,6 +105,10 @@ + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +Index: gcc-4.3.1/libjava/classpath/ltconfig +=================================================================== +--- gcc-4.3.1.orig/libjava/classpath/ltconfig 2007-06-03 16:18:43.000000000 -0700 ++++ gcc-4.3.1/libjava/classpath/ltconfig 2008-08-16 01:15:12.000000000 -0700 +@@ -603,7 +603,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1251,7 +1251,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + version_type=linux + need_lib_prefix=no + need_version=no diff --git a/recipes/gcc/gcc-svn/103-uclibc-conf-noupstream.patch b/recipes/gcc/gcc-svn/103-uclibc-conf-noupstream.patch new file mode 100644 index 0000000000..09c9bbecfb --- /dev/null +++ b/recipes/gcc/gcc-svn/103-uclibc-conf-noupstream.patch @@ -0,0 +1,11 @@ +--- gcc/gcc/config.gcc.uclibc100-sh~ 2006-03-06 20:46:56 +0100 ++++ gcc/gcc/config.gcc 2006-03-10 15:02:41 +0100 +@@ -1905,7 +1905,7 @@ + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" diff --git a/recipes/gcc/gcc-svn/110-arm-eabi.patch b/recipes/gcc/gcc-svn/110-arm-eabi.patch new file mode 100644 index 0000000000..acebe5308f --- /dev/null +++ b/recipes/gcc/gcc-svn/110-arm-eabi.patch @@ -0,0 +1,27 @@ +--- gcc-2005q3-1.orig/gcc/config.gcc 2005-10-31 19:02:54.000000000 +0300 ++++ gcc-2005q3-1/gcc/config.gcc 2006-01-27 01:09:09.000000000 +0300 +@@ -674,7 +674,7 @@ + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-arm" + case ${target} in +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h" + tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" + # The BPABI long long divmod functions return a 128-bit value in + +diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h +--- gcc-2005q3-2/gcc/config/arm/linux-eabi.h 2005-12-07 23:14:16.000000000 +0300 ++++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h 2006-03-29 19:02:34.000000000 +0400 +@@ -53,7 +53,11 @@ + /* Use ld-linux.so.3 so that it will be possible to run "classic" + GNU/Linux binaries on an EABI system. */ + #undef LINUX_TARGET_INTERPRETER ++#ifdef USE_UCLIBC ++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" ++#else + #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3" ++#endif + + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to + use the GNU/Linux version, not the generic BPABI version. */ diff --git a/recipes/gcc/gcc-svn/200-uclibc-locale.patch b/recipes/gcc/gcc-svn/200-uclibc-locale.patch new file mode 100644 index 0000000000..70ba98eed7 --- /dev/null +++ b/recipes/gcc/gcc-svn/200-uclibc-locale.patch @@ -0,0 +1,2833 @@ +Index: gcc-4.3.2/libstdc++-v3/acinclude.m4 +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/acinclude.m4 2008-04-25 09:52:57.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/acinclude.m4 2008-08-28 17:55:56.000000000 -0700 +@@ -1349,7 +1349,7 @@ + AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [ + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # Deal with gettext issues. Default to not using it (=no) until we detect + # support for it later. Let the user turn it off via --e/d, but let that +@@ -1370,6 +1370,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + enable_clocale_flag=gnu + ;; +@@ -1541,6 +1544,40 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++#endif ++ ++#endif // GLIBC 2.3 and later +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,117 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, ++ const int __size __attribute__ ((__unused__)), ++ const char* __fmt, ++#ifdef __UCLIBC_HAS_XCLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XCLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,308 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include // For MB_CUR_MAX ++#include // For MB_LEN_MAX ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,160 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ #endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 2008-08-28 17:55:56.000000000 -0700 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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, or (at your option) ++// any later version. ++ ++// This library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +Index: gcc-4.3.2/libstdc++-v3/configure +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/configure 2008-07-07 12:49:54.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/configure 2008-08-28 18:02:13.000000000 -0700 +@@ -14003,7 +14003,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -14036,6 +14036,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + enable_clocale_flag=gnu + ;; +@@ -14424,6 +14427,76 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +@@ -17016,7 +17089,7 @@ + + # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style. + cat > conftest.$ac_ext << EOF +-#line 17019 "configure" ++#line 17092 "configure" + int main() + { + // NB: _Atomic_word not necessarily int. +Index: gcc-4.3.2/libstdc++-v3/include/c_compatibility/wchar.h +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/include/c_compatibility/wchar.h 2007-03-04 14:59:49.000000000 -0800 ++++ gcc-4.3.2/libstdc++-v3/include/c_compatibility/wchar.h 2008-08-28 17:55:56.000000000 -0700 +@@ -106,7 +106,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +Index: gcc-4.3.2/libstdc++-v3/include/c_std/cwchar +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/include/c_std/cwchar 2007-05-27 07:50:21.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/include/c_std/cwchar 2008-08-28 17:55:56.000000000 -0700 +@@ -182,7 +182,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/recipes/gcc/gcc-svn/203-uclibc-locale-no__x.patch b/recipes/gcc/gcc-svn/203-uclibc-locale-no__x.patch new file mode 100644 index 0000000000..f39e65220c --- /dev/null +++ b/recipes/gcc/gcc-svn/203-uclibc-locale-no__x.patch @@ -0,0 +1,233 @@ +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2008-08-16 01:33:23.000000000 -0700 +@@ -60,4 +60,49 @@ + extern "C" __typeof(wctype_l) __wctype_l; + #endif + ++# define __nl_langinfo_l nl_langinfo_l ++# define __strcoll_l strcoll_l ++# define __strftime_l strftime_l ++# define __strtod_l strtod_l ++# define __strtof_l strtof_l ++# define __strtold_l strtold_l ++# define __strxfrm_l strxfrm_l ++# define __newlocale newlocale ++# define __freelocale freelocale ++# define __duplocale duplocale ++# define __uselocale uselocale ++ ++# ifdef _GLIBCXX_USE_WCHAR_T ++# define __iswctype_l iswctype_l ++# define __towlower_l towlower_l ++# define __towupper_l towupper_l ++# define __wcscoll_l wcscoll_l ++# define __wcsftime_l wcsftime_l ++# define __wcsxfrm_l wcsxfrm_l ++# define __wctype_l wctype_l ++# endif ++ ++#else ++# define __nl_langinfo_l(N, L) nl_langinfo((N)) ++# define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++# define __strtod_l(S, E, L) strtod((S), (E)) ++# define __strtof_l(S, E, L) strtof((S), (E)) ++# define __strtold_l(S, E, L) strtold((S), (E)) ++# define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++# warning should dummy __newlocale check for C|POSIX ? ++# define __newlocale(a, b, c) NULL ++# define __freelocale(a) ((void)0) ++# define __duplocale(a) __c_locale() ++//# define __uselocale ? ++// ++# ifdef _GLIBCXX_USE_WCHAR_T ++# define __iswctype_l(C, M, L) iswctype((C), (M)) ++# define __towlower_l(C, L) towlower((C)) ++# define __towupper_l(C, L) towupper((C)) ++# define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++//# define __wcsftime_l(S, M, F, T, L) wcsftime((S), (M), (F), (T)) ++# define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++# define __wctype_l(S, L) wctype((S)) ++# endif ++ + #endif // GLIBC 2.3 and later +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c_locale.cc 2008-08-16 01:33:00.000000000 -0700 +@@ -39,20 +39,6 @@ + #include + #include + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) +-#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) +-#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) +-#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) +-#define __strtof_l(S, E, L) strtof((S), (E)) +-#define __strtod_l(S, E, L) strtod((S), (E)) +-#define __strtold_l(S, E, L) strtold((S), (E)) +-#warning should dummy __newlocale check for C|POSIX ? +-#define __newlocale(a, b, c) NULL +-#define __freelocale(a) ((void)0) +-#define __duplocale(a) __c_locale() +-#endif +- + namespace std + { + template<> +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/collate_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/collate_members.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/collate_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -36,13 +36,6 @@ + #include + #include + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) +-#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) +-#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) +-#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) +-#endif +- + namespace std + { + // These are basically extensions to char_traits, and perhaps should +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -43,10 +43,6 @@ + #warning tailor for stub locale support + #endif + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif +- + namespace std + { + // Construct and return valid pattern consisting of some combination of: +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -41,9 +41,6 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning tailor for stub locale support + #endif +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif + + namespace std + { +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/time_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/time_members.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/time_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -40,9 +40,6 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning tailor for stub locale support + #endif +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif + + namespace std + { +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -38,13 +38,6 @@ + #undef _LIBC + #include + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __wctype_l(S, L) wctype((S)) +-#define __towupper_l(C, L) towupper((C)) +-#define __towlower_l(C, L) towlower((C)) +-#define __iswctype_l(C, M, L) iswctype((C), (M)) +-#endif +- + namespace std + { + // NB: The other ctype specializations are in src/locale.cc and +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/messages_members.cc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.cc 2008-08-16 01:27:18.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/messages_members.cc 2008-08-16 01:30:31.000000000 -0700 +@@ -39,13 +39,10 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix gettext stuff + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-extern "C" char *__dcgettext(const char *domainname, +- const char *msgid, int category); + #undef gettext +-#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#define gettext(msgid) dcgettext(NULL, msgid, LC_MESSAGES) + #else +-#undef gettext + #define gettext(msgid) (msgid) + #endif + +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.h 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/messages_members.h 2008-08-16 01:31:43.000000000 -0700 +@@ -36,15 +36,11 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix prototypes for *textdomain funcs + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-extern "C" char *__textdomain(const char *domainname); +-extern "C" char *__bindtextdomain(const char *domainname, +- const char *dirname); +-#else +-#undef __textdomain +-#undef __bindtextdomain +-#define __textdomain(D) ((void)0) +-#define __bindtextdomain(D,P) ((void)0) ++#ifndef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#undef textdomain ++#undef bindtextdomain ++#define textdomain(D) ((void)0) ++#define bindtextdomain(D,P) ((void)0) + #endif + + // Non-virtual member functions. +@@ -70,7 +66,7 @@ + messages<_CharT>::open(const basic_string& __s, const locale& __loc, + const char* __dir) const + { +- __bindtextdomain(__s.c_str(), __dir); ++ bindtextdomain(__s.c_str(), __dir); + return this->do_open(__s, __loc); + } + +@@ -90,7 +86,7 @@ + { + // No error checking is done, assume the catalog exists and can + // be used. +- __textdomain(__s.c_str()); ++ textdomain(__s.c_str()); + return 0; + } + +Index: gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.h 2008-08-16 01:29:20.000000000 -0700 ++++ gcc-4.3.1/libstdc++-v3/config/locale/uclibc/c_locale.h 2008-08-16 01:30:31.000000000 -0700 +@@ -68,6 +68,7 @@ + { + extern "C" __typeof(uselocale) __uselocale; + } ++#define __uselocale uselocale + #endif + + namespace std diff --git a/recipes/gcc/gcc-svn/204-uclibc-locale-wchar_fix.patch b/recipes/gcc/gcc-svn/204-uclibc-locale-wchar_fix.patch new file mode 100644 index 0000000000..160ab35bb3 --- /dev/null +++ b/recipes/gcc/gcc-svn/204-uclibc-locale-wchar_fix.patch @@ -0,0 +1,48 @@ +--- gcc/libstdc++-v3/config/locale/uclibc/monetary_members.cc.uclibc200_wchar~ 2006-03-10 15:32:37 +0100 ++++ gcc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2006-03-10 15:37:27 +0100 +@@ -401,7 +401,7 @@ + # ifdef __UCLIBC_HAS_XLOCALE__ + _M_data->_M_decimal_point = __cloc->decimal_point_wc; + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; +-# else ++# elif defined __UCLIBC_HAS_LOCALE__ + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; + # endif +@@ -556,7 +556,7 @@ + # ifdef __UCLIBC_HAS_XLOCALE__ + _M_data->_M_decimal_point = __cloc->decimal_point_wc; + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; +-# else ++# elif defined __UCLIBC_HAS_LOCALE__ + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; + # endif +--- gcc/libstdc++-v3/config/locale/uclibc/numeric_members.cc.uclibc200_wchar~ 2006-03-10 15:32:37 +0100 ++++ gcc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2006-03-10 15:37:27 +0100 +@@ -127,12 +127,25 @@ + { + // Named locale. + // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be numeric ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else + union { char *__s; wchar_t __w; } __u; + __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); + _M_data->_M_decimal_point = __u.__w; + + __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); + _M_data->_M_thousands_sep = __u.__w; ++#endif + + if (_M_data->_M_thousands_sep == L'\0') + _M_data->_M_grouping = ""; diff --git a/recipes/gcc/gcc-svn/205-uclibc-locale-update.patch b/recipes/gcc/gcc-svn/205-uclibc-locale-update.patch new file mode 100644 index 0000000000..48eaa1d442 --- /dev/null +++ b/recipes/gcc/gcc-svn/205-uclibc-locale-update.patch @@ -0,0 +1,519 @@ +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2008-09-17 22:35:29.000000000 -0700 +@@ -39,23 +39,20 @@ + #include + #include + +-namespace std +-{ ++_GLIBCXX_BEGIN_NAMESPACE(std) ++ + template<> + void + __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- float __f = __strtof_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __f; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; + } + + template<> +@@ -63,16 +60,13 @@ + __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- double __d = __strtod_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __d; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; + } + + template<> +@@ -80,16 +74,13 @@ + __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- long double __ld = __strtold_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __ld; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; + } + + void +@@ -110,17 +101,18 @@ + void + locale::facet::_S_destroy_c_locale(__c_locale& __cloc) + { +- if (_S_get_c_locale() != __cloc) ++ if (__cloc && _S_get_c_locale() != __cloc) + __freelocale(__cloc); + } + + __c_locale + locale::facet::_S_clone_c_locale(__c_locale& __cloc) + { return __duplocale(__cloc); } +-} // namespace std + +-namespace __gnu_cxx +-{ ++_GLIBCXX_END_NAMESPACE ++ ++_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) ++ + const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = + { + "LC_CTYPE", +@@ -138,9 +130,11 @@ + "LC_IDENTIFICATION" + #endif + }; +-} + +-namespace std +-{ ++_GLIBCXX_END_NAMESPACE ++ ++_GLIBCXX_BEGIN_NAMESPACE(std) ++ + const char* const* const locale::_S_categories = __gnu_cxx::category_names; +-} // namespace std ++ ++_GLIBCXX_END_NAMESPACE +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2008-09-17 23:09:49.000000000 -0700 +@@ -33,16 +33,20 @@ + + // Written by Benjamin Kosnik + ++#include ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include + #undef _LIBC ++#else ++#include ++#endif + #include + +-namespace std +-{ ++_GLIBCXX_BEGIN_NAMESPACE(std) ++ + // NB: The other ctype specializations are in src/locale.cc and + // various /config/os/* files. +- template<> + ctype_byname::ctype_byname(const char* __s, size_t __refs) + : ctype(0, false, __refs) + { +@@ -57,6 +61,8 @@ + #endif + } + } ++ ctype_byname::~ctype_byname() ++ { } + + #ifdef _GLIBCXX_USE_WCHAR_T + ctype::__wmask_type +@@ -138,17 +144,33 @@ + ctype:: + do_is(mask __m, wchar_t __c) const + { +- // Highest bitmask in ctype_base == 10, but extra in "C" +- // library for blank. ++ // The case of __m == ctype_base::space is particularly important, ++ // due to its use in many istream functions. Therefore we deal with ++ // it first, exploiting the knowledge that on GNU systems _M_bit[5] ++ // is the mask corresponding to ctype_base::space. NB: an encoding ++ // change would not affect correctness! ++ + bool __ret = false; +- const size_t __bitmasksize = 11; +- for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) +- if (__m & _M_bit[__bitcur] +- && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) +- { +- __ret = true; +- break; +- } ++ if (__m == _M_bit[5]) ++ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); ++ else ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur]) ++ { ++ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ else if (__m == _M_bit[__bitcur]) ++ break; ++ } ++ } ++ + return __ret; + } + +@@ -290,4 +312,5 @@ + #endif + } + #endif // _GLIBCXX_USE_WCHAR_T +-} ++ ++_GLIBCXX_END_NAMESPACE +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/messages_members.h 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2008-09-17 23:13:34.000000000 -0700 +@@ -53,12 +53,16 @@ + template + messages<_CharT>::messages(__c_locale __cloc, const char* __s, + size_t __refs) +- : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), +- _M_name_messages(__s) ++ : facet(__refs), _M_c_locale_messages(NULL), ++ _M_name_messages(NULL) + { +- char* __tmp = new char[std::strlen(__s) + 1]; +- std::strcpy(__tmp, __s); ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); + _M_name_messages = __tmp; ++ ++ // Last to avoid leaking memory if new throws. ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); + } + + template +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2008-09-17 22:35:29.000000000 -0700 +@@ -33,9 +33,14 @@ + + // Written by Benjamin Kosnik + ++#include ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include + #undef _LIBC ++#else ++#include ++#endif + #include + + #ifdef __UCLIBC_MJN3_ONLY__ +@@ -206,7 +211,7 @@ + } + break; + default: +- ; ++ __ret = pattern(); + } + return __ret; + } +@@ -390,7 +395,9 @@ + __c_locale __old = __uselocale(__cloc); + #else + // Switch to named locale so that mbsrtowcs will work. +- char* __old = strdup(setlocale(LC_ALL, NULL)); ++ char* __old = setlocale(LC_ALL, NULL); ++ const size_t __llen = strlen(__old) + 1; ++ char* __sav = new char[__llen]; + setlocale(LC_ALL, __name); + #endif + +@@ -477,8 +484,8 @@ + #ifdef __UCLIBC_HAS_XLOCALE__ + __uselocale(__old); + #else +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + __throw_exception_again; + } +@@ -498,8 +505,8 @@ + #ifdef __UCLIBC_HAS_XLOCALE__ + __uselocale(__old); + #else +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + } + } +@@ -545,8 +552,11 @@ + __c_locale __old = __uselocale(__cloc); + #else + // Switch to named locale so that mbsrtowcs will work. +- char* __old = strdup(setlocale(LC_ALL, NULL)); +- setlocale(LC_ALL, __name); ++ char* __old = setlocale(LC_ALL, NULL); ++ const size_t __llen = strlen(__old) + 1; ++ char* __sav = new char[__llen]; ++ memcpy(__sav, __old, __llen); ++ setlocale(LC_ALL, __name); + #endif + + #ifdef __UCLIBC_MJN3_ONLY__ +@@ -633,8 +643,8 @@ + #ifdef __UCLIBC_HAS_XLOCALE__ + __uselocale(__old); + #else +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + __throw_exception_again; + } +@@ -653,8 +663,8 @@ + #ifdef __UCLIBC_HAS_XLOCALE__ + __uselocale(__old); + #else +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + } + } +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2008-09-17 22:35:29.000000000 -0700 +@@ -33,9 +33,14 @@ + + // Written by Benjamin Kosnik + ++#include ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include + #undef _LIBC ++#else ++#include ++#endif + #include + + #ifdef __UCLIBC_MJN3_ONLY__ +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.h +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/time_members.h 2008-09-17 22:35:27.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 2008-09-17 23:13:34.000000000 -0700 +@@ -50,12 +50,21 @@ + __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, + size_t __refs) + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), +- _M_name_timepunct(__s) ++ _M_name_timepunct(NULL) + { +- char* __tmp = new char[std::strlen(__s) + 1]; +- std::strcpy(__tmp, __s); ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); + _M_name_timepunct = __tmp; +- _M_initialize_timepunct(__cloc); ++ ++ try ++ { _M_initialize_timepunct(__cloc); } ++ catch(...) ++ { ++ delete [] _M_name_timepunct; ++ __throw_exception_again; ++ } ++ + } + + template +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/c_locale.h 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2008-09-17 22:35:29.000000000 -0700 +@@ -39,21 +39,23 @@ + #pragma GCC system_header + + #include // get std::strlen +-#include // get std::snprintf or std::sprintf ++#include // get std::vsnprintf or std::vsprintf + #include + #include // For codecvt + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix this + #endif +-#ifdef __UCLIBC_HAS_LOCALE__ ++#ifdef _GLIBCXX_USE_ICONV + #include // For codecvt using iconv, iconv_t + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-#include // For messages ++#ifdef HAVE_LIBINTL_H ++#include // For messages + #endif ++#include + + #ifdef __UCLIBC_MJN3_ONLY__ + #warning what is _GLIBCXX_C_LOCALE_GNU for ++// psm: used in os/gnu-linux/ctype_noninline.h + #endif + #define _GLIBCXX_C_LOCALE_GNU 1 + +@@ -78,23 +80,25 @@ + #else + typedef int* __c_locale; + #endif +- +- // Convert numeric value of type _Tv to string and return length of +- // string. If snprintf is available use it, otherwise fall back to +- // the unsafe sprintf which, in general, can be dangerous and should ++ // Convert numeric value of type double to string and return length of ++ // string. If vsnprintf is available use it, otherwise fall back to ++ // the unsafe vsprintf which, in general, can be dangerous and should + // be avoided. +- template +- int +- __convert_from_v(char* __out, +- const int __size __attribute__ ((__unused__)), +- const char* __fmt, +-#ifdef __UCLIBC_HAS_XCLOCALE__ +- _Tv __v, const __c_locale& __cloc, int __prec) ++ inline int ++ __convert_from_v(const __c_locale& ++#ifndef __UCLIBC_HAS_XCLOCALE__ ++ __cloc __attribute__ ((__unused__)) ++#endif ++ , ++ char* __out, ++ const int __size, ++ const char* __fmt, ...) + { ++ va_list __args; ++#ifdef __UCLIBC_HAS_XCLOCALE__ ++ + __c_locale __old = __gnu_cxx::__uselocale(__cloc); + #else +- _Tv __v, const __c_locale&, int __prec) +- { + # ifdef __UCLIBC_HAS_LOCALE__ + char* __old = std::setlocale(LC_ALL, NULL); + char* __sav = new char[std::strlen(__old) + 1]; +@@ -103,7 +107,9 @@ + # endif + #endif + +- const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ va_start(__args, __fmt); ++ const int __ret = std::vsnprintf(__out, __size, __fmt, __args); ++ va_end(__args); + + #ifdef __UCLIBC_HAS_XCLOCALE__ + __gnu_cxx::__uselocale(__old); +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/time_members.cc 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2008-09-17 22:35:29.000000000 -0700 +@@ -53,11 +53,14 @@ + const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, + _M_c_locale_timepunct); + #else +- char* __old = strdup(setlocale(LC_ALL, NULL)); ++ char* __old = setlocale(LC_ALL, NULL); ++ const size_t __llen = strlen(__old) + 1; ++ char* __sav = new char[__llen]; ++ memcpy(__sav, __old, __llen); + setlocale(LC_ALL, _M_name_timepunct); + const size_t __len = strftime(__s, __maxlen, __format, __tm); +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + // Make sure __s is null terminated. + if (__len == 0) +@@ -207,11 +210,14 @@ + const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, + _M_c_locale_timepunct); + #else +- char* __old = strdup(setlocale(LC_ALL, NULL)); ++ char* __old = setlocale(LC_ALL, NULL); ++ const size_t __llen = strlen(__old) + 1; ++ char* __sav = new char[__llen]; ++ memcpy(__sav, __old, __llen); + setlocale(LC_ALL, _M_name_timepunct); + const size_t __len = wcsftime(__s, __maxlen, __format, __tm); +- setlocale(LC_ALL, __old); +- free(__old); ++ setlocale(LC_ALL, __sav); ++ delete [] __sav; + #endif + // Make sure __s is null terminated. + if (__len == 0) +Index: gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +=================================================================== +--- gcc-4.3.2.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2008-09-17 22:35:28.000000000 -0700 ++++ gcc-4.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2008-09-17 22:35:29.000000000 -0700 +@@ -31,6 +31,9 @@ + + #include + #include ++#include ++#include ++#include + + #ifdef __UCLIBC_MJN3_ONLY__ + #warning clean this up diff --git a/recipes/gcc/gcc-svn/300-libstdc++-pic.patch b/recipes/gcc/gcc-svn/300-libstdc++-pic.patch new file mode 100644 index 0000000000..89d03a85e5 --- /dev/null +++ b/recipes/gcc/gcc-svn/300-libstdc++-pic.patch @@ -0,0 +1,46 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc-4.1.0/libstdc++-v3/src/Makefile.am 2004-11-15 17:33:05.000000000 -0600 ++++ gcc-4.1.0-patched/libstdc++-v3/src/Makefile.am 2005-04-25 20:05:59.186930896 -0500 +@@ -214,6 +214,10 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +--- gcc-4.1.0/libstdc++-v3/src/Makefile.in 2005-04-11 19:13:08.000000000 -0500 ++++ gcc-4.1.0-patched/libstdc++-v3/src/Makefile.in 2005-04-25 20:12:33.284316275 -0500 +@@ -627,7 +627,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -660,6 +660,7 @@ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec \ ++ install-exec-local \ + install-exec-am install-info install-info-am install-man \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ +@@ -745,6 +746,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/recipes/gcc/gcc-svn/301-missing-execinfo_h.patch b/recipes/gcc/gcc-svn/301-missing-execinfo_h.patch new file mode 100644 index 0000000000..0e2092f3fb --- /dev/null +++ b/recipes/gcc/gcc-svn/301-missing-execinfo_h.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 ++++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 +@@ -500,7 +500,7 @@ + #ifdef __linux__ + # include + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/recipes/gcc/gcc-svn/302-c99-snprintf.patch b/recipes/gcc/gcc-svn/302-c99-snprintf.patch new file mode 100644 index 0000000000..02865865e5 --- /dev/null +++ b/recipes/gcc/gcc-svn/302-c99-snprintf.patch @@ -0,0 +1,13 @@ +Index: gcc-4.3.1/libstdc++-v3/include/c_std/cstdio +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/include/c_std/cstdio 2006-12-07 01:35:57.000000000 -0800 ++++ gcc-4.3.1/libstdc++-v3/include/c_std/cstdio 2008-08-16 02:11:37.000000000 -0700 +@@ -144,7 +144,7 @@ + + _GLIBCXX_END_NAMESPACE + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/recipes/gcc/gcc-svn/303-c99-complex-ugly-hack.patch b/recipes/gcc/gcc-svn/303-c99-complex-ugly-hack.patch new file mode 100644 index 0000000000..2ccc80d9bb --- /dev/null +++ b/recipes/gcc/gcc-svn/303-c99-complex-ugly-hack.patch @@ -0,0 +1,12 @@ +--- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 +@@ -7194,6 +7194,9 @@ + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/recipes/gcc/gcc-svn/304-index_macro.patch b/recipes/gcc/gcc-svn/304-index_macro.patch new file mode 100644 index 0000000000..d8e476555d --- /dev/null +++ b/recipes/gcc/gcc-svn/304-index_macro.patch @@ -0,0 +1,24 @@ +--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 +@@ -59,6 +59,9 @@ + #include + #include + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 +@@ -53,6 +53,9 @@ + #include // For uninitialized_copy_n + #include // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) + + using std::size_t; diff --git a/recipes/gcc/gcc-svn/305-libmudflap-susv3-legacy.patch b/recipes/gcc/gcc-svn/305-libmudflap-susv3-legacy.patch new file mode 100644 index 0000000000..374b1f8659 --- /dev/null +++ b/recipes/gcc/gcc-svn/305-libmudflap-susv3-legacy.patch @@ -0,0 +1,49 @@ +Index: gcc-4.2/libmudflap/mf-hooks2.c +=================================================================== +--- gcc-4.2/libmudflap/mf-hooks2.c (revision 119834) ++++ gcc-4.2/libmudflap/mf-hooks2.c (working copy) +@@ -427,7 +427,7 @@ + { + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, n, __MF_CHECK_WRITE, "bzero region"); +- bzero (s, n); ++ memset (s, 0, n); + } + + +@@ -437,7 +437,7 @@ + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "bcopy src"); + MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "bcopy dest"); +- bcopy (src, dest, n); ++ memmove (dest, src, n); + } + + +@@ -447,7 +447,7 @@ + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s1, n, __MF_CHECK_READ, "bcmp 1st arg"); + MF_VALIDATE_EXTENT(s2, n, __MF_CHECK_READ, "bcmp 2nd arg"); +- return bcmp (s1, s2, n); ++ return n == 0 ? 0 : memcmp (s1, s2, n); + } + + +@@ -456,7 +456,7 @@ + size_t n = strlen (s); + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "index region"); +- return index (s, c); ++ return strchr (s, c); + } + + +@@ -465,7 +465,7 @@ + size_t n = strlen (s); + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "rindex region"); +- return rindex (s, c); ++ return strrchr (s, c); + } + + /* XXX: stpcpy, memccpy */ diff --git a/recipes/gcc/gcc-svn/306-libstdc++-namespace.patch b/recipes/gcc/gcc-svn/306-libstdc++-namespace.patch new file mode 100644 index 0000000000..69587ca63a --- /dev/null +++ b/recipes/gcc/gcc-svn/306-libstdc++-namespace.patch @@ -0,0 +1,36 @@ +diff -rup gcc-4.2.orig/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-4.2.orig/libstdc++-v3/config/locale/uclibc/messages_members.h 2006-12-22 13:06:56.000000000 +0100 ++++ gcc-4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2006-12-22 15:23:41.000000000 +0100 +@@ -32,7 +32,8 @@ + // + + // Written by Benjamin Kosnik +- ++namespace std ++{ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix prototypes for *textdomain funcs + #endif +@@ -115,3 +116,4 @@ + this->_S_create_c_locale(this->_M_c_locale_messages, __s); + } + } ++} +diff -rup gcc-4.2.orig/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-4.2.orig/libstdc++-v3/config/locale/uclibc/time_members.h 2006-12-22 13:06:56.000000000 +0100 ++++ gcc-4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2006-12-22 15:20:31.000000000 +0100 +@@ -33,7 +33,8 @@ + // + + // Written by Benjamin Kosnik +- ++namespace std ++{ + template + __timepunct<_CharT>::__timepunct(size_t __refs) + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), +@@ -74,3 +75,4 @@ + delete _M_data; + _S_destroy_c_locale(_M_c_locale_timepunct); + } ++} diff --git a/recipes/gcc/gcc-svn/307-locale_facets.patch b/recipes/gcc/gcc-svn/307-locale_facets.patch new file mode 100644 index 0000000000..774fcfa2ca --- /dev/null +++ b/recipes/gcc/gcc-svn/307-locale_facets.patch @@ -0,0 +1,19 @@ +This patch fixes a bug into ostream::operator<<(double) due to the wrong size +passed into the __convert_from_v method. The wrong size is then passed to +std::snprintf function, that, on uClibc, doens't handle sized 0 buffer. + +Signed-off-by: Carmelo Amoroso + +Index: gcc-4.3.1/libstdc++-v3/include/bits/locale_facets.tcc +=================================================================== +--- gcc-4.3.1.orig/libstdc++-v3/include/bits/locale_facets.tcc 2007-11-26 17:59:41.000000000 -0800 ++++ gcc-4.3.1/libstdc++-v3/include/bits/locale_facets.tcc 2008-08-16 02:14:48.000000000 -0700 +@@ -1004,7 +1004,7 @@ + const int __cs_size = __fixed ? __max_exp + __prec + 4 + : __max_digits * 2 + __prec; + char* __cs = static_cast(__builtin_alloca(__cs_size)); +- __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, __fbuf, ++ __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, __fbuf, + __prec, __v); + #endif + diff --git a/recipes/gcc/gcc-svn/402-libbackend_dep_gcov-iov.h.patch b/recipes/gcc/gcc-svn/402-libbackend_dep_gcov-iov.h.patch new file mode 100644 index 0000000000..0bf115c45d --- /dev/null +++ b/recipes/gcc/gcc-svn/402-libbackend_dep_gcov-iov.h.patch @@ -0,0 +1,13 @@ +Index: gcc-4.2/gcc/Makefile.in +=================================================================== +--- gcc-4.2/gcc/Makefile.in (revision 121758) ++++ gcc-4.2/gcc/Makefile.in (working copy) +@@ -2658,7 +2658,7 @@ mips-tdump.o : mips-tdump.c $(CONFIG_H) + # FIXME: writing proper dependencies for this is a *LOT* of work. + libbackend.o : $(OBJS-common:.o=.c) $(out_file) \ + insn-config.h insn-flags.h insn-codes.h insn-constants.h \ +- insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) ++ insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) gcov-iov.h + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ + -DTARGET_NAME=\"$(target_noncanonical)\" \ + -DLOCALEDIR=\"$(localedir)\" \ diff --git a/recipes/gcc/gcc-svn/602-sdk-libstdc++-includes.patch b/recipes/gcc/gcc-svn/602-sdk-libstdc++-includes.patch new file mode 100644 index 0000000000..23fce7544d --- /dev/null +++ b/recipes/gcc/gcc-svn/602-sdk-libstdc++-includes.patch @@ -0,0 +1,20 @@ +--- gcc-4.1.0/libstdc++-v3/fragment.am 2005-03-21 11:40:14.000000000 -0600 ++++ gcc-4.1.0-patched/libstdc++-v3/fragment.am 2005-04-25 20:14:39.856251785 -0500 +@@ -21,5 +21,5 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + +--- gcc-4.1.0/libstdc++-v3/libmath/Makefile.am 2005-03-21 11:40:18.000000000 -0600 ++++ gcc-4.1.0-patched/libstdc++-v3/libmath/Makefile.am 2005-04-25 20:14:39.682280735 -0500 +@@ -35,7 +35,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC diff --git a/recipes/gcc/gcc-svn/740-sh-pr24836.patch b/recipes/gcc/gcc-svn/740-sh-pr24836.patch new file mode 100644 index 0000000000..7992282cff --- /dev/null +++ b/recipes/gcc/gcc-svn/740-sh-pr24836.patch @@ -0,0 +1,25 @@ +http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348 +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836 + +--- gcc/gcc/configure.ac (revision 106699) ++++ gcc/gcc/configure.ac (working copy) +@@ -2446,7 +2446,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 +--- gcc/gcc/configure ++++ gcc/gcc/configure +@@ -14846,7 +14846,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 diff --git a/recipes/gcc/gcc-svn/800-arm-bigendian.patch b/recipes/gcc/gcc-svn/800-arm-bigendian.patch new file mode 100644 index 0000000000..f433942783 --- /dev/null +++ b/recipes/gcc/gcc-svn/800-arm-bigendian.patch @@ -0,0 +1,34 @@ +By Lennert Buytenhek +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +Index: gcc-4.3.2/gcc/config/arm/linux-elf.h +=================================================================== +--- gcc-4.3.2.orig/gcc/config/arm/linux-elf.h 2007-11-08 05:44:09.000000000 -0800 ++++ gcc-4.3.2/gcc/config/arm/linux-elf.h 2008-08-28 21:08:30.000000000 -0700 +@@ -51,7 +51,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +Index: gcc-4.3.2/gcc/config.gcc +=================================================================== +--- gcc-4.3.2.orig/gcc/config.gcc 2008-08-28 20:57:39.000000000 -0700 ++++ gcc-4.3.2/gcc/config.gcc 2008-08-28 21:00:11.000000000 -0700 +@@ -742,6 +742,11 @@ + esac + tmake_file="${tmake_file} t-linux arm/t-arm" + case ${target} in ++ arm*b-*) ++ tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ++ ;; ++ esac ++ case ${target} in + arm*-*-linux-*eabi) + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h" + tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" diff --git a/recipes/gcc/gcc-svn/904-flatten-switch-stmt-00.patch b/recipes/gcc/gcc-svn/904-flatten-switch-stmt-00.patch new file mode 100644 index 0000000000..8fac37c4df --- /dev/null +++ b/recipes/gcc/gcc-svn/904-flatten-switch-stmt-00.patch @@ -0,0 +1,153 @@ +Hi, + +The attached patch makes sure that we create smaller object code for +simple switch statements. We just make sure to flatten the switch +statement into an if-else chain, basically. + +This fixes a size-regression as compared to gcc-3.4, as can be seen +below. + +2007-04-15 Bernhard Fischer <..> + + * stmt.c (expand_case): Do not create a complex binary tree when + optimizing for size but rather use the simple ordered list. + (emit_case_nodes): do not emit jumps to the default_label when + optimizing for size. + +Not regtested so far. +Comments? + +Attached is the test switch.c mentioned below. + +$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do +gcc-$i -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done +$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do +gcc-$i -UCHAIN -Os -o switch-$i.o -c switch.c ;done + +$ size switch-*.o + text data bss dec hex filename + 169 0 0 169 a9 switch-2.95.o + 115 0 0 115 73 switch-3.3.o + 103 0 0 103 67 switch-3.4.o + 124 0 0 124 7c switch-4.0.o + 124 0 0 124 7c switch-4.1.o + 124 0 0 124 7c switch-4.2.orig-HEAD.o + 95 0 0 95 5f switch-4.3-HEAD.o + 124 0 0 124 7c switch-4.3.orig-HEAD.o + 166 0 0 166 a6 switch-CHAIN-2.95.o + 111 0 0 111 6f switch-CHAIN-3.3.o + 95 0 0 95 5f switch-CHAIN-3.4.o + 95 0 0 95 5f switch-CHAIN-4.0.o + 95 0 0 95 5f switch-CHAIN-4.1.o + 95 0 0 95 5f switch-CHAIN-4.2.orig-HEAD.o + 95 0 0 95 5f switch-CHAIN-4.3-HEAD.o + 95 0 0 95 5f switch-CHAIN-4.3.orig-HEAD.o + + +Content-Type: text/x-diff; charset=us-ascii +Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff" + +Index: gcc-4.2.0/gcc/stmt.c +=================================================================== +--- gcc-4.2.0.orig/gcc/stmt.c (revision 123843) ++++ gcc-4.2.0/gcc/stmt.c (working copy) +@@ -2517,7 +2517,11 @@ expand_case (tree exp) + use_cost_table + = (TREE_CODE (orig_type) != ENUMERAL_TYPE + && estimate_case_costs (case_list)); +- balance_case_nodes (&case_list, NULL); ++ /* When optimizing for size, we want a straight list to avoid ++ jumps as much as possible. This basically creates an if-else ++ chain. */ ++ if (!optimize_size) ++ balance_case_nodes (&case_list, NULL); + emit_case_nodes (index, case_list, default_label, index_type); + emit_jump (default_label); + } +@@ -3075,6 +3079,7 @@ emit_case_nodes (rtx index, case_node_pt + { + if (!node_has_low_bound (node, index_type)) + { ++ if (!optimize_size) /* don't jl to the .default_label. */ + emit_cmp_and_jump_insns (index, + convert_modes + (mode, imode, + + +Content-Type: text/x-csrc; charset=us-ascii +Content-Disposition: attachment; filename="switch.c" + +int +commutative_tree_code (int code) +{ +#define CASE(val, ret) case val:/* __asm__("# val="#val ",ret="#ret);*/ return ret; +#ifndef CHAIN + switch (code) + { +# if 1 + CASE(1,3) + CASE(3,2) + CASE(5,8) + CASE(7,1) + CASE(33,4) + CASE(44,9) + CASE(55,10) + CASE(66,-1) + CASE(77,99) + CASE(666,0) +# else + case 1: + return 3; + case 3: + return 2; + case 5: + return 8; + case 7: + return 1; + case 33: + return 4; + case 44: + return 9; + case 55: + return 10; + case 66: + return -1; + case 77: + return 99; + case 666: + return 0; +# endif + default: + break; + } + return 4711; + +#else + if (code == 1) + return 3; + else if (code == 3) + return 2; + else if (code == 5) + return 8; + else if (code == 7) + return 1; + else if (code == 33) + return 4; + else if (code == 44) + return 9; + else if (code == 55) + return 10; + else if (code == 66) + return -1; + else if (code == 77) + return 99; + else if (code == 666) + return 0; + else + return 4711; +#endif +} + + +--AhhlLboLdkugWU4S-- + diff --git a/recipes/gcc/gcc-svn/arm-nolibfloat.patch b/recipes/gcc/gcc-svn/arm-nolibfloat.patch new file mode 100644 index 0000000000..c4897c0330 --- /dev/null +++ b/recipes/gcc/gcc-svn/arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric , 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +Index: gcc-4.0.2/gcc/config/arm/linux-elf.h +=================================================================== +--- gcc-4.0.2.orig/gcc/config/arm/linux-elf.h 2005-03-04 16:14:01.000000000 +0000 ++++ gcc-4.0.2/gcc/config/arm/linux-elf.h 2005-11-11 18:02:54.000000000 +0000 +@@ -56,7 +56,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which diff --git a/recipes/gcc/gcc-svn/arm-softfloat.patch b/recipes/gcc/gcc-svn/arm-softfloat.patch new file mode 100644 index 0000000000..5e1edd9208 --- /dev/null +++ b/recipes/gcc/gcc-svn/arm-softfloat.patch @@ -0,0 +1,16 @@ +Index: gcc-4.0.2/gcc/config/arm/t-linux +=================================================================== +--- gcc-4.0.2.orig/gcc/config/arm/t-linux 2004-05-15 12:41:35.000000000 +0000 ++++ gcc-4.0.2/gcc/config/arm/t-linux 2005-11-11 16:07:53.000000000 +0000 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi _floatdidf _floatdisf _floatundisf _floatundidf + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/recipes/gcc/gcc-svn/arm-thumb-cache.patch b/recipes/gcc/gcc-svn/arm-thumb-cache.patch new file mode 100644 index 0000000000..fa63846c8c --- /dev/null +++ b/recipes/gcc/gcc-svn/arm-thumb-cache.patch @@ -0,0 +1,29 @@ +--- gcc-4.1.1/gcc/config/arm/linux-gas.h- 2005-06-25 03:22:41.000000000 +0200 ++++ gcc-4.1.1/gcc/config/arm/linux-gas.h 2006-06-18 10:23:46.000000000 +0200 +@@ -44,6 +44,7 @@ + + /* Clear the instruction cache from `beg' to `end'. This makes an + inline system call to SYS_cacheflush. */ ++#if !defined(__thumb__) + #define CLEAR_INSN_CACHE(BEG, END) \ + { \ + register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ +@@ -53,3 +54,18 @@ + : "=r" (_beg) \ + : "0" (_beg), "r" (_end), "r" (_flg)); \ + } ++#else ++#define CLEAR_INSN_CACHE(BEG, END) \ ++{ \ ++ register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ ++ register unsigned long _end __asm ("a2") = (unsigned long) (END); \ ++ register unsigned long _flg __asm ("a3") = 0; \ ++ register unsigned long _swi __asm ("a4") = 0xf0002; \ ++ __asm __volatile ("push {r7}\n" \ ++ " mov r7,a4\n" \ ++ " swi 0 @ sys_cacheflush\n" \ ++ " pop {r7}\n" \ ++ : "=r" (_beg) \ ++ : "0" (_beg), "r" (_end), "r" (_flg), "r" (_swi)); \ ++} ++#endif diff --git a/recipes/gcc/gcc-svn/arm-thumb.patch b/recipes/gcc/gcc-svn/arm-thumb.patch new file mode 100644 index 0000000000..7b0b8b2ddc --- /dev/null +++ b/recipes/gcc/gcc-svn/arm-thumb.patch @@ -0,0 +1,43 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +Index: gcc-4.3.1/gcc/config/arm/lib1funcs.asm +=================================================================== +--- gcc-4.3.1.orig/gcc/config/arm/lib1funcs.asm 2007-05-30 12:04:09.000000000 -0700 ++++ gcc-4.3.1/gcc/config/arm/lib1funcs.asm 2008-08-28 21:51:17.000000000 -0700 +@@ -1225,11 +1225,12 @@ + code here switches to the correct mode before executing the function. */ + + .text +- .align 0 ++ .align 1 + .force_thumb + + .macro call_via register + THUMB_FUNC_START _call_via_\register ++ .hidden SYM (_call_via_\register) + + bx \register + nop +@@ -1330,6 +1331,7 @@ + .code 16 + + THUMB_FUNC_START _interwork_call_via_\register ++ .hidden SYM (_interwork_call_via_\register) + + bx pc + nop +Index: gcc-4.3.1/gcc/config/arm/t-linux +=================================================================== +--- gcc-4.3.1.orig/gcc/config/arm/t-linux 2008-08-28 21:25:24.000000000 -0700 ++++ gcc-4.3.1/gcc/config/arm/t-linux 2008-08-28 21:51:17.000000000 -0700 +@@ -6,6 +6,7 @@ + LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _call_via_rX \ + _fixsfsi _fixunssfsi _floatdidf _floatdisf _floatundisf _floatundidf + + # MULTILIB_OPTIONS = mhard-float/msoft-float diff --git a/recipes/gcc/gcc-svn/cache-amnesia.patch b/recipes/gcc/gcc-svn/cache-amnesia.patch new file mode 100644 index 0000000000..fb4d1a26d8 --- /dev/null +++ b/recipes/gcc/gcc-svn/cache-amnesia.patch @@ -0,0 +1,31 @@ +--- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.3.1/gcc/configure +=================================================================== +--- gcc-4.3.1.orig/gcc/configure 2008-08-20 00:27:57.000000000 -0700 ++++ gcc-4.3.1/gcc/configure 2008-08-20 00:45:11.000000000 -0700 +@@ -12813,7 +12813,7 @@ else + esac + saved_CFLAGS="${CFLAGS}" + CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \ +- ${realsrcdir}/configure \ ++ CONFIG_SITE= ${realsrcdir}/configure --cache-file=./other.cache \ + --enable-languages=${enable_languages-all} \ + --target=$target_alias --host=$build_alias --build=$build_alias + CFLAGS="${saved_CFLAGS}" +Index: gcc-4.3.1/gcc/configure.ac +=================================================================== +--- gcc-4.3.1.orig/gcc/configure.ac 2008-08-20 00:27:57.000000000 -0700 ++++ gcc-4.3.1/gcc/configure.ac 2008-08-20 00:44:52.000000000 -0700 +@@ -1480,7 +1480,7 @@ else + esac + saved_CFLAGS="${CFLAGS}" + CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \ +- ${realsrcdir}/configure \ ++ CONFIG_SITE= ${realsrcdir}/configure --cache-file=./other.cache \ + --enable-languages=${enable_languages-all} \ + --target=$target_alias --host=$build_alias --build=$build_alias + CFLAGS="${saved_CFLAGS}" diff --git a/recipes/gcc/gcc-svn/debian/ada-acats.dpatch b/recipes/gcc/gcc-svn/debian/ada-acats.dpatch new file mode 100644 index 0000000000..fc25bf901f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-acats.dpatch @@ -0,0 +1,78 @@ +#! /bin/sh -e + +# DP: - When running the ACATS, look for the gnat tools in their new +# DP: directory (build/gnattools), and for the shared libraries in +# DP: build/gcc/ada/rts, build/libgnatvsn and build/libgnatprj. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/testsuite/ada/acats/run_acats~ ++++ gcc/testsuite/ada/acats/run_acats 2006-04-22 08:57:50.933824704 +0200 +@@ -11,23 +11,42 @@ + host_gnatmake=`type gnatmake | awk '{print $3}'` + ROOT=`${PWDCMD-pwd}` + BASE=`cd $ROOT/../../..; ${PWDCMD-pwd}` +- +-PATH=$BASE:$ROOT:$PATH +-ADA_INCLUDE_PATH=$BASE/ada/rts ++GNATTOOLS=`cd $BASE/../gnattools; ${PWDCMD-pwd}` ++LIBGNATVSN=`cd $BASE/../libgnatvsn; ${PWDCMD-pwd}` ++LIBGNATPRJ=`cd $BASE/../libgnatprj; ${PWDCMD-pwd}` ++ ++PATH=$GNATTOOLS:$BASE:$ROOT:$PATH ++ADA_INCLUDE_DIR=$BASE/ada/rts ++ADA_INCLUDE_PATH=$ADA_INCLUDE_DIR:$LIBGNATVSN:$LIBGNATPRJ + LD_LIBRARY_PATH=$ADA_INCLUDE_PATH:$BASE:$LD_LIBRARY_PATH + ADA_OBJECTS_PATH=$ADA_INCLUDE_PATH + +-if [ ! -d $ADA_INCLUDE_PATH ]; then ++if [ ! -d $ADA_INCLUDE_DIR ]; then + echo gnatlib missing, exiting. + exit 1 + fi + +-if [ ! -f $BASE/gnatchop ]; then ++if [ ! -d $GNATTOOLS ]; then ++ echo gnattools missing, exiting. ++ exit 1 ++fi ++ ++if [ ! -d $LIBGNATVSN ]; then ++ echo libgnatvsn missing, exiting. ++ exit 1 ++fi ++ ++if [ ! -d $LIBGNATPRJ ]; then ++ echo libgnatprj missing, exiting. ++ exit 1 ++fi ++ ++if [ ! -f $GNATTOOLS/gnatchop ]; then + echo gnattools missing, exiting. + exit 1 + fi + +-if [ ! -f $BASE/gnatmake ]; then ++if [ ! -f $GNATTOOLS/gnatmake ]; then + echo gnattools missing, exiting. + exit 1 + fi diff --git a/recipes/gcc/gcc-svn/debian/ada-alpha.dpatch b/recipes/gcc/gcc-svn/debian/ada-alpha.dpatch new file mode 100644 index 0000000000..1e2c47d670 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-alpha.dpatch @@ -0,0 +1,88 @@ +#! /bin/sh -e + +# DP: Fix GNAT on alpha. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-04-01 Aurelien Jarno + + * s-osinte-linux-alpha.ads (SC_NPROCESSORS_ONLN): New constant + for sysconf call. + (bit_field): New packed boolean type used by cpu_set_t. + (cpu_set_t): New type corresponding to the C type with + the same name. Note that on the Ada side we use a bit + field array for the affinity mask. There is not need + for the C macro for setting individual bit. + (pthread_setaffinity_np): New imported routine. + +Index: gcc/ada/s-osinte-linux-alpha.ads +=================================================================== +--- gcc/ada/s-osinte-linux-alpha.ads (révision 133772) ++++ gcc/ada/s-osinte-linux-alpha.ads (copie de travail) +@@ -237,6 +237,7 @@ + pragma Import (C, sysconf); + + SC_CLK_TCK : constant := 2; ++ SC_NPROCESSORS_ONLN : constant := 84; + + ------------------------- + -- Priority Scheduling -- +@@ -268,6 +269,7 @@ + + type Thread_Body is access + function (arg : System.Address) return System.Address; ++ pragma Convention (C, Thread_Body); + + function Thread_Body_Access is new + Unchecked_Conversion (System.Address, Thread_Body); +@@ -448,12 +450,31 @@ + pragma Import (C, pthread_getspecific, "pthread_getspecific"); + + type destructor_pointer is access procedure (arg : System.Address); ++ pragma Convention (C, destructor_pointer); + + function pthread_key_create + (key : access pthread_key_t; + destructor : destructor_pointer) return int; + pragma Import (C, pthread_key_create, "pthread_key_create"); + ++ CPU_SETSIZE : constant := 1_024; ++ ++ type bit_field is array (1 .. CPU_SETSIZE) of Boolean; ++ for bit_field'Size use CPU_SETSIZE; ++ pragma Pack (bit_field); ++ pragma Convention (C, bit_field); ++ ++ type cpu_set_t is record ++ bits : bit_field; ++ end record; ++ pragma Convention (C, cpu_set_t); ++ ++ function pthread_setaffinity_np ++ (thread : pthread_t; ++ cpusetsize : size_t; ++ cpuset : access cpu_set_t) return int; ++ pragma Import (C, pthread_setaffinity_np, "__gnat_pthread_setaffinity_np"); ++ + private + + type sigset_t is record diff --git a/recipes/gcc/gcc-svn/debian/ada-default-project-path.dpatch b/recipes/gcc/gcc-svn/debian/ada-default-project-path.dpatch new file mode 100644 index 0000000000..b3283d75f3 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-default-project-path.dpatch @@ -0,0 +1,147 @@ +#! /bin/sh -e + +# DP: - Change the default search path for project files to the one specified +# DP: by the Debian Policy for Ada: /usr/share/ada/adainclude. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/ada/Make-lang.in +=================================================================== +--- gcc/ada/Make-lang.in.orig ++++ gcc/ada/Make-lang.in +@@ -974,7 +974,7 @@ + $(ECHO) " S1 : constant String := \"$(ADA_INCLUDE_DIR)/\";" >>tmp-sdefault.adb + $(ECHO) " S2 : constant String := \"$(ADA_RTL_OBJ_DIR)/\";" >>tmp-sdefault.adb + $(ECHO) " S3 : constant String := \"$(target)/\";" >>tmp-sdefault.adb +- $(ECHO) " S4 : constant String := \"$(libsubdir)/\";" >>tmp-sdefault.adb ++ $(ECHO) " S4 : constant String := \"/usr/share/ada/adainclude/\";" >>tmp-sdefault.adb + $(ECHO) " function Include_Dir_Default_Name return String_Ptr is" >>tmp-sdefault.adb + $(ECHO) " begin" >>tmp-sdefault.adb + $(ECHO) " return Relocate_Path (S0, S1);" >>tmp-sdefault.adb +Index: gcc/ada/prj-ext.adb +=================================================================== +--- gcc/ada/prj-ext.adb.orig ++++ gcc/ada/prj-ext.adb +@@ -24,7 +24,6 @@ + ------------------------------------------------------------------------------ + + with Hostparm; +-with Makeutl; use Makeutl; + with Output; use Output; + with Osint; use Osint; + with Sdefault; +@@ -254,38 +253,10 @@ + + -- Set the initial value of Current_Project_Path + +- if Add_Default_Dir then +- declare +- Prefix : String_Ptr := Sdefault.Search_Dir_Prefix; +- begin +- if Prefix = null then +- Prefix := new String'(Executable_Prefix_Path); +- +- if Prefix.all /= "" then +- if Get_Mode = Ada_Only then +- Current_Project_Path := +- new String'(Name_Buffer (1 .. Name_Len) & +- Path_Separator & +- Prefix.all & Directory_Separator & "gnat"); +- +- else +- Current_Project_Path := +- new String'(Name_Buffer (1 .. Name_Len) & +- Path_Separator & +- Prefix.all & Directory_Separator & +- "share" & Directory_Separator & "gpr"); +- end if; +- end if; +- +- else +- Current_Project_Path := +- new String'(Name_Buffer (1 .. Name_Len) & Path_Separator & +- Prefix.all & +- ".." & Directory_Separator & +- ".." & Directory_Separator & +- ".." & Directory_Separator & "gnat"); +- end if; +- end; ++ if Add_Default_Dir and Sdefault.Search_Dir_Prefix /= null then ++ Current_Project_Path := ++ new String'(Name_Buffer (1 .. Name_Len) & Path_Separator & ++ Sdefault.Search_Dir_Prefix.all); + end if; + + if Current_Project_Path = null then +Index: gcc/ada/gnatls.adb +=================================================================== +--- gcc/ada/gnatls.adb.orig ++++ gcc/ada/gnatls.adb +@@ -1622,9 +1622,6 @@ + declare + Project_Path : String_Access := Getenv (Gpr_Project_Path); + +- Lib : constant String := +- Directory_Separator & "lib" & Directory_Separator; +- + First : Natural; + Last : Natural; + +@@ -1684,36 +1681,8 @@ + if Add_Default_Dir then + Name_Len := 0; + Add_Str_To_Name_Buffer (Sdefault.Search_Dir_Prefix.all); +- +- -- On Windows, make sure that all directory separators are '\' +- +- if Directory_Separator /= '/' then +- for J in 1 .. Name_Len loop +- if Name_Buffer (J) = '/' then +- Name_Buffer (J) := Directory_Separator; +- end if; +- end loop; +- end if; +- +- -- Find the sequence "/lib/" +- +- while Name_Len >= Lib'Length +- and then Name_Buffer (Name_Len - 4 .. Name_Len) /= Lib +- loop +- Name_Len := Name_Len - 1; +- end loop; +- +- -- If the sequence "/lib"/ was found, display the default +- -- directory /lib/gnat/. +- +- if Name_Len >= 5 then +- Name_Buffer (Name_Len + 1 .. Name_Len + 4) := "gnat"; +- Name_Buffer (Name_Len + 5) := Directory_Separator; +- Name_Len := Name_Len + 5; +- Write_Str (" "); +- Write_Line +- (To_Host_Dir_Spec (Name_Buffer (1 .. Name_Len), True).all); +- end if; ++ Write_Str (" "); ++ Write_Line (Name_Buffer (1 .. Name_Len)); + end if; + end; + diff --git a/recipes/gcc/gcc-svn/debian/ada-driver-check.dpatch b/recipes/gcc/gcc-svn/debian/ada-driver-check.dpatch new file mode 100644 index 0000000000..9ac1148329 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-driver-check.dpatch @@ -0,0 +1,50 @@ +#! /bin/sh -e + +# DP: Simplify Ada driver check (we always build using the required +# DP: Ada version. Needed for warnings on alpha. + +dir=./ +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir} && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm -f ${dir}configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- config/acx.m4~ 2007-09-02 19:24:08.865326043 +0200 ++++ config/acx.m4 2007-09-02 19:28:53.719623005 +0200 +@@ -380,7 +380,7 @@ + # Other compilers, like HP Tru64 UNIX cc, exit successfully when + # given a .adb file, but produce no object file. So we must check + # if an object file was really produced to guard against this. +-errors=`(${CC} -c conftest.adb) 2>&1 || echo failure` ++errors=`(${CC} -c conftest.adb) 2>/dev/null || echo failure` + if test x"$errors" = x && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes + fi +--- configure~ 2007-09-02 16:50:31.206279000 +0200 ++++ configure 2007-09-02 19:28:58.259691491 +0200 +@@ -4261,7 +4261,7 @@ + # Other compilers, like HP Tru64 UNIX cc, exit successfully when + # given a .adb file, but produce no object file. So we must check + # if an object file was really produced to guard against this. +-errors=`(${CC} -c conftest.adb) 2>&1 || echo failure` ++errors=`(${CC} -c conftest.adb) 2>/dev/null || echo failure` + if test x"$errors" = x && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes + fi diff --git a/recipes/gcc/gcc-svn/debian/ada-driver.dpatch b/recipes/gcc/gcc-svn/debian/ada-driver.dpatch new file mode 100644 index 0000000000..74ee94d1b6 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-driver.dpatch @@ -0,0 +1,42 @@ +#! /bin/sh -e + +# DP: Look for gcc-3.4, gcc-4.0 and gcc-4.1 as gcc with Ada support. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/aclocal.m4~ Sat Mar 2 00:37:42 2002 ++++ gcc/aclocal.m4 Sat Apr 6 13:01:36 2002 +@@ -312,6 +312,11 @@ + ${ac_tool_prefix}$user_cc $user_cc \ + ${ac_tool_prefix}gcc gcc \ + ${ac_tool_prefix}cc cc \ ++ ${ac_tool_prefix}gcc-4.3 gcc-4.3 \ ++ ${ac_tool_prefix}gcc-4.2 gcc-4.2 \ ++ ${ac_tool_prefix}gcc-4.1 gcc-4.1 \ ++ ${ac_tool_prefix}gcc-4.0 gcc-4.0 \ ++ ${ac_tool_prefix}gcc-3.4 gcc-3.4 \ + ${ac_tool_prefix}gnatgcc gnatgcc \ + ${ac_tool_prefix}gnatcc gnatcc \ + ${ac_tool_prefix}adagcc adagcc \ diff --git a/recipes/gcc/gcc-svn/debian/ada-gcc-name.dpatch b/recipes/gcc/gcc-svn/debian/ada-gcc-name.dpatch new file mode 100644 index 0000000000..681d634480 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-gcc-name.dpatch @@ -0,0 +1,87 @@ +#! /bin/sh -e + +# DP: use gcc-4.3 instead of gcc as the command name. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/ada/comperr.adb +=================================================================== +--- gcc/ada/comperr.adb.orig 2007-09-10 18:53:41.000000000 +0200 ++++ gcc/ada/comperr.adb 2007-12-05 00:15:52.596687382 +0100 +@@ -330,7 +330,7 @@ + End_Line; + + Write_Str +- ("| Include the exact gcc or gnatmake command " & ++ ("| Include the exact gcc-4.3 or gnatmake command " & + "that you entered."); + End_Line; + +Index: gcc/ada/gnatlink.adb +=================================================================== +--- gcc/ada/gnatlink.adb.orig 2007-10-19 15:14:33.000000000 +0200 ++++ gcc/ada/gnatlink.adb 2007-12-05 00:15:52.596687382 +0100 +@@ -137,7 +137,7 @@ + -- This table collects the arguments to be passed to compile the binder + -- generated file. + +- Gcc : String_Access := Program_Name ("gcc"); ++ Gcc : String_Access := Program_Name ("gcc-4.3"); + + Read_Mode : constant String := "r" & ASCII.Nul; + +@@ -1368,7 +1368,8 @@ + end if; + + Write_Line (" --GCC=comp Use comp as the compiler"); +- Write_Line (" --LINK=nam Use 'nam' for the linking rather than 'gcc'"); ++ Write_Line (" --LINK=nam Use 'nam' for the linking rather " & ++ "than 'gcc-4.3'"); + Write_Eol; + Write_Line (" [non-Ada-objects] list of non Ada object files"); + Write_Line (" [linker-options] other options for the linker"); +Index: gcc/ada/make.adb +=================================================================== +--- gcc/ada/make.adb.orig 2007-10-19 15:14:33.000000000 +0200 ++++ gcc/ada/make.adb 2007-12-05 00:15:52.604687208 +0100 +@@ -662,7 +662,7 @@ + -- Compiler, Binder & Linker Data and Subprograms -- + ---------------------------------------------------- + +- Gcc : String_Access := Program_Name ("gcc"); ++ Gcc : String_Access := Program_Name ("gcc-4.3"); + Gnatbind : String_Access := Program_Name ("gnatbind"); + Gnatlink : String_Access := Program_Name ("gnatlink"); + -- Default compiler, binder, linker programs +Index: gcc/ada/gnatchop.adb +=================================================================== +--- gcc/ada/gnatchop.adb.orig 2007-10-19 15:14:33.000000000 +0200 ++++ gcc/ada/gnatchop.adb 2007-12-05 00:15:52.612687034 +0100 +@@ -44,7 +44,7 @@ + Config_File_Name : constant String_Access := new String'("gnat.adc"); + -- The name of the file holding the GNAT configuration pragmas + +- Gcc : String_Access := new String'("gcc"); ++ Gcc : String_Access := new String'("gcc-4.3"); + -- May be modified by switch --GCC= + + Gcc_Set : Boolean := False; diff --git a/recipes/gcc/gcc-svn/debian/ada-gnatvsn.dpatch b/recipes/gcc/gcc-svn/debian/ada-gnatvsn.dpatch new file mode 100644 index 0000000000..365bd60bb4 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-gnatvsn.dpatch @@ -0,0 +1,46 @@ +#! /bin/sh -e + +# DP: proposed patch for PR ada/27194. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- orig/gnatvsn.adb 2005-07-01 03:29:17.000000000 +0200 ++++ gcc/ada/gnatvsn.adb 2006-04-18 10:00:05.100002000 +0200 +@@ -54,12 +54,13 @@ + ------------------------- + + function Gnat_Version_String return String is +- NUL_Pos : Positive := 1; ++ NUL_Pos : Positive := Version_String'Last; + begin +- loop +- exit when Version_String (NUL_Pos) = ASCII.NUL; +- +- NUL_Pos := NUL_Pos + 1; ++ for J in Version_String'Range loop ++ if Version_String (J) = ASCII.NUL then ++ NUL_Pos := J; ++ exit; ++ end if; + end loop; + + return Version_String (1 .. NUL_Pos - 1); diff --git a/recipes/gcc/gcc-svn/debian/ada-libgnatprj.dpatch b/recipes/gcc/gcc-svn/debian/ada-libgnatprj.dpatch new file mode 100644 index 0000000000..dcbf30aef7 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-libgnatprj.dpatch @@ -0,0 +1,4809 @@ +#! /bin/sh -e + +# DP: - Introduce a new shared library named libgnatprj, containing +# DP: the GNAT project file manager licensed under the pure GPL, for +# DP: use in GNAT tools, GLADE and GPS. Link the GNAT tools against +# DP: this new library. + +# This patch seems large, but the hunks in Makefile.in are actually +# generated from Makefile.def using autogen. + +# !!! Must be applied after ada-libgnatvsn.dpatch + +dir=./ +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir} && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/ada/config-lang.in +=================================================================== +--- gcc/ada/config-lang.in.orig ++++ gcc/ada/config-lang.in +@@ -34,8 +34,8 @@ + + outputs=ada/Makefile + +-target_libs="target-libada target-libgnatvsn" +-lang_dirs="libada libgnatvsn gnattools" ++target_libs="target-libada target-libgnatvsn target-libgnatprj" ++lang_dirs="libada libgnatvsn libgnatprj gnattools" + + # Ada will not work until the front end starts emitting GIMPLE trees. + build_by_default=no +Index: gnattools/Makefile.in +=================================================================== +--- gnattools/Makefile.in.orig ++++ gnattools/Makefile.in +@@ -35,13 +35,13 @@ + target_noncanonical=@target_noncanonical@ + + CFLAGS=-O2 -Wall +-INCLUDES = -I@srcdir@/../gcc/ada -I@srcdir@/../gcc + ADA_CFLAGS=-O2 -gnatn +-ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I../libgnatvsn ++ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I../libgnatvsn -I../libgnatprj + LIB_VERSION=$(strip $(shell grep ' Library_Version :' \ + ../libgnatvsn/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) + ADA_LIBS := -L../gcc/ada/rts -lgnat-$(LIB_VERSION) + ADA_LIBS += -L../libgnatvsn -lgnatvsn ++ADA_LIBS += -L../libgnatprj -lgnatprj + + # We will use the just-built compiler to compile and link everything. + GCC=../gcc/xgcc -B../gcc/ +@@ -66,74 +66,18 @@ + + # Since we don't have gnatmake, we must specify the full list of + # object files necessary to build gnatmake and gnatlink. +-# TODO: remove from these lists the objects that are part of +-# libgnatprj. + GNATLINK_OBJS = \ +-ali.o \ +-butil.o \ +-fmap.o \ + gnatlink.o \ + indepsw.o \ +-osint.o \ +-prefix.o \ +-rident.o \ +-sdefault.o \ +-stylesw.o \ +-switch.o \ +-targparm.o \ + validsw.o + + GNATMAKE_OBJS = \ +-ali-util.o \ +-ali.o \ +-binderr.o \ +-butil.o \ +-err_vars.o \ +-erroutc.o \ +-errutil.o \ +-fmap.o \ + fname-sf.o \ +-fname-uf.o \ + gnatmake.o \ + make.o \ + makeusg.o \ +-makeutl.o \ +-mlib-fil.o \ + mlib-prj.o \ +-mlib-tgt.o \ +-mlib-tgt-specific.o \ +-mlib-utl.o \ +-mlib.o \ + osint-m.o \ +-osint.o \ +-prefix.o \ +-prj-attr-pm.o \ +-prj-attr.o \ +-prj-com.o \ +-prj-dect.o \ +-prj-env.o \ +-prj-err.o \ +-prj-ext.o \ +-prj-nmsc.o \ +-prj-pars.o \ +-prj-part.o \ +-prj-proc.o \ +-prj-strt.o \ +-prj-tree.o \ +-prj-util.o \ +-prj.o \ +-rident.o \ +-scng.o \ +-sdefault.o \ +-sfn_scan.o \ +-sinput-c.o \ +-sinput-p.o \ +-styleg.o \ +-stylesw.o \ +-switch-m.o \ +-switch.o \ +-targparm.o \ +-tempdir.o \ + usage.o \ + validsw.o \ + $(EXTRA_GNATMAKE_OBJS) +@@ -175,11 +119,6 @@ + for file in $(BODIES) $(SPECS); do \ + $(LN_S) -f $$file .; \ + done +- rm -f sdefault.adb; $(LN_S) ../gcc/ada/sdefault.adb . +- $(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ +- rm -f $(word 1,$(subst <, ,$(PAIR)));\ +- $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ +- $(word 1,$(subst <, ,$(PAIR)));) + touch $@ + + gnattools-native: ../gcc/ada/rts/libgnat-$(LIB_VERSION).so +@@ -192,19 +131,16 @@ + vpath %.c @srcdir@/../gcc/ada:@srcdir@/../gcc + vpath %.h @srcdir@/../gcc/ada + +-# Because the just-built gcc is a host tool like us, we can use some +-# of its object files, e.g. prefix.o. +-vpath prefix.o ../gcc +- + # gnatlink + +-gnatlink-static: $(GNATLINK_OBJS) b_gnatl.o link.o ++gnatlink-static: $(GNATLINK_OBJS) b_gnatl.o + $(GCC) -o $@ $^ \ ++ ../libgnatprj/libgnatprj.a \ + ../libgnatvsn/libgnatvsn.a \ + ../gcc/ada/rts/libgnat.a \ + ../libiberty/libiberty.a + +-gnatlink: $(GNATLINK_OBJS) b_gnatl.o link.o ++gnatlink: $(GNATLINK_OBJS) b_gnatl.o + $(GCC) -o $@ $^ $(ADA_LIBS) ../libiberty/libiberty.a + + b_gnatl.o: b_gnatl.c adaint.h +@@ -215,13 +151,14 @@ + + # gnatmake + +-gnatmake-static: $(GNATMAKE_OBJS) b_gnatm.o link.o ++gnatmake-static: $(GNATMAKE_OBJS) b_gnatm.o + $(GCC) -o $@ $(ADA_CFLAGS) $^ \ ++ ../libgnatprj/libgnatprj.a \ + ../libgnatvsn/libgnatvsn.a \ + ../gcc/ada/rts/libgnat.a \ + ../libiberty/libiberty.a + +-gnatmake: $(GNATMAKE_OBJS) b_gnatm.o link.o ++gnatmake: $(GNATMAKE_OBJS) b_gnatm.o + $(GCC) -o $@ $(ADA_CFLAGS) $^ $(ADA_LIBS) ../libiberty/libiberty.a + + b_gnatm.o: b_gnatm.c adaint.h +@@ -231,19 +168,11 @@ + ../gcc/gnatbind -C -o $@ $(ADA_INCLUDES) gnatmake.ali + + # Other tools +-gnatkr: +- if [ ! -f $@.adb ] ; then $(LN_S) ../../src/gcc/ada/$@.ad[bs] .; fi +- ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ +- --GCC="$(GCC)" \ +- --GNATBIND=../gcc/gnatbind +- ./gnatlink-static -o $@ $@.ali $^ $(ADA_INCLUDES) $(ADA_LIBS) \ +- --GCC="$(GCC) $(ADA_INCLUDES)" +- + gnat: gnatcmd + cp -lp $< $@ + +-gnatbind gnatchop gnatclean gnatcmd gnatfind gnatls gnatname gnatprep gnatxref gprmake: \ +-link.o prefix.o ++gnatbind gnatchop gnatclean gnatcmd gnatfind gnatkr gnatls gnatname gnatprep \ ++gnatxref gprmake: + if [ ! -f $@.adb ] ; then $(LN_S) ../../src/gcc/ada/$@.ad[bs] .; fi + ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ + --GCC="$(GCC)" \ +@@ -252,29 +181,19 @@ + ../libiberty/libiberty.a \ + --GCC="$(GCC) $(ADA_INCLUDES)" + +-gnatbl: gnatbl.c link.o prefix.o ++gnatbl: gnatbl.c + $(GCC) -o $@ $< $(CFLAGS) \ + -I../gcc -I@srcdir@/../gcc/config -I@srcdir@/../gcc \ + -I@srcdir@/../include \ + $(filter-out %.c,$^) \ + $(ADA_LIBS) ../libiberty/libiberty.a + +-# Force compiling sdefault.adb, not .ads, to produce sdefault.o +-sdefault.o: sdefault.adb +- +-sdefault.adb: stamp-gnattools-sources +- + %.o: %.adb + $(GCC) -c -o $@ $< $(ADA_CFLAGS) $(ADA_INCLUDES) + + %.o: %.ads + $(GCC) -c -o $@ $< $(ADA_CFLAGS) $(ADA_INCLUDES) + +-%.o: %.c +- $(GCC) -c -o $@ $< $(CFLAGS) $(INCLUDES) +- +-prefix.o: +- + # Other + # ----- + +Index: libgnatprj/configure +=================================================================== +--- /dev/null ++++ libgnatprj/configure +@@ -0,0 +1,3138 @@ ++#! /bin/sh ++# Guess values for system-dependent variables and create Makefiles. ++# Generated by GNU Autoconf 2.61. ++# ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be more Bourne compatible ++DUALCASE=1; export DUALCASE # for MKS sh ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++ ++ ++# PATH needs CR ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# IFS ++# We need space, tab and new line, in precisely that order. Quoting is ++# there to prevent editors from complaining about space-tab. ++# (If _AS_PATH_WALK were called with IFS unset, it would disable word ++# splitting by setting IFS to empty value.) ++as_nl=' ++' ++IFS=" "" $as_nl" ++ ++# Find who we are. Look in the path if we contain no directory separator. ++case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++# We did not find ourselves, most probably we were run as `sh COMMAND' ++# in which case we are not to be found in the path. ++if test "x$as_myself" = x; then ++ as_myself=$0 ++fi ++if test ! -f "$as_myself"; then ++ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ { (exit 1); exit 1; } ++fi ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++for as_var in ENV MAIL MAILPATH ++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++done ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename -- "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ ++# CDPATH. ++$as_unset CDPATH ++ ++ ++if test "x$CONFIG_SHELL" = x; then ++ if (eval ":") 2>/dev/null; then ++ as_have_required=yes ++else ++ as_have_required=no ++fi ++ ++ if test $as_have_required = yes && (eval ": ++(as_func_return () { ++ (exit \$1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test \$exitcode = 0) || { (exit 1); exit 1; } ++ ++( ++ as_lineno_1=\$LINENO ++ as_lineno_2=\$LINENO ++ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && ++ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ++") 2> /dev/null; then ++ : ++else ++ as_candidate_shells= ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ case $as_dir in ++ /*) ++ for as_base in sh bash ksh sh5; do ++ as_candidate_shells="$as_candidate_shells $as_dir/$as_base" ++ done;; ++ esac ++done ++IFS=$as_save_IFS ++ ++ ++ for as_shell in $as_candidate_shells $SHELL; do ++ # Try only shells that exist, to save several forks. ++ if { test -f "$as_shell" || test -f "$as_shell.exe"; } && ++ { ("$as_shell") 2> /dev/null <<\_ASEOF ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++: ++_ASEOF ++}; then ++ CONFIG_SHELL=$as_shell ++ as_have_required=yes ++ if { "$as_shell" 2> /dev/null <<\_ASEOF ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++: ++(as_func_return () { ++ (exit $1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = "$1" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test $exitcode = 0) || { (exit 1); exit 1; } ++ ++( ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } ++ ++_ASEOF ++}; then ++ break ++fi ++ ++fi ++ ++ done ++ ++ if test "x$CONFIG_SHELL" != x; then ++ for as_var in BASH_ENV ENV ++ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ done ++ export CONFIG_SHELL ++ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} ++fi ++ ++ ++ if test $as_have_required = no; then ++ echo This script requires a shell more modern than all the ++ echo shells that I found on your system. Please install a ++ echo modern shell, or manually run the script under such a ++ echo shell if you do have one. ++ { (exit 1); exit 1; } ++fi ++ ++ ++fi ++ ++fi ++ ++ ++ ++(eval "as_func_return () { ++ (exit \$1) ++} ++as_func_success () { ++ as_func_return 0 ++} ++as_func_failure () { ++ as_func_return 1 ++} ++as_func_ret_success () { ++ return 0 ++} ++as_func_ret_failure () { ++ return 1 ++} ++ ++exitcode=0 ++if as_func_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_success failed. ++fi ++ ++if as_func_failure; then ++ exitcode=1 ++ echo as_func_failure succeeded. ++fi ++ ++if as_func_ret_success; then ++ : ++else ++ exitcode=1 ++ echo as_func_ret_success failed. ++fi ++ ++if as_func_ret_failure; then ++ exitcode=1 ++ echo as_func_ret_failure succeeded. ++fi ++ ++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then ++ : ++else ++ exitcode=1 ++ echo positional parameters were not saved. ++fi ++ ++test \$exitcode = 0") || { ++ echo No shell found that supports shell functions. ++ echo Please tell autoconf@gnu.org about your system, ++ echo including any error possibly output before this ++ echo message ++} ++ ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line after each line using $LINENO; the second 'sed' ++ # does the real work. The second script uses 'N' to pair each ++ # line-number line with the line containing $LINENO, and appends ++ # trailing '-' during substitution so that $LINENO is not a special ++ # case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # scripts with optimization help from Paolo Bonzini. Blame Lee ++ # E. McMahon (1931-1989) for sed's syntax. :-) ++ sed -n ' ++ p ++ /[$]LINENO/= ++ ' <$as_myself | ++ sed ' ++ s/[$]LINENO.*/&-/ ++ t lineno ++ b ++ :lineno ++ N ++ :loop ++ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ ++ t loop ++ s/-\n.*// ++ ' >$as_me.lineno && ++ chmod +x "$as_me.lineno" || ++ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensitive to this). ++ . "./$as_me.lineno" ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then ++ as_dirname=dirname ++else ++ as_dirname=false ++fi ++ ++ECHO_C= ECHO_N= ECHO_T= ++case `echo -n x` in ++-n*) ++ case `echo 'x\c'` in ++ *c*) ECHO_T=' ';; # ECHO_T is single tab character. ++ *) ECHO_C='\c';; ++ esac;; ++*) ++ ECHO_N='-n';; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++if test -d conf$$.dir; then ++ rm -f conf$$.dir/conf$$.file ++else ++ rm -f conf$$.dir ++ mkdir conf$$.dir ++fi ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s='ln -s' ++ # ... but there are two gotchas: ++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. ++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. ++ # In both cases, we have to default to `cp -p'. ++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ++ as_ln_s='cp -p' ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file ++rmdir conf$$.dir 2>/dev/null ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++if test -x / >/dev/null 2>&1; then ++ as_test_x='test -x' ++else ++ if ls -dL / >/dev/null 2>&1; then ++ as_ls_L_option=L ++ else ++ as_ls_L_option= ++ fi ++ as_test_x=' ++ eval sh -c '\'' ++ if test -d "$1"; then ++ test -d "$1/."; ++ else ++ case $1 in ++ -*)set "./$1";; ++ esac; ++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ++ ???[sx]*):;;*)false;;esac;fi ++ '\'' sh ++ ' ++fi ++as_executable_p=$as_test_x ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ ++ ++ ++exec 7<&0 &1 ++ ++# Name of the host. ++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# so uname gets run too. ++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` ++ ++# ++# Initializations. ++# ++ac_default_prefix=/usr/local ++ac_clean_files= ++ac_config_libobj_dir=. ++LIBOBJS= ++cross_compiling=no ++subdirs= ++MFLAGS= ++MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++ ++# Identity of this package. ++PACKAGE_NAME= ++PACKAGE_TARNAME= ++PACKAGE_VERSION= ++PACKAGE_STRING= ++PACKAGE_BUGREPORT= ++ ++ac_unique_file="Makefile.in" ++ac_subst_vars='SHELL ++PATH_SEPARATOR ++PACKAGE_NAME ++PACKAGE_TARNAME ++PACKAGE_VERSION ++PACKAGE_STRING ++PACKAGE_BUGREPORT ++exec_prefix ++prefix ++program_transform_name ++bindir ++sbindir ++libexecdir ++datarootdir ++datadir ++sysconfdir ++sharedstatedir ++localstatedir ++includedir ++oldincludedir ++docdir ++infodir ++htmldir ++dvidir ++pdfdir ++psdir ++libdir ++localedir ++mandir ++DEFS ++ECHO_C ++ECHO_N ++ECHO_T ++LIBS ++build_alias ++host_alias ++target_alias ++INSTALL_PROGRAM ++INSTALL_SCRIPT ++INSTALL_DATA ++build ++build_cpu ++build_vendor ++build_os ++host ++host_cpu ++host_vendor ++host_os ++target ++target_cpu ++target_vendor ++target_os ++target_noncanonical ++LN_S ++x_ada_cflags ++default_gnattools_target ++TOOLS_TARGET_PAIRS ++LIBOBJS ++LTLIBOBJS' ++ac_subst_files='' ++ ac_precious_vars='build_alias ++host_alias ++target_alias' ++ ++ ++# Initialize some variables set by options. ++ac_init_help= ++ac_init_version=false ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++cache_file=/dev/null ++exec_prefix=NONE ++no_create= ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++verbose= ++x_includes=NONE ++x_libraries=NONE ++ ++# Installation directory options. ++# These are left unexpanded so users can "make install exec_prefix=/foo" ++# and all the variables that are supposed to be based on exec_prefix ++# by default will actually change. ++# Use braces instead of parens because sh, perl, etc. also accept them. ++# (The list follows the same order as the GNU Coding Standards.) ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datarootdir='${prefix}/share' ++datadir='${datarootdir}' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++docdir='${datarootdir}/doc/${PACKAGE}' ++infodir='${datarootdir}/info' ++htmldir='${docdir}' ++dvidir='${docdir}' ++pdfdir='${docdir}' ++psdir='${docdir}' ++libdir='${exec_prefix}/lib' ++localedir='${datarootdir}/locale' ++mandir='${datarootdir}/man' ++ ++ac_prev= ++ac_dashdash= ++for ac_option ++do ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval $ac_prev=\$ac_option ++ ac_prev= ++ continue ++ fi ++ ++ case $ac_option in ++ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; ++ *) ac_optarg=yes ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case $ac_dashdash$ac_option in ++ --) ++ ac_dashdash=yes ;; ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir=$ac_optarg ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build_alias ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build_alias=$ac_optarg ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file=$ac_optarg ;; ++ ++ --config-cache | -C) ++ cache_file=config.cache ;; ++ ++ -datadir | --datadir | --datadi | --datad) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=*) ++ datadir=$ac_optarg ;; ++ ++ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ ++ | --dataroo | --dataro | --datar) ++ ac_prev=datarootdir ;; ++ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ ++ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) ++ datarootdir=$ac_optarg ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` ++ eval enable_$ac_feature=no ;; ++ ++ -docdir | --docdir | --docdi | --doc | --do) ++ ac_prev=docdir ;; ++ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) ++ docdir=$ac_optarg ;; ++ ++ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ++ ac_prev=dvidir ;; ++ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) ++ dvidir=$ac_optarg ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` ++ eval enable_$ac_feature=\$ac_optarg ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix=$ac_optarg ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he | -h) ++ ac_init_help=long ;; ++ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ++ ac_init_help=recursive ;; ++ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ++ ac_init_help=short ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host_alias ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host_alias=$ac_optarg ;; ++ ++ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ++ ac_prev=htmldir ;; ++ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ ++ | --ht=*) ++ htmldir=$ac_optarg ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir=$ac_optarg ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir=$ac_optarg ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir=$ac_optarg ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir=$ac_optarg ;; ++ ++ -localedir | --localedir | --localedi | --localed | --locale) ++ ac_prev=localedir ;; ++ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) ++ localedir=$ac_optarg ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst | --locals) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) ++ localstatedir=$ac_optarg ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir=$ac_optarg ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c | -n) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir=$ac_optarg ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix=$ac_optarg ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix=$ac_optarg ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix=$ac_optarg ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name=$ac_optarg ;; ++ ++ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ++ ac_prev=pdfdir ;; ++ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) ++ pdfdir=$ac_optarg ;; ++ ++ -psdir | --psdir | --psdi | --psd | --ps) ++ ac_prev=psdir ;; ++ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) ++ psdir=$ac_optarg ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir=$ac_optarg ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir=$ac_optarg ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site=$ac_optarg ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir=$ac_optarg ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir=$ac_optarg ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target_alias ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target_alias=$ac_optarg ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers | -V) ++ ac_init_version=: ;; ++ ++ -with-* | --with-*) ++ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } ++ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` ++ eval with_$ac_package=\$ac_optarg ;; ++ ++ -without-* | --without-*) ++ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } ++ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` ++ eval with_$ac_package=no ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes=$ac_optarg ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries=$ac_optarg ;; ++ ++ -*) { echo "$as_me: error: unrecognized option: $ac_option ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; } ++ ;; ++ ++ *=*) ++ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 ++ { (exit 1); exit 1; }; } ++ eval $ac_envvar=\$ac_optarg ++ export $ac_envvar ;; ++ ++ *) ++ # FIXME: should be removed in autoconf 3.0. ++ echo "$as_me: WARNING: you should use --build, --host, --target" >&2 ++ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ echo "$as_me: WARNING: invalid host type: $ac_option" >&2 ++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ ac_option=--`echo $ac_prev | sed 's/_/-/g'` ++ { echo "$as_me: error: missing argument to $ac_option" >&2 ++ { (exit 1); exit 1; }; } ++fi ++ ++# Be sure to have absolute directory names. ++for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ ++ datadir sysconfdir sharedstatedir localstatedir includedir \ ++ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ ++ libdir localedir mandir ++do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ [\\/$]* | ?:[\\/]* ) continue;; ++ NONE | '' ) case $ac_var in *prefix ) continue;; esac;; ++ esac ++ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 ++ { (exit 1); exit 1; }; } ++done ++ ++# There might be people who depend on the old broken behavior: `$host' ++# used to hold the argument of --host etc. ++# FIXME: To remove some day. ++build=$build_alias ++host=$host_alias ++target=$target_alias ++ ++# FIXME: To remove some day. ++if test "x$host_alias" != x; then ++ if test "x$build_alias" = x; then ++ cross_compiling=maybe ++ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. ++ If a cross compiler is detected then cross compile mode will be used." >&2 ++ elif test "x$build_alias" != "x$host_alias"; then ++ cross_compiling=yes ++ fi ++fi ++ ++ac_tool_prefix= ++test -n "$host_alias" && ac_tool_prefix=$host_alias- ++ ++test "$silent" = yes && exec 6>/dev/null ++ ++ ++ac_pwd=`pwd` && test -n "$ac_pwd" && ++ac_ls_di=`ls -di .` && ++ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || ++ { echo "$as_me: error: Working directory cannot be determined" >&2 ++ { (exit 1); exit 1; }; } ++test "X$ac_ls_di" = "X$ac_pwd_ls_di" || ++ { echo "$as_me: error: pwd does not report name of working directory" >&2 ++ { (exit 1); exit 1; }; } ++ ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then the parent directory. ++ ac_confdir=`$as_dirname -- "$0" || ++$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$0" : 'X\(//\)[^/]' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$0" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ srcdir=$ac_confdir ++ if test ! -r "$srcdir/$ac_unique_file"; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r "$srcdir/$ac_unique_file"; then ++ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." ++ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 ++ { (exit 1); exit 1; }; } ++fi ++ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ++ac_abs_confdir=`( ++ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 ++ { (exit 1); exit 1; }; } ++ pwd)` ++# When building in place, set srcdir=. ++if test "$ac_abs_confdir" = "$ac_pwd"; then ++ srcdir=. ++fi ++# Remove unnecessary trailing slashes from srcdir. ++# Double slashes in file names in object file debugging info ++# mess up M-x gdb in Emacs. ++case $srcdir in ++*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; ++esac ++for ac_var in $ac_precious_vars; do ++ eval ac_env_${ac_var}_set=\${${ac_var}+set} ++ eval ac_env_${ac_var}_value=\$${ac_var} ++ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} ++ eval ac_cv_env_${ac_var}_value=\$${ac_var} ++done ++ ++# ++# Report the --help message. ++# ++if test "$ac_init_help" = "long"; then ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat <<_ACEOF ++\`configure' configures this package to adapt to many kinds of systems. ++ ++Usage: $0 [OPTION]... [VAR=VALUE]... ++ ++To assign environment variables (e.g., CC, CFLAGS...), specify them as ++VAR=VALUE. See below for descriptions of some of the useful variables. ++ ++Defaults for the options are specified in brackets. ++ ++Configuration: ++ -h, --help display this help and exit ++ --help=short display options specific to this package ++ --help=recursive display the short help of all the included packages ++ -V, --version display version information and exit ++ -q, --quiet, --silent do not print \`checking...' messages ++ --cache-file=FILE cache test results in FILE [disabled] ++ -C, --config-cache alias for \`--cache-file=config.cache' ++ -n, --no-create do not create output files ++ --srcdir=DIR find the sources in DIR [configure dir or \`..'] ++ ++Installation directories: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [PREFIX] ++ ++By default, \`make install' will install all the files in ++\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify ++an installation prefix other than \`$ac_default_prefix' using \`--prefix', ++for instance \`--prefix=\$HOME'. ++ ++For better control, use the options below. ++ ++Fine tuning of the installation directories: ++ --bindir=DIR user executables [EPREFIX/bin] ++ --sbindir=DIR system admin executables [EPREFIX/sbin] ++ --libexecdir=DIR program executables [EPREFIX/libexec] ++ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data [PREFIX/var] ++ --libdir=DIR object code libraries [EPREFIX/lib] ++ --includedir=DIR C header files [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc [/usr/include] ++ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] ++ --datadir=DIR read-only architecture-independent data [DATAROOTDIR] ++ --infodir=DIR info documentation [DATAROOTDIR/info] ++ --localedir=DIR locale-dependent data [DATAROOTDIR/locale] ++ --mandir=DIR man documentation [DATAROOTDIR/man] ++ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] ++ --htmldir=DIR html documentation [DOCDIR] ++ --dvidir=DIR dvi documentation [DOCDIR] ++ --pdfdir=DIR pdf documentation [DOCDIR] ++ --psdir=DIR ps documentation [DOCDIR] ++_ACEOF ++ ++ cat <<\_ACEOF ++ ++System types: ++ --build=BUILD configure for building on BUILD [guessed] ++ --host=HOST cross-compile to build programs to run on HOST [BUILD] ++ --target=TARGET configure for building compilers for TARGET [HOST] ++_ACEOF ++fi ++ ++if test -n "$ac_init_help"; then ++ ++ cat <<\_ACEOF ++ ++_ACEOF ++ac_status=$? ++fi ++ ++if test "$ac_init_help" = "recursive"; then ++ # If there are subdirs, report their specific --help. ++ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue ++ test -d "$ac_dir" || continue ++ ac_builddir=. ++ ++case "$ac_dir" in ++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; ++*) ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A ".." for each directory in $ac_dir_suffix. ++ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` ++ case $ac_top_builddir_sub in ++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; ++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; ++ esac ;; ++esac ++ac_abs_top_builddir=$ac_pwd ++ac_abs_builddir=$ac_pwd$ac_dir_suffix ++# for backward compatibility: ++ac_top_builddir=$ac_top_build_prefix ++ ++case $srcdir in ++ .) # We are building in place. ++ ac_srcdir=. ++ ac_top_srcdir=$ac_top_builddir_sub ++ ac_abs_top_srcdir=$ac_pwd ;; ++ [\\/]* | ?:[\\/]* ) # Absolute name. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ++ ac_abs_top_srcdir=$srcdir ;; ++ *) # Relative name. ++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_build_prefix$srcdir ++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; ++esac ++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix ++ ++ cd "$ac_dir" || { ac_status=$?; continue; } ++ # Check for guested configure. ++ if test -f "$ac_srcdir/configure.gnu"; then ++ echo && ++ $SHELL "$ac_srcdir/configure.gnu" --help=recursive ++ elif test -f "$ac_srcdir/configure"; then ++ echo && ++ $SHELL "$ac_srcdir/configure" --help=recursive ++ else ++ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 ++ fi || ac_status=$? ++ cd "$ac_pwd" || { ac_status=$?; break; } ++ done ++fi ++ ++test -n "$ac_init_help" && exit $ac_status ++if $ac_init_version; then ++ cat <<\_ACEOF ++configure ++generated by GNU Autoconf 2.61 ++ ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ++This configure script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it. ++_ACEOF ++ exit ++fi ++cat >config.log <<_ACEOF ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++ ++It was created by $as_me, which was ++generated by GNU Autoconf 2.61. Invocation command line was ++ ++ $ $0 $@ ++ ++_ACEOF ++exec 5>>config.log ++{ ++cat <<_ASUNAME ++## --------- ## ++## Platform. ## ++## --------- ## ++ ++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` ++uname -m = `(uname -m) 2>/dev/null || echo unknown` ++uname -r = `(uname -r) 2>/dev/null || echo unknown` ++uname -s = `(uname -s) 2>/dev/null || echo unknown` ++uname -v = `(uname -v) 2>/dev/null || echo unknown` ++ ++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` ++/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` ++ ++/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` ++/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` ++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` ++/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` ++/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` ++/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` ++/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` ++ ++_ASUNAME ++ ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ echo "PATH: $as_dir" ++done ++IFS=$as_save_IFS ++ ++} >&5 ++ ++cat >&5 <<_ACEOF ++ ++ ++## ----------- ## ++## Core tests. ## ++## ----------- ## ++ ++_ACEOF ++ ++ ++# Keep a trace of the command line. ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Strip out --silent because we don't want to record it for future runs. ++# Also quote any args containing shell meta-characters. ++# Make two passes to allow for proper duplicate-argument suppression. ++ac_configure_args= ++ac_configure_args0= ++ac_configure_args1= ++ac_must_keep_next=false ++for ac_pass in 1 2 ++do ++ for ac_arg ++ do ++ case $ac_arg in ++ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ continue ;; ++ *\'*) ++ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ esac ++ case $ac_pass in ++ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; ++ 2) ++ ac_configure_args1="$ac_configure_args1 '$ac_arg'" ++ if test $ac_must_keep_next = true; then ++ ac_must_keep_next=false # Got value, back to normal. ++ else ++ case $ac_arg in ++ *=* | --config-cache | -C | -disable-* | --disable-* \ ++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ ++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ ++ | -with-* | --with-* | -without-* | --without-* | --x) ++ case "$ac_configure_args0 " in ++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; ++ esac ++ ;; ++ -* ) ac_must_keep_next=true ;; ++ esac ++ fi ++ ac_configure_args="$ac_configure_args '$ac_arg'" ++ ;; ++ esac ++ done ++done ++$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } ++$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } ++ ++# When interrupted or exit'd, cleanup temporary files, and complete ++# config.log. We remove comments because anyway the quotes in there ++# would cause problems or look ugly. ++# WARNING: Use '\'' to represent an apostrophe within the trap. ++# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. ++trap 'exit_status=$? ++ # Save into config.log some information that might help in debugging. ++ { ++ echo ++ ++ cat <<\_ASBOX ++## ---------------- ## ++## Cache variables. ## ++## ---------------- ## ++_ASBOX ++ echo ++ # The following way of writing the cache mishandles newlines in values, ++( ++ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do ++ eval ac_val=\$$ac_var ++ case $ac_val in #( ++ *${as_nl}*) ++ case $ac_var in #( ++ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 ++echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; ++ esac ++ case $ac_var in #( ++ _ | IFS | as_nl) ;; #( ++ *) $as_unset $ac_var ;; ++ esac ;; ++ esac ++ done ++ (set) 2>&1 | ++ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( ++ *${as_nl}ac_space=\ *) ++ sed -n \ ++ "s/'\''/'\''\\\\'\'''\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ++ ;; #( ++ *) ++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ++ ;; ++ esac | ++ sort ++) ++ echo ++ ++ cat <<\_ASBOX ++## ----------------- ## ++## Output variables. ## ++## ----------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_vars ++ do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ esac ++ echo "$ac_var='\''$ac_val'\''" ++ done | sort ++ echo ++ ++ if test -n "$ac_subst_files"; then ++ cat <<\_ASBOX ++## ------------------- ## ++## File substitutions. ## ++## ------------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_files ++ do ++ eval ac_val=\$$ac_var ++ case $ac_val in ++ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ esac ++ echo "$ac_var='\''$ac_val'\''" ++ done | sort ++ echo ++ fi ++ ++ if test -s confdefs.h; then ++ cat <<\_ASBOX ++## ----------- ## ++## confdefs.h. ## ++## ----------- ## ++_ASBOX ++ echo ++ cat confdefs.h ++ echo ++ fi ++ test "$ac_signal" != 0 && ++ echo "$as_me: caught signal $ac_signal" ++ echo "$as_me: exit $exit_status" ++ } >&5 ++ rm -f core *.core core.conftest.* && ++ rm -f -r conftest* confdefs* conf$$* $ac_clean_files && ++ exit $exit_status ++' 0 ++for ac_signal in 1 2 13 15; do ++ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal ++done ++ac_signal=0 ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -f -r conftest* confdefs.h ++ ++# Predefined preprocessor variables. ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_NAME "$PACKAGE_NAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_TARNAME "$PACKAGE_TARNAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_VERSION "$PACKAGE_VERSION" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_STRING "$PACKAGE_STRING" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" ++_ACEOF ++ ++ ++# Let the site file select an alternate cache file if it wants to. ++# Prefer explicitly selected file to automatically selected ones. ++if test -n "$CONFIG_SITE"; then ++ set x "$CONFIG_SITE" ++elif test "x$prefix" != xNONE; then ++ set x "$prefix/share/config.site" "$prefix/etc/config.site" ++else ++ set x "$ac_default_prefix/share/config.site" \ ++ "$ac_default_prefix/etc/config.site" ++fi ++shift ++for ac_site_file ++do ++ if test -r "$ac_site_file"; then ++ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 ++echo "$as_me: loading site script $ac_site_file" >&6;} ++ sed 's/^/| /' "$ac_site_file" >&5 ++ . "$ac_site_file" ++ fi ++done ++ ++if test -r "$cache_file"; then ++ # Some versions of bash will fail to source /dev/null (special ++ # files actually), so we avoid doing that. ++ if test -f "$cache_file"; then ++ { echo "$as_me:$LINENO: loading cache $cache_file" >&5 ++echo "$as_me: loading cache $cache_file" >&6;} ++ case $cache_file in ++ [\\/]* | ?:[\\/]* ) . "$cache_file";; ++ *) . "./$cache_file";; ++ esac ++ fi ++else ++ { echo "$as_me:$LINENO: creating cache $cache_file" >&5 ++echo "$as_me: creating cache $cache_file" >&6;} ++ >$cache_file ++fi ++ ++# Check that the precious variables saved in the cache have kept the same ++# value. ++ac_cache_corrupted=false ++for ac_var in $ac_precious_vars; do ++ eval ac_old_set=\$ac_cv_env_${ac_var}_set ++ eval ac_new_set=\$ac_env_${ac_var}_set ++ eval ac_old_val=\$ac_cv_env_${ac_var}_value ++ eval ac_new_val=\$ac_env_${ac_var}_value ++ case $ac_old_set,$ac_new_set in ++ set,) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,set) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,);; ++ *) ++ if test "x$ac_old_val" != "x$ac_new_val"; then ++ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 ++echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ++ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 ++echo "$as_me: former value: $ac_old_val" >&2;} ++ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 ++echo "$as_me: current value: $ac_new_val" >&2;} ++ ac_cache_corrupted=: ++ fi;; ++ esac ++ # Pass precious variables to config.status. ++ if test "$ac_new_set" = set; then ++ case $ac_new_val in ++ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *) ac_arg=$ac_var=$ac_new_val ;; ++ esac ++ case " $ac_configure_args " in ++ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. ++ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ esac ++ fi ++done ++if $ac_cache_corrupted; then ++ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 ++echo "$as_me: error: changes in the environment can compromise the build" >&2;} ++ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 ++echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++ ++ ++ ++# Start of actual configure tests ++ ++ac_aux_dir= ++for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do ++ if test -f "$ac_dir/install-sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f "$ac_dir/install.sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ elif test -f "$ac_dir/shtool"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break ++ fi ++done ++if test -z "$ac_aux_dir"; then ++ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 ++echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++# These three variables are undocumented and unsupported, ++# and are intended to be withdrawn in a future Autoconf release. ++# They can cause serious problems if a builder's source tree is in a directory ++# whose full name contains unusual characters. ++ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ++ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ++ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ++ ++ ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AmigaOS /C/install, which installs bootblocks on floppy discs ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic ++# ./install, which can be erroneously created by make from ./install.sh. ++{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 ++echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } ++if test -z "$INSTALL"; then ++if test "${ac_cv_path_install+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ # Account for people who put trailing slashes in PATH elements. ++case $as_dir/ in ++ ./ | .// | /cC/* | \ ++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ ++ /usr/ucb/* ) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi ++ done ++ done ++ ;; ++esac ++done ++IFS=$as_save_IFS ++ ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL=$ac_cv_path_install ++ else ++ # As a last resort, use the slow shell script. Don't cache a ++ # value for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the value is a relative name. ++ INSTALL=$ac_install_sh ++ fi ++fi ++{ echo "$as_me:$LINENO: result: $INSTALL" >&5 ++echo "${ECHO_T}$INSTALL" >&6; } ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++ ++# Make sure we can run config.sub. ++$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || ++ { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 ++echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} ++ { (exit 1); exit 1; }; } ++ ++{ echo "$as_me:$LINENO: checking build system type" >&5 ++echo $ECHO_N "checking build system type... $ECHO_C" >&6; } ++if test "${ac_cv_build+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_build_alias=$build_alias ++test "x$ac_build_alias" = x && ++ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` ++test "x$ac_build_alias" = x && ++ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 ++echo "$as_me: error: cannot guess build type; you must specify one" >&2;} ++ { (exit 1); exit 1; }; } ++ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 ++echo "${ECHO_T}$ac_cv_build" >&6; } ++case $ac_cv_build in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 ++echo "$as_me: error: invalid value of canonical build" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++build=$ac_cv_build ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_build ++shift ++build_cpu=$1 ++build_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++build_os=$* ++IFS=$ac_save_IFS ++case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac ++ ++ ++{ echo "$as_me:$LINENO: checking host system type" >&5 ++echo $ECHO_N "checking host system type... $ECHO_C" >&6; } ++if test "${ac_cv_host+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "x$host_alias" = x; then ++ ac_cv_host=$ac_cv_build ++else ++ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 ++echo "${ECHO_T}$ac_cv_host" >&6; } ++case $ac_cv_host in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 ++echo "$as_me: error: invalid value of canonical host" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++host=$ac_cv_host ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_host ++shift ++host_cpu=$1 ++host_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++host_os=$* ++IFS=$ac_save_IFS ++case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ++ ++ ++{ echo "$as_me:$LINENO: checking target system type" >&5 ++echo $ECHO_N "checking target system type... $ECHO_C" >&6; } ++if test "${ac_cv_target+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "x$target_alias" = x; then ++ ac_cv_target=$ac_cv_host ++else ++ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || ++ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 ++echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 ++echo "${ECHO_T}$ac_cv_target" >&6; } ++case $ac_cv_target in ++*-*-*) ;; ++*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 ++echo "$as_me: error: invalid value of canonical target" >&2;} ++ { (exit 1); exit 1; }; };; ++esac ++target=$ac_cv_target ++ac_save_IFS=$IFS; IFS='-' ++set x $ac_cv_target ++shift ++target_cpu=$1 ++target_vendor=$2 ++shift; shift ++# Remember, the first character of IFS is used to create $*, ++# except with old shells: ++target_os=$* ++IFS=$ac_save_IFS ++case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac ++ ++ ++# The aliases save the names the user supplied, while $host etc. ++# will get canonicalized. ++test -n "$target_alias" && ++ test "$program_prefix$program_suffix$program_transform_name" = \ ++ NONENONEs,x,x, && ++ program_prefix=${target_alias}- ++ ++# Autoconf M4 include file defining utility macros for complex Canadian ++# cross builds. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++#### ++# _NCN_TOOL_PREFIXES: Some stuff that oughtta be done in AC_CANONICAL_SYSTEM ++# or AC_INIT. ++# These demand that AC_CANONICAL_SYSTEM be called beforehand. ++ ++#### ++# NCN_STRICT_CHECK_TOOLS(variable, progs-to-check-for,[value-if-not-found],[path]) ++# Like plain AC_CHECK_TOOLS, but require prefix if build!=host. ++ ++ ++#### ++# NCN_STRICT_CHECK_TARGET_TOOLS(variable, progs-to-check-for,[value-if-not-found],[path]) ++# Like CVS Autoconf AC_CHECK_TARGET_TOOLS, but require prefix if build!=target. ++ ++ ++ ++# Backported from Autoconf 2.5x; can go away when and if ++# we switch. Put the OS path separator in $PATH_SEPARATOR. ++ ++ ++ ++ ++# ACX_HAVE_GCC_FOR_TARGET ++# Check if the variable GCC_FOR_TARGET really points to a GCC binary. ++ ++ ++# ACX_CHECK_INSTALLED_TARGET_TOOL(VAR, PROG) ++# Searching for installed target binutils. We need to take extra care, ++# else we may find the wrong assembler, linker, etc., and lose. ++# ++# First try --with-build-time-tools, if specified. ++# ++# For build != host, we ask the installed GCC for the name of the tool it ++# uses, and accept it if it is an absolute path. This is because the ++# only good choice for a compiler is the same GCC version that is being ++# installed (or we couldn't make target libraries), and we assume that ++# on the host system we'll have not only the same GCC version, but also ++# the same binutils version. ++# ++# For build == host, search the same directories that the installed ++# compiler will search. We used to do this for the assembler, linker, ++# and nm only; for simplicity of configuration, however, we extend this ++# criterion to tools (such as ar and ranlib) that are never invoked by ++# the compiler, to avoid mismatches. ++# ++# Also note we have to check MD_EXEC_PREFIX before checking the user's path ++# if build == target. This makes the most sense only when bootstrapping, ++# but we also do so when build != host. In this case, we hope that the ++# build and host systems will have similar contents of MD_EXEC_PREFIX. ++# ++# If we do not find a suitable binary, then try the user's path. ++ ++ ++### ++# AC_PROG_CPP_WERROR ++# Used for autoconf 2.5x to force AC_PREPROC_IFELSE to reject code which ++# triggers warnings from the preprocessor. Will be in autoconf 2.58. ++# For now, using this also overrides header checks to use only the ++# preprocessor (matches 2.13 behavior; matching 2.58's behavior is a ++# bit harder from here). ++# Eventually autoconf will default to checking headers with the compiler ++# instead, and we'll have to do this differently. ++ ++# AC_PROG_CPP_WERROR ++ ++# Test for GNAT. ++# We require the gnatbind program, and a compiler driver that ++# understands Ada. We use the user's CC setting, already found. ++# ++# Sets the shell variable have_gnat to yes or no as appropriate, and ++# substitutes GNATBIND and GNATMAKE. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ case ${build_alias} in ++ "") build_noncanonical=${build} ;; ++ *) build_noncanonical=${build_alias} ;; ++esac ++ ++ case ${host_alias} in ++ "") host_noncanonical=${build_noncanonical} ;; ++ *) host_noncanonical=${host_alias} ;; ++esac ++ ++ case ${target_alias} in ++ "") target_noncanonical=${host_noncanonical} ;; ++ *) target_noncanonical=${target_alias} ;; ++esac ++ ++ ++ ++ ++# Need to pass this down for now :-P ++{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 ++echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } ++LN_S=$as_ln_s ++if test "$LN_S" = "ln -s"; then ++ { echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6; } ++else ++ { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 ++echo "${ECHO_T}no, using $LN_S" >&6; } ++fi ++ ++ ++# Determine x_ada_cflags ++case $host in ++ hppa*) x_ada_cflags=-mdisable-indexing ;; ++ *) x_ada_cflags= ;; ++esac ++ ++ ++# Determine what to build for 'gnattools' ++if test $build = $target ; then ++ # Note that build=target is almost certainly the wrong test; FIXME ++ default_gnattools_target="gnattools-native" ++else ++ default_gnattools_target="gnattools-cross" ++fi ++ ++ ++# Target-specific stuff (defaults) ++TOOLS_TARGET_PAIRS= ++ ++ ++# Per-target case statement ++# ------------------------- ++case "${target}" in ++ alpha*-dec-vx*) # Unlike all other Vxworks ++ ;; ++ m68k*-wrs-vx* \ ++ | powerpc*-wrs-vxworks \ ++ | sparc*-wrs-vx* \ ++ | *86-wrs-vxworks \ ++ | xscale*-wrs-vx* \ ++ | xscale*-wrs-coff \ ++ | mips*-wrs-vx*) ++ TOOLS_TARGET_PAIRS="mlib-tgt-specific.adbconfcache <<\_ACEOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs, see configure's option --config-cache. ++# It is not useful on other systems. If it contains results you don't ++# want to keep, you may remove or edit it. ++# ++# config.status only pays attention to the cache file if you give it ++# the --recheck option to rerun configure. ++# ++# `ac_cv_env_foo' variables (set or unset) will be overridden when ++# loading this file, other *unset* `ac_cv_foo' will be assigned the ++# following values. ++ ++_ACEOF ++ ++# The following way of writing the cache mishandles newlines in values, ++# but we know of no workaround that is simple, portable, and efficient. ++# So, we kill variables containing newlines. ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++( ++ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do ++ eval ac_val=\$$ac_var ++ case $ac_val in #( ++ *${as_nl}*) ++ case $ac_var in #( ++ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 ++echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; ++ esac ++ case $ac_var in #( ++ _ | IFS | as_nl) ;; #( ++ *) $as_unset $ac_var ;; ++ esac ;; ++ esac ++ done ++ ++ (set) 2>&1 | ++ case $as_nl`(ac_space=' '; set) 2>&1` in #( ++ *${as_nl}ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote ++ # substitution turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ "s/'/'\\\\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ++ ;; #( ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ++ ;; ++ esac | ++ sort ++) | ++ sed ' ++ /^ac_cv_env_/b end ++ t clear ++ :clear ++ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ ++ t end ++ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ ++ :end' >>confcache ++if diff "$cache_file" confcache >/dev/null 2>&1; then :; else ++ if test -w "$cache_file"; then ++ test "x$cache_file" != "x/dev/null" && ++ { echo "$as_me:$LINENO: updating cache $cache_file" >&5 ++echo "$as_me: updating cache $cache_file" >&6;} ++ cat confcache >$cache_file ++ else ++ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 ++echo "$as_me: not updating unwritable cache $cache_file" >&6;} ++ fi ++fi ++rm -f confcache ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Transform confdefs.h into DEFS. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++# ++# If the first sed substitution is executed (which looks for macros that ++# take arguments), then branch to the quote section. Otherwise, ++# look for a macro that doesn't take arguments. ++ac_script=' ++t clear ++:clear ++s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g ++t quote ++s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g ++t quote ++b any ++:quote ++s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g ++s/\[/\\&/g ++s/\]/\\&/g ++s/\$/$$/g ++H ++:any ++${ ++ g ++ s/^\n// ++ s/\n/ /g ++ p ++} ++' ++DEFS=`sed -n "$ac_script" confdefs.h` ++ ++ ++ac_libobjs= ++ac_ltlibobjs= ++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue ++ # 1. Remove the extension, and $U if already installed. ++ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ++ ac_i=`echo "$ac_i" | sed "$ac_script"` ++ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR ++ # will be set to the directory where LIBOBJS objects are built. ++ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ++ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' ++done ++LIBOBJS=$ac_libobjs ++ ++LTLIBOBJS=$ac_ltlibobjs ++ ++ ++ ++: ${CONFIG_STATUS=./config.status} ++ac_clean_files_save=$ac_clean_files ++ac_clean_files="$ac_clean_files $CONFIG_STATUS" ++{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 ++echo "$as_me: creating $CONFIG_STATUS" >&6;} ++cat >$CONFIG_STATUS <<_ACEOF ++#! $SHELL ++# Generated by $as_me. ++# Run this file to recreate the current configuration. ++# Compiler output produced by configure, useful for debugging ++# configure, is in config.log if it exists. ++ ++debug=false ++ac_cs_recheck=false ++ac_cs_silent=false ++SHELL=\${CONFIG_SHELL-$SHELL} ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be more Bourne compatible ++DUALCASE=1; export DUALCASE # for MKS sh ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in ++ *posix*) set -o posix ;; ++esac ++ ++fi ++ ++ ++ ++ ++# PATH needs CR ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# IFS ++# We need space, tab and new line, in precisely that order. Quoting is ++# there to prevent editors from complaining about space-tab. ++# (If _AS_PATH_WALK were called with IFS unset, it would disable word ++# splitting by setting IFS to empty value.) ++as_nl=' ++' ++IFS=" "" $as_nl" ++ ++# Find who we are. Look in the path if we contain no directory separator. ++case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++# We did not find ourselves, most probably we were run as `sh COMMAND' ++# in which case we are not to be found in the path. ++if test "x$as_myself" = x; then ++ as_myself=$0 ++fi ++if test ! -f "$as_myself"; then ++ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ { (exit 1); exit 1; } ++fi ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++for as_var in ENV MAIL MAILPATH ++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++done ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename -- "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| . 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\/\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ ++# CDPATH. ++$as_unset CDPATH ++ ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line after each line using $LINENO; the second 'sed' ++ # does the real work. The second script uses 'N' to pair each ++ # line-number line with the line containing $LINENO, and appends ++ # trailing '-' during substitution so that $LINENO is not a special ++ # case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # scripts with optimization help from Paolo Bonzini. Blame Lee ++ # E. McMahon (1931-1989) for sed's syntax. :-) ++ sed -n ' ++ p ++ /[$]LINENO/= ++ ' <$as_myself | ++ sed ' ++ s/[$]LINENO.*/&-/ ++ t lineno ++ b ++ :lineno ++ N ++ :loop ++ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ ++ t loop ++ s/-\n.*// ++ ' >$as_me.lineno && ++ chmod +x "$as_me.lineno" || ++ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensitive to this). ++ . "./$as_me.lineno" ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then ++ as_dirname=dirname ++else ++ as_dirname=false ++fi ++ ++ECHO_C= ECHO_N= ECHO_T= ++case `echo -n x` in ++-n*) ++ case `echo 'x\c'` in ++ *c*) ECHO_T=' ';; # ECHO_T is single tab character. ++ *) ECHO_C='\c';; ++ esac;; ++*) ++ ECHO_N='-n';; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1 && ++ test "X`expr 00001 : '.*\(...\)'`" = X001; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++if test -d conf$$.dir; then ++ rm -f conf$$.dir/conf$$.file ++else ++ rm -f conf$$.dir ++ mkdir conf$$.dir ++fi ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s='ln -s' ++ # ... but there are two gotchas: ++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. ++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. ++ # In both cases, we have to default to `cp -p'. ++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ++ as_ln_s='cp -p' ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file ++rmdir conf$$.dir 2>/dev/null ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++if test -x / >/dev/null 2>&1; then ++ as_test_x='test -x' ++else ++ if ls -dL / >/dev/null 2>&1; then ++ as_ls_L_option=L ++ else ++ as_ls_L_option= ++ fi ++ as_test_x=' ++ eval sh -c '\'' ++ if test -d "$1"; then ++ test -d "$1/."; ++ else ++ case $1 in ++ -*)set "./$1";; ++ esac; ++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ++ ???[sx]*):;;*)false;;esac;fi ++ '\'' sh ++ ' ++fi ++as_executable_p=$as_test_x ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ ++ ++exec 6>&1 ++ ++# Save the log message, to keep $[0] and so on meaningful, and to ++# report actual input values of CONFIG_FILES etc. instead of their ++# values after options handling. ++ac_log=" ++This file was extended by $as_me, which was ++generated by GNU Autoconf 2.61. Invocation command line was ++ ++ CONFIG_FILES = $CONFIG_FILES ++ CONFIG_HEADERS = $CONFIG_HEADERS ++ CONFIG_LINKS = $CONFIG_LINKS ++ CONFIG_COMMANDS = $CONFIG_COMMANDS ++ $ $0 $@ ++ ++on `(hostname || uname -n) 2>/dev/null | sed 1q` ++" ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++# Files that config.status was made for. ++config_files="$ac_config_files" ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ac_cs_usage="\ ++\`$as_me' instantiates files from templates according to the ++current configuration. ++ ++Usage: $0 [OPTIONS] [FILE]... ++ ++ -h, --help print this help, then exit ++ -V, --version print version number and configuration settings, then exit ++ -q, --quiet do not print progress messages ++ -d, --debug don't remove temporary files ++ --recheck update $as_me by reconfiguring in the same conditions ++ --file=FILE[:TEMPLATE] ++ instantiate the configuration file FILE ++ ++Configuration files: ++$config_files ++ ++Report bugs to ." ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++ac_cs_version="\\ ++config.status ++configured by $0, generated by GNU Autoconf 2.61, ++ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" ++ ++Copyright (C) 2006 Free Software Foundation, Inc. ++This config.status script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it." ++ ++ac_pwd='$ac_pwd' ++srcdir='$srcdir' ++INSTALL='$INSTALL' ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++# If no file are specified by the user, then we need to provide default ++# value. By we need to know if files were specified by the user. ++ac_need_defaults=: ++while test $# != 0 ++do ++ case $1 in ++ --*=*) ++ ac_option=`expr "X$1" : 'X\([^=]*\)='` ++ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ++ ac_shift=: ++ ;; ++ *) ++ ac_option=$1 ++ ac_optarg=$2 ++ ac_shift=shift ++ ;; ++ esac ++ ++ case $ac_option in ++ # Handling of the options. ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ ac_cs_recheck=: ;; ++ --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) ++ echo "$ac_cs_version"; exit ;; ++ --debug | --debu | --deb | --de | --d | -d ) ++ debug=: ;; ++ --file | --fil | --fi | --f ) ++ $ac_shift ++ CONFIG_FILES="$CONFIG_FILES $ac_optarg" ++ ac_need_defaults=false;; ++ --he | --h | --help | --hel | -h ) ++ echo "$ac_cs_usage"; exit ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil | --si | --s) ++ ac_cs_silent=: ;; ++ ++ # This is an error. ++ -*) { echo "$as_me: error: unrecognized option: $1 ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; } ;; ++ ++ *) ac_config_targets="$ac_config_targets $1" ++ ac_need_defaults=false ;; ++ ++ esac ++ shift ++done ++ ++ac_configure_extra_args= ++ ++if $ac_cs_silent; then ++ exec 6>/dev/null ++ ac_configure_extra_args="$ac_configure_extra_args --silent" ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++if \$ac_cs_recheck; then ++ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 ++ CONFIG_SHELL=$SHELL ++ export CONFIG_SHELL ++ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++exec 5>>config.log ++{ ++ echo ++ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ++## Running $as_me. ## ++_ASBOX ++ echo "$ac_log" ++} >&5 ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ ++# Handling of arguments. ++for ac_config_target in $ac_config_targets ++do ++ case $ac_config_target in ++ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; ++ ++ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 ++echo "$as_me: error: invalid argument: $ac_config_target" >&2;} ++ { (exit 1); exit 1; }; };; ++ esac ++done ++ ++ ++# If the user did not use the arguments to specify the items to instantiate, ++# then the envvar interface is used. Set only those that are not. ++# We use the long form for the default assignment because of an extremely ++# bizarre bug on SunOS 4.1.3. ++if $ac_need_defaults; then ++ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files ++fi ++ ++# Have a temporary directory for convenience. Make it in the build tree ++# simply because there is no reason against having it here, and in addition, ++# creating and moving files from /tmp can sometimes cause problems. ++# Hook for its removal unless debugging. ++# Note that there is a small window in which the directory will not be cleaned: ++# after its creation but before its name has been assigned to `$tmp'. ++$debug || ++{ ++ tmp= ++ trap 'exit_status=$? ++ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ++' 0 ++ trap '{ (exit 1); exit 1; }' 1 2 13 15 ++} ++# Create a (secure) tmp directory for tmp files. ++ ++{ ++ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && ++ test -n "$tmp" && test -d "$tmp" ++} || ++{ ++ tmp=./conf$$-$RANDOM ++ (umask 077 && mkdir "$tmp") ++} || ++{ ++ echo "$me: cannot create a temporary directory in ." >&2 ++ { (exit 1); exit 1; } ++} ++ ++# ++# Set up the sed scripts for CONFIG_FILES section. ++# ++ ++# No need to generate the scripts if there are no CONFIG_FILES. ++# This happens for instance when ./config.status config.h ++if test -n "$CONFIG_FILES"; then ++ ++_ACEOF ++ ++ ++ ++ac_delim='%!_!# ' ++for ac_last_try in false false false false false :; do ++ cat >conf$$subs.sed <<_ACEOF ++SHELL!$SHELL$ac_delim ++PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim ++PACKAGE_NAME!$PACKAGE_NAME$ac_delim ++PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim ++PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim ++PACKAGE_STRING!$PACKAGE_STRING$ac_delim ++PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim ++exec_prefix!$exec_prefix$ac_delim ++prefix!$prefix$ac_delim ++program_transform_name!$program_transform_name$ac_delim ++bindir!$bindir$ac_delim ++sbindir!$sbindir$ac_delim ++libexecdir!$libexecdir$ac_delim ++datarootdir!$datarootdir$ac_delim ++datadir!$datadir$ac_delim ++sysconfdir!$sysconfdir$ac_delim ++sharedstatedir!$sharedstatedir$ac_delim ++localstatedir!$localstatedir$ac_delim ++includedir!$includedir$ac_delim ++oldincludedir!$oldincludedir$ac_delim ++docdir!$docdir$ac_delim ++infodir!$infodir$ac_delim ++htmldir!$htmldir$ac_delim ++dvidir!$dvidir$ac_delim ++pdfdir!$pdfdir$ac_delim ++psdir!$psdir$ac_delim ++libdir!$libdir$ac_delim ++localedir!$localedir$ac_delim ++mandir!$mandir$ac_delim ++DEFS!$DEFS$ac_delim ++ECHO_C!$ECHO_C$ac_delim ++ECHO_N!$ECHO_N$ac_delim ++ECHO_T!$ECHO_T$ac_delim ++LIBS!$LIBS$ac_delim ++build_alias!$build_alias$ac_delim ++host_alias!$host_alias$ac_delim ++target_alias!$target_alias$ac_delim ++INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim ++INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim ++INSTALL_DATA!$INSTALL_DATA$ac_delim ++build!$build$ac_delim ++build_cpu!$build_cpu$ac_delim ++build_vendor!$build_vendor$ac_delim ++build_os!$build_os$ac_delim ++host!$host$ac_delim ++host_cpu!$host_cpu$ac_delim ++host_vendor!$host_vendor$ac_delim ++host_os!$host_os$ac_delim ++target!$target$ac_delim ++target_cpu!$target_cpu$ac_delim ++target_vendor!$target_vendor$ac_delim ++target_os!$target_os$ac_delim ++target_noncanonical!$target_noncanonical$ac_delim ++LN_S!$LN_S$ac_delim ++x_ada_cflags!$x_ada_cflags$ac_delim ++default_gnattools_target!$default_gnattools_target$ac_delim ++TOOLS_TARGET_PAIRS!$TOOLS_TARGET_PAIRS$ac_delim ++LIBOBJS!$LIBOBJS$ac_delim ++LTLIBOBJS!$LTLIBOBJS$ac_delim ++_ACEOF ++ ++ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 59; then ++ break ++ elif $ac_last_try; then ++ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 ++echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} ++ { (exit 1); exit 1; }; } ++ else ++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " ++ fi ++done ++ ++ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` ++if test -n "$ac_eof"; then ++ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ++ ac_eof=`expr $ac_eof + 1` ++fi ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end ++_ACEOF ++sed ' ++s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g ++s/^/s,@/; s/!/@,|#_!!_#|/ ++:n ++t n ++s/'"$ac_delim"'$/,g/; t ++s/$/\\/; p ++N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ++' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF ++:end ++s/|#_!!_#|//g ++CEOF$ac_eof ++_ACEOF ++ ++ ++# VPATH may cause trouble with some makes, so we remove $(srcdir), ++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++# trailing colons and then remove the whole line if VPATH becomes empty ++# (actually we leave an empty line to preserve line numbers). ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++s/:*\$(srcdir):*/:/ ++s/:*\${srcdir}:*/:/ ++s/:*@srcdir@:*/:/ ++s/^\([^=]*=[ ]*\):*/\1/ ++s/:*$// ++s/^[^=]*=[ ]*$// ++}' ++fi ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++fi # test -n "$CONFIG_FILES" ++ ++ ++for ac_tag in :F $CONFIG_FILES ++do ++ case $ac_tag in ++ :[FHLC]) ac_mode=$ac_tag; continue;; ++ esac ++ case $ac_mode$ac_tag in ++ :[FHL]*:*);; ++ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 ++echo "$as_me: error: Invalid tag $ac_tag." >&2;} ++ { (exit 1); exit 1; }; };; ++ :[FH]-) ac_tag=-:-;; ++ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; ++ esac ++ ac_save_IFS=$IFS ++ IFS=: ++ set x $ac_tag ++ IFS=$ac_save_IFS ++ shift ++ ac_file=$1 ++ shift ++ ++ case $ac_mode in ++ :L) ac_source=$1;; ++ :[FH]) ++ ac_file_inputs= ++ for ac_f ++ do ++ case $ac_f in ++ -) ac_f="$tmp/stdin";; ++ *) # Look for the file first in the build tree, then in the source tree ++ # (if the path is not absolute). The absolute path cannot be DOS-style, ++ # because $ac_f cannot contain `:'. ++ test -f "$ac_f" || ++ case $ac_f in ++ [\\/$]*) false;; ++ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; ++ esac || ++ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 ++echo "$as_me: error: cannot find input file: $ac_f" >&2;} ++ { (exit 1); exit 1; }; };; ++ esac ++ ac_file_inputs="$ac_file_inputs $ac_f" ++ done ++ ++ # Let's still pretend it is `configure' which instantiates (i.e., don't ++ # use $as_me), people would be surprised to read: ++ # /* config.h. Generated by config.status. */ ++ configure_input="Generated from "`IFS=: ++ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." ++ if test x"$ac_file" != x-; then ++ configure_input="$ac_file. $configure_input" ++ { echo "$as_me:$LINENO: creating $ac_file" >&5 ++echo "$as_me: creating $ac_file" >&6;} ++ fi ++ ++ case $ac_tag in ++ *:-:* | *:-) cat >"$tmp/stdin";; ++ esac ++ ;; ++ esac ++ ++ ac_dir=`$as_dirname -- "$ac_file" || ++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$ac_file" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ { as_dir="$ac_dir" ++ case $as_dir in #( ++ -*) as_dir=./$as_dir;; ++ esac ++ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { ++ as_dirs= ++ while :; do ++ case $as_dir in #( ++ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( ++ *) as_qdir=$as_dir;; ++ esac ++ as_dirs="'$as_qdir' $as_dirs" ++ as_dir=`$as_dirname -- "$as_dir" || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)[^/].*/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\/\)$/{ ++ s//\1/ ++ q ++ } ++ /^X\(\/\).*/{ ++ s//\1/ ++ q ++ } ++ s/.*/./; q'` ++ test -d "$as_dir" && break ++ done ++ test -z "$as_dirs" || eval "mkdir $as_dirs" ++ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 ++echo "$as_me: error: cannot create directory $as_dir" >&2;} ++ { (exit 1); exit 1; }; }; } ++ ac_builddir=. ++ ++case "$ac_dir" in ++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; ++*) ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A ".." for each directory in $ac_dir_suffix. ++ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` ++ case $ac_top_builddir_sub in ++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; ++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; ++ esac ;; ++esac ++ac_abs_top_builddir=$ac_pwd ++ac_abs_builddir=$ac_pwd$ac_dir_suffix ++# for backward compatibility: ++ac_top_builddir=$ac_top_build_prefix ++ ++case $srcdir in ++ .) # We are building in place. ++ ac_srcdir=. ++ ac_top_srcdir=$ac_top_builddir_sub ++ ac_abs_top_srcdir=$ac_pwd ;; ++ [\\/]* | ?:[\\/]* ) # Absolute name. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ++ ac_abs_top_srcdir=$srcdir ;; ++ *) # Relative name. ++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_build_prefix$srcdir ++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; ++esac ++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix ++ ++ ++ case $ac_mode in ++ :F) ++ # ++ # CONFIG_FILE ++ # ++ ++ case $INSTALL in ++ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; ++ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; ++ esac ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++# If the template does not know about datarootdir, expand it. ++# FIXME: This hack should be removed a few years after 2.60. ++ac_datarootdir_hack=; ac_datarootdir_seen= ++ ++case `sed -n '/datarootdir/ { ++ p ++ q ++} ++/@datadir@/p ++/@docdir@/p ++/@infodir@/p ++/@localedir@/p ++/@mandir@/p ++' $ac_file_inputs` in ++*datarootdir*) ac_datarootdir_seen=yes;; ++*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) ++ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 ++echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++ ac_datarootdir_hack=' ++ s&@datadir@&$datadir&g ++ s&@docdir@&$docdir&g ++ s&@infodir@&$infodir&g ++ s&@localedir@&$localedir&g ++ s&@mandir@&$mandir&g ++ s&\\\${datarootdir}&$datarootdir&g' ;; ++esac ++_ACEOF ++ ++# Neutralize VPATH when `$srcdir' = `.'. ++# Shell code in configure.ac might set extrasub. ++# FIXME: do we really want to maintain this feature? ++cat >>$CONFIG_STATUS <<_ACEOF ++ sed "$ac_vpsub ++$extrasub ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++:t ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b ++s&@configure_input@&$configure_input&;t t ++s&@top_builddir@&$ac_top_builddir_sub&;t t ++s&@srcdir@&$ac_srcdir&;t t ++s&@abs_srcdir@&$ac_abs_srcdir&;t t ++s&@top_srcdir@&$ac_top_srcdir&;t t ++s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t ++s&@builddir@&$ac_builddir&;t t ++s&@abs_builddir@&$ac_abs_builddir&;t t ++s&@abs_top_builddir@&$ac_abs_top_builddir&;t t ++s&@INSTALL@&$ac_INSTALL&;t t ++$ac_datarootdir_hack ++" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out ++ ++test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && ++ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++which seems to be undefined. Please make sure it is defined." >&5 ++echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++which seems to be undefined. Please make sure it is defined." >&2;} ++ ++ rm -f "$tmp/stdin" ++ case $ac_file in ++ -) cat "$tmp/out"; rm -f "$tmp/out";; ++ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; ++ esac ++ ;; ++ ++ ++ ++ esac ++ ++done # for ac_tag ++ ++ ++{ (exit 0); exit 0; } ++_ACEOF ++chmod +x $CONFIG_STATUS ++ac_clean_files=$ac_clean_files_save ++ ++ ++# configure is writing to config.log, and then calls config.status. ++# config.status does its own redirection, appending to config.log. ++# Unfortunately, on DOS this fails, as config.log is still kept open ++# by configure, so config.status won't be able to write to it; its ++# output is simply discarded. So we exec the FD to /dev/null, ++# effectively closing config.log, so it can be properly (re)opened and ++# appended to by config.status. When coming back to configure, we ++# need to make the FD available again. ++if test "$no_create" != yes; then ++ ac_cs_success=: ++ ac_config_status_args= ++ test "$silent" = yes && ++ ac_config_status_args="$ac_config_status_args --quiet" ++ exec 5>/dev/null ++ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false ++ exec 5>>config.log ++ # Use ||, not &&, to avoid exiting from the if with $? = 1, which ++ # would make configure fail if this is the last instruction. ++ $ac_cs_success || { (exit 1); exit 1; } ++fi ++ +Index: libgnatprj/Makefile.in +=================================================================== +--- /dev/null ++++ libgnatprj/Makefile.in +@@ -0,0 +1,177 @@ ++# Makefile for libgnatprj. ++# Copyright (c) 2006 Ludovic Brenta ++# ++# This file 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++# Default target; must be first. ++all: libgnatprj ++ ++.SUFFIXES: ++ ++CPUS := $(shell getconf _NPROCESSORS_ONLN) ++LIB_VERSION := $(strip $(shell grep ' Library_Version :' \ ++ @srcdir@/../gcc/ada/gnatvsn.ads | \ ++ sed -e 's/.*"\(.*\)".*/\1/')) ++GCC:=../gcc/xgcc -B../gcc/ ++LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++LIBGNATVSN := -I../libgnatvsn ++CFLAGS := -g -O2 ++ADAFLAGS := -g -O2 -gnatn ++BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) ++DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) ++DATESTAMP := $(shell cat @srcdir@/../gcc/DATESTAMP) ++TOOLS_TARGET_PAIRS := @TOOLS_TARGET_PAIRS@ ++LN_S := @LN_S@ ++ ++ifneq (@build@,@host@) ++ CFLAGS += -b @host@ ++endif ++ ++.PHONY: libgnatprj install ++libgnatprj: libgnatprj.so.$(LIB_VERSION) libgnatprj.a ++ ++# Here we list one file per Ada unit: the body file if the unit has a ++# body, the spec file otherwise. ++PRJ_SOURCES := ali.adb ali-util.adb butil.adb binderr.adb errout.adb \ ++erroutc.adb errutil.adb err_vars.ads fname-uf.adb fmap.adb impunit.adb \ ++lib-util.adb makeutl.adb mlib.adb mlib-fil.adb mlib-tgt.adb \ ++mlib-tgt-specific.adb mlib-utl.adb osint.adb osint-c.adb prj.adb prj-attr.adb \ ++prj-attr-pm.adb prj-com.ads prj-dect.adb prj-env.adb prj-err.adb prj-ext.adb \ ++prj-nmsc.adb prj-pars.adb prj-part.adb prj-pp.adb prj-proc.adb prj-strt.adb \ ++prj-tree.adb prj-util.adb rident.ads scng.adb sfn_scan.adb sinfo-cn.adb \ ++sinput-c.adb sinput-p.adb style.ads styleg.adb styleg-c.adb stylesw.adb \ ++switch.adb switch-m.adb targparm.adb tempdir.adb ++ ++# Source files generated in build/gcc/ada, not src/gcc/ada. ++GENERATED_SOURCES := sdefault.adb ++ ++SOURCES := $(PRJ_SOURCES) $(GENERATED_SOURCES) ++ ++OBJECTS := $(patsubst %.ads,%.o,$(SOURCES:.adb=.o)) ++ ++# Add some object files compiled from C sources. prefix.o requires ++# some objects from libiberty. ++OBJECTS += concat.o link.o prefix.o xexit.o xmalloc.o xstrdup.o ++ ++vpath %.c @srcdir@/../gcc/ada ++ ++libgnatprj.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) ++ : # Make libgnatprj.so ++ $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ ++ -L../gcc/ada/rts -lgnat-$(LIB_VERSION) \ ++ -L../libgnatvsn -lgnatvsn ++ $(LN_S) -f libgnatprj.so.$(LIB_VERSION) libgnatprj.so ++ chmod a=r obj-shared/*.ali ++# Make the .ali files, but not the .o files, visible to the gnat tools. ++ cp -lp obj-shared/*.ali . ++ ++$(addprefix obj-shared/,$(OBJECTS)): | stamp-libgnatprj-sources obj-shared ++ ++obj-shared/%.o: %.adb ++ $(GCC) -c -fPIC $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-shared/%.o: %.ads ++ $(GCC) -c -fPIC $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-shared/%.o: %.c ++ $(GCC) -c -fPIC $(CFLAGS) -I@srcdir@/../gcc $< -o $@ ++ ++obj-shared/prefix.o: @srcdir@/../gcc/prefix.c ++ $(GCC) -c -fPIC $(CFLAGS) -DPREFIX=\"@prefix@\" -DBASEVER=\"$(BASEVER)\" \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I../gcc -I../libiberty \ ++ $< -o $@ ++ ++obj-shared/%.o: @srcdir@/../libiberty/%.c ++ $(GCC) -c -fPIC $(CFLAGS) \ ++ -I@srcdir@/../libiberty -I@srcdir@/../include $< -o $@ ++ ++obj-shared: ++ -mkdir $@ ++ ++libgnatprj.a: $(addprefix obj-static/,$(OBJECTS)) ++ : # Make libgnatprj.a ++ ar rc $@ $^ ++ ranlib $@ ++ ++$(addprefix obj-static/,$(OBJECTS)): | stamp-libgnatprj-sources obj-static ++ ++obj-static/%.o: %.adb ++ $(GCC) -c $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-static/%.o: %.ads ++ $(GCC) -c $(ADAFLAGS) $(LIBGNAT_JUST_BUILT) $(LIBGNATVSN) $< -o $@ ++ ++obj-static/%.o: %.c ++ $(GCC) -c $(CFLAGS) -I@srcdir@/../gcc $< -o $@ ++ ++obj-static/prefix.o: @srcdir@/../gcc/prefix.c ++ $(GCC) -c $(CFLAGS) -DPREFIX=\"@prefix@\" -DBASEVER=\"$(BASEVER)\" \ ++ -I@srcdir@/../gcc -I@srcdir@/../include -I../gcc -I../libiberty \ ++ $< -o $@ ++ ++obj-static/%.o: @srcdir@/../libiberty/%.c ++ $(GCC) -c -fPIC $(CFLAGS) \ ++ -I@srcdir@/../libiberty -I@srcdir@/../include $< -o $@ ++ ++obj-static: ++ -mkdir $@ ++ ++$(SOURCES): stamp-libgnatprj-sources ++ ++stamp-libgnatprj-sources: ++ for file in $(PRJ_SOURCES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f @srcdir@/../gcc/ada/$$file -a ! -L $$file ] ; then $(LN_S) @srcdir@/../gcc/ada/$$file .; fi; \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) @srcdir@/../gcc/ada/$$ads .; fi; \ ++ done ++ for file in $(GENERATED_SOURCES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f ../gcc/ada/$$file -a ! -L $$file ] ; then $(LN_S) ../gcc/ada/$$file .; fi; \ ++ if [ -f ../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) ../gcc/ada/$$ads .; \ ++ else \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then $(LN_S) @srcdir@/../gcc/ada/$$ads .; fi; \ ++ fi; \ ++ done ++ $(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ ++ rm -f $(word 1,$(subst <, ,$(PAIR)));\ ++ $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ ++ $(word 1,$(subst <, ,$(PAIR)));) ++ touch $@ ++ ++# Generate a list of source files (.ads and .adb) to install. Almost ++# all of them are in src/gcc/ada, but some are generated during build ++# and are in build/gcc/ada. ++BODIES := $(filter %.adb,$(PRJ_SOURCES)) ++SPECS := $(filter %.ads,$(PRJ_SOURCES)) $(patsubst %.adb,%.ads,$(BODIES)) ++SOURCES_TO_INSTALL := \ ++$(addprefix @srcdir@/../gcc/ada/,$(SPECS) $(BODIES)) \ ++$(addprefix ../gcc/ada/,$(GENERATED_SOURCES)) ++ ++install: libgnatprj ++ $(INSTALL_DATA) libgnatprj.a $(DESTDIR)$(prefix)/lib ++ $(INSTALL_DATA) libgnatprj.so.$(LIB_VERSION) $(DESTDIR)$(prefix)/lib ++ cd $(DESTDIR)$(prefix)/lib; \ ++ ln -sf libgnatprj.so.$(LIB_VERSION) libgnatprj.so ++ mkdir -p $(DESTDIR)$(prefix)/share/ada/adainclude/gnatprj ++ $(INSTALL_DATA) $(SOURCES_TO_INSTALL) \ ++ $(DESTDIR)$(prefix)/share/ada/adainclude/gnatprj ++ mkdir -p $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj ++ $(INSTALL) -m 0444 obj-shared/*.ali \ ++ $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj ++ chmod a=r $(DESTDIR)$(prefix)/lib/ada/adalib/gnatprj/*.ali ++ ++.PHONY: clean ++clean: ++ rm -rf *.ali obj-static obj-shared libgnatprj* *.adb *.ads stamp* +Index: Makefile.def +=================================================================== +--- Makefile.def.orig ++++ Makefile.def +@@ -130,6 +130,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++host_modules= { module= libgnatprj; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + host_modules= { module= gnattools; no_check=true; + missing= info; + missing= dvi; +@@ -175,6 +182,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++target_modules = { module= libgnatprj; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + target_modules = { module= libgomp; lib_path=.libs; }; + + // These are (some of) the make targets to be done in each subdirectory. +@@ -346,7 +360,10 @@ + + dependencies = { module=all-gnattools; on=all-libada; }; + dependencies = { module=all-gnattools; on=all-libgnatvsn; }; ++dependencies = { module=all-gnattools; on=all-libgnatprj; }; + dependencies = { module=all-libgnatvsn; on=all-libada; }; ++dependencies = { module=all-libgnatprj; on=all-libada; }; ++dependencies = { module=all-libgnatprj; on=all-libgnatvsn; }; + + dependencies = { module=configure-mpfr; on=all-gmp; }; + +Index: Makefile.in +=================================================================== +--- Makefile.in.orig ++++ Makefile.in +@@ -699,6 +699,7 @@ + maybe-configure-utils \ + maybe-configure-libada \ + maybe-configure-libgnatvsn \ ++ maybe-configure-libgnatprj \ + maybe-configure-gnattools + .PHONY: configure-target + configure-target: \ +@@ -723,6 +724,7 @@ + maybe-configure-target-rda \ + maybe-configure-target-libada \ + maybe-configure-target-libgnatvsn \ ++ maybe-configure-target-libgnatprj \ + maybe-configure-target-libgomp + + # The target built for a native non-bootstrap build. +@@ -852,6 +854,7 @@ + all-host: maybe-all-utils + all-host: maybe-all-libada + all-host: maybe-all-libgnatvsn ++all-host: maybe-all-libgnatprj + all-host: maybe-all-gnattools + + .PHONY: all-target +@@ -879,6 +882,7 @@ + all-target: maybe-all-target-rda + all-target: maybe-all-target-libada + all-target: maybe-all-target-libgnatvsn ++all-target: maybe-all-target-libgnatprj + all-target: maybe-all-target-libgomp + + # Do a target for all the subdirectories. A ``make do-X'' will do a +@@ -968,6 +972,7 @@ + info-host: maybe-info-utils + info-host: maybe-info-libada + info-host: maybe-info-libgnatvsn ++info-host: maybe-info-libgnatprj + info-host: maybe-info-gnattools + + .PHONY: info-target +@@ -993,6 +998,7 @@ + info-target: maybe-info-target-rda + info-target: maybe-info-target-libada + info-target: maybe-info-target-libgnatvsn ++info-target: maybe-info-target-libgnatprj + info-target: maybe-info-target-libgomp + + .PHONY: do-dvi +@@ -1077,6 +1083,7 @@ + dvi-host: maybe-dvi-utils + dvi-host: maybe-dvi-libada + dvi-host: maybe-dvi-libgnatvsn ++dvi-host: maybe-dvi-libgnatprj + dvi-host: maybe-dvi-gnattools + + .PHONY: dvi-target +@@ -1102,6 +1109,7 @@ + dvi-target: maybe-dvi-target-rda + dvi-target: maybe-dvi-target-libada + dvi-target: maybe-dvi-target-libgnatvsn ++dvi-target: maybe-dvi-target-libgnatprj + dvi-target: maybe-dvi-target-libgomp + + .PHONY: do-pdf +@@ -1186,6 +1194,7 @@ + pdf-host: maybe-pdf-utils + pdf-host: maybe-pdf-libada + pdf-host: maybe-pdf-libgnatvsn ++pdf-host: maybe-pdf-libgnatprj + pdf-host: maybe-pdf-gnattools + + .PHONY: pdf-target +@@ -1211,6 +1220,7 @@ + pdf-target: maybe-pdf-target-rda + pdf-target: maybe-pdf-target-libada + pdf-target: maybe-pdf-target-libgnatvsn ++pdf-target: maybe-pdf-target-libgnatprj + pdf-target: maybe-pdf-target-libgomp + + .PHONY: do-html +@@ -1295,6 +1305,7 @@ + html-host: maybe-html-utils + html-host: maybe-html-libada + html-host: maybe-html-libgnatvsn ++html-host: maybe-html-libgnatprj + html-host: maybe-html-gnattools + + .PHONY: html-target +@@ -1320,6 +1331,7 @@ + html-target: maybe-html-target-rda + html-target: maybe-html-target-libada + html-target: maybe-html-target-libgnatvsn ++html-target: maybe-html-target-libgnatprj + html-target: maybe-html-target-libgomp + + .PHONY: do-TAGS +@@ -1404,6 +1416,7 @@ + TAGS-host: maybe-TAGS-utils + TAGS-host: maybe-TAGS-libada + TAGS-host: maybe-TAGS-libgnatvsn ++TAGS-host: maybe-TAGS-libgnatprj + TAGS-host: maybe-TAGS-gnattools + + .PHONY: TAGS-target +@@ -1429,6 +1442,7 @@ + TAGS-target: maybe-TAGS-target-rda + TAGS-target: maybe-TAGS-target-libada + TAGS-target: maybe-TAGS-target-libgnatvsn ++TAGS-target: maybe-TAGS-target-libgnatprj + TAGS-target: maybe-TAGS-target-libgomp + + .PHONY: do-install-info +@@ -1513,6 +1527,7 @@ + install-info-host: maybe-install-info-utils + install-info-host: maybe-install-info-libada + install-info-host: maybe-install-info-libgnatvsn ++install-info-host: maybe-install-info-libgnatprj + install-info-host: maybe-install-info-gnattools + + .PHONY: install-info-target +@@ -1538,6 +1553,7 @@ + install-info-target: maybe-install-info-target-rda + install-info-target: maybe-install-info-target-libada + install-info-target: maybe-install-info-target-libgnatvsn ++install-info-target: maybe-install-info-target-libgnatprj + install-info-target: maybe-install-info-target-libgomp + + .PHONY: do-install-pdf +@@ -1622,6 +1638,7 @@ + install-pdf-host: maybe-install-pdf-utils + install-pdf-host: maybe-install-pdf-libada + install-pdf-host: maybe-install-pdf-libgnatvsn ++install-pdf-host: maybe-install-pdf-libgnatprj + install-pdf-host: maybe-install-pdf-gnattools + + .PHONY: install-pdf-target +@@ -1647,6 +1664,7 @@ + install-pdf-target: maybe-install-pdf-target-rda + install-pdf-target: maybe-install-pdf-target-libada + install-pdf-target: maybe-install-pdf-target-libgnatvsn ++install-pdf-target: maybe-install-pdf-target-libgnatprj + install-pdf-target: maybe-install-pdf-target-libgomp + + .PHONY: do-install-html +@@ -1731,6 +1749,7 @@ + install-html-host: maybe-install-html-utils + install-html-host: maybe-install-html-libada + install-html-host: maybe-install-html-libgnatvsn ++install-html-host: maybe-install-html-libgnatprj + install-html-host: maybe-install-html-gnattools + + .PHONY: install-html-target +@@ -1756,6 +1775,7 @@ + install-html-target: maybe-install-html-target-rda + install-html-target: maybe-install-html-target-libada + install-html-target: maybe-install-html-target-libgnatvsn ++install-html-target: maybe-install-html-target-libgnatprj + install-html-target: maybe-install-html-target-libgomp + + .PHONY: do-installcheck +@@ -1840,6 +1860,7 @@ + installcheck-host: maybe-installcheck-utils + installcheck-host: maybe-installcheck-libada + installcheck-host: maybe-installcheck-libgnatvsn ++installcheck-host: maybe-installcheck-libgnatprj + installcheck-host: maybe-installcheck-gnattools + + .PHONY: installcheck-target +@@ -1865,6 +1886,7 @@ + installcheck-target: maybe-installcheck-target-rda + installcheck-target: maybe-installcheck-target-libada + installcheck-target: maybe-installcheck-target-libgnatvsn ++installcheck-target: maybe-installcheck-target-libgnatprj + installcheck-target: maybe-installcheck-target-libgomp + + .PHONY: do-mostlyclean +@@ -1949,6 +1971,7 @@ + mostlyclean-host: maybe-mostlyclean-utils + mostlyclean-host: maybe-mostlyclean-libada + mostlyclean-host: maybe-mostlyclean-libgnatvsn ++mostlyclean-host: maybe-mostlyclean-libgnatprj + mostlyclean-host: maybe-mostlyclean-gnattools + + .PHONY: mostlyclean-target +@@ -1974,6 +1997,7 @@ + mostlyclean-target: maybe-mostlyclean-target-rda + mostlyclean-target: maybe-mostlyclean-target-libada + mostlyclean-target: maybe-mostlyclean-target-libgnatvsn ++mostlyclean-target: maybe-mostlyclean-target-libgnatprj + mostlyclean-target: maybe-mostlyclean-target-libgomp + + .PHONY: do-clean +@@ -2058,6 +2082,7 @@ + clean-host: maybe-clean-utils + clean-host: maybe-clean-libada + clean-host: maybe-clean-libgnatvsn ++clean-host: maybe-clean-libgnatprj + clean-host: maybe-clean-gnattools + + .PHONY: clean-target +@@ -2083,6 +2108,7 @@ + clean-target: maybe-clean-target-rda + clean-target: maybe-clean-target-libada + clean-target: maybe-clean-target-libgnatvsn ++clean-target: maybe-clean-target-libgnatprj + clean-target: maybe-clean-target-libgomp + + .PHONY: do-distclean +@@ -2167,6 +2193,7 @@ + distclean-host: maybe-distclean-utils + distclean-host: maybe-distclean-libada + distclean-host: maybe-distclean-libgnatvsn ++distclean-host: maybe-distclean-libgnatprj + distclean-host: maybe-distclean-gnattools + + .PHONY: distclean-target +@@ -2192,6 +2219,7 @@ + distclean-target: maybe-distclean-target-rda + distclean-target: maybe-distclean-target-libada + distclean-target: maybe-distclean-target-libgnatvsn ++distclean-target: maybe-distclean-target-libgnatprj + distclean-target: maybe-distclean-target-libgomp + + .PHONY: do-maintainer-clean +@@ -2276,6 +2304,7 @@ + maintainer-clean-host: maybe-maintainer-clean-utils + maintainer-clean-host: maybe-maintainer-clean-libada + maintainer-clean-host: maybe-maintainer-clean-libgnatvsn ++maintainer-clean-host: maybe-maintainer-clean-libgnatprj + maintainer-clean-host: maybe-maintainer-clean-gnattools + + .PHONY: maintainer-clean-target +@@ -2301,6 +2330,7 @@ + maintainer-clean-target: maybe-maintainer-clean-target-rda + maintainer-clean-target: maybe-maintainer-clean-target-libada + maintainer-clean-target: maybe-maintainer-clean-target-libgnatvsn ++maintainer-clean-target: maybe-maintainer-clean-target-libgnatprj + maintainer-clean-target: maybe-maintainer-clean-target-libgomp + + +@@ -2439,6 +2469,7 @@ + maybe-check-utils \ + maybe-check-libada \ + maybe-check-libgnatvsn \ ++ maybe-check-libgnatprj \ + maybe-check-gnattools + + .PHONY: check-target +@@ -2464,6 +2495,7 @@ + maybe-check-target-rda \ + maybe-check-target-libada \ + maybe-check-target-libgnatvsn \ ++ maybe-check-target-libgnatprj \ + maybe-check-target-libgomp + + do-check: +@@ -2574,6 +2606,7 @@ + maybe-install-utils \ + maybe-install-libada \ + maybe-install-libgnatvsn \ ++ maybe-install-libgnatprj \ + maybe-install-gnattools + + .PHONY: install-host +@@ -2649,6 +2682,7 @@ + maybe-install-utils \ + maybe-install-libada \ + maybe-install-libgnatvsn \ ++ maybe-install-libgnatprj \ + maybe-install-gnattools + + .PHONY: install-target +@@ -2674,6 +2708,7 @@ + maybe-install-target-rda \ + maybe-install-target-libada \ + maybe-install-target-libgnatvsn \ ++ maybe-install-target-libgnatprj \ + maybe-install-target-libgomp + + uninstall: +@@ -39562,6 +39597,327 @@ + + + ++.PHONY: configure-libgnatprj maybe-configure-libgnatprj ++maybe-configure-libgnatprj: ++@if gcc-bootstrap ++configure-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if libgnatprj ++maybe-configure-libgnatprj: configure-libgnatprj ++configure-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/libgnatprj/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libgnatprj ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/libgnatprj; \ ++ cd "$(HOST_SUBDIR)/libgnatprj" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/libgnatprj/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatprj"; \ ++ libsrcdir="$$s/libgnatprj"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif libgnatprj ++ ++ ++ ++ ++ ++.PHONY: all-libgnatprj maybe-all-libgnatprj ++maybe-all-libgnatprj: ++@if gcc-bootstrap ++all-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if libgnatprj ++TARGET-libgnatprj=all ++maybe-all-libgnatprj: all-libgnatprj ++all-libgnatprj: configure-libgnatprj ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(FLAGS_TO_PASS) $(TARGET-libgnatprj)) ++@endif libgnatprj ++ ++ ++ ++ ++.PHONY: check-libgnatprj maybe-check-libgnatprj ++maybe-check-libgnatprj: ++@if libgnatprj ++maybe-check-libgnatprj: check-libgnatprj ++ ++check-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: install-libgnatprj maybe-install-libgnatprj ++maybe-install-libgnatprj: ++@if libgnatprj ++maybe-install-libgnatprj: install-libgnatprj ++ ++install-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(FLAGS_TO_PASS) install) ++ ++@endif libgnatprj ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-libgnatprj info-libgnatprj ++maybe-info-libgnatprj: ++@if libgnatprj ++maybe-info-libgnatprj: info-libgnatprj ++ ++# libgnatprj doesn't support info. ++info-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-dvi-libgnatprj dvi-libgnatprj ++maybe-dvi-libgnatprj: ++@if libgnatprj ++maybe-dvi-libgnatprj: dvi-libgnatprj ++ ++# libgnatprj doesn't support dvi. ++dvi-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-pdf-libgnatprj pdf-libgnatprj ++maybe-pdf-libgnatprj: ++@if libgnatprj ++maybe-pdf-libgnatprj: pdf-libgnatprj ++ ++pdf-libgnatprj: \ ++ configure-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-html-libgnatprj html-libgnatprj ++maybe-html-libgnatprj: ++@if libgnatprj ++maybe-html-libgnatprj: html-libgnatprj ++ ++# libgnatprj doesn't support html. ++html-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-TAGS-libgnatprj TAGS-libgnatprj ++maybe-TAGS-libgnatprj: ++@if libgnatprj ++maybe-TAGS-libgnatprj: TAGS-libgnatprj ++ ++# libgnatprj doesn't support TAGS. ++TAGS-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-info-libgnatprj install-info-libgnatprj ++maybe-install-info-libgnatprj: ++@if libgnatprj ++maybe-install-info-libgnatprj: install-info-libgnatprj ++ ++# libgnatprj doesn't support install-info. ++install-info-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-pdf-libgnatprj install-pdf-libgnatprj ++maybe-install-pdf-libgnatprj: ++@if libgnatprj ++maybe-install-pdf-libgnatprj: install-pdf-libgnatprj ++ ++install-pdf-libgnatprj: \ ++ configure-libgnatprj \ ++ pdf-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-install-html-libgnatprj install-html-libgnatprj ++maybe-install-html-libgnatprj: ++@if libgnatprj ++maybe-install-html-libgnatprj: install-html-libgnatprj ++ ++install-html-libgnatprj: \ ++ configure-libgnatprj \ ++ html-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-installcheck-libgnatprj installcheck-libgnatprj ++maybe-installcheck-libgnatprj: ++@if libgnatprj ++maybe-installcheck-libgnatprj: installcheck-libgnatprj ++ ++# libgnatprj doesn't support installcheck. ++installcheck-libgnatprj: ++ ++@endif libgnatprj ++ ++.PHONY: maybe-mostlyclean-libgnatprj mostlyclean-libgnatprj ++maybe-mostlyclean-libgnatprj: ++@if libgnatprj ++maybe-mostlyclean-libgnatprj: mostlyclean-libgnatprj ++ ++mostlyclean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-clean-libgnatprj clean-libgnatprj ++maybe-clean-libgnatprj: ++@if libgnatprj ++maybe-clean-libgnatprj: clean-libgnatprj ++ ++clean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-distclean-libgnatprj distclean-libgnatprj ++maybe-distclean-libgnatprj: ++@if libgnatprj ++maybe-distclean-libgnatprj: distclean-libgnatprj ++ ++distclean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++.PHONY: maybe-maintainer-clean-libgnatprj maintainer-clean-libgnatprj ++maybe-maintainer-clean-libgnatprj: ++@if libgnatprj ++maybe-maintainer-clean-libgnatprj: maintainer-clean-libgnatprj ++ ++maintainer-clean-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatprj/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in libgnatprj" ; \ ++ (cd $(HOST_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif libgnatprj ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -49480,6 +49836,345 @@ + + + ++.PHONY: configure-target-libgnatprj maybe-configure-target-libgnatprj ++maybe-configure-target-libgnatprj: ++@if gcc-bootstrap ++configure-target-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if target-libgnatprj ++maybe-configure-target-libgnatprj: configure-target-libgnatprj ++configure-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ echo "Checking multilib configuration for libgnatprj..."; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatprj ; \ ++ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libgnatprj/multilib.tmp 2> /dev/null ; \ ++ if test -r $(TARGET_SUBDIR)/libgnatprj/multilib.out; then \ ++ if cmp -s $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; then \ ++ rm -f $(TARGET_SUBDIR)/libgnatprj/multilib.tmp; \ ++ else \ ++ rm -f $(TARGET_SUBDIR)/libgnatprj/Makefile; \ ++ mv $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; \ ++ fi; \ ++ else \ ++ mv $(TARGET_SUBDIR)/libgnatprj/multilib.tmp $(TARGET_SUBDIR)/libgnatprj/multilib.out; \ ++ fi; \ ++ test ! -f $(TARGET_SUBDIR)/libgnatprj/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatprj ; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo Configuring in $(TARGET_SUBDIR)/libgnatprj; \ ++ cd "$(TARGET_SUBDIR)/libgnatprj" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(TARGET_SUBDIR)/libgnatprj/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatprj"; \ ++ libsrcdir="$$s/libgnatprj"; \ ++ rm -f no-such-file || : ; \ ++ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ ++ $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif target-libgnatprj ++ ++ ++ ++ ++ ++.PHONY: all-target-libgnatprj maybe-all-target-libgnatprj ++maybe-all-target-libgnatprj: ++@if gcc-bootstrap ++all-target-libgnatprj: stage_current ++@endif gcc-bootstrap ++@if target-libgnatprj ++TARGET-target-libgnatprj=all ++maybe-all-target-libgnatprj: all-target-libgnatprj ++all-target-libgnatprj: configure-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) $(TARGET-target-libgnatprj)) ++@endif target-libgnatprj ++ ++ ++ ++ ++ ++.PHONY: check-target-libgnatprj maybe-check-target-libgnatprj ++maybe-check-target-libgnatprj: ++@if target-libgnatprj ++maybe-check-target-libgnatprj: check-target-libgnatprj ++ ++# Dummy target for uncheckable module. ++check-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: install-target-libgnatprj maybe-install-target-libgnatprj ++maybe-install-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-target-libgnatprj: install-target-libgnatprj ++ ++install-target-libgnatprj: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ ++@endif target-libgnatprj ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-target-libgnatprj info-target-libgnatprj ++maybe-info-target-libgnatprj: ++@if target-libgnatprj ++maybe-info-target-libgnatprj: info-target-libgnatprj ++ ++# libgnatprj doesn't support info. ++info-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-dvi-target-libgnatprj dvi-target-libgnatprj ++maybe-dvi-target-libgnatprj: ++@if target-libgnatprj ++maybe-dvi-target-libgnatprj: dvi-target-libgnatprj ++ ++# libgnatprj doesn't support dvi. ++dvi-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-pdf-target-libgnatprj pdf-target-libgnatprj ++maybe-pdf-target-libgnatprj: ++@if target-libgnatprj ++maybe-pdf-target-libgnatprj: pdf-target-libgnatprj ++ ++pdf-target-libgnatprj: \ ++ configure-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing pdf in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-html-target-libgnatprj html-target-libgnatprj ++maybe-html-target-libgnatprj: ++@if target-libgnatprj ++maybe-html-target-libgnatprj: html-target-libgnatprj ++ ++# libgnatprj doesn't support html. ++html-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-TAGS-target-libgnatprj TAGS-target-libgnatprj ++maybe-TAGS-target-libgnatprj: ++@if target-libgnatprj ++maybe-TAGS-target-libgnatprj: TAGS-target-libgnatprj ++ ++# libgnatprj doesn't support TAGS. ++TAGS-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-info-target-libgnatprj install-info-target-libgnatprj ++maybe-install-info-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-info-target-libgnatprj: install-info-target-libgnatprj ++ ++# libgnatprj doesn't support install-info. ++install-info-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-pdf-target-libgnatprj install-pdf-target-libgnatprj ++maybe-install-pdf-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-pdf-target-libgnatprj: install-pdf-target-libgnatprj ++ ++install-pdf-target-libgnatprj: \ ++ configure-target-libgnatprj \ ++ pdf-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-pdf in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-install-html-target-libgnatprj install-html-target-libgnatprj ++maybe-install-html-target-libgnatprj: ++@if target-libgnatprj ++maybe-install-html-target-libgnatprj: install-html-target-libgnatprj ++ ++install-html-target-libgnatprj: \ ++ configure-target-libgnatprj \ ++ html-target-libgnatprj ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-html in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-installcheck-target-libgnatprj installcheck-target-libgnatprj ++maybe-installcheck-target-libgnatprj: ++@if target-libgnatprj ++maybe-installcheck-target-libgnatprj: installcheck-target-libgnatprj ++ ++# libgnatprj doesn't support installcheck. ++installcheck-target-libgnatprj: ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-mostlyclean-target-libgnatprj mostlyclean-target-libgnatprj ++maybe-mostlyclean-target-libgnatprj: ++@if target-libgnatprj ++maybe-mostlyclean-target-libgnatprj: mostlyclean-target-libgnatprj ++ ++mostlyclean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing mostlyclean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-clean-target-libgnatprj clean-target-libgnatprj ++maybe-clean-target-libgnatprj: ++@if target-libgnatprj ++maybe-clean-target-libgnatprj: clean-target-libgnatprj ++ ++clean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing clean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-distclean-target-libgnatprj distclean-target-libgnatprj ++maybe-distclean-target-libgnatprj: ++@if target-libgnatprj ++maybe-distclean-target-libgnatprj: distclean-target-libgnatprj ++ ++distclean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing distclean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++.PHONY: maybe-maintainer-clean-target-libgnatprj maintainer-clean-target-libgnatprj ++maybe-maintainer-clean-target-libgnatprj: ++@if target-libgnatprj ++maybe-maintainer-clean-target-libgnatprj: maintainer-clean-target-libgnatprj ++ ++maintainer-clean-target-libgnatprj: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatprj/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libgnatprj" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatprj && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif target-libgnatprj ++ ++ ++ ++ ++ + .PHONY: configure-target-libgomp maybe-configure-target-libgomp + maybe-configure-target-libgomp: + @if gcc-bootstrap +@@ -52030,6 +52725,7 @@ + configure-target-rda: stage_last + configure-target-libada: stage_last + configure-target-libgnatvsn: stage_last ++configure-target-libgnatprj: stage_last + configure-target-libgomp: stage_last + @endif gcc-bootstrap + +@@ -52055,6 +52751,7 @@ + configure-target-rda: maybe-all-gcc + configure-target-libada: maybe-all-gcc + configure-target-libgnatvsn: maybe-all-gcc ++configure-target-libgnatprj: maybe-all-gcc + configure-target-libgomp: maybe-all-gcc + @endif gcc-no-bootstrap + +@@ -52310,7 +53007,10 @@ + all-fixincludes: maybe-all-libiberty + all-gnattools: maybe-all-libada + all-gnattools: maybe-all-libgnatvsn ++all-gnattools: maybe-all-libgnatprj + all-libgnatvsn: maybe-all-libada ++all-libgnatprj: maybe-all-libada ++all-libgnatprj: maybe-all-libgnatvsn + configure-mpfr: maybe-all-gmp + + configure-stage1-mpfr: maybe-all-stage1-gmp +@@ -52749,6 +53449,7 @@ + configure-target-rda: maybe-all-target-libgcc + configure-target-libada: maybe-all-target-libgcc + configure-target-libgnatvsn: maybe-all-target-libgcc ++configure-target-libgnatprj: maybe-all-target-libgcc + configure-target-libgomp: maybe-all-target-libgcc + @endif gcc-no-bootstrap + +@@ -52793,6 +53494,8 @@ + + configure-target-libgnatvsn: maybe-all-target-newlib maybe-all-target-libgloss + ++configure-target-libgnatprj: maybe-all-target-newlib maybe-all-target-libgloss ++ + configure-target-libgomp: maybe-all-target-newlib maybe-all-target-libgloss + + +Index: configure.ac +=================================================================== +--- configure.ac.orig ++++ configure.ac +@@ -155,7 +155,7 @@ + + # these libraries are used by various programs built for the host environment + # +-host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl libgui zlib libcpp libdecnumber gmp mpfr libada libgnatvsn" ++host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl libgui zlib libcpp libdecnumber gmp mpfr libada libgnatvsn libgnatprj" + + # these tools are built for the host environment + # Note, the powerpc-eabi build depends on sim occurring before gdb in order to +@@ -186,7 +186,8 @@ + ${libgcj} \ + target-libobjc \ + target-libada \ +- target-libgnatvsn" ++ target-libgnatvsn \ ++ target-libgnatprj" + + # these tools are built using the target libraries, and are intended to + # run only in the target environment +@@ -264,7 +265,7 @@ + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +-cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn" ++cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn target-libgnatprj" + + case $is_cross_compiler in + no) skipdirs="${skipdirs} ${cross_only}" ;; +@@ -341,7 +342,7 @@ + ENABLE_LIBADA=$enableval, + ENABLE_LIBADA=yes) + if test "${ENABLE_LIBADA}" != "yes" ; then +- noconfigdirs="$noconfigdirs libgnatvsn gnattools" ++ noconfigdirs="$noconfigdirs libgnatvsn libgnatprj gnattools" + fi + + AC_ARG_ENABLE(libssp, +Index: libgnatprj/configure.ac +=================================================================== +--- /dev/null ++++ libgnatprj/configure.ac +@@ -0,0 +1,144 @@ ++# Configure script for libada. ++# Copyright 2003, 2004 Free Software Foundation, Inc. ++# ++# This file 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. ++ ++AC_INIT ++AC_PREREQ([2.59]) ++ ++AC_CONFIG_SRCDIR([Makefile.in]) ++ ++# Start of actual configure tests ++ ++AC_PROG_INSTALL ++ ++AC_CANONICAL_BUILD ++AC_CANONICAL_HOST ++AC_CANONICAL_TARGET ++ ++sinclude(../config/acx.m4) ++ACX_NONCANONICAL_TARGET ++ ++# Need to pass this down for now :-P ++AC_PROG_LN_S ++ ++# Determine x_ada_cflags ++case $host in ++ hppa*) x_ada_cflags=-mdisable-indexing ;; ++ *) x_ada_cflags= ;; ++esac ++AC_SUBST([x_ada_cflags]) ++ ++# Determine what to build for 'gnattools' ++if test $build = $target ; then ++ # Note that build=target is almost certainly the wrong test; FIXME ++ default_gnattools_target="gnattools-native" ++else ++ default_gnattools_target="gnattools-cross" ++fi ++AC_SUBST([default_gnattools_target]) ++ ++# Target-specific stuff (defaults) ++TOOLS_TARGET_PAIRS= ++AC_SUBST(TOOLS_TARGET_PAIRS) ++ ++# Per-target case statement ++# ------------------------- ++case "${target}" in ++ alpha*-dec-vx*) # Unlike all other Vxworks ++ ;; ++ m68k*-wrs-vx* \ ++ | powerpc*-wrs-vxworks \ ++ | sparc*-wrs-vx* \ ++ | *86-wrs-vxworks \ ++ | xscale*-wrs-vx* \ ++ | xscale*-wrs-coff \ ++ | mips*-wrs-vx*) ++ TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir} && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/ada/config-lang.in +=================================================================== +--- gcc/ada/config-lang.in.orig ++++ gcc/ada/config-lang.in +@@ -34,8 +34,8 @@ + + outputs=ada/Makefile + +-target_libs="target-libada" +-lang_dirs="libada gnattools" ++target_libs="target-libada target-libgnatvsn" ++lang_dirs="libada libgnatvsn gnattools" + + # Ada will not work until the front end starts emitting GIMPLE trees. + build_by_default=no +Index: gnattools/Makefile.in +=================================================================== +--- gnattools/Makefile.in.orig ++++ gnattools/Makefile.in +@@ -37,10 +35,11 @@ + CFLAGS=-O2 -Wall + INCLUDES = -I@srcdir@/../gcc/ada -I@srcdir@/../gcc + ADA_CFLAGS=-O2 -gnatn +-ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I@srcdir@/../gcc/ada ++ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I../libgnatvsn + LIB_VERSION=$(strip $(shell grep ' Library_Version :' \ +- @srcdir@/../gcc/ada/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) ++ ../libgnatvsn/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) + ADA_LIBS := -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ADA_LIBS += -L../libgnatvsn -lgnatvsn + + # We will use the just-built compiler to compile and link everything. + GCC=../gcc/xgcc -B../gcc/ +@@ -66,62 +65,34 @@ + # Since we don't have gnatmake, we must specify the full list of + # object files necessary to build gnatmake and gnatlink. + # TODO: remove from these lists the objects that are part of +-# libgnatvsn and libgnatprj. ++# libgnatprj. + GNATLINK_OBJS = \ + ali.o \ +-alloc.o \ + butil.o \ +-casing.o \ +-csets.o \ +-debug.o \ + fmap.o \ +-fname.o \ + gnatlink.o \ +-gnatvsn.o \ +-hostparm.o \ + indepsw.o \ +-namet.o \ +-opt.o \ + osint.o \ +-output.o \ + prefix.o \ + rident.o \ + sdefault.o \ +-snames.o \ + stylesw.o \ + switch.o \ +-table.o \ + targparm.o \ +-tree_io.o \ +-types.o \ +-validsw.o \ +-version.o \ +-widechar.o ++validsw.o + + GNATMAKE_OBJS = \ + ali-util.o \ + ali.o \ +-alloc.o \ +-atree.o \ + binderr.o \ + butil.o \ +-casing.o \ +-csets.o \ +-debug.o \ +-einfo.o\ +-elists.o \ + err_vars.o \ + erroutc.o \ + errutil.o \ + fmap.o \ + fname-sf.o \ + fname-uf.o \ +-fname.o \ + gnatmake.o \ +-gnatvsn.o \ +-hostparm.o \ +-krunch.o \ +-lib.o \ + make.o \ + makeusg.o \ + makeutl.o \ +@@ -131,12 +102,8 @@ + mlib-tgt-specific.o \ + mlib-utl.o \ + mlib.o \ +-namet.o \ +-nlists.o \ +-opt.o \ + osint-m.o \ + osint.o \ +-output.o \ + prefix.o \ + prj-attr-pm.o \ + prj-attr.o \ +@@ -154,47 +121,59 @@ + prj-util.o \ + prj.o \ + rident.o \ +-scans.o \ + scng.o \ + sdefault.o \ + sfn_scan.o \ +-sinfo.o \ + sinput-c.o \ + sinput-p.o \ +-sinput.o \ +-snames.o \ +-stand.o \ +-stringt.o \ + styleg.o \ + stylesw.o \ + switch-m.o \ + switch.o \ +-table.o \ + targparm.o \ + tempdir.o \ +-tree_io.o \ +-types.o \ +-uintp.o \ +-uname.o \ +-urealp.o \ + usage.o \ + validsw.o \ +-version.o \ +-widechar.o \ + $(EXTRA_GNATMAKE_OBJS) + ++ ++EXTRA_TOOLS_OBJS = \ ++bcheck.o \ ++binde.o \ ++bindgen.o \ ++bindusg.o \ ++clean.o \ ++gprep.o \ ++makegpr.o \ ++osint-b.o \ ++osint-l.o \ ++prep.o \ ++prj-makr.o \ ++prj-pp.o \ ++switch-b.o \ ++vms_conv.o \ ++vms_data.o \ ++xr_tabls.o \ ++xref_lib.o ++ ++OBJECTS = $(GNATLINK_OBJS) $(GNATMAKE_OBJS) $(EXTRA_TOOLS_OBJS) ++ + # Makefile targets + # ---------------- + + .PHONY: gnattools gnattools-native gnattools-cross regnattools + gnattools: @default_gnattools_target@ + +-# Build directory for the tools. Let's copy the target-dependent +-# sources using the same mechanism as for gnatlib. The other sources are +-# accessed using the vpath directive. ++BODIES := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.adb,$(f)))) ++SPECS := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.ads,$(f)))) ++ ++$(notdir $(SPECS) $(BODIES)): stamp-gnattools-sources + + stamp-gnattools-sources: +- $(LN_S) ../gcc/ada/sdefault.adb . ++ for file in $(BODIES) $(SPECS); do \ ++ $(LN_S) -f $$file .; \ ++ done ++ rm -f sdefault.adb; $(LN_S) ../gcc/ada/sdefault.adb . + $(foreach PAIR,$(TOOLS_TARGET_PAIRS), \ + rm -f $(word 1,$(subst <, ,$(PAIR)));\ + $(LN_S) @srcdir@/../gcc/ada/$(word 2,$(subst <, ,$(PAIR))) \ +@@ -202,6 +181,7 @@ + touch $@ + + gnattools-native: ../gcc/ada/rts/libgnat-$(LIB_VERSION).so ++gnattools-native: ../libgnatvsn/libgnatvsn.so + gnattools-native: stamp-gnattools-sources + gnattools-native: $(TOOLS) gnatbl + +@@ -209,18 +189,16 @@ + + vpath %.c @srcdir@/../gcc/ada:@srcdir@/../gcc + vpath %.h @srcdir@/../gcc/ada +-vpath %.adb .:@srcdir@/../gcc/ada +-vpath %.ads @srcdir@/../gcc/ada + + # Because the just-built gcc is a host tool like us, we can use some +-# of its object files, e.g. prefix.o and version.o. ++# of its object files, e.g. prefix.o. + vpath prefix.o ../gcc +-vpath version.o ../gcc + + # gnatlink + + gnatlink-static: $(GNATLINK_OBJS) b_gnatl.o link.o + $(GCC) -o $@ $^ \ ++ ../libgnatvsn/libgnatvsn.a \ + ../gcc/ada/rts/libgnat.a \ + ../libiberty/libiberty.a + +@@ -237,6 +215,7 @@ + + gnatmake-static: $(GNATMAKE_OBJS) b_gnatm.o link.o + $(GCC) -o $@ $(ADA_CFLAGS) $^ \ ++ ../libgnatvsn/libgnatvsn.a \ + ../gcc/ada/rts/libgnat.a \ + ../libiberty/libiberty.a + +@@ -250,7 +229,8 @@ + ../gcc/gnatbind -C -o $@ $(ADA_INCLUDES) gnatmake.ali + + # Other tools +-gnatkr: version.o ++gnatkr: ++ if [ ! -f $@.adb ] ; then $(LN_S) ../../src/gcc/ada/$@.ad[bs] .; fi + ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ + --GCC="$(GCC)" \ + --GNATBIND=../gcc/gnatbind +@@ -261,7 +241,8 @@ + cp -lp $< $@ + + gnatbind gnatchop gnatclean gnatcmd gnatfind gnatls gnatname gnatprep gnatxref gprmake: \ +-link.o version.o prefix.o ++link.o prefix.o ++ if [ ! -f $@.adb ] ; then $(LN_S) ../../src/gcc/ada/$@.ad[bs] .; fi + ./gnatmake-static -c -b $@ $(ADA_CFLAGS) $(ADA_INCLUDES) \ + --GCC="$(GCC)" \ + --GNATBIND=../gcc/gnatbind +@@ -269,7 +250,7 @@ + ../libiberty/libiberty.a \ + --GCC="$(GCC) $(ADA_INCLUDES)" + +-gnatbl: gnatbl.c link.o version.o prefix.o ++gnatbl: gnatbl.c link.o prefix.o + $(GCC) -o $@ $< $(CFLAGS) \ + -I../gcc -I@srcdir@/../gcc/config -I@srcdir@/../gcc \ + -I@srcdir@/../include \ +@@ -290,6 +271,8 @@ + %.o: %.c + $(GCC) -c -o $@ $< $(CFLAGS) $(INCLUDES) + ++prefix.o: ++ + # Other + # ----- + +@@ -325,13 +308,15 @@ + install-html: + + # Cleaning rules. ++.PHONY: mostlyclean clean distclean ++ + mostlyclean: + $(RM) gnatmake gnatlink $(TOOLS) gnatbl *.o *.ali + +-clean: ++clean: mostlyclean + $(RM) *.ads *.adb stamp-gnattools-sources + +-distclean: ++distclean: clean + $(RM) Makefile config.status config.log + + maintainer-clean: +Index: libgnatvsn/configure +=================================================================== +--- /dev/null ++++ libgnatvsn/configure +@@ -0,0 +1,43 @@ ++#!/bin/sh ++ ++# Minimal configure script for libgnatvsn. We're only interested in ++# a few parameters. ++ ++for arg in $*; do ++ case ${arg} in ++ --build=*) ++ build=`expr ${arg} : '--build=\(.\+\)'`;; ++ --host=*) ++ host=`expr ${arg} : '--host=\(.\+\)'`;; ++ --target=*) ++ target=`expr ${arg} : '--target=\(.\+\)'`;; ++ --prefix=*) ++ prefix=`expr ${arg} : '--prefix=\(.\+\)'`;; ++ --srcdir=*) ++ srcdir=`expr ${arg} : '--srcdir=\(.\+\)'`;; ++ --with-pkgversion=*) ++ pkgversion=`expr ${arg} : '--with-pkgversion=\(.\+\)'`;; ++ --with-bugurl=*) ++ bugurl=`expr ${arg} : '--with-bugurl=\(.\+\)'`;; ++ *) ++ echo "Warning: ignoring option: ${arg}" ++ esac ++done ++ ++echo "build: ${build}" | tee config.log ++echo "host: ${host}" | tee -a config.log ++echo "target: ${target}" | tee -a config.log ++echo "prefix: ${prefix}" | tee -a config.log ++echo "srcdir: ${srcdir}" | tee -a config.log ++echo "pkgversion: ${pkgversion}" | tee -a config.log ++echo "bugurl: ${bugurl}" | tee -a config.log ++ ++echo "Creating Makefile..." | tee -a config.log ++sed -e "s,@build@,${build},g" \ ++ -e "s,@host@,${host},g" \ ++ -e "s,@target@,${target},g" \ ++ -e "s,@prefix@,${prefix},g" \ ++ -e "s,@srcdir@,${srcdir},g" \ ++ -e "s,@PKGVERSION@,${pkgversion},g" \ ++ -e "s,@REPORT_BUGS_TO@,${bugurl},g" \ ++ < ${srcdir}/Makefile.in > Makefile +Index: libgnatvsn/Makefile.in +=================================================================== +--- /dev/null ++++ libgnatvsn/Makefile.in +@@ -0,0 +1,147 @@ ++# Makefile for libgnatvsn. ++# Copyright (c) 2006 Ludovic Brenta ++# ++# This file 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++# Default target; must be first. ++all: libgnatvsn ++ ++.SUFFIXES: ++ ++CPUS := $(shell getconf _NPROCESSORS_ONLN) ++LIB_VERSION := $(strip $(shell grep ' Library_Version :' \ ++ @srcdir@/../gcc/ada/gnatvsn.ads | \ ++ sed -e 's/.*"\(.*\)".*/\1/')) ++GCC:=../gcc/xgcc -B../gcc/ ++LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++CFLAGS := -g -O2 -gnatn ++BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) ++DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) ++DATESTAMP := $(shell cat @srcdir@/../gcc/DATESTAMP) ++ ++# For use in version.c - double quoted strings, with appropriate ++# surrounding punctuation and spaces, and with the datestamp and ++# development phase collapsed to the empty string in release mode ++# (i.e. if DEVPHASE_c is empty). The space immediately after the ++# comma in the $(if ...) constructs is significant - do not remove it. ++BASEVER_s := "\"$(BASEVER)\"" ++DEVPHASE_s := "\"$(if $(DEVPHASE), ($(DEVPHASE)))\"" ++DATESTAMP_s := "\"$(if $(DEVPHASE), $(DATESTAMP))\"" ++PKGVERSION_s:= "\"@PKGVERSION@\"" ++BUGURL_s := "\"@REPORT_BUGS_TO@\"" ++ ++ifneq (@build@,@host@) ++ CFLAGS += -b @host@ ++endif ++ ++.PHONY: libgnatvsn install ++libgnatvsn: libgnatvsn.so.$(LIB_VERSION) libgnatvsn.a ++ ++VSN_SOURCES := alloc.ads atree.adb casing.adb csets.adb debug.adb einfo.adb \ ++elists.adb fname.adb gnatvsn.adb hostparm.ads krunch.adb lib.adb namet.adb \ ++nlists.adb opt.adb output.adb repinfo.adb scans.adb sinfo.adb sinput.adb \ ++snames.adb stand.adb stringt.adb table.adb tree_in.adb tree_io.adb types.adb \ ++uintp.adb uname.adb urealp.adb widechar.adb ++ ++VSN_SEPARATES := lib-list.adb lib-sort.adb ++ ++OBJECTS=$(patsubst %.ads,%.o,$(VSN_SOURCES:.adb=.o)) version.o ++ ++vpath %.c @srcdir@/../gcc ++ ++libgnatvsn.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) ++ : # Make libgnatvsn.so ++ $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ ++ -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ ln -s libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so ++ chmod a=r obj-shared/*.ali ++# Make the .ali files, but not the .o files, visible to the gnat tools. ++ cp -lp obj-shared/*.ali . ++ ++$(addprefix obj-shared/,$(OBJECTS)): | stamp-libgnatvsn-sources obj-shared ++ ++obj-shared/%.o: %.adb ++ $(GCC) -c -fPIC $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-shared/%.o: %.ads ++ $(GCC) -c -fPIC $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-shared/version.o: version.c ++ $(GCC) -c -fPIC -g -O2 \ ++ -DBASEVER=$(BASEVER_s) \ ++ -DDATESTAMP=$(DATESTAMP_s) \ ++ -DDEVPHASE=$(DEVPHASE_s) \ ++ -DPKGVERSION=$(PKGVERSION_s) \ ++ -DBUGURL=$(BUGURL_s) \ ++ -DREVISION= \ ++ $(realpath $<) -o $@ ++ ++obj-shared: ++ -mkdir $@ ++ ++libgnatvsn.a: $(addprefix obj-static/,$(OBJECTS)) ++ : # Make libgnatvsn.a ++ ar rc $@ $^ ++ ranlib $@ ++ ++$(addprefix obj-static/,$(OBJECTS)): | stamp-libgnatvsn-sources obj-static ++ ++obj-static/%.o: %.adb ++ $(GCC) -c $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-static/%.o: %.ads ++ $(GCC) -c $(CFLAGS) $(LIBGNAT_JUST_BUILT) $< -o $@ ++ ++obj-static/version.o: version.c ++ $(GCC) -c -g -O2 \ ++ -DBASEVER=$(BASEVER_s) \ ++ -DDATESTAMP=$(DATESTAMP_s) \ ++ -DDEVPHASE=$(DEVPHASE_s) \ ++ -DPKGVERSION=$(PKGVERSION_s) \ ++ -DBUGURL=$(BUGURL_s) \ ++ -DREVISION= \ ++ $< -o $@ ++ ++obj-static: ++ -mkdir $@ ++ ++$(VSN_SOURCES) $(VSN_SEPARATES): stamp-libgnatvsn-sources ++ ++stamp-libgnatvsn-sources: ++ for file in $(VSN_SOURCES) $(VSN_SEPARATES); do \ ++ ads=$$(echo $$file | sed 's/\.adb/.ads/'); \ ++ if [ -f @srcdir@/../gcc/ada/$$file -a ! -L $$file ] ; then ln -s @srcdir@/../gcc/ada/$$file .; fi; \ ++ if [ -f @srcdir@/../gcc/ada/$$ads -a ! -L $$ads ] ; then ln -s @srcdir@/../gcc/ada/$$ads .; fi; \ ++ done ++ touch $@ ++ ++install: libgnatvsn ++ $(INSTALL_DATA) libgnatvsn.a $(DESTDIR)$(prefix)/lib ++ $(INSTALL_DATA) libgnatvsn.so.$(LIB_VERSION) $(DESTDIR)$(prefix)/lib ++ cd $(DESTDIR)$(prefix)/lib; \ ++ ln -sf libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so ++ mkdir -p $(DESTDIR)$(prefix)/share/ada/adainclude/gnatvsn ++ $(INSTALL_DATA) \ ++ $(addprefix @srcdir@/../gcc/ada/,$(VSN_SOURCES) $(VSN_SEPARATES)) \ ++ $(addprefix @srcdir@/../gcc/ada/,$(patsubst %.adb,%.ads,$(filter %.adb,$(VSN_SOURCES)))) \ ++ $(DESTDIR)$(prefix)/share/ada/adainclude/gnatvsn ++ mkdir -p $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn ++ $(INSTALL) -m 0444 obj-shared/*.ali \ ++ $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn ++ chmod a=r $(DESTDIR)$(prefix)/lib/ada/adalib/gnatvsn/*.ali ++ ++.PHONY: clean ++clean: ++ rm -rf *.ali obj-static obj-shared libgnatvsn* *.adb *.ads stamp* +Index: Makefile.def +=================================================================== +--- Makefile.def.orig ++++ Makefile.def +@@ -123,6 +123,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++host_modules= { module= libgnatvsn; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + host_modules= { module= gnattools; no_check=true; + missing= info; + missing= dvi; +@@ -161,6 +168,13 @@ + missing= TAGS; + missing= install-info; + missing= installcheck; }; ++target_modules = { module= libgnatvsn; no_check=true; ++ missing= info; ++ missing= dvi; ++ missing= html; ++ missing= TAGS; ++ missing= install-info; ++ missing= installcheck; }; + target_modules = { module= libgomp; lib_path=.libs; }; + + // These are (some of) the make targets to be done in each subdirectory. +@@ -331,6 +345,8 @@ + dependencies = { module=all-fixincludes; on=all-libiberty; }; + + dependencies = { module=all-gnattools; on=all-libada; }; ++dependencies = { module=all-gnattools; on=all-libgnatvsn; }; ++dependencies = { module=all-libgnatvsn; on=all-libada; }; + + dependencies = { module=configure-mpfr; on=all-gmp; }; + +Index: Makefile.in +=================================================================== +--- Makefile.in.orig ++++ Makefile.in +@@ -698,6 +698,7 @@ + maybe-configure-libtermcap \ + maybe-configure-utils \ + maybe-configure-libada \ ++ maybe-configure-libgnatvsn \ + maybe-configure-gnattools + .PHONY: configure-target + configure-target: \ +@@ -721,6 +722,7 @@ + maybe-configure-target-qthreads \ + maybe-configure-target-rda \ + maybe-configure-target-libada \ ++ maybe-configure-target-libgnatvsn \ + maybe-configure-target-libgomp + + # The target built for a native non-bootstrap build. +@@ -849,6 +851,7 @@ + all-host: maybe-all-libtermcap + all-host: maybe-all-utils + all-host: maybe-all-libada ++all-host: maybe-all-libgnatvsn + all-host: maybe-all-gnattools + + .PHONY: all-target +@@ -875,6 +878,7 @@ + all-target: maybe-all-target-qthreads + all-target: maybe-all-target-rda + all-target: maybe-all-target-libada ++all-target: maybe-all-target-libgnatvsn + all-target: maybe-all-target-libgomp + + # Do a target for all the subdirectories. A ``make do-X'' will do a +@@ -963,6 +967,7 @@ + info-host: maybe-info-libtermcap + info-host: maybe-info-utils + info-host: maybe-info-libada ++info-host: maybe-info-libgnatvsn + info-host: maybe-info-gnattools + + .PHONY: info-target +@@ -987,6 +992,7 @@ + info-target: maybe-info-target-qthreads + info-target: maybe-info-target-rda + info-target: maybe-info-target-libada ++info-target: maybe-info-target-libgnatvsn + info-target: maybe-info-target-libgomp + + .PHONY: do-dvi +@@ -1070,6 +1076,7 @@ + dvi-host: maybe-dvi-libtermcap + dvi-host: maybe-dvi-utils + dvi-host: maybe-dvi-libada ++dvi-host: maybe-dvi-libgnatvsn + dvi-host: maybe-dvi-gnattools + + .PHONY: dvi-target +@@ -1094,6 +1101,7 @@ + dvi-target: maybe-dvi-target-qthreads + dvi-target: maybe-dvi-target-rda + dvi-target: maybe-dvi-target-libada ++dvi-target: maybe-dvi-target-libgnatvsn + dvi-target: maybe-dvi-target-libgomp + + .PHONY: do-pdf +@@ -1177,6 +1185,7 @@ + pdf-host: maybe-pdf-libtermcap + pdf-host: maybe-pdf-utils + pdf-host: maybe-pdf-libada ++pdf-host: maybe-pdf-libgnatvsn + pdf-host: maybe-pdf-gnattools + + .PHONY: pdf-target +@@ -1201,6 +1210,7 @@ + pdf-target: maybe-pdf-target-qthreads + pdf-target: maybe-pdf-target-rda + pdf-target: maybe-pdf-target-libada ++pdf-target: maybe-pdf-target-libgnatvsn + pdf-target: maybe-pdf-target-libgomp + + .PHONY: do-html +@@ -1284,6 +1294,7 @@ + html-host: maybe-html-libtermcap + html-host: maybe-html-utils + html-host: maybe-html-libada ++html-host: maybe-html-libgnatvsn + html-host: maybe-html-gnattools + + .PHONY: html-target +@@ -1308,6 +1319,7 @@ + html-target: maybe-html-target-qthreads + html-target: maybe-html-target-rda + html-target: maybe-html-target-libada ++html-target: maybe-html-target-libgnatvsn + html-target: maybe-html-target-libgomp + + .PHONY: do-TAGS +@@ -1391,6 +1403,7 @@ + TAGS-host: maybe-TAGS-libtermcap + TAGS-host: maybe-TAGS-utils + TAGS-host: maybe-TAGS-libada ++TAGS-host: maybe-TAGS-libgnatvsn + TAGS-host: maybe-TAGS-gnattools + + .PHONY: TAGS-target +@@ -1415,6 +1428,7 @@ + TAGS-target: maybe-TAGS-target-qthreads + TAGS-target: maybe-TAGS-target-rda + TAGS-target: maybe-TAGS-target-libada ++TAGS-target: maybe-TAGS-target-libgnatvsn + TAGS-target: maybe-TAGS-target-libgomp + + .PHONY: do-install-info +@@ -1498,6 +1512,7 @@ + install-info-host: maybe-install-info-libtermcap + install-info-host: maybe-install-info-utils + install-info-host: maybe-install-info-libada ++install-info-host: maybe-install-info-libgnatvsn + install-info-host: maybe-install-info-gnattools + + .PHONY: install-info-target +@@ -1522,6 +1537,7 @@ + install-info-target: maybe-install-info-target-qthreads + install-info-target: maybe-install-info-target-rda + install-info-target: maybe-install-info-target-libada ++install-info-target: maybe-install-info-target-libgnatvsn + install-info-target: maybe-install-info-target-libgomp + + .PHONY: do-install-pdf +@@ -1605,6 +1621,7 @@ + install-pdf-host: maybe-install-pdf-libtermcap + install-pdf-host: maybe-install-pdf-utils + install-pdf-host: maybe-install-pdf-libada ++install-pdf-host: maybe-install-pdf-libgnatvsn + install-pdf-host: maybe-install-pdf-gnattools + + .PHONY: install-pdf-target +@@ -1629,6 +1646,7 @@ + install-pdf-target: maybe-install-pdf-target-qthreads + install-pdf-target: maybe-install-pdf-target-rda + install-pdf-target: maybe-install-pdf-target-libada ++install-pdf-target: maybe-install-pdf-target-libgnatvsn + install-pdf-target: maybe-install-pdf-target-libgomp + + .PHONY: do-install-html +@@ -1712,6 +1730,7 @@ + install-html-host: maybe-install-html-libtermcap + install-html-host: maybe-install-html-utils + install-html-host: maybe-install-html-libada ++install-html-host: maybe-install-html-libgnatvsn + install-html-host: maybe-install-html-gnattools + + .PHONY: install-html-target +@@ -1736,6 +1755,7 @@ + install-html-target: maybe-install-html-target-qthreads + install-html-target: maybe-install-html-target-rda + install-html-target: maybe-install-html-target-libada ++install-html-target: maybe-install-html-target-libgnatvsn + install-html-target: maybe-install-html-target-libgomp + + .PHONY: do-installcheck +@@ -1819,6 +1839,7 @@ + installcheck-host: maybe-installcheck-libtermcap + installcheck-host: maybe-installcheck-utils + installcheck-host: maybe-installcheck-libada ++installcheck-host: maybe-installcheck-libgnatvsn + installcheck-host: maybe-installcheck-gnattools + + .PHONY: installcheck-target +@@ -1843,6 +1864,7 @@ + installcheck-target: maybe-installcheck-target-qthreads + installcheck-target: maybe-installcheck-target-rda + installcheck-target: maybe-installcheck-target-libada ++installcheck-target: maybe-installcheck-target-libgnatvsn + installcheck-target: maybe-installcheck-target-libgomp + + .PHONY: do-mostlyclean +@@ -1926,6 +1948,7 @@ + mostlyclean-host: maybe-mostlyclean-libtermcap + mostlyclean-host: maybe-mostlyclean-utils + mostlyclean-host: maybe-mostlyclean-libada ++mostlyclean-host: maybe-mostlyclean-libgnatvsn + mostlyclean-host: maybe-mostlyclean-gnattools + + .PHONY: mostlyclean-target +@@ -1950,6 +1973,7 @@ + mostlyclean-target: maybe-mostlyclean-target-qthreads + mostlyclean-target: maybe-mostlyclean-target-rda + mostlyclean-target: maybe-mostlyclean-target-libada ++mostlyclean-target: maybe-mostlyclean-target-libgnatvsn + mostlyclean-target: maybe-mostlyclean-target-libgomp + + .PHONY: do-clean +@@ -2033,6 +2057,7 @@ + clean-host: maybe-clean-libtermcap + clean-host: maybe-clean-utils + clean-host: maybe-clean-libada ++clean-host: maybe-clean-libgnatvsn + clean-host: maybe-clean-gnattools + + .PHONY: clean-target +@@ -2057,6 +2082,7 @@ + clean-target: maybe-clean-target-qthreads + clean-target: maybe-clean-target-rda + clean-target: maybe-clean-target-libada ++clean-target: maybe-clean-target-libgnatvsn + clean-target: maybe-clean-target-libgomp + + .PHONY: do-distclean +@@ -2140,6 +2166,7 @@ + distclean-host: maybe-distclean-libtermcap + distclean-host: maybe-distclean-utils + distclean-host: maybe-distclean-libada ++distclean-host: maybe-distclean-libgnatvsn + distclean-host: maybe-distclean-gnattools + + .PHONY: distclean-target +@@ -2164,6 +2191,7 @@ + distclean-target: maybe-distclean-target-qthreads + distclean-target: maybe-distclean-target-rda + distclean-target: maybe-distclean-target-libada ++distclean-target: maybe-distclean-target-libgnatvsn + distclean-target: maybe-distclean-target-libgomp + + .PHONY: do-maintainer-clean +@@ -2247,6 +2275,7 @@ + maintainer-clean-host: maybe-maintainer-clean-libtermcap + maintainer-clean-host: maybe-maintainer-clean-utils + maintainer-clean-host: maybe-maintainer-clean-libada ++maintainer-clean-host: maybe-maintainer-clean-libgnatvsn + maintainer-clean-host: maybe-maintainer-clean-gnattools + + .PHONY: maintainer-clean-target +@@ -2271,6 +2300,7 @@ + maintainer-clean-target: maybe-maintainer-clean-target-qthreads + maintainer-clean-target: maybe-maintainer-clean-target-rda + maintainer-clean-target: maybe-maintainer-clean-target-libada ++maintainer-clean-target: maybe-maintainer-clean-target-libgnatvsn + maintainer-clean-target: maybe-maintainer-clean-target-libgomp + + +@@ -2408,6 +2438,7 @@ + maybe-check-libtermcap \ + maybe-check-utils \ + maybe-check-libada \ ++ maybe-check-libgnatvsn \ + maybe-check-gnattools + + .PHONY: check-target +@@ -2432,6 +2463,7 @@ + maybe-check-target-qthreads \ + maybe-check-target-rda \ + maybe-check-target-libada \ ++ maybe-check-target-libgnatvsn \ + maybe-check-target-libgomp + + do-check: +@@ -2541,6 +2573,7 @@ + maybe-install-libtermcap \ + maybe-install-utils \ + maybe-install-libada \ ++ maybe-install-libgnatvsn \ + maybe-install-gnattools + + .PHONY: install-host +@@ -2615,6 +2648,7 @@ + maybe-install-libtermcap \ + maybe-install-utils \ + maybe-install-libada \ ++ maybe-install-libgnatvsn \ + maybe-install-gnattools + + .PHONY: install-target +@@ -2639,6 +2673,7 @@ + maybe-install-target-qthreads \ + maybe-install-target-rda \ + maybe-install-target-libada \ ++ maybe-install-target-libgnatvsn \ + maybe-install-target-libgomp + + uninstall: +@@ -39206,6 +39241,327 @@ + + + ++.PHONY: configure-libgnatvsn maybe-configure-libgnatvsn ++maybe-configure-libgnatvsn: ++@if gcc-bootstrap ++configure-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if libgnatvsn ++maybe-configure-libgnatvsn: configure-libgnatvsn ++configure-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ test ! -f $(HOST_SUBDIR)/libgnatvsn/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libgnatvsn ; \ ++ $(HOST_EXPORTS) \ ++ echo Configuring in $(HOST_SUBDIR)/libgnatvsn; \ ++ cd "$(HOST_SUBDIR)/libgnatvsn" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(HOST_SUBDIR)/libgnatvsn/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatvsn"; \ ++ libsrcdir="$$s/libgnatvsn"; \ ++ $(SHELL) $${libsrcdir}/configure \ ++ $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: all-libgnatvsn maybe-all-libgnatvsn ++maybe-all-libgnatvsn: ++@if gcc-bootstrap ++all-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if libgnatvsn ++TARGET-libgnatvsn=all ++maybe-all-libgnatvsn: all-libgnatvsn ++all-libgnatvsn: configure-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(FLAGS_TO_PASS) $(TARGET-libgnatvsn)) ++@endif libgnatvsn ++ ++ ++ ++ ++.PHONY: check-libgnatvsn maybe-check-libgnatvsn ++maybe-check-libgnatvsn: ++@if libgnatvsn ++maybe-check-libgnatvsn: check-libgnatvsn ++ ++check-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: install-libgnatvsn maybe-install-libgnatvsn ++maybe-install-libgnatvsn: ++@if libgnatvsn ++maybe-install-libgnatvsn: install-libgnatvsn ++ ++install-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(FLAGS_TO_PASS) install) ++ ++@endif libgnatvsn ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-libgnatvsn info-libgnatvsn ++maybe-info-libgnatvsn: ++@if libgnatvsn ++maybe-info-libgnatvsn: info-libgnatvsn ++ ++# libgnatvsn doesn't support info. ++info-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-dvi-libgnatvsn dvi-libgnatvsn ++maybe-dvi-libgnatvsn: ++@if libgnatvsn ++maybe-dvi-libgnatvsn: dvi-libgnatvsn ++ ++# libgnatvsn doesn't support dvi. ++dvi-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-pdf-libgnatvsn pdf-libgnatvsn ++maybe-pdf-libgnatvsn: ++@if libgnatvsn ++maybe-pdf-libgnatvsn: pdf-libgnatvsn ++ ++pdf-libgnatvsn: \ ++ configure-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing pdf in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-html-libgnatvsn html-libgnatvsn ++maybe-html-libgnatvsn: ++@if libgnatvsn ++maybe-html-libgnatvsn: html-libgnatvsn ++ ++# libgnatvsn doesn't support html. ++html-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-TAGS-libgnatvsn TAGS-libgnatvsn ++maybe-TAGS-libgnatvsn: ++@if libgnatvsn ++maybe-TAGS-libgnatvsn: TAGS-libgnatvsn ++ ++# libgnatvsn doesn't support TAGS. ++TAGS-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-info-libgnatvsn install-info-libgnatvsn ++maybe-install-info-libgnatvsn: ++@if libgnatvsn ++maybe-install-info-libgnatvsn: install-info-libgnatvsn ++ ++# libgnatvsn doesn't support install-info. ++install-info-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-pdf-libgnatvsn install-pdf-libgnatvsn ++maybe-install-pdf-libgnatvsn: ++@if libgnatvsn ++maybe-install-pdf-libgnatvsn: install-pdf-libgnatvsn ++ ++install-pdf-libgnatvsn: \ ++ configure-libgnatvsn \ ++ pdf-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-pdf in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-install-html-libgnatvsn install-html-libgnatvsn ++maybe-install-html-libgnatvsn: ++@if libgnatvsn ++maybe-install-html-libgnatvsn: install-html-libgnatvsn ++ ++install-html-libgnatvsn: \ ++ configure-libgnatvsn \ ++ html-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing install-html in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-installcheck-libgnatvsn installcheck-libgnatvsn ++maybe-installcheck-libgnatvsn: ++@if libgnatvsn ++maybe-installcheck-libgnatvsn: installcheck-libgnatvsn ++ ++# libgnatvsn doesn't support installcheck. ++installcheck-libgnatvsn: ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-mostlyclean-libgnatvsn mostlyclean-libgnatvsn ++maybe-mostlyclean-libgnatvsn: ++@if libgnatvsn ++maybe-mostlyclean-libgnatvsn: mostlyclean-libgnatvsn ++ ++mostlyclean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing mostlyclean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-clean-libgnatvsn clean-libgnatvsn ++maybe-clean-libgnatvsn: ++@if libgnatvsn ++maybe-clean-libgnatvsn: clean-libgnatvsn ++ ++clean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing clean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-distclean-libgnatvsn distclean-libgnatvsn ++maybe-distclean-libgnatvsn: ++@if libgnatvsn ++maybe-distclean-libgnatvsn: distclean-libgnatvsn ++ ++distclean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing distclean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++.PHONY: maybe-maintainer-clean-libgnatvsn maintainer-clean-libgnatvsn ++maybe-maintainer-clean-libgnatvsn: ++@if libgnatvsn ++maybe-maintainer-clean-libgnatvsn: maintainer-clean-libgnatvsn ++ ++maintainer-clean-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f ./libgnatvsn/Makefile ] || exit 0; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(HOST_EXPORTS) \ ++ for flag in $(EXTRA_HOST_FLAGS) ; do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ echo "Doing maintainer-clean in libgnatvsn" ; \ ++ (cd $(HOST_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif libgnatvsn ++ ++ ++ + .PHONY: configure-gnattools maybe-configure-gnattools + maybe-configure-gnattools: + @if gcc-bootstrap +@@ -48785,6 +49141,345 @@ + + + ++.PHONY: configure-target-libgnatvsn maybe-configure-target-libgnatvsn ++maybe-configure-target-libgnatvsn: ++@if gcc-bootstrap ++configure-target-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if target-libgnatvsn ++maybe-configure-target-libgnatvsn: configure-target-libgnatvsn ++configure-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ echo "Checking multilib configuration for libgnatvsn..."; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatvsn ; \ ++ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp 2> /dev/null ; \ ++ if test -r $(TARGET_SUBDIR)/libgnatvsn/multilib.out; then \ ++ if cmp -s $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; then \ ++ rm -f $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp; \ ++ else \ ++ rm -f $(TARGET_SUBDIR)/libgnatvsn/Makefile; \ ++ mv $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; \ ++ fi; \ ++ else \ ++ mv $(TARGET_SUBDIR)/libgnatvsn/multilib.tmp $(TARGET_SUBDIR)/libgnatvsn/multilib.out; \ ++ fi; \ ++ test ! -f $(TARGET_SUBDIR)/libgnatvsn/Makefile || exit 0; \ ++ $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libgnatvsn ; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo Configuring in $(TARGET_SUBDIR)/libgnatvsn; \ ++ cd "$(TARGET_SUBDIR)/libgnatvsn" || exit 1; \ ++ case $(srcdir) in \ ++ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \ ++ *) topdir=`echo $(TARGET_SUBDIR)/libgnatvsn/ | \ ++ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \ ++ esac; \ ++ srcdiroption="--srcdir=$${topdir}/libgnatvsn"; \ ++ libsrcdir="$$s/libgnatvsn"; \ ++ rm -f no-such-file || : ; \ ++ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ ++ $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ ++ --target=${target_alias} $${srcdiroption} \ ++ || exit 1 ++@endif target-libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: all-target-libgnatvsn maybe-all-target-libgnatvsn ++maybe-all-target-libgnatvsn: ++@if gcc-bootstrap ++all-target-libgnatvsn: stage_current ++@endif gcc-bootstrap ++@if target-libgnatvsn ++TARGET-target-libgnatvsn=all ++maybe-all-target-libgnatvsn: all-target-libgnatvsn ++all-target-libgnatvsn: configure-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) $(TARGET-target-libgnatvsn)) ++@endif target-libgnatvsn ++ ++ ++ ++ ++ ++.PHONY: check-target-libgnatvsn maybe-check-target-libgnatvsn ++maybe-check-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-check-target-libgnatvsn: check-target-libgnatvsn ++ ++# Dummy target for uncheckable module. ++check-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: install-target-libgnatvsn maybe-install-target-libgnatvsn ++maybe-install-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-target-libgnatvsn: install-target-libgnatvsn ++ ++install-target-libgnatvsn: installdirs ++ @: $(MAKE); $(unstage) ++ @r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ ++@endif target-libgnatvsn ++ ++# Other targets (info, dvi, pdf, etc.) ++ ++.PHONY: maybe-info-target-libgnatvsn info-target-libgnatvsn ++maybe-info-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-info-target-libgnatvsn: info-target-libgnatvsn ++ ++# libgnatvsn doesn't support info. ++info-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-dvi-target-libgnatvsn dvi-target-libgnatvsn ++maybe-dvi-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-dvi-target-libgnatvsn: dvi-target-libgnatvsn ++ ++# libgnatvsn doesn't support dvi. ++dvi-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-pdf-target-libgnatvsn pdf-target-libgnatvsn ++maybe-pdf-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-pdf-target-libgnatvsn: pdf-target-libgnatvsn ++ ++pdf-target-libgnatvsn: \ ++ configure-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing pdf in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ pdf) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-html-target-libgnatvsn html-target-libgnatvsn ++maybe-html-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-html-target-libgnatvsn: html-target-libgnatvsn ++ ++# libgnatvsn doesn't support html. ++html-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-TAGS-target-libgnatvsn TAGS-target-libgnatvsn ++maybe-TAGS-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-TAGS-target-libgnatvsn: TAGS-target-libgnatvsn ++ ++# libgnatvsn doesn't support TAGS. ++TAGS-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-info-target-libgnatvsn install-info-target-libgnatvsn ++maybe-install-info-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-info-target-libgnatvsn: install-info-target-libgnatvsn ++ ++# libgnatvsn doesn't support install-info. ++install-info-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-pdf-target-libgnatvsn install-pdf-target-libgnatvsn ++maybe-install-pdf-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-pdf-target-libgnatvsn: install-pdf-target-libgnatvsn ++ ++install-pdf-target-libgnatvsn: \ ++ configure-target-libgnatvsn \ ++ pdf-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-pdf in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-pdf) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-install-html-target-libgnatvsn install-html-target-libgnatvsn ++maybe-install-html-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-install-html-target-libgnatvsn: install-html-target-libgnatvsn ++ ++install-html-target-libgnatvsn: \ ++ configure-target-libgnatvsn \ ++ html-target-libgnatvsn ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing install-html in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ install-html) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-installcheck-target-libgnatvsn installcheck-target-libgnatvsn ++maybe-installcheck-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-installcheck-target-libgnatvsn: installcheck-target-libgnatvsn ++ ++# libgnatvsn doesn't support installcheck. ++installcheck-target-libgnatvsn: ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-mostlyclean-target-libgnatvsn mostlyclean-target-libgnatvsn ++maybe-mostlyclean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-mostlyclean-target-libgnatvsn: mostlyclean-target-libgnatvsn ++ ++mostlyclean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing mostlyclean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ mostlyclean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-clean-target-libgnatvsn clean-target-libgnatvsn ++maybe-clean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-clean-target-libgnatvsn: clean-target-libgnatvsn ++ ++clean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing clean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ clean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-distclean-target-libgnatvsn distclean-target-libgnatvsn ++maybe-distclean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-distclean-target-libgnatvsn: distclean-target-libgnatvsn ++ ++distclean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing distclean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ distclean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++.PHONY: maybe-maintainer-clean-target-libgnatvsn maintainer-clean-target-libgnatvsn ++maybe-maintainer-clean-target-libgnatvsn: ++@if target-libgnatvsn ++maybe-maintainer-clean-target-libgnatvsn: maintainer-clean-target-libgnatvsn ++ ++maintainer-clean-target-libgnatvsn: ++ @: $(MAKE); $(unstage) ++ @[ -f $(TARGET_SUBDIR)/libgnatvsn/Makefile ] || exit 0 ; \ ++ r=`${PWD_COMMAND}`; export r; \ ++ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ ++ $(NORMAL_TARGET_EXPORTS) \ ++ echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libgnatvsn" ; \ ++ for flag in $(EXTRA_TARGET_FLAGS); do \ ++ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ ++ done; \ ++ (cd $(TARGET_SUBDIR)/libgnatvsn && \ ++ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ ++ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ ++ "RANLIB=$${RANLIB}" \ ++ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \ ++ maintainer-clean) \ ++ || exit 1 ++ ++@endif target-libgnatvsn ++ ++ ++ ++ ++ + .PHONY: configure-target-libgomp maybe-configure-target-libgomp + maybe-configure-target-libgomp: + @if gcc-bootstrap +@@ -51334,6 +52029,7 @@ + configure-target-qthreads: stage_last + configure-target-rda: stage_last + configure-target-libada: stage_last ++configure-target-libgnatvsn: stage_last + configure-target-libgomp: stage_last + @endif gcc-bootstrap + +@@ -51358,6 +52054,7 @@ + configure-target-qthreads: maybe-all-gcc + configure-target-rda: maybe-all-gcc + configure-target-libada: maybe-all-gcc ++configure-target-libgnatvsn: maybe-all-gcc + configure-target-libgomp: maybe-all-gcc + @endif gcc-no-bootstrap + +@@ -51612,6 +52309,8 @@ + all-stagefeedback-libcpp: maybe-all-stagefeedback-intl + all-fixincludes: maybe-all-libiberty + all-gnattools: maybe-all-libada ++all-gnattools: maybe-all-libgnatvsn ++all-libgnatvsn: maybe-all-libada + configure-mpfr: maybe-all-gmp + + configure-stage1-mpfr: maybe-all-stage1-gmp +@@ -52049,6 +52748,7 @@ + configure-target-qthreads: maybe-all-target-libgcc + configure-target-rda: maybe-all-target-libgcc + configure-target-libada: maybe-all-target-libgcc ++configure-target-libgnatvsn: maybe-all-target-libgcc + configure-target-libgomp: maybe-all-target-libgcc + @endif gcc-no-bootstrap + +@@ -52091,6 +52791,8 @@ + + configure-target-libada: maybe-all-target-newlib maybe-all-target-libgloss + ++configure-target-libgnatvsn: maybe-all-target-newlib maybe-all-target-libgloss ++ + configure-target-libgomp: maybe-all-target-newlib maybe-all-target-libgloss + + +Index: configure.ac +=================================================================== +--- configure.ac.orig ++++ configure.ac +@@ -155,7 +155,7 @@ + + # these libraries are used by various programs built for the host environment + # +-host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl libgui zlib libcpp libdecnumber gmp mpfr libada" ++host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl libgui zlib libcpp libdecnumber gmp mpfr libada libgnatvsn" + + # these tools are built for the host environment + # Note, the powerpc-eabi build depends on sim occurring before gdb in order to +@@ -185,7 +185,8 @@ + target-boehm-gc \ + ${libgcj} \ + target-libobjc \ +- target-libada" ++ target-libada \ ++ target-libgnatvsn" + + # these tools are built using the target libraries, and are intended to + # run only in the target environment +@@ -263,7 +264,7 @@ + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +-cross_only="target-libgloss target-newlib target-opcodes target-libada" ++cross_only="target-libgloss target-newlib target-opcodes target-libada target-libgnatvsn" + + case $is_cross_compiler in + no) skipdirs="${skipdirs} ${cross_only}" ;; +@@ -340,7 +341,7 @@ + ENABLE_LIBADA=$enableval, + ENABLE_LIBADA=yes) + if test "${ENABLE_LIBADA}" != "yes" ; then +- noconfigdirs="$noconfigdirs gnattools" ++ noconfigdirs="$noconfigdirs libgnatvsn gnattools" + fi + + AC_ARG_ENABLE(libssp, diff --git a/recipes/gcc/gcc-svn/debian/ada-link-lib.dpatch b/recipes/gcc/gcc-svn/debian/ada-link-lib.dpatch new file mode 100644 index 0000000000..2645fe034e --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-link-lib.dpatch @@ -0,0 +1,1932 @@ +#! /bin/sh -e + +# DP: - Install the shared Ada libraries as '.so.1', not '.so' to conform +# DP: to the Debian policy. +# DP: - Don't include a runtime link path (-rpath), when linking binaries. +# DP: - Build the shared libraries on hppa-linux. +# DP: - Instead of building libada as a target library only, build it as +# DP: both a host and, if different, target library. +# DP: - Build the GNAT tools in their top-level directory; do not use +# DP: recursive makefiles. +# DP: - Link the GNAT tools dynamically. +# DP: - Fix a bug in src/gnattools/configure.ac whereby a nonexistent version +# DP: of indepsw's body was selected. Regenerate configure. (PR ada/27300) + +# This patch seems large, but the hunks in Makefile.in are actually +# generated from Makefile.def using autogen. + +dir=./ +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir} && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/ada/config-lang.in +=================================================================== +--- gcc/ada/config-lang.in.orig 2007-09-03 15:14:47.000000000 +0200 ++++ gcc/ada/config-lang.in 2008-01-29 12:16:44.688811730 +0100 +@@ -35,7 +35,7 @@ + outputs=ada/Makefile + + target_libs="target-libada" +-lang_dirs="gnattools" ++lang_dirs="libada gnattools" + + # Ada will not work until the front end starts emitting GIMPLE trees. + build_by_default=no +Index: gcc/ada/link.c +=================================================================== +--- gcc/ada/link.c.orig 2007-11-21 12:20:42.000000000 +0100 ++++ gcc/ada/link.c 2008-01-29 12:16:44.688811730 +0100 +@@ -146,8 +146,8 @@ + + #elif defined (__FreeBSD__) + const char *__gnat_object_file_option = ""; +-const char *__gnat_run_path_option = "-Wl,-rpath,"; +-char __gnat_shared_libgnat_default = STATIC; ++char *__gnat_run_path_option = ""; ++char __gnat_shared_libgnat_default = SHARED; + int __gnat_link_max = 8192; + unsigned char __gnat_objlist_file_supported = 1; + unsigned char __gnat_using_gnu_linker = 1; +@@ -155,8 +155,8 @@ + + #elif defined (linux) + const char *__gnat_object_file_option = ""; +-const char *__gnat_run_path_option = "-Wl,-rpath,"; +-char __gnat_shared_libgnat_default = STATIC; ++const char *__gnat_run_path_option = ""; ++char __gnat_shared_libgnat_default = SHARED; + int __gnat_link_max = 8192; + unsigned char __gnat_objlist_file_supported = 1; + unsigned char __gnat_using_gnu_linker = 1; +Index: gcc/ada/Makefile.in +=================================================================== +--- gcc/ada/Makefile.in.orig 2008-01-29 12:10:06.222766372 +0100 ++++ gcc/ada/Makefile.in 2008-01-29 12:17:55.465175005 +0100 +@@ -114,7 +114,7 @@ + MAKEINFO = makeinfo + TEXI2DVI = texi2dvi + TEXI2PDF = texi2pdf +-GNATBIND_FLAGS = -static -x ++GNATBIND_FLAGS = -shared -x + ADA_CFLAGS = + ADAFLAGS = -W -Wall -gnatpg -gnata + SOME_ADAFLAGS =-gnata +@@ -247,7 +247,6 @@ + LIBDEPS = $(LIBINTL_DEP) $(LIBIBERTY) + # Default is no TGT_LIB; one might be passed down or something + TGT_LIB = +-TOOLS_LIBS = $(EXTRA_GNATTOOLS_OBJS) targext.o link.o $(LIBGNAT) ../../../libiberty/libiberty.a $(SYSLIBS) $(TGT_LIB) + + # Specify the directories to be searched for header files. + # Both . and srcdir are used, in that order, +@@ -293,30 +292,6 @@ + # defined in this file into the environment. + .NOEXPORT: + +-# Lists of files for various purposes. +- +-GNATLINK_OBJS = gnatlink.o \ +- a-except.o ali.o alloc.o butil.o casing.o csets.o debug.o fmap.o fname.o \ +- gnatvsn.o hostparm.o indepsw.o interfac.o i-c.o i-cstrin.o namet.o opt.o \ +- osint.o output.o rident.o s-exctab.o s-secsta.o s-stalib.o s-stoele.o \ +- sdefault.o snames.o stylesw.o switch.o system.o table.o targparm.o tree_io.o \ +- types.o validsw.o widechar.o +- +-GNATMAKE_OBJS = a-except.o ali.o ali-util.o s-casuti.o \ +- alloc.o atree.o binderr.o butil.o casing.o csets.o debug.o elists.o einfo.o\ +- erroutc.o errutil.o err_vars.o fmap.o fname.o fname-uf.o fname-sf.o \ +- gnatmake.o gnatvsn.o hostparm.o interfac.o i-c.o i-cstrin.o krunch.o lib.o \ +- make.o makeusg.o makeutl.o mlib.o mlib-fil.o mlib-prj.o mlib-tgt.o \ +- mlib-tgt-specific.o mlib-utl.o namet.o nlists.o opt.o osint.o osint-m.o output.o \ +- prj.o prj-attr.o prj-attr-pm.o prj-com.o prj-dect.o prj-env.o prj-err.o prj-ext.o prj-nmsc.o \ +- prj-pars.o prj-part.o prj-proc.o prj-strt.o prj-tree.o prj-util.o \ +- rident.o s-exctab.o s-secsta.o s-stalib.o s-stoele.o \ +- scans.o scng.o sdefault.o sfn_scan.o s-purexc.o s-htable.o \ +- sinfo.o sinput.o sinput-c.o sinput-p.o \ +- snames.o stand.o stringt.o styleg.o stylesw.o system.o validsw.o switch.o switch-m.o \ +- table.o targparm.o tempdir.o tree_io.o types.o \ +- uintp.o uname.o urealp.o usage.o widechar.o \ +- $(EXTRA_GNATMAKE_OBJS) + + # Convert the target variable into a space separated list of architecture, + # manufacturer, and operating system and assign each of those to its own +@@ -1017,6 +992,11 @@ + GMEM_LIB = gmemlib + endif + ++ifeq ($(strip $(filter-out hppa% unknown linux gnu,$(targ))),) ++ GNATLIB_SHARED = gnatlib-shared-dual ++ LIBRARY_VERSION := $(LIB_VERSION) ++endif ++ + ifeq ($(strip $(filter-out hppa% hp hpux10%,$(targ))),) + LIBGNAT_TARGET_PAIRS = \ + a-excpol.adb&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +Index: src/libada/Makefile.in +=================================================================== +--- src.orig/libada/Makefile.in ++++ src/libada/Makefile.in +@@ -16,7 +16,8 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + # Default target; must be first. +-all: gnatlib ++GNATLIB = gnatlib-static-zcx gnatlib-static-sjlj gnatlib-shared-zcx ++all: $(GNATLIB) + + # Standard autoconf-set variables. + SHELL = @SHELL@ +@@ -78,30 +79,38 @@ + "CFLAGS=$(CFLAGS) $(WARN_CFLAGS)" + + # Rules to build gnatlib. +-.PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared +-gnatlib: @default_gnatlib_target@ ++.PHONY: $(GNATLIB) + +-gnatlib-plain: $(GCC_DIR)/ada/Makefile +- test -f stamp-libada || \ ++$(GCC_DIR)/ada/gnatlib-sources-sjlj/a-except.ads: + $(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ + THREAD_KIND="$(THREAD_KIND)" \ + TRACE="$(TRACE)" \ +- gnatlib \ +- && touch stamp-libada ++ EH_MECHANISM="" \ ++ gnatlib-sources-sjlj/a-except.ads + +-gnatlib-sjlj gnatlib-zcx gnatlib-shared: $(GCC_DIR)/ada/Makefile +- test -f stamp-libada || \ ++$(GCC_DIR)/ada/gnatlib-sources-zcx/a-except.ads: + $(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ + THREAD_KIND="$(THREAD_KIND)" \ + TRACE="$(TRACE)" \ +- $@ \ +- && touch stamp-libada ++ EH_MECHANISM="-gcc" \ ++ gnatlib-sources-zcx/a-except.ads ++ ++$(GNATLIB): $(GCC_DIR)/ada/Makefile \ ++$(GCC_DIR)/ada/gnatlib-sources-zcx/a-except.ads \ ++$(GCC_DIR)/ada/gnatlib-sources-sjlj/a-except.ads ++ $(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \ ++ GNATLIBFLAGS="$(GNATLIBFLAGS)" \ ++ GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ ++ TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ ++ THREAD_KIND="$(THREAD_KIND)" \ ++ TRACE="$(TRACE)" \ ++ $@ + + # Check uninstalled version. + check: +Index: src/libada/configure +=================================================================== +--- src.orig/libada/configure ++++ src/libada/configure +@@ -1552,17 +1552,6 @@ + *) x_ada_cflags= ;; + esac + +- +-# Determine what to build for 'gnatlib' +-if test $build = $target \ +- && test ${enable_shared} = yes ; then +- # Note that build=target is almost certainly the wrong test; FIXME +- default_gnatlib_target="gnatlib-shared" +-else +- default_gnatlib_target="gnatlib-plain" +-fi +- +- + # Output: create a Makefile. + ac_config_files="$ac_config_files Makefile" + +@@ -2222,7 +2211,6 @@ + s,@enable_shared@,$enable_shared,;t t + s,@LN_S@,$LN_S,;t t + s,@x_ada_cflags@,$x_ada_cflags,;t t +-s,@default_gnatlib_target@,$default_gnatlib_target,;t t + s,@LIBOBJS@,$LIBOBJS,;t t + s,@LTLIBOBJS@,$LTLIBOBJS,;t t + CEOF +Index: src/gcc/ada/Makefile.in +=================================================================== +--- src.orig/gcc/ada/Makefile.in ++++ src/gcc/ada/Makefile.in +@@ -1324,6 +1324,50 @@ + LIBRARY_VERSION := $(LIB_VERSION) + endif + ++ifeq ($(strip $(filter-out mips linux%,$(arch) $(osys))),) ++ LIBGNAT_TARGET_PAIRS = \ ++ a-intnam.ads $(dir)/s.ads + + # GNULLI End ############################################################# + +@@ -1646,57 +1723,60 @@ + # Example: cd rts; ar rc libfoo.a $(LONG_LIST_OF_OBJS) + # is guaranteed to overflow the buffer. + +-gnatlib: ../stamp-gnatlib1 +- $(MAKE) -C rts \ ++%/libgnat$(arext): build_dir = $(dir $@) ++%/libgnat$(arext): libgnarl = $(subst libgnat,libgnarl,$@) ++%/libgnat$(arext): libgnala = $(subst libgnat,libgnala,$@) ++%/libgnat$(arext): % ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,^\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ +- INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ +- CFLAGS="$(GNATLIBCFLAGS_FOR_C)" \ +- FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ ++ INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ ++ CFLAGS="$(GNATLIBCFLAGS_FOR_C)" \ + srcdir=$(fsrcdir) \ +- -f ../Makefile $(LIBGNAT_OBJS) +- $(MAKE) -C rts \ ++ -f ../Makefile $(LIBGNAT_OBJS) ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,^\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ +- ADA_INCLUDES="" \ +- CFLAGS="$(GNATLIBCFLAGS)" \ +- ADAFLAGS="$(GNATLIBFLAGS)" \ +- FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ ++ ADA_INCLUDES="" \ ++ CFLAGS="$(GNATLIBCFLAGS)" \ ++ ADAFLAGS="$(GNATLIBFLAGS)" \ + srcdir=$(fsrcdir) \ +- -f ../Makefile \ +- $(GNATRTL_OBJS) +- $(RM) rts/libgnat$(arext) rts/libgnarl$(arext) +- $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgnat$(arext) \ +- $(addprefix rts/,$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) g-trasym.o convert_addresses.o) ++ -f ../Makefile \ ++ $(GNATRTL_OBJS) ++ $(RM) $@ $(libgnarl) ++ $(AR_FOR_TARGET) $(AR_FLAGS) $@ \ ++ $(addprefix $(build_dir),$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) g-trasym.o convert_addresses.o) + ifneq ($(PREFIX_OBJS),) +- $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgccprefix$(arext) \ ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(build_dir)libgccprefix$(arext) \ + $(PREFIX_OBJS); +- $(RANLIB_FOR_TARGET) rts/libgccprefix$(arext) ++ $(RANLIB_FOR_TARGET) $(build_dir)libgccprefix$(arext) + endif +- $(RANLIB_FOR_TARGET) rts/libgnat$(arext) +- $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgnarl$(arext) \ +- $(addprefix rts/,$(GNATRTL_TASKING_OBJS)) +- $(RANLIB_FOR_TARGET) rts/libgnarl$(arext) +- $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgnala$(arext) \ +- $(addprefix rts/,$(GNATRTL_LINEARALGEBRA_OBJS)) +- $(RANLIB_FOR_TARGET) rts/libgnala$(arext) ++ $(RANLIB_FOR_TARGET) $@ ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(libgnarl) \ ++ $(addprefix $(build_dir),$(GNATRTL_TASKING_OBJS)) ++ $(RANLIB_FOR_TARGET) $(libgnarl) ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(libgnala) \ ++ $(addprefix $(build_dir),$(GNATRTL_LINEARALGEBRA_OBJS)) ++ $(RANLIB_FOR_TARGET) $(libgnala) + ifeq ($(GMEM_LIB),gmemlib) +- $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgmem$(arext) \ +- rts/memtrack.o +- $(RANLIB_FOR_TARGET) rts/libgmem$(arext) ++ $(AR_FOR_TARGET) $(AR_FLAGS) $(build_dir)libgmem$(arext) \ ++ $(build_dir)memtrack.o ++ $(RANLIB_FOR_TARGET) $(build_dir)libgmem$(arext) + endif +- touch ../stamp-gnatlib + + # Warning: this target assumes that LIBRARY_VERSION has been set correctly. +-gnatlib-shared-default: ../stamp-gnatlib1 +- $(MAKE) -C rts \ ++%/$(libgnat) %/$(libgnat-sjlj): build_dir = $(dir $@) ++%/$(libgnat) %/$(libgnat-sjlj): libgnarl = $(notdir $(subst libgnat,libgnarl,$@)) ++%/$(libgnat) %/$(libgnat-sjlj): libgnala = $(notdir $(subst libgnat,libgnala,$@)) ++%/$(libgnat) %/$(libgnat-sjlj): % ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,^\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \ + CFLAGS="$(GNATLIBCFLAGS_FOR_C)" \ + srcdir=$(fsrcdir) \ + -f ../Makefile $(LIBGNAT_OBJS) +- $(MAKE) -C rts \ ++ $(MAKE) -C $(build_dir) \ + CC="`echo \"$(GCC_FOR_TARGET)\" \ + | sed -e 's,^\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'`" \ + ADA_INCLUDES="" \ +@@ -1706,157 +1786,75 @@ + srcdir=$(fsrcdir) \ + -f ../Makefile \ + $(GNATRTL_OBJS) +- $(RM) rts/libgna*$(soext) rts/libgna*$(soext).1 +- cd rts; ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ ++ $(RM) $(build_dir)/libgna*$(soext) $(build_dir)/libgna*$(soext).1 ++ cd $(build_dir); ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ + $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ -o $(notdir $@).1 \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ + g-trasym.o convert_addresses.o \ +- $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ $(SO_OPTS)$(notdir $@).1 \ + $(MISCLIB) -lm +- cd rts; ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ ++ cd $(build_dir); $(LN_S) $(notdir $@).1 $(notdir $@) ++ cd $(build_dir); ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ + $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ -o $(libgnarl).1 \ + $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext).1 \ ++ $(SO_OPTS)$(libgnarl).1 \ + $(THREADSLIB) +- cd rts; for lib in gnat gnarl; do \ +- l=lib$${lib}$(hyphen)$(LIBRARY_VERSION)$(soext); \ +- $(LN_S) $$l.1 $$l; \ +- done +-# Delete the object files, lest they be linked statically into the tools +-# executables. Only the .ali, .a and .so files must remain. +- rm -f rts/*.o +- $(CHMOD) a-wx rts/*.ali +- +-gnatlib-shared-dual: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) rts/*.o rts/*.ali +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-default +- +-gnatlib-shared-dual-win32: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) rts/*.o rts/*.ali +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib-shared-win32 +- +-# ??? we need to add the option to support auto-import of arrays/records to +-# the GNATLIBFLAGS when this will be supported by GNAT. At this point we will +-# use the gnatlib-shared-dual-win32 target to build the GNAT runtimes on +-# Windows. +-gnatlib-shared-win32: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) rts/libgna*$(soext) +- cd rts; ../../xgcc -B../../ -shared $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) $(MISCLIB) +- cd rts; ../../xgcc -B../../ -shared $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) +- +-gnatlib-shared-darwin: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) \ +- -fno-common" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) rts/libgnat$(soext) rts/libgnarl$(soext) +- cd rts; ../../xgcc -B../../ -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ +- $(SO_OPTS) \ +- $(MISCLIB) -lm +- cd rts; ../../xgcc -B../../ -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- $(GNATRTL_TASKING_OBJS) \ +- $(SO_OPTS) \ +- $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) +- cd rts; $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnat$(soext) +- cd rts; $(LN_S) libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnarl$(soext) +- +-gnatlib-shared-vms: +- $(MAKE) $(FLAGS_TO_PASS) \ +- GNATLIBFLAGS="$(GNATLIBFLAGS)" \ +- GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ +- THREAD_KIND="$(THREAD_KIND)" \ +- gnatlib +- $(RM) rts/libgna*$(soext) +- cd rts && echo "case_sensitive=yes" > SYMVEC_$$$$.opt && \ +- objdump --syms $(LIBGNAT_OBJS) $(GNATRTL_NONTASKING_OBJS) | \ +- $(SHLIB_SYMVEC) >> SYMVEC_$$$$.opt && \ +- echo "case_sensitive=NO" >> SYMVEC_$$$$.opt && \ +- ../../xgcc -g -B../../ -shared -shared-libgcc \ +- -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) libgnat.a \ +- sys\$$library:trace.exe \ +- --for-linker=/noinform \ +- --for-linker=SYMVEC_$$$$.opt \ +- --for-linker=gsmatch=equal,$(GSMATCH_VERSION) +- cd rts && echo "case_sensitive=yes" > SYMVEC_$$$$.opt && \ +- objdump --syms $(GNATRTL_TASKING_OBJS) | \ +- $(SHLIB_SYMVEC) >> SYMVEC_$$$$.opt && \ +- echo "case_sensitive=NO" >> SYMVEC_$$$$.opt && \ +- ../../xgcc -g -B../../ -shared -shared-libgcc \ +- -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- libgnarl.a libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ +- sys\$$library:trace.exe \ +- --for-linker=/noinform \ +- --for-linker=SYMVEC_$$$$.opt \ +- --for-linker=gsmatch=equal,$(GSMATCH_VERSION) ++ cd $(build_dir); $(LN_S) $(libgnarl).1 $(libgnarl) ++# TODO: enable building the shared libgnala ++ifeq (libgnala-shared-enabled,yes) ++ cd $(build_dir); ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ ++ $(TARGET_LIBGCC2_CFLAGS) \ ++ -o $(libgnala).1 \ ++ $(GNATRTL_LINEARALGEBRA_OBJS) \ ++ $(SO_OPTS)$(libgnala).1 ++ cd $(build_dir); $(LN_S) $(libgnala).1 $(libgnala) ++endif + +-gnatlib-shared: ++gnatlib-shared-dual: gnatlib-static-zcx gnatlib-static-sjlj gnatlib-shared-zcx ++ ++gnatlib-shared-zcx: rts = $(subst gnatlib,rts,$@) ++gnatlib-shared-zcx: gnatlib-sources-zcx/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-zcx $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ ++ EH_MECHANISM="-gcc" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + THREAD_KIND="$(THREAD_KIND)" \ + TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ +- $(GNATLIB_SHARED) ++ $(rts)/$(libgnat) + +-gnatlib-sjlj: +- $(MAKE) $(FLAGS_TO_PASS) EH_MECHANISM="" ../stamp-gnatlib1 +- sed -e 's/ZCX_By_Default.*/ZCX_By_Default : constant Boolean := False;/' rts/system.ads > rts/s.ads +- $(MV) rts/s.ads rts/system.ads ++gnatlib-static-sjlj: rts = $(subst gnatlib,rts,$@) ++gnatlib-static-sjlj: gnatlib-sources-sjlj/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-sjlj $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ + EH_MECHANISM="" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" gnatlib ++ TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ ++ $(rts)/libgnat$(arext) + +-gnatlib-zcx: +- $(MAKE) $(FLAGS_TO_PASS) EH_MECHANISM="-gcc" ../stamp-gnatlib1 +- sed -e 's/ZCX_By_Default.*/ZCX_By_Default : constant Boolean := True;/' rts/system.ads > rts/s.ads +- $(MV) rts/s.ads rts/system.ads ++gnatlib-static-zcx: rts = $(subst gnatlib,rts,$@) ++gnatlib-static-zcx: gnatlib-sources-zcx/a-except.ads ++ if [ ! -d $(rts) ] ; then \ ++ cp -a gnatlib-sources-zcx $(rts); \ ++ $(MV) $(rts)/s.ads $(rts)/system.ads; \ ++ fi + $(MAKE) $(FLAGS_TO_PASS) \ + EH_MECHANISM="-gcc" \ + GNATLIBFLAGS="$(GNATLIBFLAGS)" \ + GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \ + THREAD_KIND="$(THREAD_KIND)" \ +- TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" gnatlib ++ TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \ ++ $(rts)/libgnat$(arext) + + # .s files for cross-building + gnat-cross: force +@@ -1864,6 +1862,10 @@ + + ADA_INCLUDE_DIR = $(libsubdir)/adainclude + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib ++ADA_NATIVE_INCLUDE_DIR = $(libsubdir)/rts-native/adainclude ++ADA_NATIVE_RTL_OBJ_DIR = $(libsubdir)/rts-native/adalib ++ADA_SJLJ_INCLUDE_DIR = $(libsubdir)/rts-sjlj/adainclude ++ADA_SJLJ_RTL_OBJ_DIR = $(libsubdir)/rts-sjlj/adalib + + # force no sibling call optimization on s-traceb.o so the number of stack + # frames to be skipped when computing a call chain is not modified by +Index: src/gnattools/Makefile.in +=================================================================== +--- src.orig/gnattools/Makefile.in ++++ src/gnattools/Makefile.in +@@ -34,12 +34,13 @@ + LN_S=@LN_S@ + target_noncanonical=@target_noncanonical@ + ++RTS=../gcc/ada/rts-shared-zcx + CFLAGS=-O2 -Wall + ADA_CFLAGS=-O2 -gnatn +-ADA_INCLUDES=-nostdinc -I- -I. -I../gcc/ada/rts -I../libgnatvsn -I../libgnatprj ++ADA_INCLUDES=-nostdinc -I- -I. -I$(RTS) -I../libgnatvsn -I../libgnatprj + LIB_VERSION=$(strip $(shell grep ' Library_Version :' \ + ../libgnatvsn/gnatvsn.ads | sed -e 's/.*"\(.*\)".*/\1/')) +-ADA_LIBS := -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ADA_LIBS := -L$(RTS) -lgnat-$(LIB_VERSION) + ADA_LIBS += -L../libgnatvsn -lgnatvsn + ADA_LIBS += -L../libgnatprj -lgnatprj + +@@ -109,6 +110,7 @@ + + .PHONY: gnattools gnattools-native gnattools-cross regnattools + gnattools: @default_gnattools_target@ ++ (cd $(RTS); if [ -d obj ]; then mv obj/* .; rmdir obj; fi) + + BODIES := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.adb,$(f)))) + SPECS := $(foreach f,$(OBJECTS),$(wildcard $(patsubst %.o,@srcdir@/../gcc/ada/%.ads,$(f)))) +@@ -119,9 +121,12 @@ + for file in $(BODIES) $(SPECS); do \ + $(LN_S) -f $$file .; \ + done ++# Move the RTS object files away lest they be linked statically into the ++# tools. Only the .ali, .a and .so files must remain. ++ (cd $(RTS); mkdir obj; mv *.o obj; chmod a-wx *.ali) + touch $@ + +-gnattools-native: ../gcc/ada/rts/libgnat-$(LIB_VERSION).so ++gnattools-native: $(RTS)/libgnat-$(LIB_VERSION).so + gnattools-native: ../libgnatvsn/libgnatvsn.so + gnattools-native: stamp-gnattools-sources + gnattools-native: $(TOOLS) gnatbl +@@ -137,7 +142,7 @@ + $(GCC) -o $@ $^ \ + ../libgnatprj/libgnatprj.a \ + ../libgnatvsn/libgnatvsn.a \ +- ../gcc/ada/rts/libgnat.a \ ++ ../gcc/ada/rts-static-zcx/libgnat.a \ + ../libiberty/libiberty.a + + gnatlink: $(GNATLINK_OBJS) b_gnatl.o +@@ -155,7 +160,7 @@ + $(GCC) -o $@ $(ADA_CFLAGS) $^ \ + ../libgnatprj/libgnatprj.a \ + ../libgnatvsn/libgnatvsn.a \ +- ../gcc/ada/rts/libgnat.a \ ++ ../gcc/ada/rts-static-zcx/libgnat.a \ + ../libiberty/libiberty.a + + gnatmake: $(GNATMAKE_OBJS) b_gnatm.o +Index: src/libgnatprj/Makefile.in +=================================================================== +--- src.orig/libgnatprj/Makefile.in ++++ src/libgnatprj/Makefile.in +@@ -25,7 +25,8 @@ + @srcdir@/../gcc/ada/gnatvsn.ads | \ + sed -e 's/.*"\(.*\)".*/\1/')) + GCC:=../gcc/xgcc -B../gcc/ +-LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++RTS:=../gcc/ada/rts-shared-zcx ++LIBGNAT_JUST_BUILT := -nostdinc -I$(RTS) + LIBGNATVSN := -I../libgnatvsn + CFLAGS := -g -O2 + ADAFLAGS := -g -O2 -gnatn +@@ -65,7 +66,7 @@ + libgnatprj.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) + : # Make libgnatprj.so + $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ +- -L../gcc/ada/rts -lgnat-$(LIB_VERSION) \ ++ -L$(RTS) -lgnat-$(LIB_VERSION) \ + -L../libgnatvsn -lgnatvsn + $(LN_S) -f libgnatprj.so.$(LIB_VERSION) libgnatprj.so + chmod a=r obj-shared/*.ali +Index: src/libgnatvsn/Makefile.in +=================================================================== +--- src.orig/libgnatvsn/Makefile.in ++++ src/libgnatvsn/Makefile.in +@@ -25,7 +25,8 @@ + @srcdir@/../gcc/ada/gnatvsn.ads | \ + sed -e 's/.*"\(.*\)".*/\1/')) + GCC:=../gcc/xgcc -B../gcc/ +-LIBGNAT_JUST_BUILT := -nostdinc -I../gcc/ada/rts ++RTS:=../gcc/ada/rts-shared-zcx ++LIBGNAT_JUST_BUILT := -nostdinc -I$(RTS) + CFLAGS := -g -O2 -gnatn + BASEVER := $(shell cat @srcdir@/../gcc/BASE-VER) + DEVPHASE := $(shell cat @srcdir@/../gcc/DEV-PHASE) +@@ -64,7 +65,7 @@ + libgnatvsn.so.$(LIB_VERSION): $(addprefix obj-shared/,$(OBJECTS)) + : # Make libgnatvsn.so + $(GCC) -o $@ -shared -fPIC -Wl,--soname,$@ $^ \ +- -L../gcc/ada/rts -lgnat-$(LIB_VERSION) ++ -L$(RTS) -lgnat-$(LIB_VERSION) + ln -s libgnatvsn.so.$(LIB_VERSION) libgnatvsn.so + chmod a=r obj-shared/*.ali + # Make the .ali files, but not the .o files, visible to the gnat tools. +Index: src/gcc/ada/Make-lang.in +=================================================================== +--- src.orig/gcc/ada/Make-lang.in ++++ src/gcc/ada/Make-lang.in +@@ -62,7 +62,8 @@ + "ADA_FOR_TARGET=$(ADA_FOR_TARGET)" \ + "INSTALL=$(INSTALL)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ +- "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" ++ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ ++ "GCC_FOR_TARGET=$(GCC_FOR_TARGET)" + + # Say how to compile Ada programs. + .SUFFIXES: .ada .adb .ads +Index: src/gcc/ada/system-linux-mips.ads +=================================================================== +--- /dev/null ++++ src/gcc/ada/system-linux-mips.ads +@@ -0,0 +1,154 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNAT RUN-TIME COMPONENTS -- ++-- -- ++-- S Y S T E M -- ++-- -- ++-- S p e c -- ++-- (GNU-Linux/MIPS Version) -- ++-- -- ++-- Copyright (C) 1992-2005, Free Software Foundation, Inc. -- ++-- -- ++-- This specification is derived from the Ada Reference Manual for use with -- ++-- GNAT. The copyright notice above, and the license provisions that follow -- ++-- apply solely to the contents of the part following the private keyword. -- ++-- -- ++-- GNAT is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 2, or (at your option) any later ver- -- ++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- ++-- OUT 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 distributed with GNAT; see file COPYING. If not, write -- ++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- ++-- Boston, MA 02110-1301, USA. -- ++-- -- ++-- As a special exception, if other files instantiate generics from this -- ++-- unit, or you link this unit with other files to produce an executable, -- ++-- this unit does not by itself cause the resulting executable to be -- ++-- covered by the GNU General Public License. This exception does not -- ++-- however invalidate any other reasons why the executable file might be -- ++-- covered by the GNU Public License. -- ++-- -- ++-- GNAT was originally developed by the GNAT team at New York University. -- ++-- Extensive contributions were provided by Ada Core Technologies Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++package System is ++ pragma Pure; ++ -- Note that we take advantage of the implementation permission to make ++ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada ++ -- 2005, this is Pure in any case (AI-362). ++ ++ type Name is (SYSTEM_NAME_GNAT); ++ System_Name : constant Name := SYSTEM_NAME_GNAT; ++ ++ -- System-Dependent Named Numbers ++ ++ Min_Int : constant := Long_Long_Integer'First; ++ Max_Int : constant := Long_Long_Integer'Last; ++ ++ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; ++ Max_Nonbinary_Modulus : constant := Integer'Last; ++ ++ Max_Base_Digits : constant := Long_Long_Float'Digits; ++ Max_Digits : constant := Long_Long_Float'Digits; ++ ++ Max_Mantissa : constant := 63; ++ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); ++ ++ Tick : constant := 0.000_001; ++ ++ -- Storage-related Declarations ++ ++ type Address is private; ++ Null_Address : constant Address; ++ ++ Storage_Unit : constant := 8; ++ Word_Size : constant := 32; ++ Memory_Size : constant := 2 ** 32; ++ ++ -- Address comparison ++ ++ function "<" (Left, Right : Address) return Boolean; ++ function "<=" (Left, Right : Address) return Boolean; ++ function ">" (Left, Right : Address) return Boolean; ++ function ">=" (Left, Right : Address) return Boolean; ++ function "=" (Left, Right : Address) return Boolean; ++ ++ pragma Import (Intrinsic, "<"); ++ pragma Import (Intrinsic, "<="); ++ pragma Import (Intrinsic, ">"); ++ pragma Import (Intrinsic, ">="); ++ pragma Import (Intrinsic, "="); ++ ++ -- Other System-Dependent Declarations ++ ++ type Bit_Order is (High_Order_First, Low_Order_First); ++ Default_Bit_Order : constant Bit_Order := High_Order_First; ++ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning ++ ++ -- Priority-related Declarations (RM D.1) ++ ++ Max_Priority : constant Positive := 30; ++ Max_Interrupt_Priority : constant Positive := 31; ++ ++ subtype Any_Priority is Integer range 0 .. 31; ++ subtype Priority is Any_Priority range 0 .. 30; ++ subtype Interrupt_Priority is Any_Priority range 31 .. 31; ++ ++ Default_Priority : constant Priority := 15; ++ ++private ++ ++ type Address is mod Memory_Size; ++ Null_Address : constant Address := 0; ++ ++ -------------------------------------- ++ -- System Implementation Parameters -- ++ -------------------------------------- ++ ++ -- These parameters provide information about the target that is used ++ -- by the compiler. They are in the private part of System, where they ++ -- can be accessed using the special circuitry in the Targparm unit ++ -- whose source should be consulted for more detailed descriptions ++ -- of the individual switch values. ++ ++ AAMP : constant Boolean := False; ++ Backend_Divide_Checks : constant Boolean := False; ++ Backend_Overflow_Checks : constant Boolean := False; ++ Command_Line_Args : constant Boolean := True; ++ Compiler_System_Version : constant Boolean := False; ++ Configurable_Run_Time : constant Boolean := False; ++ Denorm : constant Boolean := True; ++ Duration_32_Bits : constant Boolean := False; ++ Exit_Status_Supported : constant Boolean := True; ++ Fractional_Fixed_Ops : constant Boolean := False; ++ Frontend_Layout : constant Boolean := False; ++ Functions_Return_By_DSP : constant Boolean := False; ++ Machine_Overflows : constant Boolean := False; ++ Machine_Rounds : constant Boolean := True; ++ OpenVMS : constant Boolean := False; ++ Preallocated_Stacks : constant Boolean := False; ++ Signed_Zeros : constant Boolean := True; ++ Stack_Check_Default : constant Boolean := False; ++ Stack_Check_Probes : constant Boolean := False; ++ Support_64_Bit_Divides : constant Boolean := True; ++ Support_Aggregates : constant Boolean := True; ++ Support_Composite_Assign : constant Boolean := True; ++ Support_Composite_Compare : constant Boolean := True; ++ Support_Long_Shifts : constant Boolean := True; ++ Suppress_Standard_Library : constant Boolean := False; ++ Use_Ada_Main_Program_Name : constant Boolean := False; ++ ZCX_By_Default : constant Boolean := True; ++ GCC_ZCX_Support : constant Boolean := True; ++ Front_End_ZCX_Support : constant Boolean := False; ++ ++ -- Obsolete entries, to be removed eventually (bootstrap issues!) ++ ++ High_Integrity_Mode : constant Boolean := False; ++ Long_Shifts_Inlined : constant Boolean := True; ++ ++end System; +Index: src/gcc/ada/system-linux-mipsel.ads +=================================================================== +--- /dev/null ++++ src/gcc/ada/system-linux-mipsel.ads +@@ -0,0 +1,154 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNAT RUN-TIME COMPONENTS -- ++-- -- ++-- S Y S T E M -- ++-- -- ++-- S p e c -- ++-- (GNU-Linux/MIPSEL Version) -- ++-- -- ++-- Copyright (C) 1992-2005, Free Software Foundation, Inc. -- ++-- -- ++-- This specification is derived from the Ada Reference Manual for use with -- ++-- GNAT. The copyright notice above, and the license provisions that follow -- ++-- apply solely to the contents of the part following the private keyword. -- ++-- -- ++-- GNAT is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 2, or (at your option) any later ver- -- ++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- ++-- OUT 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 distributed with GNAT; see file COPYING. If not, write -- ++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- ++-- Boston, MA 02110-1301, USA. -- ++-- -- ++-- As a special exception, if other files instantiate generics from this -- ++-- unit, or you link this unit with other files to produce an executable, -- ++-- this unit does not by itself cause the resulting executable to be -- ++-- covered by the GNU General Public License. This exception does not -- ++-- however invalidate any other reasons why the executable file might be -- ++-- covered by the GNU Public License. -- ++-- -- ++-- GNAT was originally developed by the GNAT team at New York University. -- ++-- Extensive contributions were provided by Ada Core Technologies Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++package System is ++ pragma Pure; ++ -- Note that we take advantage of the implementation permission to make ++ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada ++ -- 2005, this is Pure in any case (AI-362). ++ ++ type Name is (SYSTEM_NAME_GNAT); ++ System_Name : constant Name := SYSTEM_NAME_GNAT; ++ ++ -- System-Dependent Named Numbers ++ ++ Min_Int : constant := Long_Long_Integer'First; ++ Max_Int : constant := Long_Long_Integer'Last; ++ ++ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; ++ Max_Nonbinary_Modulus : constant := Integer'Last; ++ ++ Max_Base_Digits : constant := Long_Long_Float'Digits; ++ Max_Digits : constant := Long_Long_Float'Digits; ++ ++ Max_Mantissa : constant := 63; ++ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); ++ ++ Tick : constant := 0.000_001; ++ ++ -- Storage-related Declarations ++ ++ type Address is private; ++ Null_Address : constant Address; ++ ++ Storage_Unit : constant := 8; ++ Word_Size : constant := 32; ++ Memory_Size : constant := 2 ** 32; ++ ++ -- Address comparison ++ ++ function "<" (Left, Right : Address) return Boolean; ++ function "<=" (Left, Right : Address) return Boolean; ++ function ">" (Left, Right : Address) return Boolean; ++ function ">=" (Left, Right : Address) return Boolean; ++ function "=" (Left, Right : Address) return Boolean; ++ ++ pragma Import (Intrinsic, "<"); ++ pragma Import (Intrinsic, "<="); ++ pragma Import (Intrinsic, ">"); ++ pragma Import (Intrinsic, ">="); ++ pragma Import (Intrinsic, "="); ++ ++ -- Other System-Dependent Declarations ++ ++ type Bit_Order is (High_Order_First, Low_Order_First); ++ Default_Bit_Order : constant Bit_Order := Low_Order_First; ++ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning ++ ++ -- Priority-related Declarations (RM D.1) ++ ++ Max_Priority : constant Positive := 30; ++ Max_Interrupt_Priority : constant Positive := 31; ++ ++ subtype Any_Priority is Integer range 0 .. 31; ++ subtype Priority is Any_Priority range 0 .. 30; ++ subtype Interrupt_Priority is Any_Priority range 31 .. 31; ++ ++ Default_Priority : constant Priority := 15; ++ ++private ++ ++ type Address is mod Memory_Size; ++ Null_Address : constant Address := 0; ++ ++ -------------------------------------- ++ -- System Implementation Parameters -- ++ -------------------------------------- ++ ++ -- These parameters provide information about the target that is used ++ -- by the compiler. They are in the private part of System, where they ++ -- can be accessed using the special circuitry in the Targparm unit ++ -- whose source should be consulted for more detailed descriptions ++ -- of the individual switch values. ++ ++ AAMP : constant Boolean := False; ++ Backend_Divide_Checks : constant Boolean := False; ++ Backend_Overflow_Checks : constant Boolean := False; ++ Command_Line_Args : constant Boolean := True; ++ Compiler_System_Version : constant Boolean := False; ++ Configurable_Run_Time : constant Boolean := False; ++ Denorm : constant Boolean := True; ++ Duration_32_Bits : constant Boolean := False; ++ Exit_Status_Supported : constant Boolean := True; ++ Fractional_Fixed_Ops : constant Boolean := False; ++ Frontend_Layout : constant Boolean := False; ++ Functions_Return_By_DSP : constant Boolean := False; ++ Machine_Overflows : constant Boolean := False; ++ Machine_Rounds : constant Boolean := True; ++ OpenVMS : constant Boolean := False; ++ Preallocated_Stacks : constant Boolean := False; ++ Signed_Zeros : constant Boolean := True; ++ Stack_Check_Default : constant Boolean := False; ++ Stack_Check_Probes : constant Boolean := False; ++ Support_64_Bit_Divides : constant Boolean := True; ++ Support_Aggregates : constant Boolean := True; ++ Support_Composite_Assign : constant Boolean := True; ++ Support_Composite_Compare : constant Boolean := True; ++ Support_Long_Shifts : constant Boolean := True; ++ Suppress_Standard_Library : constant Boolean := False; ++ Use_Ada_Main_Program_Name : constant Boolean := False; ++ ZCX_By_Default : constant Boolean := True; ++ GCC_ZCX_Support : constant Boolean := True; ++ Front_End_ZCX_Support : constant Boolean := False; ++ ++ -- Obsolete entries, to be removed eventually (bootstrap issues!) ++ ++ High_Integrity_Mode : constant Boolean := False; ++ Long_Shifts_Inlined : constant Boolean := True; ++ ++end System; +Index: src/gcc/ada/g-soccon-linux-mips.ads +=================================================================== +--- /dev/null ++++ src/gcc/ada/g-soccon-linux-mips.ads +@@ -0,0 +1,184 @@ ++------------------------------------------------------------------------------ ++-- -- ++-- GNAT COMPILER COMPONENTS -- ++-- -- ++-- G N A T . S O C K E T S . C O N S T A N T S -- ++-- -- ++-- S p e c -- ++-- -- ++-- Copyright (C) 2000-2005, Free Software Foundation, Inc. -- ++-- -- ++-- GNAT is free software; you can redistribute it and/or modify it under -- ++-- terms of the GNU General Public License as published by the Free Soft- -- ++-- ware Foundation; either version 2, or (at your option) any later ver- -- ++-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- ++-- OUT 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 distributed with GNAT; see file COPYING. If not, write -- ++-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- ++-- Boston, MA 02110-1301, USA. -- ++-- -- ++-- As a special exception, if other files instantiate generics from this -- ++-- unit, or you link this unit with other files to produce an executable, -- ++-- this unit does not by itself cause the resulting executable to be -- ++-- covered by the GNU General Public License. This exception does not -- ++-- however invalidate any other reasons why the executable file might be -- ++-- covered by the GNU Public License. -- ++-- -- ++-- GNAT was originally developed by the GNAT team at New York University. -- ++-- Extensive contributions were provided by Ada Core Technologies Inc. -- ++-- -- ++------------------------------------------------------------------------------ ++ ++-- This package provides target dependent definitions of constant for use ++-- by the GNAT.Sockets package (g-socket.ads). This package should not be ++-- directly with'ed by an applications program. ++ ++-- This is the version for mips-linux, manually edited for the first shot ++-- no mips hardware at hand ++-- using http://www.gelato.unsw.edu.au/lxr/source/include/asm-mips/socket.h ++-- in order to find differents values ++-- This file is generated automatically, do not modify it by hand! Instead, ++-- make changes to gen-soccon.c and re-run it on each target. ++ ++package GNAT.Sockets.Constants is ++ ++ -------------- ++ -- Families -- ++ -------------- ++ ++ AF_INET : constant := 2; -- IPv4 address family ++ AF_INET6 : constant := 10; -- IPv6 address family ++ ++ ----------- ++ -- Modes -- ++ ----------- ++ ++ SOCK_STREAM : constant := 1; -- Stream socket ++ SOCK_DGRAM : constant := 2; -- Datagram socket ++ ++ ------------------- ++ -- Socket errors -- ++ ------------------- ++ ++ EACCES : constant := 13; -- Permission denied ++ EADDRINUSE : constant := 98; -- Address already in use ++ EADDRNOTAVAIL : constant := 99; -- Cannot assign address ++ EAFNOSUPPORT : constant := 97; -- Addr family not supported ++ EALREADY : constant := 114; -- Operation in progress ++ EBADF : constant := 9; -- Bad file descriptor ++ ECONNABORTED : constant := 103; -- Connection aborted ++ ECONNREFUSED : constant := 111; -- Connection refused ++ ECONNRESET : constant := 104; -- Connection reset by peer ++ EDESTADDRREQ : constant := 89; -- Destination addr required ++ EFAULT : constant := 14; -- Bad address ++ EHOSTDOWN : constant := 112; -- Host is down ++ EHOSTUNREACH : constant := 113; -- No route to host ++ EINPROGRESS : constant := 115; -- Operation now in progress ++ EINTR : constant := 4; -- Interrupted system call ++ EINVAL : constant := 22; -- Invalid argument ++ EIO : constant := 5; -- Input output error ++ EISCONN : constant := 106; -- Socket already connected ++ ELOOP : constant := 40; -- Too many symbolic lynks ++ EMFILE : constant := 24; -- Too many open files ++ EMSGSIZE : constant := 90; -- Message too long ++ ENAMETOOLONG : constant := 36; -- Name too long ++ ENETDOWN : constant := 100; -- Network is down ++ ENETRESET : constant := 102; -- Disconn. on network reset ++ ENETUNREACH : constant := 101; -- Network is unreachable ++ ENOBUFS : constant := 105; -- No buffer space available ++ ENOPROTOOPT : constant := 92; -- Protocol not available ++ ENOTCONN : constant := 107; -- Socket not connected ++ ENOTSOCK : constant := 88; -- Operation on non socket ++ EOPNOTSUPP : constant := 95; -- Operation not supported ++ EPFNOSUPPORT : constant := 96; -- Unknown protocol family ++ EPROTONOSUPPORT : constant := 93; -- Unknown protocol ++ EPROTOTYPE : constant := 91; -- Unknown protocol type ++ ESHUTDOWN : constant := 108; -- Cannot send once shutdown ++ ESOCKTNOSUPPORT : constant := 94; -- Socket type not supported ++ ETIMEDOUT : constant := 110; -- Connection timed out ++ ETOOMANYREFS : constant := 109; -- Too many references ++ EWOULDBLOCK : constant := 11; -- Operation would block ++ ++ ----------------- ++ -- Host errors -- ++ ----------------- ++ ++ HOST_NOT_FOUND : constant := 1; -- Unknown host ++ TRY_AGAIN : constant := 2; -- Host name lookup failure ++ NO_DATA : constant := 4; -- No data record for name ++ NO_RECOVERY : constant := 3; -- Non recoverable errors ++ ++ ------------------- ++ -- Control flags -- ++ ------------------- ++ ++ FIONBIO : constant := 16#667e#; -- Set/clear non-blocking io ++ FIONREAD : constant := 16#467f#; -- How many bytes to read ++ ++ -------------------- ++ -- Shutdown modes -- ++ -------------------- ++ ++ SHUT_RD : constant := 0; -- No more recv ++ SHUT_WR : constant := 1; -- No more send ++ SHUT_RDWR : constant := 2; -- No more recv/send ++ ++ --------------------- ++ -- Protocol levels -- ++ --------------------- ++ ++ SOL_SOCKET : constant := 1; -- Options for socket level ++ IPPROTO_IP : constant := 0; -- Dummy protocol for IP ++ IPPROTO_UDP : constant := 17; -- UDP ++ IPPROTO_TCP : constant := 6; -- TCP ++ ++ ------------------- ++ -- Request flags -- ++ ------------------- ++ ++ MSG_OOB : constant := 1; -- Process out-of-band data ++ MSG_PEEK : constant := 2; -- Peek at incoming data ++ MSG_EOR : constant := 128; -- Send end of record ++ MSG_WAITALL : constant := 256; -- Wait for full reception ++ MSG_NOSIGNAL : constant := 16384; -- No SIGPIPE on send ++ MSG_Forced_Flags : constant := MSG_NOSIGNAL; ++ -- Flags set on all send(2) calls ++ ++ -------------------- ++ -- Socket options -- ++ -------------------- ++ ++ TCP_NODELAY : constant := 1; -- Do not coalesce packets ++ SO_REUSEADDR : constant := 4; -- Bind reuse local address ++ SO_KEEPALIVE : constant := 8; -- Enable keep-alive msgs ++ SO_LINGER : constant := 16#80#; -- Defer close to flush data ++ SO_BROADCAST : constant := 16#20#; -- Can send broadcast msgs ++ SO_SNDBUF : constant := 16#1001#; -- Set/get send buffer size ++ SO_RCVBUF : constant := 16#1002#; -- Set/get recv buffer size ++ SO_SNDTIMEO : constant := 16#1005#; -- Emission timeout ++ SO_RCVTIMEO : constant := 16#1006#; -- Reception timeout ++ SO_ERROR : constant := 16#1007#; -- Get/clear error status ++ IP_MULTICAST_IF : constant := 32; -- Set/get mcast interface ++ IP_MULTICAST_TTL : constant := 33; -- Set/get multicast TTL ++ IP_MULTICAST_LOOP : constant := 34; -- Set/get mcast loopback ++ IP_ADD_MEMBERSHIP : constant := 35; -- Join a multicast group ++ IP_DROP_MEMBERSHIP : constant := 36; -- Leave a multicast group ++ ++ ------------------- ++ -- System limits -- ++ ------------------- ++ ++ IOV_MAX : constant := 2147483647; -- Maximum writev iovcnt ++ ++ ---------------------- ++ -- Type definitions -- ++ ---------------------- ++ ++ -- Sizes (in bytes) of the components of struct timeval ++ ++ SIZEOF_tv_sec : constant := 4; -- tv_sec ++ SIZEOF_tv_usec : constant := 4; -- tv_usec ++ ++end GNAT.Sockets.Constants; diff --git a/recipes/gcc/gcc-svn/debian/ada-symbolic-tracebacks.dpatch b/recipes/gcc/gcc-svn/debian/ada-symbolic-tracebacks.dpatch new file mode 100644 index 0000000000..d39accfdb5 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ada-symbolic-tracebacks.dpatch @@ -0,0 +1,346 @@ +#! /bin/sh -e + +# DP: - Enable support for symbolic tracebacks in exceptions (delete the dummy +# DP: convert_addresses from adaint.c, and provide a real one separately.) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Ported Jürgen Pfeifer's patch to enable symbolic tracebacks on Debian +GNU/Linux. + +The binary distribution of GNAT 3.15p comes with an old version of +binutils that includes a library, libaddr2line.a. This library does +not exist in recent versions of binutils. The patch works around this +by calling /usr/bin/addr2line (still part of binutils) and parsing the +output. See debian/convert_addresses.c for the gory details. + +I have modified convert_addresses.c to not use a shell script anymore; +Debian controls the version of binutils which is installed. Also, I +use execve instead of execle. + +-- +Ludovic Brenta. + +# ' make emacs highlighting happy + +Index: gcc/ada/Makefile.in +=================================================================== +--- gcc/ada/Makefile.in.orig 2008-01-13 22:19:26.000000000 +0100 ++++ gcc/ada/Makefile.in 2008-01-29 11:56:42.178635045 +0100 +@@ -1655,7 +1655,7 @@ + a-nucoar.o a-nurear.o i-forbla.o i-forlap.o s-gearop.o + + GNATRTL_OBJS = $(GNATRTL_NONTASKING_OBJS) $(GNATRTL_TASKING_OBJS) \ +- $(GNATRTL_LINEARALGEBRA_OBJS) g-trasym.o memtrack.o ++ $(GNATRTL_LINEARALGEBRA_OBJS) g-trasym.o memtrack.o convert_addresses.o + + # Default run time files + +@@ -1810,7 +1810,6 @@ + for file in rts/*.ali; do \ + $(INSTALL_DATA_DATE) $$file $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ + done +- -$(INSTALL_DATA) rts/g-trasym$(objext) $(DESTDIR)$(ADA_RTL_OBJ_DIR) + -cd rts; for file in *$(arext);do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(ADA_RTL_OBJ_DIR); \ + $(RANLIB_FOR_TARGET) $(DESTDIR)$(ADA_RTL_OBJ_DIR)/$$file; \ +@@ -1907,7 +1906,7 @@ + $(GNATRTL_OBJS) + $(RM) rts/libgnat$(arext) rts/libgnarl$(arext) + $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgnat$(arext) \ +- $(addprefix rts/,$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS)) ++ $(addprefix rts/,$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) g-trasym.o convert_addresses.o) + ifneq ($(PREFIX_OBJS),) + $(AR_FOR_TARGET) $(AR_FLAGS) rts/libgccprefix$(arext) \ + $(PREFIX_OBJS); +@@ -1940,6 +1939,7 @@ + $(TARGET_LIBGCC2_CFLAGS) \ + -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ ++ g-trasym.o convert_addresses.o \ + $(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(MISCLIB) -lm + cd rts; ../../xgcc -B../../ -shared $(GNATLIBCFLAGS) \ +@@ -2183,6 +2183,7 @@ + sysdep.o : sysdep.c + raise-gcc.o : raise-gcc.c raise.h + raise.o : raise.c raise.h ++convert_addresses.o : convert_addresses.c + vx_stack_info.o : vx_stack_info.c + + gen-soccon: gen-soccon.c gsocket.h +Index: gcc/ada/adaint.c +=================================================================== +--- gcc/ada/adaint.c.orig 2008-01-13 22:19:26.000000000 +0100 ++++ gcc/ada/adaint.c 2008-01-29 11:56:06.614450462 +0100 +@@ -2852,35 +2852,6 @@ + } + #endif + +-#if defined (CROSS_DIRECTORY_STRUCTURE) \ +- || (! ((defined (sparc) || defined (i386)) && defined (sun) \ +- && defined (__SVR4)) \ +- && ! (defined (linux) && (defined (i386) || defined (__x86_64__))) \ +- && ! (defined (linux) && defined (__ia64__)) \ +- && ! defined (__FreeBSD__) \ +- && ! defined (__hpux__) \ +- && ! defined (__APPLE__) \ +- && ! defined (_AIX) \ +- && ! (defined (__alpha__) && defined (__osf__)) \ +- && ! defined (VMS) \ +- && ! defined (__MINGW32__) \ +- && ! (defined (__mips) && defined (__sgi))) +- +-/* Dummy function to satisfy g-trasym.o. See the preprocessor conditional +- just above for a list of native platforms that provide a non-dummy +- version of this procedure in libaddr2line.a. */ +- +-void +-convert_addresses (const char *file_name ATTRIBUTE_UNUSED, +- void *addrs ATTRIBUTE_UNUSED, +- int n_addr ATTRIBUTE_UNUSED, +- void *buf ATTRIBUTE_UNUSED, +- int *len ATTRIBUTE_UNUSED) +-{ +- *len = 0; +-} +-#endif +- + #if defined (_WIN32) + int __gnat_argument_needs_quote = 1; + #else +Index: gcc/ada/convert_addresses.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/ada/convert_addresses.c 2008-01-29 11:56:06.614450462 +0100 +@@ -0,0 +1,157 @@ ++/* ++ Copyright (C) 1999 by Juergen Pfeifer ++ Ada for Linux Team (ALT) ++ ++ Permission is hereby granted, free of charge, to any person obtaining a ++ copy of this software and associated documentation files (the ++ "Software"), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, distribute with modifications, sublicense, and/or sell ++ copies of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ++ THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++ Except as contained in this notice, the name(s) of the above copyright ++ holders shall not be used in advertising or otherwise to promote the ++ sale, use or other dealings in this Software without prior written ++ authorization. ++*/ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define STDIN_FILENO 0 ++#define STDOUT_FILENO 1 ++#define MAX_LINE 1024 ++ ++#define CLOSE1 close(fd1[0]); close(fd1[1]) ++#define CLOSE2 close(fd2[0]); close(fd2[1]) ++#define RESTSIG sigaction(SIGPIPE,&oact,NULL) ++ ++void convert_addresses ++( void* addrs[], ++ int n_addr, ++ char* buf, ++ int* len) ++{ ++ int max_len = *len; ++ pid_t pid = getpid(); ++ pid_t child; ++ ++ struct sigaction act, oact; ++ ++ int fd1[2], fd2[2]; ++ char exe_name[128]; ++ ++ *buf = 0; *len = 0; ++ /* Thanx to the /proc filesystem we can very easily reference our own ++ executable image:-)*/ ++ snprintf(exe_name,sizeof(exe_name),"--exe=/proc/%ld/exe", (long)pid); ++ ++ act.sa_handler = SIG_IGN; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = 0; ++ if (sigaction(SIGPIPE,&act,&oact) < 0) ++ return; ++ ++ if (pipe(fd1) >= 0) { ++ if (pipe(fd2)>=0) { ++ if ((child = fork()) < 0) { ++ CLOSE1; CLOSE2; RESTSIG; ++ return; ++ } ++ else { ++ if (0==child) { ++ close(fd1[1]); ++ close(fd2[0]); ++ if (fd1[0] != STDIN_FILENO) { ++ if (dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO) { ++ CLOSE1; CLOSE2; ++ } ++ close(fd1[0]); ++ } ++ if (fd2[1] != STDOUT_FILENO) { ++ if (dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO) { ++ CLOSE1; CLOSE2; ++ } ++ close(fd2[1]); ++ } ++ { ++ /* As pointed out by Florian Weimer to me, it is a ++ security threat to call the script with a user defined ++ environment and using the path. That would be Trojans ++ pleasure. Therefore we use the absolute path to ++ addr2line and an empty environment. That should be ++ safe. ++ */ ++ char *const argv[] = { "addr2line", ++ exe_name, ++ "--demangle=gnat", ++ "--functions", ++ "--basenames", ++ NULL }; ++ char *const envp[] = { NULL }; ++ if (execve("/usr/bin/addr2line", argv, envp) < 0) { ++ CLOSE1; CLOSE2; ++ } ++ } ++ } ++ else { ++ int i, n; ++ char hex[16]; ++ char line[MAX_LINE + 1]; ++ char *p; ++ char *s = buf; ++ ++ /* Parent context */ ++ close(fd1[0]); ++ close(fd2[1]); ++ ++ for(i=0; i < n_addr; i++) { ++ snprintf(hex,sizeof(hex),"%p\n",addrs[i]); ++ write(fd1[1],hex,strlen(hex)); ++ n = read(fd2[0],line,MAX_LINE); ++ if (n<=0) ++ break; ++ line[n]=0; ++ /* We have approx. 16 additional chars for "%p in " clause. ++ We use this info to prevent a buffer overrun. ++ */ ++ if (n + 16 + (*len) > max_len) ++ break; ++ p = strchr(line,'\n'); ++ if (p) { ++ if (*(p+1)) { ++ *p = 0; ++ *len += snprintf(s, (max_len - (*len)), "%p in %s at %s",addrs[i], line, p+1); ++ } ++ else { ++ *len += snprintf(s, (max_len - (*len)), "%p at %s",addrs[i], line); ++ } ++ s = buf + (*len); ++ } ++ } ++ close(fd1[1]); ++ close(fd2[0]); ++ } ++ } ++ } ++ else { ++ CLOSE1; ++ } ++ } ++ RESTSIG; ++} +Index: gcc/ada/g-trasym.adb +=================================================================== +--- gcc/ada/g-trasym.adb.orig 2007-04-11 10:18:15.000000000 +0200 ++++ gcc/ada/g-trasym.adb 2008-01-29 11:56:06.614450462 +0100 +@@ -32,16 +32,16 @@ + ------------------------------------------------------------------------------ + + -- Run-time symbolic traceback support ++-- This file has been modified by Juergen Pfeifer (31-Dec-1999) for ++-- the purpose to support the Ada for Linux Team implementation of ++-- convert_addresses. This implementation has the advantage to run ++-- on the binutils as they are deployed on Linux. + + with System.Soft_Links; + with Ada.Exceptions.Traceback; use Ada.Exceptions.Traceback; + + package body GNAT.Traceback.Symbolic is + +- pragma Linker_Options ("-laddr2line"); +- pragma Linker_Options ("-lbfd"); +- pragma Linker_Options ("-liberty"); +- + package TSL renames System.Soft_Links; + + -- To perform the raw addresses to symbolic form translation we rely on a +@@ -79,9 +79,13 @@ + -- raw addresses provided in ADDRS, looked up in debug information from + -- FILENAME. LEN is filled with the result length. + -- +- -- This procedure is provided by libaddr2line on targets that support +- -- it. A dummy version is in adaint.c for other targets so that build +- -- of shared libraries doesn't generate unresolved symbols. ++ -- This is the ALT Linux specific version adapted to the binutils ++ -- deployed with most Linuxes. These binutils already have an ++ -- addr2line tool that demangles Ada symbolic names, but there are ++ -- version dependant variants for the option names. Therefore our ++ -- implementation spawns a shell script that does normalization of ++ -- the option and then executes addr2line and communicates with it ++ -- through a bidirectional pipe. + -- + -- Note that this procedure is *not* thread-safe. + +@@ -93,8 +97,9 @@ + (c_exename : System.Address) return System.Address; + pragma Import (C, locate_exec_on_path, "__gnat_locate_exec_on_path"); + +- Res : String (1 .. 256 * Traceback'Length); +- Len : Integer; ++ B_Size : constant Integer := 256 * Traceback'Length; ++ Len : Integer := B_Size; ++ Res : String (1 .. B_Size); + + use type System.Address; + diff --git a/recipes/gcc/gcc-svn/debian/alpha-ieee-doc.dpatch b/recipes/gcc/gcc-svn/debian/alpha-ieee-doc.dpatch new file mode 100644 index 0000000000..b4976bf847 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/alpha-ieee-doc.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e + +# DP: #212912 +# DP: on alpha-linux, make -mieee default and add -mieee-disable switch +# DP: to turn default off (doc patch) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- src/gcc/doc/invoke.texi~ 2005-09-29 20:00:57.638380128 +0200 ++++ src/gcc/doc/invoke.texi 2005-09-30 22:23:22.922502992 +0200 +@@ -7670,6 +7670,13 @@ + values such as not-a-number and plus/minus infinity. Other Alpha + compilers call this option @option{-ieee_with_no_inexact}. + ++DEBIAN SPECIFIC: This option is on by default, unless ++@option{-ffinite-math-only} (which is part of the @option{-ffast-math} ++set) is specified, because the software functions in the GNU libc math ++libraries generate denormalized numbers, NaNs, and infs (all of which ++will cause a programs to SIGFPE when it attempts to use the results without ++@option{-mieee}). ++ + @item -mieee-with-inexact + @opindex mieee-with-inexact + This is like @option{-mieee} except the generated code also maintains diff --git a/recipes/gcc/gcc-svn/debian/alpha-ieee.dpatch b/recipes/gcc/gcc-svn/debian/alpha-ieee.dpatch new file mode 100644 index 0000000000..4070b1a39e --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/alpha-ieee.dpatch @@ -0,0 +1,57 @@ +#! /bin/sh -e + +# DP: #212912 +# DP: on alpha-linux, make -mieee default and add -mieee-disable switch +# DP: to turn default off + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- src/gcc/config/alpha/alpha.c~ 2005-06-04 21:25:45.000000000 +0200 ++++ src/gcc/config/alpha/alpha.c 2005-09-30 22:21:33.251175568 +0200 +@@ -248,6 +248,10 @@ + { 0, 0, 0 } + }; + ++ /* If not -ffinite-math-only, enable -mieee*/ ++ if (!flag_finite_math_only) ++ target_flags |= MASK_IEEE|MASK_IEEE_CONFORMANT; ++ + /* Unicos/Mk doesn't have shared libraries. */ + if (TARGET_ABI_UNICOSMK && flag_pic) + { +#--- src/gcc/doc/invoke.texi~ 2005-09-29 20:00:57.638380128 +0200 +#+++ src/gcc/doc/invoke.texi 2005-09-30 22:23:22.922502992 +0200 +#@@ -7670,6 +7670,13 @@ +# values such as not-a-number and plus/minus infinity. Other Alpha +# compilers call this option @option{-ieee_with_no_inexact}. +# +#+DEBIAN SPECIFIC: This option is on by default, unless +#+@option{-ffinite-math-only} (which is part of the @option{-ffast-math} +#+set) is specified, because the software functions in the GNU libc math +#+libraries generate denormalized numbers, NaNs, and infs (all of which +#+will cause a programs to SIGFPE when it attempts to use the results without +#+@option{-mieee}). +#+ +# @item -mieee-with-inexact +# @opindex mieee-with-inexact +# This is like @option{-mieee} except the generated code also maintains diff --git a/recipes/gcc/gcc-svn/debian/alpha-no-ev4-directive.dpatch b/recipes/gcc/gcc-svn/debian/alpha-no-ev4-directive.dpatch new file mode 100644 index 0000000000..e3f84244d2 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/alpha-no-ev4-directive.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/config/alpha/alpha.c +=================================================================== +--- gcc/config/alpha/alpha.c (revision 115263) ++++ gcc/config/alpha/alpha.c (working copy) +@@ -9372,7 +9372,7 @@ + fputs ("\t.set nomacro\n", asm_out_file); + if (TARGET_SUPPORT_ARCH | TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX) + { +- const char *arch; ++ const char *arch = NULL; + + if (alpha_cpu == PROCESSOR_EV6 || TARGET_FIX || TARGET_CIX) + arch = "ev6"; +@@ -9382,10 +9382,9 @@ + arch = "ev56"; + else if (alpha_cpu == PROCESSOR_EV5) + arch = "ev5"; +- else +- arch = "ev4"; + +- fprintf (asm_out_file, "\t.arch %s\n", arch); ++ if (arch) ++ fprintf (asm_out_file, "\t.arch %s\n", arch); + } + } + #endif diff --git a/recipes/gcc/gcc-svn/debian/arm-unbreak-eabi-armv4t.dpatch b/recipes/gcc/gcc-svn/debian/arm-unbreak-eabi-armv4t.dpatch new file mode 100644 index 0000000000..7bb8887068 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/arm-unbreak-eabi-armv4t.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e + +# DP: Fix armv4t build on ARM + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/config/arm/linux-eabi.h.orig 2007-11-24 12:37:38.000000000 +0000 ++++ src/gcc/config/arm/linux-eabi.h 2007-11-24 12:39:41.000000000 +0000 +@@ -44,7 +44,7 @@ + The ARM10TDMI core is the default for armv5t, so set + SUBTARGET_CPU_DEFAULT to achieve this. */ + #undef SUBTARGET_CPU_DEFAULT +-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi ++#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi + + /* TARGET_BIG_ENDIAN_DEFAULT is set in + config.gcc for big endian configurations. */ diff --git a/recipes/gcc/gcc-svn/debian/boehm-gc-getnprocs.dpatch b/recipes/gcc/gcc-svn/debian/boehm-gc-getnprocs.dpatch new file mode 100644 index 0000000000..8d85cdcbb0 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/boehm-gc-getnprocs.dpatch @@ -0,0 +1,39 @@ +#! /bin/sh -e + +# DP: boehm-gc/pthread_support.c (GC_get_nprocs): Use sysconf as fallback. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: boehm-gc/pthread_support.c +=================================================================== +--- boehm-gc/pthread_support.c (revision 127207) ++++ boehm-gc/pthread_support.c (working copy) +@@ -724,7 +724,8 @@ + f = open("/proc/stat", O_RDONLY); + if (f < 0 || (len = STAT_READ(f, stat_buf, STAT_BUF_SIZE)) < 100) { + WARN("Couldn't read /proc/stat\n", 0); +- return -1; ++ /* Fallback to sysconf after the warning */ ++ return sysconf(_SC_NPROCESSORS_ONLN); + } + for (i = 0; i < len - 100; ++i) { + if (stat_buf[i] == '\n' && stat_buf[i+1] == 'c' diff --git a/recipes/gcc/gcc-svn/debian/boehm-gc-nocheck.dpatch b/recipes/gcc/gcc-svn/debian/boehm-gc-nocheck.dpatch new file mode 100644 index 0000000000..f9910dc041 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/boehm-gc-nocheck.dpatch @@ -0,0 +1,37 @@ +#! /bin/sh -e + +# DP: Disable running the boehm-gc testsuite. Hangs the buildd at least on hppa. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- boehm-gc/Makefile.in~ 2004-06-20 16:24:06.000000000 +0200 ++++ boehm-gc/Makefile.in 2004-06-23 09:43:42.000000000 +0200 +@@ -662,7 +662,8 @@ + test "$$failed" -eq 0; \ + else :; fi + check-am: $(check_PROGRAMS) +- $(MAKE) $(AM_MAKEFLAGS) check-TESTS ++ : # $(MAKE) $(AM_MAKEFLAGS) check-TESTS ++ @echo target $@ disabled for Debian build. + check: check-recursive + all-am: Makefile $(LTLIBRARIES) all-multi + installdirs: installdirs-recursive diff --git a/recipes/gcc/gcc-svn/debian/config-ml.dpatch b/recipes/gcc/gcc-svn/debian/config-ml.dpatch new file mode 100644 index 0000000000..12ef7b495a --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/config-ml.dpatch @@ -0,0 +1,94 @@ +#! /bin/sh -e + +# DP: disable some biarch libraries for biarch builds + +if [ $# -eq 3 ] && [ "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +--- config-ml.in.orig 2007-12-01 10:09:04.533972767 +0100 ++++ config-ml.in 2007-12-01 10:21:50.625529084 +0100 +@@ -301,6 +301,11 @@ + done + fi + ;; ++i[34567]86-*-*) ++ case " $multidirs " in ++ *" 64 "*) ac_configure_args="${ac_configure_args} --host=x86_64-linux-gnu" ++ esac ++ ;; + m68*-*-*) + if [ x$enable_softfloat = xno ] + then +@@ -472,9 +477,36 @@ + esac + done + fi ++ case " $multidirs " in ++ *" 64 "*) ac_configure_args="${ac_configure_args} --host=powerpc64-linux-gnu" ++ esac ++ ;; ++s390-*-*) ++ case " $multidirs " in ++ *" 64 "*) ac_configure_args="${ac_configure_args} --host=s390x-linux-gnu" ++ esac + ;; + esac + ++if [ -z "$biarch_multidir_names" ]; then ++ biarch_multidir_names="libiberty libstdc++-v3 libgfortran libmudflap libssp libffi libobjc libgomp" ++ echo "WARNING: biarch_multidir_names is unset. Use default value:" ++ echo " $biarch_multidir_names" ++fi ++ml_srcbase=`basename $ml_realsrcdir` ++old_multidirs="${multidirs}" ++multidirs="" ++for x in ${old_multidirs}; do ++ case " $x " in ++ " 32 "|" n32 "|" 64 " ) ++ case "$biarch_multidir_names" in ++ *"$ml_srcbase"*) multidirs="${multidirs} ${x}" ;; ++ esac ++ ;; ++ *) multidirs="${multidirs} ${x}" ;; ++ esac ++done ++ + # Remove extraneous blanks from multidirs. + # Tests like `if [ -n "$multidirs" ]' require it. + multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'` +@@ -852,9 +884,20 @@ + fi + fi + ++ ml_configure_args= ++ for arg in ${ac_configure_args} ++ do ++ case $arg in ++ *CC=*) ml_configure_args=${ml_config_env} ;; ++ *CXX=*) ml_configure_args=${ml_config_env} ;; ++ *GCJ=*) ml_configure_args=${ml_config_env} ;; ++ *) ;; ++ esac ++ done ++ + if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \ + --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ +- ${ac_configure_args} ${ml_config_env} ${ml_srcdiroption} ; then ++ ${ac_configure_args} ${ml_configure_args} ${ml_srcdiroption} ; then + true + else + exit 1 diff --git a/recipes/gcc/gcc-svn/debian/cpu-default-i486.dpatch b/recipes/gcc/gcc-svn/debian/cpu-default-i486.dpatch new file mode 100644 index 0000000000..1afa60faf2 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/cpu-default-i486.dpatch @@ -0,0 +1,37 @@ +#! /bin/sh -e + +# DP: set default 32bit ix86 architecture to i486 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/config/i386/i386.c~ 2007-06-28 13:23:31.000000000 +0200 ++++ gcc/config/i386/i386.c 2007-06-28 13:26:33.000000000 +0200 +@@ -1953,7 +1953,7 @@ + "-mtune=generic instead as appropriate."); + + if (!ix86_arch_string) +- ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386"; ++ ix86_arch_string = TARGET_64BIT ? "x86-64" : "i486"; + else + ix86_arch_specified = 1; + diff --git a/recipes/gcc/gcc-svn/debian/cross-fixes.dpatch b/recipes/gcc/gcc-svn/debian/cross-fixes.dpatch new file mode 100644 index 0000000000..84d50bfd4a --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/cross-fixes.dpatch @@ -0,0 +1,129 @@ +#! /bin/sh -e + +# DP: Fix the linker error when creating an xcc for ia64 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + cd ${dir}gcc && autoconf + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.orig/gcc/config/ia64/fde-glibc.c gcc-4.0.0.new/gcc/config/ia64/fde-glibc.c +--- gcc-4.0.0.orig/gcc/config/ia64/fde-glibc.c 2003-11-02 18:35:20.000000000 +0100 ++++ gcc-4.0.0.new/gcc/config/ia64/fde-glibc.c 2005-05-15 02:42:27.675247674 +0200 +@@ -31,6 +31,7 @@ + #ifndef _GNU_SOURCE + #define _GNU_SOURCE 1 + #endif ++#ifndef inhibit_libc + #include "config.h" + #include + #include +@@ -162,3 +163,5 @@ _Unwind_FindTableEntry (void *pc, unsign + + return data.ret; + } ++ ++#endif +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.orig/gcc/config/ia64/unwind-ia64.c gcc-4.0.0.new/gcc/config/ia64/unwind-ia64.c +--- gcc-4.0.0.orig/gcc/config/ia64/unwind-ia64.c 2005-04-06 05:50:36.000000000 +0200 ++++ gcc-4.0.0.new/gcc/config/ia64/unwind-ia64.c 2005-05-15 02:43:10.842199954 +0200 +@@ -30,7 +30,7 @@ + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +- ++#ifndef inhibit_libc + #include "tconfig.h" + #include "tsystem.h" + #include "coretypes.h" +@@ -2404,3 +2404,4 @@ alias (_Unwind_SetIP); + #endif + + #endif ++#endif +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.orig/gcc/config/sh/linux-unwind.h gcc-4.0.0.new/gcc/config/sh/linux-unwind.h +--- gcc-4.0.0.orig/gcc/config/sh/linux-unwind.h 2005-02-11 02:12:57.000000000 +0100 ++++ gcc-4.0.0.new/gcc/config/sh/linux-unwind.h 2005-05-15 02:44:31.000000000 +0200 +@@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA. */ + /* Do code reading to identify a signal frame, and set the frame + state data appropriately. See unwind-dw2.c for the structs. */ + ++#ifndef inhibit_libc + #include + #include + #include "insn-constants.h" +@@ -169,3 +170,4 @@ sh_fallback_frame_state (struct _Unwind_ + return _URC_NO_REASON; + } + #endif /* defined (__SH5__) */ ++#endif +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.orig/gcc/unwind-compat.c gcc-4.0.0.new/gcc/unwind-compat.c +--- gcc-4.0.0.orig/gcc/unwind-compat.c 2004-09-04 02:15:40.000000000 +0200 ++++ gcc-4.0.0.new/gcc/unwind-compat.c 2005-05-15 02:41:17.000000000 +0200 +@@ -29,6 +29,7 @@ + 02110-1301, USA. */ + + #if defined (USE_GAS_SYMVER) && defined (USE_LIBUNWIND_EXCEPTIONS) ++#ifndef inhibit_libc + #include "tconfig.h" + #include "tsystem.h" + #include "unwind.h" +@@ -204,3 +205,4 @@ _Unwind_SetIP (struct _Unwind_Context *c + } + symver (_Unwind_SetIP, GCC_3.0); + #endif ++#endif +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.orig/gcc/unwind-generic.h gcc-4.0.0.new/gcc/unwind-generic.h +--- gcc-4.0.0.orig/gcc/unwind-generic.h 2004-11-30 09:15:39.000000000 +0100 ++++ gcc-4.0.0.new/gcc/unwind-generic.h 2005-05-15 02:38:33.000000000 +0200 +@@ -202,6 +202,7 @@ extern _Unwind_Reason_Code _Unwind_SjLj_ + compatible with the standard ABI for IA-64, we inline these. */ + + #ifdef __ia64__ ++#ifndef inhibit_libc + #include + + static inline _Unwind_Ptr +@@ -220,6 +221,7 @@ _Unwind_GetTextRelBase (struct _Unwind_C + + /* @@@ Retrieve the Backing Store Pointer of the given context. */ + extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *); ++#endif + #else + extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *); + extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *); +diff -NurpP -x '*.orig' -x '*.libc' gcc-4.0.0.new/gcc/config/alpha/linux-unwind.h gcc-4.0.0.new2/gcc/config/alpha/linux-unwind.h +--- gcc-4.0.0.new/gcc/config/alpha/linux-unwind.h 2005-02-11 02:12:54.000000000 +0100 ++++ gcc-4.0.0.new2/gcc/config/alpha/linux-unwind.h 2005-05-15 05:09:16.000000000 +0200 +@@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA. */ + /* Do code reading to identify a signal frame, and set the frame + state data appropriately. See unwind-dw2.c for the structs. */ + ++#ifndef inhibit_libc + #include + #include + +@@ -80,3 +81,5 @@ alpha_fallback_frame_state (struct _Unwi + fs->retaddr_column = 64; + return _URC_NO_REASON; + } ++ ++#endif diff --git a/recipes/gcc/gcc-svn/debian/cross-include.dpatch b/recipes/gcc/gcc-svn/debian/cross-include.dpatch new file mode 100644 index 0000000000..c2622903ec --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/cross-include.dpatch @@ -0,0 +1,39 @@ +#! /bin/sh -e + +# DP: Set cross include path to .../include, not .../sys-include +# DP: This should be a fix for famous limits.h issue + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + cd ${dir}gcc && autoconf + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/configure.ac.orig 2005-08-24 06:24:11.000000000 +0400 ++++ gcc/configure.ac 2005-12-06 00:40:45.000000000 +0300 +@@ -681,7 +681,7 @@ + ], [ + TARGET_SYSTEM_ROOT= + TARGET_SYSTEM_ROOT_DEFINE= +- CROSS_SYSTEM_HEADER_DIR='$(gcc_tooldir)/sys-include' ++ CROSS_SYSTEM_HEADER_DIR='$(prefix)/$(target_noncanonical)/include' + ]) + AC_SUBST(TARGET_SYSTEM_ROOT) + AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE) diff --git a/recipes/gcc/gcc-svn/debian/deb-protoize.dpatch b/recipes/gcc/gcc-svn/debian/deb-protoize.dpatch new file mode 100644 index 0000000000..f86ee09942 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/deb-protoize.dpatch @@ -0,0 +1,47 @@ +#! /bin/sh -e + +# DP: build protoize/unprotoize binaries + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/Makefile.in.orig 2007-09-06 21:31:39.864036975 +0200 ++++ gcc/Makefile.in 2007-09-06 21:33:57.836118252 +0200 +@@ -137,7 +137,7 @@ + + # Selection of languages to be made. + CONFIG_LANGUAGES = @all_selected_languages@ +-LANGUAGES = c gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES) ++LANGUAGES = c proto gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES) + + # Various ways of specifying flags for compilations: + # CFLAGS is for the user to override to, e.g., do a cross build with -O2. +@@ -3280,14 +3280,14 @@ + protoize.o: protoize.c $(srcdir)/../include/getopt.h $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TM_H) Makefile version.h cppdefault.h intl.h + (SHLIB_LINK='$(SHLIB_LINK)'; \ +- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ ++ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) -Wno-error \ + $(DRIVER_DEFINES) \ + $(srcdir)/protoize.c $(OUTPUT_OPTION)) + + unprotoize.o: protoize.c $(srcdir)/../include/getopt.h $(CONFIG_H) \ + $(SYSTEM_H) coretypes.h $(TM_H) Makefile version.h cppdefault.h intl.h + (SHLIB_LINK='$(SHLIB_LINK)'; \ +- $(CC) -c -DUNPROTOIZE $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ ++ $(CC) -c -DUNPROTOIZE $(ALL_CFLAGS) $(ALL_CPPFLAGS) -Wno-error \ + $(DRIVER_DEFINES) \ + $(srcdir)/protoize.c $(OUTPUT_OPTION)) + diff --git a/recipes/gcc/gcc-svn/debian/gcc-d-lang.dpatch b/recipes/gcc/gcc-svn/debian/gcc-d-lang.dpatch new file mode 100644 index 0000000000..24267ddbb3 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-d-lang.dpatch @@ -0,0 +1,246 @@ +#! /bin/sh -e + +# DP: Add D options and specs for the gcc driver. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc.orig/d/lang.opt gcc/d/lang.opt +--- gcc.orig/d/lang.opt 1970-01-01 01:00:00.000000000 +0100 ++++ gcc/d/lang.opt 2007-03-04 16:29:47.000000000 +0100 +@@ -0,0 +1,160 @@ ++; GDC -- D front-end for GCC ++; Copyright (C) 2004 David Friedman ++; ++; 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 ++ ++; This is used in GCC 3.4+ ++ ++Language ++D ++ ++I ++D Joined Separate ++-I Add to the end of the main include path. ++ ++J ++D Joined Separate ++-J Add to the end of the string import path. ++ ++fdeprecated ++D ++Allow use of deprecated features ++ ++fassert ++D ++Generate runtime code for assert()'s ++ ++frelease ++D ++Compile release version ++ ++funittest ++D ++Compile in unittest code ++ ++fversion= ++D Joined RejectNegative ++-fversion= Compile in version code >= or identified by ++ ++fdebug= ++D Joined RejectNegative ++-fdebug,-fdebug=,-fdebug= Compile in debug code, code <= level, or code identified by ident ++ ++fdebug ++D ++Compile in debug code ++ ++fdebug-c ++D ++With -g, generate C debug information for debugger compatibility ++ ++fd-verbose ++D ++Print information about D language processing to stdout ++ ++fd-version=1 ++D RejectNegative ++Compile as D language version 1 ++ ++femit-templates= ++D Joined RejectNegative ++-femit-templates=[normal|private|all|none|auto] Control template emission ++ ++femit-templates ++D ++-femit-templates Emit templates code and data even if the linker cannot merge multiple copies ++ ++nostdinc ++D ++Do not search standard system include directories ++ ++fonly= ++D Joined RejectNegative ++Process all modules specified on the command line, but only generate code for the module specified by the argument. ++ ++fod= ++D Joined RejectNegative ++-fod= Specify the object output directory. Note: this is actually a driver option; the backend ignores it. ++ ++fop ++D ++Specify that the source file's parent directories should be appended to the object output directory. Note: this is actually a driver option; the backend ignores it. ++ ++fintfc ++Generate D interface files ++ ++fintfc-dir= ++D Joined RejectNegative ++-fintfc-dir= Write D interface files to directory ++ ++fintfc-file= ++D Joined RejectNegative ++-fintfc-file= Write D interface file to ++ ++fdoc ++D ++Generate documentation ++ ++fdoc-dir= ++D Joined RejectNegative ++-fdoc-dir= Write documentation file to docdir directory ++ ++fdoc-file= ++D Joined RejectNegative ++-fdoc-file= Write documentation file to filename ++ ++fdoc-inc= ++D Joined RejectNegative ++-fdoc-inc= Include a Ddoc macro file ++ ++fmultilib-dir= ++D Joined RejectNegative ++-fmultilib-dir= Select header multilib subdirectory ++ ++Wsign-compare ++D ++Warn about signed-unsigned comparisons ++ ++fdump-source ++D RejectNegative ++Dump decoded UTF-8 text and source from HTML ++ ++fbuiltin ++D ++Recognize built-in functions ++ ++funsigned-char ++D ++Make \"char\" unsigned by default (silently ignored in D) ++ ++fsigned-char ++D ++Make \"char\" signed by default (silently ignored in D) ++ ++iprefix ++D Joined Separate ++-iprefix Specify as a prefix for next two options ++ ++isysroot ++D Joined Separate ++-isysroot Set to be the system root directory ++ ++isystem ++D Joined Separate ++-isystem Add to the start of the system include path ++ ++Wall ++D ++Enable most warning messages +diff -urN gcc.orig/d/lang-specs.h gcc/d/lang-specs.h +--- gcc.orig/d/lang-specs.h 1970-01-01 01:00:00.000000000 +0100 ++++ gcc/d/lang-specs.h 2007-03-04 16:36:44.000000000 +0100 +@@ -0,0 +1,53 @@ ++/* GDC -- D front-end for GCC ++ Copyright (C) 2004 David Friedman ++ ++ 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 ++*/ ++ ++#ifndef D_D_SPEC ++#define D_D_SPEC 0 ++#endif ++ ++/* %{!M} probably doesn't make sense because we would need ++ to do that -- -MD and -MMD doesn't sound like a plan for D.... */ ++ ++/* %(d_options) ? */ ++ ++#if GCC_SPEC_FORMAT_4 ++#define D_D_SPEC_REST 0, 1, 0 ++#else ++#define D_D_SPEC_REST 0 ++#endif ++ ++#if D_DRIVER_ONLY ++{".html", "@d", D_D_SPEC_REST }, ++{".HTML", "@d", D_D_SPEC_REST }, ++{".htm", "@d", D_D_SPEC_REST }, ++{".HTM", "@d", D_D_SPEC_REST }, ++{".xhtml", "@d", D_D_SPEC_REST }, ++{".XHTML", "@d", D_D_SPEC_REST }, ++{".d", "@d", D_D_SPEC_REST }, ++{".D", "@d", D_D_SPEC_REST }, ++{"@d", ++ "%{!E:cc1d %i %:d-all-sources() %(cc1_options) %I %N %{nostdinc*} %{+e*} %{I*} %{J*}\ ++ %{M} %{MM} %{!fsyntax-only:%(invoke_as)}}", D_D_SPEC_REST }, ++#else ++{".d", "@d", D_D_SPEC_REST }, ++{".D", "@d", D_D_SPEC_REST }, ++{"@d", ++ "%{!E:cc1d %i %(cc1_options) %I %N %{nostdinc*} %{+e*} %{I*} %{J*}\ ++ %{M} %{MM} %{!fsyntax-only:%(invoke_as)}}", D_D_SPEC_REST }, ++#endif ++ diff --git a/recipes/gcc/gcc-svn/debian/gcc-driver-extra-langs.dpatch b/recipes/gcc/gcc-svn/debian/gcc-driver-extra-langs.dpatch new file mode 100644 index 0000000000..2a206f7edc --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-driver-extra-langs.dpatch @@ -0,0 +1,40 @@ +#! /bin/sh -e + +# DP: Add options and specs for languages that are not built from a source +# DP: (but built from separate sources). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/Makefile.in~ 2006-07-11 14:03:25.865618000 +0200 ++++ gcc/Makefile.in 2006-07-11 21:15:30.011548776 +0200 +@@ -424,8 +424,8 @@ + xm_include_list=@xm_include_list@ + xm_defines=@xm_defines@ + lang_checks=check-gcc +-lang_opt_files=@lang_opt_files@ $(srcdir)/c.opt $(srcdir)/common.opt +-lang_specs_files=@lang_specs_files@ ++lang_opt_files=$(sort @lang_opt_files@ $(foreach lang,$(debian_extra_langs),$(srcdir)/$(lang)/lang.opt)) $(srcdir)/c.opt $(srcdir)/common.opt ++lang_specs_files=$(sort @lang_specs_files@ $(foreach lang,$(debian_extra_langs),$(srcdir)/$(lang)/lang-specs.h)) + lang_tree_files=@lang_tree_files@ + target_cpu_default=@target_cpu_default@ + GCC_THREAD_FILE=@thread_file@ diff --git a/recipes/gcc/gcc-svn/debian/gcc-hash-style-both.dpatch b/recipes/gcc/gcc-svn/debian/gcc-hash-style-both.dpatch new file mode 100644 index 0000000000..8fea7586d0 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-hash-style-both.dpatch @@ -0,0 +1,163 @@ +#! /bin/sh -e + +# DP: Link using --hash-style=both (alpha, amd64, ia64, i386, powerpc, ppc64, s390, sparc) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2006-07-11 Jakub Jelinek + + * config/i386/linux.h (LINK_SPEC): Add --hash-style=both. + * config/i386/linux64.h (LINK_SPEC): Likewise. + * config/rs6000/sysv4.h (LINK_OS_LINUX_SPEC): Likewise. + * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC32, + LINK_OS_LINUX_SPEC64): Likewise. + * config/s390/linux.h (LINK_SPEC): Likewise. + * config/ia64/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux64.h (LINK_SPEC, LINK_ARCH32_SPEC, + LINK_ARCH64_SPEC): Likewise. + * config/alpha/linux-elf.h (LINK_SPEC): Likewise. + +--- gcc/config/alpha/linux-elf.h.orig 2007-08-04 08:55:58.000000000 +0200 ++++ gcc/config/alpha/linux-elf.h 2007-09-01 15:47:26.605865578 +0200 +@@ -39,7 +39,7 @@ + + #define ELF_DYNAMIC_LINKER LINUX_DYNAMIC_LINKER + +-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ ++#define LINK_SPEC "-m elf64alpha --hash-style=both %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ + %{shared:-shared} \ + %{!shared: \ +--- gcc/config/s390/linux.h.orig 2007-08-04 08:55:59.000000000 +0200 ++++ gcc/config/s390/linux.h 2007-09-01 15:47:26.605865578 +0200 +@@ -77,7 +77,7 @@ + + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ ++ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{static:-static} \ +--- gcc/config/sparc/linux.h.orig 2007-08-04 08:56:01.000000000 +0200 ++++ gcc/config/sparc/linux.h 2007-09-01 15:47:26.605865578 +0200 +@@ -132,7 +132,7 @@ + + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ ++#define LINK_SPEC "-m elf32_sparc --hash-style=both -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!ibcs: \ +--- gcc/config/sparc/linux64.h.orig 2007-08-04 08:56:01.000000000 +0200 ++++ gcc/config/sparc/linux64.h 2007-09-01 15:47:26.605865578 +0200 +@@ -166,7 +166,7 @@ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + +-#define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ ++#define LINK_ARCH32_SPEC "-m elf32_sparc --hash-style=both -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +@@ -175,7 +175,7 @@ + %{static:-static}}} \ + " + +-#define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ ++#define LINK_ARCH64_SPEC "-m elf64_sparc --hash-style=both -Y P,/usr/lib64 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +@@ -256,7 +256,7 @@ + #else /* !SPARC_BI_ARCH */ + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ ++#define LINK_SPEC "-m elf64_sparc --hash-style=both -Y P,/usr/lib64 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +--- gcc/config/i386/linux.h.orig 2007-08-04 08:56:07.000000000 +0200 ++++ gcc/config/i386/linux.h 2007-09-01 15:47:26.605865578 +0200 +@@ -108,7 +108,7 @@ + { "dynamic_linker", LINUX_DYNAMIC_LINKER } + + #undef LINK_SPEC +-#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ ++#define LINK_SPEC "-m %(link_emulation) --hash-style=both %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +--- gcc/config/i386/linux64.h.orig 2007-08-04 08:56:07.000000000 +0200 ++++ gcc/config/i386/linux64.h 2007-09-01 15:48:27.336781690 +0200 +@@ -65,7 +65,7 @@ + #endif + + #undef LINK_SPEC +-#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} \ ++#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +--- gcc/config/ia64/linux.h.orig 2006-12-12 18:59:53.000000000 +0100 ++++ gcc/config/ia64/linux.h 2007-09-01 15:47:26.605865578 +0200 +@@ -40,7 +40,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "\ ++#define LINK_SPEC "--hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +--- gcc/config/rs6000/sysv4.h.orig 2007-08-08 23:37:49.000000000 +0200 ++++ gcc/config/rs6000/sysv4.h 2007-09-01 15:47:26.615865729 +0200 +@@ -901,7 +901,7 @@ + #define LINUX_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) + +-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}" + +--- gcc/config/rs6000/linux64.h.orig 2007-08-04 08:56:12.000000000 +0200 ++++ gcc/config/rs6000/linux64.h 2007-09-01 15:47:26.615865729 +0200 +@@ -354,11 +354,11 @@ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) + + +-#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}" + +-#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC64 "-m elf64ppc --hash-style=both %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}" + diff --git a/recipes/gcc/gcc-svn/debian/gcc-hash-style-gnu.dpatch b/recipes/gcc/gcc-svn/debian/gcc-hash-style-gnu.dpatch new file mode 100644 index 0000000000..8c6e2691b1 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-hash-style-gnu.dpatch @@ -0,0 +1,163 @@ +#! /bin/sh -e + +# DP: Link using --hash-style=gnu (alpha, amd64, ia64, i386, powerpc, ppc64, s390, sparc) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2006-07-11 Jakub Jelinek + + * config/i386/linux.h (LINK_SPEC): Add --hash-style=gnu. + * config/i386/linux64.h (LINK_SPEC): Likewise. + * config/rs6000/sysv4.h (LINK_OS_LINUX_SPEC): Likewise. + * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC32, + LINK_OS_LINUX_SPEC64): Likewise. + * config/s390/linux.h (LINK_SPEC): Likewise. + * config/ia64/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux.h (LINK_SPEC): Likewise. + * config/sparc/linux64.h (LINK_SPEC, LINK_ARCH32_SPEC, + LINK_ARCH64_SPEC): Likewise. + * config/alpha/linux-elf.h (LINK_SPEC): Likewise. + +--- gcc/config/alpha/linux-elf.h.orig 2007-09-01 15:49:36.997832511 +0200 ++++ gcc/config/alpha/linux-elf.h 2007-09-01 15:49:48.538006592 +0200 +@@ -39,7 +39,7 @@ + + #define ELF_DYNAMIC_LINKER LINUX_DYNAMIC_LINKER + +-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ ++#define LINK_SPEC "-m elf64alpha --hash-style=gnu %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ + %{shared:-shared} \ + %{!shared: \ +--- gcc/config/s390/linux.h.orig 2007-09-01 15:49:36.997832511 +0200 ++++ gcc/config/s390/linux.h 2007-09-01 15:49:48.548006743 +0200 +@@ -77,7 +77,7 @@ + + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ ++ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{static:-static} \ +--- gcc/config/sparc/linux.h.orig 2007-09-01 15:49:36.997832511 +0200 ++++ gcc/config/sparc/linux.h 2007-09-01 15:49:48.548006743 +0200 +@@ -132,7 +132,7 @@ + + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ ++#define LINK_SPEC "-m elf32_sparc --hash-style=gnu -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!ibcs: \ +--- gcc/config/sparc/linux64.h.orig 2007-09-01 15:49:36.997832511 +0200 ++++ gcc/config/sparc/linux64.h 2007-09-01 15:49:48.548006743 +0200 +@@ -166,7 +166,7 @@ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + +-#define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ ++#define LINK_ARCH32_SPEC "-m elf32_sparc --hash-style=gnu -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +@@ -175,7 +175,7 @@ + %{static:-static}}} \ + " + +-#define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ ++#define LINK_ARCH64_SPEC "-m elf64_sparc --hash-style=gnu -Y P,/usr/lib64 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +@@ -256,7 +256,7 @@ + #else /* !SPARC_BI_ARCH */ + + #undef LINK_SPEC +-#define LINK_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ ++#define LINK_SPEC "-m elf64_sparc --hash-style=gnu -Y P,/usr/lib64 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +--- gcc/config/i386/linux.h.orig 2007-09-01 15:49:37.007832662 +0200 ++++ gcc/config/i386/linux.h 2007-09-01 15:49:48.548006743 +0200 +@@ -108,7 +108,7 @@ + { "dynamic_linker", LINUX_DYNAMIC_LINKER } + + #undef LINK_SPEC +-#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ ++#define LINK_SPEC "-m %(link_emulation) --hash-style=gnu %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ +--- gcc/config/i386/linux64.h.orig 2007-09-01 15:49:37.007832662 +0200 ++++ gcc/config/i386/linux64.h 2007-09-01 15:50:49.068919687 +0200 +@@ -65,7 +65,7 @@ + #endif + + #undef LINK_SPEC +-#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} \ ++#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} --hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +--- gcc/config/ia64/linux.h.orig 2007-09-01 15:49:37.007832662 +0200 ++++ gcc/config/ia64/linux.h 2007-09-01 15:49:48.548006743 +0200 +@@ -40,7 +40,7 @@ + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" + + #undef LINK_SPEC +-#define LINK_SPEC "\ ++#define LINK_SPEC "--hash-style=gnu \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +--- gcc/config/rs6000/sysv4.h.orig 2007-09-01 15:49:37.007832662 +0200 ++++ gcc/config/rs6000/sysv4.h 2007-09-01 15:49:48.548006743 +0200 +@@ -901,7 +901,7 @@ + #define LINUX_DYNAMIC_LINKER \ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER) + +-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}" + +--- gcc/config/rs6000/linux64.h.orig 2007-09-01 15:49:37.007832662 +0200 ++++ gcc/config/rs6000/linux64.h 2007-09-01 15:49:48.548006743 +0200 +@@ -354,11 +354,11 @@ + CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) + + +-#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}" + +-#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \ ++#define LINK_OS_LINUX_SPEC64 "-m elf64ppc --hash-style=gnu %{!shared: %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}" + diff --git a/recipes/gcc/gcc-svn/debian/gcc-i386-emit-cld.dpatch b/recipes/gcc/gcc-svn/debian/gcc-i386-emit-cld.dpatch new file mode 100644 index 0000000000..1267b00e18 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-i386-emit-cld.dpatch @@ -0,0 +1,179 @@ +#! /bin/sh -e + +# DP: Emit cld instruction when stringops are used (i386). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-03-06 Uros Bizjak + + * config/i386/i386.h (TARGET_CLD): New define. + (struct machine_function): Add needs_cld field. + (ix86_current_function_needs_cld): New define. + * config/i386/i386.md (UNSPEC_CLD): New unspec volatile constant. + ("cld"): New isns pattern. + ("strmov_singleop"): Set ix86_current_function_needs_cld flag. + ("rep_mov"): Ditto. + ("strset_singleop"): Ditto. + ("rep_stos"): Ditto. + ("cmpstrnqi_nz_1"): Ditto. + ("cmpstrnqi_1"): Ditto. + ("strlenqi_1"): Ditto. + * config/i386/i386.c (ix86_expand_prologue): Emit cld insn for + TARGET_CLD when ix86_current_function_needs_cld is set. + +Index: gcc/config/i386/i386.h +=================================================================== +--- gcc/config/i386/i386.h (revision 132966) ++++ gcc/config/i386/i386.h (working copy) +@@ -388,6 +388,7 @@ extern unsigned int ix86_arch_features[X + + extern int x86_prefetch_sse; + ++#define TARGET_CLD 1 + #define TARGET_ABM x86_abm + #define TARGET_CMPXCHG16B x86_cmpxchg16b + #define TARGET_POPCNT x86_popcnt +@@ -2446,8 +2447,9 @@ struct machine_function GTY(()) + int save_varrargs_registers; + int accesses_prev_frame; + int optimize_mode_switching[MAX_386_ENTITIES]; +- /* Set by ix86_compute_frame_layout and used by prologue/epilogue expander to +- determine the style used. */ ++ int needs_cld; ++ /* Set by ix86_compute_frame_layout and used by prologue/epilogue ++ expander to determine the style used. */ + int use_fast_prologue_epilogue; + /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE has been computed + for. */ +@@ -2467,6 +2469,7 @@ struct machine_function GTY(()) + #define ix86_stack_locals (cfun->machine->stack_locals) + #define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers) + #define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching) ++#define ix86_current_function_needs_cld (cfun->machine->needs_cld) + #define ix86_tls_descriptor_calls_expanded_in_cfun \ + (cfun->machine->tls_descriptor_call_expanded_p) + /* Since tls_descriptor_call_expanded is not cleared, even if all TLS +Index: gcc/config/i386/i386.md +=================================================================== +--- gcc/config/i386/i386.md (revision 132966) ++++ gcc/config/i386/i386.md (working copy) +@@ -205,6 +205,7 @@ + (UNSPECV_XCHG 12) + (UNSPECV_LOCK 13) + (UNSPECV_PROLOGUE_USE 14) ++ (UNSPECV_CLD 15) + ]) + + ;; Constants to represent pcomtrue/pcomfalse variants +@@ -18519,6 +18520,14 @@ + + ;; Block operation instructions + ++(define_insn "cld" ++ [(unspec_volatile [(const_int 0)] UNSPECV_CLD)] ++ "" ++ "cld" ++ [(set_attr "length" "1") ++ (set_attr "length_immediate" "0") ++ (set_attr "modrm" "0")]) ++ + (define_expand "movmemsi" + [(use (match_operand:BLK 0 "memory_operand" "")) + (use (match_operand:BLK 1 "memory_operand" "")) +@@ -18591,7 +18600,7 @@ + (set (match_operand 2 "register_operand" "") + (match_operand 5 "" ""))])] + "TARGET_SINGLE_STRINGOP || optimize_size" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strmovdi_rex_1" + [(set (mem:DI (match_operand:DI 2 "register_operand" "0")) +@@ -18708,7 +18717,7 @@ + (match_operand 3 "memory_operand" "")) + (use (match_dup 4))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*rep_movdi_rex64" + [(set (match_operand:DI 2 "register_operand" "=c") (const_int 0)) +@@ -18868,7 +18877,7 @@ + (set (match_operand 0 "register_operand" "") + (match_operand 3 "" ""))])] + "TARGET_SINGLE_STRINGOP || optimize_size" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strsetdi_rex_1" + [(set (mem:DI (match_operand:DI 1 "register_operand" "0")) +@@ -18962,7 +18971,7 @@ + (use (match_operand 3 "register_operand" "")) + (use (match_dup 1))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*rep_stosdi_rex64" + [(set (match_operand:DI 1 "register_operand" "=c") (const_int 0)) +@@ -19138,7 +19147,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (match_dup 2))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*cmpstrnqi_nz_1" + [(set (reg:CC FLAGS_REG) +@@ -19185,7 +19194,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (match_dup 2))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*cmpstrnqi_1" + [(set (reg:CC FLAGS_REG) +@@ -19254,7 +19263,7 @@ + (clobber (match_operand 1 "register_operand" "")) + (clobber (reg:CC FLAGS_REG))])] + "" +- "") ++ "ix86_current_function_needs_cld = 1;") + + (define_insn "*strlenqi_1" + [(set (match_operand:SI 0 "register_operand" "=&c") +Index: gcc/config/i386/i386.c +=================================================================== +--- gcc/config/i386/i386.c (revision 132966) ++++ gcc/config/i386/i386.c (working copy) +@@ -6498,6 +6498,10 @@ ix86_expand_prologue (void) + emit_insn (gen_prologue_use (pic_offset_table_rtx)); + emit_insn (gen_blockage ()); + } ++ ++ /* Emit cld instruction if stringops are used in the function. */ ++ if (TARGET_CLD && ix86_current_function_needs_cld) ++ emit_insn (gen_cld ()); + } + + /* Emit code to restore saved registers using MOV insns. First register diff --git a/recipes/gcc/gcc-svn/debian/gcc-ice-apport.dpatch b/recipes/gcc/gcc-svn/debian/gcc-ice-apport.dpatch new file mode 100644 index 0000000000..87b8f06ea8 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-ice-apport.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e + +# DP: Report an ICE to apport (if apport is available +# DP: and the environment variable GCC_NOAPPORT is not set) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/gcc.c~ 2007-08-05 22:17:07.000000000 +0200 ++++ gcc/gcc.c 2007-08-12 15:03:16.000000000 +0200 +@@ -6119,6 +6119,15 @@ + { + notice ("Preprocessed source stored into %s file, please attach this to your bugreport.\n", + temp_filenames[attempt * 2]); ++ if (!getenv ("GCC_NOAPPORT") ++ && !access ("/usr/share/apport/gcc_ice_hook", R_OK | X_OK)) ++ { ++ char *cmd = xmalloc (50 + strlen (temp_filenames[attempt * 2]) + strlen (new_argv[0])); ++ sprintf (cmd, "/usr/share/apport/gcc_ice_hook %s %s", ++ new_argv[0], temp_filenames[attempt * 2]); ++ system (cmd); ++ free (cmd); ++ } + /* Make sure it is not deleted. */ + free (temp_filenames[attempt * 2]); + temp_filenames[attempt * 2] = NULL; diff --git a/recipes/gcc/gcc-svn/debian/gcc-ice-hack.dpatch b/recipes/gcc/gcc-svn/debian/gcc-ice-hack.dpatch new file mode 100644 index 0000000000..84c5ef2ebd --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-ice-hack.dpatch @@ -0,0 +1,331 @@ +#! /bin/sh -e + +# DP: Retry the build on an ice, save the calling options and preprocessed +# DP: source when the ice is reproducible. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2004-01-23 Jakub Jelinek + + * system.h (ICE_EXIT_CODE): Define. + * gcc.c (execute): Don't free first string early, but at the end + of the function. Call retry_ice if compiler exited with + ICE_EXIT_CODE. + (retry_ice): New function. + * diagnostic.c (diagnostic_count_diagnostic, + diagnostic_action_after_output, error_recursion): Exit with + ICE_EXIT_CODE instead of FATAL_EXIT_CODE. + +--- gcc/diagnostic.c.orig 2007-09-30 10:48:13.000000000 +0000 ++++ gcc/diagnostic.c 2007-09-30 10:49:57.000000000 +0000 +@@ -244,7 +244,7 @@ + fnotice (stderr, "Please submit a full bug report,\n" + "with preprocessed source if appropriate.\n" + "See %s for instructions.\n", bug_report_url); +- exit (ICE_EXIT_CODE); ++ exit (FATAL_EXIT_CODE); + + case DK_FATAL: + if (context->abort_on_error) +--- gcc/gcc.c.orig 2007-09-30 10:48:13.000000000 +0000 ++++ gcc/gcc.c 2007-09-30 10:48:39.000000000 +0000 +@@ -357,6 +357,9 @@ + #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX) + static const char *convert_filename (const char *, int, int); + #endif ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++static void retry_ice (const char *prog, const char **argv); ++#endif + + static const char *getenv_spec_function (int, const char **); + static const char *if_exists_spec_function (int, const char **); +@@ -2999,7 +3002,7 @@ + } + } + +- if (string != commands[i].prog) ++ if (i && string != commands[i].prog) + free (CONST_CAST (char *, string)); + } + +@@ -3056,6 +3059,16 @@ + else if (WIFEXITED (status) + && WEXITSTATUS (status) >= MIN_FATAL_STATUS) + { ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++ /* For ICEs in cc1, cc1obj, cc1plus see if it is ++ reproducible or not. */ ++ char *p; ++ if (WEXITSTATUS (status) == ICE_EXIT_CODE ++ && i == 0 ++ && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR)) ++ && ! strncmp (p + 1, "cc1", 3)) ++ retry_ice (commands[0].prog, commands[0].argv); ++#endif + if (WEXITSTATUS (status) > greatest_status) + greatest_status = WEXITSTATUS (status); + ret_code = -1; +@@ -3076,6 +3089,9 @@ + } + } + ++ if (commands[0].argv[0] != commands[0].prog) ++ free ((PTR) commands[0].argv[0]); ++ + return ret_code; + } + } +@@ -6016,6 +6032,224 @@ + switches[switchnum].validated = 1; + } + ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS)) ++#define RETRY_ICE_ATTEMPTS 2 ++ ++static void ++retry_ice (const char *prog, const char **argv) ++{ ++ int nargs, out_arg = -1, quiet = 0, attempt; ++ int pid, retries, sleep_interval; ++ const char **new_argv; ++ char *temp_filenames[RETRY_ICE_ATTEMPTS * 2 + 2]; ++ ++ if (input_filename == NULL || ! strcmp (input_filename, "-")) ++ return; ++ ++ for (nargs = 0; argv[nargs] != NULL; ++nargs) ++ /* Only retry compiler ICEs, not preprocessor ones. */ ++ if (! strcmp (argv[nargs], "-E")) ++ return; ++ else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o') ++ { ++ if (out_arg == -1) ++ out_arg = nargs; ++ else ++ return; ++ } ++ /* If the compiler is going to output any time information, ++ it might vary between invocations. */ ++ else if (! strcmp (argv[nargs], "-quiet")) ++ quiet = 1; ++ else if (! strcmp (argv[nargs], "-ftime-report")) ++ return; ++ ++ if (out_arg == -1 || !quiet) ++ return; ++ ++ memset (temp_filenames, '\0', sizeof (temp_filenames)); ++ new_argv = alloca ((nargs + 3) * sizeof (const char *)); ++ memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *)); ++ new_argv[nargs++] = "-frandom-seed=0"; ++ new_argv[nargs] = NULL; ++ if (new_argv[out_arg][2] == '\0') ++ new_argv[out_arg + 1] = "-"; ++ else ++ new_argv[out_arg] = "-o-"; ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS + 1; ++attempt) ++ { ++ int fd = -1; ++ int status; ++ ++ temp_filenames[attempt * 2] = make_temp_file (".out"); ++ temp_filenames[attempt * 2 + 1] = make_temp_file (".err"); ++ ++ if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ int i; ++ int fd1, fd2; ++ struct stat st1, st2; ++ size_t n, len; ++ char *buf; ++ ++ buf = xmalloc (8192); ++ ++ for (i = 0; i < 2; ++i) ++ { ++ fd1 = open (temp_filenames[i], O_RDONLY); ++ fd2 = open (temp_filenames[2 + i], O_RDONLY); ++ ++ if (fd1 < 0 || fd2 < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (st1.st_size != st2.st_size) ++ { ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ len = 0; ++ for (n = st1.st_size; n; n -= len) ++ { ++ len = n; ++ if (len > 4096) ++ len = 4096; ++ ++ if (read (fd1, buf, len) != (int) len ++ || read (fd2, buf + 4096, len) != (int) len) ++ { ++ i = -1; ++ break; ++ } ++ ++ if (memcmp (buf, buf + 4096, len) != 0) ++ break; ++ } ++ ++ close (fd1); ++ close (fd2); ++ ++ if (n) ++ break; ++ } ++ ++ free (buf); ++ if (i == -1) ++ break; ++ ++ if (i != 2) ++ { ++ notice ("The bug is not reproducible, so it is likely a hardware or OS problem.\n"); ++ break; ++ } ++ ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ break; ++ write (fd, "//", 2); ++ for (i = 0; i < nargs; i++) ++ { ++ write (fd, " ", 1); ++ write (fd, new_argv[i], strlen (new_argv[i])); ++ } ++ write (fd, "\n", 1); ++ new_argv[nargs] = "-E"; ++ new_argv[nargs + 1] = NULL; ++ } ++ ++ /* Fork a subprocess; wait and retry if it fails. */ ++ sleep_interval = 1; ++ pid = -1; ++ for (retries = 0; retries < 4; retries++) ++ { ++ pid = fork (); ++ if (pid >= 0) ++ break; ++ sleep (sleep_interval); ++ sleep_interval *= 2; ++ } ++ ++ if (pid < 0) ++ break; ++ else if (pid == 0) ++ { ++ if (attempt != RETRY_ICE_ATTEMPTS) ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 1) ++ { ++ close (1); ++ dup (fd); ++ close (fd); ++ } ++ ++ fd = open (temp_filenames[attempt * 2 + 1], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 2) ++ { ++ close (2); ++ dup (fd); ++ close (fd); ++ } ++ ++ if (prog == new_argv[0]) ++ execvp (prog, (char *const *) new_argv); ++ else ++ execv (new_argv[0], (char *const *) new_argv); ++ exit (-1); ++ } ++ ++ if (waitpid (pid, &status, 0) < 0) ++ break; ++ ++ if (attempt < RETRY_ICE_ATTEMPTS ++ && (! WIFEXITED (status) || WEXITSTATUS (status) != ICE_EXIT_CODE)) ++ { ++ notice ("The bug is not reproducible, so it is likely a hardware or OS problem.\n"); ++ break; ++ } ++ else if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ close (fd); ++ if (WIFEXITED (status) ++ && WEXITSTATUS (status) == SUCCESS_EXIT_CODE) ++ { ++ notice ("Preprocessed source stored into %s file, please attach this to your bugreport.\n", ++ temp_filenames[attempt * 2]); ++ /* Make sure it is not deleted. */ ++ free (temp_filenames[attempt * 2]); ++ temp_filenames[attempt * 2] = NULL; ++ break; ++ } ++ } ++ } ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS * 2 + 2; attempt++) ++ if (temp_filenames[attempt]) ++ { ++ unlink (temp_filenames[attempt]); ++ free (temp_filenames[attempt]); ++ } ++} ++#endif ++ + /* Search for a file named NAME trying various prefixes including the + user's -B prefix and some standard ones. + Return the absolute file name found. If nothing is found, return NAME. */ +--- gcc/Makefile.in.orig 2007-09-30 10:48:13.000000000 +0000 ++++ gcc/Makefile.in 2007-09-30 10:48:39.000000000 +0000 +@@ -192,6 +192,7 @@ + build/gengtype-lex.o-warn = -Wno-error + # SYSCALLS.c misses prototypes + SYSCALLS.c.X-warn = -Wno-strict-prototypes -Wno-error ++build/gcc.o-warn = -Wno-error + + # All warnings have to be shut off in stage1 if the compiler used then + # isn't gcc; configure determines that. WARN_CFLAGS will be either diff --git a/recipes/gcc/gcc-svn/debian/gcc-multilib64dir.dpatch b/recipes/gcc/gcc-svn/debian/gcc-multilib64dir.dpatch new file mode 100644 index 0000000000..fe8f5a1a41 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-multilib64dir.dpatch @@ -0,0 +1,62 @@ +#! /bin/sh -e + +# DP: Use lib instead of lib64 as multilibdir on amd64 and ppc64. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/config/i386/t-linux64 +=================================================================== +--- gcc/config/i386/t-linux64 (revision 130706) ++++ gcc/config/i386/t-linux64 (working copy) +@@ -13,7 +13,7 @@ + + MULTILIB_OPTIONS = m64/m32 + MULTILIB_DIRNAMES = 64 32 +-MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) ++MULTILIB_OSDIRNAMES = ../lib $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) + + LIBGCC = stmp-multilib + INSTALL_LIBGCC = install-multilib +Index: gcc/config/rs6000/t-linux64 +=================================================================== +--- gcc/config/rs6000/t-linux64 (revision 130706) ++++ gcc/config/rs6000/t-linux64 (working copy) +@@ -14,13 +14,13 @@ + # it doesn't tell anything about the 32bit libraries on those systems. Set + # MULTILIB_OSDIRNAMES according to what is found on the target. + +-MULTILIB_OPTIONS = m64/m32 msoft-float +-MULTILIB_DIRNAMES = 64 32 nof ++MULTILIB_OPTIONS = m64/m32 ++MULTILIB_DIRNAMES = 64 32 + MULTILIB_EXTRA_OPTS = fPIC mstrict-align +-MULTILIB_EXCEPTIONS = m64/msoft-float +-MULTILIB_EXCLUSIONS = m64/!m32/msoft-float +-MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof +-MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) ++MULTILIB_EXCEPTIONS = ++MULTILIB_EXCLUSIONS = ++MULTILIB_OSDIRNAMES = ../lib $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) ++MULTILIB_MATCHES = + + softfp_wrap_start := '\#ifndef __powerpc64__' + softfp_wrap_end := '\#endif' diff --git a/recipes/gcc/gcc-svn/debian/gcc-pascal-lang.dpatch b/recipes/gcc/gcc-svn/debian/gcc-pascal-lang.dpatch new file mode 100644 index 0000000000..eab416ad63 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-pascal-lang.dpatch @@ -0,0 +1,726 @@ +#! /bin/sh -e + +# DP: Add pascal options and specs for the gcc driver. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ln -sf p ${dir}/gcc/pascal + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc.orig/p/lang.opt gcc/p/lang.opt +--- gcc.orig/p/lang.opt 1970-01-01 01:00:00.000000000 +0100 ++++ gcc/p/lang.opt 2006-03-03 20:17:49.000000000 +0100 +@@ -0,0 +1,635 @@ ++; This file was generated automatically by mk-lang_opt. ++; DO NOT CHANGE THIS FILE MANUALLY! ++; ++; Options for the Pascal front end. ++; Copyright (C) 2004-2006 Free Software Foundation, Inc. ++; ++; This file is part of GNU Pascal. ++; ++; GNU Pascal 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, or (at your option) ++; any later version. ++; ++; GNU Pascal 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 GNU Pascal; see the file COPYING. If not, write to the ++; Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA ++; 02111-1307, USA. ++ ++; See c.opt for a description of this file's format. ++ ++; Please try to keep this file in ASCII collating order. ++ ++Language ++Pascal ++ ++A ++Pascal ++Ignored ++ ++D ++Pascal Joined Separate ++-D[=] Define a with as its value. If just is given, is taken to be 1 ++ ++E ++Pascal ++Preprocess only ++ ++H ++Pascal ++Print the name of include files as they are used ++ ++I ++Pascal Joined Separate ++-I Add to the end of the main include path. ++ ++M ++Pascal ++Generate make dependencies ++ ++MM ++Pascal ++Like -M but ignore system header files ++ ++P ++Pascal ++Do not generate #line directives ++ ++U ++Pascal Joined Separate ++-U Undefine ++ ++Wabsolute ++Pascal ++Warn about variables at absolute adresses and `absolute' variable with non-constant addresses (default) ++ ++Wall ++Pascal ++ ++ ++Wcomment ++Pascal ++ ++ ++Wdynamic-arrays ++Pascal ++Warn about arrays whose size is determined at run time (including array slices) ++ ++Werror ++Pascal ++ ++ ++Wfloat-equal ++Pascal ++Warn about `=' and `<>' comparisons of real numbers ++ ++Widentifier-case ++Pascal ++Warn about an identifier written with varying case ++ ++Widentifier-case-local ++Pascal ++Warn about an identifier written with varying case within one program/module/unit ++ ++Wimplicit-abstract ++Pascal ++Warn when an object type not declared `abstract' contains an abstract method (default) ++ ++Wimplicit-io ++Pascal ++Warn when `Input' or `Output' are used implicitly ++ ++Winherited-abstract ++Pascal ++Warn when an abstract object type inherits from a non-abstract one (default) ++ ++Winterface-file-name ++Pascal ++Warn when a unit/module interface differs from the file name ++ ++Wlocal-external ++Pascal ++Warn about local `external' declarations ++ ++Wmissing-declarations ++Pascal ++ ++ ++Wmissing-prototypes ++Pascal ++ ++ ++Wmixed-comments ++Pascal ++Warn about mixed comments like `{ ... *)' ++ ++Wnear-far ++Pascal ++Warn about use of useless `near' or `far' directives (default) ++ ++Wnested-comments ++Pascal ++Warn about nested comments like `{ { } }' ++ ++Wobject-assignment ++Pascal ++Warn when when assigning objects or declaring them as value parameters or function results (default) ++ ++Wpointer-arith ++Pascal ++ ++ ++Wsemicolon ++Pascal ++Warn about a semicolon after `then', `else' or `do' (default) ++ ++Wtyped-const ++Pascal ++Warn about misuse of typed constants as initialized variables (default) ++ ++Wundef ++Pascal ++ ++ ++Wunderscore ++Pascal ++Warn about double/leading/trailing underscores in identifiers ++ ++Wwarnings ++Pascal ++Enable warnings (same as `{$W+}') ++ ++Wwrite-strings ++Pascal ++ ++ ++famtmpfile= ++Pascal Joined RejectNegative ++(Internal switch used for automake) ++ ++fassertions ++Pascal ++Enable assertion checking (default) ++ ++fautobuild ++Pascal ++Automatically compile all units/modules/`{$L ...}' files and link the object files provided ++ ++fautolink ++Pascal ++Automatically link object files provided by units/modules or `{$L ...}' (default) ++ ++fautomake ++Pascal ++Automatically compile changed units/modules/`{$L ...}' files and link the object files provided ++ ++fautomake-g++= ++Pascal Joined RejectNegative ++Set the C++ compiler invoked by automake ++ ++fautomake-gcc= ++Pascal Joined RejectNegative ++Set the C compiler invoked by automake ++ ++fautomake-gpc= ++Pascal Joined RejectNegative ++Set the Pascal compiler invoked by automake ++ ++fbig-endian ++Pascal RejectNegative ++Tell GPC that the system is big-endian (for those targets where it can vary) ++ ++fborland-objects ++Pascal RejectNegative ++Choose Borland object model ++ ++fborland-pascal ++Pascal RejectNegative ++Try to emulate Borland Pascal, version 7.0 ++ ++fcase-value-checking ++Pascal ++Cause a runtime error if a `case' matches no branch (default in ISO Pascal modes) ++ ++fcidefine= ++Pascal Joined RejectNegative ++Define a case-insensitive macro ++ ++fclassic-pascal ++Pascal RejectNegative ++Reject anything besides ISO 7185 Pascal ++ ++fclassic-pascal-level-0 ++Pascal RejectNegative ++Reject conformant arrays and anything besides ISO 7185 Pascal ++ ++fcsdefine= ++Pascal Joined RejectNegative ++Define a case-sensitive macro ++ ++fcstrings-as-strings ++Pascal ++Treat CStrings as strings ++ ++fdebug-automake ++Pascal RejectNegative ++(For GPC developers.) Give additional information about the actions of automake ++ ++fdebug-gpi ++Pascal RejectNegative ++(For GPC developers.) Show what is written to and read from GPI files (huge output!) ++ ++fdebug-source ++Pascal ++Output the source while it is processed to standard error ++ ++fdebug-tree= ++Pascal Joined RejectNegative ++(For GPC developers.) Show the internal representation of a given tree node (name or address) ++ ++fdelphi ++Pascal RejectNegative ++Try to emulate Borland Pascal, version 7.0, with some Delphi extensions ++ ++fdelphi-comments ++Pascal ++Allow Delphi style `//' comments (default) ++ ++fdelphi-method-shadowing ++Pascal ++Redefining methods silently shadows old definition (default in `--delphi') ++ ++fdisable-debug-info ++Pascal RejectNegative ++Inhibit `-g' options (temporary work-around, this option may disappear in the future) ++ ++fdisable-default-paths ++Pascal RejectNegative ++Do not add a default path to the unit and object path ++ ++fdisable-keyword= ++Pascal Joined RejectNegative ++Disable a keyword, independently of dialect defaults ++ ++fdisable-predefined-identifier= ++Pascal Joined RejectNegative ++Disable a predefined identifier, independently of dialect defaults ++ ++fdouble-quoted-strings ++Pascal ++Allow strings enclosed in \"\" (default) ++ ++fenable-keyword= ++Pascal Joined RejectNegative ++Enable a keyword, independently of dialect defaults ++ ++fenable-predefined-identifier= ++Pascal Joined RejectNegative ++Enable a predefined identifier, independently of dialect defaults ++ ++fexact-compare-strings ++Pascal ++Do not blank-pad strings for comparisons ++ ++fexecutable-file-name ++Pascal RejectNegative ++Derive output file name from main source file name ++ ++fexecutable-file-name= ++Pascal Joined RejectNegative ++Specify the name of the output file ++ ++fexecutable-path ++Pascal ++`--no-executable-path': Create the executable file in the directory where the main source is (default) ++ ++fexecutable-path= ++Pascal Joined RejectNegative ++Path where to create the executable file ++ ++fextended-pascal ++Pascal RejectNegative ++Reject anything besides ISO 10206 Extended Pascal ++ ++fextended-syntax ++Pascal ++same as `--ignore-function-results --pointer-arithmetic --cstrings-as-strings -Wno-absolute' (same as `{$X+}') ++ ++ffield-widths ++Pascal ++Use default field widths in write statements ++ ++ffield-widths= ++Pascal Joined RejectNegative ++Specify as a colon-separated list the default field widths in write statements for Integer, Real, Boolean, LongInt, LongReal ++ ++fgnu-objects ++Pascal RejectNegative ++Reset object model to default state ++ ++fgnu-pascal ++Pascal RejectNegative ++Undo the effect of previous dialect options, allow all features again ++ ++fgpc-main= ++Pascal Joined RejectNegative ++External name for the program's entry point (default: `main') ++ ++fgpi-destination-path= ++Pascal Joined RejectNegative ++(Internal switch used for automake) ++ ++fignore-function-results ++Pascal ++Do not complain when a function is called like a procedure ++ ++fignore-garbage-after-dot ++Pascal ++Ignore anything after the terminating `.' (default in `--borland-pascal') ++ ++fignore-packed ++Pascal ++Ignore `packed' in the source code (default in `--borland-pascal') ++ ++fimplementation-only ++Pascal RejectNegative ++Do not produce a GPI file; only compile the implementation part ++ ++fimplicit-result ++Pascal ++Enable implicit `Result' for functions (default only in `--delphi') ++ ++finit-modules= ++Pascal Joined RejectNegative ++Initialize the named modules in addition to those imported regularly; kind of a kludge ++ ++finterface-only ++Pascal RejectNegative ++Compile only the interface part of a unit/module and exit (creates `.gpi' file, no `.o' file) ++ ++fio-checking ++Pascal ++Check I/O operations automatically (same as `{$I+}') (default) ++ ++fiso-goto-restrictions ++Pascal ++Do not allow jumps into structured instructions (default) ++ ++flittle-endian ++Pascal RejectNegative ++Tell GPC that the system is little-endian (for those targets where it can vary) ++ ++flongjmp-all-nonlocal-labels ++Pascal ++Use `longjmp' for all nonlocal labels (default for Darwin/PPC) ++ ++fmac-objects ++Pascal RejectNegative ++Choose Mac object model ++ ++fmac-pascal ++Pascal RejectNegative ++Support (some features of) traditional Macintosh Pascal compilers ++ ++fmacros ++Pascal ++Expand macros (default except with `--ucsd-pascal', `--borland-pascal' or `--delphi') ++ ++fmaximum-field-alignment= ++Pascal Joined RejectNegative ++Set the maximum field alignment in bits if `pack-struct' is in effect ++ ++fmethods-always-virtual ++Pascal ++Make all methods virtual (default in `--mac-pascal') ++ ++fmixed-comments ++Pascal ++Allow comments like `{ ... *)' as required in ISO Pascal (default in ISO 7185/10206 Pascal mode) ++ ++fnested-comments ++Pascal ++Allow nested comments like `{ { } }' and `(* (* *) *)' ++ ++fnonlocal-exit ++Pascal ++Allow non-local `Exit' statements (default in `--ucsd-pascal' and `--mac-pascal') ++ ++fobject-checking ++Pascal ++Check for valid objects on virtual method calls (default) ++ ++fobject-destination-path ++Pascal ++`--no-object-destination-path': Create additional object files (e.g. of C files, not Pascal units) in the current directory (default) ++ ++fobject-destination-path= ++Pascal Joined RejectNegative ++Path where to create additional object files (e.g. of C files, not Pascal units) ++ ++fobject-pascal ++Pascal RejectNegative ++Reject anything besides (the implemented parts of) ANSI draft Object Pascal ++ ++fobject-path ++Pascal ++`--no-object-path': Forget about directories where to look for additional object (and source) files ++ ++fobject-path= ++Pascal Joined RejectNegative ++Directories where to look for additional object (and source) files ++ ++fobjects-are-references ++Pascal ++Turn objects into references (default in `--mac-pascal') ++ ++fobjects-require-override ++Pascal ++Require override directive for objects (default in `--mac-pascal') ++ ++fooe-objects ++Pascal RejectNegative ++Choose OOE object model ++ ++fpascal-sc ++Pascal RejectNegative ++Be strict about the implemented Pascal-SC extensions ++ ++fpedantic ++Pascal ++Reject everything not allowed in some dialect, e.g. redefinition of its keywords ++ ++fpointer-arithmetic ++Pascal ++Enable pointer arithmetic ++ ++fpointer-checking ++Pascal ++Validate pointers before dereferencing ++ ++fpointer-checking-user-defined ++Pascal ++Use user-defined procedure for validating pointers ++ ++fpreprocessed ++Pascal RejectNegative ++Treat the input file as already preprocessed ++ ++fprint-needed-options ++Pascal RejectNegative ++Print the needed options ++ ++fprogress-bar ++Pascal ++Output number of processed lines while compiling ++ ++fprogress-messages ++Pascal ++Output source file names and line numbers while compiling ++ ++fpropagate-units ++Pascal ++Automalically export all imported identifiers from a unit ++ ++frange-and-object-checking ++Pascal ++Same as `--range-checking --object-checking', same as `{$R+}' ++ ++frange-checking ++Pascal ++Do automatic range checks (default) ++ ++fread-base-specifier ++Pascal ++In read statements, allow input base specifier `n#' (default) ++ ++fread-hex ++Pascal ++In read statements, allow hexadecimal input with `$' (default) ++ ++fread-white-space ++Pascal ++In read statements, require whitespace after numbers ++ ++fsetlimit= ++Pascal Joined RejectNegative ++Define the range for `set of Integer' etc. ++ ++fshort-circuit ++Pascal ++Guarantee short-circuit Boolean evaluation (default; same as `{$B-}') ++ ++fstack-checking ++Pascal ++Enable stack checking (same as `{$S+}') ++ ++fstandard-pascal ++Pascal RejectNegative ++Synonym for `--classic-pascal' ++ ++fstandard-pascal-level-0 ++Pascal RejectNegative ++Synonym for `--classic-pascal-level-0' ++ ++fsun-pascal ++Pascal RejectNegative ++Support (a few features of) Sun Pascal ++ ++ftransparent-file-names ++Pascal ++Derive external file names from variable names ++ ++ftruncate-strings ++Pascal ++Truncate strings being assigned to other strings of too short capacity ++ ++ftyped-address ++Pascal ++Make the result of the address operator typed (same as `{$T+}', default) ++ ++fucsd-pascal ++Pascal RejectNegative ++Try to emulate UCSD Pascal ++ ++funit-destination-path ++Pascal ++`--no-unit-destination-path': Create object and GPI files of Pascal units in the current directory (default) ++ ++funit-destination-path= ++Pascal Joined RejectNegative ++Path where to create object and GPI files of Pascal units ++ ++funit-path ++Pascal ++`--no-unit-path': Forget about directories where to look for unit/module sources ++ ++funit-path= ++Pascal Joined RejectNegative ++Directories where to look for unit/module sources ++ ++fuses= ++Pascal Joined RejectNegative ++Add an implicit `uses' clause ++ ++fvax-pascal ++Pascal RejectNegative ++Support (a few features of) VAX Pascal ++ ++fwrite-capital-exponent ++Pascal ++Write real exponents with a capital `E' ++ ++fwrite-clip-strings ++Pascal ++In write statements, truncate strings exceeding their field width (`Write (SomeLongString : 3)') ++ ++fwrite-real-blank ++Pascal ++Output a blank in front of positive reals in exponential form (default) ++ ++idirafter ++Pascal Joined Separate ++`-idirafter ' Add to the end of the system include path ++ ++imacros ++Pascal Joined Separate ++-imacros Accept definition of macros in ++ ++include ++Pascal Joined Separate ++-include Include the contents of before other files ++ ++iprefix ++Pascal Joined Separate ++-iprefix Specify as a prefix for next two options ++ ++isystem ++Pascal Joined Separate ++-isystem Add to the start of the system include path ++ ++iwithprefix ++Pascal Joined Separate ++-iwithprefix Add to the end of the system include path ++ ++iwithprefixbefore ++Pascal Joined Separate ++-iwithprefixbefore Add to the end of the main include path ++ ++nostdinc ++Pascal ++Do not search standard system include directories (those specified with -isystem will still be used) ++ ++remap ++Pascal ++Remap file names when including files ++ ++v ++Pascal ++Enable verbose output ++ ++; This comment is to ensure we retain the blank line above. +diff -urN gcc.orig/p/lang-specs.h gcc/p/lang-specs.h +--- gcc.orig/p/lang-specs.h 1970-01-01 01:00:00.000000000 +0100 ++++ gcc/p/lang-specs.h 2006-03-25 02:53:09.000000000 +0100 +@@ -0,0 +1,46 @@ ++/*Definitions for specs for Pascal. ++ ++ Copyright (C) 1997-2006 Free Software Foundation, Inc. ++ ++ Authors: Peter Gerwinski ++ Frank Heckenbach ++ ++ This file is part of GNU Pascal. ++ ++ GNU Pascal 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, or (at your ++ option) any later version. ++ ++ GNU Pascal 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 GNU Pascal; see the file COPYING. If not, write to the ++ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA ++ 02111-1307, USA. */ ++ ++#include "p/p-version.h" ++ ++/* This is the contribution to the `default_compilers' array for Pascal. */ ++ {".pas", "@Pascal", 0}, ++ {".p", "@Pascal", 0}, ++ {".pp", "@Pascal", 0}, ++ {".dpr", "@Pascal", 0}, ++ {"@Pascal", ++ "gpc1 %{E:-E %{!M:%(cpp_unique_options) %1 %{m*} %{f*&W*&pedantic*} %{w} " ++ "%(cpp_debug_options) %{O*}}}" ++ "%{M:%(cpp_unique_options) %1 %{m*} %{f*&W*&pedantic*} %{w}" ++ "%(cpp_debug_options) %{O*}}" ++ "%{!E:%{!M:%{save-temps:-E %(cpp_unique_options) %1 %{m*} " ++ "%{f*&W*&pedantic*} %{w} %{O*} -o %b.i \n\ ++ gpc1 -fpreprocessed %b.i} %{!save-temps:%(cpp_unique_options)} \ ++ %(cc1_options)\ ++ %{!famtmpfile*:%eInternal GPC problem: internal option `--amtmpfile' not given}\ ++ %{!fsyntax-only:%(invoke_as)}}}", 0}, ++ {"@Preprocessed-Pascal", ++ "%{!M:%{!MM:%{!E:gpc1 -fpreprocessed %i %(cc1_options)\ ++ %{!famtmpfile*:%eInternal GPC problem: internal option `--amtmpfile' not given}\ ++ %{!fsyntax-only:%(invoke_as)} }}}", 0}, +diff -urN gcc.orig/p/p-version.h gcc/p/p-version.h +--- gcc.orig/p/p-version.h 1970-01-01 01:00:00.000000000 +0100 ++++ gcc/p/p-version.h 2006-03-25 02:53:09.000000000 +0100 +@@ -0,0 +1,7 @@ ++/* Generated automatically by the Makefile. ++ DO NOT CHANGE THIS FILE MANUALLY! */ ++ ++#define GPC_MAJOR "2" ++#define GPC_MINOR "1" ++#define GPC_VERSION_STRING "20060325" ++#define GPC_RELEASE_STRING GPC_VERSION_STRING diff --git a/recipes/gcc/gcc-svn/debian/gcc-ssp-default.dpatch b/recipes/gcc/gcc-svn/debian/gcc-ssp-default.dpatch new file mode 100644 index 0000000000..6ba9893680 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-ssp-default.dpatch @@ -0,0 +1,209 @@ +#! /bin/sh -e + +# DP: Turn on -fstack-protector by default for C, C++, ObjC, ObjC++. +# DP: Build libgcc using -fno-stack-protector. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/doc/invoke.texi.orig 2007-11-29 11:21:52.863409623 +0000 ++++ gcc/doc/invoke.texi 2007-11-29 11:22:35.014045455 +0000 +@@ -6553,6 +6553,10 @@ + when a function is entered and then checked when the function exits. + If a guard check fails, an error message is printed and the program exits. + ++NOTE: In Ubuntu 6.10 and later versions this option is enabled by default ++for C, C++, ObjC, ObjC++, if neither @option{-no-fstack-protector} ++nor @option{-nostdlib} are found. ++ + @item -fstack-protector-all + @opindex fstack-protector-all + Like @option{-fstack-protector} except that all functions are protected. +--- gcc/objc/lang-specs.h.orig 2007-11-29 11:21:52.863409623 +0000 ++++ gcc/objc/lang-specs.h 2007-11-29 11:22:35.014045455 +0000 +@@ -30,13 +30,13 @@ + %{traditional|ftraditional|traditional-cpp:\ + %eGNU Objective C no longer supports traditional compilation}\ + %{save-temps|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps:%b.mi} %{!save-temps:%g.mi} \n\ +- cc1obj -fpreprocessed %{save-temps:%b.mi} %{!save-temps:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\ ++ cc1obj -fpreprocessed %{save-temps:%b.mi} %{!save-temps:%g.mi} %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}\ + %{!save-temps:%{!no-integrated-cpp:\ +- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\ ++ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}}\ + %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0}, + {".mi", "@objc-cpp-output", 0, 0, 0}, + {"@objc-cpp-output", +- "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\ ++ "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\ + %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0}, + {"@objective-c-header", + "%{E|M|MM:cc1obj -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}\ +@@ -45,10 +45,10 @@ + %{traditional|ftraditional|traditional-cpp:\ + %eGNU Objective C no longer supports traditional compilation}\ + %{save-temps|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps:%b.mi} %{!save-temps:%g.mi} \n\ +- cc1obj -fpreprocessed %b.mi %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\ ++ cc1obj -fpreprocessed %b.mi %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\ + -o %g.s %{!o*:--output-pch=%i.gch}\ + %W{o*:--output-pch=%*}%V}\ + %{!save-temps:%{!no-integrated-cpp:\ +- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\ ++ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\ + -o %g.s %{!o*:--output-pch=%i.gch}\ + %W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0}, +--- gcc/objcp/lang-specs.h.orig 2007-11-29 11:21:52.863409623 +0000 ++++ gcc/objcp/lang-specs.h 2007-11-29 11:22:35.014045455 +0000 +@@ -36,7 +36,7 @@ + %(cpp_options) %2 -o %{save-temps:%b.mii} %{!save-temps:%g.mii} \n}\ + cc1objplus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.mii} %{!save-temps:%g.mii}}\ + %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\ +- %(cc1_options) %2 %{+e1*}\ ++ %(cc1_options) %(ssp_default) %2 %{+e1*}\ + -o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}", + CPLUSPLUS_CPP_SPEC, 0, 0}, + {"@objective-c++", +@@ -46,15 +46,15 @@ + %(cpp_options) %2 -o %{save-temps:%b.mii} %{!save-temps:%g.mii} \n}\ + cc1objplus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.mii} %{!save-temps:%g.mii}}\ + %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\ +- %(cc1_options) %2 %{+e1*}\ ++ %(cc1_options) %(ssp_default) %2 %{+e1*}\ + %{!fsyntax-only:%(invoke_as)}}}}", + CPLUSPLUS_CPP_SPEC, 0, 0}, + {".mii", "@objective-c++-cpp-output", 0, 0, 0}, + {"@objective-c++-cpp-output", + "%{!M:%{!MM:%{!E:\ +- cc1objplus -fpreprocessed %i %(cc1_options) %2 %{+e*}\ ++ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2 %{+e*}\ + %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0}, + {"@objc++-cpp-output", + "%{!M:%{!MM:%{!E:\ +- cc1objplus -fpreprocessed %i %(cc1_options) %2 %{+e*}\ ++ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2 %{+e*}\ + %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0}, +--- gcc/cp/lang-specs.h.orig 2007-11-29 11:21:52.863409623 +0000 ++++ gcc/cp/lang-specs.h 2007-11-29 11:22:35.014045455 +0000 +@@ -47,7 +47,7 @@ + %(cpp_options) %2 -o %{save-temps:%b.ii} %{!save-temps:%g.ii} \n}\ + cc1plus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.ii} %{!save-temps:%g.ii}}\ + %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\ +- %(cc1_options) %2 %{+e1*}\ ++ %(cc1_options) %(ssp_default) %2 %{+e1*}\ + %{!fsyntax-only:-o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}}", + CPLUSPLUS_CPP_SPEC, 0, 0}, + {"@c++", +@@ -57,11 +57,11 @@ + %(cpp_options) %2 -o %{save-temps:%b.ii} %{!save-temps:%g.ii} \n}\ + cc1plus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.ii} %{!save-temps:%g.ii}}\ + %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\ +- %(cc1_options) %2 %{+e1*}\ ++ %(cc1_options) %(ssp_default) %2 %{+e1*}\ + %{!fsyntax-only:%(invoke_as)}}}}", + CPLUSPLUS_CPP_SPEC, 0, 0}, + {".ii", "@c++-cpp-output", 0, 0, 0}, + {"@c++-cpp-output", + "%{!M:%{!MM:%{!E:\ +- cc1plus -fpreprocessed %i %(cc1_options) %2 %{+e*}\ ++ cc1plus -fpreprocessed %i %(cc1_options) %(ssp_default) %2 %{+e*}\ + %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0}, +--- gcc/Makefile.in.orig 2007-11-29 11:21:52.863409623 +0000 ++++ gcc/Makefile.in 2007-11-29 11:23:23.254773156 +0000 +@@ -559,6 +559,7 @@ + LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) \ + $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) \ + -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \ ++ -fno-stack-protector \ + $(INHIBIT_LIBC_CFLAGS) + + # Additional options to use when compiling libgcc2.a. +@@ -572,6 +573,7 @@ + CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ + -finhibit-size-directive -fno-inline-functions -fno-exceptions \ + -fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \ ++ -fno-stack-protector \ + $(INHIBIT_LIBC_CFLAGS) + + # Additional sources to handle exceptions; overridden by targets as needed. +--- gcc/gcc.c.orig 2007-11-29 11:21:52.873409773 +0000 ++++ gcc/gcc.c 2007-11-29 11:22:35.024045606 +0000 +@@ -701,6 +701,10 @@ + #endif + #endif + ++#ifndef SSP_DEFAULT_SPEC ++#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!nostdlib:-fstack-protector}}" ++#endif ++ + #ifndef LINK_PIE_SPEC + #ifdef HAVE_LD_PIE + #define LINK_PIE_SPEC "%{pie:-pie} " +@@ -754,6 +758,7 @@ + static const char *cc1plus_spec = CC1PLUS_SPEC; + static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC; + static const char *link_ssp_spec = LINK_SSP_SPEC; ++static const char *ssp_default_spec = SSP_DEFAULT_SPEC; + static const char *asm_spec = ASM_SPEC; + static const char *asm_final_spec = ASM_FINAL_SPEC; + static const char *link_spec = LINK_SPEC; +@@ -827,6 +832,7 @@ + %{--help=*:--help=%(VALUE)}\ + %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\ + %{fsyntax-only:-o %j} %{-param*}\ ++ %(ssp_default)\ + %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\ + %{coverage:-fprofile-arcs -ftest-coverage}"; + +@@ -988,15 +994,15 @@ + %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \ + %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\ + cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \ +- %(cc1_options)}\ ++ %(cc1_options) %(ssp_default)}\ + %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\ +- cc1 %(cpp_unique_options) %(cc1_options)}}}\ ++ cc1 %(cpp_unique_options) %(cc1_options) %(ssp_default)}}}\ + %{!fsyntax-only:%(invoke_as)}} \ + %{combine:\ + %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \ + %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\ + %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\ +- cc1 %(cpp_unique_options) %(cc1_options)}}\ ++ cc1 %(cpp_unique_options) %(cc1_options) %(ssp_default)}}\ + %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1}, + {"-", + "%{!E:%e-E or -x required when input is from standard input}\ +@@ -1019,7 +1025,7 @@ + %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0}, + {".i", "@cpp-output", 0, 1, 0}, + {"@cpp-output", +- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0}, ++ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %(ssp_default) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0}, + {".s", "@assembler", 0, 1, 0}, + {"@assembler", + "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0}, +@@ -1579,6 +1585,7 @@ + INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec), + INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec), + INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec), ++ INIT_STATIC_SPEC ("ssp_default", &ssp_default_spec), + INIT_STATIC_SPEC ("endfile", &endfile_spec), + INIT_STATIC_SPEC ("link", &link_spec), + INIT_STATIC_SPEC ("lib", &lib_spec), diff --git a/recipes/gcc/gcc-svn/debian/gcc-textdomain.dpatch b/recipes/gcc/gcc-svn/debian/gcc-textdomain.dpatch new file mode 100644 index 0000000000..6315a19de5 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gcc-textdomain.dpatch @@ -0,0 +1,103 @@ +#! /bin/sh -e + +# DP: Set gettext's domain and textdomain to the versioned package name. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/Makefile.in.orig 2005-09-04 23:32:54.003440040 +0000 ++++ gcc/Makefile.in 2005-09-04 23:40:10.954013456 +0000 +@@ -4565,8 +4565,8 @@ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + echo $(mkinstalldirs) $(DESTDIR)$$dir; \ + $(mkinstalldirs) $(DESTDIR)$$dir || exit 1; \ +- echo $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/gcc.mo; \ +- $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/gcc.mo; \ ++ echo $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/gcc-4.3.mo; \ ++ $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/gcc-4.3.mo; \ + done + + # Rule for regenerating the message template (gcc.pot). +--- gcc/intl.c.orig 2005-09-04 23:32:54.006439584 +0000 ++++ gcc/intl.c 2005-09-04 23:36:37.933397512 +0000 +@@ -51,8 +51,8 @@ + setlocale (LC_ALL, ""); + #endif + +- (void) bindtextdomain ("gcc", LOCALEDIR); +- (void) textdomain ("gcc"); ++ (void) bindtextdomain ("gcc-4.3", LOCALEDIR); ++ (void) textdomain ("gcc-4.3"); + + /* Opening quotation mark. */ + open_quote = _("`"); +--- libcpp/Makefile.in.orig 2005-09-04 23:32:54.009439128 +0000 ++++ libcpp/Makefile.in 2005-09-04 23:33:24.607787472 +0000 +@@ -47,6 +47,7 @@ + LIBICONV = @LIBICONV@ + LIBINTL = @LIBINTL@ + PACKAGE = @PACKAGE@ ++PACKAGE_SUFFIX = -4.3 + RANLIB = @RANLIB@ + SHELL = @SHELL@ + USED_CATALOGS = @USED_CATALOGS@ +@@ -66,6 +67,7 @@ + + INCLUDES = -I$(srcdir) -I. -I$(srcdir)/../include @INCINTL@ \ + -I$(srcdir)/include ++CPPFLAGS += -DPACKAGE_SUFFIX=\"$(strip $(PACKAGE_SUFFIX))\" + + ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS) + +@@ -156,8 +158,8 @@ + else continue; \ + fi; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ +- echo $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \ +- $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \ ++ echo $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE)$(PACKAGE_SUFFIX).mo; \ ++ $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE)$(PACKAGE_SUFFIX).mo; \ + done + + mostlyclean: +--- libcpp/system.h.orig 2005-09-04 23:32:54.006439584 +0000 ++++ libcpp/system.h 2005-09-04 23:33:24.606787624 +0000 +@@ -260,7 +260,7 @@ + #endif + + #ifndef _ +-# define _(msgid) dgettext (PACKAGE, msgid) ++# define _(msgid) dgettext (PACKAGE PACKAGE_SUFFIX, msgid) + #endif + + #ifndef N_ +--- libcpp/init.c.orig 2005-09-04 23:32:54.008439280 +0000 ++++ libcpp/init.c 2005-09-04 23:33:24.607787472 +0000 +@@ -122,7 +122,7 @@ + init_trigraph_map (); + + #ifdef ENABLE_NLS +- (void) bindtextdomain (PACKAGE, LOCALEDIR); ++ (void) bindtextdomain (PACKAGE PACKAGE_SUFFIX, LOCALEDIR); + #endif + } + } diff --git a/recipes/gcc/gcc-svn/debian/gdc-fix-build-kbsd-gnu.dpatch b/recipes/gcc/gcc-svn/debian/gdc-fix-build-kbsd-gnu.dpatch new file mode 100644 index 0000000000..9878d8abfb --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gdc-fix-build-kbsd-gnu.dpatch @@ -0,0 +1,87 @@ +#! /bin/sh -e + +# gdc-fix-build-kfreebsd.dpatch by Arthur Loiret +# DP: Fix gdc build on k*bsd*-gnu, update configure and target-ver-syms.sh +# DP: to build k*bsd*-gnu architectures as a freebsd + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- gcc/d/phobos/configure 2007-09-03 01:23:59.000000000 +0200 ++++ gcc/d/phobos/configure 2007-09-03 01:27:18.000000000 +0200 +@@ -4599,7 +4599,7 @@ + case "$target_os" in + darwin6*) DCFG_LONG_DOUBLE_FUNCS=config/noldfuncs ;; + darwin*) DCFG_LONG_DOUBLE_FUNCS=config/ldfuncs-darwin ;; +- linux*) ++ linux*|k*bsd*-gnu) + case "$target_cpu" in + powerpc*) + DCFG_LONG_DOUBLE_FUNCS=config/ldfuncs-ppclinux +@@ -5687,7 +5687,7 @@ + + case "$d_target_os" in + # use fpmath on Linux +- linux*) d_have_fpsb='' ++ linux*|k*bsd*-gnu) d_have_fpsb='' + ;; + esac + +@@ -7014,7 +7014,7 @@ + rm -f conftest.d conftest.$ac_objext + + case "$d_target_os" in +- aix*|*bsd*|cygwin*|darwin*|linux*|skyos*|solaris*|sysv*) d_have_unix=1 ;; ++ aix*|*bsd*|cygwin*|darwin*|linux*|k*bsd*-gnu|skyos*|solaris*|sysv*) d_have_unix=1 ;; + esac + + DCFG_CBRIDGE_STDIO= +@@ -7027,7 +7027,7 @@ + d_sem_impl="mach" + d_have_loader=1 + ;; +- freebsd*) ++ freebsd*|k*bsd*-gnu) + d_have_loader=1 + D_EXTRA_OBJS="$D_EXTRA_OBJS gcc/cbridge_stdio.o" + DCFG_CBRIDGE_STDIO=GNU_CBridge_Stdio +@@ -9046,7 +9046,7 @@ + d_gc_stack=GC_Use_Stack_Fixed + d_gc_data="$d_gc_data GC_Use_Data_Dyld" + ;; +- freebsd*) D_GC_MODULES="$D_GC_MODULES internal/gc/gc_freebsd.o" ++ freebsd*|k*bsd*-gnu) D_GC_MODULES="$D_GC_MODULES internal/gc/gc_freebsd.o" + d_gc_stack=GC_Use_Stack_FreeBSD + d_gc_data="$d_gc_data GC_Use_Data_Fixed" + ;; +--- gcc/d/target-ver-syms.sh 2007-09-03 02:14:56.000000000 +0200 ++++ gcc/d/target-ver-syms.sh 2007-09-03 02:52:43.000000000 +0200 +@@ -30,6 +30,7 @@ + darwin*) d_os_versym=darwin ; d_unix=1 ;; + elf*) ;; + freebsd*) d_os_versym=freebsd ; d_unix=1 ;; ++k*bsd*-gnu) d_os_versym=freebsd ; d_unix=1;; + linux*) d_os_versym=linux ; d_unix=1 ;; + mingw32*) d_os_versym=Win32; d_windows=1 ;; + pe*) case "$target" in diff --git a/recipes/gcc/gcc-svn/debian/gpc-4.1.dpatch b/recipes/gcc/gcc-svn/debian/gpc-4.1.dpatch new file mode 100644 index 0000000000..fcd499115f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gpc-4.1.dpatch @@ -0,0 +1,28 @@ +#! /bin/sh -e + +# DP: GPC updates for GCC 4.1.2 + +dir=gcc/ +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3/gcc" + dir="$3/gcc/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Not yet available for GCC-4.3 diff --git a/recipes/gcc/gcc-svn/debian/gpc-gcc-4.x.dpatch b/recipes/gcc/gcc-svn/debian/gpc-gcc-4.x.dpatch new file mode 100644 index 0000000000..9ddfced70d --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gpc-gcc-4.x.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh -e + +# DP: The gpc patch from the gpc tarball. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + #pdir="-d $3/gcc" + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +gpc_gcc_patch=$pdir/p/diffs/gcc-4.1.diff +gpc_gcc_patch=debian/patches/gpc-gcc-4.1.diff + +case "$1" in + -patch) + echo Using patch file ${gpc_gcc_patch} + patch $pdir -f -p0 < ${gpc_gcc_patch} + ;; + -unpatch) + # get the patch from the gpc source + echo Using patch file ${gpc_gcc_patch} + patch $pdir -f -R -p0 < ${gpc_gcc_patch} + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 diff --git a/recipes/gcc/gcc-svn/debian/gpc-names.dpatch b/recipes/gcc/gcc-svn/debian/gpc-names.dpatch new file mode 100644 index 0000000000..f494383ca3 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/gpc-names.dpatch @@ -0,0 +1,117 @@ +#! /bin/sh -e + +# DP: versioned gpc names + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/p/doc/en/gpc.texi.orig 2007-08-27 00:21:02.340767891 +0200 ++++ gcc/p/doc/en/gpc.texi 2007-08-27 00:21:29.921183935 +0200 +@@ -23,11 +23,11 @@ + + @dircategory GNU programming tools + @direntry +-* GPC: (gpc). The GNU Pascal Compiler. ++* GPC-4.1: (gpc-4.1). The GNU Pascal Compiler (v2.1, based on GCC 4.1). + @end direntry + @dircategory Individual utilities + @direntry +-* GPC: (gpc)Invoking GPC. The GNU Pascal Compiler. ++* GPC-4.1: (gpc-4.1)Invoking GPC. The GNU Pascal Compiler (v2.1, based on GCC 4.1). + @end direntry + + @c For FSF printing, turn on finalout (to get rid of the black +--- gcc/p/Make-lang.in.orig 2007-08-27 00:21:02.340767891 +0200 ++++ gcc/p/Make-lang.in 2007-08-27 00:23:19.412835592 +0200 +@@ -799,42 +799,43 @@ + pascal.start.encap: + pascal.rest.encap: pascal.rts pascal.utils + +-pascal.info: $(srcdir)/p/doc/info/gpc.info \ +- $(srcdir)/p/doc/info/gpcs.info \ +- $(srcdir)/p/doc/info/gpcs-de.info \ +- $(srcdir)/p/doc/info/gpc-hr.info \ +- $(srcdir)/p/doc/info/gpcs-hr.info \ +- $(srcdir)/p/doc/info/gpc-es.info \ +- $(srcdir)/p/doc/info/gpcs-es.info ++iv=-4.1 ++pascal.info: $(srcdir)/p/doc/info/gpc$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-de$(iv).info \ ++ $(srcdir)/p/doc/info/gpc-hr$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-hr$(iv).info \ ++ $(srcdir)/p/doc/info/gpc-es$(iv).info \ ++ $(srcdir)/p/doc/info/gpcs-es$(iv).info + pascal.dvi: gpc.dvi + +-$(srcdir)/p/doc/info/gpc.info: $(GPC_TEXI_EN) ++$(srcdir)/p/doc/info/gpc$(iv).info: $(GPC_TEXI_EN) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_EN) -o $(srcdir)/p/doc/info/gpc.info gpc.texi ++ $(MAKEINFO_EN) -o $(srcdir)/p/doc/info/gpc$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs.info: $(GPC_TEXI_EN) ++$(srcdir)/p/doc/info/gpcs$(iv).info: $(GPC_TEXI_EN) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_EN) --no-split -o $(srcdir)/p/doc/info/gpcs.info gpcs.texi ++ $(MAKEINFO_EN) --no-split -o $(srcdir)/p/doc/info/gpcs$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpcs-de.info: $(GPC_TEXI_DE) ++$(srcdir)/p/doc/info/gpcs-de$(iv).info: $(GPC_TEXI_DE) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_DE) --no-split -o $(srcdir)/p/doc/info/gpcs-de.info gpcs.texi ++ $(MAKEINFO_DE) --no-split -o $(srcdir)/p/doc/info/gpcs-de$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpc-hr.info: $(GPC_TEXI_HR) ++$(srcdir)/p/doc/info/gpc-hr$(iv).info: $(GPC_TEXI_HR) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_HR) -o $(srcdir)/p/doc/info/gpc-hr.info gpc.texi ++ $(MAKEINFO_HR) -o $(srcdir)/p/doc/info/gpc-hr$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs-hr.info: $(GPC_TEXI_HR) ++$(srcdir)/p/doc/info/gpcs-hr$(iv).info: $(GPC_TEXI_HR) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_HR) --no-split -o $(srcdir)/p/doc/info/gpcs-hr.info gpcs.texi ++ $(MAKEINFO_HR) --no-split -o $(srcdir)/p/doc/info/gpcs-hr$(iv).info gpcs.texi + +-$(srcdir)/p/doc/info/gpc-es.info: $(GPC_TEXI_ES) ++$(srcdir)/p/doc/info/gpc-es$(iv).info: $(GPC_TEXI_ES) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_ES) -o $(srcdir)/p/doc/info/gpc-es.info gpc.texi ++ $(MAKEINFO_ES) -o $(srcdir)/p/doc/info/gpc-es$(iv).info gpc.texi + +-$(srcdir)/p/doc/info/gpcs-es.info: $(GPC_TEXI_ES) ++$(srcdir)/p/doc/info/gpcs-es$(iv).info: $(GPC_TEXI_ES) + [ -d "$(srcdir)/p/doc/info" ] || $(srcdir)/p/script/mkdir-p "$(srcdir)/p/doc/info" +- $(MAKEINFO_ES) --no-split -o $(srcdir)/p/doc/info/gpcs-es.info gpcs.texi ++ $(MAKEINFO_ES) --no-split -o $(srcdir)/p/doc/info/gpcs-es$(iv).info gpcs.texi + + gpc.dvi: $(GPC_TEXI_EN) + TEXINPUTS=$(srcdir)/p/doc:$(srcdir)/p/doc/images:$$TEXINPUTS \ +@@ -1023,11 +1024,11 @@ + fi + + pascal.install-info: pascal.install-info-man-dirs pascal.info +- rm -f $(DESTDIR)$(infodir)/gpc.info* $(DESTDIR)$(infodir)/gpcs.info* $(DESTDIR)$(infodir)/gpcs-de.info* $(DESTDIR)$(infodir)/gpcs-hr.info* $(DESTDIR)$(infodir)/gpcs-es.info* +- for f in `cd $(srcdir)/p/doc/info && echo gpc.info* gpcs*.info*`; do \ ++ rm -f $(DESTDIR)$(infodir)/gpc*.info* $(DESTDIR)$(infodir)/gpcs*.info* $(DESTDIR)$(infodir)/gpcs-de*.info* $(DESTDIR)$(infodir)/gpcs-hr*.info* $(DESTDIR)$(infodir)/gpcs-es*.info* ++ for f in `cd $(srcdir)/p/doc/info && echo gpc$(iv).info* gpcs*.info*`; do \ + $(INSTALL_DATA) $(srcdir)/p/doc/info/$$f $(DESTDIR)$(infodir)/$$f || exit 1; \ + done +- chmod a-x $(DESTDIR)$(infodir)/gpc.info* $(DESTDIR)$(infodir)/gpcs.info* $(DESTDIR)$(infodir)/gpcs-de.info* $(DESTDIR)$(infodir)/gpcs-hr.info* $(DESTDIR)$(infodir)/gpcs-es.info* ++ chmod a-x $(DESTDIR)$(infodir)/gpc*.info* $(DESTDIR)$(infodir)/gpcs*.info* $(DESTDIR)$(infodir)/gpcs-de*.info* $(DESTDIR)$(infodir)/gpcs-hr*.info* $(DESTDIR)$(infodir)/gpcs-es*.info* + + pascal.install-man: pascal.install-info-man-dirs $(srcdir)/p/doc/en/gpc.1 $(srcdir)/p/doc/generated/gpc-run.1 + -if [ -f gpc1$(exeext) ]; then \ diff --git a/recipes/gcc/gcc-svn/debian/hurd-changes.dpatch b/recipes/gcc/gcc-svn/debian/hurd-changes.dpatch new file mode 100644 index 0000000000..1ccb5ca269 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/hurd-changes.dpatch @@ -0,0 +1,72 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Traditional GNU systems don't have a /usr directory. However, Debian +# DP: systems do, and we support both having a /usr -> . symlink, and having a +# DP: /usr directory like the other ports. So this patch should NOT go +# DP: upstream. +# DP: +# DP: Define MAXPATHLEN and PATH_MAX. + +--- gcc/config/gnu.h.orig 2004-07-05 21:49:20.000000000 +0200 ++++ gcc/config/gnu.h 2006-12-10 12:28:45.000000000 +0100 +@@ -6,7 +6,8 @@ + + /* Standard include directory. In GNU, "/usr" is a four-letter word. */ + #undef STANDARD_INCLUDE_DIR +-#define STANDARD_INCLUDE_DIR "/include" ++/* Overriden for Debian GNU/Hurd. */ ++#define STANDARD_INCLUDE_DIR "/usr/include" + + /* The system headers under GNU are C++-aware. */ + #define NO_IMPLICIT_EXTERN_C +--- gcc/config/t-gnu.orig 2004-01-10 07:40:24.000000000 +0100 ++++ gcc/config/t-gnu 2006-12-10 12:28:45.000000000 +0100 +@@ -1,2 +1,2 @@ + # In GNU, "/usr" is a four-letter word. +-NATIVE_SYSTEM_HEADER_DIR = /include ++NATIVE_SYSTEM_HEADER_DIR = /usr/include +--- gcc/tlink.c.orig 2005-06-25 04:02:01.000000000 +0200 ++++ gcc/tlink.c 2006-12-10 12:28:45.000000000 +0100 +@@ -34,6 +34,10 @@ + + #define MAX_ITERATIONS 17 + ++#ifndef MAXPATHLEN ++#define MAXPATHLEN 4096 ++#endif ++ + /* Defined in the automatically-generated underscore.c. */ + extern int prepends_underscore; + +--- boehm-gc/dyn_load.c.orig 2007-08-13 09:10:48.215678000 +0200 ++++ boehm-gc/dyn_load.c 2007-08-13 09:11:09.743969000 +0200 +@@ -26,7 +26,7 @@ + * None of this is safe with dlclose and incremental collection. + * But then not much of anything is safe in the presence of dlclose. + */ +-#if (defined(__linux__) || defined(__GLIBC__)) && !defined(_GNU_SOURCE) ++#if (defined(__linux__) || defined(__GLIBC__) || defined(__GNU__)) && !defined(_GNU_SOURCE) + /* Can't test LINUX, since this must be define before other includes */ + # define _GNU_SOURCE + #endif diff --git a/recipes/gcc/gcc-svn/debian/ignore-comp-fail.dpatch b/recipes/gcc/gcc-svn/debian/ignore-comp-fail.dpatch new file mode 100644 index 0000000000..4609a82120 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ignore-comp-fail.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: Ignore the bootstrap comparision failure + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/Makefile.in~ 2004-02-06 08:03:12.000000000 +0100 ++++ gcc/Makefile.in 2004-02-14 10:27:19.000000000 +0100 +@@ -3567,7 +3567,9 @@ + if [ -f .bad_compare ]; then \ + echo "Bootstrap comparison failure!"; \ + cat .bad_compare; \ +- exit 1; \ ++ echo ""; \ ++ echo "Ignore the comparision failure!"; \ ++ true; \ + else \ + case "$@" in \ + *-lean ) rm -rf stage$$stage ;; \ diff --git a/recipes/gcc/gcc-svn/debian/kbsd-gnu-ada.dpatch b/recipes/gcc/gcc-svn/debian/kbsd-gnu-ada.dpatch new file mode 100644 index 0000000000..e159ec3fd0 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/kbsd-gnu-ada.dpatch @@ -0,0 +1,231 @@ +#! /bin/sh -e + +# Description: Ada support for GNU/k*BSD +# Author: Aurelien Jarno +# Status: submitted. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +--- src/gcc/ada/Makefile.in.orig 2008-02-09 13:03:14 +0100 ++++ src/gcc/ada/Makefile.in 2008-02-09 13:03:33 +0100 +@@ -866,6 +866,8 @@ + s-osinte.adstm_gmtoff; + + /* All other platforms: Treat all time values in GMT */ +--- src/gcc/ada/link.c.orig 2008-02-10 11:59:07 +0100 ++++ src/gcc/ada/link.c 2008-02-10 11:59:14 +0100 +@@ -153,7 +153,7 @@ + unsigned char __gnat_using_gnu_linker = 1; + const char *__gnat_object_library_extension = ".a"; + +-#elif defined (linux) ++#elif defined (linux) || defined(__GLIBC__) + const char *__gnat_object_file_option = ""; + const char *__gnat_run_path_option = ""; + char __gnat_shared_libgnat_default = SHARED; diff --git a/recipes/gcc/gcc-svn/debian/kbsd-gnu.dpatch b/recipes/gcc/gcc-svn/debian/kbsd-gnu.dpatch new file mode 100644 index 0000000000..5c9bb0e708 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/kbsd-gnu.dpatch @@ -0,0 +1,99 @@ +#! /bin/sh -e + +# DP: GNU/k*BSD support +# Author: Robert Millan +# Status: Not yet submitted + + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +diff -Nurd gcc-4.2.orig/gcc/config/i386/kfreebsd-gnu.h gcc-4.2/gcc/config/i386/kfreebsd-gnu.h +--- gcc-4.2.orig/gcc/config/i386/kfreebsd-gnu.h 2006-01-18 22:46:30.000000000 +0100 ++++ gcc-4.2/gcc/config/i386/kfreebsd-gnu.h 2007-05-23 05:34:47.000000000 +0200 +@@ -20,7 +20,29 @@ + the Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + ++#ifdef GLIBC_DYNAMIC_LINKER32 ++#undef GLIBC_DYNAMIC_LINKER32 ++#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" ++#endif ++ ++#ifdef GLIBC_DYNAMIC_LINKER64 ++#undef GLIBC_DYNAMIC_LINKER64 ++#define GLIBC_DYNAMIC_LINKER64 "/lib/ld-kfreebsd-x86-64.so.1" ++#endif ++ + #undef LINK_EMULATION + #define LINK_EMULATION "elf_i386_fbsd" ++ ++#ifdef LINK_EMULATION32 ++#undef LINK_EMULATION32 ++#define LINK_EMULATION32 LINK_EMULATION ++#endif ++ ++#ifdef LINK_EMULATION64 ++#undef LINK_EMULATION64 ++#define LINK_EMULATION64 "elf_x86_64_fbsd" ++#endif ++ + #undef REG_NAME + #define REG_NAME(reg) sc_ ## reg ++ +diff -Nurd gcc-4.2.orig/gcc/config/i386/linux64.h gcc-4.2/gcc/config/i386/linux64.h +--- gcc-4.2.orig/gcc/config/i386/linux64.h 2007-05-22 22:25:11.000000000 +0200 ++++ gcc-4.2/gcc/config/i386/linux64.h 2007-05-23 05:39:11.000000000 +0200 +@@ -53,8 +53,11 @@ + When the -shared link option is used a final link is not being + done. */ + ++/* These macros may be overridden in k*bsd-gnu.h and i386/k*bsd-gnu.h. */ + #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2" + #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2" ++#define LINK_EMULATION32 "elf_i386" ++#define LINK_EMULATION64 "elf_x86_64" + + #if TARGET_64BIT_DEFAULT + #define SPEC_32 "m32" +@@ -65,7 +68,7 @@ + #endif + + #undef LINK_SPEC +-#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} --hash-style=both \ ++#define LINK_SPEC "%{" SPEC_64 ":-m " LINK_EMULATION64 "} %{" SPEC_32 ":-m " LINK_EMULATION32 "} --hash-style=both \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ +diff -Nurd gcc-4.2.orig/gcc/config.gcc gcc-4.2/gcc/config.gcc +--- gcc-4.2.orig/gcc/config.gcc 2007-02-03 10:03:58.000000000 +0100 ++++ gcc-4.2/gcc/config.gcc 2007-05-23 05:37:10.000000000 +0200 +@@ -1102,7 +1102,7 @@ + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h \ + i386/x86-64.h i386/linux64.h" + case ${target} in +- x86_64-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h" ;; ++ x86_64-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;; + x86_64-*-knetbsd*-gnu) tm_file="${tm_file} knetbsd-gnu.h" ;; + esac + tmake_file="${tmake_file} i386/t-linux64 i386/t-crtfm t-dfprules" diff --git a/recipes/gcc/gcc-svn/debian/libffi-configure.dpatch b/recipes/gcc/gcc-svn/debian/libffi-configure.dpatch new file mode 100644 index 0000000000..8cc9d23550 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libffi-configure.dpatch @@ -0,0 +1,45 @@ +#! /bin/sh -e + +# DP: Add --enable-libffi option to toplevel configure script + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir} && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- configure.ac.orig 2007-08-27 13:42:57.000000000 +0200 ++++ configure.ac 2007-09-01 15:57:19.664811738 +0200 +@@ -347,6 +347,16 @@ + ENABLE_LIBSSP=$enableval, + ENABLE_LIBSSP=yes) + ++AC_ARG_ENABLE(libffi, ++[ --enable-libffi build libffi directory], ++ENABLE_LIBFFI=$enableval, ++ENABLE_LIBFFI=yes) ++if test "${ENABLE_LIBFFI}" != "yes" ; then ++ noconfigdirs="$noconfigdirs target-libffi" ++else ++ libgcj="`echo $libgcj | sed 's/target-libffi *//'`" ++fi ++ + # Save it here so that, even in case of --enable-libgcj, if the Java + # front-end isn't enabled, we still get libgcj disabled. + libgcj_saved=$libgcj diff --git a/recipes/gcc/gcc-svn/debian/libjava-armel-ldflags.dpatch b/recipes/gcc/gcc-svn/debian/libjava-armel-ldflags.dpatch new file mode 100644 index 0000000000..ecaddb61e0 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-armel-ldflags.dpatch @@ -0,0 +1,38 @@ +#! /bin/sh -e + +# DP: Adjust libjava extra_ldflags for armel. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libjava && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm -f ${dir}libjava/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/configure.ac~ 2008-01-14 15:45:26.698717101 +0100 ++++ libjava/configure.ac 2008-01-14 15:47:37.460689616 +0100 +@@ -807,7 +807,7 @@ + # Some of the ARM unwinder code is actually in libstdc++. We + # could in principle replicate it in libgcj, but it's better to + # have a dependency on libstdc++. +- extra_ldflags='-L$(here)/../libstdc++-v3/src/.libs -lstdc++' ++ extra_ldflags='-L$(here)/../libstdc++-v3/src -L$(here)/../libstdc++-v3/src/.libs -lstdc++' + LIBSTDCXXSPEC=-lstdc++ + LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -L`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -rpath `${PWDCMD-pwd}`/.libs:`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -lstdc++" + ;; diff --git a/recipes/gcc/gcc-svn/debian/libjava-debuginfo.dpatch b/recipes/gcc/gcc-svn/debian/libjava-debuginfo.dpatch new file mode 100644 index 0000000000..942bbe1f91 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-debuginfo.dpatch @@ -0,0 +1,43 @@ +#! /bin/sh -e + +# DP: Fix java debuginfo breakage. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-03-06 Andrew Haley + + * jcf-parse.c (give_name_to_class): Call find_sourcefile fo find full + pathname of source file. + +Index: jcf-parse.c +=================================================================== +--- gcc/java/jcf-parse.c (revision 131324) ++++ gcc/java/jcf-parse.c (working copy) +@@ -1208,7 +1208,7 @@ + #ifdef USE_MAPPED_LOCATION + { + tree source_name = identifier_subst (class_name, "", '.', '/', ".java"); +- const char *sfname = IDENTIFIER_POINTER (source_name); ++ const char *sfname = find_sourcefile (IDENTIFIER_POINTER (source_name)); + linemap_add (line_table, LC_ENTER, false, sfname, 0); + input_location = linemap_line_start (line_table, 0, 1); + file_start_location = input_location; diff --git a/recipes/gcc/gcc-svn/debian/libjava-disable-static.dpatch b/recipes/gcc/gcc-svn/debian/libjava-disable-static.dpatch new file mode 100644 index 0000000000..23f6846c3f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-disable-static.dpatch @@ -0,0 +1,45 @@ +#! /bin/sh -e + +# DP: Disable building the static libjava. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- Makefile.in~ 2007-03-26 10:44:16.881179540 +0200 ++++ Makefile.in 2007-03-26 10:48:27.564961048 +0200 +@@ -43901,7 +43901,7 @@ + rm -f no-such-file || : ; \ + CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ +- --target=${target_alias} $${srcdiroption} \ ++ --target=${target_alias} --disable-static $${srcdiroption} \ + || exit 1 + @endif target-libjava + +@@ -44783,7 +44783,7 @@ + rm -f no-such-file || : ; \ + CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \ + $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \ +- --target=${target_alias} $${srcdiroption} \ ++ --target=${target_alias} --disable-static $${srcdiroption} \ + || exit 1 + @endif target-boehm-gc + diff --git a/recipes/gcc/gcc-svn/debian/libjava-jar.dpatch b/recipes/gcc/gcc-svn/debian/libjava-jar.dpatch new file mode 100644 index 0000000000..38177b2495 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-jar.dpatch @@ -0,0 +1,227 @@ +#! /bin/sh -e + +# DP: gjar: support @ arguments. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + uudecode $0 + tar -xv -f jar-main-classes.tar.bz2 -C ${dir}libjava + rm -f jar-main-classes.tar.bz2* + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +From: Christian Thalinger + +While building OpenJDK b16 I noticed that jar does not support @ +arguments. OpenJDK e.g. uses it to import the binary plug files. + +This patch adds support for @filelist, where the file filelist may only +contain files and not options, as the spec says. + +Index: libjava/classpath/tools/gnu/classpath/tools/jar/Main.java +=================================================================== +RCS file: /cvsroot/classpath/classpath/tools/gnu/classpath/tools/jar/Main.java,v +retrieving revision 1.9 +diff -u -3 -p -r1.9 Main.java +--- libjava/classpath/tools/gnu/classpath/tools/jar/Main.java 31 Jan 2007 17:05:34 -0000 1.9 ++++ libjava/classpath/tools/gnu/classpath/tools/jar/Main.java 23 Jul 2007 18:31:19 -0000 +@@ -47,6 +47,8 @@ import gnu.classpath.tools.getopt.Parser + + import java.io.BufferedReader; + import java.io.File; ++import java.io.FileNotFoundException; ++import java.io.FileReader; + import java.io.InputStreamReader; + import java.io.IOException; + import java.text.MessageFormat; +@@ -102,14 +104,51 @@ public class Main + public void notifyFile(String fileArgument) + { + Entry entry; ++ ++ if (fileArgument.charAt(0) == '@') ++ { ++ BufferedReader br = null; ++ String filename; ++ ++ try ++ { ++ br = ++ new BufferedReader(new FileReader(fileArgument.substring(1))); ++ } ++ catch (FileNotFoundException fnfe) ++ { ++ System.err.println(fnfe); ++ System.exit(1); ++ } ++ ++ try ++ { ++ while ((filename = br.readLine()) != null) ++ addEntry(filename); ++ } ++ catch (IOException ioe) ++ { ++ ioe.printStackTrace(); ++ } ++ } ++ else ++ { ++ addEntry(fileArgument); ++ } ++ } ++ ++ private final void addEntry(String filename) ++ { ++ Entry entry; ++ + if (changedDirectory != null) + { +- entry = new Entry(new File(changedDirectory, fileArgument), +- fileArgument); ++ entry = new Entry(new File(changedDirectory, filename), ++ filename); + changedDirectory = null; + } + else +- entry = new Entry(new File(fileArgument)); ++ entry = new Entry(new File(filename)); + entries.add(entry); + } + } + + +begin-base64 644 jar-main-classes.tar.bz2 +QlpoOTFBWSZTWW4Pr8QAFqP///////////////////////////////////// +////////4BOPr29evtt9a93vvsuw0a9lKAaOfcb1vZ9At3H0B99gLzH0+EA8 +2AFAAVnBDJEBMhPRMkZlDI0Mo2ERp6jE8mjSD0EaDaU9GU/Sm2U0zSDT1MNJ +k0mBphNG1TxTGpvSaT0xGU02iYEbRoD1NBNqbQ0abU0NNNDJoeoyNtVBkiJp +kDIGk01NpNpqegniaJoanqeQnqaZNGmj1ANAwhoaGgAaMgAGTQyaaAMgNABo +ADQaAGQ0AGgDQAAAEIASamamIgNqZAADQDQDQDQAABoAAAADIAAAAAAAAAAA +AAAAAAAaAAAEhSKYqAfpQ9Q0aGgBoDTQBo9QAPUDTQAZABo0AeoaaAGgAAAA +NMgA0AAANAAAAAaAA0AAilKek2kKfkU/UHokPCJoek0AaABhMgyPU9R6gBo0 +0AGgDQ0AMQBhDQADID1AAAAAABkAyaMJoAAAESiCZAgTCBpGaTCp7RP1Gqex +KepsaZU9TDSNP0pp6myIAMn6o2kZHptU0NNAPUGhtQDRoAANAaGgADQAAAAA +AAANORgXkIhhCi1SRyiIoJ2mm1Wt12x2sXO5wkZ8kLEfmiQoH/XjqQsgDANT +ZFNpCAbQFPZAlk3xj7KoxTNdac3Clvk4ClApjUVWEBqaOkwUmcJbpFrAK6kH +JVugdJN5bL/awNpwKg0UMv0kioqlgFCUlJVKVZlasWQNKiRZjxgsDK57Fzlt +MS5yX0mUs+/UnAuw5+U1LsreBl6iEHAIRb1AHEzxgiE9bn8UY5CCYIgpUA2D +IU75ihEIgwFJFGXUAlKKshM1GtKZCF8ABMkQQWycWGbVla7wEUKhONOOvSaE +Ml2HIIE4Q34l9JIGVSyv6S8/AxDc/anjZwM8cNzE3Z9zppdbSl1L7IUn+u/4 ++oolwkJ5EgEmMxV1QWVdNHTFiyWKV9JL3PAn7sNzJT5XxPis960sZ2zcIAy6 +EOvAXxtGAB7Nso7phqOEYkxVCzw61oKpIRUBGSmIaXnFKzlcw7crzvi7scA+ +T9KHq+lvA6R7eTLQPw4QrF1EMGFOGnTnUmEODx7iLCnOXC4axUpK3MKFMYKW +KKPcvYggQ63AVRIdnofk+c8snqEE6CIJSoo8iuXMTNWONXxkCVqAb5bQ1K6W +FvIBykYuUSzt4uoQ0E06NJ+X8f9cd732JyzFXGcMPPlJEL+vTWLhpQt5tg2C +nn6CSADH9FyXa7R6+ESbz1oQVRWKsAwb7RnXzxttqqsRj2pEAjY2MQIhFIs+ +Mi0rW4DABwGCIlIAhyBADOUuP4koVDCAEAYkQg4hAveQQAPrLRM2SBj8FCYB +I1W+yOEuf253jZnF/lyeRjZz8Xb/VPs06E5gNAEe3bDVhBgQQbRwC1LHB6Td +60Nm90SyBVFXGiCjuVNgwMpdwEtBB2wtq5oCr0LIefo3AoMnRtORq3fSMrdN +7+fqTxe2s9VtbDwAx8r02YBr474A21QqB5DbfyCCOG0DBAsNo36wjGRIaA6n +Xe47NowoUECYnFJJBSShgIBnQZZIkAZEx47+mmPB2lDcPQ48c/FZAXtyslVv +HFYtkBJaAIqxjAXPtc5ht2pfrW0UvDEMTtA/E5fiat+YwdTmWZg4OfPnPxdQ +WIQBMra5ZkWoD7QM3E2uProCWoCHhCXQ4j+fXpoQmCoc0wpwgxM9EPu7FZ6T +LKRqvQTEBCYeUtgmwo6+oz7AOGBVZmJo1WTApChGB2zsoB4jHdfZyieoBdnL +7u7dAC5roqrar7UQwJTbd5lLlgBxCzbw8GIDgvhodKgEmvByIOaayEAGWCsH +J9b2r+k1DsSvmvxAkrPKJm4nU8y9XMA4RwEc2Q5Go1lssDS1NNH1XVrpR4S8 +ZCmDdcC04HRrdwjhU1Db9fuW9zdz12z12c71TvlOmp36mKH1cPuLhW5I0trQ +QZRyEhJWKSO8lZYh3ktkRhOg+DYskUcI1IXdWiiCGxP+qYSHK5+JOdfxTL4Y +h+G1ThDUyTfNYxbE5UufXvzW5k9mC8z6OJj59UBy/ahMMZteibZBRUxqLnOE +1HNdx+dCG3ETtrkW7q7ekuyEcbfIylkyBZWZarNw9/luOKCdm/f6ITnuwltu +CJo+4cYnWnvuu2ux41nKvRXgPElS7D1dhJxGOSwE7JS5ODGee72ZWrwPOScI +PCwgpgdn38AMNwHQtoTIBZzDIl8TxJ2ii9YCmCBE3oqWyQJB06WIgokWWSUy +FaAHWwtQiDN/J50grj8y4PqSJuP8L9Obd0+mtg7KZhqb82Q1yujZhu8HiN1b +DWYr1LZSVKfw89kuFLcQXvGS+yiXcUU06GO1R2Ds7P0fsjPvv/hDfR5rNeP1 +mt9LOw+wc40V57YdyxORzFrSg5z7JD6QLRzAublOxjDKiSpWRSlGQdFCq+uw +oP43PZes0VRy8MQeDGWtXZ4wMSWJA8537JLHCcn7sz3PVxmbBuCniu9Jb7F3 +B1HuVUckdgz8bXzR7t9HE/bN2E3Yyr7xoKa/Qx3f9xYZ6+Q9Fa5leq8a+U8/ +LuKIOYnDxPnhJ2oZquSyugtLa9n2euR7SmcHZpasq1rcccO23zoecN2B2sRA +axBf1byPSlAA5cm2NsnhKTda+zbaVxVggbxjx9bvd7zGOahDRpEA0BIuvDtW +47aIokTQA96YwSNx7HH/owBbF2b2z4DKF+aayyV/hSejq47uJcsGCqXEyKep +Pop0g7FvRISGNfaadcCWMkEOjd29vmWJVG6L+AHVQEhCZRKHGZXvYTDNTeFu +ITvgL5L7HYX3PbPbR8nsol5n5rgt6TKsn8HNZIkE+hLIDn37DWVVZ8L/KY6H +L5eqIZSQ/iOPtreek106az16/UNmHRUADiG/qJGwn/Ko8PKe22GYwP6/J0Xz +u36t0EBz9x4MjX2qABqkQMVYVAZDIGca/rBZNAcjo1AD2Hnx1TBItHbwBhh2 +t53u32lHCvQInNRwInDT704qW6eyn4p+eBu+52XD7aMOYjE0mrwm33Ldj1uK +AF4s2T43BtQAu5xB2M3Qs5xf/JramLMOYbi22fwAFzk1cd91EFd3iAa2ixhW +Fof7KYrvU9BY0kxWUCEaTT5pffbjSrsWvEWS2t11gOd0w+wBb9bPdNEDLKAR +L2qrQIgI0z6lPvrx20G0fzLPxQhHm7KTr/ionm65xv0mcf1+uiwbr3G95kOo +Xs8312GeaVZ469MoE29+U9QXrCkjG4HUe1lNBCvtCoAUF4z/s+/tfJ5X5NUe +VEQNuAoa8aQECQPO1X1EJKgFpulnr5YCl8U9dFAnuN5fdUdz4D43IgGECxBO +gEkgIhAayYPWg9u69niCr6XYMXqFG7obVSpCjX7ipANDPUY0GUBeixp6xpyy +nTZDN3ncHkKt2/W0ebrJLeMFGtHuYVmXWxpxvX5MQvpgRksPGwsKhfNUOmkE +grR6VesZqWHnZLyln11T4VSpUpsTablSQA+gjoQpCTsqEEQQRFx+JpjTyWG4 +IIXgb5XRrEtLh6Fc1mml39V5agl1smaqviIcTVtsmGPfbt1ceWcyowhzAQgp +YwqJ4QSgQwIQECIKlZJa2dj9hTQWJbRNCNPWti6mCA1ishIyCSCB4XVQrq8E +TX6Xl+B/R9F6PL3GH4FutFwY4CgEAoV3i0vvq7J8/tf18tKeREQPJfwwVZPi +1sZBb94GK6ixtKHof7oqjV8sH47txn65rdZeld+uZueNIvoyz0enYEUkkIUA +kUJAjACQVhCQROoJShCPFohQ/U7iwwhYyBCIxIBbEGRVkkSyQvzv9ImJFbWy +0vmb1XkvjoYua8yx0E235O7uqri3hKdJlCFrdcUZCQZJEkEJFQJFGQQkUZFk +STW9F6z0IVsVLYoQgyJIUQgjSMihIgkgBIjtKUoPLUgD1IjWKsiJIjIu6JF3 +QE3kCi2RWRkFkUkWRkFhEfeAM72A3fgk1A1CsOPk409yPETyzrh2Dujrnwvw +JvmhzvDop1e71/h9UE24zrGyBUZgqNTOokRtoKMCMRGhR1JKtvebzD1JdPRE +G06GvNegCLKAUK75f8otIQIprQHqeEhwqdxF37dUzExc16blxwH2UZF1Td4+ +6mXT0wHCobX/dDZwmeRRNmOuvyRHFc0tBvGwVn7F94zv8nE9V5e48LRfm4Ob +XCQJLAzRJOaE7G9VMKWNpE78V+D6ne9fwPUcr1Pm8MYpDLGRMT+BfaB6EC6x +KEqh1iDWpRpRASsaDQAKrRASt3nVOsIAQoEkKXaLCqkAg8migQtwpYubTraQ +bCvhqUwWenElRTaggHnLF53ClyAWqbkUoptbedSme6zOpZooXXgXwsiaFpTN +JJbfVShjf62tvQG1SX3hfapjXFuxvNm2mKOdMVIZUKwyGN1L3C2lhAltwF1e +ytbeGpfVyXFEmdSxTCthbXTbY2kUlKqWSTMpepZbcjfXC2xta5I3KWKXKZMF +Lr7cZXHFTJha3uJbFM2NLLboGMaRGSnTo10G5w5JSgkCDgHNDXtN5Il4+cfv +3z5sXbHYi6wCIM5XFKri0CUgIIQpUqKB2VsCwwRWyluUs91cVUsSliS0VFzW +hVobAbuhiTXoF08hSJSQSecgFkd0gG935gZuZ6wxZZqyvKo3rYYCVqGgqZoS +QD5Qz+e0hAkiQI2mUzOAGVSeKpWlpmOuHZZ7B2fiFvujsd3XaEulbbJTvBM1 +cBM2mCySbksYSRLSEjs1tMppyDpjJbnaFYGU3gyF9jbIQ2Eyhmh3ikfaSto3 +R8IxCtQJ3PjbmV8bhgb/W+EotbZ5ClEDhHEU1OEut6M9A3ub0RSEdR1Arn+8 +tZuKVAqFvigwiBxMckrkpClINBRjquFodgFd5is9ybI6zPHDSCQDmcxBjyUy +tmM+7SSjlmltqasGmwjKlMRGyQgBNoY08LAuCbcW5u2XBbgLXlPowKlGeQpM +ujsWKpSrYwgLtZDk4+RPe3XG28hQCBBbBv58sAhZJIjY8OBidC6hac+35ntz +hbims4miinCxQE7zFDOppU813hhacCNMkodsAEIqQ2FK0bY/xa/hd5Yvgz2t +RhUIyB32/4FxbfOnAQbxMxpff6wVgXPcCluI89T3H/h4E6aBoBSlJf6awy9P +zRUUsivkqSAIGIp2FOae/HbFDnJyTo0EsU5haR8PfiovS8z6tTRnA3SmGUDr +XkkWu6cdaUBwQ6UlFjBoFddM25Z+RSFVJi3HD8XrtQDAKT8OhmUGwVFLAwt6 +gnCoFjUZalBQQvcqy2tqFaVqm6jvyAT3Gm/zzFW6nUUpiZTlkW/Tw04lGvqw +wymCU/fe7viv03DG5LGaO3rRAC8LGsV+pE2SlA2049AJf7OzgraFtpclQ4/I +KtyDE7KEhzL00MHFS62l3Z5TRfksLVJLoLbG5sopxbyhh3dnnuLjjfblMuUi +lhz5S6yqHPsolLSlCXqUKBW2FaudTkXjwwLAcyex5cWgOxzBoGgDMFAv0kLt +CnbP0mqi5cQdDMDl1JKskgEdVTf6KmZ2Dt9oMeiYqcR1dhqpQ19Gr0AxQ8gv +DI2LBA1b3nmfIpv+Y4qN9gaUOyU3Q5vPNjNv3mJiG7JKQEGkBEhyctSMCPoH +mCBfo8xPDgO9EXsKNBiHiNdIVUKr1IZZrhJCSEkJISQk4YksklCRsEt7VjAX +WWoWXIvqSQGEL8MipAwt9ltYwElrMpVoX+RviFCW/wtsZIEORBhMTveMUiou +XgI5gRNRfblNIFUNpF2NAAHsLPzR2ETucqG+bKnYgFo6QNvNnVU983lPTGU7 +Vg8mdXwij5NCideLSbxt0SEUQ9jKFLGodIcmpyJHkqUecvGKxTXUBtU7RQgC +hNkucFIIRSAnZjAopWjfvwT0vZmC+AZkUC3RoKTuKSa8S2Qx23jnMUtQikbb +ej6RA8rtczcaxFNemMqDISVohSSIgSAxgkJJIARAy6DL0s+VbMDYdYtHEXeU +6mmq2KAwESKxQuUogXciroEhipaFy1pQqGVMwgBcgcD0imsXotxctlFmpqS7 +IWUNopCE1jaKURUChVFnOVZogG4gdbOigenYCF8ODz9NQ47xlznsMpeYB3Sm +hA2fN2dmasOmeD0wOkKgetMvg7jyPMHRM9ggZTkwCaKUJAZJCCwTV13ka5YG +Q2ygFYmEMI5q0JKKSKqRWtCgMGKcQ4Jab1jgsdlTluSFOqdXQcXKBvFNAYhg +4ySARilyomyeGkORqF9d01PKDWxuMq82ogYd3DPJIGruqbWCkxo6qm4Jyqhd +YJsCpVSKqbaBYtksL5xqhTMa0iAVFPUu4WLUVA1VC5ICCRwJBiY9dTQUU7gt +3zdy62U2i4wArwuNXtNNlppJWHP4p5mABW6ECYqXtMCOuUrHgWFB1ySx7QsA +dSjnasu7rCoqBMfbVOYJitQL7cq6FHRAkTCAxglpycqKBgIF12YoGoaAMjZR +QSg24buo61ogBfxdTHAqWil6poFtCBq/WKUW8LRo16ghecDUqoShr3G10Hta +1w5aLRIXWamrSDvxmYDl7iBwS7SBagA2JsGwNAYRgoxRhMFFs12Stlflw5B8 +tXE2k3i3cZDZ+Lw+m34tWU2NhZYcdS+oLexLCSYvS6EROkz9a1oZEU4PsY/d +MA5Ikh0JGRRQICk2SHOewE4tERhFZGPCi0eFWG3HFoqJ4a+32Vz3tSBxLLh8 +i5fAukmtTMuY89BplR6YoEhI0WGJM9oaDxQXXWlIMmgfKeZU1uKqc22TdTKG +Px0ECavqrKNX5xq763V57n8Znf4cn85nlWOcuuR+vFuZl1yZnTU4pLuojZkj +U5UHF0Nau9MIxl+h0SxD0ovwB59hqqqJoQIbUkIFodSRV5tS+3QAMyGh0GQy +bRjmandQWPSGJJY/Y4gC5ZRiEXiQ17x/4u5IpwoSDcH1+IA= +==== diff --git a/recipes/gcc/gcc-svn/debian/libjava-jnipath.dpatch b/recipes/gcc/gcc-svn/debian/libjava-jnipath.dpatch new file mode 100644 index 0000000000..a33888bf14 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-jnipath.dpatch @@ -0,0 +1,94 @@ +#! /bin/sh -e + +# DP: - Add /usr/lib/jni to java.library.path. +# DP: - When running the i386 binaries on amd64, look in +# DP: - /usr/lib32/gcj-x.y and /usr/lib32/jni instead. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/gnu/classpath/natSystemProperties.cc~ 2006-08-02 00:53:40.000000000 +0200 ++++ libjava/gnu/classpath/natSystemProperties.cc 2006-08-19 00:41:50.063803000 +0200 +@@ -141,6 +141,34 @@ + return retval; + } + ++static char* ++AppendJniLibdir (char *path, struct utsname *u) ++{ ++ char* retval; ++ const char* jnilibdir = "/usr/lib/jni"; ++ ++#if defined(__linux__) && defined (__i386__) ++ if (! strcmp ("x86_64", u->machine)) ++ jnilibdir = "/usr/lib32/jni"; ++#endif ++ ++ if (path) ++ { ++ jsize total = strlen (path) ++ + (sizeof (PATH_SEPARATOR) - 1) + strlen (jnilibdir) + 1; ++ retval = (char*) _Jv_Malloc (total); ++ strcpy (retval, path); ++ strcat (retval, PATH_SEPARATOR); ++ strcat (retval, jnilibdir); ++ } ++ else ++ { ++ retval = (char*) _Jv_Malloc (strlen (jnilibdir) + 1); ++ strcpy (retval, jnilibdir); ++ } ++ return retval; ++} ++ + void + gnu::classpath::SystemProperties::insertSystemProperties (java::util::Properties *newprops) + { +@@ -370,8 +398,13 @@ + // Prepend GCJ_VERSIONED_LIBDIR to the module load path so that + // libgcj will find its own JNI libraries, like libgtkpeer.so. + char* val = PrependVersionedLibdir (path); +- _Jv_SetDLLSearchPath (val); ++ ++ // Append jnilibdir ++ char* val2 = AppendJniLibdir (val, &u); ++ ++ _Jv_SetDLLSearchPath (val2); + _Jv_Free (val); ++ _Jv_Free (val2); + } + else + { +@@ -379,9 +412,12 @@ + #ifdef USE_LTDL + char *libpath = getenv (LTDL_SHLIBPATH_VAR); + char* val = _Jv_PrependVersionedLibdir (libpath); +- SET ("java.library.path", val); +- _Jv_SetDLLSearchPath (val); ++ // Append jnilibdir ++ char* val2 = AppendJniLibdir (val, &u); ++ SET ("java.library.path", val2); ++ _Jv_SetDLLSearchPath (val2); + _Jv_Free (val); ++ _Jv_Free (val2); + #else + SET ("java.library.path", ""); + #endif diff --git a/recipes/gcc/gcc-svn/debian/libjava-loading-constraints.dpatch b/recipes/gcc/gcc-svn/debian/libjava-loading-constraints.dpatch new file mode 100644 index 0000000000..85f13ebe41 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-loading-constraints.dpatch @@ -0,0 +1,431 @@ +#! /bin/sh -e + +# DP: Reimplement loading constraints (taken from the trunk). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + uudecode $0 + tar -xv -f class-loader-classes.tar.bz2 -C ${dir}libjava + rm -f class-loader-classes.tar.bz2* + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-03-13 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): + Check loading constraints. + (_Jv_CheckOrCreateLoadingConstraint): New function. + * java/lang/ClassLoader.java (loadingConstraints): New field. + * link.cc (_Jv_Linker::find_field): Use + _Jv_CheckOrCreateLoadingConstraint. + (_Jv_Linker::check_loading_constraints): New function. + (_Jv_Linker::resolve_method_entry): Use + check_loading_constraints. + (_Jv_Linker::append_partial_itable): Likewise. + (_Jv_Linker::layout_vtable_methods): Likewise. + * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. + (_Jv_CheckOrCreateLoadingConstraint): Declare. + +--- libjava/include/jvm.h.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/include/jvm.h 2008-03-21 22:10:20.739500439 +0100 +@@ -1,6 +1,6 @@ + // jvm.h - Header file for private implementation information. -*- c++ -*- + +-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation ++/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation + + This file is part of libgcj. + +@@ -265,6 +265,7 @@ + jclass, jclass *); + static _Jv_Field *find_field(jclass, jclass, jclass *, _Jv_Utf8Const *, + _Jv_Utf8Const *); ++ static void check_loading_constraints (_Jv_Method *, jclass, jclass); + static void prepare_constant_time_tables(jclass); + static jshort get_interfaces(jclass, _Jv_ifaces *); + static void link_symbol_table(jclass); +@@ -557,6 +558,9 @@ + jboolean is_jni_call = true, + jclass iface = NULL); + ++extern void _Jv_CheckOrCreateLoadingConstraint (jclass, ++ java::lang::ClassLoader *); ++ + extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims) + __attribute__((__malloc__)); + +--- libjava/java/lang/ClassLoader.h.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/ClassLoader.h 2008-03-21 22:10:20.749500589 +0100 +@@ -86,6 +86,7 @@ + void checkInitialized(); + public: // actually package-private + ::java::util::HashMap * __attribute__((aligned(__alignof__( ::java::lang::Object)))) loadedClasses; ++ ::java::util::HashMap * loadingConstraints; + ::java::util::HashMap * definedPackages; + private: + ::java::lang::ClassLoader * parent; +--- libjava/java/lang/ClassLoader.java.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/ClassLoader.java 2008-03-21 22:10:20.749500589 +0100 +@@ -1,5 +1,5 @@ + /* ClassLoader.java -- responsible for loading classes into the VM +- Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,6 +45,7 @@ + + import java.io.IOException; + import java.io.InputStream; ++import java.lang.ref.WeakReference; + import java.net.URL; + import java.nio.ByteBuffer; + import java.security.CodeSource; +@@ -130,6 +131,15 @@ + final HashMap loadedClasses = new HashMap(); + + /** ++ * Loading constraints registered with this classloader. This maps ++ * a class name to a weak reference to a class. When the reference ++ * is non-null, it means that a reference to the name must resolve ++ * to the indicated class. ++ */ ++ final HashMap> loadingConstraints ++ = new HashMap>(); ++ ++ /** + * All packages defined by this classloader. It is not private in order to + * allow native code (and trusted subclasses) access to this field. + */ +--- libjava/java/lang/natClassLoader.cc.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/natClassLoader.cc 2008-03-21 22:10:20.749500589 +0100 +@@ -1,6 +1,6 @@ + // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. + +-/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation ++/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation + + This file is part of libgcj. + +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -143,7 +144,21 @@ + // them later. + return; + } +- loader->loadedClasses->put(klass->name->toString(), klass); ++ ++ JvSynchronize sync (loader->loadingConstraints); ++ ++ using namespace java::lang::ref; ++ ++ jstring name = klass->getName(); ++ WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); ++ if (ref) ++ { ++ jclass constraint = (jclass) ref->get(); ++ if (constraint && constraint != klass) ++ throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); ++ } ++ loader->loadingConstraints->put(name, new WeakReference(klass)); ++ loader->loadedClasses->put(name, klass); + } + + // If we found an error while defining an interpreted class, we must +@@ -156,6 +171,46 @@ + loader->loadedClasses->remove(klass->name->toString()); + } + ++// Check a loading constraint. In particular check that, if there is ++// a constraint for the name of KLASS in LOADER, that it maps to ++// KLASS. If there is no such constraint, make a new one. If the ++// constraint is violated, throw an exception. Do nothing for ++// primitive types. ++void ++_Jv_CheckOrCreateLoadingConstraint (jclass klass, ++ java::lang::ClassLoader *loader) ++{ ++ // Strip arrays. ++ while (klass->isArray()) ++ klass = klass->getComponentType(); ++ // Ignore primitive types. ++ if (klass->isPrimitive()) ++ return; ++ ++ if (! loader) ++ loader = java::lang::VMClassLoader::bootLoader; ++ jstring name = klass->getName(); ++ ++ JvSynchronize sync (loader->loadingConstraints); ++ ++ using namespace java::lang::ref; ++ ++ WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); ++ if (ref) ++ { ++ jclass constraint = (jclass) ref->get(); ++ if (constraint) ++ { ++ if (klass != constraint) ++ throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); ++ // Otherwise, all is ok. ++ return; ++ } ++ } ++ // No constraint (or old constraint GC'd). Make a new one. ++ loader->loadingConstraints->put(name, new WeakReference(klass)); ++} ++ + + // Class registration. + // +--- libjava/link.cc.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/link.cc 2008-03-21 22:24:51.692638568 +0100 +@@ -246,13 +246,9 @@ + if (_Jv_CheckAccess (klass, *found_class, the_field->flags)) + { + // Note that the field returned by find_field_helper is always +- // resolved. There's no point checking class loaders here, +- // since we already did the work to look up all the types. +- // FIXME: being lazy here would be nice. +- if (the_field->type != field_type) +- throw new java::lang::LinkageError +- (JvNewStringLatin1 +- ("field type mismatch with different loaders")); ++ // resolved. However, we still use the constraint mechanism ++ // because this may affect other lookups. ++ _Jv_CheckOrCreateLoadingConstraint (klass, (*found_class)->loader); + } + else + { +@@ -269,6 +265,23 @@ + return the_field; + } + ++// Check loading constraints for method. ++void ++_Jv_Linker::check_loading_constraints (_Jv_Method *method, jclass self_class, ++ jclass other_class) ++{ ++ JArray *klass_args; ++ jclass klass_return; ++ ++ _Jv_GetTypesFromSignature (method, self_class, &klass_args, &klass_return); ++ jclass *klass_arg = elements (klass_args); ++ java::lang::ClassLoader *found_loader = other_class->loader; ++ ++ _Jv_CheckOrCreateLoadingConstraint (klass_return, found_loader); ++ for (int i = 0; i < klass_args->length; i++) ++ _Jv_CheckOrCreateLoadingConstraint (*(klass_arg++), found_loader); ++} ++ + _Jv_Method * + _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, + int class_index, int name_and_type_index, +@@ -359,6 +372,11 @@ + throw new java::lang::NoSuchMethodError (sb->toString()); + } + ++ // if (found_class->loader != klass->loader), then we must actually ++ // check that the types of arguments correspond. JVMS 5.4.3.3. ++ if (found_class->loader != klass->loader) ++ check_loading_constraints (the_method, klass, found_class); ++ + return the_method; + } + +@@ -891,7 +909,8 @@ + continue; + + meth = NULL; +- for (jclass cl = klass; cl; cl = cl->getSuperclass()) ++ jclass cl; ++ for (cl = klass; cl; cl = cl->getSuperclass()) + { + meth = _Jv_GetMethodLocal (cl, iface->methods[j].name, + iface->methods[j].signature); +@@ -913,6 +932,9 @@ + itable[pos] = (void *) &_Jv_ThrowAbstractMethodError; + else + itable[pos] = meth->ncode; ++ ++ if (cl->loader != iface->loader) ++ check_loading_constraints (meth, cl, iface); + } + else + { +@@ -1467,6 +1489,11 @@ + sb->append(_Jv_GetMethodString(declarer, super_meth)); + throw new VerifyError(sb->toString()); + } ++ else if (declarer->loader != klass->loader) ++ { ++ // JVMS 5.4.2. ++ check_loading_constraints (meth, klass, declarer); ++ } + } + } + + +begin 644 class-loader-classes.tar.bz2 +M0EIH.3%!62936;AC>/P`$B'_____________________________________ +M________X!6?>GEKK>IQ%5[=.%0070O6<+;>];;V[[P&^V:]RKXV;8WK.('; +M!H:"@#;-,'G=N]V!J:30!&B:8AJGFF0-)HGFI/0Q/5/*;3:IY3U-M1,FI^J9 +MXE/`U/5!^J>IYJ>IIIM)LBGIE-IZ)F13]3U3>I-/94:>4>F9)IZDT]0]IJ@V +MIXH&TGE-/3T:HTQ/4]&C1IJ/4:`T031-,"9":8FIZ&2GM)IZ3$TR:FU&C(GM +M*/4]1F:4]$>H>4]1X4-I!M1Z&4-!ZC1D]1H]"!B:'H3`:3(,F:FT0>4TQ#0! +MB-/2:;4T&Q)IZ@:$:!!-11ZGA1C4](V4-`]3(/:H]1Z@`!D`!H:`:`#3T0`` +M!H`!H````]0#30T``]0&@-`-`--`:`)-20C4*>1HRIZGJ#3:GFE,F::@PAZ0 +M'J#)Z@TTT!D;4/1-J>IH!ZAH:`T/*`-#0```!Z@`&FC0````&@!D!H`$```` +M``````!,```````````F``````````````````$P$P)$DT)IH),-)IDTT(VF +M(1Z*>TIZ3R3PIDT&(#33$T>D&C0R-`-`!H````!H`:``&F@````````:`+40 +MP,AXAHV[384=&=*:I_H[F;&$@=O37@`S\@]IP%T.,X'0,ER*QC?1QSRUW6N" +M,PD32^QGX&7VT)L,"HQLLV_A$&=,*!-;&"*90NL**ZQZ$2E+7^&68,XD +MZ2L-J&VEA="HDKM#=(RL%]F7&*"*JQ;(5';J(%2;Q.A.*U0,-@1P8$.WD]@LZ*(+8/Q +MM2^67GXUDF$[MV*91J,-Q06UU8-K,$JF";`4%N=>X=8:D)$PT3#&JK1PF +M`6FCDVM\`OR89!US!(FP$DN'GR:J3I?3Z^*W$,PN@9,1IT2%8*V!L&,O3JI5 +M9V7FG=(-/TD2LS&X4'>0H"1[(-_EJ1(\?O,8Y'5]&9\O%]=JW;YJ->]TMO&3 +MUW0O>4K#;_1LB0M"2)(89D*IVLG-0=09=D.?N@!8^15(J,.O%"N5XG;T:=]U +MW"WV<%9HYM;QMB!+Y"WJQHK6!K:^WW/3,V*>OSZ"6BLCN=38I2D'=Y:$6$(:)"SOK,X#:Q[ +M+:)P*%QZF^?P"D*K7+,D3[+;EK-FHG=U,%,@9&1F0,#/U#$`.FFE[,JK"!;O +M:9GS/GY-9C;[R4!XZB(Z7S3,MV8K7!X,$95GI;Z8J?DZ'P>+Y7?/6?7?`%9* +M`^02!IR^$4LLMO"VFI?+^O'W_728W=<'7?#F4``8K;#,EEEHL;,OS_V0!U'X +MYR=^^ALB"$9<.8A)%`^@O/])`I]DQ+I`.X^K==RM9DILN(F?W,LG(DP5'`39 +M$54$10]$AH`8>^6;0K'NX(6U0;O<1<#[O)=MYKUGIFC`-RI-]Z5NE8I*`7N\ +MP.=_L@H!(;5?#6K\UD`25NI!)WMYH^/Y7=]5%:<=$_ZZM,#Q$C&]ER8U+I;GC=BY\)=H@!G: +M*::N"G;4X5`'0PN6Y<5VGN=;P,')31=0`V9$D"%)UM2:R&$8"]5YMORU$"HS +M/7UO=R$Q$,I:0QD5]=7*Y2''F17^;O;,JK@Z,(C62SN+OL]]M(NSD4%Q[B&2 +M&2JIK]V"1%2$IU5[:31T2H]L.3$83K6I3-D=3N=JFGTF`V`>"N?&!Q.>X?6?KJ..`4;;$P#0"V.W"?M+'?RZ%:A<*Y@_/`-1 +M!U]#N0@!1Z5JU84FUAMJ`C_Y")13(2'H+#8C>@3]R@@4/L(:^!\1'5FJ5""% +M5/?77,VOVZ+Z7SJ,D9`S`Z>`8PI`;JTREAX/[GX:)_=[$[<-,U(C#>L,/.[I +MXST?5M/GS,HN_X!^9_R3$X5;-TNB<<6FZ7C9DRXX^PX2A78UNM=M?^U9U/:- +M.BGXEFIAAS7^1P98&8F<.(/@68-LRLL`6'LGE>BHD.V)--&1CAQ`5<*>UII3 +M;XKW@2D6QLG#4MJX-TGPEENNNFN2Z:E*I0*&>SH,:=!$0,`E+UVIY/I['V)F +M%@TN]]O*>QD]2OR:[I]7UK/;V/8Z=%Z6_I_^M7'7]#2N#>(0,!RGW+Y'6]6^ +MP*;^-[NI.7#\YE(OUB-8VVHLD2-)U):CBZ/3>2,X&+^D\COQG4]".VQ-`W7L +M&77M;=\/N2ZO?FUO7_2QWP=O&YIZ')R88;Z]NHM#E7[*!USJT=0I/%4I7'3FT[A+(F7#4WU'Y>'8F5', +MIRIO=[CWCAV69]2KI4GO%JIWS)^:?)DSJ +M'!)&7"9$,C'XF[0&Z6. +MIL,Y:JX1*?TR(3\U!)1HCQ-A0C]'W]I+W2GJ-3&NB;I6+UGQV/_$[UUM(?(AT56-55502B4 +MK>G@+3QZ44!S.&(-9,W;..KZW'+.G,;]92Q-69=O$!?631=T6+'<.,GG:6HO +M!D':\:*DSJ#RL!`2PQ-1MFA4%)53Q+;RJYJKXF(=))L0%:%@`Z!5,1MX"Z2B-3Z.V,[R[:(T5:)0 +MKAA$^LR-1M)C@J+XG7_)Z4'N0%P/NY;N#UJ-%#I>^=G!W5S=*O369O/^]VVE +M'%CECI^"]&+I:WL02,K2))",3$77FCNYG&8Q=)IICOX>P-YY?.6.L(MY9V/B +ME2H0;X3J';+6J>JVK4?RX$EV>\C9^KQXJ]W#QE#/"+:C`S6M#WP;.FX0[8/V +MZ^JNNY/B3]F!6S""+$0S3"]]@-4YZ6, +M.VB_>LTJJK`0(?B!@B#?>N)(N>\E4J@,._BEVJQH9UZGF6D$'Z#F]QO]_?IQ +MD076O?U[W!?)[*^XF<8A0H4U;M^"K7K0:I7F-^'G-9I]G:Z/9;9T``*$C`%! +M2;9@IRZ9_ORUU7;3?U+.EI<'D\[?+[=5MCM.-MU1[19N^%0*[>MOVF$EIN!E +M4)@+'!I4N40H0,$69!5%!8+)39(%1#]OD];SUTGE,O9K;7LG-Q;^V%>5+&P4 +MF&C+VR7:33*+2SR5DKOJ]'B=NGV/CQ4C&@D`8:(C&#;%REE^6Q>SZ/&Z9V[X'(8^BP +M_?G0U6+-"Q/,W-I6=R$@*MV07$R:%`Y:XT2B=!LL*]WAE43PQ%#1*?<.L^]< +M-!U=/D6T79D]QDY5_#6A71[3:$)$M&(8KHX:0`$1M!JM;9N=-:UG-K9MG6EI +M"VFV_U;S6E2[>$MRX9RAE#RTU@:[M1(^/X[-(XL#+X!!=EV9,%11E[0.WL^? +M_Y^OYWVR$\,1T)*#`4`%O&**@W(KLFW59#[ +M9&;C5/=5^%MKY3,.9S65O+I#`7MA0O([NRNY6NW(=8FU2HZ^$:)+Y_1R6\G] +M[PJKY*'40F!3\;NY>'NI:'J'6_D#X[#">A'G"C&;=-WNHY9KDTO6PYR>C?;) +M@:F(];UJ![&U]?D*$^!#YF>;0CS;"`_!!@%[DM=CSW8"K\A.2,L$@U'2C9>- +M5U575S2TLO.YZ/4(,'1GA&">8.($J#2U]5>*=:;XW/)_3D;UA-IM=$O)'&1V +M^`2*P^&2C`L,NI&@8270C`)Y9+P&O3Y;2__9DF=-^6E20`RC"8,D#)O!-F/* +M=K*U3"@::!=GY60I$QD',R(TZH1S]9!40-03/9=02"G/IC.QOAE:2+WQDMB4 +M%PUB9.PWWK@TS-F9G%HC0/J((+8(+ED28-HK)E2K*%,8QHO/_G_O\=@_EYWD +MWF8O)Q,9\+A,1=91HR-U

K7WK^Q#N@,&K&/#80>J*$8\G+,<`%BB,$D8@9F)-945F%4)"HG$G(=$Y[Z@6L,"]6]YI8:0M@9F4>JJIJH +M+;X`!(-#C"%NV-BP]W:.DD*#HJ.@HZ7.I73:LUN0G.$QK%!%!T,=KE4U,%4(NLA`W +M(=)+=M10:LDP9%I8I6GL5##!R;6-CTXFMM%DU1VUG<$1#/A?V.-PXIC*\2O= +M[,8=GI0@A@8Y&9@QLJG<>A.I5XL,<-VPI<7W%.XOO1## +M;):P\/79[M>6Y+$S%&118"CL#8B6L#.9HV7GX`"HZQ&EV0^,HIZD%SC3>X$E +MH4&V0J1-&J(P3OTEA4BYS9>D;V&&$WB2`-%6T".>F5<.I +M8L3-XI&_Q4^P%0"07]E9EMV!;<&-(VN/"#I`R^,@`5)H;,><7Q;+GTD=B +M`V+"<<"JMZY5JF.>NF$:&PXB6?`9-&=S&ERO,W0UR0;N$=?-'D;YZW%+FCQU +M=*Y>NRA"2[[KA8EF;_-=)FLIG`M=*(<)M$\U%D>N#0=N-5;Z2*DP"T9$1F"> +M(X152$R3EWXM--C#,5S%E**K76.*W%^I;$O]+8VF.6^ZR#5R61E0S,VK[RQM +M7=L"9>=^]K7H10F33U0JZH93NDD5(O@22#V(M=041?=BK)1%QG0,*JA$\`1* +M]GSC6*)"I:+F.E!F&-=64T,:>\Y*0$-R@;1!A.^BNH)7]^EC4F$OSULI!%J@ +MH@>8Y/3UQE()$44V`.&-IM`V$I85S"6`T\[9:&^P,HV>X16A[4I1N,?DM+1[ +MCIQ<"]=BB@$4CR8D@`B(.1``F<[G,Y$_S2)RS0,*3'QM?T:9Q?(U_1QQLG9Y +M>8S2S((#CDN/YUA)=61F['.V:"P6[/I$7AJ_E +M,21@U*X.$6W:IM'75C&!M-H!M#30AL#6-IO4J0->7T"JO+-ULS,XAIZ.(VSW +M+$+H9G0F30-I<*N.9XG*DD(NM&F;F"A`A>TEZX4BCEZA17:T&7(HD+= +ME9L`,-P9DD`$DAD<;X43%3,PB*0Q@%C,@F.L%%=5B,*#?F'&'GE(#,XVK8-C +M:`>?"V:6=OC"=>5",XU\^4`M2!;%4JV2%'=C@UE+K'P,/)W>S;!`4@0D,P"%T!/8%JOEJ$58`J;,#4,AMC;:8$T$!)I4F_,[D+YA0V"19 +M4D8UEQ(+!BTC(P8KB)_!$Y]E`5,\1*A`Q11=(!R?EH(BI7!`%A&1((!QKJA/ +M!MT(QC)R8R:T`"N9NGE%*$%=6PPE`()2&]1)R,.;=MP4J>^B:0.3A7&BEG+9 +MYF#;#8(IM!)KP85"ABP515%5B**\[J^!="W'!=JO+Q4%0>F[;:RF +M^WU6;_GRVY#D^OFGDO5A-"FJ5C37(Z95Y=0JBJGVL..V%W@61Z:"IXVX?;*A +M6\XAKU*F2D@F0"Q'2(2`\08UB^U]YL'NZ*)JW]"RYCB;U=S"<2EP+&689, +M)&JJKJMCURP6,1@ZAD1$1$``\(`E9&+=K5NV_R>85'/^FVXP5V&ON2G03L:#C.+,)EBMYTS[M-_Y!*X$F-D-?<]=X4WUL\JN7'<&"=IUNFD5! +M"/6'D.?C(^=%^9R`)4GE,Y#JIN&&;EW&A0TK&M.)18\?:!RN)([P%E%<()W2 +M^ND/$6-[M7U1G[UDX7.K8\YLL<_/3.KB*EO[;JKT1XLJN(%K2AYZ.SD\LM`: +M)RT%&#?Y!_Q_T'*;9T0\/O]JT-.PO'!$8&CE_^+N2*<*$A<,;Q^```` +` +end diff --git a/recipes/gcc/gcc-svn/debian/libjava-nobiarch-check.dpatch b/recipes/gcc/gcc-svn/debian/libjava-nobiarch-check.dpatch new file mode 100644 index 0000000000..b32e1050a2 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-nobiarch-check.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e + +# DP: For biarch builds, disable the testsuite for the non-default architecture +# DP: for runtime libraries, which are not built by default (libjava). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/testsuite/Makefile.in~ 2005-09-29 23:53:39.213898000 +0200 ++++ libjava/testsuite/Makefile.in 2005-09-29 23:55:33.382541760 +0200 +@@ -346,12 +346,14 @@ + + + check-DEJAGNU: site.exp ++ runtestflags="`echo '$(RUNTESTFLAGS)' | sed 's/,-m[36][24]//'`"; \ ++ case "$$runtestflags" in *\\{\\}) runtestflags=; esac; \ + srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + l='$(DEJATOOL)'; for tool in $$l; do \ +- $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ ++ $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $$runtestflags; \ + done; \ + else echo "WARNING: could not find \`runtest'" 1>&2; :;\ + fi diff --git a/recipes/gcc/gcc-svn/debian/libjava-realloc-leak.dpatch b/recipes/gcc/gcc-svn/debian/libjava-realloc-leak.dpatch new file mode 100644 index 0000000000..6bf7a7310f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-realloc-leak.dpatch @@ -0,0 +1,79 @@ +#! /bin/sh -e + +# DP: Don't leak upon failed realloc (taken from the trunk). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +libjava/ + +2008-03-10 Jim Meyering + + Don't leak upon failed realloc. + * gnu/classpath/natSystemProperties.cc + (SystemProperties::insertSystemProperties): + +libjava/classpath/ + +2008-03-10 Jim Meyering + + Don't leak upon failed realloc. + * native/jni/classpath/jcl.c (JCL_realloc): Upon failed realloc, + free the original buffer before throwing the exception. + +Index: libjava/classpath/native/jni/classpath/jcl.c +=================================================================== +--- libjava/classpath/native/jni/classpath/jcl.c (revision 133093) ++++ libjava/classpath/native/jni/classpath/jcl.c (revision 133094) +@@ -1,5 +1,5 @@ + /* jcl.c +- Copyright (C) 1998, 2005, 2006 Free Software Foundation, Inc. ++ Copyright (C) 1998, 2005, 2006, 2008 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -152,9 +152,11 @@ + JNIEXPORT void *JNICALL + JCL_realloc (JNIEnv * env, void *ptr, size_t size) + { ++ void *orig_ptr = ptr; + ptr = realloc (ptr, size); + if (ptr == 0) + { ++ free (orig_ptr); + JCL_ThrowException (env, "java/lang/OutOfMemoryError", + "malloc() failed."); + return NULL; +Index: libjava/gnu/classpath/natSystemProperties.cc +=================================================================== +--- libjava/gnu/classpath/natSystemProperties.cc (revision 133093) ++++ libjava/gnu/classpath/natSystemProperties.cc (revision 133094) +@@ -270,7 +270,10 @@ + if (errno != ERANGE) + break; + buflen = 2 * buflen; ++ char *orig_buf = buffer; + buffer = (char *) realloc (buffer, buflen); ++ if (buffer == NULL) ++ free (orig_buf); + } + if (buffer != NULL) + free (buffer); diff --git a/recipes/gcc/gcc-svn/debian/libjava-rpath.dpatch b/recipes/gcc/gcc-svn/debian/libjava-rpath.dpatch new file mode 100644 index 0000000000..e9b7f03f5b --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-rpath.dpatch @@ -0,0 +1,49 @@ +#! /bin/sh -e + +# DP: - Link ecjx with -rpath $(dbexecdir) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}libjava && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm -f ${dir}libjava/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/Makefile.am~ 2007-03-04 18:50:01.000000000 +0100 ++++ libjava/Makefile.am 2007-03-04 19:19:32.000000000 +0100 +@@ -683,7 +683,7 @@ + ecjx_LDFLAGS = $(ECJX_BASE_FLAGS) $(ECJ_BUILD_JAR) + endif !ENABLE_SHARED + +-ecjx_LDADD = -L$(here)/.libs libgcj.la ++ecjx_LDADD = -L$(here)/.libs libgcj.la -rpath $(dbexecdir) + ecjx_DEPENDENCIES = libgcj.la libgcj.spec + + else !NATIVE +--- libjava/Makefile.in~ 2007-03-04 18:50:01.000000000 +0100 ++++ libjava/Makefile.in 2007-03-04 19:21:22.000000000 +0100 +@@ -7787,7 +7787,7 @@ + @ENABLE_SHARED_TRUE@@NATIVE_TRUE@ecjx_LDFLAGS = $(ECJX_BASE_FLAGS) -Djava.class.path=$(ECJ_JAR) + @NATIVE_FALSE@ecjx_LDFLAGS = $(ECJX_BASE_FLAGS) $(ECJ_BUILD_JAR) + @NATIVE_FALSE@ecjx_LDADD = +-@NATIVE_TRUE@ecjx_LDADD = -L$(here)/.libs libgcj.la ++@NATIVE_TRUE@ecjx_LDADD = -L$(here)/.libs libgcj.la -rpath $(dbexecdir) + @NATIVE_FALSE@ecjx_DEPENDENCIES = + @NATIVE_TRUE@ecjx_DEPENDENCIES = libgcj.la libgcj.spec + gappletviewer_SOURCES = diff --git a/recipes/gcc/gcc-svn/debian/libjava-sjlj.dpatch b/recipes/gcc/gcc-svn/debian/libjava-sjlj.dpatch new file mode 100644 index 0000000000..95b4673b3f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-sjlj.dpatch @@ -0,0 +1,65 @@ +#! /bin/sh -e + +# DP: Don't try to use _Unwind_Backtrace on SJLJ targets. +# DP: See bug #387875, #388505, GCC PR 29206. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- + libjava/sysdep/generic/backtrace.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +Index: src/libjava/sysdep/generic/backtrace.h +=================================================================== +--- src.orig/libjava/sysdep/generic/backtrace.h 2006-11-06 14:00:32.000000000 -0500 ++++ src/libjava/sysdep/generic/backtrace.h 2006-11-06 14:04:38.000000000 -0500 +@@ -13,6 +13,20 @@ details. */ + + #include + ++#ifdef SJLJ_EXCEPTIONS ++ ++#undef _Unwind_GetIPInfo ++#define _Unwind_GetIPInfo(ctx,ip_before_insn) \ ++ (abort (), (void) (ctx), *ip_before_insn = 1, 0) ++ ++#undef _Unwind_GetRegionStart ++#define _Unwind_GetRegionStart(ctx) \ ++ (abort (), (void) (ctx), 0) ++ ++#undef _Unwind_Backtrace ++#define _Unwind_Backtrace(trace_fn,state_ptr) \ ++ (fallback_backtrace (trace_fn, state_ptr)) ++ + /* Unwind through the call stack calling TRACE_FN with STATE for every stack + frame. Returns the reason why the unwinding was stopped. */ + _Unwind_Reason_Code +@@ -20,4 +34,7 @@ fallback_backtrace (_Unwind_Trace_Fn, _J + { + return _URC_NO_REASON; + } ++ ++#endif /* SJLJ_EXCEPTIONS */ ++ + #endif diff --git a/recipes/gcc/gcc-svn/debian/libjava-soname.dpatch b/recipes/gcc/gcc-svn/debian/libjava-soname.dpatch new file mode 100644 index 0000000000..ccac8a40db --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-soname.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh -e + +# DP: Bump the libgcj soversion. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- libjava/libtool-version~ 2006-01-18 22:52:29.000000000 +0100 ++++ libjava/libtool-version 2006-04-03 23:32:44.934656864 +0200 +@@ -3,4 +3,4 @@ + # a separate file so that version updates don't involve re-running + # automake. + # CURRENT:REVISION:AGE +-9:0:0 ++90:0:0 diff --git a/recipes/gcc/gcc-svn/debian/libjava-stacktrace.dpatch b/recipes/gcc/gcc-svn/debian/libjava-stacktrace.dpatch new file mode 100644 index 0000000000..9ace9dfb28 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-stacktrace.dpatch @@ -0,0 +1,70 @@ +#! /bin/sh -e + +# DP: libgcj: Lookup source file name and line number in separated +# DP: debug files found in /usr/lib/debug + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +--- libjava/stacktrace.cc.orig 2006-06-16 13:54:07.078577632 +0200 ++++ libjava/stacktrace.cc 2006-06-16 13:56:08.032189888 +0200 +@@ -20,6 +20,11 @@ + #endif + + #include ++#include ++#include ++#ifdef HAVE_UNISTD_H ++#include ++#endif + + #include + #include +@@ -222,6 +227,28 @@ + finder->lookup (binaryName, (jlong) offset); + *sourceFileName = finder->getSourceFile(); + *lineNum = finder->getLineNum(); ++ if (*lineNum == -1 && info.file_name[0] == '/') ++ { ++ const char *debugPrefix = "/usr/lib/debug"; ++ char *debugPath = (char *) malloc (strlen(debugPrefix) ++ + strlen(info.file_name) ++ + 2); ++ ++ if (debugPath) ++ { ++ strcpy (debugPath, debugPrefix); ++ strcat (debugPath, info.file_name); ++ //printf ("%s: 0x%x\n", debugPath, offset); ++ if (!access (debugPath, R_OK)) ++ { ++ binaryName = JvNewStringUTF (debugPath); ++ finder->lookup (binaryName, (jlong) offset); ++ *sourceFileName = finder->getSourceFile(); ++ *lineNum = finder->getLineNum(); ++ } ++ free (debugPath); ++ } ++ } + if (*lineNum == -1 && NameFinder::showRaw()) + { + gnu::gcj::runtime::StringBuffer *t = diff --git a/recipes/gcc/gcc-svn/debian/libjava-subdir.dpatch b/recipes/gcc/gcc-svn/debian/libjava-subdir.dpatch new file mode 100644 index 0000000000..ec707b8b5e --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-subdir.dpatch @@ -0,0 +1,246 @@ +#! /bin/sh -e + +# DP: - Set the libjava sublibdir to /usr/lib/gcj-4.3 +# DP: - Set the default libgcj database dir to /var/lib/gcj-4.3 + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libjava && aclocal -I . -I .. -I ../config -I libltdl && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm -f ${dir}libjava/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/java/Make-lang.in.orig 2007-09-06 21:19:09.582719152 +0200 ++++ gcc/java/Make-lang.in 2007-09-06 21:20:32.543970604 +0200 +@@ -313,12 +313,13 @@ + $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(ZLIBINC) \ + $(srcdir)/java/jcf-io.c $(OUTPUT_OPTION) + ++short_version := $(shell echo $(version) | sed -r 's/([0-9]+\.[0-9]+).*/\1/') + # jcf-path.o needs a -D. + java/jcf-path.o: java/jcf-path.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ + java/jcf.h + $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ +- -DLIBGCJ_ZIP_FILE='"$(datadir)/java/libgcj-$(version).jar"' \ +- -DDEFAULT_TARGET_VERSION=\"$(version)\" \ ++ -DLIBGCJ_ZIP_FILE='"$(datadir)/java/libgcj-$(short_version).jar"' \ ++ -DDEFAULT_TARGET_VERSION=\"$(short_version)\" \ + $(srcdir)/java/jcf-path.c $(OUTPUT_OPTION) + + TEXI_JAVA_FILES = java/gcj.texi $(gcc_docdir)/include/fdl.texi \ +--- libjava/classpath/configure.ac.orig 2008-01-13 17:18:19.000000000 +0100 ++++ libjava/classpath/configure.ac 2008-01-13 17:18:45.000000000 +0100 +@@ -301,7 +301,7 @@ + nativeexeclibdir=${withval} + ], + [ +- nativeexeclibdir='${toolexeclibdir}/gcj-'`cat ${srcdir}/../../gcc/BASE-VER`-`awk -F: '/^[[^#]].*:/ { print $1 }' ${srcdir}/../libtool-version` ++ nativeexeclibdir='${toolexeclibdir}/gcj-'`sed -r 's/([[0-9]]+\.[[0-9]]+).*/\1/' ${srcdir}/../../gcc/BASE-VER`-`awk -F: '/^[[^#]].*:/ { print $1 }' ${srcdir}/../libtool-version` + ]) + + AC_SUBST(nativeexeclibdir) +--- libjava/classpath/configure.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/classpath/configure 2008-01-13 17:18:45.000000000 +0100 +@@ -4771,7 +4771,7 @@ + + else + +- nativeexeclibdir='${toolexeclibdir}/gcj-'`cat ${srcdir}/../../gcc/BASE-VER`-`awk -F: '/^[^#].*:/ { print $1 }' ${srcdir}/../libtool-version` ++ nativeexeclibdir='${toolexeclibdir}/gcj-'`sed -r 's/([0-9]+\.[0-9]+).*/\1/' ${srcdir}/../../gcc/BASE-VER`-`awk -F: '/^[^#].*:/ { print $1 }' ${srcdir}/../libtool-version` + + fi; + +--- libjava/testsuite/lib/libjava.exp.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/testsuite/lib/libjava.exp 2008-01-13 17:18:45.000000000 +0100 +@@ -169,6 +169,7 @@ + set text [eval exec "$GCJ_UNDER_TEST -B$specdir -v 2>@ stdout"] + regexp " version \[^\n\r\]*" $text version + set libjava_version [lindex $version 1] ++ set libjava_version "4.3" + + verbose "version: $libjava_version" + +--- libjava/testsuite/Makefile.am.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/testsuite/Makefile.am 2008-01-13 17:18:45.000000000 +0100 +@@ -4,6 +4,7 @@ + + # May be used by various substitution variables. + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_short_version := $(shell sed -r 's/([0-9]+\.[0-9]+).*/\1/' $(top_srcdir)/../gcc/BASE-VER) + + # autoconf2.13's target_alias + target_noncanonical = @target_noncanonical@ +@@ -59,11 +60,11 @@ + rm -rf $$testtmpdir; $(mkdir_p) $$testtmpdir; \ + if test -n "$$testdep"; then \ + $(GCJ) -C -g -w --encoding=UTF-8 -bootclasspath \ +- $(top_builddir)/libgcj-$(gcc_version).jar::$$testtmpdir \ ++ $(top_builddir)/libgcj-$(gcc_short_version).jar::$$testtmpdir \ + -d $$testtmpdir $(srcdir)/$$testdep || exit; \ + fi; \ + $(GCJ) -C -g -w --encoding=UTF-8 -bootclasspath \ +- $(top_builddir)/libgcj-$(gcc_version).jar:$$testtmpdir \ ++ $(top_builddir)/libgcj-$(gcc_short_version).jar:$$testtmpdir \ + -d $$testtmpdir $(srcdir)/$$test || exit; \ + case "$$test" in \ + libjava.loader/dummy.java) \ +@@ -75,7 +76,7 @@ + esac; \ + if test -n "$$genheader"; then \ + $(MYGCJH) $$genheader $$testtmpdir/*.class \ +- -bootclasspath $(top_builddir)/libgcj-$(gcc_version).jar \ ++ -bootclasspath $(top_builddir)/libgcj-$(gcc_short_version).jar \ + -d $$testtmpdir/ || exit; \ + mv $$testtmpdir/*.h $(srcdir)/`dirname $$test`/ 2>/dev/null; \ + fi; \ +--- libjava/testsuite/Makefile.in.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/testsuite/Makefile.in 2008-01-13 17:18:45.000000000 +0100 +@@ -327,6 +327,7 @@ + + # May be used by various substitution variables. + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_short_version := $(shell sed -r 's/([0-9]+\.[0-9]+).*/\1/' $(top_srcdir)/../gcc/BASE-VER) + + # Setup the testing framework, if you have one + EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ +@@ -576,11 +577,11 @@ + @JAVA_MAINTAINER_MODE_TRUE@ rm -rf $$testtmpdir; $(mkdir_p) $$testtmpdir; \ + @JAVA_MAINTAINER_MODE_TRUE@ if test -n "$$testdep"; then \ + @JAVA_MAINTAINER_MODE_TRUE@ $(GCJ) -C -g -w --encoding=UTF-8 -bootclasspath \ +-@JAVA_MAINTAINER_MODE_TRUE@ $(top_builddir)/libgcj-$(gcc_version).jar::$$testtmpdir \ ++@JAVA_MAINTAINER_MODE_TRUE@ $(top_builddir)/libgcj-$(gcc_short_version).jar::$$testtmpdir \ + @JAVA_MAINTAINER_MODE_TRUE@ -d $$testtmpdir $(srcdir)/$$testdep || exit; \ + @JAVA_MAINTAINER_MODE_TRUE@ fi; \ + @JAVA_MAINTAINER_MODE_TRUE@ $(GCJ) -C -g -w --encoding=UTF-8 -bootclasspath \ +-@JAVA_MAINTAINER_MODE_TRUE@ $(top_builddir)/libgcj-$(gcc_version).jar:$$testtmpdir \ ++@JAVA_MAINTAINER_MODE_TRUE@ $(top_builddir)/libgcj-$(gcc_short_version).jar:$$testtmpdir \ + @JAVA_MAINTAINER_MODE_TRUE@ -d $$testtmpdir $(srcdir)/$$test || exit; \ + @JAVA_MAINTAINER_MODE_TRUE@ case "$$test" in \ + @JAVA_MAINTAINER_MODE_TRUE@ libjava.loader/dummy.java) \ +@@ -592,7 +593,7 @@ + @JAVA_MAINTAINER_MODE_TRUE@ esac; \ + @JAVA_MAINTAINER_MODE_TRUE@ if test -n "$$genheader"; then \ + @JAVA_MAINTAINER_MODE_TRUE@ $(MYGCJH) $$genheader $$testtmpdir/*.class \ +-@JAVA_MAINTAINER_MODE_TRUE@ -bootclasspath $(top_builddir)/libgcj-$(gcc_version).jar \ ++@JAVA_MAINTAINER_MODE_TRUE@ -bootclasspath $(top_builddir)/libgcj-$(gcc_short_version).jar \ + @JAVA_MAINTAINER_MODE_TRUE@ -d $$testtmpdir/ || exit; \ + @JAVA_MAINTAINER_MODE_TRUE@ mv $$testtmpdir/*.h $(srcdir)/`dirname $$test`/ 2>/dev/null; \ + @JAVA_MAINTAINER_MODE_TRUE@ fi; \ +--- libjava/Makefile.am.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/Makefile.am 2008-01-13 17:18:45.000000000 +0100 +@@ -5,7 +5,8 @@ + ACLOCAL_AMFLAGS = -I . -I .. -I ../config -I libltdl + + # May be used by various substitution variables. +-gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_full_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_version := $(shell sed -r 's/([0-9]+\.[0-9]+).*/\1/' $(top_srcdir)/../gcc/BASE-VER) + + SUBDIRS = $(DIRLTDL) gcj include classpath + if TESTSUBDIR +@@ -27,9 +28,9 @@ + target_noncanonical = @target_noncanonical@ + + # This is required by TL_AC_GXX_INCLUDE_DIR. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_full_version) + +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_full_version) + + ## + ## What gets installed, and where. +@@ -141,7 +142,7 @@ + -DGCJ_VERSIONED_LIBDIR="\"$(dbexecdir)\"" \ + -DPATH_SEPARATOR="\"$(CLASSPATH_SEPARATOR)\"" \ + -DECJ_JAR_FILE="\"$(ECJ_JAR)\"" \ +- -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\"" \ ++ -DLIBGCJ_DEFAULT_DATABASE="\"/var/lib/gcj-4.3/$(db_name)\"" \ + -DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL="\"$(db_pathtail)\"" + + AM_GCJFLAGS = \ +--- libjava/Makefile.in.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/Makefile.in 2008-01-13 17:18:45.000000000 +0100 +@@ -816,7 +816,8 @@ + ACLOCAL_AMFLAGS = -I . -I .. -I ../config -I libltdl + + # May be used by various substitution variables. +-gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_full_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) ++gcc_version := $(shell sed -r 's/([0-9]+\.[0-9]+).*/\1/' $(top_srcdir)/../gcc/BASE-VER) + SUBDIRS = $(DIRLTDL) gcj include classpath $(am__append_1) + + # write_entries_to_file - writes each entry in a list +@@ -829,8 +830,8 @@ + write_entries_to_file = $(shell rm -f $(2) || :) $(shell touch $(2)) $(foreach object,$(1),$(shell echo $(object) >> $(2))) + + # This is required by TL_AC_GXX_INCLUDE_DIR. +-libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version) +-libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) ++libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_full_version) ++libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_full_version) + toolexeclib_LTLIBRARIES = libgcj.la libgij.la libgcj-tools.la \ + $(am__append_2) $(am__append_3) + toolexecmainlib_DATA = libgcj.spec +@@ -875,7 +876,7 @@ + -DGCJ_VERSIONED_LIBDIR="\"$(dbexecdir)\"" \ + -DPATH_SEPARATOR="\"$(CLASSPATH_SEPARATOR)\"" \ + -DECJ_JAR_FILE="\"$(ECJ_JAR)\"" \ +- -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\"" \ ++ -DLIBGCJ_DEFAULT_DATABASE="\"/var/lib/gcj-4.3/$(db_name)\"" \ + -DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL="\"$(db_pathtail)\"" + + AM_GCJFLAGS = \ +--- libjava/configure.ac.orig 2008-01-13 17:18:20.000000000 +0100 ++++ libjava/configure.ac 2008-01-13 17:18:45.000000000 +0100 +@@ -511,6 +511,9 @@ + AS_HELP_STRING([--with-java-home=DIRECTORY], + [value of java.home system property]), + [JAVA_HOME="${withval}"], [JAVA_HOME=""]) ++if test -n "$with_multisubdir"; then ++ JAVA_HOME=`echo $JAVA_HOME | sed "s,/usr/lib/,/usr/lib$with_multisubdir/,"` ++fi + AM_CONDITIONAL(JAVA_HOME_SET, test ! -z "$JAVA_HOME") + AC_SUBST(JAVA_HOME) + +@@ -1385,6 +1388,7 @@ + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) toolexeclibdir=$toolexecmainlibdir ;; # Avoid trailing /. ++ ../lib*) toolexeclibdir='$(subst /lib/../lib,/lib,'$toolexecmainlibdir/$multi_os_directory')' ;; + *) toolexeclibdir=$toolexecmainlibdir/$multi_os_directory ;; + esac + ;; +@@ -1395,6 +1399,7 @@ + + # Determine gcj and libgcj version number. + gcjversion=`cat "$srcdir/../gcc/BASE-VER"` ++short_version=`sed -r 's/([[0-9]]+\.[[0-9]]+).*/\1/' $srcdir/../gcc/BASE-VER` + libgcj_soversion=`awk -F: '/^[[^#]].*:/ { print $1 }' $srcdir/libtool-version` + GCJVERSION=$gcjversion + AC_SUBST(GCJVERSION) +@@ -1402,7 +1407,7 @@ + + # Determine where the standard .db file and GNU Classpath JNI + # libraries are found. +-gcjsubdir=gcj-$gcjversion-$libgcj_soversion ++gcjsubdir=gcj-$short_version-$libgcj_soversion + multi_os_directory=`$CC -print-multi-os-directory` + case $multi_os_directory in + .) diff --git a/recipes/gcc/gcc-svn/debian/libjava-xulrunner1.9.dpatch b/recipes/gcc/gcc-svn/debian/libjava-xulrunner1.9.dpatch new file mode 100644 index 0000000000..19d67d88ba --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libjava-xulrunner1.9.dpatch @@ -0,0 +1,41 @@ +#! /bin/sh -e + +# DP: Add configure check for xulrunner-1.9. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libjava/classpath && aclocal -I m4 -I ../.. -I ../../config && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm -f ${dir}libjava/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libjava/classpath/configure.ac~ 2008-02-22 08:37:10.356094701 +0100 ++++ libjava/classpath/configure.ac 2008-02-22 08:38:49.397588719 +0100 +@@ -702,7 +702,10 @@ + + dnl Check for plugin support headers and libraries. + if test "x${COMPILE_PLUGIN}" = xyes; then +- PKG_CHECK_MODULES(MOZILLA, mozilla-plugin, [MOZILLA_FOUND=yes], [MOZILLA_FOUND=no]) ++ PKG_CHECK_MODULES(MOZILLA, mozilla-plugin libxul-unstable, [MOZILLA_FOUND=yes], [MOZILLA_FOUND=no]) ++ if test "x${MOZILLA_FOUND}" = xno; then ++ PKG_CHECK_MODULES(MOZILLA, mozilla-plugin, [MOZILLA_FOUND=yes], [MOZILLA_FOUND=no]) ++ fi + if test "x${MOZILLA_FOUND}" = xno; then + PKG_CHECK_MODULES(MOZILLA, firefox-plugin firefox-xpcom, [MOZILLA_FOUND=yes], [MOZILLA_FOUND=no]) + fi diff --git a/recipes/gcc/gcc-svn/debian/libobjc-gc-link.dpatch b/recipes/gcc/gcc-svn/debian/libobjc-gc-link.dpatch new file mode 100644 index 0000000000..87cb742c77 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libobjc-gc-link.dpatch @@ -0,0 +1,73 @@ +#! /bin/sh -e + +# DP: Link libobjc_gc with libgcjgc_convenience.la. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libobjc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm -f ${dir}libobjc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-02-06 Matthias Klose + + * configure.ac (OBJC_BOEHM_GC_LIBS): Link with libgcjgc_convenience.la. + * configure: Regenerate. + * Makefile.in (libobjc_gc$(libsuffix).la): Link with OBJC_BOEHM_GC_LIBS. + +--- libobjc/Makefile.in~ 2007-07-05 10:18:52.000000000 +0200 ++++ libobjc/Makefile.in 2008-02-07 17:17:17.243167905 +0100 +@@ -95,6 +95,7 @@ + OBJC_THREAD_FILE=thr-objc + OBJC_BOEHM_GC=@OBJC_BOEHM_GC@ + OBJC_BOEHM_GC_INCLUDES=@OBJC_BOEHM_GC_INCLUDES@ ++OBJC_BOEHM_GC_LIBS=@OBJC_BOEHM_GC_LIBS@ + + INCLUDES = -I$(srcdir)/objc -I$(srcdir)/$(MULTISRCTOP)../gcc \ + -I$(srcdir)/$(MULTISRCTOP)../gcc/config \ +@@ -281,6 +282,7 @@ + + libobjc_gc$(libsuffix).la: $(OBJS_GC) + $(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) \ ++ $(OBJC_BOEHM_GC_LIBS) \ + -rpath $(toolexeclibdir) \ + -version-info $(LIBOBJC_GC_VERSION) $(extra_ldflags_libobjc) + +--- libobjc/configure.ac~ 2007-10-19 15:14:58.000000000 +0200 ++++ libobjc/configure.ac 2008-02-07 17:25:15.750386077 +0100 +@@ -66,15 +66,18 @@ + no) + OBJC_BOEHM_GC='' + OBJC_BOEHM_GC_INCLUDES='' ++ OBJC_BOEHM_GC_LIBS='' + ;; + *) + OBJC_BOEHM_GC=libobjc_gc.la + OBJC_BOEHM_GC_INCLUDES='-I$(top_srcdir)/../boehm-gc/include -I../boehm-gc/include' ++ OBJC_BOEHM_GC_LIBS='../boehm-gc/libgcjgc_convenience.la -pthread' + ;; + esac], + [OBJC_BOEHM_GC=''; OBJC_BOEHM_GC_INCLUDES='']) + AC_SUBST(OBJC_BOEHM_GC) + AC_SUBST(OBJC_BOEHM_GC_INCLUDES) ++AC_SUBST(OBJC_BOEHM_GC_LIBS) + + # ----------- + # Directories + diff --git a/recipes/gcc/gcc-svn/debian/libssp-gnu.dpatch b/recipes/gcc/gcc-svn/debian/libssp-gnu.dpatch new file mode 100644 index 0000000000..a0c6acd9fc --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libssp-gnu.dpatch @@ -0,0 +1,52 @@ +#! /bin/sh -e + +# DP: GNU/k*BSD support +# Author: Aurelien Jarno +# Status: Submitted: http://gcc.gnu.org/ml/gcc-patches/2007-04/msg01962.html + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# append the patch here and adjust the -p? flag in the patch calls. + +--- src.orig/gcc/configure 2008-03-01 15:51:06 +0100 ++++ src/gcc/configure 2008-03-01 16:02:24 +0100 +@@ -17110,7 +17110,7 @@ + else + gcc_cv_libc_provides_ssp=no + case "$target" in +- *-*-linux*) ++ *-*-*-gnu*) + if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then + if test "x$with_sysroot" = x; then + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include" +--- src.orig/gcc/configure.ac 2008-02-01 19:55:55 +0100 ++++ src/gcc/configure.ac 2008-03-01 16:02:06 +0100 +@@ -3379,7 +3379,7 @@ + gcc_cv_libc_provides_ssp, + [gcc_cv_libc_provides_ssp=no + case "$target" in +- *-*-linux*) ++ *-*-*-gnu*) + if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then + if test "x$with_sysroot" = x; then + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include" + diff --git a/recipes/gcc/gcc-svn/debian/libstdc++-doclink.dpatch b/recipes/gcc/gcc-svn/debian/libstdc++-doclink.dpatch new file mode 100644 index 0000000000..9393296712 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libstdc++-doclink.dpatch @@ -0,0 +1,51 @@ +#! /bin/sh -e + +# DP: adjust hrefs to point to the local documentation + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libstdc++-v3/doc/doxygen/mainpage.html~ 2008-02-19 21:08:07.375796572 +0100 ++++ libstdc++-v3/doc/doxygen/mainpage.html 2008-02-19 21:14:20.841430216 +0100 +@@ -30,8 +30,8 @@ +

There are two types of documentation for libstdc++. One is the + distribution documentation, which can be read online + here +- or offline from the file doc/html/index.html in the library source +- directory. ++ or offline in the documentation directory ++ here. +

+ +

The other type is the source documentation, of which this is the first page. +@@ -71,9 +71,9 @@ + This style guide can also be viewed on the web. + +

License, Copyright, and Other Lawyerly Verbosity

+-

The libstdc++ documentation is released under +- +- these terms. ++

The libstdc++ documentation is released under these terms ++ (read online, or ++ read offline). +

+

Part of the generated documentation involved comments and notes from + SGI, who says we gotta say this: diff --git a/recipes/gcc/gcc-svn/debian/libstdc++-pic.dpatch b/recipes/gcc/gcc-svn/debian/libstdc++-pic.dpatch new file mode 100644 index 0000000000..70c9e81542 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libstdc++-pic.dpatch @@ -0,0 +1,71 @@ +#! /bin/sh -e + +# DP: Build and install libstdc++_pic.a library. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -ur libstdc++-v3/src/Makefile.am libstdc++-v3/src/Makefile.am +--- libstdc++-v3/src/Makefile.am~ 2004-04-16 21:04:05.000000000 +0200 ++++ libstdc++-v3/src/Makefile.am 2004-07-03 20:22:43.000000000 +0200 +@@ -210,6 +210,10 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o || touch libstdc++_pic.a ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +diff -ur libstdc++-v3/src/Makefile.in libstdc++-v3/src/Makefile.in +--- libstdc++-v3/src/Makefile.in 2004-07-03 06:41:13.000000000 +0200 ++++ libstdc++-v3/src/Makefile.in 2004-07-03 20:25:05.000000000 +0200 +@@ -611,7 +611,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -644,6 +644,7 @@ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec \ ++ install-exec-local \ + install-exec-am install-info install-info-am install-man \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ +@@ -729,6 +730,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o || touch libstdc++_pic.a ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/recipes/gcc/gcc-svn/debian/libstdc++-symbols-hppa.dpatch b/recipes/gcc/gcc-svn/debian/libstdc++-symbols-hppa.dpatch new file mode 100644 index 0000000000..250ec3aae5 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/libstdc++-symbols-hppa.dpatch @@ -0,0 +1,369 @@ +#! /bin/sh -e + +# DP: Update libstdc++ baseline symbols for hppa. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt +=================================================================== +--- libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt (revision 133733) ++++ libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt (working copy) +@@ -33,19 +33,51 @@ + FUNC:_ZN10__gnu_norm15_List_node_base6unhookEv@@GLIBCXX_3.4 + FUNC:_ZN10__gnu_norm15_List_node_base7reverseEv@@GLIBCXX_3.4 + FUNC:_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4 ++FUNC:_ZN11__gnu_debug19_Safe_iterator_base12_M_get_mutexEv@@GLIBCXX_3.4.9 ++FUNC:_ZN11__gnu_debug19_Safe_iterator_base16_M_attach_singleEPNS_19_Safe_sequence_baseEb@@GLIBCXX_3.4.9 ++FUNC:_ZN11__gnu_debug19_Safe_iterator_base16_M_detach_singleEv@@GLIBCXX_3.4.9 + FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@@GLIBCXX_3.4 + FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv@@GLIBCXX_3.4 ++FUNC:_ZN11__gnu_debug19_Safe_sequence_base12_M_get_mutexEv@@GLIBCXX_3.4.9 + FUNC:_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv@@GLIBCXX_3.4 + FUNC:_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv@@GLIBCXX_3.4 + FUNC:_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv@@GLIBCXX_3.4 + FUNC:_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_@@GLIBCXX_3.4 ++FUNC:_ZN14__gnu_parallel9_Settings3getEv@@GLIBCXX_3.4.10 ++FUNC:_ZN14__gnu_parallel9_Settings3setERS0_@@GLIBCXX_3.4.10 + FUNC:_ZN9__gnu_cxx12__atomic_addEPVii@@GLIBCXX_3.4 + FUNC:_ZN9__gnu_cxx17__pool_alloc_base12_M_get_mutexEv@@GLIBCXX_3.4.2 + FUNC:_ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listEj@@GLIBCXX_3.4.2 + FUNC:_ZN9__gnu_cxx17__pool_alloc_base9_M_refillEj@@GLIBCXX_3.4.2 + FUNC:_ZN9__gnu_cxx18__exchange_and_addEPVii@@GLIBCXX_3.4 + FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE4fileEv@@GLIBCXX_3.4.2 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE5uflowEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC1EP8_IO_FILE@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC2EP8_IO_FILE@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4.10 + FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4fileEv@@GLIBCXX_3.4.2 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE5uflowEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC1EP8_IO_FILE@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC2EP8_IO_FILE@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4.10 ++FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4.10 + FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.3 + FUNC:_ZN9__gnu_cxx6__poolILb0EE10_M_destroyEv@@GLIBCXX_3.4.4 + FUNC:_ZN9__gnu_cxx6__poolILb0EE13_M_initializeEv@@GLIBCXX_3.4.4 +@@ -53,6 +85,7 @@ + FUNC:_ZN9__gnu_cxx6__poolILb0EE16_M_reserve_blockEjj@@GLIBCXX_3.4.4 + FUNC:_ZN9__gnu_cxx6__poolILb1EE10_M_destroyEv@@GLIBCXX_3.4.4 + FUNC:_ZN9__gnu_cxx6__poolILb1EE13_M_initializeEPFvPvE@@GLIBCXX_3.4.4 ++FUNC:_ZN9__gnu_cxx6__poolILb1EE13_M_initializeEv@@GLIBCXX_3.4.6 + FUNC:_ZN9__gnu_cxx6__poolILb1EE16_M_get_thread_idEv@@GLIBCXX_3.4.4 + FUNC:_ZN9__gnu_cxx6__poolILb1EE16_M_reclaim_blockEPcj@@GLIBCXX_3.4.4 + FUNC:_ZN9__gnu_cxx6__poolILb1EE16_M_reserve_blockEjj@@GLIBCXX_3.4.4 +@@ -81,6 +114,7 @@ + FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_@@GLIBCXX_3.4 + FUNC:_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc@@GLIBCXX_3.4 + FUNC:_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc@@GLIBCXX_3.4 ++FUNC:_ZNK11__gnu_debug16_Error_formatter17_M_get_max_lengthEv@@GLIBCXX_3.4.10 + FUNC:_ZNK11__gnu_debug16_Error_formatter8_M_errorEv@@GLIBCXX_3.4 + FUNC:_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv@@GLIBCXX_3.4 + FUNC:_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_@@GLIBCXX_3.4 +@@ -203,6 +237,7 @@ + FUNC:_ZNKSs8max_sizeEv@@GLIBCXX_3.4 + FUNC:_ZNKSs9_M_ibeginEv@@GLIBCXX_3.4 + FUNC:_ZNKSsixEj@@GLIBCXX_3.4 ++FUNC:_ZNKSt10bad_typeid4whatEv@@GLIBCXX_3.4.9 + FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCXX_3.4 + FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCXX_3.4 + FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCXX_3.4 +@@ -301,6 +336,7 @@ + FUNC:_ZNKSt11logic_error4whatEv@@GLIBCXX_3.4 + FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCXX_3.4 + FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCXX_3.4 ++FUNC:_ZNKSt13bad_exception4whatEv@@GLIBCXX_3.4.9 + FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4 + FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4 + FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4 +@@ -353,6 +389,16 @@ + FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4 + FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4 + FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4 ++FUNC:_ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt3tr14hashIRKSsEclES2_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt3tr14hashISbIwSt11char_traitsIwESaIwEEEclES4_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt3tr14hashISsEclESs@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt3tr14hashIeEclEe@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt4hashIRKSbIwSt11char_traitsIwESaIwEEEclES5_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt4hashIRKSsEclES1_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt4hashISbIwSt11char_traitsIwESaIwEEEclES3_@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt4hashISsEclESs@@GLIBCXX_3.4.10 ++FUNC:_ZNKSt4hashIeEclEe@@GLIBCXX_3.4.10 + FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCXX_3.4 + FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCXX_3.4 + FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCXX_3.4 +@@ -515,6 +561,7 @@ + FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCXX_3.4 + FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCXX_3.4 + FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCXX_3.4 ++FUNC:_ZNKSt8bad_cast4whatEv@@GLIBCXX_3.4.9 + FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4 + FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4 + FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4 +@@ -591,6 +638,7 @@ + FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4 + FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4 + FUNC:_ZNKSt8valarrayIjE4sizeEv@@GLIBCXX_3.4 ++FUNC:_ZNKSt9bad_alloc4whatEv@@GLIBCXX_3.4.9 + FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCXX_3.4 + FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCXX_3.4 + FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCXX_3.4 +@@ -774,6 +822,17 @@ + FUNC:_ZNSdD0Ev@@GLIBCXX_3.4 + FUNC:_ZNSdD1Ev@@GLIBCXX_3.4 + FUNC:_ZNSdD2Ev@@GLIBCXX_3.4 ++FUNC:_ZNSi10_M_extractIPvEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIbEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIdEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIeEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIfEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIjEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIlEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractImEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractItEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIxEERSiRT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSi10_M_extractIyEERSiRT_@@GLIBCXX_3.4.9 + FUNC:_ZNSi3getEPci@@GLIBCXX_3.4 + FUNC:_ZNSi3getEPcic@@GLIBCXX_3.4 + FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 +@@ -833,6 +892,14 @@ + FUNC:_ZNSo6sentryD1Ev@@GLIBCXX_3.4 + FUNC:_ZNSo6sentryD2Ev@@GLIBCXX_3.4 + FUNC:_ZNSo8_M_writeEPKci@@GLIBCXX_3.4 ++FUNC:_ZNSo9_M_insertIPKvEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIbEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIdEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIeEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIlEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertImEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIxEERSoT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSo9_M_insertIyEERSoT_@@GLIBCXX_3.4.9 + FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 + FUNC:_ZNSoC1Ev@@GLIBCXX_3.4 + FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 +@@ -1206,6 +1273,17 @@ + FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIPvEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIbEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIdEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIeEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIfEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIjEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIlEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractImEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractItEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIxEERS2_RT_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIyEERS2_RT_@@GLIBCXX_3.4.9 + FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCXX_3.4 +@@ -1265,6 +1343,14 @@ + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@@GLIBCXX_3.4 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIPKvEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIbEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIdEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIeEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIxEERS2_T_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_@@GLIBCXX_3.4.9 + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 +@@ -1386,6 +1472,7 @@ + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCXX_3.4 ++FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6stosscEv@@GLIBCXX_3.4.10 + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCXX_3.4 +@@ -1424,6 +1511,7 @@ + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCXX_3.4 ++FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6stosscEv@@GLIBCXX_3.4.10 + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCXX_3.4 +@@ -1455,6 +1543,7 @@ + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4 ++FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv@@GLIBCXX_3.4.6 + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +@@ -1471,6 +1560,7 @@ + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4 ++FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv@@GLIBCXX_3.4.6 + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 + FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +@@ -1660,10 +1750,16 @@ + FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCXX_3.4 + FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCXX_3.4 ++FUNC:_ZNSt6__norm15_List_node_base4hookEPS0_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt6__norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4.9 ++FUNC:_ZNSt6__norm15_List_node_base6unhookEv@@GLIBCXX_3.4.9 ++FUNC:_ZNSt6__norm15_List_node_base7reverseEv@@GLIBCXX_3.4.9 ++FUNC:_ZNSt6__norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4.9 + FUNC:_ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@@GLIBCXX_3.4 + FUNC:_ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@@GLIBCXX_3.4 + FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4 + FUNC:_ZNSt6locale21_S_normalize_categoryEi@@GLIBCXX_3.4 ++FUNC:_ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEj@@GLIBCXX_3.4.7 + FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPKNS_5facetE@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCXX_3.4 +@@ -1676,6 +1772,7 @@ + FUNC:_ZNSt6locale5_ImplC2Ej@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCXX_3.4 ++FUNC:_ZNSt6locale5facet13_S_get_c_nameEv@@GLIBCXX_3.4.6 + FUNC:_ZNSt6locale5facet15_S_get_c_localeEv@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCXX_3.4 + FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCXX_3.4 +@@ -1753,7 +1850,9 @@ + FUNC:_ZNSt8bad_castD2Ev@@GLIBCXX_3.4 + FUNC:_ZNSt8ios_base13_M_grow_wordsEib@@GLIBCXX_3.4 + FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCXX_3.4 ++FUNC:_ZNSt8ios_base17_M_call_callbacksENS_5eventE@@GLIBCXX_3.4.6 + FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCXX_3.4 ++FUNC:_ZNSt8ios_base20_M_dispose_callbacksEv@@GLIBCXX_3.4.6 + FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCXX_3.4 + FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4 +@@ -1832,6 +1931,11 @@ + FUNC:_ZNSt8valarrayIjED1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt8valarrayIjED2Ev@@GLIBCXX_3.4 + FUNC:_ZNSt8valarrayIjEixEj@@GLIBCXX_3.4 ++FUNC:_ZNSt9__cxx199815_List_node_base4hookEPS0_@@GLIBCXX_3.4.10 ++FUNC:_ZNSt9__cxx199815_List_node_base4swapERS0_S1_@@GLIBCXX_3.4.10 ++FUNC:_ZNSt9__cxx199815_List_node_base6unhookEv@@GLIBCXX_3.4.10 ++FUNC:_ZNSt9__cxx199815_List_node_base7reverseEv@@GLIBCXX_3.4.10 ++FUNC:_ZNSt9__cxx199815_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4.10 + FUNC:_ZNSt9bad_allocD0Ev@@GLIBCXX_3.4 + FUNC:_ZNSt9bad_allocD1Ev@@GLIBCXX_3.4 + FUNC:_ZNSt9bad_allocD2Ev@@GLIBCXX_3.4 +@@ -1913,8 +2017,13 @@ + FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4 + FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCXX_3.4 + FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCXX_3.4 ++FUNC:_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@@GLIBCXX_3.4.9 ++FUNC:_ZSt16__ostream_insertIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_i@@GLIBCXX_3.4.9 + FUNC:_ZSt16__throw_bad_castv@@GLIBCXX_3.4 ++FUNC:_ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@@GLIBCXX_3.4.6 ++FUNC:_ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@@GLIBCXX_3.4.6 + FUNC:_ZSt17__throw_bad_allocv@@GLIBCXX_3.4 ++FUNC:_ZSt17__verify_groupingPKcjRKSs@@GLIBCXX_3.4.10 + FUNC:_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4 + FUNC:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4 + FUNC:_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4 +@@ -1930,6 +2039,8 @@ + FUNC:_ZSt20__throw_length_errorPKc@@GLIBCXX_3.4 + FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCXX_3.4 + FUNC:_ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4 ++FUNC:_ZSt21__copy_streambufs_eofIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_Rb@@GLIBCXX_3.4.9 ++FUNC:_ZSt21__copy_streambufs_eofIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_Rb@@GLIBCXX_3.4.9 + FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCXX_3.4 + FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCXX_3.4 + FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCXX_3.4 +@@ -2162,36 +2273,23 @@ + FUNC:__cxa_vec_new@@CXXABI_1.3 + FUNC:__dynamic_cast@@CXXABI_1.3 + FUNC:__gxx_personality_v0@@CXXABI_1.3 +-FUNC:acosl@@GLIBCXX_3.4.3 +-FUNC:asinl@@GLIBCXX_3.4.3 +-FUNC:atan2l@@GLIBCXX_3.4 +-FUNC:atanl@@GLIBCXX_3.4.3 +-FUNC:ceill@@GLIBCXX_3.4.3 +-FUNC:coshl@@GLIBCXX_3.4 +-FUNC:cosl@@GLIBCXX_3.4 +-FUNC:expl@@GLIBCXX_3.4 +-FUNC:floorl@@GLIBCXX_3.4.3 +-FUNC:fmodl@@GLIBCXX_3.4.3 +-FUNC:frexpl@@GLIBCXX_3.4.3 +-FUNC:hypotl@@GLIBCXX_3.4 +-FUNC:ldexpl@@GLIBCXX_3.4.3 +-FUNC:log10l@@GLIBCXX_3.4 +-FUNC:logl@@GLIBCXX_3.4 +-FUNC:modfl@@GLIBCXX_3.4.3 +-FUNC:powl@@GLIBCXX_3.4 +-FUNC:sinhl@@GLIBCXX_3.4 +-FUNC:sinl@@GLIBCXX_3.4 +-FUNC:sqrtl@@GLIBCXX_3.4 +-FUNC:tanhl@@GLIBCXX_3.4 +-FUNC:tanl@@GLIBCXX_3.4 ++FUNC:__signbitl@@GLIBCXX_3.4 + OBJECT:0:CXXABI_1.3 + OBJECT:0:CXXABI_1.3.1 ++OBJECT:0:CXXABI_1.3.2 + OBJECT:0:GLIBCXX_3.4 + OBJECT:0:GLIBCXX_3.4.1 ++OBJECT:0:GLIBCXX_3.4.10 + OBJECT:0:GLIBCXX_3.4.2 + OBJECT:0:GLIBCXX_3.4.3 + OBJECT:0:GLIBCXX_3.4.4 + OBJECT:0:GLIBCXX_3.4.5 ++OBJECT:0:GLIBCXX_3.4.6 ++OBJECT:0:GLIBCXX_3.4.7 ++OBJECT:0:GLIBCXX_3.4.8 ++OBJECT:0:GLIBCXX_3.4.9 ++OBJECT:1028:_ZNSt3tr18__detail12__prime_listE@@GLIBCXX_3.4.10 ++OBJECT:1028:_ZNSt8__detail12__prime_listE@@GLIBCXX_3.4.10 + OBJECT:12:_ZTIN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3 + OBJECT:12:_ZTIN10__cxxabiv117__array_type_infoE@@CXXABI_1.3 + OBJECT:12:_ZTIN10__cxxabiv117__class_type_infoE@@CXXABI_1.3 +@@ -3135,6 +3233,8 @@ + OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4 + OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4 + OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4 ++OBJECT:8:_ZTIN10__cxxabiv115__forced_unwindE@@CXXABI_1.3.2 ++OBJECT:8:_ZTIN10__cxxabiv119__foreign_exceptionE@@CXXABI_1.3.2 + OBJECT:8:_ZTINSt6locale5facetE@@GLIBCXX_3.4 + OBJECT:8:_ZTISt10ctype_base@@GLIBCXX_3.4 + OBJECT:8:_ZTISt10money_base@@GLIBCXX_3.4 diff --git a/recipes/gcc/gcc-svn/debian/link-libs.dpatch b/recipes/gcc/gcc-svn/debian/link-libs.dpatch new file mode 100644 index 0000000000..340d5a51be --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/link-libs.dpatch @@ -0,0 +1,157 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config/t-slibgcc-elf-ver.orig 2006-10-03 18:16:53.094898500 +0200 ++++ gcc/config/t-slibgcc-elf-ver 2006-10-03 18:17:40.061833750 +0200 +@@ -14,6 +14,7 @@ + SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ + -Wl,--soname=$(SHLIB_SONAME) \ + -Wl,--version-script=$(SHLIB_MAP) \ ++ -Wl,-O1 \ + -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \ + $(SHLIB_OBJS) $(SHLIB_LC) && \ + rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \ +--- libstdc++-v3/src/Makefile.am.orig 2006-10-03 18:16:53.186904250 +0200 ++++ libstdc++-v3/src/Makefile.am 2006-10-03 18:17:40.121837500 +0200 +@@ -185,6 +185,7 @@ + libstdc___la_DEPENDENCIES = ${version_dep} $(libstdc___la_LIBADD) + + libstdc___la_LDFLAGS = \ ++ -Wl,-O1 \ + -version-info $(libtool_VERSION) ${version_arg} -lm + + # Use special rules for the deprecated source files so that they find +--- libstdc++-v3/src/Makefile.in.orig 2006-10-03 18:16:53.206905500 +0200 ++++ libstdc++-v3/src/Makefile.in 2006-10-03 18:17:40.137838500 +0200 +@@ -387,6 +387,7 @@ + + libstdc___la_DEPENDENCIES = ${version_dep} $(libstdc___la_LIBADD) + libstdc___la_LDFLAGS = \ ++ -Wl,-O1 \ + -version-info $(libtool_VERSION) ${version_arg} -lm + + +--- libobjc/Makefile.in.orig 2006-10-03 18:16:53.098898750 +0200 ++++ libobjc/Makefile.in 2006-10-03 18:17:40.061833750 +0200 +@@ -276,11 +276,13 @@ + libobjc$(libext).la: $(OBJS) + $(LIBTOOL_LINK) $(CC) -o $@ $(OBJS) \ + -rpath $(toolexeclibdir) \ ++ -Wl,-O1 \ + -version-info $(LIBOBJC_VERSION) $(extra_ldflags_libobjc) + + libobjc_gc$(libext).la: $(OBJS_GC) + $(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) \ + -rpath $(toolexeclibdir) \ ++ -Wl,-O1 \ + -version-info $(LIBOBJC_GC_VERSION) $(extra_ldflags_libobjc) + + # +--- libgfortran/Makefile.am.orig 2006-10-03 18:16:53.102899000 +0200 ++++ libgfortran/Makefile.am 2006-10-03 18:18:59.566802500 +0200 +@@ -7,7 +7,7 @@ + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) + + toolexeclib_LTLIBRARIES = libgfortran.la +-libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -lm $(extra_ldflags_libgfortran) ++libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -lm $(extra_ldflags_libgfortran) -Wl,-O1 + + myexeclib_LTLIBRARIES = libgfortranbegin.la + myexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) +--- libgfortran/Makefile.in.orig 2006-10-03 18:16:53.106899250 +0200 ++++ libgfortran/Makefile.in 2006-10-03 18:19:17.543926000 +0200 +@@ -359,7 +359,7 @@ + ACLOCAL_AMFLAGS = -I ../config + gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) + toolexeclib_LTLIBRARIES = libgfortran.la +-libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -lm $(extra_ldflags_libgfortran) ++libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -lm $(extra_ldflags_libgfortran) -Wl,-O1 + myexeclib_LTLIBRARIES = libgfortranbegin.la + myexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR) + libgfortranbegin_la_SOURCES = fmain.c +--- libmudflap/Makefile.am.orig 2006-10-03 18:16:53.182904000 +0200 ++++ libmudflap/Makefile.am 2006-10-03 18:17:40.117837250 +0200 +@@ -34,7 +34,7 @@ + mf-hooks2.c + libmudflap_la_LIBADD = + libmudflap_la_DEPENDENCIES = $(libmudflap_la_LIBADD) +-libmudflap_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libmudflap_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + + clean-local: + rm -f pth/*.o pth/*.lo +--- libmudflap/Makefile.in.orig 2006-10-03 18:16:53.182904000 +0200 ++++ libmudflap/Makefile.in 2006-10-03 18:17:40.121837500 +0200 +@@ -241,7 +241,7 @@ + + libmudflap_la_LIBADD = + libmudflap_la_DEPENDENCIES = $(libmudflap_la_LIBADD) +-libmudflap_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libmudflap_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + libmudflapth_la_SOURCES = + libmudflapth_la_LIBADD = \ + pth/mf-runtime.lo \ +--- libffi/Makefile.am.orig 2006-10-03 18:16:53.098898750 +0200 ++++ libffi/Makefile.am 2006-10-03 18:17:40.061833750 +0200 +@@ -154,7 +154,7 @@ + + AM_CFLAGS = -Wall -g -fexceptions + +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + + AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + AM_CCASFLAGS = $(AM_CPPFLAGS) +--- libffi/Makefile.in.orig 2006-10-03 18:16:53.102899000 +0200 ++++ libffi/Makefile.in 2006-10-03 18:17:40.065834000 +0200 +@@ -436,7 +436,7 @@ + libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) + nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) + AM_CFLAGS = -Wall -g -fexceptions +-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` ++libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -Wl,-O1 + AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + AM_CCASFLAGS = $(AM_CPPFLAGS) + all: fficonfig.h +--- libjava/Makefile.am.orig 2006-10-03 18:16:53.130900750 +0200 ++++ libjava/Makefile.am 2006-10-03 18:17:40.093835750 +0200 +@@ -97,7 +97,7 @@ + GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) \ + $(LDFLAGS) -o $@ + LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) \ +- $(LDFLAGS) $(extra_ldflags_libjava) -o $@ ++ $(LDFLAGS) $(extra_ldflags_libjava) -Wl,-O1 -o $@ + + GCC_UNWIND_INCLUDE = @GCC_UNWIND_INCLUDE@ + +--- libjava/Makefile.in.orig 2006-10-03 18:16:53.162902750 +0200 ++++ libjava/Makefile.in 2006-10-03 18:17:40.117837250 +0200 +@@ -733,7 +733,7 @@ + $(LDFLAGS) -o $@ + + LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) \ +- $(LDFLAGS) $(extra_ldflags_libjava) -o $@ ++ $(LDFLAGS) $(extra_ldflags_libjava) -Wl,-O1 -o $@ + + WARNINGS = -Wextra -Wall + AM_CXXFLAGS = \ diff --git a/recipes/gcc/gcc-svn/debian/mips-triarch.dpatch b/recipes/gcc/gcc-svn/debian/mips-triarch.dpatch new file mode 100644 index 0000000000..5738bb4791 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/mips-triarch.dpatch @@ -0,0 +1,61 @@ +#! /bin/sh -e + +# DP: Patch author: Stuart Anderson +# DP: Upstream status: Not submitted +# DP: Description: add full tri-arch support. Include linux64.h also fix up +# DP: Description: the directory names so that o32 is the default and follow +# DP: Description: the glibc convention for 32 & 64 bit names + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- src/gcc/config/mips/linux64.h 2007-08-02 12:49:31.000000000 +0200 ++++ src/gcc/config/mips/linux64.h 2008-03-14 14:33:41.000000000 +0100 +@@ -24,7 +24,7 @@ + #define DRIVER_SELF_SPECS \ + NO_SHARED_SPECS \ + " %{!EB:%{!EL:%(endian_spec)}}" \ +-" %{!mabi=*: -mabi=n32}" ++" %{!mabi=*: -mabi=32}" + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +--- src/gcc/config/mips/t-linux64 2006-06-06 14:51:24.000000000 +0200 ++++ src/gcc/config/mips/t-linux64 2008-03-14 14:26:21.000000000 +0100 +@@ -1,5 +1,5 @@ + MULTILIB_OPTIONS = mabi=n32/mabi=32/mabi=64 +-MULTILIB_DIRNAMES = n32 32 64 ++MULTILIB_DIRNAMES = n32 . 64 + MULTILIB_OSDIRNAMES = ../lib32 ../lib ../lib64 + + EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +--- src/gcc/config.gcc 2008-01-29 17:28:10.000000000 +0100 ++++ src/gcc/config.gcc 2008-03-14 14:26:21.000000000 +0100 +@@ -1680,7 +1680,8 @@ + test x$with_llsc != x || with_llsc=yes + ;; + mips*-*-linux*) # Linux MIPS, either endian. +- tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h mips/linux64.h" ++ tmake_file="${tmake_file} mips/t-linux64" + case ${target} in + mipsisa32r2*) + tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33" diff --git a/recipes/gcc/gcc-svn/debian/mudflap-nocheck.dpatch b/recipes/gcc/gcc-svn/debian/mudflap-nocheck.dpatch new file mode 100644 index 0000000000..9f8f025d82 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/mudflap-nocheck.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e + +# DP: Disable running the libmudflap testsuite. Getting killed on alpha. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- libmudflap/testsuite/Makefile.in~ 2005-09-23 18:33:47.000000000 +0200 ++++ libmudflap/testsuite/Makefile.in 2006-03-25 20:31:45.044903808 +0100 +@@ -218,6 +218,8 @@ + + + check-DEJAGNU: site.exp ++ @echo target $@ disabled for Debian build. ++check-DEJAGNU-disabled: site.exp + srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + runtest=$(RUNTEST); \ diff --git a/recipes/gcc/gcc-svn/debian/multiarch-include.dpatch b/recipes/gcc/gcc-svn/debian/multiarch-include.dpatch new file mode 100644 index 0000000000..2580444e7d --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/multiarch-include.dpatch @@ -0,0 +1,138 @@ +#! /bin/sh -e + +# DP: biarch-include.dpatch +# DP: +# DP: Adds biarch include directories +# DP: /usr/local/include/-linux-gnu +# DP: /usr/include/-linux-gnu +# DP: to the system include paths, depending on 32/64 bit mode. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +Index: gcc/cppdefault.c +=================================================================== +--- gcc/cppdefault.c (revision 112832) ++++ gcc/cppdefault.c (working copy) +@@ -60,6 +60,7 @@ + #endif + #ifdef LOCAL_INCLUDE_DIR + /* /usr/local/include comes before the fixincluded header files. */ ++ { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, + #endif + #ifdef PREFIX_INCLUDE_DIR +@@ -83,6 +84,7 @@ + #endif + #ifdef STANDARD_INCLUDE_DIR + /* /usr/include comes dead last. */ ++ { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 2 }, + { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 0 }, + #endif + { 0, 0, 0, 0, 0, 0 } +Index: gcc/c-incpath.c +=================================================================== +--- gcc/c-incpath.c (revision 112832) ++++ gcc/c-incpath.c (working copy) +@@ -30,6 +30,7 @@ + #include "intl.h" + #include "c-incpath.h" + #include "cppdefault.h" ++#include "errors.h" + + /* Windows does not natively support inodes, and neither does MSDOS. + Cygwin's emulation can generate non-unique inodes, so don't use it. +@@ -121,6 +121,31 @@ + } + } + ++struct multiarch_mapping ++{ ++ const char *const multilib; ++ const char *const multiarch; ++}; ++ ++const struct multiarch_mapping multiarch_mappings[] ++= { ++#include "multiarch.inc" ++ { 0, 0 } ++}; ++ ++static const char* ++multilib_to_multiarch (const char *imultilib) ++{ ++ const struct multiarch_mapping *p; ++ ++ for (p = multiarch_mappings; p->multiarch; p++) ++ { ++ if (!strcmp(p->multilib, imultilib ? imultilib : "")) ++ return p->multiarch; ++ } ++ internal_error("no multiarch mapping for multilib (%s)\n", imultilib); ++} ++ + /* Append the standard include chain defined in cppdefault.c. */ + static void + add_standard_paths (const char *sysroot, const char *iprefix, +@@ -128,6 +153,7 @@ + { + const struct default_include *p; + size_t len; ++ const char *multiarch; + + if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) + { +@@ -146,8 +172,15 @@ + if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) + { + char *str = concat (iprefix, p->fname + len, NULL); +- if (p->multilib && imultilib) ++ if (p->multilib == 1 && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); ++ if (p->multilib == 2) ++ { ++ multiarch = multilib_to_multiarch (imultilib); ++ if (!multiarch) ++ continue; ++ str = concat (str, dir_separator_str, multiarch, NULL); ++ } + add_path (str, SYSTEM, p->cxx_aware, false); + } + } +@@ -166,9 +199,17 @@ + else + str = update_path (p->fname, p->component); + +- if (p->multilib && imultilib) ++ if (p->multilib == 1 && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); + ++ if (p->multilib == 2) ++ { ++ multiarch = multilib_to_multiarch (imultilib); ++ if (!multiarch) ++ continue; ++ str = concat (str, dir_separator_str, multiarch, NULL); ++ } ++ + add_path (str, SYSTEM, p->cxx_aware, false); + } + } diff --git a/recipes/gcc/gcc-svn/debian/multiarch-lib.dpatch b/recipes/gcc/gcc-svn/debian/multiarch-lib.dpatch new file mode 100644 index 0000000000..93ba09fa39 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/multiarch-lib.dpatch @@ -0,0 +1,52 @@ +#! /bin/sh -e + +# multiarch-lib.dpatch by Stephen Frost + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN gcc.old/config/i386/t-linux64 gcc/config/i386/t-linux64 +--- gcc.old/config/i386/t-linux64 2002-11-28 15:47:02.000000000 +0100 ++++ gcc/config/i386/t-linux64 2004-07-10 07:28:01.000000000 +0200 +@@ -6,7 +6,7 @@ + + MULTILIB_OPTIONS = m64/m32 + MULTILIB_DIRNAMES = 64 32 +-MULTILIB_OSDIRNAMES = ../lib64 ../lib ++MULTILIB_OSDIRNAMES = x86_64-linux i486-linux + + LIBGCC = stmp-multilib + INSTALL_LIBGCC = install-multilib +diff -urN gcc.old/config/t-linux gcc/config/t-linux +--- gcc.old/config/t-linux 2004-05-04 18:09:38.000000000 +0200 ++++ gcc/config/t-linux 2004-07-10 07:28:01.000000000 +0200 +@@ -11,3 +11,11 @@ + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c + LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++MULTILIB_OPTIONS = m32 ++MULTILIB_DIRNAMES = 32 ++MULTILIB_OSDIRNAMES = $TARGET_ARCH ++ ++LIBGCC = stmp-multilib ++INSTALL_LIBGCC = install-multilib ++ diff --git a/recipes/gcc/gcc-svn/debian/note-gnu-stack.dpatch b/recipes/gcc/gcc-svn/debian/note-gnu-stack.dpatch new file mode 100644 index 0000000000..3ffc3925d4 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/note-gnu-stack.dpatch @@ -0,0 +1,316 @@ +#! /bin/sh -e + +# DP: Add .note.GNU-stack sections for gcc's crt files, libffi and boehm-gc +# DP: Taken from FC. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +gcc/ + +2004-09-20 Jakub Jelinek + + * config/rs6000/ppc-asm.h: Add .note.GNU-stack section also + on ppc64-linux. + + * config/ia64/lib1funcs.asm: Add .note.GNU-stack section on + ia64-linux. + * config/ia64/crtbegin.asm: Likewise. + * config/ia64/crtend.asm: Likewise. + * config/ia64/crti.asm: Likewise. + * config/ia64/crtn.asm: Likewise. + +2004-05-14 Jakub Jelinek + + * config/ia64/linux.h (TARGET_ASM_FILE_END): Define. + + +boehm-gc/ + +2005-02-08 Jakub Jelinek + + * ia64_save_regs_in_stack.s: Moved to... + * ia64_save_regs_in_stack.S: ... this. Add .note.GNU-stack + on Linux. + +libffi/ + +2007-05-11 Daniel Jacobowitz + + * src/arm/sysv.S: Fix ARM comment marker. + +2005-02-08 Jakub Jelinek + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/arm/sysv.S: Likewise. + + +Index: boehm-gc/ia64_save_regs_in_stack.s +=================================================================== +--- boehm-gc/ia64_save_regs_in_stack.s (revision 107431) ++++ boehm-gc/ia64_save_regs_in_stack.s (revision 107432) +@@ -1,12 +0,0 @@ +- .text +- .align 16 +- .global GC_save_regs_in_stack +- .proc GC_save_regs_in_stack +-GC_save_regs_in_stack: +- .body +- flushrs +- ;; +- mov r8=ar.bsp +- br.ret.sptk.few rp +- .endp GC_save_regs_in_stack +- +Index: boehm-gc/ia64_save_regs_in_stack.S +=================================================================== +--- boehm-gc/ia64_save_regs_in_stack.S (revision 0) ++++ boehm-gc/ia64_save_regs_in_stack.S (revision 107432) +@@ -0,0 +1,15 @@ ++ .text ++ .align 16 ++ .global GC_save_regs_in_stack ++ .proc GC_save_regs_in_stack ++GC_save_regs_in_stack: ++ .body ++ flushrs ++ ;; ++ mov r8=ar.bsp ++ br.ret.sptk.few rp ++ .endp GC_save_regs_in_stack ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- gcc/config/ia64/linux.h.orig 2006-10-12 02:01:00.000000000 +0200 ++++ gcc/config/ia64/linux.h 2006-12-11 10:33:13.000000000 +0100 +@@ -5,6 +5,8 @@ + + #define TARGET_VERSION fprintf (stderr, " (IA-64) Linux"); + ++#define TARGET_ASM_FILE_END file_end_indicate_exec_stack ++ + /* This is for -profile to use -lc_p instead of -lc. */ + #undef CC1_SPEC + #define CC1_SPEC "%{profile:-p} %{G*}" +--- gcc/config/ia64/lib1funcs.asm.orig 2006-01-18 22:46:41.000000000 +0100 ++++ gcc/config/ia64/lib1funcs.asm 2006-12-11 10:33:13.000000000 +0100 +@@ -792,3 +792,7 @@ + } + .endp __floattitf + #endif ++ ++#ifdef __linux__ ++.section .note.GNU-stack; .previous ++#endif +--- gcc/config/ia64/crti.asm.orig 2006-01-18 22:46:41.000000000 +0100 ++++ gcc/config/ia64/crti.asm 2006-12-11 10:33:13.000000000 +0100 +@@ -64,3 +64,7 @@ + .body + + # end of crti.asm ++ ++#ifdef __linux__ ++.section .note.GNU-stack; .previous ++#endif +--- gcc/config/ia64/crtn.asm.orig 2006-01-18 22:46:41.000000000 +0100 ++++ gcc/config/ia64/crtn.asm 2006-12-11 10:33:13.000000000 +0100 +@@ -54,3 +54,7 @@ + br.ret.sptk.many b0 + + # end of crtn.asm ++ ++#ifdef __linux__ ++.section .note.GNU-stack; .previous ++#endif +--- gcc/config/ia64/crtend.asm.orig 2006-01-18 22:46:41.000000000 +0100 ++++ gcc/config/ia64/crtend.asm 2006-12-11 10:33:13.000000000 +0100 +@@ -122,3 +122,7 @@ + + br.ret.sptk.many rp + .endp __do_global_ctors_aux ++ ++#ifdef __linux__ ++.section .note.GNU-stack; .previous ++#endif +--- gcc/config/ia64/crtbegin.asm.orig 2006-01-18 22:46:41.000000000 +0100 ++++ gcc/config/ia64/crtbegin.asm 2006-12-11 10:33:13.000000000 +0100 +@@ -255,3 +255,7 @@ + .weak __cxa_finalize + #endif + .weak _Jv_RegisterClasses ++ ++#ifdef __linux__ ++.section .note.GNU-stack; .previous ++#endif +--- gcc/config/rs6000/ppc-asm.h.orig 2006-01-18 22:46:46.000000000 +0100 ++++ gcc/config/rs6000/ppc-asm.h 2006-12-11 10:33:14.000000000 +0100 +@@ -158,7 +158,7 @@ + .size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name) + #endif + +-#if defined __linux__ && !defined __powerpc64__ ++#if defined __linux__ + .section .note.GNU-stack + .previous + #endif +--- libffi/src/powerpc/ppc_closure.S.orig 2006-03-25 09:16:06.000000000 +0100 ++++ libffi/src/powerpc/ppc_closure.S 2006-12-11 10:33:14.000000000 +0100 +@@ -281,3 +281,7 @@ + .LEFDE1: + + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/powerpc/sysv.S.orig 2006-03-25 09:16:06.000000000 +0100 ++++ libffi/src/powerpc/sysv.S 2006-12-11 10:33:14.000000000 +0100 +@@ -217,3 +217,7 @@ + .align 2 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/powerpc/linux64_closure.S.orig 2006-01-18 22:49:27.000000000 +0100 ++++ libffi/src/powerpc/linux64_closure.S 2006-12-11 10:33:14.000000000 +0100 +@@ -204,3 +204,7 @@ + .align 3 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/powerpc/linux64.S.orig 2006-03-25 09:16:06.000000000 +0100 ++++ libffi/src/powerpc/linux64.S 2006-12-11 10:33:14.000000000 +0100 +@@ -175,3 +175,7 @@ + .align 3 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/arm/sysv.S.orig 2006-10-12 02:00:57.000000000 +0200 ++++ libffi/src/arm/sysv.S 2006-12-11 10:33:14.000000000 +0100 +@@ -255,3 +255,6 @@ + .ffi_closure_SYSV_end: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",%progbits ++#endif +--- libffi/src/m68k/sysv.S.orig 2006-01-18 22:49:27.000000000 +0100 ++++ libffi/src/m68k/sysv.S 2006-12-11 10:33:14.000000000 +0100 +@@ -207,3 +207,7 @@ + rts + CFI_ENDPROC() + .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/alpha/osf.S.orig 2006-01-18 22:49:27.000000000 +0100 ++++ libffi/src/alpha/osf.S 2006-12-11 10:33:14.000000000 +0100 +@@ -356,4 +356,8 @@ + .byte 16 # uleb128 offset 16*-8 + .align 3 + $LEFDE3: ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif + #endif +--- libffi/src/x86/sysv.S.orig 2006-01-18 22:49:28.000000000 +0100 ++++ libffi/src/x86/sysv.S 2006-12-11 10:33:14.000000000 +0100 +@@ -376,3 +376,7 @@ + #endif + + #endif /* ifndef __x86_64__ */ ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/x86/unix64.S.orig 2006-01-18 22:49:28.000000000 +0100 ++++ libffi/src/x86/unix64.S 2006-12-11 10:33:14.000000000 +0100 +@@ -410,3 +410,7 @@ + .LEFDE3: + + #endif /* __x86_64__ */ ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/s390/sysv.S.orig 2006-01-18 22:49:28.000000000 +0100 ++++ libffi/src/s390/sysv.S 2006-12-11 10:33:14.000000000 +0100 +@@ -427,3 +427,6 @@ + + #endif + ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/ia64/unix.S.orig 2006-01-18 22:49:29.000000000 +0100 ++++ libffi/src/ia64/unix.S 2006-12-11 10:33:14.000000000 +0100 +@@ -553,3 +553,7 @@ + data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/sparc/v9.S.orig 2006-01-18 22:49:29.000000000 +0100 ++++ libffi/src/sparc/v9.S 2006-12-11 10:33:14.000000000 +0100 +@@ -300,3 +300,7 @@ + .align 8 + .LLEFDE2: + #endif ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +--- libffi/src/sparc/v8.S.orig 2006-01-18 22:49:29.000000000 +0100 ++++ libffi/src/sparc/v8.S 2006-12-11 10:33:14.000000000 +0100 +@@ -265,3 +265,7 @@ + .byte 0x1f ! uleb128 0x1f + .align WS + .LLEFDE2: ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif diff --git a/recipes/gcc/gcc-svn/debian/powerpc-biarch.dpatch b/recipes/gcc/gcc-svn/debian/powerpc-biarch.dpatch new file mode 100644 index 0000000000..a1d2a727a9 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/powerpc-biarch.dpatch @@ -0,0 +1,47 @@ +#! /bin/sh -e + +# DP: enable biarch for 32 bit compiler + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config/rs6000/t-linux64.orig 2007-09-29 16:03:54.000000000 +0000 ++++ gcc/config/rs6000/t-linux64 2007-09-30 10:36:47.000000000 +0000 +@@ -14,13 +14,13 @@ + # it doesn't tell anything about the 32bit libraries on those systems. Set + # MULTILIB_OSDIRNAMES according to what is found on the target. + +-MULTILIB_OPTIONS = m64/m32 msoft-float +-MULTILIB_DIRNAMES = 64 32 nof ++MULTILIB_OPTIONS = m64/m32 ++MULTILIB_DIRNAMES = 64 32 + MULTILIB_EXTRA_OPTS = fPIC mstrict-align +-MULTILIB_EXCEPTIONS = m64/msoft-float +-MULTILIB_EXCLUSIONS = m64/!m32/msoft-float +-MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof +-MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) ++MULTILIB_EXCEPTIONS = ++MULTILIB_EXCLUSIONS = ++MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) ++MULTILIB_MATCHES = + + softfp_wrap_start := '\#ifndef __powerpc64__' + softfp_wrap_end := '\#endif' diff --git a/recipes/gcc/gcc-svn/debian/ppc64-ada.dpatch b/recipes/gcc/gcc-svn/debian/ppc64-ada.dpatch new file mode 100644 index 0000000000..db9a229c40 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/ppc64-ada.dpatch @@ -0,0 +1,257 @@ +#! /bin/sh -e + +# DP: Add gcc/ada/system-linux-ppc64.ads and use it in gcc/ada/Makefile.in +# DP: + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +diff -urN src.orig/gcc/ada/Makefile.in src/gcc/ada/Makefile.in +--- src.orig/gcc/ada/Makefile.in 2005-05-02 16:39:32.000000000 +0200 ++++ src/gcc/ada/Makefile.in 2005-05-02 16:36:37.000000000 +0200 +@@ -1346,6 +1346,31 @@ + LIBRARY_VERSION := $(LIB_VERSION) + endif + ++ifeq ($(strip $(filter-out powerpc64% linux%,$(arch) $(osys))),) ++ LIBGNAT_TARGET_PAIRS = \ ++ a-intnam.ads" (Left, Right : Address) return Boolean; ++ function ">=" (Left, Right : Address) return Boolean; ++ function "=" (Left, Right : Address) return Boolean; ++ ++ pragma Import (Intrinsic, "<"); ++ pragma Import (Intrinsic, "<="); ++ pragma Import (Intrinsic, ">"); ++ pragma Import (Intrinsic, ">="); ++ pragma Import (Intrinsic, "="); ++ ++ -- Other System-Dependent Declarations ++ ++ type Bit_Order is (High_Order_First, Low_Order_First); ++ Default_Bit_Order : constant Bit_Order := High_Order_First; ++ ++ -- Priority-related Declarations (RM D.1) ++ ++ Max_Priority : constant Positive := 30; ++ Max_Interrupt_Priority : constant Positive := 31; ++ ++ subtype Any_Priority is Integer range 0 .. 31; ++ subtype Priority is Any_Priority range 0 .. 30; ++ subtype Interrupt_Priority is Any_Priority range 31 .. 31; ++ ++ Default_Priority : constant Priority := 15; ++ ++private ++ ++ type Address is mod Memory_Size; ++ Null_Address : constant Address := 0; ++ ++ -------------------------------------- ++ -- System Implementation Parameters -- ++ -------------------------------------- ++ ++ -- These parameters provide information about the target that is used ++ -- by the compiler. They are in the private part of System, where they ++ -- can be accessed using the special circuitry in the Targparm unit ++ -- whose source should be consulted for more detailed descriptions ++ -- of the individual switch values. ++ ++ AAMP : constant Boolean := False; ++ Backend_Divide_Checks : constant Boolean := False; ++ Backend_Overflow_Checks : constant Boolean := False; ++ Command_Line_Args : constant Boolean := True; ++ Configurable_Run_Time : constant Boolean := False; ++ Denorm : constant Boolean := True; ++ Duration_32_Bits : constant Boolean := False; ++ Exit_Status_Supported : constant Boolean := True; ++ Fractional_Fixed_Ops : constant Boolean := False; ++ Frontend_Layout : constant Boolean := False; ++ Functions_Return_By_DSP : constant Boolean := False; ++ Machine_Overflows : constant Boolean := False; ++ Machine_Rounds : constant Boolean := True; ++ OpenVMS : constant Boolean := False; ++ Preallocated_Stacks : constant Boolean := False; ++ Signed_Zeros : constant Boolean := True; ++ Stack_Check_Default : constant Boolean := False; ++ Stack_Check_Probes : constant Boolean := False; ++ Support_64_Bit_Divides : constant Boolean := True; ++ Support_Aggregates : constant Boolean := True; ++ Support_Composite_Assign : constant Boolean := True; ++ Support_Composite_Compare : constant Boolean := True; ++ Support_Long_Shifts : constant Boolean := True; ++ Suppress_Standard_Library : constant Boolean := False; ++ Use_Ada_Main_Program_Name : constant Boolean := False; ++ ZCX_By_Default : constant Boolean := True; ++ GCC_ZCX_Support : constant Boolean := True; ++ Front_End_ZCX_Support : constant Boolean := False; ++ ++ -- Obsolete entries, to be removed eventually (bootstrap issues!) ++ ++ High_Integrity_Mode : constant Boolean := False; ++ Long_Shifts_Inlined : constant Boolean := True; ++ ++end System; +diff -urN tmp/gcc/ada/s-auxdec.ads src/gcc/ada/s-auxdec.ads +--- tmp/gcc/ada/s-auxdec.ads 2004-06-11 12:47:36.000000000 +0200 ++++ src/gcc/ada/s-auxdec.ads 2005-05-03 11:34:17.000000000 +0200 +@@ -108,13 +108,13 @@ + pragma Warnings (Off); + + type F_Float is digits 6; +- pragma Float_Representation (VAX_Float, F_Float); ++-- pragma Float_Representation (VAX_Float, F_Float); + + type D_Float is digits 9; +- pragma Float_Representation (Vax_Float, D_Float); ++-- pragma Float_Representation (Vax_Float, D_Float); + + type G_Float is digits 15; +- pragma Float_Representation (Vax_Float, G_Float); ++-- pragma Float_Representation (Vax_Float, G_Float); + + -- Floating point type declarations for IEEE floating point data types + +--- tmp/gcc/ada/s-vaflop.ads 2003-10-21 15:42:18.000000000 +0200 ++++ src/gcc/ada/s-vaflop.ads 2005-05-03 15:24:24.000000000 +0200 +@@ -40,15 +40,15 @@ + -- Suppress warnings if not on Alpha/VAX + + type D is digits 9; +- pragma Float_Representation (VAX_Float, D); ++-- pragma Float_Representation (VAX_Float, D); + -- D Float type on Vax + + type G is digits 15; +- pragma Float_Representation (VAX_Float, G); ++-- pragma Float_Representation (VAX_Float, G); + -- G Float type on Vax + + type F is digits 6; +- pragma Float_Representation (VAX_Float, F); ++-- pragma Float_Representation (VAX_Float, F); + -- F Float type on Vax + + type S is digits 6; diff --git a/recipes/gcc/gcc-svn/debian/pr24170.dpatch b/recipes/gcc/gcc-svn/debian/pr24170.dpatch new file mode 100644 index 0000000000..028291ed6f --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr24170.dpatch @@ -0,0 +1,88 @@ +#! /bin/sh -e + +# DP: Fix PR libgcj/24170. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libjava && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + rm -f ${dir}libjava/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-02-20 Tom Tromey + + PR libgcj/24170: + * java/io/natFilePosix.cc (File::performList): Don't use + readdir_r. + * configure, include/config.h.in: Rebuilt. + * configure.ac: Don't check for readdir_r. + +Index: libjava/configure.ac +=================================================================== +--- libjava/configure.ac (revision 132490) ++++ libjava/configure.ac (revision 132491) +@@ -1023,7 +1023,7 @@ + PLATFORMNET=NoNet + else + AC_CHECK_FUNCS([strerror_r select fstat open fsync sleep opendir \ +- localtime_r readdir_r getpwuid_r getcwd \ ++ localtime_r getpwuid_r getcwd \ + access stat lstat mkdir rename rmdir unlink utime chmod readlink \ + nl_langinfo setlocale \ + inet_pton uname inet_ntoa \ +Index: libjava/include/config.h.in +=================================================================== +--- libjava/include/config.h.in (revision 132490) ++++ libjava/include/config.h.in (revision 132491) +@@ -214,9 +214,6 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_PWD_H + +-/* Define to 1 if you have the `readdir_r' function. */ +-#undef HAVE_READDIR_R +- + /* Define to 1 if you have the `readlink' function. */ + #undef HAVE_READLINK + +Index: libjava/java/io/natFilePosix.cc +=================================================================== +--- libjava/java/io/natFilePosix.cc (revision 132490) ++++ libjava/java/io/natFilePosix.cc (revision 132491) +@@ -1,6 +1,6 @@ + // natFile.cc - Native part of File class for POSIX. + +-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2006 ++/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2006, 2008 + Free Software Foundation + + This file is part of libgcj. +@@ -292,13 +292,7 @@ + + java::util::ArrayList *list = new java::util::ArrayList (); + struct dirent *d; +-#if defined(HAVE_READDIR_R) && defined(_POSIX_PTHREAD_SEMANTICS) +- int name_max = pathconf (buf, _PC_NAME_MAX); +- char dbuf[sizeof (struct dirent) + name_max + 1]; +- while (readdir_r (dir, (struct dirent *) dbuf, &d) == 0 && d != NULL) +-#else /* HAVE_READDIR_R */ + while ((d = readdir (dir)) != NULL) +-#endif /* HAVE_READDIR_R */ + { + // Omit "." and "..". + if (d->d_name[0] == '.' diff --git a/recipes/gcc/gcc-svn/debian/pr27880.dpatch b/recipes/gcc/gcc-svn/debian/pr27880.dpatch new file mode 100644 index 0000000000..f8f08b0695 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr27880.dpatch @@ -0,0 +1,90 @@ +#! /bin/sh -e + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: PR target/27880: Restore static linking on ia64 with system libunwind +# DP: by adding unwind-compat to the static libgcc. + +2006-06-19 Andreas Schwab + + PR target/27880 + * unwind-compat.c: Wrap everything except _Unwind_GetIPInfo inside + SHARED. + * config/t-libunwind (LIB2ADDEHSTATIC): Add + $(srcdir)/unwind-compat.c. + +Index: gcc/config/t-libunwind +=================================================================== +--- gcc/config/t-libunwind (revision 114767) ++++ gcc/config/t-libunwind (working copy) +@@ -6,7 +6,8 @@ + SHLIB_LC = -lunwind -lc + LIB2ADDEH = $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c \ + $(srcdir)/unwind-compat.c $(srcdir)/unwind-dw2-fde-compat.c +-LIB2ADDEHSTATIC = $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHSTATIC = $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c \ ++ $(srcdir)/unwind-compat.c + + T_CFLAGS += -DUSE_LIBUNWIND_EXCEPTIONS + TARGET_LIBGCC2_CFLAGS += -DUSE_GAS_SYMVER +Index: gcc/unwind-compat.c +=================================================================== +--- gcc/unwind-compat.c (revision 114767) ++++ gcc/unwind-compat.c (working copy) +@@ -35,6 +35,7 @@ + #include "unwind-dw2-fde.h" + #include "unwind-compat.h" + ++#ifdef SHARED + extern _Unwind_Reason_Code __libunwind_Unwind_Backtrace + (_Unwind_Trace_Fn, void *); + +@@ -136,13 +137,6 @@ _Unwind_GetIP (struct _Unwind_Context *c + } + symver (_Unwind_GetIP, GCC_3.0); + +-_Unwind_Ptr +-_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn) +-{ +- *ip_before_insn = 0; +- return __libunwind_Unwind_GetIP (context); +-} +- + extern void *__libunwind_Unwind_GetLanguageSpecificData + (struct _Unwind_Context *); + +@@ -212,4 +206,14 @@ _Unwind_SetIP (struct _Unwind_Context *c + return __libunwind_Unwind_SetIP (context, val); + } + symver (_Unwind_SetIP, GCC_3.0); ++#endif /* SHARED */ ++ ++extern _Unwind_Ptr __libunwind_Unwind_GetIP (struct _Unwind_Context *); ++ ++_Unwind_Ptr ++_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn) ++{ ++ *ip_before_insn = 0; ++ return __libunwind_Unwind_GetIP (context); ++} + #endif + diff --git a/recipes/gcc/gcc-svn/debian/pr28102.dpatch b/recipes/gcc/gcc-svn/debian/pr28102.dpatch new file mode 100644 index 0000000000..bdb546546a --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr28102.dpatch @@ -0,0 +1,45 @@ +#! /bin/sh -e + +# DP: Apply proposed fix for PR target/28102. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2006-07-15 Alfred M. Szmidt + + * config/i386/gnu.h (TARGET_C99_FUNCTIONS): Undefine macro. + +Index: gcc/config/i386/gnu.h +=================================================================== +--- gcc/config/i386/gnu.h (revision 115472) ++++ gcc/config/i386/gnu.h (working copy) +@@ -36,3 +36,9 @@ + + /* FIXME: Is a Hurd-specific fallback mechanism necessary? */ + #undef MD_UNWIND_SUPPORT ++ ++/* config.gcc includes i386/linux.h. */ ++#undef TARGET_C99_FUNCTIONS ++#define TARGET_C99_FUNCTIONS 1 ++#undef TARGET_HAS_SINCOS ++#define TARGET_HAS_SINCOS 1 + + diff --git a/recipes/gcc/gcc-svn/debian/pr28322.dpatch b/recipes/gcc/gcc-svn/debian/pr28322.dpatch new file mode 100644 index 0000000000..ea2ea2abcc --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr28322.dpatch @@ -0,0 +1,151 @@ +#! /bin/sh -e + +# DP: Fix PR other/28322, GCC new warnings and compatibility. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +gcc/ + +2008-02-26 Manuel Lopez-Ibanez + + PR other/28322 + * toplev.c (toplev_main): If there are warnings or error, print + errors for ignored options. + * opts.c (ignored_options): New static variable. + (postpone_unknown_option_error): New. + (print_ignored_options): New. + (handle_option): Postpone errors for unknown -Wno-* options. + * opts.h (print_ignored_options): Declare. + +gcc/testsuite/ + +2008-02-26 Manuel Lopez-Ibanez + + PR other/28322 + * gcc.dg/pr28322.c: New. + * gcc.dg/pr28322-2.c: New. + * lib/prune.exp: Ignore "At top level" even if there is no ':' + preceding it. + +Index: gcc/toplev.c +=================================================================== +--- gcc/toplev.c (revision 132801) ++++ gcc/toplev.c (working copy) +@@ -2278,6 +2278,9 @@ + if (!exit_after_options) + do_compile (); + ++ if (warningcount || errorcount) ++ print_ignored_options (); ++ + if (errorcount || sorrycount) + return (FATAL_EXIT_CODE); + +Index: gcc/testsuite/lib/prune.exp +=================================================================== +--- gcc/testsuite/lib/prune.exp (revision 132801) ++++ gcc/testsuite/lib/prune.exp (working copy) +@@ -21,7 +21,7 @@ + #send_user "Before:$text\n" + + regsub -all "(^|\n)(\[^\n\]*: )?In ((static member )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text +- regsub -all "(^|\n)\[^\n\]*: At (top level|global scope):\[^\n\]*" $text "" text ++ regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text + regsub -all "(^|\n)\[^\n\]*: instantiated from \[^\n\]*" $text "" text + regsub -all "(^|\n) inlined from \[^\n\]*" $text "" text + regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text +Index: gcc/opts.c +=================================================================== +--- gcc/opts.c (revision 132801) ++++ gcc/opts.c (working copy) +@@ -356,6 +356,12 @@ + static VEC(char_p,heap) *flag_instrument_functions_exclude_functions; + static VEC(char_p,heap) *flag_instrument_functions_exclude_files; + ++typedef const char *const_char_p; /* For DEF_VEC_P. */ ++DEF_VEC_P(const_char_p); ++DEF_VEC_ALLOC_P(const_char_p,heap); ++ ++static VEC(const_char_p,heap) *ignored_options; ++ + /* Input file names. */ + const char **in_fnames; + unsigned num_in_fnames; +@@ -434,6 +440,33 @@ + free (bad_lang); + } + ++/* Buffer the unknown option described by the string OPT. Currently, ++ we only complain about unknown -Wno-* options if they may have ++ prevented a diagnostic. Otherwise, we just ignore them. */ ++ ++static void postpone_unknown_option_error(const char *opt) ++{ ++ VEC_safe_push (const_char_p, heap, ignored_options, opt); ++} ++ ++/* Produce an error for each option previously buffered. */ ++ ++void print_ignored_options (void) ++{ ++ location_t saved_loc = input_location; ++ ++ input_location = 0; ++ ++ while (!VEC_empty (const_char_p, ignored_options)) ++ { ++ const char *opt; ++ opt = VEC_pop (const_char_p, ignored_options); ++ error ("unrecognized command line option \"%s\"", opt); ++ } ++ ++ input_location = saved_loc; ++} ++ + /* Handle the switch beginning at ARGV for the language indicated by + LANG_MASK. Returns the number of switches consumed. */ + static unsigned int +@@ -463,6 +496,14 @@ + opt = dup; + value = 0; + opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET); ++ if (opt_index == cl_options_count && opt[1] == 'W') ++ { ++ /* We don't generate errors for unknown -Wno-* options ++ unless we issue diagnostics. */ ++ postpone_unknown_option_error (argv[0]); ++ result = 1; ++ goto done; ++ } + } + + if (opt_index == cl_options_count) +Index: gcc/opts.h +=================================================================== +--- gcc/opts.h (revision 132801) ++++ gcc/opts.h (working copy) +@@ -105,4 +105,5 @@ + + extern void enable_warning_as_error (const char *arg, int value, + unsigned int lang_mask); ++extern void print_ignored_options (void); + #endif diff --git a/recipes/gcc/gcc-svn/debian/pr30961.dpatch b/recipes/gcc/gcc-svn/debian/pr30961.dpatch new file mode 100644 index 0000000000..b20fdf5bf5 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr30961.dpatch @@ -0,0 +1,179 @@ +#! /bin/sh -e + +# DP: + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +From: "H.J. Lu" +Sender: gcc-patches-owner@gcc.gnu.org +To: gcc-patches@gcc.gnu.org +Subject: PATCH: PR target/30961: [4.1/4.2/4.3 regression] redundant reg/mem stores/moves +Date: Mon, 27 Aug 2007 11:34:12 -0700 + +We start with + +(note:HI 3 4 22 2 NOTE_INSN_FUNCTION_BEG) + +(insn:HI 6 3 10 2 c.c:3 (set (reg:DF 58 [ ]) + (subreg:DF (reg/v:DI 59 [ in ]) 0)) 102 {*movdf_integer_rex64} (expr_list:REG_DEAD (reg/v:DI 59 [ in ]) + (nil))) + +(insn:HI 10 6 16 2 c.c:7 (set (reg/i:DF 21 xmm0 [ ]) + (reg:DF 58 [ ])) 102 {*movdf_integer_rex64} (expr_list:REG_DEAD (reg:DF 58 [ ]) + (nil))) + +(insn:HI 16 10 0 2 c.c:7 (use (reg/i:DF 21 xmm0 [ ])) -1 (nil)) + +we are trying to allocate registers for insn 6 and we allocate +xmm0 for the return value. Reload doesn't check if xmm0 can be used for +DF 59, it allocates xmm1 for DF 59 and generates: + +Reloads for insn # 6 +Reload 0: reload_in (DF) = (reg:DF 5 di) + SSE_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine + reload_in_reg: (subreg:DF (reg/v:DI 5 di [orig:59 in ] [59]) 0) + reload_reg_rtx: (reg:DF 22 xmm1) +... + +(note:HI 4 1 3 2 [bb 2] NOTE_INSN_BASIC_BLOCK) + +(note:HI 3 4 22 2 NOTE_INSN_FUNCTION_BEG) + +(insn 22 3 23 2 c.c:3 (set (mem/c:DF (plus:DI (reg/f:DI 7 sp) + (const_int -8 [0xfffffffffffffff8])) [0 S8 A8]) + (reg:DF 5 di)) 102 {*movdf_integer_rex64} (nil)) + +(insn 23 22 6 2 c.c:3 (set (reg:DF 22 xmm1) + (mem/c:DF (plus:DI (reg/f:DI 7 sp) + (const_int -8 [0xfffffffffffffff8])) [0 S8 A8])) 102 {*movdf_integer_rex64} (nil)) + +(insn:HI 6 23 16 2 c.c:3 (set (reg:DF 21 xmm0 [orig:58 ] [58]) + (reg:DF 22 xmm1)) 102 {*movdf_integer_rex64} (nil)) + +(insn 16 6 21 2 c.c:7 (use (reg/i:DF 21 xmm0 [ ])) -1 (nil)) + +This patch tries to use the destination register when reloading for input. It +generates + +Reloads for insn # 6 +Reload 0: reload_in (DF) = (reg:DF 5 di) + SSE_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine + reload_in_reg: (subreg:DF (reg/v:DI 5 di [orig:59 in ] [59]) 0) + reload_reg_rtx: (reg:DF 21 xmm0) +... +(note:HI 4 1 3 2 [bb 2] NOTE_INSN_BASIC_BLOCK) + +(note:HI 3 4 22 2 NOTE_INSN_FUNCTION_BEG) + +(insn 22 3 23 2 c.c:3 (set (mem/c:DF (plus:DI (reg/f:DI 7 sp) + (const_int -8 [0xfffffffffffffff8])) [0 S8 A8]) + (reg:DF 5 di)) 102 {*movdf_integer_rex64} (nil)) + +(insn 23 22 6 2 c.c:3 (set (reg:DF 21 xmm0) + (mem/c:DF (plus:DI (reg/f:DI 7 sp) + (const_int -8 [0xfffffffffffffff8])) [0 S8 A8])) 102 {*movdf_integer_rex64} (nil)) + +(insn:HI 6 23 10 2 c.c:3 (set (reg:DF 22 xmm1 [orig:58 ] [58]) + (reg:DF 21 xmm0)) 102 {*movdf_integer_rex64} (nil)) + +(insn:HI 10 6 16 2 c.c:7 (set (reg/i:DF 21 xmm0 [ ]) + (reg:DF 22 xmm1 [orig:58 ] [58])) 102 {*movdf_integer_rex64} (nil)) + +(insn 16 10 21 2 c.c:7 (use (reg/i:DF 21 xmm0 [ ])) -1 (nil)) + + +H.J. +---- +gcc/ + +2007-08-27 H.J. Lu + + PR target/30961 + * reload1.c (find_reg): Favor the hard register in destination + if it is usable and a memory location is needed for reload + input. + +gcc/testsuite/ + +2007-08-27 H.J. Lu + + PR target/30961 + * gcc.target/i386/pr30961-1.c: New. + +--- gcc/reload1.c.second 2007-08-27 09:35:08.000000000 -0700 ++++ gcc/reload1.c 2007-08-27 09:36:33.000000000 -0700 +@@ -1781,6 +1781,20 @@ find_reg (struct insn_chain *chain, int + HARD_REG_SET not_usable; + HARD_REG_SET used_by_other_reload; + reg_set_iterator rsi; ++#ifdef SECONDARY_MEMORY_NEEDED ++ rtx body = PATTERN (chain->insn); ++ unsigned int dest_reg = FIRST_PSEUDO_REGISTER; ++ ++ if (GET_CODE (body) == SET) ++ { ++ rtx dest = SET_DEST (body); ++ ++ if ((REG_P (dest) ++ || (GET_CODE (dest) == SUBREG ++ && REG_P (SUBREG_REG (dest))))) ++ dest_reg = reg_or_subregno (dest); ++ } ++#endif + + COPY_HARD_REG_SET (not_usable, bad_spill_regs); + IOR_HARD_REG_SET (not_usable, bad_spill_regs_global); +@@ -1821,6 +1835,18 @@ find_reg (struct insn_chain *chain, int + this_cost--; + if (rl->out && REG_P (rl->out) && REGNO (rl->out) == regno) + this_cost--; ++#ifdef SECONDARY_MEMORY_NEEDED ++ /* If a memory location is needed for rl->in and dest_reg ++ is usable, we will favor it. */ ++ else if (dest_reg == regno ++ && rl->in ++ && REG_P (rl->in) ++ && REGNO (rl->in) < FIRST_PSEUDO_REGISTER ++ && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (rl->in)), ++ rl->class, ++ rl->mode)) ++ this_cost = 0; ++#endif + if (this_cost < best_cost + /* Among registers with equal cost, prefer caller-saved ones, or + use REG_ALLOC_ORDER if it is defined. */ +--- gcc/testsuite/gcc.target/i386/pr30961-1.c.second 2007-08-27 11:01:59.000000000 -0700 ++++ gcc/testsuite/gcc.target/i386/pr30961-1.c 2007-08-27 11:02:51.000000000 -0700 +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target lp64 } */ ++/* { dg-options "-O2" } */ ++ ++double ++convert (long long in) ++{ ++ double f; ++ __builtin_memcpy( &f, &in, sizeof( in ) ); ++ return f; ++} ++ ++/* { dg-final { scan-assembler-not "movapd" } } */ diff --git a/recipes/gcc/gcc-svn/debian/pr33148.dpatch b/recipes/gcc/gcc-svn/debian/pr33148.dpatch new file mode 100644 index 0000000000..bcf30ffb56 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr33148.dpatch @@ -0,0 +1,94 @@ +#! /bin/sh -e + +# DP: Fix (neg (lt X 0)) optimization (PR rtl-optimization/33148) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +From: Jakub Jelinek +Sender: gcc-patches-owner@gcc.gnu.org +To: gcc-patches@gcc.gnu.org +Subject: [PATCH] Fix (neg (lt X 0)) optimization (PR rtl-optimization/33148) +Date: Mon, 27 Aug 2007 07:22:44 -0400 + +Hi! + +PR25600 change introduced an optimization of (neg (lt x 0)) to +(ashirtrt x C), but it is not checking whether x's mode is suitable +for it. As it checks that op1 is const0_rtx, I believe MODE_FLOAT +or VECTOR_MODE_P modes are not a problem, CC modes can certainly appear +in LT's first operand with second operand const0_rtx. +So, when we optimize +(neg:DI (lt:DI (reg:CC ...) (const_int 0))) +we create something like +(sign_extend:DI (ashirtrt:CC (reg:CC ...) (const_int 31))) +which is IMHO invalid RTL, ashirtrt is documented on fixed point modes +only (guess vector modes aren't listed just by omission) and so is +sign_extend. + +Ok for 4.2/trunk? + +2007-08-27 Jakub Jelinek + + PR rtl-optimization/33148 + * simplify-rtx.c (simplify_unary_operation_1): Only optimize + (neg (lt X 0)) if X has scalar int mode. + + * gcc.c-torture/compile/20070827-1.c: New test. + +--- gcc/simplify-rtx.c.jj 2007-08-27 10:15:33.000000000 +0200 ++++ gcc/simplify-rtx.c 2007-08-27 12:12:51.000000000 +0200 +@@ -583,7 +583,8 @@ simplify_unary_operation_1 (enum rtx_cod + /* (neg (lt x 0)) is (ashiftrt X C) if STORE_FLAG_VALUE is 1. */ + /* (neg (lt x 0)) is (lshiftrt X C) if STORE_FLAG_VALUE is -1. */ + if (GET_CODE (op) == LT +- && XEXP (op, 1) == const0_rtx) ++ && XEXP (op, 1) == const0_rtx ++ && SCALAR_INT_MODE_P (GET_MODE (XEXP (op, 0)))) + { + enum machine_mode inner = GET_MODE (XEXP (op, 0)); + int isize = GET_MODE_BITSIZE (inner); +--- gcc/testsuite/gcc.c-torture/compile/20070827-1.c.jj 2007-08-27 12:17:20.000000000 +0200 ++++ gcc/testsuite/gcc.c-torture/compile/20070827-1.c 2007-08-27 12:15:45.000000000 +0200 +@@ -0,0 +1,20 @@ ++/* PR rtl-optimization/33148 */ ++ ++int ++foo (unsigned int *p, int *q, unsigned int w, unsigned int b) ++{ ++ unsigned int i; ++ int mask; ++ ++ if (q[0] < q[1]) ++ mask = 0xff; ++ else ++ mask = 0; ++ ++ for (i = 0; 8 * i < w; i++) ++ { ++ b ^= mask; ++ *p++ = b; ++ } ++ return 0; ++} + + Jakub diff --git a/recipes/gcc/gcc-svn/debian/pr34571.dpatch b/recipes/gcc/gcc-svn/debian/pr34571.dpatch new file mode 100644 index 0000000000..d0a654a3cc --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/pr34571.dpatch @@ -0,0 +1,63 @@ +#! /bin/sh -e + +# DP: Proposed patch for PR target/34571 (alpha) + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2007-12-26 Rask Ingemann Lambertsen + + PR target/34571 + * config/alpha/alpha.c (alpha_cannot_force_const_mem): Use + symbolic_operand. + * varasm.c (output_constant_pool_1): Fix typo. + +Index: gcc/config/alpha/alpha.c +=================================================================== +--- gcc/config/alpha/alpha.c (revision 131132) ++++ gcc/config/alpha/alpha.c (working copy) +@@ -1112,10 +1112,9 @@ alpha_legitimize_address (rtx x, rtx scr + + static bool + alpha_cannot_force_const_mem (rtx x) + { +- enum rtx_code code = GET_CODE (x); +- return code == SYMBOL_REF || code == LABEL_REF || code == CONST; ++ return symbolic_operand (x, GET_MODE (x)); + } + + /* We do not allow indirect calls to be optimized into sibling calls, nor + can we allow a call to a function with a different GP to be optimized +Index: gcc/varasm.c +=================================================================== +--- gcc/varasm.c (revision 131132) ++++ gcc/varasm.c (working copy) +@@ -3709,9 +3709,9 @@ output_constant_pool_1 (struct constant_ + tmp = XEXP (XEXP (x, 0), 0); + /* FALLTHRU */ + + case LABEL_REF: +- tmp = XEXP (x, 0); ++ tmp = XEXP (tmp, 0); + gcc_assert (!INSN_DELETED_P (tmp)); + gcc_assert (!NOTE_P (tmp) + || NOTE_KIND (tmp) != NOTE_INSN_DELETED); + break; diff --git a/recipes/gcc/gcc-svn/debian/rename-info-files.dpatch b/recipes/gcc/gcc-svn/debian/rename-info-files.dpatch new file mode 100644 index 0000000000..665d3e5f33 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/rename-info-files.dpatch @@ -0,0 +1,710 @@ +#! /bin/sh -e + +# DP: Allow transformations on info file names. Reference the +# DP: transformed info file names in the texinfo files. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +gcc/ChangeLog: + +2004-02-17 Matthias Klose + + * Makefile.in: Allow transformations on info file names. + Define MAKEINFODEFS, macros to pass transformated info file + names to makeinfo. + * doc/cpp.texi: Use macros defined in MAKEINFODEFS for references. + * doc/cppinternals.texi: Likewise. + * doc/extend.texi: Likewise. + * doc/gcc.texi: Likewise. + * doc/gccint.texi: Likewise. + * doc/invoke.texi: Likewise. + * doc/libgcc.texi: Likewise. + * doc/makefile.texi: Likewise. + * doc/passes.texi: Likewise. + * doc/sourcebuild.texi: Likewise. + * doc/standards.texi: Likewise. + * doc/trouble.texi: Likewise. + +gcc/fortran/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + * gfortran.texi: Use macros defined in MAKEINFODEFS for references. + +gcc/java/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + * gcj.texi: Use macros defined in MAKEINFODEFS for references. + +gcc/treelang/ChangeLog: + * Make-lang.in: Allow transformations on info file names. + Pass macros of transformated info file defined in MAKEINFODEFS + names to makeinfo. + Define TREELANG_MAKEINFODEFS macros to pass transformated info file + names to makeinfo. + * treelang.texi: Use macros defined in MAKEINFO_DEFS for references. + + +Index: libgomp/libgomp.texi +=================================================================== +--- libgomp/libgomp.texi.orig 2007-10-29 12:36:42.000000000 +0100 ++++ libgomp/libgomp.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -32,7 +32,7 @@ texts being (a) (see below), and with th + @ifinfo + @dircategory GNU Libraries + @direntry +-* libgomp: (libgomp). GNU OpenMP runtime library ++* @value{fnlibgomp}: (@value{fnlibgomp}). GNU OpenMP runtime library + @end direntry + + This manual documents the GNU implementation of the OpenMP API for +Index: libgomp/Makefile.am +=================================================================== +--- libgomp/Makefile.am.orig 2007-12-12 12:01:26.000000000 +0100 ++++ libgomp/Makefile.am 2008-02-08 16:27:44.000000000 +0100 +@@ -91,16 +91,19 @@ endif + + all-local: $(STAMP_GENINSRC) + +-stamp-geninsrc: libgomp.info +- cp -p $(top_builddir)/libgomp.info $(srcdir)/libgomp.info ++INFO_LIBGOMP_NAME = $(shell echo libgomp|sed '$(program_transform_name)') ++stamp-geninsrc: $(INFO_LIBGOMP_NAME).info ++ cp -p $(top_builddir)/$(INFO_LIBGOMP_NAME).info $(srcdir)/libgomp.info + @touch $@ + +-libgomp.info: $(STAMP_BUILD_INFO) ++libgomp.info: $(INFO_LIBGOMP_NAME).info ++ cp $(INFO_LIBGOMP_NAME).info libgomp.info ++$(INFO_LIBGOMP_NAME).info: $(STAMP_BUILD_INFO) + + stamp-build-info: libgomp.texi +- $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) -o libgomp.info $(srcdir)/libgomp.texi ++ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -D 'fnlibgomp $(INFO_LIBGOMP_NAME)' -I $(srcdir) -o $(INFO_LIBGOMP_NAME).info $(srcdir)/libgomp.texi + @touch $@ + + +-CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) libgomp.info ++CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) $(INFO_LIBGOMP_NAME).info + MAINTAINERCLEANFILES = $(srcdir)/libgomp.info +Index: libgomp/Makefile.in +=================================================================== +--- libgomp/Makefile.in.orig 2008-01-08 17:45:56.000000000 +0100 ++++ libgomp/Makefile.in 2008-02-08 16:27:44.000000000 +0100 +@@ -316,7 +316,8 @@ info_TEXINFOS = libgomp.texi + + # AM_CONDITIONAL on configure check ACX_CHECK_PROG_VER([MAKEINFO]) + @BUILD_INFO_TRUE@STAMP_BUILD_INFO = stamp-build-info +-CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) libgomp.info ++INFO_LIBGOMP_NAME = $(shell echo libgomp|sed '$(program_transform_name)') ++CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) $(INFO_LIBGOMP_NAME).info + MAINTAINERCLEANFILES = $(srcdir)/libgomp.info + all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive +@@ -1079,15 +1080,16 @@ install-pdf: $(PDFS) + done + + all-local: $(STAMP_GENINSRC) +- +-stamp-geninsrc: libgomp.info +- cp -p $(top_builddir)/libgomp.info $(srcdir)/libgomp.info ++stamp-geninsrc: $(INFO_LIBGOMP_NAME).info ++ cp -p $(top_builddir)/$(INFO_LIBGOMP_NAME).info $(srcdir)/libgomp.info + @touch $@ + +-libgomp.info: $(STAMP_BUILD_INFO) ++libgomp.info: $(INFO_LIBGOMP_NAME).info ++ cp $(INFO_LIBGOMP_NAME).info libgomp.info ++$(INFO_LIBGOMP_NAME).info: $(STAMP_BUILD_INFO) + + stamp-build-info: libgomp.texi +- $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) -o libgomp.info $(srcdir)/libgomp.texi ++ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -D 'fnlibgomp $(INFO_LIBGOMP_NAME)' -I $(srcdir) -o $(INFO_LIBGOMP_NAME).info $(srcdir)/libgomp.texi + @touch $@ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. +Index: gcc/doc/cpp.texi +=================================================================== +--- gcc/doc/cpp.texi.orig 2008-02-04 11:28:51.000000000 +0100 ++++ gcc/doc/cpp.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -52,7 +52,7 @@ This manual contains no Invariant Sectio + @ifinfo + @dircategory Software development + @direntry +-* Cpp: (cpp). The GNU C preprocessor. ++* @value{fncpp}: (@value{fncpp}). The GNU C preprocessor. + @end direntry + @end ifinfo + +Index: gcc/doc/cppinternals.texi +=================================================================== +--- gcc/doc/cppinternals.texi.orig 2007-03-11 13:17:34.000000000 +0100 ++++ gcc/doc/cppinternals.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -7,7 +7,7 @@ + @ifinfo + @dircategory Software development + @direntry +-* Cpplib: (cppinternals). Cpplib internals. ++* @value{fncppint}: (@value{fncppint}). Cpplib internals. + @end direntry + @end ifinfo + +Index: gcc/doc/extend.texi +=================================================================== +--- gcc/doc/extend.texi.orig 2008-02-04 11:28:51.000000000 +0100 ++++ gcc/doc/extend.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -11497,7 +11497,7 @@ want to write code that checks whether t + test for the GNU compiler the same way as for C programs: check for a + predefined macro @code{__GNUC__}. You can also use @code{__GNUG__} to + test specifically for GNU C++ (@pxref{Common Predefined Macros,, +-Predefined Macros,cpp,The GNU C Preprocessor}). ++Predefined Macros,@value{fncpp},The GNU C Preprocessor}). + + @menu + * Volatiles:: What constitutes an access to a volatile object. +Index: gcc/doc/gcc.texi +=================================================================== +--- gcc/doc/gcc.texi.orig 2008-01-24 17:57:55.000000000 +0100 ++++ gcc/doc/gcc.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -65,8 +65,8 @@ included in the section entitled ``GNU F + @ifnottex + @dircategory Software development + @direntry +-* gcc: (gcc). The GNU Compiler Collection. +-* g++: (gcc). The GNU C++ compiler. ++* @value{fngcc}: (@value{fngcc}). The GNU Compiler Collection. ++* @value{fngxx}: (@value{fngcc}). The GNU C++ compiler. + @end direntry + This file documents the use of the GNU compilers. + @sp 1 +@@ -126,7 +126,7 @@ version @value{version-GCC}. + The internals of the GNU compilers, including how to port them to new + targets and some information about how to write front ends for new + languages, are documented in a separate manual. @xref{Top,, +-Introduction, gccint, GNU Compiler Collection (GCC) Internals}. ++Introduction, @value{fngccint}, GNU Compiler Collection (GCC) Internals}. + + @menu + * G++ and GCC:: You can compile C or C++ programs. +Index: gcc/doc/gccint.texi +=================================================================== +--- gcc/doc/gccint.texi.orig 2007-10-29 14:31:38.000000000 +0100 ++++ gcc/doc/gccint.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -51,7 +51,7 @@ included in the section entitled ``GNU F + @ifnottex + @dircategory Software development + @direntry +-* gccint: (gccint). Internals of the GNU Compiler Collection. ++* @value{fngccint}: (@value{fngccint}). Internals of the GNU Compiler Collection. + @end direntry + This file documents the internals of the GNU compilers. + @sp 1 +@@ -83,7 +83,7 @@ write front ends for new languages. It + @value{VERSION_PACKAGE} + @end ifset + version @value{version-GCC}. The use of the GNU compilers is documented in a +-separate manual. @xref{Top,, Introduction, gcc, Using the GNU ++separate manual. @xref{Top,, Introduction, @value{fngcc}, Using the GNU + Compiler Collection (GCC)}. + + This manual is mainly a reference manual rather than a tutorial. It +Index: gcc/doc/invoke.texi +=================================================================== +--- gcc/doc/invoke.texi.orig 2008-02-07 12:10:09.000000000 +0100 ++++ gcc/doc/invoke.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -7456,7 +7456,7 @@ One of the standard libraries bypassed b + @option{-nodefaultlibs} is @file{libgcc.a}, a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or special + needs for some languages. +-(@xref{Interface,,Interfacing to GCC Output,gccint,GNU Compiler ++(@xref{Interface,,Interfacing to GCC Output,@value{fngccint},GNU Compiler + Collection (GCC) Internals}, + for more discussion of @file{libgcc.a}.) + In most cases, you need @file{libgcc.a} even when you want to avoid +@@ -7464,7 +7464,7 @@ other standard libraries. In other word + or @option{-nodefaultlibs} you should usually specify @option{-lgcc} as well. + This ensures that you have no unresolved references to internal GCC + library subroutines. (For example, @samp{__main}, used to ensure C++ +-constructors will be called; @pxref{Collect2,,@code{collect2}, gccint, ++constructors will be called; @pxref{Collect2,,@code{collect2}, @value{fngccint}, + GNU Compiler Collection (GCC) Internals}.) + + @item -pie +@@ -15215,7 +15215,7 @@ Note that you can also specify places to + @option{-B}, @option{-I} and @option{-L} (@pxref{Directory Options}). These + take precedence over places specified using environment variables, which + in turn take precedence over those specified by the configuration of GCC@. +-@xref{Driver,, Controlling the Compilation Driver @file{gcc}, gccint, ++@xref{Driver,, Controlling the Compilation Driver @file{gcc}, @value{fngccint}, + GNU Compiler Collection (GCC) Internals}. + + @table @env +@@ -15370,7 +15370,7 @@ the headers it contains change. + + A precompiled header file will be searched for when @code{#include} is + seen in the compilation. As it searches for the included file +-(@pxref{Search Path,,Search Path,cpp,The C Preprocessor}) the ++(@pxref{Search Path,,Search Path,@value{fncpp},The C Preprocessor}) the + compiler looks for a precompiled header in each directory just before it + looks for the include file in that directory. The name searched for is + the name specified in the @code{#include} with @samp{.gch} appended. If +Index: gcc/doc/libgcc.texi +=================================================================== +--- gcc/doc/libgcc.texi.orig 2007-10-29 14:31:38.000000000 +0100 ++++ gcc/doc/libgcc.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -24,7 +24,7 @@ that needs them. + GCC will also generate calls to C library routines, such as + @code{memcpy} and @code{memset}, in some cases. The set of routines + that GCC may possibly use is documented in @ref{Other +-Builtins,,,gcc, Using the GNU Compiler Collection (GCC)}. ++Builtins,,,@value{fngcc}, Using the GNU Compiler Collection (GCC)}. + + These routines take arguments and return values of a specific machine + mode, not a specific C type. @xref{Machine Modes}, for an explanation +Index: gcc/doc/makefile.texi +=================================================================== +--- gcc/doc/makefile.texi.orig 2008-02-04 11:28:51.000000000 +0100 ++++ gcc/doc/makefile.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -139,7 +139,7 @@ regardless of how it itself was compiled + @item profiledbootstrap + Builds a compiler with profiling feedback information. For more + information, see +-@ref{Building,,Building with profile feedback,gccinstall,Installing GCC}. ++@ref{Building,,Building with profile feedback,@value{fngccinstall},Installing GCC}. + + @item restrap + Restart a bootstrap, so that everything that was not built with +Index: gcc/doc/passes.texi +=================================================================== +--- gcc/doc/passes.texi.orig 2008-02-04 11:28:51.000000000 +0100 ++++ gcc/doc/passes.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -191,7 +191,7 @@ rid of it. This pass is located in @fil + @item Mudflap declaration registration + + If mudflap (@pxref{Optimize Options,,-fmudflap -fmudflapth +--fmudflapir,gcc,Using the GNU Compiler Collection (GCC)}) is ++-fmudflapir,@value{fngcc},Using the GNU Compiler Collection (GCC)}) is + enabled, we generate code to register some variable declarations with + the mudflap runtime. Specifically, the runtime tracks the lifetimes of + those variable declarations that have their addresses taken, or whose +Index: gcc/doc/standards.texi +=================================================================== +--- gcc/doc/standards.texi.orig 2007-12-12 12:01:27.000000000 +0100 ++++ gcc/doc/standards.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -230,8 +230,8 @@ HTML format. + GNAT Reference Manual}, for information on standard + conformance and compatibility of the Ada compiler. + +-@xref{Standards,,Standards, gfortran, The GNU Fortran Compiler}, for details ++@xref{Standards,,Standards, @value{fngfortran}, The GNU Fortran Compiler}, for details + of standards supported by GNU Fortran. + +-@xref{Compatibility,,Compatibility with the Java Platform, gcj, GNU gcj}, ++@xref{Compatibility,,Compatibility with the Java Platform, @value{fngcj}, GNU gcj}, + for details of compatibility between @command{gcj} and the Java Platform. +Index: gcc/java/Make-lang.in +=================================================================== +--- gcc/java/Make-lang.in.orig 2008-02-07 12:10:09.000000000 +0100 ++++ gcc/java/Make-lang.in 2008-02-08 16:27:44.000000000 +0100 +@@ -127,11 +127,23 @@ java.tags: force + etags --include TAGS.sub --include ../TAGS.sub + + +-java.info: doc/gcj.info ++TEXI_GCJ_FILES = java/gcj.texi \ ++ $(gcc_docdir)/include/gpl.texi $(gcc_docdir)/include/funding.texi \ ++ $(gcc_docdir)/include/fdl.texi $(gcc_docdir)/include/gcc-common.texi gcc-vers.texi ++INFO_GCJ_NAME = $(shell echo gcj|sed '$(program_transform_name)') + +-java.srcinfo: doc/gcj.info ++java.info: doc/$(INFO_GCJ_NAME).info ++ ++java.srcinfo: doc/$(INFO_GCJ_NAME).info + -cp -p $^ $(srcdir)/doc + ++doc/$(INFO_GCJ_NAME).info: $(TEXI_GCJ_FILES) ++ if test "x$(BUILD_INFO)" = xinfo; then \ ++ rm -f $(@)*; \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) \ ++ -I$(gcc_docdir)/include -I$(srcdir)/f -o$@ $<; \ ++ fi ++ + java.dvi: doc/gcj.dvi + + JAVA_PDFFILES = doc/gcj.pdf +@@ -187,8 +199,9 @@ java.uninstall: + -rm -rf $(DESTDIR)$(man1dir)/gij$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/jv-convert$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/gcj-dbtool$(man1ext) ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCJ_NAME).info* + +-java.install-info: $(DESTDIR)$(infodir)/gcj.info ++java.install-info: $(DESTDIR)$(infodir)/$(INFO_GCJ_NAME).info + + java.install-pdf: $(JAVA_PDFFILES) + @$(NORMAL_INSTALL) +Index: gcc/java/gcj.texi +=================================================================== +--- gcc/java/gcj.texi.orig 2007-12-12 12:01:27.000000000 +0100 ++++ gcc/java/gcj.texi 2008-02-08 17:19:48.000000000 +0100 +@@ -56,21 +56,21 @@ man page gfdl(7). + @format + @dircategory Software development + @direntry +-* Gcj: (gcj). Ahead-of-time compiler for the Java language ++* @value{fngcj}: (@value{fngcj}). Ahead-of-time compiler for the Java language + @end direntry + + @dircategory Individual utilities + @direntry +-* jcf-dump: (gcj)Invoking jcf-dump. ++* jcf-dump: (@value{fngcj}) Invoking jcf-dump. + Print information about Java class files +-* gij: (gcj)Invoking gij. GNU interpreter for Java bytecode +-* gcj-dbtool: (gcj)Invoking gcj-dbtool. ++* gij: (@value{fngcj}) Invoking gij. GNU interpreter for Java bytecode ++* gcj-dbtool: (@value{fngcj}) Invoking gcj-dbtool. + Tool for manipulating class file databases. +-* jv-convert: (gcj)Invoking jv-convert. ++* jv-convert: (@value{fngcj}) Invoking jv-convert. + Convert file from one encoding to another +-* grmic: (gcj)Invoking grmic. ++* grmic: (@value{fngcj}) Invoking grmic. + Generate stubs for Remote Method Invocation. +-* gc-analyze: (gcj)Invoking gc-analyze. ++* gc-analyze: (@value{fngcj}) Invoking gc-analyze. + Analyze Garbage Collector (GC) memory dumps. + @end direntry + @end format +@@ -152,7 +152,7 @@ and the Info entries for @file{gcj} and + + As @command{gcj} is just another front end to @command{gcc}, it supports many + of the same options as gcc. @xref{Option Summary, , Option Summary, +-gcc, Using the GNU Compiler Collection (GCC)}. This manual only documents the ++@value{fngcc}, Using the GNU Compiler Collection (GCC)}. This manual only documents the + options specific to @command{gcj}. + + @c man end +Index: gcc/fortran/Make-lang.in +=================================================================== +--- gcc/fortran/Make-lang.in.orig 2008-02-07 12:10:11.000000000 +0100 ++++ gcc/fortran/Make-lang.in 2008-02-08 16:27:44.000000000 +0100 +@@ -112,7 +112,8 @@ fortran.tags: force + cd $(srcdir)/fortran; etags -o TAGS.sub *.c *.h; \ + etags --include TAGS.sub --include ../TAGS.sub + +-fortran.info: doc/gfortran.info doc/gfc-internals.info ++INFO_FORTRAN_NAME = $(shell echo gfortran|sed '$(program_transform_name)') ++fortran.info: doc/$(INFO_FORTRAN_NAME).info + fortran.dvi: doc/gfortran.dvi doc/gfc-internals.dvi + fortran.html: $(build_htmldir)/gfortran/index.html + +@@ -154,10 +155,10 @@ GFORTRAN_TEXI = \ + $(srcdir)/doc/include/gcc-common.texi \ + gcc-vers.texi + +-doc/gfortran.info: $(GFORTRAN_TEXI) ++doc/$(INFO_FORTRAN_NAME).info: $(GFORTRAN_TEXI) + if [ x$(BUILD_INFO) = xinfo ]; then \ + rm -f doc/gfortran.info-*; \ +- $(MAKEINFO) -I $(srcdir)/doc/include -I $(srcdir)/fortran \ ++ $(MAKEINFO) $(MAKEINFODEFS) -I $(srcdir)/doc/include -I $(srcdir)/fortran \ + -o $@ $<; \ + else true; fi + +@@ -225,7 +226,7 @@ fortran.install-common: install-finclude + fi ; \ + fi + +-fortran.install-info: $(DESTDIR)$(infodir)/gfortran.info ++fortran.install-info: $(DESTDIR)$(infodir)/$(INFO_FORTRAN_NAME).info + + fortran.install-man: $(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext) + +@@ -243,7 +244,7 @@ fortran.uninstall: + rm -rf $(DESTDIR)$(bindir)/$(GFORTRAN_INSTALL_NAME)$(exeext); \ + rm -rf $(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext); \ + rm -rf $(DESTDIR)$(bindir)/$(GFORTRAN_TARGET_INSTALL_NAME)$(exeext); \ +- rm -rf $(DESTDIR)$(infodir)/gfortran.info* ++ rm -rf $(DESTDIR)$(infodir)/$(INFO_FORTRAN_NAME).info* + + # + # Clean hooks: +Index: gcc/fortran/gfortran.texi +=================================================================== +--- gcc/fortran/gfortran.texi.orig 2008-01-25 16:49:43.000000000 +0100 ++++ gcc/fortran/gfortran.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -102,7 +102,7 @@ texts being (a) (see below), and with th + @ifinfo + @dircategory Software development + @direntry +-* gfortran: (gfortran). The GNU Fortran Compiler. ++* @value{fngfortran}: (@value{fngfortran}). The GNU Fortran Compiler. + @end direntry + This file documents the use and the internals of + the GNU Fortran compiler, (@command{gfortran}). +Index: gcc/treelang/Make-lang.in +=================================================================== +--- gcc/treelang/Make-lang.in.orig 2008-02-07 12:10:11.000000000 +0100 ++++ gcc/treelang/Make-lang.in 2008-02-08 16:27:44.000000000 +0100 +@@ -153,9 +153,12 @@ treelang.tags: force + cd $(srcdir)/treelang; etags -o TAGS.sub *.y *.l *.c *.h; \ + etags --include TAGS.sub --include ../TAGS.sub + +-treelang.info: doc/treelang.info ++INFO_TREELANG_NAME = $(shell echo treelang|sed '$(program_transform_name)') ++TREELANG_MAKEINFODEFS = -D 'fntreelang $(INFO_TREELANG_NAME)' + +-treelang.srcinfo: doc/treelang.info ++treelang.info: doc/$(INFO_TREELANG_NAME).info ++ ++treelang.srcinfo: doc/$(INFO_TREELANG_NAME).info + -cp -p $^ $(srcdir)/doc + + treelang.dvi: doc/treelang.dvi +@@ -171,8 +174,8 @@ TEXI_TREELANG_FILES = treelang/treelang. + $(gcc_docdir)/include/funding.texi \ + gcc-vers.texi + +-doc/treelang.info: $(TEXI_TREELANG_FILES) +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir)/include -o $@ $< ++doc/$(INFO_TREELANG_NAME).info: $(TEXI_TREELANG_FILES) ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(TREELANG_MAKEINFODEFS) -I $(gcc_docdir)/include -o $@ $< + + doc/treelang.dvi: $(TEXI_TREELANG_FILES) + $(TEXI2DVI) -I $(abs_docdir)/include -o $@ $< +@@ -210,7 +213,7 @@ treelang.install.common.done: installdi + $(STAMP) treelang.install.common.done + + # We might not be able to build the info files +-treelang.install-info: $(DESTDIR)$(infodir)/treelang.info ++treelang.install-info: $(DESTDIR)$(infodir)/$(INFO_TREELANG_NAME).info + + treelang.install-pdf: $(TREELANG_PDFFILES) + @$(NORMAL_INSTALL) +@@ -233,6 +236,7 @@ treelang.uninstall: + echo -rm -rf $(DESTDIR)$(bindir)/$$name2$(exeext); \ + rm -rf $(DESTDIR)$(bindir)/$$name2$(exeext); \ + done ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_TREELANG_NAME).info* + -rm treelang.install.common.done + + # +Index: gcc/treelang/treelang.texi +=================================================================== +--- gcc/treelang/treelang.texi.orig 2007-10-29 14:33:20.000000000 +0100 ++++ gcc/treelang/treelang.texi 2008-02-08 16:27:44.000000000 +0100 +@@ -107,7 +107,7 @@ texts being (a) (see below), and with th + @ifnottex + @dircategory Software development + @direntry +-* treelang: (treelang). The GNU Treelang compiler. ++* @value{fntreelang}: (@value{fntreelang}). The GNU Treelang compiler. + @end direntry + @ifset INTERNALS + @ifset USING +@@ -260,7 +260,7 @@ James A. Morrison. + @item + The packaging and compiler portions of GNU Treelang are based largely + on the GCC compiler. +-@xref{Contributors,,Contributors to GCC,GCC,Using and Maintaining GCC}, ++@xref{Contributors,,Contributors to GCC,@value{fngcc},Using and Maintaining GCC}, + for more information. + + @item +@@ -880,7 +880,7 @@ files and accepts Treelang-specific comm + command-line options that are designed to cater to Treelang users + but apply to other languages as well. + +-@xref{G++ and GCC,,Programming Languages Supported by GCC,GCC,Using ++@xref{G++ and GCC,,Programming Languages Supported by GCC,@value{fngcc},Using + the GNU Compiler Collection (GCC)}, + for information on the way different languages are handled + by the GCC compiler (@code{gcc}). +Index: gcc/Makefile.in +=================================================================== +--- gcc/Makefile.in.orig 2008-02-08 16:27:44.000000000 +0100 ++++ gcc/Makefile.in 2008-02-08 17:18:23.000000000 +0100 +@@ -3617,8 +3617,27 @@ stmp-install-fixproto: fixproto + + doc: $(BUILD_INFO) $(GENERATED_MANPAGES) gccbug + +-INFOFILES = doc/cpp.info doc/gcc.info doc/gccint.info \ +- doc/gccinstall.info doc/cppinternals.info ++INFO_CPP_NAME = $(shell echo cpp|sed '$(program_transform_name)') ++INFO_GCC_NAME = $(shell echo gcc|sed '$(program_transform_name)') ++INFO_GXX_NAME = $(shell echo g++|sed '$(program_transform_name)') ++INFO_GCCINT_NAME = $(shell echo gccint|sed '$(program_transform_name)') ++INFO_GCCINSTALL_NAME = $(shell echo gccinstall|sed '$(program_transform_name)') ++INFO_CPPINT_NAME = $(shell echo cppinternals|sed '$(program_transform_name)') ++ ++INFO_FORTRAN_NAME = $(shell echo gfortran|sed '$(program_transform_name)') ++INFO_GCJ_NAME = $(shell echo gcj|sed '$(program_transform_name)') ++ ++INFOFILES = doc/$(INFO_CPP_NAME).info doc/$(INFO_GCC_NAME).info \ ++ doc/$(INFO_GCCINT_NAME).info \ ++ doc/$(INFO_GCCINSTALL_NAME).info doc/$(INFO_CPPINT_NAME).info ++ ++MAKEINFODEFS = -D 'fncpp $(INFO_CPP_NAME)' -D 'fngcc $(INFO_GCC_NAME)' \ ++ -D 'fngxx $(INFO_GXX_NAME)' \ ++ -D 'fngccint $(INFO_GCCINT_NAME)' \ ++ -D 'fngccinstall $(INFO_GCCINSTALL_NAME)' \ ++ -D 'fncppint $(INFO_CPPINT_NAME)' \ ++ -D 'fngfortran $(INFO_FORTRAN_NAME)' \ ++ -D 'fngcj $(INFO_GCJ_NAME)' + + info: $(INFOFILES) lang.info @GENINSRC@ srcinfo lang.srcinfo + +@@ -3668,21 +3687,41 @@ gcc-vers.texi: $(BASEVER) $(DEVPHASE) + # patterns. To use them, put each of the specific targets with its + # specific dependencies but no build commands. + +-doc/cpp.info: $(TEXI_CPP_FILES) +-doc/gcc.info: $(TEXI_GCC_FILES) +-doc/gccint.info: $(TEXI_GCCINT_FILES) +-doc/cppinternals.info: $(TEXI_CPPINT_FILES) +- ++# Generic entry to handle info files, which are not renamed (currently Ada) + doc/%.info: %.texi + if [ x$(BUILD_INFO) = xinfo ]; then \ + $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \ + -I $(gcc_docdir)/include -o $@ $<; \ + fi + ++doc/$(INFO_CPP_NAME).info: $(TEXI_CPP_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(gcc_docdir) \ ++ -I $(gcc_docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_GCC_NAME).info: $(TEXI_GCC_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(gcc_docdir) \ ++ -I $(gcc_docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_GCCINT_NAME).info: $(TEXI_GCCINT_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(gcc_docdir) \ ++ -I $(gcc_docdir)/include -o $@ $<; \ ++ fi ++ ++doc/$(INFO_CPPINT_NAME).info: $(TEXI_CPPINT_FILES) ++ if [ x$(BUILD_INFO) = xinfo ]; then \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(gcc_docdir) \ ++ -I $(gcc_docdir)/include -o $@ $<; \ ++ fi ++ + # Duplicate entry to handle renaming of gccinstall.info +-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES) ++doc/$(INFO_GCCINSTALL_NAME).info: $(TEXI_GCCINSTALL_FILES) + if [ x$(BUILD_INFO) = xinfo ]; then \ +- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \ ++ $(MAKEINFO) $(MAKEINFOFLAGS) $(MAKEINFODEFS) -I $(gcc_docdir) \ + -I $(gcc_docdir)/include -o $@ $<; \ + fi + +@@ -3990,11 +4029,11 @@ install-driver: installdirs xgcc$(exeext + # $(INSTALL_DATA) might be a relative pathname, so we can't cd into srcdir + # to do the install. + install-info:: doc installdirs \ +- $(DESTDIR)$(infodir)/cpp.info \ +- $(DESTDIR)$(infodir)/gcc.info \ +- $(DESTDIR)$(infodir)/cppinternals.info \ +- $(DESTDIR)$(infodir)/gccinstall.info \ +- $(DESTDIR)$(infodir)/gccint.info \ ++ $(DESTDIR)$(infodir)/$(INFO_CPP_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCC_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_CPPINT_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCCINSTALL_NAME).info \ ++ $(DESTDIR)$(infodir)/$(INFO_GCCINT_NAME).info \ + lang.install-info + + $(DESTDIR)$(infodir)/%.info: doc/%.info installdirs +@@ -4195,8 +4234,11 @@ uninstall: lang.uninstall + -rm -rf $(DESTDIR)$(man1dir)/cpp$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/protoize$(man1ext) + -rm -rf $(DESTDIR)$(man1dir)/unprotoize$(man1ext) +- -rm -f $(DESTDIR)$(infodir)/cpp.info* $(DESTDIR)$(infodir)/gcc.info* +- -rm -f $(DESTDIR)$(infodir)/cppinternals.info* $(DESTDIR)$(infodir)/gccint.info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_CPP_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCC_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_CPPINT_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCCINT_NAME).info* ++ -rm -f $(DESTDIR)$(infodir)/$(INFO_GCCINSTALL_NAME).info* + # + # These targets are for the dejagnu testsuites. The file site.exp + # contains global variables that all the testsuites will use. +Index: gcc/doc/install.texi +=================================================================== +--- gcc/doc/install.texi.orig 2008-01-30 11:21:55.000000000 +0100 ++++ gcc/doc/install.texi 2008-02-08 16:29:13.000000000 +0100 +@@ -96,7 +96,7 @@ Free Documentation License}''. + @end ifinfo + @dircategory Software development + @direntry +-* gccinstall: (gccinstall). Installing the GNU Compiler Collection. ++* @value{fngccinstall}: (@value{fngccinstall}). Installing the GNU Compiler Collection. + @end direntry + + @c Part 3 Titlepage and Copyright +Index: gcc/ada/gnat-style.texi +=================================================================== +--- gcc/ada/gnat-style.texi.orig 2007-10-29 12:59:35.000000000 +0100 ++++ gcc/ada/gnat-style.texi 2008-02-08 17:15:59.000000000 +0100 +@@ -31,7 +31,7 @@ + + @dircategory Software development + @direntry +-* gnat-style: (gnat-style). GNAT Coding Style ++* gnat-style: (gnat-style-4.3). GNAT Coding Style + @end direntry + + @macro syntax{element} +Index: gcc/ada/gnat_rm.texi +=================================================================== +--- gcc/ada/gnat_rm.texi.orig 2008-01-02 11:19:07.000000000 +0100 ++++ gcc/ada/gnat_rm.texi 2008-02-08 17:15:12.000000000 +0100 +@@ -30,7 +30,7 @@ + + @dircategory GNU Ada tools + @direntry +-* GNAT Reference Manual: (gnat_rm). Reference Manual for GNU Ada tools. ++* GNAT Reference Manual: (gnat_rm-4.3). Reference Manual for GNU Ada tools. + @end direntry + + @copying +Index: gcc/ada/gnat_ugn.texi +=================================================================== +--- gcc/ada/gnat_ugn.texi.orig 2008-01-02 11:19:08.000000000 +0100 ++++ gcc/ada/gnat_ugn.texi 2008-02-08 17:15:37.000000000 +0100 +@@ -96,7 +96,7 @@ + + @ifset unw + @set PLATFORM +-@set FILE gnat_ugn_unw ++@set FILE gnat_ugn_unw-4.3 + @end ifset + + @ifset vms diff --git a/recipes/gcc/gcc-svn/debian/s390-biarch.dpatch b/recipes/gcc/gcc-svn/debian/s390-biarch.dpatch new file mode 100644 index 0000000000..392185f9bf --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/s390-biarch.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e + +# DP: enable biarch for 31 bit compiler + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- gcc/config.gcc~ 2006-06-02 01:59:42.000000000 +0200 ++++ gcc/config.gcc 2006-06-04 18:20:56.272554984 +0200 +@@ -1884,7 +1884,7 @@ + ;; + s390-*-linux*) + tm_file="s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h" +- tmake_file="${tmake_file} t-dfprules s390/t-crtstuff s390/t-linux" ++ tmake_file="${tmake_file} t-dfprules s390/t-crtstuff s390/t-linux s390/t-linux64" + ;; + s390x-*-linux*) + tm_file="s390/s390x.h s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h" diff --git a/recipes/gcc/gcc-svn/debian/sparc-biarch.dpatch b/recipes/gcc/gcc-svn/debian/sparc-biarch.dpatch new file mode 100644 index 0000000000..bf7a1370c2 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/sparc-biarch.dpatch @@ -0,0 +1,80 @@ +#! /bin/sh -e +# 10_newpatch.dpatch by +# updated for 4.0, 4.1, 4.2 by Matthias Klose +# +# DP: Enable biarch support for the 32bit sparc compiler + +if [ $# -eq 3 ] && [ "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + cd ${dir}libcpp && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + cd ${dir}libcpp && autoconf + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +--- gcc/config/sparc/linux64.h.orig 2006-06-04 13:09:21.857528428 -0300 ++++ gcc/config/sparc/linux64.h 2006-06-04 13:11:15.385012057 -0300 +@@ -54,8 +54,8 @@ + + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) + #endif + +-#undef ASM_CPU_DEFAULT_SPEC +-#define ASM_CPU_DEFAULT_SPEC "-Av9a" ++#undef ASM_CPU64_DEFAULT_SPEC ++#define ASM_CPU64_DEFAULT_SPEC "-Av9a" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +--- gcc/config.gcc.orig 2006-06-04 13:09:21.882530957 -0300 ++++ gcc/config.gcc 2006-06-04 13:14:13.577036688 -0300 +@@ -315,6 +315,7 @@ + ;; + sparc*-*-*) + cpu_type=sparc ++ need_64bit_hwint=yes + ;; + s390*-*-*) + cpu_type=s390 +@@ -2105,9 +2106,16 @@ + use_fixproto=yes + ;; + sparc-*-linux*) # SPARC's running GNU/Linux, libc6 ++ # If cpu is specified, assume we want a 32/64 compiler ++ if test x$with_cpu = x; then + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + tmake_file="${tmake_file} sparc/t-linux sparc/t-crtfm" ++ else ++ tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux64.h" ++ extra_options="${extra_options} sparc/long-double-switch.opt" ++ tmake_file="${tmake_file} sparc/t-linux sparc/t-linux64 sparc/t-crtfm" ++ fi + ;; + sparc-*-rtems*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h" +--- libcpp/configure.ac~ 2006-01-18 22:52:36.862072128 +0100 ++++ libcpp/configure.ac 2006-08-15 14:48:00.484137064 +0200 +@@ -124,7 +124,7 @@ + powerpc*-*-* | \ + rs6000*-*-* | \ + s390*-*-* | \ +- sparc64*-*-* | ultrasparc-*-freebsd* | \ ++ sparc*-*-* | ultrasparc-*-freebsd* | \ + sparcv9-*-solaris2* | \ + sparc-*-solaris2.[789] | sparc-*-solaris2.1[0-9]* | \ + sh[123456789l]*-*-*) diff --git a/recipes/gcc/gcc-svn/debian/svn-class-updates.dpatch b/recipes/gcc/gcc-svn/debian/svn-class-updates.dpatch new file mode 100644 index 0000000000..14274d86cf --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/svn-class-updates.dpatch @@ -0,0 +1,55 @@ +#! /bin/sh -e + +# DP: updated class files from the 4.2 branch upto 20070804. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + set -x + uudecode class-files.tar.bz2.uue + tar -xv -f class-files.tar.bz2 -C $dir + rm -f class-files.tar.bz2 + ;; + -unpatch) + echo "cannot undo patch $(basename $0)" + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +#! /bin/sh + +dir=gcc-4_2-ubuntu-branch +tag=ubuntu/gcc-4_2_1-release +branch=ubuntu/gcc-4_2-branch + +tmplist=files$$ + +svn diff --summarize \ + svn://gcc.gnu.org/svn/gcc/tags/$tag \ + svn://gcc.gnu.org/svn/gcc/branches/$branch \ + | grep '\.class$' > $tmplist + +sed -n '/^[AM].*\.class$/s,.*/'$tag'/\(.*\),\1,p' $tmplist \ + > neworchanged.list +sed -n '/^[D].*\.class$/s,.*/'$tag'/\(.*\),\1,p' $tmplist \ + > removed.list +sed -n '/^[^ADM].*\.class$/s,.*/'$tag'/\(.*\),\1,p' $tmplist \ + > unknown.list + +echo "new or changed: $(wc -l neworchanged.list | cut '-d ' -f1), removed $(wc -l removed.list | cut '-d ' -f1): , unknown: $(wc -l unknown.list | cut '-d ' -f1)" +tar -c -j -f class-files.tar.bz2 -C $dir -T neworchanged.list +uuencode class-files.tar.bz2 class-files.tar.bz2 > class-files.tar.bz2.uue + +rm -f $tmplist neworchanged.list removed.list unknown.list + diff --git a/recipes/gcc/gcc-svn/debian/svn-doc-updates.dpatch b/recipes/gcc/gcc-svn/debian/svn-doc-updates.dpatch new file mode 100644 index 0000000000..d4fa85a556 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/svn-doc-updates.dpatch @@ -0,0 +1,79 @@ +#! /bin/sh -e + +# DP: updates from the 4.3 branch upto 20080321 (documentation). + +last_updated() +{ + cat > ${dir}LAST_UPDATED <&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + last_updated + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_3_0_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch \ +# | awk '/^Index:.*\.class/ {skip=1; next} /^Index:/ { skip=0 } skip==0' + +Index: gcc/doc/extend.texi +=================================================================== +--- gcc/doc/extend.texi (.../tags/gcc_4_3_0_release) (revision 133434) ++++ gcc/doc/extend.texi (.../branches/gcc-4_3-branch) (revision 133434) +@@ -3380,7 +3380,8 @@ + + Some machines never actually require alignment; they allow reference to any + data type even at an odd address. For these machines, @code{__alignof__} +-reports the @emph{recommended} alignment of a type. ++reports the smallest alignment that GCC will give the data type, usually as ++mandated by the target ABI. + + If the operand of @code{__alignof__} is an lvalue rather than a type, + its value is the required alignment for its type, taking into account +Index: gcc/doc/invoke.texi +=================================================================== +--- gcc/doc/invoke.texi (.../tags/gcc_4_3_0_release) (revision 133434) ++++ gcc/doc/invoke.texi (.../branches/gcc-4_3-branch) (revision 133434) +@@ -5208,8 +5208,9 @@ + @opindex O3 + Optimize yet more. @option{-O3} turns on all optimizations specified by + @option{-O2} and also turns on the @option{-finline-functions}, +-@option{-funswitch-loops}, @option{-fpredictive-commoning} and +-@option{-fgcse-after-reload} options. ++@option{-funswitch-loops}, @option{-fpredictive-commoning}, ++@option{-fgcse-after-reload} and @option{-ftree-vectorize} ++options. + + @item -O0 + @opindex O0 +@@ -5973,7 +5974,8 @@ + + @item -ftree-vectorize + @opindex ftree-vectorize +-Perform loop vectorization on trees. ++Perform loop vectorization on trees. This flag is enabled by default at ++@option{-O3}. + + @item -ftree-vect-loop-version + @opindex ftree-vect-loop-version diff --git a/recipes/gcc/gcc-svn/debian/svn-gdc-updates.dpatch b/recipes/gcc/gcc-svn/debian/svn-gdc-updates.dpatch new file mode 100644 index 0000000000..728209e51d --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/svn-gdc-updates.dpatch @@ -0,0 +1,137 @@ +#! /bin/sh -e + +# svn-gdc-updates.dpatch by Arthur Loiret +# DP: SVN updates from the gdc branch up to 20070831. + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + + +diff -ruN gcc/d/ChangeLog gcc/d/ChangeLog +--- gcc/d/ChangeLog 2007-08-26 22:34:22.000000000 +0200 ++++ gcc/d/ChangeLog 2007-09-02 19:33:43.000000000 +0200 +@@ -1,3 +1,20 @@ ++2007-08-31 David Friedman ++ ++ * d-objfile.cc (outdata): Do not set TREE_CONSTANT on initializers ++ (Bugzilla 1453) ++ ++2007-08-29 David Friedman ++ ++ * d-decls.cc (uniqueName): Allow multiple static declaration with ++ the same name if in a function. (SF 1783085) ++ ++2007-08-28 David Friedman ++ ++ * d-codegen.cc (call): Use CommaExp correctly. (Bugzilla 1443) ++ ++ * dmd/todt.c (createTsarrayDt): Don't take quadratic time to build ++ the initializer. (Bugzilla 1440) ++ + 2007-08-22 David Friedman + + Release GDC 0.24 +diff -ruN gcc/d/d-codegen.cc gcc/d/d-codegen.cc +--- gcc/d/d-codegen.cc 2007-08-26 22:34:22.000000000 +0200 ++++ gcc/d/d-codegen.cc 2007-09-02 19:33:43.000000000 +0200 +@@ -780,10 +780,12 @@ + if (expr->op == TOKcomma) + { + CommaExp * ce = (CommaExp *) expr; ++ expr = ce->e2; ++ + VarExp * ve; +- expr = ce->e1; +- gcc_assert( ce->e2->op == TOKvar && +- ((VarExp *) ce->e2)->var->isFuncDeclaration() ); ++ gcc_assert( ce->e2->op == TOKvar ); ++ ve = (VarExp *) ce->e2; ++ gcc_assert(ve->var->isFuncDeclaration() && ! ve->var->needThis()); + } + + Type* t = expr->type->toBasetype(); +diff -ruN gcc/d/d-decls.cc gcc/d/d-decls.cc +--- gcc/d/d-decls.cc 2007-08-26 22:34:22.000000000 +0200 ++++ gcc/d/d-decls.cc 2007-09-02 19:33:43.000000000 +0200 +@@ -137,10 +137,17 @@ + FuncDeclaration * f = d->isFuncDeclaration(); + VarDeclaration * v = d->isVarDeclaration(); + +- if (d->protection == PROTprivate && +- !(f && ! f->fbody) && ++ /* Check cases for which it is okay to have a duplicate symbol name. ++ Otherwise, duplicate names are an error and the condition will ++ be caught by the assembler. */ ++ if (!(f && ! f->fbody) && + !(v && (v->storage_class & STCextern)) && +- (!p || p->isModule())) ++ ( ++ // Static declarations in different scope statements ++ (p && p->isFuncDeclaration()) || ++ ++ // Top-level duplicate names are okay if private. ++ ((!p || p->isModule()) && d->protection == PROTprivate) )) + { + StringValue * sv; + +diff -ruN gcc/d/dmd/todt.c gcc/d/dmd/todt.c +--- gcc/d/dmd/todt.c 2007-08-26 22:34:22.000000000 +0200 ++++ gcc/d/dmd/todt.c 2007-09-02 19:33:43.000000000 +0200 +@@ -73,17 +73,18 @@ + + target_size_t dim = tsa->dim->toInteger(); + dt_t * adt = NULL; ++ dt_t ** padt = & adt; + + if (eoa_size * dim == eoa_size) + { + for (target_size_t i = 0; i < dim; i++) +- dtcontainer(& adt, NULL, elem_or_all); ++ padt = dtcontainer(padt, NULL, elem_or_all); + } + else + { + assert(tsa->size(0) % eoa_size == 0); + for (target_size_t i = 0; i < dim; i++) +- dtcontainer(& adt, NULL, ++ padt = dtcontainer(padt, NULL, + createTsarrayDt(elem_or_all, tsa->next)); + } + dt_t * fdt = NULL; +diff -ruN gcc/d/d-objfile.cc gcc/d/d-objfile.cc +--- gcc/d/d-objfile.cc 2007-08-26 22:34:22.000000000 +0200 ++++ gcc/d/d-objfile.cc 2007-09-02 19:33:43.000000000 +0200 +@@ -954,11 +954,8 @@ + + assert( t ); + +- if (sym->Sdt && DECL_INITIAL( t ) == NULL_TREE) { +- tree ini = dt2tree( sym->Sdt ); +- TREE_CONSTANT( ini ) = TREE_CONSTANT( t ); +- DECL_INITIAL( t ) = ini; +- } ++ if (sym->Sdt && DECL_INITIAL( t ) == NULL_TREE) ++ DECL_INITIAL( t ) = dt2tree( sym->Sdt ); + + if (! g.ofile->shouldEmit(sym)) + return; diff --git a/recipes/gcc/gcc-svn/debian/svn-updates.dpatch b/recipes/gcc/gcc-svn/debian/svn-updates.dpatch new file mode 100644 index 0000000000..480eeaeba4 --- /dev/null +++ b/recipes/gcc/gcc-svn/debian/svn-updates.dpatch @@ -0,0 +1,569584 @@ +#! /bin/sh -e + +# DP: updates from the 4.3 branch upto 20080401. + +last_updated() +{ + cat > ${dir}LAST_UPDATED <&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + last_updated + #cd ${dir}gcc && autoconf + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + #rm ${dir}gcc/configure + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_3_0_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch \ +# | awk '/^Index:.*\.class/ {skip=1; next} /^Index:/ { skip=0 } skip==0' + +Index: libgomp/iter.c +=================================================================== +--- libgomp/iter.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ libgomp/iter.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -242,17 +242,17 @@ + if (ws->next == ws->end) + return false; + +- n = (ws->end - ws->next) / ws->incr; ++ start = ws->next; ++ n = (ws->end - start) / ws->incr; + q = (n + nthreads - 1) / nthreads; + + if (q < ws->chunk_size) + q = ws->chunk_size; +- if (q > n) +- q = n; ++ if (q <= n) ++ end = start + q * ws->incr; ++ else ++ end = ws->end; + +- start = ws->next; +- end = start + q * ws->incr; +- + ws->next = end; + *pstart = start; + *pend = end; +@@ -286,16 +286,16 @@ + if (start == end) + return false; + +- n = (end - start) / ws->incr; ++ n = (end - start) / incr; + q = (n + nthreads - 1) / nthreads; + + if (q < chunk_size) + q = chunk_size; +- if (q > n) +- q = n; ++ if (__builtin_expect (q <= n, 1)) ++ nend = start + q * incr; ++ else ++ nend = end; + +- nend = start + q * incr; +- + tmp = __sync_val_compare_and_swap (&ws->next, start, nend); + if (__builtin_expect (tmp == start, 1)) + break; +Index: libgomp/ChangeLog +=================================================================== +--- libgomp/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ libgomp/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,27 @@ ++2008-03-18 Jakub Jelinek ++ ++ PR middle-end/35611 ++ * testsuite/libgomp.c/atomic-4.c: New test. ++ ++ PR libgomp/35625 ++ * iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end. ++ (gomp_iter_guided_next): Likewise. ++ * testsuite/libgomp.c/pr35625.c: New test. ++ ++2008-03-13 Jakub Jelinek ++ ++ PR middle-end/35185 ++ * testsuite/libgomp.c++/pr35185.C: New test. ++ ++2008-03-12 Jakub Jelinek ++ ++ PR middle-end/35549 ++ * testsuite/libgomp.c/pr35549.c: New test. ++ ++2008-03-06 Jakub Jelinek ++ ++ * testsuite/libgomp.c/atomic-3.c: New test. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: libgomp/testsuite/libgomp.c++/pr35185.C +=================================================================== +--- libgomp/testsuite/libgomp.c++/pr35185.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ libgomp/testsuite/libgomp.c++/pr35185.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,33 @@ ++// PR middle-end/35185 ++// { dg-do run } ++ ++extern "C" void abort (); ++ ++struct S ++{ ++ S () : s (6) {} ++ ~S () {} ++ int s; ++}; ++ ++__attribute__((noinline)) ++bool ++bar (S s) ++{ ++ return s.s != 6; ++} ++ ++int ++main () ++{ ++ S s; ++ int err = 0; ++#pragma omp parallel shared (s) ++ { ++ if (bar (s)) ++ #pragma omp atomic ++ err++; ++ } ++ if (err) ++ abort (); ++} +Index: libgomp/testsuite/libgomp.c/pr35549.c +=================================================================== +--- libgomp/testsuite/libgomp.c/pr35549.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ libgomp/testsuite/libgomp.c/pr35549.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,30 @@ ++/* PR middle-end/35549 */ ++/* { dg-do run } */ ++ ++#include ++#include ++ ++int ++main (void) ++{ ++ int i = 6, n = 0; ++ omp_set_dynamic (0); ++ omp_set_nested (1); ++ #pragma omp parallel shared (i) num_threads (3) ++ { ++ if (omp_get_num_threads () != 3) ++ #pragma omp atomic ++ n += 1; ++ #pragma omp parallel shared (i) num_threads (4) ++ { ++ if (omp_get_num_threads () != 4) ++ #pragma omp atomic ++ n += 1; ++ #pragma omp critical ++ i += 1; ++ } ++ } ++ if (n == 0 && i != 6 + 3 * 4) ++ abort (); ++ return 0; ++} +Index: libgomp/testsuite/libgomp.c/atomic-4.c +=================================================================== +--- libgomp/testsuite/libgomp.c/atomic-4.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ libgomp/testsuite/libgomp.c/atomic-4.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++/* PR middle-end/35611 */ ++/* { dg-options "-O2" } */ ++ ++extern void abort (void); ++ ++int ++main (void) ++{ ++ long double d = .0L; ++ int i; ++ #pragma omp parallel for shared (d) ++ for (i = 0; i < 1000; i++) ++ #pragma omp atomic ++ d += 1.0L; ++ if (d != 1000.0L) ++ abort (); ++ return 0; ++} +Index: libgomp/testsuite/libgomp.c/pr35625.c +=================================================================== +--- libgomp/testsuite/libgomp.c/pr35625.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ libgomp/testsuite/libgomp.c/pr35625.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++/* PR libgomp/35625 */ ++/* { dg-do run } */ ++/* { dg-options "-std=c99" } */ ++ ++int ++main (void) ++{ ++#pragma omp parallel ++ { ++ #pragma omp for schedule (guided, 10) ++ for (int i = 0; i < 1826; i += 10) ++ ; ++ #pragma omp for schedule (guided, 10) ++ for (int i = 0; i > -1826; i -= 10) ++ ; ++ } ++ return 0; ++} +Index: libgomp/testsuite/libgomp.c/atomic-3.c +=================================================================== +--- libgomp/testsuite/libgomp.c/atomic-3.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ libgomp/testsuite/libgomp.c/atomic-3.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,50 @@ ++/* { dg-do run } */ ++/* { dg-options "-fopenmp -O0" } */ ++ ++#include ++#include ++ ++short e[64]; ++int g; ++_Complex double d, f; ++int num_threads; ++ ++__attribute__((noinline)) void ++foo (int x, long long y) ++{ ++#pragma omp parallel num_threads (4) ++ { ++ int i; ++ #pragma omp barrier ++ for (i = 0; i < 2400; i++) ++ { ++ if (i == 0) ++ num_threads = omp_get_num_threads (); ++ #pragma omp atomic ++ e[0] += x; ++ #pragma omp atomic ++ e[16] += x; ++ #pragma omp atomic ++ g += y; ++ #pragma omp atomic ++ __real__ d += x; ++ #pragma omp atomic ++ __imag__ f += x; ++ } ++ } ++} ++ ++int ++main (void) ++{ ++ int i; ++ foo (3, 3LL); ++ if (g != 3 * 2400 * num_threads ++ || __real__ d != g || __imag__ d != 0 ++ || __real__ f != 0 || __imag__ f != g) ++ abort (); ++ for (i = 0; i < 64; i++) ++ if (e[i] != ((i && i != 16) ? 0 : g)) ++ abort (); ++ return 0; ++} +Index: gcc/doc/include/texinfo.tex +=================================================================== +--- gcc/doc/include/texinfo.tex (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/doc/include/texinfo.tex (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,7 +3,7 @@ + % Load plain if necessary, i.e., if running under initex. + \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi + % +-\def\texinfoversion{2008-02-04.16} ++\def\texinfoversion{2008-03-07.10} + % + % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, + % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +@@ -917,16 +917,21 @@ + \temp + } + +-% @include file insert text of that file as input. ++% @include FILE -- \input text of FILE. + % + \def\include{\parseargusing\filenamecatcodes\includezzz} + \def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% +- \makevalueexpandable +- \input #1 +- }% ++ \makevalueexpandable % we want to expand any @value in FILE. ++ \turnoffactive % and allow special characters in the expansion ++ \edef\temp{\noexpand\input #1 }% ++ % ++ % This trickery is to read FILE outside of a group, in case it makes ++ % definitions, etc. ++ \expandafter ++ }\temp + \popthisfilestack + } + \def\filenamecatcodes{% +@@ -5725,7 +5730,7 @@ + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext +- \expandafter \let\csname top \endcsname=\ptextop % outer ++ \expandafter \let\csname top\endcsname=\ptextop % outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% +Index: gcc/java/jcf-parse.c +=================================================================== +--- gcc/java/jcf-parse.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/java/jcf-parse.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1208,7 +1208,7 @@ + #ifdef USE_MAPPED_LOCATION + { + tree source_name = identifier_subst (class_name, "", '.', '/', ".java"); +- const char *sfname = IDENTIFIER_POINTER (source_name); ++ const char *sfname = find_sourcefile (IDENTIFIER_POINTER (source_name)); + linemap_add (line_table, LC_ENTER, false, sfname, 0); + input_location = linemap_line_start (line_table, 0, 1); + file_start_location = input_location; +Index: gcc/java/Make-lang.in +=================================================================== +--- gcc/java/Make-lang.in (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/java/Make-lang.in (.../branches/gcc-4_3-branch) (revision 133808) +@@ -311,7 +311,7 @@ + $(srcdir)/java/jcf-path.c $(OUTPUT_OPTION) + + TEXI_JAVA_FILES = java/gcj.texi $(gcc_docdir)/include/fdl.texi \ +- $(gcc_docdir)/include/gpl.texi $(gcc_docdir)/include/gcc-common.texi \ ++ $(gcc_docdir)/include/gpl_v3.texi $(gcc_docdir)/include/gcc-common.texi \ + gcc-vers.texi + + # Documentation +Index: gcc/java/ChangeLog +=================================================================== +--- gcc/java/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/java/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,14 @@ ++2008-04-01 Joseph Myers ++ ++ * gcj.texi: Include gpl_v3.texi instead of gpl.texi ++ * Make-lang.in (TEXI_JAVA_FILES): Include gpl_v3.texi instead of ++ gpl.texi. ++ ++2008-03-06 Andrew Haley ++ ++ * jcf-parse.c (give_name_to_class): Call find_sourcefile to find ++ full pathname of source file. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: gcc/DATESTAMP +=================================================================== +--- gcc/DATESTAMP (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/DATESTAMP (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1 +1 @@ +-20080305 ++20080401 +Index: gcc/tree.c +=================================================================== +--- gcc/tree.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/tree.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -4067,6 +4067,16 @@ + return NULL_TREE; + } + ++ if (TREE_CODE (node) == TYPE_DECL ++ && TREE_CODE (TREE_TYPE (node)) != RECORD_TYPE ++ && TREE_CODE (TREE_TYPE (node)) != UNION_TYPE) ++ { ++ *no_add_attrs = true; ++ warning (OPT_Wattributes, "%qs attribute ignored", ++ IDENTIFIER_POINTER (name)); ++ return NULL_TREE; ++ } ++ + /* Report error on dllimport ambiguities seen now before they cause + any damage. */ + else if (is_attribute_p ("dllimport", name)) +Index: gcc/fold-const.c +=================================================================== +--- gcc/fold-const.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fold-const.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -5066,9 +5066,10 @@ + + Note that all these transformations are correct if A is + NaN, since the two alternatives (A and -A) are also NaNs. */ +- if ((FLOAT_TYPE_P (TREE_TYPE (arg01)) +- ? real_zerop (arg01) +- : integer_zerop (arg01)) ++ if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) ++ && (FLOAT_TYPE_P (TREE_TYPE (arg01)) ++ ? real_zerop (arg01) ++ : integer_zerop (arg01)) + && ((TREE_CODE (arg2) == NEGATE_EXPR + && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0)) + /* In the case that A is of the form X-Y, '-A' (arg2) may +@@ -5121,7 +5122,8 @@ + both transformations are correct when A is NaN: A != 0 + is then true, and A == 0 is false. */ + +- if (integer_zerop (arg01) && integer_zerop (arg2)) ++ if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) ++ && integer_zerop (arg01) && integer_zerop (arg2)) + { + if (comp_code == NE_EXPR) + return pedantic_non_lvalue (fold_convert (type, arg1)); +@@ -5155,7 +5157,8 @@ + a number and A is not. The conditions in the original + expressions will be false, so all four give B. The min() + and max() versions would give a NaN instead. */ +- if (operand_equal_for_comparison_p (arg01, arg2, arg00) ++ if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) ++ && operand_equal_for_comparison_p (arg01, arg2, arg00) + /* Avoid these transformations if the COND_EXPR may be used + as an lvalue in the C++ front-end. PR c++/19199. */ + && (in_gimple_form +@@ -9357,7 +9360,7 @@ + } + } + +- if (DECL_P (expr)) ++ if (DECL_P (expr) && TREE_CODE (expr) != FUNCTION_DECL) + return DECL_ALIGN_UNIT (expr); + } + else if (code == POINTER_PLUS_EXPR) +Index: gcc/omp-low.c +=================================================================== +--- gcc/omp-low.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/omp-low.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -456,7 +456,7 @@ + } + + static inline tree +-maybe_lookup_decl (tree var, omp_context *ctx) ++maybe_lookup_decl (const_tree var, omp_context *ctx) + { + tree *n; + n = (tree *) pointer_map_contains (ctx->cb.decl_map, var); +@@ -479,18 +479,18 @@ + return n ? (tree) n->value : NULL_TREE; + } + +-/* Return true if DECL should be copied by pointer. SHARED_P is true +- if DECL is to be shared. */ ++/* Return true if DECL should be copied by pointer. SHARED_CTX is ++ the parallel context if DECL is to be shared. */ + + static bool +-use_pointer_for_field (const_tree decl, bool shared_p) ++use_pointer_for_field (const_tree decl, omp_context *shared_ctx) + { + if (AGGREGATE_TYPE_P (TREE_TYPE (decl))) + return true; + + /* We can only use copy-in/copy-out semantics for shared variables + when we know the value is not accessible from an outer scope. */ +- if (shared_p) ++ if (shared_ctx) + { + /* ??? Trivially accessible from anywhere. But why would we even + be passing an address in this case? Should we simply assert +@@ -510,6 +510,34 @@ + address taken. */ + if (TREE_ADDRESSABLE (decl)) + return true; ++ ++ /* Disallow copy-in/out in nested parallel if ++ decl is shared in outer parallel, otherwise ++ each thread could store the shared variable ++ in its own copy-in location, making the ++ variable no longer really shared. */ ++ if (!TREE_READONLY (decl) && shared_ctx->is_nested) ++ { ++ omp_context *up; ++ ++ for (up = shared_ctx->outer; up; up = up->outer) ++ if (maybe_lookup_decl (decl, up)) ++ break; ++ ++ if (up && is_parallel_ctx (up)) ++ { ++ tree c; ++ ++ for (c = OMP_PARALLEL_CLAUSES (up->stmt); ++ c; c = OMP_CLAUSE_CHAIN (c)) ++ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED ++ && OMP_CLAUSE_DECL (c) == decl) ++ break; ++ ++ if (c) ++ return true; ++ } ++ } + } + + return false; +@@ -596,7 +624,7 @@ + } + else if (is_parallel_ctx (ctx)) + { +- bool by_ref = use_pointer_for_field (var, false); ++ bool by_ref = use_pointer_for_field (var, NULL); + x = build_receiver_ref (var, by_ref, ctx); + } + else if (ctx->outer) +@@ -966,7 +994,7 @@ + gcc_assert (is_parallel_ctx (ctx)); + decl = OMP_CLAUSE_DECL (c); + gcc_assert (!is_variable_sized (decl)); +- by_ref = use_pointer_for_field (decl, true); ++ by_ref = use_pointer_for_field (decl, ctx); + /* Global variables don't need to be copied, + the receiver side will use them directly. */ + if (is_global_var (maybe_lookup_decl_in_outer_ctx (decl, ctx))) +@@ -1001,7 +1029,7 @@ + && ! is_global_var (maybe_lookup_decl_in_outer_ctx (decl, + ctx))) + { +- by_ref = use_pointer_for_field (decl, false); ++ by_ref = use_pointer_for_field (decl, NULL); + install_var_field (decl, by_ref, ctx); + } + install_var_local (decl, ctx); +@@ -1014,7 +1042,7 @@ + + case OMP_CLAUSE_COPYIN: + decl = OMP_CLAUSE_DECL (c); +- by_ref = use_pointer_for_field (decl, false); ++ by_ref = use_pointer_for_field (decl, NULL); + install_var_field (decl, by_ref, ctx); + break; + +@@ -1751,7 +1779,7 @@ + /* Set up the DECL_VALUE_EXPR for shared variables now. This + needs to be delayed until after fixup_child_record_type so + that we get the correct type during the dereference. */ +- by_ref = use_pointer_for_field (var, true); ++ by_ref = use_pointer_for_field (var, ctx); + x = build_receiver_ref (var, by_ref, ctx); + SET_DECL_VALUE_EXPR (new_var, x); + DECL_HAS_VALUE_EXPR_P (new_var) = 1; +@@ -1794,7 +1822,7 @@ + break; + + case OMP_CLAUSE_COPYIN: +- by_ref = use_pointer_for_field (var, false); ++ by_ref = use_pointer_for_field (var, NULL); + x = build_receiver_ref (var, by_ref, ctx); + x = lang_hooks.decls.omp_clause_assign_op (c, new_var, x); + append_to_statement_list (x, ©in_seq); +@@ -2007,7 +2035,7 @@ + continue; + + var = OMP_CLAUSE_DECL (c); +- by_ref = use_pointer_for_field (var, false); ++ by_ref = use_pointer_for_field (var, NULL); + + ref = build_sender_ref (var, ctx); + x = lookup_decl_in_outer_ctx (var, ctx); +@@ -2059,7 +2087,7 @@ + continue; + if (is_variable_sized (val)) + continue; +- by_ref = use_pointer_for_field (val, false); ++ by_ref = use_pointer_for_field (val, NULL); + + switch (OMP_CLAUSE_CODE (c)) + { +@@ -2129,7 +2157,7 @@ + mapping for OVAR. */ + var = lookup_decl_in_outer_ctx (ovar, ctx); + +- if (use_pointer_for_field (ovar, true)) ++ if (use_pointer_for_field (ovar, ctx)) + { + x = build_sender_ref (ovar, ctx); + var = build_fold_addr_expr (var); +@@ -4852,184 +4880,177 @@ + pop_gimplify_context (NULL_TREE); + } + ++/* Callback for lower_omp_1. Return non-NULL if *tp needs to be ++ regimplified. */ + +-/* Pass *TP back through the gimplifier within the context determined by WI. +- This handles replacement of DECL_VALUE_EXPR, as well as adjusting the +- flags on ADDR_EXPR. */ +- +-static void +-lower_regimplify (tree *tp, struct walk_stmt_info *wi) ++static tree ++lower_omp_2 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) + { +- enum gimplify_status gs; +- tree pre = NULL; ++ tree t = *tp; + +- if (wi->is_lhs) +- gs = gimplify_expr (tp, &pre, NULL, is_gimple_lvalue, fb_lvalue); +- else if (wi->val_only) +- gs = gimplify_expr (tp, &pre, NULL, is_gimple_val, fb_rvalue); +- else +- gs = gimplify_expr (tp, &pre, NULL, is_gimple_formal_tmp_var, fb_rvalue); +- gcc_assert (gs == GS_ALL_DONE); ++ /* Any variable with DECL_VALUE_EXPR needs to be regimplified. */ ++ if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t)) ++ return t; + +- if (pre) +- tsi_link_before (&wi->tsi, pre, TSI_SAME_STMT); +-} ++ /* If a global variable has been privatized, TREE_CONSTANT on ++ ADDR_EXPR might be wrong. */ ++ if (TREE_CODE (t) == ADDR_EXPR) ++ recompute_tree_invariant_for_addr_expr (t); + +-/* Copy EXP into a temporary. Insert the initialization statement before TSI. */ +- +-static tree +-init_tmp_var (tree exp, tree_stmt_iterator *tsi) +-{ +- tree t, stmt; +- +- t = create_tmp_var (TREE_TYPE (exp), NULL); +- DECL_GIMPLE_REG_P (t) = 1; +- stmt = build_gimple_modify_stmt (t, exp); +- SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi))); +- tsi_link_before (tsi, stmt, TSI_SAME_STMT); +- +- return t; ++ *walk_subtrees = !TYPE_P (t) && !DECL_P (t); ++ return NULL_TREE; + } + +-/* Similarly, but copy from the temporary and insert the statement +- after the iterator. */ +- +-static tree +-save_tmp_var (tree exp, tree_stmt_iterator *tsi) ++static void ++lower_omp_1 (tree *tp, omp_context *ctx, tree_stmt_iterator *tsi) + { +- tree t, stmt; ++ tree t = *tp; + +- t = create_tmp_var (TREE_TYPE (exp), NULL); +- DECL_GIMPLE_REG_P (t) = 1; +- stmt = build_gimple_modify_stmt (exp, t); +- SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi))); +- tsi_link_after (tsi, stmt, TSI_SAME_STMT); ++ if (!t) ++ return; + +- return t; +-} ++ if (EXPR_HAS_LOCATION (t)) ++ input_location = EXPR_LOCATION (t); + +-/* Callback for walk_stmts. Lower the OpenMP directive pointed by TP. */ +- +-static tree +-lower_omp_1 (tree *tp, int *walk_subtrees, void *data) +-{ +- struct walk_stmt_info *wi = data; +- omp_context *ctx = wi->info; +- tree t = *tp; +- + /* If we have issued syntax errors, avoid doing any heavy lifting. + Just replace the OpenMP directives with a NOP to avoid + confusing RTL expansion. */ +- if (errorcount && OMP_DIRECTIVE_P (*tp)) ++ if (errorcount && OMP_DIRECTIVE_P (t)) + { + *tp = build_empty_stmt (); +- return NULL_TREE; ++ return; + } + +- *walk_subtrees = 0; +- switch (TREE_CODE (*tp)) ++ switch (TREE_CODE (t)) + { ++ case STATEMENT_LIST: ++ { ++ tree_stmt_iterator i; ++ for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) ++ lower_omp_1 (tsi_stmt_ptr (i), ctx, &i); ++ } ++ break; ++ ++ case COND_EXPR: ++ lower_omp_1 (&COND_EXPR_THEN (t), ctx, NULL); ++ lower_omp_1 (&COND_EXPR_ELSE (t), ctx, NULL); ++ if (ctx ++ && walk_tree (&COND_EXPR_COND (t), lower_omp_2, ctx, NULL)) ++ { ++ tree pre = NULL; ++ gimplify_expr (&COND_EXPR_COND (t), &pre, NULL, ++ is_gimple_condexpr, fb_rvalue); ++ if (pre) ++ { ++ if (tsi) ++ tsi_link_before (tsi, pre, TSI_SAME_STMT); ++ else ++ { ++ append_to_statement_list (t, &pre); ++ *tp = pre; ++ } ++ } ++ } ++ break; ++ case CATCH_EXPR: ++ lower_omp_1 (&CATCH_BODY (t), ctx, NULL); ++ break; ++ case EH_FILTER_EXPR: ++ lower_omp_1 (&EH_FILTER_FAILURE (t), ctx, NULL); ++ break; ++ case TRY_CATCH_EXPR: ++ case TRY_FINALLY_EXPR: ++ lower_omp_1 (&TREE_OPERAND (t, 0), ctx, NULL); ++ lower_omp_1 (&TREE_OPERAND (t, 1), ctx, NULL); ++ break; ++ case BIND_EXPR: ++ lower_omp_1 (&BIND_EXPR_BODY (t), ctx, NULL); ++ break; ++ case RETURN_EXPR: ++ lower_omp_1 (&TREE_OPERAND (t, 0), ctx, NULL); ++ break; ++ + case OMP_PARALLEL: + ctx = maybe_lookup_ctx (t); + lower_omp_parallel (tp, ctx); + break; +- + case OMP_FOR: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_for (tp, ctx); + break; +- + case OMP_SECTIONS: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_sections (tp, ctx); + break; +- + case OMP_SINGLE: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_single (tp, ctx); + break; +- + case OMP_MASTER: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_master (tp, ctx); + break; +- + case OMP_ORDERED: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_ordered (tp, ctx); + break; +- + case OMP_CRITICAL: + ctx = maybe_lookup_ctx (t); + gcc_assert (ctx); + lower_omp_critical (tp, ctx); + break; + +- case VAR_DECL: +- if (ctx && DECL_HAS_VALUE_EXPR_P (t)) ++ default: ++ if (ctx && walk_tree (tp, lower_omp_2, ctx, NULL)) + { +- lower_regimplify (&t, wi); +- if (wi->val_only) ++ /* The gimplifier doesn't gimplify CALL_EXPR_STATIC_CHAIN. ++ Handle that here. */ ++ tree call = get_call_expr_in (t); ++ if (call ++ && CALL_EXPR_STATIC_CHAIN (call) ++ && walk_tree (&CALL_EXPR_STATIC_CHAIN (call), lower_omp_2, ++ ctx, NULL)) + { +- if (wi->is_lhs) +- t = save_tmp_var (t, &wi->tsi); +- else +- t = init_tmp_var (t, &wi->tsi); ++ tree pre = NULL; ++ gimplify_expr (&CALL_EXPR_STATIC_CHAIN (call), &pre, NULL, ++ is_gimple_val, fb_rvalue); ++ if (pre) ++ { ++ if (tsi) ++ tsi_link_before (tsi, pre, TSI_SAME_STMT); ++ else ++ { ++ append_to_statement_list (t, &pre); ++ lower_omp_1 (&pre, ctx, NULL); ++ *tp = pre; ++ return; ++ } ++ } + } +- *tp = t; +- } +- break; + +- case ADDR_EXPR: +- if (ctx) +- lower_regimplify (tp, wi); +- break; +- +- case ARRAY_REF: +- case ARRAY_RANGE_REF: +- case REALPART_EXPR: +- case IMAGPART_EXPR: +- case COMPONENT_REF: +- case VIEW_CONVERT_EXPR: +- if (ctx) +- lower_regimplify (tp, wi); +- break; +- +- case INDIRECT_REF: +- if (ctx) +- { +- wi->is_lhs = false; +- wi->val_only = true; +- lower_regimplify (&TREE_OPERAND (t, 0), wi); ++ if (tsi == NULL) ++ gimplify_stmt (tp); ++ else ++ { ++ tree pre = NULL; ++ gimplify_expr (tp, &pre, NULL, is_gimple_stmt, fb_none); ++ if (pre) ++ tsi_link_before (tsi, pre, TSI_SAME_STMT); ++ } + } + break; +- +- default: +- if (!TYPE_P (t) && !DECL_P (t)) +- *walk_subtrees = 1; +- break; + } +- +- return NULL_TREE; + } + + static void + lower_omp (tree *stmt_p, omp_context *ctx) + { +- struct walk_stmt_info wi; +- +- memset (&wi, 0, sizeof (wi)); +- wi.callback = lower_omp_1; +- wi.info = ctx; +- wi.val_only = true; +- wi.want_locations = true; +- +- walk_stmts (&wi, stmt_p); ++ lower_omp_1 (stmt_p, ctx, NULL); + } + + /* Main entry point. */ +Index: gcc/tree-ssa-dse.c +=================================================================== +--- gcc/tree-ssa-dse.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/tree-ssa-dse.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -470,24 +470,23 @@ + vuse_vec_p vv; + tree stmt_lhs; + +- if (LOADED_SYMS (use_stmt)) ++ /* If use_stmt is or might be a nop assignment, e.g. for ++ struct { ... } S a, b, *p; ... ++ b = a; b = b; ++ or ++ b = a; b = *p; where p might be &b, ++ or ++ *p = a; *p = b; where p might be &b, ++ or ++ *p = *u; *p = *v; where p might be v, then USE_STMT ++ acts as a use as well as definition, so store in STMT ++ is not dead. */ ++ if (LOADED_SYMS (use_stmt) ++ && bitmap_intersect_p (LOADED_SYMS (use_stmt), ++ STORED_SYMS (use_stmt))) + { +- tree use_base +- = get_base_address (GIMPLE_STMT_OPERAND (use_stmt, 0)); +- /* If use_stmt is or might be a nop assignment, e.g. for +- struct { ... } S a, b, *p; ... +- b = a; b = b; +- or +- b = a; b = *p; where p might be &b, then USE_STMT +- acts as a use as well as definition, so store in STMT +- is not dead. */ +- if (TREE_CODE (use_base) == VAR_DECL +- && bitmap_bit_p (LOADED_SYMS (use_stmt), +- DECL_UID (use_base))) +- { +- record_voperand_set (dse_gd->stores, &bd->stores, ann->uid); +- return; +- } ++ record_voperand_set (dse_gd->stores, &bd->stores, ann->uid); ++ return; + } + + if (dump_file && (dump_flags & TDF_DETAILS)) +Index: gcc/DEV-PHASE +=================================================================== +--- gcc/DEV-PHASE (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/DEV-PHASE (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1 @@ ++prerelease +Index: gcc/ChangeLog +=================================================================== +--- gcc/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,300 @@ ++2008-04-01 John David Anglin ++ ++ PR middle-end/35705 ++ * fold-const.c (get_pointer_modulus_and_residue): Return modulus 1 if ++ the expression is a function address. ++ ++2008-04-01 Joseph Myers ++ ++ * doc/include/gpl_v3.texi: Update for manpage generation. ++ * doc/gcc.texi, doc/gccint.texi: Include gpl_v3.texi instead of ++ gpl.texi. ++ * doc/sourcebuild.texi: Document gpl_v3.texi as well as gpl.texi. ++ * Makefile.in (TEXI_GCC_FILES, TEXI_GCCINT_FILES): Include ++ gpl_v3.texi instead of gpl.texi. ++ (gpl.pod): New. ++ ++2008-03-28 Nick Clifton ++ ++ PR target/31232 ++ * config/stormy16/stormy16.c (xstormy16_legitimate_address_p): Do ++ not allow INT+INT as a legitimate addressing mode. ++ ++2008-03-28 Nick Clifton ++ ++ PR target/31110 ++ * config/mn10300/mn10300.c (mn10300_secondary_reload_class): ++ Return GENERAL_REGS for stack adjustment reloads. ++ ++2008-03-27 H.J. Lu ++ ++ Backport from mainline: ++ 2008-03-27 H.J. Lu ++ ++ PR target/35657 ++ * config/i386/i386.c (ix86_function_arg_boundary): Align ++ decimal floating point to its natural boundary. ++ ++2008-03-25 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-19 Richard Guenther ++ ++ PR middle-end/35609 ++ * tree-ssa.c (walk_data): New structure. ++ (warn_uninitialized_var): If not always_executed warn with "maybe" ++ instead of "is". ++ (execute_early_warn_uninitialized): Compute post-dominators. ++ Initialize always_executed before processing each basic block. ++ ++2008-03-20 Ira Rosen ++ ++ * doc/invoke.texi (-O3): Add -ftree-vectorize to the list of ++ optimizations turned on under -O3. ++ (ftree-vectorize): Add that the flag is turned on with -O3. ++ ++2008-03-19 Michael Matz ++ ++ Backport from mainline: ++ 2008-03-19 Michael Matz ++ ++ PR middle-end/35616 ++ * calls.c (expand_call): Check overlap of arguments with call ++ address for sibcalls. ++ ++2008-03-19 Michael Matz ++ ++ * gcov-io.h (__gcov_merge_ior, __gcov_fork): Mark hidden. ++ ++2008-03-19 Andreas Krebbel ++ ++ * cse.c (cse_insn): Avoid creation of overlapping MEMs. ++ * alias.c (nonoverlapping_memrefs_p): Export for use in other modules. ++ * alias.h (nonoverlapping_memrefs_p): Likewise. ++ ++2008-03-19 Andreas Krebbel ++ ++ * cse.c (cse_extended_basic_block): Invalidate artificial defs ++ at bb start. ++ ++2008-03-18 Mikulas Patocka ++ ++ PR target/35504 ++ * config/i386/i386.c (x86_this_parameter): Calculate correct location ++ of "this" pointer when "regparm = N" or "fastcall" is in effect. ++ ++2008-03-18 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-15 Richard Guenther ++ ++ PR middle-end/35593 ++ * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Make sure ++ to not produce negative array indices if not allowed. Add ++ parameter to indicate that. ++ (maybe_fold_offset_to_component_ref): Allow negative array ++ indices only for the first member of a structure. ++ (maybe_fold_offset_to_reference): Allow negative array indices. ++ (maybe_fold_stmt_addition): Likewise. ++ ++2008-03-18 Jakub Jelinek ++ ++ PR middle-end/35611 ++ * gimplify.c (gimplify_expr): Gimplify second operand of ++ OMP_ATOMIC_LOAD. ++ ++2008-03-16 James E. Wilson ++ ++ PR debug/31510 ++ * dbxout.c (dbxout_expand_expr, case VAR_DECL): Return NULL for ++ emulated thread local variables. ++ ++2008-03-16 Hans-Peter Nilsson ++ ++ * doc/extend.texi (Alignment): Say that the ABI controls ++ the __alignof__ for non-strict-alignment targets rather ++ than being a recommendation. ++ ++2008-03-14 Richard Guenther ++ ++ Backport from mainline: ++ 2008-02-19 Richard Guenther ++ ++ PR tree-optimization/34989 ++ * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Re-structure. ++ Allow propagation to INDIRECT_REF if we can simplify only. ++ ++2008-03-14 Uros Bizjak ++ ++ PR target/34000 ++ PR target/35553 ++ * config/i386/xmmintrin.h: Change all static inline functions to ++ extern inline and add __gnu_inline__ attribute. ++ * config/i386/bmintrin.h: Ditto. ++ * config/i386/smmintrin.h: Ditto. ++ * config/i386/tmmintrin.h: Ditto. ++ * config/i386/mmintrin-common.h: Ditto. ++ * config/i386/ammintrin.h: Ditto. ++ * config/i386/emmintrin.h: Ditto. ++ * config/i386/pmmintrin.h: Ditto. ++ * config/i386/mmintrin.h: Ditto. ++ * config/i386/mm3dnow.h: Ditto. ++ ++2008-03-13 Jakub Jelinek ++ ++ PR middle-end/35185 ++ * omp-low.c (lower_regimplify, init_tmp_var, save_tmp_var): Removed. ++ (lower_omp_2): New function. ++ (lower_omp_1, lower_omp): Rewritten. ++ ++2008-03-12 Jakub Jelinek ++ ++ PR middle-end/35549 ++ * omp-low.c (maybe_lookup_decl): Constify first argument. ++ (use_pointer_for_field): Change last argument from bool to ++ omp_context *. Disallow shared copy-in/out in nested ++ parallel if decl is shared in outer parallel too. ++ (build_outer_var_ref, scan_sharing_clauses, ++ lower_rec_input_clauses, lower_copyprivate_clauses, ++ lower_send_clauses, lower_send_shared_vars): Adjust callers. ++ ++2008-03-12 Uros Bizjak ++ ++ PR target/35540 ++ * config/i386/i386.md (paritysi2, paritydi2): Use register_operand ++ constraint for operand 1. ++ (paritysi2_cmp): Use register_operand constraint for operand 2. ++ Use earlyclobber modifier for operand 1. Remove support for ++ memory operands. ++ (paritydi2_cmp): Use register_operand constraint for operand 3. ++ Use earlyclobber modifier for operand 1. Remove support for ++ memory operands. ++ ++2008-03-11 Uros Bizjak ++ ++ PR middle-end/35526 ++ * expr.c (store_expr): Call emit_block_move if the mode ++ of "temp" RTX is BLKmode. ++ ++2008-03-10 Vladimir Makarov ++ ++ * config/i386/sse.md (ssse3_pmaddubswv8hi3, ssse3_pmaddubswv4hi3): ++ Remove commutativity hint. ++ ++2008-03-10 Jakub Jelinek ++ ++ PR c/35438 ++ PR c/35439 ++ * c-parser.c (c_parser_omp_threadprivate): Don't add vars with ++ errorneous type. Check that v is a VAR_DECL. ++ ++ PR middle-end/35099 ++ * tree-cfg.c (new_label_mapper): Update cfun->last_label_uid. ++ ++2008-03-10 Uros Bizjak ++ ++ Backport from mainline: ++ 2008-03-09 Uros Bizjak ++ ++ PR target/35496 ++ * config/i386/i386.c (ix86_constant_alignment): Compute alignment using ++ ALIGN_MODE_128 for VECTOR_CST and INTEGER_CST in addition to REAL_CST. ++ ++ 2008-03-04 Uros Bizjak ++ ++ PR middle-end/35456 ++ * fold-const.c (fold_cond_expr_with_comparison): Prevent ++ transformations for modes that have signed zeros. ++ * ifcvt.c (noce_try_abs): Ditto. ++ ++2008-03-09 Kaz Kojima ++ ++ Backport from mainline: ++ PR target/35225 ++ * config/sh/sh.c (find_barrier): Don't go past 'from' argument. ++ ++2008-03-09 Kaz Kojima ++ ++ Backport from mainline: ++ PR target/35190 ++ * config/sh/sh.md (jump_compact): Disable for crossing jumps. ++ ++ * config/sh/sh.c (find_barrier): Don't go past ++ NOTE_INSN_SWITCH_TEXT_SECTIONS note. ++ ++2008-03-08 Jakub Jelinek ++ ++ PR target/35498 ++ * config/rs6000/rs6000.c (rs6000_expand_compare_and_swapqhi): Shift ++ wdst back after sync_compare_and_swapqhi_internal. ++ ++2008-03-07 Joseph Myers ++ ++ * doc/include/texinfo.tex: Update to version 2008-03-07.10. ++ ++2008-03-07 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-05 Richard Guenther ++ ++ PR tree-optimization/35472 ++ * tree-ssa-dse.c (dse_optimize_stmt): Do not delete a store ++ whose single use_stmt has a overlapping set of loaded and ++ stored symbols as that use_stmt might be a noop assignment then. ++ ++2008-03-06 H.J. Lu ++ ++ Backport from mainline: ++ 2008-02-18 H.J. Lu ++ ++ PR target/35189 ++ * config/i386/i386.c (OPTION_MASK_ISA_MMX_SET): New. ++ (OPTION_MASK_ISA_3DNOW_SET): Likewise. ++ (OPTION_MASK_ISA_SSE_SET): Likewise. ++ (OPTION_MASK_ISA_SSE2_SET): Likewise. ++ (OPTION_MASK_ISA_SSE3_SET): Likewise. ++ (OPTION_MASK_ISA_SSSE3_SET): Likewise. ++ (OPTION_MASK_ISA_SSE4_1_SET): Likewise. ++ (OPTION_MASK_ISA_SSE4_2_SET): Likewise. ++ (OPTION_MASK_ISA_SSE4_SET): Likewise. ++ (OPTION_MASK_ISA_SSE4A_SET): Likewise. ++ (OPTION_MASK_ISA_SSE5_SET): Likewise. ++ (OPTION_MASK_ISA_3DNOW_A_UNSET): Likewise. ++ (OPTION_MASK_ISA_MMX_UNSET): Updated. ++ (OPTION_MASK_ISA_3DNOW_UNSET): Updated. ++ (OPTION_MASK_ISA_SSE_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE3_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSSE3_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE4_1_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE4_2_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE4A_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE5_UNSET): Likewise. ++ (OPTION_MASK_ISA_SSE4): Removed. ++ (ix86_handle_option): Turn on bits in ix86_isa_flags and ++ ix86_isa_flags_explicit with OPTION_MASK_ISA_XXX_SET for -mXXX. ++ (override_options): Don't turn on implied SSE/MMX bits in ++ ix86_isa_flags. ++ ++2008-03-06 Jakub Jelinek ++ ++ * gimplify.c (goa_lhs_expr_p): Allow different ADDR_EXPR nodes ++ for the same VAR_DECL. ++ ++2008-03-06 Daniel Jacobowitz ++ ++ * expmed.c (extract_bit_field): Always use adjust_address for MEM. ++ ++2008-03-06 Joseph Myers ++ ++ PR target/33963 ++ * tree.c (handle_dll_attribute): Disallow TYPE_DECLs for types ++ other than structures and unions. ++ ++2008-03-06 Jakub Jelinek ++ ++ * BASE-VER: Set to 4.3.1. ++ * DEV-PHASE: Set to prerelease. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +@@ -56,12 +353,12 @@ + Uros Bizjak + + PR target/25477 +- * gcc/config/darwin-protos.h: Add darwin_patch_builtins prototype. +- * gcc/config/darwin-ppc-ldouble-patch.def: New file. +- * gcc/config/rs6000/darwin.h (SUBTARGET_INIT_BUILTINS): New macro. +- * gcc/config/rs6000/rs6000.c (rs6000_init_builtins): Call ++ * config/darwin-protos.h: Add darwin_patch_builtins prototype. ++ * config/darwin-ppc-ldouble-patch.def: New file. ++ * config/rs6000/darwin.h (SUBTARGET_INIT_BUILTINS): New macro. ++ * config/rs6000/rs6000.c (rs6000_init_builtins): Call + SUBTARGET_INIT_BUILTINS if defined. +- * gcc/config/darwin.c (darwin_patch_builtin, ++ * config/darwin.c (darwin_patch_builtin, + darwin_patch_builtins): New functions. + + 2008-02-27 Richard Guenther +@@ -2122,7 +2419,7 @@ + 2008-01-02 Arthur Norman + + PR target/34013 +- * gcc/config/i386/i386.c (ix86_expand_prologue): Save red-zone ++ * config/i386/i386.c (ix86_expand_prologue): Save red-zone + while stack probing. + + 2008-01-01 Douglas Gregor +Index: gcc/testsuite/gcc.c-torture/execute/20080222-1.c +=================================================================== +--- gcc/testsuite/gcc.c-torture/execute/20080222-1.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.c-torture/execute/20080222-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,22 @@ ++extern void abort (void); ++ ++struct container ++{ ++ unsigned char data[1]; ++}; ++ ++unsigned char space[6] = {1, 2, 3, 4, 5, 6}; ++ ++int ++foo (struct container *p) ++{ ++ return p->data[4]; ++} ++ ++int ++main () ++{ ++ if (foo ((struct container *) space) != 5) ++ abort (); ++ return 0; ++} +Index: gcc/testsuite/gcc.c-torture/execute/pr35472.c +=================================================================== +--- gcc/testsuite/gcc.c-torture/execute/pr35472.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.c-torture/execute/pr35472.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,22 @@ ++extern void abort (void); ++extern void *memset (void *s, int c, __SIZE_TYPE__ n); ++struct S { int i[16]; }; ++struct S *p; ++void __attribute__((noinline)) ++foo(struct S *a, struct S *b) { a->i[0] = -1; p = b; } ++void test (void) ++{ ++ struct S a, b; ++ memset (&a.i[0], '\0', sizeof (a.i)); ++ memset (&b.i[0], '\0', sizeof (b.i)); ++ foo (&a, &b); ++ *p = a; ++ *p = b; ++ if (b.i[0] != -1) ++ abort (); ++} ++int main() ++{ ++ test(); ++ return 0; ++} +Index: gcc/testsuite/gcc.c-torture/execute/pr35456.c +=================================================================== +--- gcc/testsuite/gcc.c-torture/execute/pr35456.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.c-torture/execute/pr35456.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,21 @@ ++extern void abort (void); ++ ++double ++__attribute__ ((noinline)) ++not_fabs (double x) ++{ ++ return x >= 0.0 ? x : -x; ++} ++ ++int main() ++{ ++ double x = -0.0; ++ double y; ++ ++ y = not_fabs (x); ++ ++ if (!__builtin_signbit (y)) ++ abort(); ++ ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-phsubw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phsubw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phsubw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/sse-14.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/sse-14.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/sse-14.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile without optimization. All of them are + defined as inline functions in {,x,e,p,t,s,a,b}mmintrin.h and mm3dnow.h +- that reference the proper builtin functions. Defining away "static" and ++ that reference the proper builtin functions. Defining away "extern" and + "__inline" results in all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/ssse3-phaddd.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phaddd.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phaddd.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/ssse3-pabsb.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pabsb.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pabsb.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-1.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-1.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if !defined __SSSE3__ ++ abort (); ++#endif ++#if !defined __SSE4_1__ ++ abort (); ++#endif ++#if !defined __SSE4_2__ ++ abort (); ++#endif ++#if defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-psignb.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-psignb.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-psignb.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-9.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-9.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-9.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=amdfam10 -mno-sse5" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/isa-12.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-12.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-12.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse5 -mno-sse3" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-phaddsw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phaddsw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phaddsw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-2.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-2.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-2.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse4 -msse5" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if !defined __SSSE3__ ++ abort (); ++#endif ++#if !defined __SSE4_1__ ++ abort (); ++#endif ++#if !defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/isa-13.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-13.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-13.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse5 -mno-sse2" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if defined __SSE2__ ++ abort (); ++#endif ++#if defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-pabsd.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pabsd.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pabsd.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-3.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-3.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-3.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse4 -msse5 -msse4a" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if !defined __SSSE3__ ++ abort (); ++#endif ++#if !defined __SSE4_1__ ++ abort (); ++#endif ++#if !defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-psignd.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-psignd.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-psignd.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/ssse3-pmaddubsw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pmaddubsw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pmaddubsw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-14.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-14.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-14.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse5 -mno-sse" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if defined __SSE__ ++ abort (); ++#endif ++#if defined __SSE2__ ++ abort (); ++#endif ++#if defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-pmulhrsw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pmulhrsw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pmulhrsw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/ssse3-phaddw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phaddw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phaddw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-4.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-4.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-4.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=core2 -msse5 -mno-sse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if !defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/mmx-1.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/mmx-1.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/mmx-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile with optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/isa-5.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-5.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-5.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=core2 -msse4a -mno-sse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if !defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-phsubd.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phsubd.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phsubd.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/mmx-2.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/mmx-2.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/mmx-2.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile without optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/pr35540.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/pr35540.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/pr35540.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,45 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++ ++extern void abort (void); ++ ++int __attribute__ ((noinline)) ++test (unsigned int *a, int b) ++{ ++ return b ? 1 : __builtin_parity (*a); ++} ++ ++int __attribute__ ((noinline)) ++testl (unsigned long *a, int b) ++{ ++ return b ? 1 : __builtin_parityl (*a); ++} ++ ++int __attribute__ ((noinline)) ++testll (unsigned long long *a, int b) ++{ ++ return b ? 1 : __builtin_parityll (*a); ++} ++ ++int ++main () ++{ ++ unsigned int a = 0; ++ unsigned long al; ++ unsigned long long all; ++ ++ a = 0x12345670; ++ if (test (&a, 0)) ++ abort (); ++ ++ al = 0x12345670ul; ++ if (testl (&al, 0)) ++ abort(); ++ ++#if 1 ++ all = 0x12345678abcdef0ull; ++ if (testll (&all, 0)) ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-pabsw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pabsw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pabsw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-6.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-6.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-6.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=amdfam10 -mno-sse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/ssse3-psignw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-psignw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-psignw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/ssse3-pshufb.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-pshufb.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-pshufb.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/3dnow-1.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/3dnow-1.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/3dnow-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile with optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/ssse3-phsubsw.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-phsubsw.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-phsubsw.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-7.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-7.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-7.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=amdfam10 -msse5 -mno-sse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/3dnowA-1.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/3dnowA-1.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/3dnowA-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,13 +1,12 @@ + /* { dg-do assemble } */ +-/* { dg-require-effective-target ilp32 } */ +-/* { dg-options "-O2 -Werror-implicit-function-declaration -m3dnow -march=athlon" } */ ++/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -m3dnow" } */ + + /* Test that the intrinsics compile with optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/isa-10.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-10.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-10.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse5 -mno-sse4" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/sse-13.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/sse-13.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/sse-13.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile with optimization. All of them are + defined as inline functions in {,x,e,p,t,s,a,b}mmintrin.h and mm3dnow.h +- that reference the proper builtin functions. Defining away "static" and ++ that reference the proper builtin functions. Defining away "extern" and + "__inline" results in all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + /* Following intrinsics require immediate arguments. */ +Index: gcc/testsuite/gcc.target/i386/3dnow-2.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/3dnow-2.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/3dnow-2.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3,10 +3,10 @@ + + /* Test that the intrinsics compile without optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/isa-8.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-8.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-8.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=amdfam10 -msse5 -mno-sse4a" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if defined __SSE4A__ ++ abort (); ++#endif ++#if defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.target/i386/3dnowA-2.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/3dnowA-2.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/3dnowA-2.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,13 +1,12 @@ + /* { dg-do assemble } */ +-/* { dg-require-effective-target ilp32 } */ +-/* { dg-options "-O0 -Werror-implicit-function-declaration -m3dnow -march=athlon" } */ ++/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -m3dnow" } */ + + /* Test that the intrinsics compile without optimization. All of them are + defined as inline functions in mmintrin.h that reference the proper +- builtin functions. Defining away "static" and "__inline" results in ++ builtin functions. Defining away "extern" and "__inline" results in + all of them being compiled as proper functions. */ + +-#define static ++#define extern + #define __inline + + #include +Index: gcc/testsuite/gcc.target/i386/ssse3-palignr.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/ssse3-palignr.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.target/i386/ssse3-palignr.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,6 +1,6 @@ + /* { dg-do run } */ + /* { dg-require-effective-target ssse3 } */ +-/* { dg-options "-O2 -mssse3" } */ ++/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ + + #include "ssse3-check.h" + #include "ssse3-vals.h" +Index: gcc/testsuite/gcc.target/i386/isa-11.c +=================================================================== +--- gcc/testsuite/gcc.target/i386/isa-11.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.target/i386/isa-11.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,34 @@ ++/* { dg-do run } */ ++/* { dg-options "-march=x86-64 -msse5 -mno-ssse3" } */ ++ ++extern void abort (void); ++ ++int ++main () ++{ ++#if !defined __SSE__ ++ abort (); ++#endif ++#if !defined __SSE2__ ++ abort (); ++#endif ++#if !defined __SSE3__ ++ abort (); ++#endif ++#if defined __SSSE3__ ++ abort (); ++#endif ++#if defined __SSE4_1__ ++ abort (); ++#endif ++#if defined __SSE4_2__ ++ abort (); ++#endif ++#if !defined __SSE4A__ ++ abort (); ++#endif ++#if !defined __SSE5__ ++ abort (); ++#endif ++ return 0; ++} +Index: gcc/testsuite/gnat.dg/frame_overflow.adb +=================================================================== +--- gcc/testsuite/gnat.dg/frame_overflow.adb (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gnat.dg/frame_overflow.adb (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,15 +1,17 @@ + -- { dg-do compile } + ++with System; ++ + procedure frame_overflow is + +- type Bitpos_Range_T is new Positive; ++ type Bitpos_Range_T is range 1..2**(System.Word_Size-1)-1; + type Bitmap_Array_T is array (Bitpos_Range_T) of Boolean; + + type Bitmap_T is record + Bits : Bitmap_Array_T := (others => False); + end record; + +- function -- { dg-error "too large" "" } ++ function -- { dg-error "too large" } + Set_In (Bitmap : Bitmap_T; Bitpos : Bitpos_Range_T) return Bitmap_T + is + Result: Bitmap_T := Bitmap; +@@ -18,7 +20,7 @@ + return Result; + end; + +- function -- { dg-error "too large" "" } ++ function -- { dg-error "too large" } + Negate (Bitmap : Bitmap_T) return Bitmap_T is + Result: Bitmap_T; + begin +Index: gcc/testsuite/gnat.dg/object_overflow.adb +=================================================================== +--- gcc/testsuite/gnat.dg/object_overflow.adb (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gnat.dg/object_overflow.adb (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,14 @@ ++-- { dg-do compile } ++ ++procedure Object_Overflow is ++ ++ type Rec is null record; ++ ++ procedure Proc (x : Rec) is begin null; end; ++ ++ type Arr is array(Long_Integer) of Rec; ++ Obj : Arr; -- { dg-warning "Storage_Error will be raised" } ++ ++begin ++ Proc (Obj(1)); ++end; +Index: gcc/testsuite/gcc.dg/pr34989-1.c +=================================================================== +--- gcc/testsuite/gcc.dg/pr34989-1.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/pr34989-1.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++/* { dg-options "--combine -O2" } */ ++/* { dg-additional-sources "pr34989-2.c" } */ ++ ++extern struct globals *const ptr_to_globals; ++struct globals { }; ++int syslogd_main(int argc, char **argv) ++{ ++ (*(struct globals**)&ptr_to_globals) = 0; ++} +Index: gcc/testsuite/gcc.dg/gomp/pr34692.c +=================================================================== +--- gcc/testsuite/gcc.dg/gomp/pr34692.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.dg/gomp/pr34692.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -24,3 +24,5 @@ + cde f g h); + } + } ++ ++/* { dg-final { cleanup-tree-dump "gimple" } } */ +Index: gcc/testsuite/gcc.dg/gomp/pr35439.c +=================================================================== +--- gcc/testsuite/gcc.dg/gomp/pr35439.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/gomp/pr35439.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,6 @@ ++/* PR c/35439 */ ++/* { dg-do compile } */ ++/* { dg-options "-fopenmp" } */ ++ ++void x[1]; /* { dg-error "array of voids" } */ ++#pragma omp threadprivate(x) +Index: gcc/testsuite/gcc.dg/gomp/pr35244.c +=================================================================== +--- gcc/testsuite/gcc.dg/gomp/pr35244.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/gomp/pr35244.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,20 @@ ++/* PR c++/35244 */ ++/* { dg-do compile } */ ++/* { dg-require-effective-target tls_native } */ ++/* { dg-options "-fopenmp" } */ ++ ++int v1; ++typedef struct A A; ++typedef int i; ++#pragma omp threadprivate (i) /* { dg-error "expected identifier before" } */ ++#pragma omp threadprivate (A) /* { dg-error "expected identifier before" } */ ++#pragma omp threadprivate (v1) ++ ++void foo () ++{ ++ static int v4; ++ { ++ static int v5; ++#pragma omp threadprivate (v4, v5) ++ } ++} +Index: gcc/testsuite/gcc.dg/gomp/pr35438.c +=================================================================== +--- gcc/testsuite/gcc.dg/gomp/pr35438.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/gomp/pr35438.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,6 @@ ++/* PR c/35438 */ ++/* { dg-do compile } */ ++/* { dg-options "-fopenmp" } */ ++ ++void foo (); ++#pragma omp threadprivate(foo) /* { dg-error "is not a variable" } */ +Index: gcc/testsuite/gcc.dg/gomp/pr34964.c +=================================================================== +--- gcc/testsuite/gcc.dg/gomp/pr34964.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/gomp/pr34964.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,6 @@ ++/* PR c++/34964 */ ++/* { dg-do compile } */ ++/* { dg-options "-fopenmp" } */ ++ ++char x[] = 0; /* { dg-error "invalid initializer" } */ ++#pragma omp threadprivate (x) +Index: gcc/testsuite/gcc.dg/uninit-16.c +=================================================================== +--- gcc/testsuite/gcc.dg/uninit-16.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/uninit-16.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,23 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -Wuninitialized" } */ ++ ++int foo, bar; ++ ++static ++void decode_reloc(int reloc, int *is_alt) ++{ ++ if (reloc >= 20) ++ *is_alt = 1; ++ else if (reloc >= 10) ++ *is_alt = 0; ++} ++ ++void testfunc() ++{ ++ int alt_reloc; ++ ++ decode_reloc(foo, &alt_reloc); ++ ++ if (alt_reloc) /* { dg-warning "may be used uninitialized" } */ ++ bar = 42; ++} +Index: gcc/testsuite/gcc.dg/pr34989-2.c +=================================================================== +--- gcc/testsuite/gcc.dg/pr34989-2.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/pr34989-2.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,3 @@ ++/* { dg-do compile } */ ++ ++extern struct globals *const ptr_to_globals; +Index: gcc/testsuite/gcc.dg/uninit-15.c +=================================================================== +--- gcc/testsuite/gcc.dg/uninit-15.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/uninit-15.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,17 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O -Wuninitialized" } */ ++ ++inline int foo (int i) ++{ ++ if (i) return 1; /* { dg-warning "is used uninitialized" } */ ++ return 0; ++} ++ ++void baz(); ++ ++void bar() ++{ ++ int j; /* { dg-message "was declared here" } */ ++ for (; foo(j); ++j) ++ baz(); ++} +Index: gcc/testsuite/gcc.dg/pr35616.c +=================================================================== +--- gcc/testsuite/gcc.dg/pr35616.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/pr35616.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,43 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++typedef void (*listener_fun)( ++ int a, ++ int b, ++ int c); ++ ++struct data_t ++{ ++ int a; ++ ++ listener_fun listener; ++ ++ int b; ++ int c; ++ int d; ++}; ++ ++extern void abort(void); ++void function_calling_listener (struct data_t data); ++ ++void function_calling_listener (struct data_t data) ++{ ++ data.listener(data.a, data.c, data.d); ++} ++ ++void my_listener(int a, int b, int c) ++{ ++ if (a != 42 || b != 44 || c != 45) ++ abort (); ++} ++ ++int main() ++{ ++ struct data_t d; ++ d.a = 42; ++ d.b = 43; ++ d.c = 44; ++ d.d = 45; ++ d.listener = my_listener; ++ function_calling_listener (d); ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/pr35258.c +=================================================================== +--- gcc/testsuite/gcc.dg/pr35258.c (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gcc.dg/pr35258.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,28 @@ ++/* { dg-do run } */ ++/* { dg-options "-O1" } */ ++ ++extern void *memcpy (void *, const void *, __SIZE_TYPE__); ++extern int memcmp (const void *, const void *, __SIZE_TYPE__); ++extern void abort(void); ++ ++char str[9] = "1234"; ++ ++void ++bar (void) ++{ ++ unsigned int temp; ++ char *p = &str[2]; ++ ++ memcpy (&temp, &str[1], 4); ++ memcpy (p, &temp, 4); ++ str[1] = '.'; ++} ++ ++int main() ++{ ++ bar(); ++ if (memcmp (str, "1.234", 5) != 0) ++ abort (); ++ ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/vect/vect.exp +=================================================================== +--- gcc/testsuite/gcc.dg/vect/vect.exp (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gcc.dg/vect/vect.exp (.../branches/gcc-4_3-branch) (revision 133808) +@@ -63,7 +63,11 @@ + set dg-do-what-default run + } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { + lappend DEFAULT_VECTCFLAGS "-msse2" +- set dg-do-what-default run ++ if [check_sse2_hw_available] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } elseif { [istarget "mips*-*-*"] + && [check_effective_target_mpaired_single] + && [check_effective_target_nomips16] } { +Index: gcc/testsuite/ChangeLog +=================================================================== +--- gcc/testsuite/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,293 @@ ++2008-03-31 Eric Botcazou ++ ++ * gnat.dg/object_overflow.adb: New test. ++ ++2008-03-30 John David Anglin ++ ++ PR c++/35245 ++ * g++.dg/other/anon5.C: Skip on hppa*-*-hpux*. ++ ++2008-03-30 Paul Thomas ++ ++ PR fortran/35740 ++ * gfortran.dg/transpose_conjg_1.f90: New test. ++ ++2008-03-29 Paul Thomas ++ ++ PR fortran/35698 ++ * gfortran.dg/allocate_zerosize_3.f: New test. ++ ++ PR fortran/35702 ++ * gfortran.dg/character_assign_1.f90: New test. ++ ++2008-03-28 Jerry DeLisle ++ ++ PR fortran/35699 ++ * gfortran.dg/direct_io_10.f: New test. ++ ++2008-03-27 Jerry DeLisle ++ ++ PR fortran/35724 ++ * gfortran.dg/cshift_shift_real_2.f90: New test. ++ ++2008-03-26 Kaveh R. Ghazi ++ ++ * gcc.dg/uninit-16.c (decode_reloc): Mark static. ++ ++2008-03-26 Jakub Jelinek ++ ++ PR c++/35546 ++ * g++.dg/ext/attrib33.C: New test. ++ ++ PR c++/35332 ++ * g++.dg/other/error27.C: New test. ++ ++2008-03-25 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-19 Richard Guenther ++ ++ PR middle-end/35609 ++ * gcc.dg/testsuite/uninit-15.c: New testcase. ++ * gcc.dg/testsuite/uninit-16.c: Likewise. ++ ++2008-03-24 Paul Thomas ++ ++ PR fortran/34813 ++ * gfortran.dg/null_3.f90 : New test ++ ++ PR fortran/33295 ++ * gfortran.dg/module_function_type_1.f90 : New test ++ ++2008-03-21 Uros Bizjak ++ ++ Backport from mainline: ++ 2008-03-20 Victor Kaplansky ++ Uros Bizjak ++ ++ PR testsuite/34168 ++ * lib/target-supports.exp (check_sse2_hw_available): New procedure. ++ * gcc.dg/vect/vect.exp: Set dg-do-what-default to "compile" ++ if SSE2 hardware is not available. ++ * g++.dg/vect/vect.exp: Update target-dependent overrides to match ++ gcc.dg/vect/vect.exp. ++ * gfortran.dg/vect/vect.exp: Ditto. ++ (check_effective_target_lp64_or_vect_no_align): Remove procedure. ++ ++ 2008-03-20 Uros Bizjak ++ ++ * gcc.dg/gomp/pr34692.c: Cleanup gimple dump file. ++ ++2008-03-20 Jerry DeLisle ++ ++ Backport from trunk: ++ PR libfortran/35627 ++ * gfortran.dg/namelist_46.f90: New test. ++ ++ PR libfortran/35617 ++ * gfortran.dg/namelist_45.f90: New test. ++ ++2008-03-20 H.J. Lu ++ ++ Backport from mainline: ++ 2008-03-20 H.J. Lu ++ ++ PR testsuite/35621 ++ * gcc.target/i386/ssse3-pabsb.c: Add -fno-strict-aliasing. ++ * gcc.target/i386/ssse3-pabsd.c: Likewise. ++ * gcc.target/i386/ssse3-pabsw.c: Likewise. ++ * gcc.target/i386/ssse3-palignr.c: Likewise. ++ * gcc.target/i386/ssse3-phaddd.c: Likewise. ++ * gcc.target/i386/ssse3-phaddsw.c: Likewise. ++ * gcc.target/i386/ssse3-phaddw.c: Likewise. ++ * gcc.target/i386/ssse3-phsubd.c: Likewise. ++ * gcc.target/i386/ssse3-phsubsw.c: Likewise. ++ * gcc.target/i386/ssse3-phsubw.c: Likewise. ++ * gcc.target/i386/ssse3-pmaddubsw.c: Likewise. ++ * gcc.target/i386/ssse3-pmulhrsw.c: Likewise. ++ * gcc.target/i386/ssse3-pshufb.c: Likewise. ++ * gcc.target/i386/ssse3-psignb.c: Likewise. ++ * gcc.target/i386/ssse3-psignd.c: Likewise. ++ * gcc.target/i386/ssse3-psignw.c: Likewise. ++ ++2008-03-19 Michael Matz ++ ++ Backport from mainline: ++ 2008-03-19 Michael Matz ++ ++ PR middle-end/35616 ++ * gcc.dg/pr35616.c: New test. ++ ++2008-03-19 Andreas Krebbel ++ ++ * gcc.dg/pr35258.c: New testcase. ++ ++2008-03-18 Mikulas Patocka ++ ++ PR target/35504 ++ * g++.dg/other/pr35504.C: New test. ++ ++2008-03-18 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-15 Richard Guenther ++ ++ PR middle-end/35593 ++ * g++.dg/warn/Warray-bounds-3.C: New testcase. ++ ++2008-03-17 Jason Merrill ++ ++ PR c++/35548 ++ * g++.dg/init/ref16.C: New testcase. ++ ++2008-03-14 Richard Guenther ++ ++ Backport from mainline: ++ 2008-02-19 Richard Guenther ++ ++ PR tree-optimization/34989 ++ * gcc.dg/pr34989-1.c: New testcase. ++ * gcc.dg/pr34989-2.c: Likewise. ++ ++2008-03-14 Uros Bizjak ++ ++ PR target/34000 ++ PR target/35553 ++ * g++.dg/other/i386-3.C: New test. ++ * gcc.target/i386/sse-13.c: Redefine extern instead of static. ++ * gcc.target/i386/sse-14.c: Ditto. ++ * gcc.target/i386/mmx-1.c: Ditto. ++ * gcc.target/i386/mmx-2.c: Ditto. ++ * gcc.target/i386/3dnow-1.c: Ditto. ++ * gcc.target/i386/3dnow-2.c: Ditto. ++ * gcc.target/i386/3dnowA-1.c: Ditto. ++ * gcc.target/i386/3dnowA-2.c: Ditto. ++ ++2008-03-14 Paul Thomas ++ ++ PR fortran/35474 ++ * gfortran.dg/module_commons_2.f90 : New test. ++ ++2008-03-12 Uros Bizjak ++ ++ PR target/35540 ++ * gcc.target/i386/pr35540.c: New test. ++ ++2008-03-11 Uros Bizjak ++ ++ * g++.dg/inherit/override-attribs.C: Require ilp32 x86 target. ++ ++2008-03-11 Uros Bizjak ++ ++ PR middle-end/35526 ++ * g++.dg/torture/pr35526.C: New test. ++ ++2008-03-10 Jakub Jelinek ++ ++ PR c++/35328 ++ * g++.dg/gomp/pr35328.C: New test. ++ ++ PR c++/35337 ++ * g++.dg/gomp/pr35337.C: New test. ++ ++ PR c/35438 ++ PR c/35439 ++ * gcc.dg/gomp/pr35438.c: New test. ++ * gcc.dg/gomp/pr35439.c: New test. ++ ++ PR middle-end/35099 ++ * g++.dg/gomp/pr35099.C: New test. ++ ++2008-03-10 Uros Bizjak ++ ++ Backport from mainline: ++ 2008-03-04 Uros Bizjak ++ ++ PR middle-end/35456 ++ * gcc.c-torture/execute/pr35456.c: New test. ++ ++2008-03-09 Eric Botcazou ++ ++ * gnat.dg/frame_overflow.adb: Improve portability. ++ ++2008-03-08 H.J. Lu ++ ++ Backport from mainline: ++ 2008-03-08 H.J. Lu ++ ++ PR target/35350 ++ * gcc.target/i386/isa-1.c: Add -march=x86-64. ++ * gcc.target/i386/isa-2.c: Likewise. ++ * gcc.target/i386/isa-3.c: Likewise. ++ * gcc.target/i386/isa-10.c: Likewise. ++ * gcc.target/i386/isa-11.c: Likewise. ++ * gcc.target/i386/isa-12.c: Likewise. ++ * gcc.target/i386/isa-13.c: Likewise. ++ * gcc.target/i386/isa-14.c: Likewise. ++ ++2008-03-07 Richard Guenther ++ ++ Backport from mainline: ++ 2008-03-05 Richard Guenther ++ ++ PR tree-optimization/35472 ++ * gcc.c-torture/execute/pr35472.c: New testcase. ++ ++2008-03-06 H.J. Lu ++ ++ Backport from mainline: ++ 2008-02-18 H.J. Lu ++ ++ PR target/35189 ++ * gcc.target/i386/isa-1.c: New. ++ * gcc.target/i386/isa-2.c: Likewise. ++ * gcc.target/i386/isa-3.c: Likewise. ++ * gcc.target/i386/isa-4.c: Likewise. ++ * gcc.target/i386/isa-5.c: Likewise. ++ * gcc.target/i386/isa-6.c: Likewise. ++ * gcc.target/i386/isa-7.c: Likewise. ++ * gcc.target/i386/isa-8.c: Likewise. ++ * gcc.target/i386/isa-9.c: Likewise. ++ * gcc.target/i386/isa-10.c: Likewise. ++ * gcc.target/i386/isa-11.c: Likewise. ++ * gcc.target/i386/isa-12.c: Likewise. ++ * gcc.target/i386/isa-13.c: Likewise. ++ * gcc.target/i386/isa-14.c: Likewise. ++ ++2008-03-06 Jakub Jelinek ++ ++ PR c++/35028 ++ * g++.dg/gomp/pr35028.C: New test. ++ ++ PR c++/34964 ++ PR c++/35244 ++ * gcc.dg/gomp/pr34964.c: New test. ++ * g++.dg/gomp/pr34964.C: New test. ++ * gcc.dg/gomp/pr35244.c: New test. ++ * g++.dg/gomp/pr35244.C: New test. ++ ++ PR c++/35078 ++ * g++.dg/gomp/pr35078.C: New test. ++ ++2008-03-06 Daniel Jacobowitz ++ ++ * gcc.c-torture/execute/20080222-1.c: New test. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35323 ++ * g++.dg/lookup/crash7.C: New. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35333 ++ * g++.dg/other/error26.C: New. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35338 ++ * g++.dg/other/error25.C: New. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: gcc/testsuite/g++.dg/other/i386-3.C +=================================================================== +--- gcc/testsuite/g++.dg/other/i386-3.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/other/i386-3.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,8 @@ ++/* Test that {,x,e,p,t,s,a,b}mmintrin.h, mm3dnow.h and mm_malloc.h are ++ usable with -O -fkeep-inline-functions. */ ++/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ ++/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -msse4 -msse5" } */ ++ ++#include ++#include ++#include +Index: gcc/testsuite/g++.dg/other/error25.C +=================================================================== +--- gcc/testsuite/g++.dg/other/error25.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/other/error25.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,5 @@ ++// PR c++/35338 ++// { dg-options "" } ++ ++int i = 0r; // { dg-error "unnamed-fixed" } ++bool b = !0r; // { dg-error "0.0|argument" } +Index: gcc/testsuite/g++.dg/other/anon5.C +=================================================================== +--- gcc/testsuite/g++.dg/other/anon5.C (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/g++.dg/other/anon5.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -4,7 +4,7 @@ + // problem is that mips*-elf tests run from KSEG0 (which is in the upper + // half of the address range), and the linker compares sign-extended + // addresses from .debug_aranges with unextended addresses. +-// { dg-do link { target { ! mips*-*-elf* } } } ++// { dg-do link { target { ! { hppa*-*-hpux* mips*-*-elf* } } } } + // { dg-options "-g" } + + namespace { +Index: gcc/testsuite/g++.dg/other/error26.C +=================================================================== +--- gcc/testsuite/g++.dg/other/error26.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/other/error26.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,6 @@ ++// PR c++/35333 ++ ++void foo(__complex__ double x) ++{ ++ __builtin_conj(x)(); // { dg-error "~x" } ++} +Index: gcc/testsuite/g++.dg/other/pr35504.C +=================================================================== +--- gcc/testsuite/g++.dg/other/pr35504.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/other/pr35504.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,147 @@ ++// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } ++ ++#define ATTR0 __attribute__((__regparm__(0))) ++#define ATTR1 __attribute__((__regparm__(1))) ++#define ATTR2 __attribute__((__regparm__(2))) ++#define ATTR3 __attribute__((__regparm__(3))) ++#define ATTR4 __attribute__((__fastcall__)) ++#define ATTR5 __attribute__((__stdcall__)) ++#define ATTR6 __attribute__((__cdecl__)) ++#define ATTR7 ++ ++extern "C" void abort (void); ++ ++struct long_struct ++{ ++ int a[3]; ++}; ++ ++struct long_struct ret; ++ ++class c3 *this3; ++ ++class c1 ++{ ++ int val1; ++public: ++ virtual void foo () { } ++}; ++ ++class c2 ++{ ++public: ++ virtual ATTR0 struct long_struct method0 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR1 struct long_struct method1 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR2 struct long_struct method2 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR3 struct long_struct method3 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR4 struct long_struct method4 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR5 struct long_struct method5 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR6 struct long_struct method6 () ++ { ++ return ret; ++ } ++ ++ virtual ATTR7 struct long_struct method7 () ++ { ++ return ret; ++ } ++}; ++ ++class c3:c1, public c2 ++{ ++public: ++ c3 () ++ { ++ this3 = this; ++ } ++ ++ struct long_struct check_this (int a) ++ { ++ if (this3 != this) ++ abort (); ++ ++ return ret; ++ } ++ ++ virtual ATTR0 struct long_struct method0 () ++ { ++ return check_this (0); ++ } ++ ++ virtual ATTR1 struct long_struct method1 () ++ { ++ return check_this (1); ++ } ++ ++ virtual ATTR2 struct long_struct method2 () ++ { ++ return check_this (2); ++ } ++ ++ virtual ATTR3 struct long_struct method3 () ++ { ++ return check_this (3); ++ } ++ ++ virtual ATTR4 struct long_struct method4 () ++ { ++ return check_this (4); ++ } ++ ++ virtual ATTR5 struct long_struct method5 () ++ { ++ return check_this (5); ++ } ++ ++ virtual ATTR6 struct long_struct method6 () ++ { ++ return check_this (6); ++ } ++ ++ virtual ATTR7 struct long_struct method7 () ++ { ++ return check_this (7); ++ } ++}; ++ ++class c3 c3_instance; ++class c2 *c2_ptr = &c3_instance; ++ ++int ++main () ++{ ++ c2_ptr->method0 (); ++ c2_ptr->method1 (); ++ c2_ptr->method2 (); ++ c2_ptr->method3 (); ++ c2_ptr->method4 (); ++ c2_ptr->method5 (); ++ c2_ptr->method6 (); ++ c2_ptr->method7 (); ++ ++ return 0; ++} +Index: gcc/testsuite/g++.dg/other/error27.C +=================================================================== +--- gcc/testsuite/g++.dg/other/error27.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/other/error27.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,12 @@ ++// PR c++/35332 ++// { dg-do compile } ++ ++void foo (double x, double y) ++{ ++ __builtin_isgreater(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++ __builtin_isless(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++ __builtin_isgreaterequal(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++ __builtin_islessequal(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++ __builtin_isunordered(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++ __builtin_islessgreater(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } ++} +Index: gcc/testsuite/g++.dg/ext/attrib33.C +=================================================================== +--- gcc/testsuite/g++.dg/ext/attrib33.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/ext/attrib33.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++// PR c++/35546 ++// { dg-do compile } ++ ++template ++struct T ++{ ++ void foo (char const * ...) __attribute__ ((format (printf,2,3))); ++}; ++ ++template struct T<3>; ++ ++template ++struct U ++{ ++ typedef T __attribute__((mode (SI))) V; ++}; ++ ++U::V v; +Index: gcc/testsuite/g++.dg/vect/vect.exp +=================================================================== +--- gcc/testsuite/g++.dg/vect/vect.exp (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/g++.dg/vect/vect.exp (.../branches/gcc-4_3-branch) (revision 133808) +@@ -45,7 +45,14 @@ + # Skip these tests for targets that do not support generating vector + # code. Set additional target-dependent vector flags, which can be + # overridden by using dg-options in individual tests. +-if [istarget "powerpc*-*-*"] { ++if [istarget "powerpc-*paired*"] { ++ lappend DEFAULT_VECTCFLAGS "-mpaired" ++ if [check_750cl_hw_available] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } ++} elseif [istarget "powerpc*-*-*"] { + # Skip targets not supporting -maltivec. + if ![is-effective-target powerpc_altivec_ok] { + return +@@ -53,19 +60,23 @@ + + lappend DEFAULT_VECTCFLAGS "-maltivec" + if [check_vmx_hw_available] { +- set dg-do-what-default run ++ set dg-do-what-default run + } else { +- if [is-effective-target ilp32] { +- # Specify a cpu that supports VMX for compile-only tests. +- lappend DEFAULT_VECTCFLAGS "-mcpu=7400" +- } +- set dg-do-what-default compile ++ if [is-effective-target ilp32] { ++ # Specify a cpu that supports VMX for compile-only tests. ++ lappend DEFAULT_VECTCFLAGS "-mcpu=970" ++ } ++ set dg-do-what-default compile + } + } elseif { [istarget "spu-*-*"] } { + set dg-do-what-default run + } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { + lappend DEFAULT_VECTCFLAGS "-msse2" +- set dg-do-what-default run ++ if [check_sse2_hw_available] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } elseif { [istarget "mips*-*-*"] + && [check_effective_target_mpaired_single] + && [check_effective_target_nomips16] } { +@@ -73,21 +84,37 @@ + set dg-do-what-default run + } elseif [istarget "sparc*-*-*"] { + lappend DEFAULT_VECTCFLAGS "-mcpu=ultrasparc" "-mvis" +- set dg-do-what-default run ++ if [check_effective_target_ultrasparc_hw] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } elseif [istarget "alpha*-*-*"] { ++ # Alpha's vectorization capabilities are extremely limited. ++ # It's more effort than its worth disabling all of the tests ++ # that it cannot pass. But if you actually want to see what ++ # does work, command out the return. ++ return ++ + lappend DEFAULT_VECTCFLAGS "-mmax" + if [check_alpha_max_hw_available] { +- set dg-do-what-default run ++ set dg-do-what-default run + } else { +- set dg-do-what-default compile ++ set dg-do-what-default compile + } + } elseif [istarget "ia64-*-*"] { + set dg-do-what-default run ++} elseif [is-effective-target arm_neon_ok] { ++ lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp" ++ if [is-effective-target arm_neon_hw] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } else { + return + } + +- + # Initialize `dg'. + dg-init + +Index: gcc/testsuite/g++.dg/warn/Warray-bounds-3.C +=================================================================== +--- gcc/testsuite/g++.dg/warn/Warray-bounds-3.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/warn/Warray-bounds-3.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,15 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -Wall" } */ ++ ++extern void function(void * x); ++ ++struct A { ++ long x; ++ char d[0]; ++}; ++ ++ ++void test(A * a) { ++ function((char *)a - 4); /* { dg-bogus "below array bounds" } */ ++} ++ +Index: gcc/testsuite/g++.dg/lookup/crash7.C +=================================================================== +--- gcc/testsuite/g++.dg/lookup/crash7.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/lookup/crash7.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,9 @@ ++// PR c++/35323 ++// { dg-options "" } ++ ++void foo(int); ++ ++void bar() ++{ ++ foo(1r); // { dg-error "unnamed-fixed" } ++} +Index: gcc/testsuite/g++.dg/gomp/pr34964.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr34964.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr34964.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,6 @@ ++// PR c++/34964 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++char x[] = 0; // { dg-error "initializer fails to determine size" } ++#pragma omp threadprivate (x) +Index: gcc/testsuite/g++.dg/gomp/pr35328.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35328.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35328.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,31 @@ ++// PR c++/35328 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++struct A ++{ ++ ~A ()(); // { dg-error "declared as function returning a function" } ++}; ++struct B ++{ ++ B ()(); // { dg-error "declared as function returning a function" } ++}; ++struct C ++{ ++ C (); ++ C (const C &)(); // { dg-error "declared as function returning a function" } ++}; ++ ++void ++foo () ++{ ++ A a; ++ B b; ++ C c; ++ #pragma omp parallel firstprivate (a) ++ ; ++ #pragma omp parallel private (b) ++ ; ++ #pragma omp parallel firstprivate (c) ++ ; ++} +Index: gcc/testsuite/g++.dg/gomp/pr35337.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35337.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35337.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,20 @@ ++// PR c++/35337 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++struct A { }; ++ ++void ++foo () ++{ ++#pragma omp parallel firstprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" } ++ ; ++} ++ ++void ++bar () ++{ ++#pragma omp for lastprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" } ++ for (int i = 0; i < 10; i++) ++ ; ++} +Index: gcc/testsuite/g++.dg/gomp/pr35244.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35244.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35244.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,30 @@ ++// PR c++/35244 ++// { dg-do compile } ++// { dg-require-effective-target tls_native } ++// { dg-options "-fopenmp" } ++ ++int v1; ++namespace N1 ++{ ++ int v2; ++} ++namespace N2 ++{ ++ int v3; ++} ++using N1::v2; ++using namespace N2; ++struct A; ++typedef int i; ++#pragma omp threadprivate (i) // { dg-error "is not file, namespace or block scope variable" } ++#pragma omp threadprivate (A) // { dg-error "is not file, namespace or block scope variable" } ++#pragma omp threadprivate (v1, v2, v3) ++ ++void foo () ++{ ++ static int v4; ++ { ++ static int v5; ++#pragma omp threadprivate (v4, v5) ++ } ++} +Index: gcc/testsuite/g++.dg/gomp/pr35078.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35078.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35078.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,20 @@ ++// PR c++/35078 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++template void ++foo () ++{ ++#pragma omp parallel for ++ for (int& i = 0; i < 10; ++i) // { dg-error "invalid type for iteration variable" } ++ ; ++} ++ ++void ++bar () ++{ ++ int j = 0; ++#pragma omp parallel for ++ for (int& i = j; i < 10; ++i) // { dg-error "invalid type for iteration variable" } ++ ; ++} +Index: gcc/testsuite/g++.dg/gomp/pr35099.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35099.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35099.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,39 @@ ++// PR middle-end/35099 ++// { dg-do compile } ++// { dg-options "-O2 -fopenmp" } ++ ++struct A ++{ ++ ~A () throw (); ++ void foo (); ++}; ++ ++struct B ++{ ++ B () { A ().foo (); } ++}; ++ ++void ++bar () ++{ ++#pragma omp parallel ++ { ++ #pragma omp single ++ B (); ++ #pragma omp for ++ for (int i = 0; i < 2; ++i) ++ B (); ++ } ++} ++ ++void ++baz () ++{ ++#pragma omp parallel ++ { ++ #pragma omp single ++ B (); ++ #pragma omp single ++ B (); ++ } ++} +Index: gcc/testsuite/g++.dg/gomp/pr35028.C +=================================================================== +--- gcc/testsuite/g++.dg/gomp/pr35028.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr35028.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,19 @@ ++// PR c++/35028 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++struct A ++{ ++ A (); ++ A (const A &, ...); ++ ~A (); ++ A operator++ (int); ++}; ++ ++void ++foo () ++{ ++ A a; ++ #pragma omp parallel firstprivate (a) ++ a++; ++} +Index: gcc/testsuite/g++.dg/inherit/override-attribs.C +=================================================================== +--- gcc/testsuite/g++.dg/inherit/override-attribs.C (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/g++.dg/inherit/override-attribs.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,5 +1,7 @@ + // PR c++/14688 +-// { dg-do compile { target i?86-*-* } } ++// { dg-do compile { target i?86-*-* x86_64-*-* } } ++// { dg-require-effective-target ilp32 } ++ + class one + { + public: +Index: gcc/testsuite/g++.dg/init/ref16.C +=================================================================== +--- gcc/testsuite/g++.dg/init/ref16.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/init/ref16.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,23 @@ ++// PR c++/35548 ++// { dg-do run } ++ ++int c; ++struct A ++{ ++ A() { ++c; } ++ A(const A&) { ++c; } ++ ~A() { --c; } ++}; ++ ++A f() ++{ ++ return A(); ++} ++ ++int i; ++const A* ap; ++int main() ++{ ++ const A& ar = i ? *ap : f(); ++ return (c == 0); ++} +Index: gcc/testsuite/g++.dg/torture/pr35526.C +=================================================================== +--- gcc/testsuite/g++.dg/torture/pr35526.C (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/g++.dg/torture/pr35526.C (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++ ++extern void *memcpy (void *__dest, __const void *__src, __SIZE_TYPE__ __n); ++ ++char internal_crash_read_ip[] = { 0xb8 }; ++ ++struct u_internal_crash_read_t ++{ ++ char ip[sizeof (internal_crash_read_ip)]; ++} ++u_internal_crash_read; ++ ++void ++gSignalHandler (int psignalNr, int pinfo, int pctx) ++{ ++ memcpy (u_internal_crash_read.ip, internal_crash_read_ip, ++ sizeof (internal_crash_read_ip)); ++} +Index: gcc/testsuite/lib/target-supports.exp +=================================================================== +--- gcc/testsuite/lib/target-supports.exp (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/lib/target-supports.exp (.../branches/gcc-4_3-branch) (revision 133808) +@@ -764,6 +764,29 @@ + }] + } + ++# Return 1 if the target supports executing SSE2 instructions, 0 ++# otherwise. Cache the result. ++ ++proc check_sse2_hw_available { } { ++ return [check_cached_effective_target sse2_hw_available { ++ # If this is not the right target then we can skip the test. ++ if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { ++ expr 0 ++ } else { ++ check_runtime_nocache sse2_hw_available { ++ #include "cpuid.h" ++ int main () ++ { ++ unsigned int eax, ebx, ecx, edx = 0; ++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)) ++ return !(edx & bit_SSE2); ++ return 1; ++ } ++ } "" ++ } ++ }] ++} ++ + # Return 1 if the target supports executing AltiVec instructions, 0 + # otherwise. Cache the result. + +Index: gcc/testsuite/gfortran.dg/allocate_zerosize_3.f +=================================================================== +--- gcc/testsuite/gfortran.dg/allocate_zerosize_3.f (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/allocate_zerosize_3.f (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,40 @@ ++C { dg-do run } ++C Test the fix for PR35698, in which the negative size dimension would ++C throw out the subsequent bounds. ++C ++C Contributed by Dick Hendrickson ++C ++ program try_lf0030 ++ call LF0030(10) ++ end ++ ++ SUBROUTINE LF0030(nf10) ++ INTEGER ILA1(7) ++ INTEGER ILA2(7) ++ LOGICAL LLA(:,:,:,:,:,:,:) ++ INTEGER ICA(7) ++ ALLOCATABLE LLA ++ ++ ++ ALLOCATE (LLA(2:3, 4, 0:5, ++ $ NF10:1, -2:7, -3:8, ++ $ -4:9)) ++ ++ ILA1 = LBOUND(LLA) ++ ILA2 = UBOUND(LLA) ++C CORRECT FOR THE ZERO DIMENSIONED TERM TO ALLOW AN EASIER VERIFY ++ ILA1(4) = ILA1(4) - 2 ! 1 - 2 = -1 ++ ILA2(4) = ILA2(4) + 6 ! 0 + 6 = 6 ++ ++ DO J1 = 1,7 ++ IVAL = 3-J1 ++ IF (ILA1(J1) .NE. IVAL) call abort () ++ 100 ENDDO ++ ++ DO J1 = 1,7 ++ IVAL = 2+J1 ++ IF (ILA2(J1) .NE. IVAL) call abort () ++ 101 ENDDO ++ ++ END SUBROUTINE ++ +\ No newline at end of file +Index: gcc/testsuite/gfortran.dg/null_3.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/null_3.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/null_3.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++! { dg-do compile } ++! This checks the fix for PR34813 in which the error at line 17 ++! was not detected. ++! ++! Contributed by Daniel Franke ++! ++SUBROUTINE kd_tree_init_default() ++ TYPE :: kd_tree_node ++ INTEGER :: dummy ++ END TYPE ++ ++ TYPE :: kd_tree ++ TYPE(kd_tree_node) :: root ++ END TYPE ++ ++ TYPE(kd_tree) :: tree ++ tree = kd_tree(null()) ! { dg-error "neither a POINTER nor ALLOCATABLE" } ++END SUBROUTINE +Index: gcc/testsuite/gfortran.dg/character_assign_1.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/character_assign_1.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/character_assign_1.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,17 @@ ++! { dg-do compile } ++! Tests the fix for PR35702, which caused an ICE because the types in the assignment ++! were not translated to be the same. ++! ++! Contributed by Dick Hendrickson ++! ++MODULE TESTS ++ TYPE UNSEQ ++ CHARACTER(1) :: C ++ END TYPE UNSEQ ++CONTAINS ++ SUBROUTINE CG0028 (TDA1L, TDA1R, nf0, nf1, nf2, nf3) ++ TYPE(UNSEQ) TDA1L(NF3) ++ TDA1L(NF1:NF2:NF1)%C = TDA1L(NF0+2:NF3:NF2/2)%C ++ END SUBROUTINE ++END MODULE TESTS ++! { dg-final { cleanup-modules "tests" } } +Index: gcc/testsuite/gfortran.dg/cshift_shift_real_2.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/cshift_shift_real_2.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/cshift_shift_real_2.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,8 @@ ++! { dg-do compile } ++! PR35724 Compile time segmentation fault for CSHIFT with negative third arg ++ SUBROUTINE RA0072(DDA,LDA,nf10,nf1,mf1,nf2) ++ REAL DDA(10,10) ++ LOGICAL LDA(10,10) ++ WHERE (LDA) DDA = CSHIFT(DDA,1,-MF1) ! MF1 works, -1 works ++ END SUBROUTINE ++ +Index: gcc/testsuite/gfortran.dg/namelist_45.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/namelist_45.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/namelist_45.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,18 @@ ++! { dg-do run } ++! PR35617 read namelist error with '!' ++program test ++ character(len=128) :: mhdpath ++ namelist /nbdrive_naml/ mhdpath ++ open(10, file='test.nml') ++ ++ write(10,'(a)') "&nbdrive_naml" ++ write(10,'(a)') ++ write(10,'(a)') "!nstep_stop = 2 ! uncomment to bar" ++ write(10,'(a)') "!nstep_start = 2 ! uncomment to foo" ++ write(10,'(a)') " mhdpath = 'mypath.dat'" ++ write(10,'(a)') "/" ++ ++ rewind(10) ++ read(10, nbdrive_naml) ++ close(10,status="delete") ++end program test +Index: gcc/testsuite/gfortran.dg/namelist_46.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/namelist_46.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/namelist_46.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,23 @@ ++! { dg-do run } ++! PR35627 Namelist read problem with short logical followed by read real ++program test ++ implicit none ++ LOGICAL :: nlco(200) ! (1:nbeam) ++ REAL(kind=8):: xlbtna(200) ! (1:nbeam) ++ NAMELIST/nbdrive_naml/ nlco, xlbtna ++ INTEGER :: nbshapa(200) ! (1:nbeam) ++ NAMELIST/nbdrive_naml/ nbshapa ++ nlco = .false. ++ xlbtna = 0.0_8 ++ nbshapa = 0 ++ open(10, file='t.nml') ++ write(10,'(a)') "&nbdrive_naml" ++ write(10,'(a)') "nlco = 4*T," ++ write(10,'(a)') "xlbtna = 802.8, 802.8, 802.8, 802.8" ++ write(10,'(a)') "nbshapa = 4*1" ++ write(10,'(a)') "/" ++ rewind(10) ++ read(10, nbdrive_naml) ++ !write(*,nbdrive_naml) ++ close(10, status="delete") ++end program test +Index: gcc/testsuite/gfortran.dg/module_commons_2.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/module_commons_2.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/module_commons_2.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,21 @@ ++! { dg-do compile } ++! Tests the fix for PR35474, in which the PRIVATE statement would ++! cause the error Internal Error at (1): free_pi_tree(): Unresolved fixup ++! This arose because the symbol for 'i' emanating from the COMMON was ++! not being fixed-up as the EQUIVALENCE was built. ++! ++! Contributed by FX Coudert ++! ++module h5global ++ integer i ++ integer j ++ common /c/ i ++ equivalence (i, j) ++ private ++end module h5global ++ ++program bug ++ use h5global ++end ++ ++! { dg-final { cleanup-modules "h5global" } } +Index: gcc/testsuite/gfortran.dg/transpose_conjg_1.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/transpose_conjg_1.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/transpose_conjg_1.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,37 @@ ++! { dg-do run } ++! Tests the fix for PR35740, where the trick of interchanging the descriptor ++! dimensions to implement TRANSPOSE did not work if it is an argument of ++! an elemental function - eg. CONJG. The fix forces a library call for such ++! cases. During the diagnosis of the PR, it was found that the scalarizer was ++! completely thrown if the argument of TRANSPOSE was a non-variable ++! expression; eg a + c below. This is also fixed by the library call. ++! ++! Contributed by Dominik Muth ++! ++program main ++ implicit none ++ complex, dimension(2,2) :: a,b,c,d ++ a(1,1) = (1.,1.) ++ a(2,1) = (2.,2.) ++ a(1,2) = (3.,3.) ++ a(2,2) = (4.,4.) ++! ++ b = a ++ b = conjg(transpose(b)) ++ d = a ++ d = transpose(conjg(d)) ++ if (any (b /= d)) call abort () ++! ++ d = matmul (b, a ) ++ if (any (d /= matmul (transpose(conjg(a)), a))) call abort () ++ if (any (d /= matmul (conjg(transpose(a)), a))) call abort () ++! ++ c = (0.0,1.0) ++ b = conjg(transpose(a + c)) ++ d = transpose(conjg(a + c)) ++ if (any (b /= d)) call abort () ++! ++ d = matmul (b, a + c) ++ if (any (d /= matmul (transpose(conjg(a + c)), a + c))) call abort () ++ if (any (d /= matmul (conjg(transpose(a + c)), a + c))) call abort () ++ END program main +Index: gcc/testsuite/gfortran.dg/direct_io_10.f +=================================================================== +--- gcc/testsuite/gfortran.dg/direct_io_10.f (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/direct_io_10.f (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,46 @@ ++! { dg-do run } ++! pr35699 run-time abort writing zero sized section to direct access file ++ program directio ++ call qi0010 ( 10, 1, 2, 3, 4, 9, 2) ++ end ++ ++ subroutine qi0010 (nf10, nf1, nf2, nf3, nf4,nf9, np2) ++ character(10) bda(nf10) ++ character(10) bda1(nf10), bval ++ ++ integer j_len ++ bda1(1) = 'x' ++ do i = 2,10 ++ bda1(i) = 'x'//bda1(i-1) ++ enddo ++ bda = 'unread' ++ ++ inquire(iolength = j_len) bda1(nf1:nf10:nf2), bda1(nf4:nf3), ++ $ bda1(nf2:nf10:nf2) ++ ++ open (unit=48, ++ $ access='direct', ++ $ status='scratch', ++ $ recl = j_len, ++ $ iostat = istat, ++ $ form='unformatted', ++ $ action='readwrite') ++ ++ write (48,iostat = istat, rec = 3) bda1(nf1:nf10:nf2), ++ $ bda1(nf4:nf3), bda1(nf2:nf10:nf2) ++ if ( istat .ne. 0) then ++ call abort ++ endif ++ istat = -314 ++ ++ read (48,iostat = istat, rec = np2+1) bda(nf1:nf9:nf2), ++ $ bda(nf4:nf3), bda(nf2:nf10:nf2) ++ if ( istat .ne. 0) then ++ call abort ++ endif ++ ++ do j1 = 1,10 ++ bval = bda1(j1) ++ if (bda(j1) .ne. bval) call abort ++ enddo ++ end subroutine +Index: gcc/testsuite/gfortran.dg/module_function_type_1.f90 +=================================================================== +--- gcc/testsuite/gfortran.dg/module_function_type_1.f90 (.../tags/gcc_4_3_0_release) (revision 0) ++++ gcc/testsuite/gfortran.dg/module_function_type_1.f90 (.../branches/gcc-4_3-branch) (revision 133808) +@@ -0,0 +1,33 @@ ++! { dg-do compile } ++! This checks the fix for PR33295 in which the A_type in initA was ++! not promoted to module level and so not recognised as being the ++! same as that emanating directly from module a. ++! ++! Contributed by Janus Weil ++! ++module A ++ type A_type ++ real comp ++ end type ++end module A ++ ++module B ++contains ++ function initA() ++ use A ++ implicit none ++ type(A_type):: initA ++ initA%comp=1.0 ++ end function ++end module B ++ ++program C ++ use B ++ use A ++ implicit none ++ type(A_type):: A_var ++ A_var = initA() ++end program C ++ ++! { dg-final { cleanup-modules "A B" } } ++ +Index: gcc/testsuite/gfortran.dg/vect/vect.exp +=================================================================== +--- gcc/testsuite/gfortran.dg/vect/vect.exp (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/testsuite/gfortran.dg/vect/vect.exp (.../branches/gcc-4_3-branch) (revision 133808) +@@ -38,8 +38,18 @@ + # Skip these tests for targets that do not support generating vector + # code. Set additional target-dependent vector flags, which can be + # overridden by using dg-options in individual tests. +-if [istarget "powerpc*-*-*"] { +- # If there are powerpc targets to skip, do it here. ++if [istarget "powerpc-*paired*"] { ++ lappend DEFAULT_VECTCFLAGS "-mpaired" ++ if [check_750cl_hw_available] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } ++} elseif [istarget "powerpc*-*-*"] { ++ # Skip targets not supporting -maltivec. ++ if ![is-effective-target powerpc_altivec_ok] { ++ return ++ } + + lappend DEFAULT_VECTCFLAGS "-maltivec" + if [check_vmx_hw_available] { +@@ -47,20 +57,38 @@ + } else { + if [is-effective-target ilp32] { + # Specify a cpu that supports VMX for compile-only tests. +- lappend DEFAULT_VECTCFLAGS "-mcpu=7400" ++ lappend DEFAULT_VECTCFLAGS "-mcpu=970" + } + set dg-do-what-default compile + } ++} elseif { [istarget "spu-*-*"] } { ++ set dg-do-what-default run + } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { + lappend DEFAULT_VECTCFLAGS "-msse2" +- set dg-do-what-default run +-} elseif [istarget "mipsisa64*-*-*"] { ++ if [check_sse2_hw_available] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } ++} elseif { [istarget "mips*-*-*"] ++ && [check_effective_target_mpaired_single] ++ && [check_effective_target_nomips16] } { + lappend DEFAULT_VECTCFLAGS "-mpaired-single" + set dg-do-what-default run + } elseif [istarget "sparc*-*-*"] { + lappend DEFAULT_VECTCFLAGS "-mcpu=ultrasparc" "-mvis" +- set dg-do-what-default run ++ if [check_effective_target_ultrasparc_hw] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } elseif [istarget "alpha*-*-*"] { ++ # Alpha's vectorization capabilities are extremely limited. ++ # It's more effort than its worth disabling all of the tests ++ # that it cannot pass. But if you actually want to see what ++ # does work, command out the return. ++ return ++ + lappend DEFAULT_VECTCFLAGS "-mmax" + if [check_alpha_max_hw_available] { + set dg-do-what-default run +@@ -69,23 +97,17 @@ + } + } elseif [istarget "ia64-*-*"] { + set dg-do-what-default run ++} elseif [is-effective-target arm_neon_ok] { ++ lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp" ++ if [is-effective-target arm_neon_hw] { ++ set dg-do-what-default run ++ } else { ++ set dg-do-what-default compile ++ } + } else { + return + } + +-# Return 1 if the effective target is LP64 or if the effective target +-# does not support a vector alignment mechanism. +- +-proc check_effective_target_lp64_or_vect_no_align { } { +- if { [is-effective-target lp64] +- || [is-effective-target vect_no_align] } { +- set answer 1 +- } else { +- set answer 0 +- } +- return $answer +-} +- + # Initialize `dg'. + dg-init + +Index: gcc/cp/typeck.c +=================================================================== +--- gcc/cp/typeck.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/typeck.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -962,6 +962,8 @@ + if (TREE_CODE (t1) != ARRAY_TYPE + && TYPE_QUALS (t1) != TYPE_QUALS (t2)) + return false; ++ if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2)) ++ return false; + + /* Allow for two different type nodes which have essentially the same + definition. Note that we already checked for equality of the type +@@ -971,9 +973,6 @@ + && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) + return true; + +- if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2)) +- return false; +- + /* Compare the types. Break out if they could be the same. */ + switch (TREE_CODE (t1)) + { +Index: gcc/cp/decl.c +=================================================================== +--- gcc/cp/decl.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/decl.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3164,19 +3164,10 @@ + tree type, decl; + if (size > 0) + type = make_signed_type (size); +- else if (size == -1) +- { /* "__java_boolean". */ +- if ((TYPE_MODE (boolean_type_node) +- == smallest_mode_for_size (1, MODE_INT))) +- type = build_variant_type_copy (boolean_type_node); +- else +- /* ppc-darwin has SImode bool, make jboolean a 1-bit +- integer type without boolean semantics there. */ +- type = make_unsigned_type (1); +- } + else if (size > -32) +- { /* "__java_char". */ ++ { /* "__java_char" or ""__java_boolean". */ + type = make_unsigned_type (-size); ++ /*if (size == -1) TREE_SET_CODE (type, BOOLEAN_TYPE);*/ + } + else + { /* "__java_float" or ""__java_double". */ +Index: gcc/cp/call.c +=================================================================== +--- gcc/cp/call.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/call.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1145,7 +1145,8 @@ + const and rvalue references to rvalues of compatible class type. */ + if (compatible_p + && (lvalue_p +- || ((CP_TYPE_CONST_NON_VOLATILE_P(to) || TYPE_REF_IS_RVALUE (rto)) ++ || (!(flags & LOOKUP_NO_TEMP_BIND) ++ && (CP_TYPE_CONST_NON_VOLATILE_P(to) || TYPE_REF_IS_RVALUE (rto)) + && CLASS_TYPE_P (from)))) + { + /* [dcl.init.ref] +Index: gcc/cp/error.c +=================================================================== +--- gcc/cp/error.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/error.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -326,6 +326,7 @@ + case BOOLEAN_TYPE: + case COMPLEX_TYPE: + case VECTOR_TYPE: ++ case FIXED_POINT_TYPE: + pp_type_specifier_seq (cxx_pp, t); + break; + +@@ -2079,7 +2080,17 @@ + case VEC_DELETE_EXPR: + case MODOP_EXPR: + case ABS_EXPR: ++ case CONJ_EXPR: + case VECTOR_CST: ++ case FIXED_CST: ++ case UNORDERED_EXPR: ++ case ORDERED_EXPR: ++ case UNLT_EXPR: ++ case UNLE_EXPR: ++ case UNGT_EXPR: ++ case UNGE_EXPR: ++ case UNEQ_EXPR: ++ case LTGT_EXPR: + pp_expression (cxx_pp, t); + break; + +Index: gcc/cp/ChangeLog +=================================================================== +--- gcc/cp/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,79 @@ ++2008-03-26 Jakub Jelinek ++ ++ PR c++/35546 ++ * pt.c (apply_late_template_attributes): Don't call tsubst on ++ first attribute argument if it is IDENTIFIER_NODE. ++ ++ PR c++/35332 ++ * error.c (dump_expr): Pass {,UN}ORDERED_EXPR, UN{LT,LE,GT,GE,EQ}_EXPR ++ and LTGT_EXPR to pp_expression. ++ ++2008-03-17 Jason Merrill ++ ++ PR c++/35548 ++ * call.c (reference_binding): Check LOOKUP_NO_TEMP_BIND when binding ++ a temp directly to a reference as per DR391. ++ ++2008-03-12 Richard Guenther ++ ++ PR c++/35469 ++ Revert: ++ 2008-02-04 Richard Guenther ++ ++ PR java/35035 ++ * decl.c (record_builtin_java_type): Make jboolean a ++ integer type again where its mode doesn't match that of bool. ++ ++ 2008-01-25 Richard Guenther ++ ++ PR c++/33887 ++ * decl.c (record_builtin_java_type): Make __java_boolean ++ a variant of bool. ++ * typeck.c (structural_comptypes): Move TYPE_FOR_JAVA check ++ after TYPE_MAIN_VARIANT check. ++ ++2008-03-10 Jakub Jelinek ++ ++ PR c++/35328 ++ * semantics.c (finish_omp_clauses): Look through NOP_EXPR even ++ if errorcount. ++ ++ PR c++/35337 ++ * semantics.c (finish_omp_clauses): Use %qD instead of %qE for ++ DECL_P in not a variable and appears more than once error messages. ++ ++2008-03-06 Jakub Jelinek ++ ++ PR c++/35028 ++ * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle vararg copy ctors. ++ ++ PR c++/34964 ++ PR c++/35244 ++ * semantics.c (finish_omp_threadprivate): Do nothing for error_operand_p ++ vars. Afterwards ensure v is VAR_DECL. ++ ++ PR c++/35078 ++ * parser.c (cp_parser_omp_for_loop): If DECL has REFERENCE_TYPE, don't ++ call cp_finish_decl. ++ * semantics.c (finish_omp_for): Fail if DECL doesn't have integral type ++ early. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35323 ++ * name-lookup.c (arg_assoc_type): Handle FIXED_POINT_TYPE. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35333 ++ * error.c (dump_expr): Handle CONJ_EXPR. ++ ++2008-03-06 Paolo Carlini ++ ++ PR c++/35338 ++ * error.c (dump_type): Handle FIXED_POINT_TYPE. ++ (dump_expr): Handle FIXED_CST. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: gcc/cp/cp-gimplify.c +=================================================================== +--- gcc/cp/cp-gimplify.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/cp-gimplify.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -844,7 +844,8 @@ + if (arg2) + argarray[i++] = p2; + /* Handle default arguments. */ +- for (parm = defparm; parm != void_list_node; parm = TREE_CHAIN (parm), i++) ++ for (parm = defparm; parm && parm != void_list_node; ++ parm = TREE_CHAIN (parm), i++) + argarray[i] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), fn, i); + t = build_call_a (fn, i, argarray); +@@ -875,7 +876,7 @@ + if (arg2) + argarray[i++] = build_fold_addr_expr (arg2); + /* Handle default arguments. */ +- for (parm = defparm; parm != void_list_node; ++ for (parm = defparm; parm && parm != void_list_node; + parm = TREE_CHAIN (parm), i++) + argarray[i] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), +Index: gcc/cp/pt.c +=================================================================== +--- gcc/cp/pt.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/pt.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -6717,9 +6717,29 @@ + { + *p = TREE_CHAIN (t); + TREE_CHAIN (t) = NULL_TREE; +- TREE_VALUE (t) +- = tsubst_expr (TREE_VALUE (t), args, complain, in_decl, +- /*integral_constant_expression_p=*/false); ++ /* If the first attribute argument is an identifier, don't ++ pass it through tsubst. Attributes like mode, format, ++ cleanup and several target specific attributes expect it ++ unmodified. */ ++ if (TREE_VALUE (t) ++ && TREE_CODE (TREE_VALUE (t)) == TREE_LIST ++ && TREE_VALUE (TREE_VALUE (t)) ++ && (TREE_CODE (TREE_VALUE (TREE_VALUE (t))) ++ == IDENTIFIER_NODE)) ++ { ++ tree chain ++ = tsubst_expr (TREE_CHAIN (TREE_VALUE (t)), args, complain, ++ in_decl, ++ /*integral_constant_expression_p=*/false); ++ if (chain != TREE_CHAIN (TREE_VALUE (t))) ++ TREE_VALUE (t) ++ = tree_cons (NULL_TREE, TREE_VALUE (TREE_VALUE (t)), ++ chain); ++ } ++ else ++ TREE_VALUE (t) ++ = tsubst_expr (TREE_VALUE (t), args, complain, in_decl, ++ /*integral_constant_expression_p=*/false); + *q = t; + q = &TREE_CHAIN (t); + } +Index: gcc/cp/semantics.c +=================================================================== +--- gcc/cp/semantics.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/semantics.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3400,13 +3400,16 @@ + { + if (processing_template_decl) + break; +- error ("%qE is not a variable in clause %", t); ++ if (DECL_P (t)) ++ error ("%qD is not a variable in clause %", t); ++ else ++ error ("%qE is not a variable in clause %", t); + remove = true; + } + else if (bitmap_bit_p (&generic_head, DECL_UID (t)) + || bitmap_bit_p (&firstprivate_head, DECL_UID (t))) + { +- error ("%qE appears more than once in data clauses", t); ++ error ("%qD appears more than once in data clauses", t); + remove = true; + } + else +@@ -3419,13 +3422,16 @@ + { + if (processing_template_decl) + break; +- error ("%qE is not a variable in clause %", t); ++ if (DECL_P (t)) ++ error ("%qD is not a variable in clause %", t); ++ else ++ error ("%qE is not a variable in clause %", t); + remove = true; + } + else if (bitmap_bit_p (&generic_head, DECL_UID (t)) + || bitmap_bit_p (&lastprivate_head, DECL_UID (t))) + { +- error ("%qE appears more than once in data clauses", t); ++ error ("%qD appears more than once in data clauses", t); + remove = true; + } + else +@@ -3661,7 +3667,7 @@ + complete_ctor_identifier, + t, inner_type, LOOKUP_NORMAL); + +- if (targetm.cxx.cdtor_returns_this ()) ++ if (targetm.cxx.cdtor_returns_this () || errorcount) + /* Because constructors and destructors return this, + the call will have been cast to "void". Remove the + cast here. We would like to use STRIP_NOPS, but it +@@ -3683,7 +3689,7 @@ + t = build_special_member_call (t, complete_dtor_identifier, + NULL, inner_type, LOOKUP_NORMAL); + +- if (targetm.cxx.cdtor_returns_this ()) ++ if (targetm.cxx.cdtor_returns_this () || errorcount) + /* Because constructors and destructors return this, + the call will have been cast to "void". Remove the + cast here. We would like to use STRIP_NOPS, but it +@@ -3742,9 +3748,14 @@ + { + tree v = TREE_PURPOSE (t); + ++ if (error_operand_p (v)) ++ ; ++ else if (TREE_CODE (v) != VAR_DECL) ++ error ("% %qD is not file, namespace " ++ "or block scope variable", v); + /* If V had already been marked threadprivate, it doesn't matter + whether it had been used prior to this point. */ +- if (TREE_USED (v) ++ else if (TREE_USED (v) + && (DECL_LANG_SPECIFIC (v) == NULL + || !CP_DECL_THREADPRIVATE_P (v))) + error ("%qE declared % after first use", v); +@@ -3903,6 +3914,16 @@ + return NULL; + } + ++ if (!INTEGRAL_TYPE_P (TREE_TYPE (decl))) ++ { ++ location_t elocus = locus; ++ ++ if (EXPR_HAS_LOCATION (init)) ++ elocus = EXPR_LOCATION (init); ++ error ("%Hinvalid type for iteration variable %qE", &elocus, decl); ++ return NULL; ++ } ++ + if (pre_body == NULL || IS_EMPTY_STMT (pre_body)) + pre_body = NULL; + else if (! processing_template_decl) +Index: gcc/cp/name-lookup.c +=================================================================== +--- gcc/cp/name-lookup.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/name-lookup.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,5 +1,5 @@ + /* Definitions for C++ name lookup routines. +- Copyright (C) 2003, 2004, 2005, 2006, 2007 ++ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. + Contributed by Gabriel Dos Reis + +@@ -4594,6 +4594,7 @@ + case COMPLEX_TYPE: + case VECTOR_TYPE: + case BOOLEAN_TYPE: ++ case FIXED_POINT_TYPE: + return false; + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (type)) +Index: gcc/cp/parser.c +=================================================================== +--- gcc/cp/parser.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cp/parser.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -20074,8 +20074,11 @@ + + init = cp_parser_assignment_expression (parser, false); + +- cp_finish_decl (decl, NULL_TREE, /*init_const_expr_p=*/false, +- asm_specification, LOOKUP_ONLYCONVERTING); ++ if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE) ++ init = error_mark_node; ++ else ++ cp_finish_decl (decl, NULL_TREE, /*init_const_expr_p=*/false, ++ asm_specification, LOOKUP_ONLYCONVERTING); + + if (pushed_scope) + pop_scope (pushed_scope); +Index: gcc/tree-ssa-ccp.c +=================================================================== +--- gcc/tree-ssa-ccp.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/tree-ssa-ccp.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1584,7 +1584,8 @@ + is the desired result type. */ + + static tree +-maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type) ++maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type, ++ bool allow_negative_idx) + { + tree min_idx, idx, idx_type, elt_offset = integer_zero_node; + tree array_type, elt_type, elt_size; +@@ -1684,11 +1685,15 @@ + idx = fold_convert (idx_type, idx); + + /* We don't want to construct access past array bounds. For example +- char *(c[4]); +- +- c[3][2]; should not be simplified into (*c)[14] or tree-vrp will give false +- warning. */ +- if (domain_type && TYPE_MAX_VALUE (domain_type) ++ char *(c[4]); ++ c[3][2]; ++ should not be simplified into (*c)[14] or tree-vrp will ++ give false warnings. The same is true for ++ struct A { long x; char d[0]; } *a; ++ (char *)a - 4; ++ which should be not folded to &a->d[-8]. */ ++ if (domain_type ++ && TYPE_MAX_VALUE (domain_type) + && TREE_CODE (TYPE_MAX_VALUE (domain_type)) == INTEGER_CST) + { + tree up_bound = TYPE_MAX_VALUE (domain_type); +@@ -1700,6 +1705,17 @@ + && compare_tree_int (up_bound, 1) > 0) + return NULL_TREE; + } ++ if (domain_type ++ && TYPE_MIN_VALUE (domain_type)) ++ { ++ if (!allow_negative_idx ++ && TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST ++ && tree_int_cst_lt (idx, TYPE_MIN_VALUE (domain_type))) ++ return NULL_TREE; ++ } ++ else if (!allow_negative_idx ++ && compare_tree_int (idx, 0) < 0) ++ return NULL_TREE; + + return build4 (ARRAY_REF, elt_type, base, idx, NULL_TREE, NULL_TREE); + } +@@ -1796,7 +1812,8 @@ + new_base = build3 (COMPONENT_REF, field_type, new_base, f, NULL_TREE); + + /* Recurse to possibly find the match. */ +- ret = maybe_fold_offset_to_array_ref (new_base, t, orig_type); ++ ret = maybe_fold_offset_to_array_ref (new_base, t, orig_type, ++ f == TYPE_FIELDS (record_type)); + if (ret) + return ret; + ret = maybe_fold_offset_to_component_ref (field_type, new_base, t, +@@ -1818,7 +1835,8 @@ + base = build1 (INDIRECT_REF, record_type, base); + base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE); + +- t = maybe_fold_offset_to_array_ref (base, offset, orig_type); ++ t = maybe_fold_offset_to_array_ref (base, offset, orig_type, ++ f == TYPE_FIELDS (record_type)); + if (t) + return t; + return maybe_fold_offset_to_component_ref (field_type, base, offset, +@@ -1884,7 +1902,7 @@ + { + if (base_is_ptr) + base = build1 (INDIRECT_REF, type, base); +- ret = maybe_fold_offset_to_array_ref (base, offset, orig_type); ++ ret = maybe_fold_offset_to_array_ref (base, offset, orig_type, true); + } + return ret; + } +@@ -2061,7 +2079,7 @@ + ptd_type = TREE_TYPE (ptr_type); + + /* At which point we can try some of the same things as for indirects. */ +- t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type); ++ t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type, true); + if (!t) + t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1, + ptd_type, false); +Index: gcc/dbxout.c +=================================================================== +--- gcc/dbxout.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/dbxout.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -2332,6 +2332,15 @@ + switch (TREE_CODE (expr)) + { + case VAR_DECL: ++ /* We can't handle emulated tls variables, because the address is an ++ offset to the return value of __emutls_get_address, and there is no ++ way to express that in stabs. Also, there are name mangling issues ++ here. We end up with references to undefined symbols if we don't ++ disable debug info for these variables. */ ++ if (!targetm.have_tls && DECL_THREAD_LOCAL_P (expr)) ++ return NULL; ++ /* FALLTHRU */ ++ + case PARM_DECL: + if (DECL_HAS_VALUE_EXPR_P (expr)) + return dbxout_expand_expr (DECL_VALUE_EXPR (expr)); +Index: gcc/gcov-io.h +=================================================================== +--- gcc/gcov-io.h (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/gcov-io.h (.../branches/gcc-4_3-branch) (revision 133808) +@@ -467,6 +467,9 @@ + consecutive values. */ + extern void __gcov_merge_delta (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; + ++/* The merge function that just ors the counters together. */ ++extern void __gcov_merge_ior (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; ++ + /* The profiler functions. */ + extern void __gcov_interval_profiler (gcov_type *, gcov_type, int, unsigned); + extern void __gcov_pow2_profiler (gcov_type *, gcov_type); +@@ -474,11 +477,10 @@ + extern void __gcov_indirect_call_profiler (gcov_type *, gcov_type, void *, void *); + extern void __gcov_average_profiler (gcov_type *, gcov_type); + extern void __gcov_ior_profiler (gcov_type *, gcov_type); +-extern void __gcov_merge_ior (gcov_type *, unsigned); + + #ifndef inhibit_libc + /* The wrappers around some library functions.. */ +-extern pid_t __gcov_fork (void); ++extern pid_t __gcov_fork (void) ATTRIBUTE_HIDDEN; + extern int __gcov_execl (const char *, const char *, ...) ATTRIBUTE_HIDDEN; + extern int __gcov_execlp (const char *, const char *, ...) ATTRIBUTE_HIDDEN; + extern int __gcov_execle (const char *, const char *, ...) ATTRIBUTE_HIDDEN; +Index: gcc/cse.c +=================================================================== +--- gcc/cse.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/cse.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -4753,6 +4753,23 @@ + src_elt_cost = MAX_COST; + } + ++ /* Avoid creation of overlapping memory moves. */ ++ if (MEM_P (trial) && MEM_P (SET_DEST (sets[i].rtl))) ++ { ++ rtx src, dest; ++ ++ /* BLKmode moves are not handled by cse anyway. */ ++ if (GET_MODE (trial) == BLKmode) ++ break; ++ ++ src = canon_rtx (trial); ++ dest = canon_rtx (SET_DEST (sets[i].rtl)); ++ ++ if (!MEM_P (src) || !MEM_P (dest) ++ || !nonoverlapping_memrefs_p (src, dest)) ++ break; ++ } ++ + /* We don't normally have an insn matching (set (pc) (pc)), so + check for this separately here. We will delete such an + insn below. +@@ -5975,6 +5992,21 @@ + int no_conflict = 0; + + bb = ebb_data->path[path_entry].bb; ++ ++ /* Invalidate recorded information for eh regs if there is an EH ++ edge pointing to that bb. */ ++ if (bb_has_eh_pred (bb)) ++ { ++ struct df_ref **def_rec; ++ ++ for (def_rec = df_get_artificial_defs (bb->index); *def_rec; def_rec++) ++ { ++ struct df_ref *def = *def_rec; ++ if (DF_REF_FLAGS (def) & DF_REF_AT_TOP) ++ invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def))); ++ } ++ } ++ + FOR_BB_INSNS (bb, insn) + { + /* If we have processed 1,000 insns, flush the hash table to +Index: gcc/ifcvt.c +=================================================================== +--- gcc/ifcvt.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/ifcvt.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1737,6 +1737,10 @@ + rtx cond, earliest, target, seq, a, b, c; + int negate; + ++ /* Reject modes with signed zeros. */ ++ if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x))) ++ return FALSE; ++ + /* Recognize A and B as constituting an ABS or NABS. The canonical + form is a branch around the negation, taken when the object is the + first operand of a comparison against 0 that evaluates to true. */ +Index: gcc/expr.c +=================================================================== +--- gcc/expr.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/expr.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -4654,7 +4654,8 @@ + temp = convert_to_mode (GET_MODE (target), temp, unsignedp); + emit_move_insn (target, temp); + } +- else if (GET_MODE (target) == BLKmode) ++ else if (GET_MODE (target) == BLKmode ++ || GET_MODE (temp) == BLKmode) + emit_block_move (target, temp, expr_size (exp), + (call_param_p + ? BLOCK_OP_CALL_PARM +Index: gcc/ada/env.c +=================================================================== +--- gcc/ada/env.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/ada/env.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -41,10 +41,6 @@ + #include + #endif + +-#if defined (__APPLE__) +-#include +-#endif +- + #if defined (__MINGW32__) + #include + #endif +@@ -61,6 +57,10 @@ + #include "system.h" + #endif /* IN_RTS */ + ++#if defined (__APPLE__) ++#include ++#endif ++ + #include "env.h" + + void +@@ -166,7 +166,7 @@ + LIB$SIGNAL (status); + } + +-#elif defined (__vxworks) && defined (__RTP__) ++#elif (defined (__vxworks) && defined (__RTP__)) || defined (__APPLE__) + setenv (name, value, 1); + + #else +@@ -178,7 +178,7 @@ + sprintf (expression, "%s=%s", name, value); + putenv (expression); + #if (defined (__FreeBSD__) && (__FreeBSD__ < 7)) \ +- || defined (__APPLE__) || defined (__MINGW32__) \ ++ || defined (__MINGW32__) \ + ||(defined (__vxworks) && ! defined (__RTP__)) + /* On some systems like FreeBSD 6.x and earlier, MacOS X and Windows, + putenv is making a copy of the expression string so we can free +Index: gcc/ada/ChangeLog +=================================================================== +--- gcc/ada/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/ada/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,14 @@ ++2008-04-01 John David Anglin ++ ++ PR ada/33857 ++ * env.c: Always include crt_externs.h if __APPLE__ is defined. ++ (__gnat_setenv): Use setenv instead of putenv if __APPLE__ is defined. ++ ++2008-03-31 Eric Botcazou ++ ++ * decl.c (gnat_to_gnu_entity) : Do not force a non-null ++ size if it has overflowed. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: gcc/ada/decl.c +=================================================================== +--- gcc/ada/decl.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/ada/decl.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -636,8 +636,12 @@ + clause, as we would lose useful information on the view size + (e.g. for null array slices) and we are not allocating the object + here anyway. */ +- if (((gnu_size && integer_zerop (gnu_size)) +- || (TYPE_SIZE (gnu_type) && integer_zerop (TYPE_SIZE (gnu_type)))) ++ if (((gnu_size ++ && integer_zerop (gnu_size) ++ && !TREE_OVERFLOW (gnu_size)) ++ || (TYPE_SIZE (gnu_type) ++ && integer_zerop (TYPE_SIZE (gnu_type)) ++ && !TREE_OVERFLOW (TYPE_SIZE (gnu_type)))) + && (!Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity)) + || !Is_Array_Type (Etype (gnat_entity))) + && !Present (Renamed_Object (gnat_entity)) +Index: gcc/fortran/trans-array.c +=================================================================== +--- gcc/fortran/trans-array.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/trans-array.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -3490,7 +3490,7 @@ + size = 1 - lbound; + a.ubound[n] = specified_upper_bound; + a.stride[n] = stride; +- size = ubound + size; //size = ubound + 1 - lbound ++ size = siz >= 0 ? ubound + size : 0; //size = ubound + 1 - lbound + stride = stride * size; + } + return (stride); +@@ -3590,6 +3590,9 @@ + else + or_expr = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, or_expr, cond); + ++ size = fold_build3 (COND_EXPR, gfc_array_index_type, cond, ++ gfc_index_zero_node, size); ++ + /* Multiply the stride by the number of elements in this dimension. */ + stride = fold_build2 (MULT_EXPR, gfc_array_index_type, stride, size); + stride = gfc_evaluate_now (stride, pblock); +Index: gcc/fortran/trans-expr.c +=================================================================== +--- gcc/fortran/trans-expr.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/trans-expr.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -2844,7 +2844,9 @@ + dsc = gfc_to_single_character (dlen, dest); + + +- if (dsc != NULL_TREE && ssc != NULL_TREE) ++ /* Assign directly if the types are compatible. */ ++ if (dsc != NULL_TREE && ssc != NULL_TREE ++ && TREE_TYPE (dsc) == TREE_TYPE (ssc)) + { + gfc_add_modify_expr (block, dsc, ssc); + return; +Index: gcc/fortran/Make-lang.in +=================================================================== +--- gcc/fortran/Make-lang.in (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/Make-lang.in (.../branches/gcc-4_3-branch) (revision 133808) +@@ -149,7 +149,7 @@ + $(srcdir)/fortran/intrinsic.texi \ + $(srcdir)/fortran/invoke.texi \ + $(srcdir)/doc/include/fdl.texi \ +- $(srcdir)/doc/include/gpl.texi \ ++ $(srcdir)/doc/include/gpl_v3.texi \ + $(srcdir)/doc/include/funding.texi \ + $(srcdir)/doc/include/gcc-common.texi \ + gcc-vers.texi +Index: gcc/fortran/ChangeLog +=================================================================== +--- gcc/fortran/ChangeLog (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/ChangeLog (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,3 +1,49 @@ ++2008-04-01 Joseph Myers ++ ++ * gfortran.texi: Include gpl_v3.texi instead of gpl.texi ++ * Make-lang.in (GFORTRAN_TEXI): Include gpl_v3.texi instead of ++ gpl.texi. ++ ++2008-03-30 Paul Thomas ++ ++ PR fortran/35740 ++ * resolve.c (resolve_function, resolve_call): If the procedure ++ is elemental do not look for noncopying intrinsics. ++ ++2008-03-29 Paul Thomas ++ ++ PR fortran/35698 ++ * trans-array.c (gfc_array_init_size): Set 'size' zero if ++ negative in one dimension. ++ ++ PR fortran/35702 ++ * trans-expr.c (gfc_trans_string_copy): Only assign a char ++ directly if the lhs and rhs types are the same. ++ ++2008-03-27 Jerry DeLisle ++ ++ PR fortran/35724 ++ * iresolve.c (gfc_resolve_cshift): Check for NULL symtree in ++ test for optional argument attribute. ++ ++2008-03-24 Paul Thomas ++ ++ PR fortran/34813 ++ * resolve.c (resolve_structure_cons): It is an error to assign ++ NULL to anything other than a pointer or allocatable component. ++ ++ PR fortran/33295 ++ * resolve.c (resolve_symbol): If the symbol is a derived type, ++ resolve the derived type. If the symbol is a derived type ++ function, ensure that the derived type is visible in the same ++ namespace as the function. ++ ++2008-03-14 Paul Thomas ++ ++ PR fortran/35474 ++ * module.c (mio_symtree_ref): After providing a symbol for a ++ missing equivalence member, resolve and NULL the fixups. ++ + 2008-03-05 Release Manager + + * GCC 4.3.0 released. +Index: gcc/fortran/module.c +=================================================================== +--- gcc/fortran/module.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/module.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -2310,6 +2310,12 @@ + p->u.rsym.symtree->n.sym = p->u.rsym.sym; + p->u.rsym.symtree->n.sym->refs++; + p->u.rsym.referenced = 1; ++ ++ /* If the symbol is PRIVATE and in COMMON, load_commons will ++ generate a fixup symbol, which must be associated. */ ++ if (p->fixup) ++ resolve_fixups (p->fixup, p->u.rsym.sym); ++ p->fixup = NULL; + } + + if (p->type == P_UNKNOWN) +Index: gcc/fortran/resolve.c +=================================================================== +--- gcc/fortran/resolve.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/resolve.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -827,6 +827,16 @@ + t = gfc_convert_type (cons->expr, &comp->ts, 1); + } + ++ if (cons->expr->expr_type == EXPR_NULL ++ && !(comp->pointer || comp->allocatable)) ++ { ++ t = FAILURE; ++ gfc_error ("The NULL in the derived type constructor at %L is " ++ "being applied to component '%s', which is neither " ++ "a POINTER nor ALLOCATABLE", &cons->expr->where, ++ comp->name); ++ } ++ + if (!comp->pointer || cons->expr->expr_type == EXPR_NULL) + continue; + +@@ -2365,7 +2375,12 @@ + gfc_expr_set_symbols_referenced (expr->ts.cl->length); + } + +- if (t == SUCCESS) ++ if (t == SUCCESS ++ && !((expr->value.function.esym ++ && expr->value.function.esym->attr.elemental) ++ || ++ (expr->value.function.isym ++ && expr->value.function.isym->elemental))) + find_noncopying_intrinsics (expr->value.function.esym, + expr->value.function.actual); + +@@ -2836,7 +2851,7 @@ + if (resolve_elemental_actual (NULL, c) == FAILURE) + return FAILURE; + +- if (t == SUCCESS) ++ if (t == SUCCESS && !(c->resolved_sym && c->resolved_sym->attr.elemental)) + find_noncopying_intrinsics (c->resolved_sym, c->ext.actual); + return t; + } +@@ -7974,6 +7989,29 @@ + return; + } + ++ /* Make sure that the derived type has been resolved and that the ++ derived type is visible in the symbol's namespace, if it is a ++ module function and is not PRIVATE. */ ++ if (sym->ts.type == BT_DERIVED ++ && sym->ts.derived->attr.use_assoc ++ && sym->ns->proc_name->attr.flavor == FL_MODULE) ++ { ++ gfc_symbol *ds; ++ ++ if (resolve_fl_derived (sym->ts.derived) == FAILURE) ++ return; ++ ++ gfc_find_symbol (sym->ts.derived->name, sym->ns, 1, &ds); ++ if (!ds && sym->attr.function ++ && gfc_check_access (sym->attr.access, sym->ns->default_access)) ++ { ++ symtree = gfc_new_symtree (&sym->ns->sym_root, ++ sym->ts.derived->name); ++ symtree->n.sym = sym->ts.derived; ++ sym->ts.derived->refs++; ++ } ++ } ++ + /* Unless the derived-type declaration is use associated, Fortran 95 + does not allow public entries of private derived types. + See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation +Index: gcc/fortran/iresolve.c +=================================================================== +--- gcc/fortran/iresolve.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/fortran/iresolve.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -592,7 +592,8 @@ + + if (dim != NULL) + { +- if (dim->expr_type != EXPR_CONSTANT && dim->symtree->n.sym->attr.optional) ++ if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL ++ && dim->symtree->n.sym->attr.optional) + { + /* Mark this for later setting the type in gfc_conv_missing_dummy. */ + dim->representation.length = shift->ts.kind; +Index: gcc/BASE-VER +=================================================================== +--- gcc/BASE-VER (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/BASE-VER (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1 +1 @@ +-4.3.0 ++4.3.1 +Index: gcc/alias.c +=================================================================== +--- gcc/alias.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/alias.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -164,7 +164,6 @@ + static bool nonoverlapping_component_refs_p (const_tree, const_tree); + static tree decl_for_component_ref (tree); + static rtx adjust_offset_for_component_ref (tree, rtx); +-static int nonoverlapping_memrefs_p (const_rtx, const_rtx); + static int write_dependence_p (const_rtx, const_rtx, int); + + static void memory_modified_1 (rtx, const_rtx, void *); +@@ -1976,7 +1975,7 @@ + /* Return nonzero if we can determine the exprs corresponding to memrefs + X and Y and they do not overlap. */ + +-static int ++int + nonoverlapping_memrefs_p (const_rtx x, const_rtx y) + { + tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y); +Index: gcc/alias.h +=================================================================== +--- gcc/alias.h (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/alias.h (.../branches/gcc-4_3-branch) (revision 133808) +@@ -28,6 +28,7 @@ + extern alias_set_type get_frame_alias_set (void); + extern bool component_uses_parent_alias_set (const_tree); + extern bool alias_set_subset_of (alias_set_type, alias_set_type); ++extern int nonoverlapping_memrefs_p (const_rtx, const_rtx); + + /* This alias set can be used to force a memory to conflict with all + other memories, creating a barrier across which no memory reference +Index: gcc/gimplify.c +=================================================================== +--- gcc/gimplify.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/gimplify.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -5464,7 +5464,11 @@ + expr = TREE_OPERAND (expr, 0); + addr = TREE_OPERAND (addr, 0); + } +- return expr == addr; ++ if (expr == addr) ++ return true; ++ return (TREE_CODE (addr) == ADDR_EXPR ++ && TREE_CODE (expr) == ADDR_EXPR ++ && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0)); + } + if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0)) + return true; +@@ -6018,12 +6022,18 @@ + + case OMP_RETURN: + case OMP_CONTINUE: +- case OMP_ATOMIC_LOAD: +- case OMP_ATOMIC_STORE: +- ++ case OMP_ATOMIC_STORE: + ret = GS_ALL_DONE; + break; + ++ case OMP_ATOMIC_LOAD: ++ if (gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, NULL, ++ is_gimple_val, fb_rvalue) != GS_ALL_DONE) ++ ret = GS_ERROR; ++ else ++ ret = GS_ALL_DONE; ++ break; ++ + case POINTER_PLUS_EXPR: + /* Convert ((type *)A)+offset into &A->field_of_type_and_offset. + The second is gimple immediate saving a need for extra statement. +Index: gcc/calls.c +=================================================================== +--- gcc/calls.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/calls.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -2326,7 +2326,7 @@ + int save_pending_stack_adjust = 0; + int save_stack_pointer_delta = 0; + rtx insns; +- rtx before_call, next_arg_reg; ++ rtx before_call, next_arg_reg, after_args; + + if (pass == 0) + { +@@ -2756,6 +2756,7 @@ + use_reg (&call_fusage, struct_value); + } + ++ after_args = get_last_insn (); + funexp = prepare_call_address (funexp, static_chain_value, + &call_fusage, reg_parm_seen, pass == 0); + +@@ -2790,6 +2791,13 @@ + next_arg_reg, valreg, old_inhibit_defer_pop, call_fusage, + flags, & args_so_far); + ++ /* If the call setup or the call itself overlaps with anything ++ of the argument setup we probably clobbered our call address. ++ In that case we can't do sibcalls. */ ++ if (pass == 0 ++ && check_sibcall_argument_overlap (after_args, 0, 0)) ++ sibcall_failure = 1; ++ + /* If a non-BLKmode value is returned at the most significant end + of a register, shift the register right by the appropriate amount + and update VALREG accordingly. BLKmode values are handled by the +Index: gcc/expmed.c +=================================================================== +--- gcc/expmed.c (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/expmed.c (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1339,18 +1339,15 @@ + || (offset * BITS_PER_UNIT % bitsize == 0 + && MEM_ALIGN (op0) % bitsize == 0))))) + { +- if (mode1 != GET_MODE (op0)) ++ if (MEM_P (op0)) ++ op0 = adjust_address (op0, mode1, offset); ++ else if (mode1 != GET_MODE (op0)) + { +- if (MEM_P (op0)) +- op0 = adjust_address (op0, mode1, offset); +- else +- { +- rtx sub = simplify_gen_subreg (mode1, op0, GET_MODE (op0), +- byte_offset); +- if (sub == NULL) +- goto no_subreg_mode_swap; +- op0 = sub; +- } ++ rtx sub = simplify_gen_subreg (mode1, op0, GET_MODE (op0), ++ byte_offset); ++ if (sub == NULL) ++ goto no_subreg_mode_swap; ++ op0 = sub; + } + if (mode1 != mode) + return convert_to_mode (tmode, op0, unsignedp); +Index: gcc/po/ca.po +=================================================================== +--- gcc/po/ca.po (.../tags/gcc_4_3_0_release) (revision 133808) ++++ gcc/po/ca.po (.../branches/gcc-4_3-branch) (revision 133808) +@@ -1,37932 +0,0 @@ +-# translation of gcc-3.4.3-ca.po to Catalan +-# Catalan translation of gcc. +-# Copyright (C) 2004 Free Software Foundation, Inc. +-# This file is distributed under the same license as the gcc package. +-# Gilles MATEU , 2002. +-# Gilles MATEU , 2003. +-# Gilles MATEU , 2004. +-# Jordi Mas i Hernandez , 2004 +-# Antoni Bella Pérez , 2004 +-# Gilles MATEU , 2004 +-# David Poblador , 2004 +-# +-# +-# Aquest fitxer té errades ortogràfiques, sintàtiques, i de traducció greus. +-# A 31/10/2004 vaig aplicar correccions importants, però s'hauria de revisar +-# el fitxer completament. +-# +-# - Proposo a més no traduir les ordres de llenguatge C. Per exemple, no traduir +-# 'case' per 'cas' ni cap altre ordre del llenguatge C. +-# +-# - Proposo escriure els mots que sigui ordre del llenguatge entre de la següent manera: +-# «case» (per indicar que es textual) +-# +-# Cal molta feina en aquest fitxer. Jordi 05/11/2004 +-# +-# +-msgid "" +-msgstr "" +-"Project-Id-Version: gcc 3.4.3\n" +-"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" +-"POT-Creation-Date: 2007-11-08 21:09+0000\n" +-"PO-Revision-Date: 2004-11-10 00:42+0000\n" +-"Last-Translator: Mateu Gilles \n" +-"Language-Team: Catalan \n" +-"MIME-Version: 1.0\n" +-"Content-Type: text/plain; charset=iso-8859-1\n" +-"Content-Transfer-Encoding: 8bit\n" +- +-#: c-decl.c:3814 +-msgid "" +-msgstr "" +- +-#: c-format.c:357 c-format.c:381 +-#, fuzzy +-msgid "' ' flag" +-msgstr "opció \" \"" +- +-#: c-format.c:357 c-format.c:381 +-#, fuzzy +-msgid "the ' ' printf flag" +-msgstr "l'opció \" \" de printf" +- +-#: c-format.c:358 c-format.c:382 c-format.c:416 c-format.c:428 c-format.c:487 +-#, fuzzy +-msgid "'+' flag" +-msgstr "opció \"+\"" +- +-#: c-format.c:358 c-format.c:382 c-format.c:416 c-format.c:428 +-#, fuzzy +-msgid "the '+' printf flag" +-msgstr "l'opció \"+\" de printf" +- +-#: c-format.c:359 c-format.c:383 c-format.c:429 c-format.c:463 +-#, fuzzy +-msgid "'#' flag" +-msgstr "opció \"#\"" +- +-#: c-format.c:359 c-format.c:383 c-format.c:429 +-#, fuzzy +-msgid "the '#' printf flag" +-msgstr "l'opció \"#\" de printf" +- +-#: c-format.c:360 c-format.c:384 c-format.c:461 +-#, fuzzy +-msgid "'0' flag" +-msgstr "opció \"0\"" +- +-#: c-format.c:360 c-format.c:384 +-#, fuzzy +-msgid "the '0' printf flag" +-msgstr "l'opció \"0\" de printf" +- +-#: c-format.c:361 c-format.c:385 c-format.c:460 c-format.c:490 +-#, fuzzy +-msgid "'-' flag" +-msgstr "opció \"-\"" +- +-#: c-format.c:361 c-format.c:385 +-#, fuzzy +-msgid "the '-' printf flag" +-msgstr "l'opció \"-\" de printf" +- +-#: c-format.c:362 c-format.c:443 +-#, fuzzy +-msgid "''' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:362 +-#, fuzzy +-msgid "the ''' printf flag" +-msgstr "l'opció \"'\" de printf" +- +-#: c-format.c:363 c-format.c:444 +-#, fuzzy +-msgid "'I' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:363 +-#, fuzzy +-msgid "the 'I' printf flag" +-msgstr "l'opció \"'\" de printf" +- +-#: c-format.c:364 c-format.c:386 c-format.c:441 c-format.c:464 c-format.c:491 +-#: c-format.c:1623 config/sol2-c.c:45 +-msgid "field width" +-msgstr "amplària de camp" +- +-#: c-format.c:364 c-format.c:386 config/sol2-c.c:45 +-msgid "field width in printf format" +-msgstr "amplària de camp en format printf" +- +-#: c-format.c:365 c-format.c:387 c-format.c:418 c-format.c:431 +-msgid "precision" +-msgstr "precisió" +- +-#: c-format.c:365 c-format.c:387 c-format.c:418 c-format.c:431 +-msgid "precision in printf format" +-msgstr "precisió en format printf" +- +-#: c-format.c:366 c-format.c:388 c-format.c:419 c-format.c:432 c-format.c:442 +-#: c-format.c:494 config/sol2-c.c:46 +-msgid "length modifier" +-msgstr "modificador de longitud" +- +-#: c-format.c:366 c-format.c:388 c-format.c:419 c-format.c:432 +-#: config/sol2-c.c:46 +-msgid "length modifier in printf format" +-msgstr "modificador de longitud en format printf" +- +-#: c-format.c:417 c-format.c:430 +-#, fuzzy +-msgid "'q' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:417 c-format.c:430 +-#, fuzzy +-msgid "the 'q' diagnostic flag" +-msgstr "l'opció \"'\" de printf" +- +-#: c-format.c:438 +-msgid "assignment suppression" +-msgstr "supressió de l'assignació" +- +-#: c-format.c:438 +-msgid "the assignment suppression scanf feature" +-msgstr "la supressió de l'assignació és una característica de scanf" +- +-#: c-format.c:439 +-#, fuzzy +-msgid "'a' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:439 +-#, fuzzy +-msgid "the 'a' scanf flag" +-msgstr "l'opció \"a\" de scanf" +- +-#: c-format.c:440 +-#, fuzzy +-msgid "'m' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:440 +-#, fuzzy +-msgid "the 'm' scanf flag" +-msgstr "l'opció \"'\" de scanf" +- +-#: c-format.c:441 +-msgid "field width in scanf format" +-msgstr "amplària de camp en format scanf" +- +-#: c-format.c:442 +-msgid "length modifier in scanf format" +-msgstr "modificador de longitud en format scanf" +- +-#: c-format.c:443 +-#, fuzzy +-msgid "the ''' scanf flag" +-msgstr "l'opció \"'\" de scanf" +- +-#: c-format.c:444 +-#, fuzzy +-msgid "the 'I' scanf flag" +-msgstr "l'opció \"'\" de scanf" +- +-#: c-format.c:459 +-#, fuzzy +-msgid "'_' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:459 +-#, fuzzy +-msgid "the '_' strftime flag" +-msgstr "l'opció \"_\" de strftime" +- +-#: c-format.c:460 +-#, fuzzy +-msgid "the '-' strftime flag" +-msgstr "l'opció \"-\" de strftime" +- +-#: c-format.c:461 +-#, fuzzy +-msgid "the '0' strftime flag" +-msgstr "l'opció \"0\" de strftime" +- +-#: c-format.c:462 c-format.c:486 +-#, fuzzy +-msgid "'^' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:462 +-#, fuzzy +-msgid "the '^' strftime flag" +-msgstr "l'opció \"^\" de strftime" +- +-#: c-format.c:463 +-#, fuzzy +-msgid "the '#' strftime flag" +-msgstr "l'opció \"#\" de strftime" +- +-#: c-format.c:464 +-msgid "field width in strftime format" +-msgstr "amplària de camp en format strftime" +- +-#: c-format.c:465 +-#, fuzzy +-msgid "'E' modifier" +-msgstr "modificador \"E\"" +- +-#: c-format.c:465 +-#, fuzzy +-msgid "the 'E' strftime modifier" +-msgstr "el modificador \"E\" de strftime" +- +-#: c-format.c:466 +-#, fuzzy +-msgid "'O' modifier" +-msgstr "modificador \"O\"" +- +-#: c-format.c:466 +-#, fuzzy +-msgid "the 'O' strftime modifier" +-msgstr "el modificador \"O\" de strftime" +- +-#: c-format.c:467 +-#, fuzzy +-msgid "the 'O' modifier" +-msgstr "el modificador \"O\"" +- +-#: c-format.c:485 +-msgid "fill character" +-msgstr "caràcter de farciment" +- +-#: c-format.c:485 +-msgid "fill character in strfmon format" +-msgstr "caràcter de farciment en format strfmon" +- +-#: c-format.c:486 +-#, fuzzy +-msgid "the '^' strfmon flag" +-msgstr "l'opció \"^\" de strfmon" +- +-#: c-format.c:487 +-#, fuzzy +-msgid "the '+' strfmon flag" +-msgstr "l'opció \"+\" de strfmon" +- +-#: c-format.c:488 +-#, fuzzy +-msgid "'(' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:488 +-#, fuzzy +-msgid "the '(' strfmon flag" +-msgstr "l'opció \"(\" de strfmon" +- +-#: c-format.c:489 +-#, fuzzy +-msgid "'!' flag" +-msgstr "opció \"'\"" +- +-#: c-format.c:489 +-#, fuzzy +-msgid "the '!' strfmon flag" +-msgstr "l'opció \"!\" de strfmon" +- +-#: c-format.c:490 +-#, fuzzy +-msgid "the '-' strfmon flag" +-msgstr "l'opció \"-\" de strfmon" +- +-#: c-format.c:491 +-msgid "field width in strfmon format" +-msgstr "amplària de camp en format strfmon" +- +-#: c-format.c:492 +-msgid "left precision" +-msgstr "precisió esquerra" +- +-#: c-format.c:492 +-msgid "left precision in strfmon format" +-msgstr "precisió esquerra en format strfmon" +- +-#: c-format.c:493 +-msgid "right precision" +-msgstr "precisió de dreta" +- +-#: c-format.c:493 +-msgid "right precision in strfmon format" +-msgstr "precisió de dreta en format strfmon" +- +-#: c-format.c:494 +-msgid "length modifier in strfmon format" +-msgstr "modificador de longitud en format strfmon" +- +-#: c-format.c:1725 +-msgid "field precision" +-msgstr "precisió del camp" +- +-#: c-incpath.c:74 +-#, c-format +-msgid "ignoring duplicate directory \"%s\"\n" +-msgstr "ignorant el directori duplicat \"%s\"\n" +- +-#: c-incpath.c:77 +-#, c-format +-msgid " as it is a non-system directory that duplicates a system directory\n" +-msgstr " com és un directori que no és del sistema que duplica un directori del sistema\n" +- +-#: c-incpath.c:81 +-#, c-format +-msgid "ignoring nonexistent directory \"%s\"\n" +-msgstr "ignorant el directori inexistent \"%s\"\n" +- +-#: c-incpath.c:344 +-#, c-format +-msgid "#include \"...\" search starts here:\n" +-msgstr "la recerca de #include \"...\" s'inicia aquí:\n" +- +-#: c-incpath.c:348 +-#, c-format +-msgid "#include <...> search starts here:\n" +-msgstr "la recerca de #include <...> s'inicia aquí:\n" +- +-#: c-incpath.c:353 +-#, c-format +-msgid "End of search list.\n" +-msgstr "Fi de la llista de recerca.\n" +- +-#: c-opts.c:1484 +-msgid "" +-msgstr "" +- +-#: c-opts.c:1502 +-#, fuzzy +-msgid "" +-msgstr "" +- +-#: c-typeck.c:2448 c-typeck.c:4851 c-typeck.c:4853 c-typeck.c:4861 +-#: c-typeck.c:4891 c-typeck.c:6267 +-msgid "initializer element is not constant" +-msgstr "l'element de valor inicial no és constant" +- +-#: c-typeck.c:4654 +-#, fuzzy +-msgid "array initialized from parenthesized string constant" +-msgstr "matriu de caràcters amb valors inicials assignats d'una cadena ampla" +- +-#: c-typeck.c:4715 cp/typeck2.c:677 +-#, gcc-internal-format +-msgid "char-array initialized from wide string" +-msgstr "matriu de caràcters amb valors inicials assignats d'una cadena ampla" +- +-#: c-typeck.c:4720 +-#, fuzzy +-msgid "wchar_t-array initialized from non-wide string" +-msgstr "matriu de caràcters amb valors inicials assignats d'una cadena ampla" +- +-#: c-typeck.c:4738 cp/typeck2.c:697 +-#, gcc-internal-format +-msgid "initializer-string for array of chars is too long" +-msgstr "la cadena de valors inicials per a la matriu de caràcters és massa llarga" +- +-#: c-typeck.c:4744 +-#, fuzzy +-msgid "array of inappropriate type initialized from string constant" +-msgstr "matriu de caràcters amb valors inicials assignats d'una cadena ampla" +- +-#. ??? This should not be an error when inlining calls to +-#. unprototyped functions. +-#: c-typeck.c:4808 c-typeck.c:4333 cp/typeck.c:1528 +-#, gcc-internal-format +-msgid "invalid use of non-lvalue array" +-msgstr "ús no vàlid de matriu no evaluada" +- +-#: c-typeck.c:4834 +-msgid "array initialized from non-constant array expression" +-msgstr "matriu amb valors inicials assignats d'una expressió matricial que no és constant" +- +-#: c-typeck.c:4898 c-typeck.c:6271 +-#, gcc-internal-format +-msgid "initializer element is not computable at load time" +-msgstr "l'element de valor inicial no és calculable al moment de la càrrega" +- +-#. Although C99 is unclear about whether incomplete arrays +-#. of VLAs themselves count as VLAs, it does not make +-#. sense to permit them to be initialized given that +-#. ordinary VLAs may not be initialized. +-#: c-typeck.c:4909 c-decl.c:3222 c-decl.c:3237 +-#, gcc-internal-format +-msgid "variable-sized object may not be initialized" +-msgstr "un objecte de grandària variable no pot tenir valor inicial" +- +-#: c-typeck.c:4913 +-msgid "invalid initializer" +-msgstr "valor inicial no vàlid" +- +-#: c-typeck.c:5387 +-msgid "extra brace group at end of initializer" +-msgstr "grup extra de claus al final dels valors inicials" +- +-#: c-typeck.c:5407 +-msgid "missing braces around initializer" +-msgstr "falten claus al voltant dels valors inicials" +- +-#: c-typeck.c:5468 +-msgid "braces around scalar initializer" +-msgstr "claus al voltant del valor inicial escalar" +- +-#: c-typeck.c:5525 +-msgid "initialization of flexible array member in a nested context" +-msgstr "iniciació d'un membre de matriu flexible en un context niat" +- +-#: c-typeck.c:5527 +-msgid "initialization of a flexible array member" +-msgstr "iniciació d'un membre de matriu flexible" +- +-#: c-typeck.c:5554 +-msgid "missing initializer" +-msgstr "falta valor inicial" +- +-#: c-typeck.c:5576 +-msgid "empty scalar initializer" +-msgstr "valor inicial escalar buidor" +- +-#: c-typeck.c:5581 +-msgid "extra elements in scalar initializer" +-msgstr "elements extres en valor inicial escalar" +- +-#: c-typeck.c:5678 c-typeck.c:5738 +-msgid "array index in non-array initializer" +-msgstr "índex de matriu en valor inicial que no és de matriu" +- +-#: c-typeck.c:5683 c-typeck.c:5791 +-msgid "field name not in record or union initializer" +-msgstr "el nom del camp no està en e l'inicialitzador de record o union" +- +-#: c-typeck.c:5729 +-#, fuzzy +-msgid "array index in initializer not of integer type" +-msgstr "l'índex de matriu en el valor inicial excedeix els límits de la matriu" +- +-#: c-typeck.c:5734 c-typeck.c:5736 +-msgid "nonconstant array index in initializer" +-msgstr "índex de matriu no constant en valor inicial" +- +-#: c-typeck.c:5740 c-typeck.c:5743 +-msgid "array index in initializer exceeds array bounds" +-msgstr "l'índex de matriu en el valor inicial excedeix els límits de la matriu" +- +-#: c-typeck.c:5754 +-msgid "empty index range in initializer" +-msgstr "límits d'índexs buits en valor inicial" +- +-#: c-typeck.c:5763 +-msgid "array index range in initializer exceeds array bounds" +-msgstr "els límits d'índexs de la matriu en el valor inicial excedeixen els límits de la matriu" +- +-#: c-typeck.c:5838 c-typeck.c:5861 c-typeck.c:6335 +-msgid "initialized field with side-effects overwritten" +-msgstr "camp iniciat amb efectes laterals sobreescrits" +- +-#: c-typeck.c:5840 c-typeck.c:5863 c-typeck.c:6337 +-#, fuzzy +-msgid "initialized field overwritten" +-msgstr "camp iniciat amb efectes laterals sobreescrits" +- +-#: c-typeck.c:6545 +-msgid "excess elements in char array initializer" +-msgstr "excés d'elements en valors inicials de matriu de caràcters" +- +-#: c-typeck.c:6552 c-typeck.c:6598 +-msgid "excess elements in struct initializer" +-msgstr "excés d'elements en valors inicials de struct" +- +-#: c-typeck.c:6613 +-msgid "non-static initialization of a flexible array member" +-msgstr "iniciació no estàtica d'un membre de matriu flexible" +- +-#: c-typeck.c:6681 +-msgid "excess elements in union initializer" +-msgstr "excés d'elements en valors inicials d'union" +- +-#: c-typeck.c:6768 +-msgid "excess elements in array initializer" +-msgstr "excés d'elements en valors inicials de matriu" +- +-#: c-typeck.c:6798 +-msgid "excess elements in vector initializer" +-msgstr "excés d'elements en valor inicial vectorial" +- +-#: c-typeck.c:6822 +-msgid "excess elements in scalar initializer" +-msgstr "excés d'elements en valor inicial escalar" +- +-#: cfgrtl.c:1925 +-msgid "flow control insn inside a basic block" +-msgstr "control de fluix insn dintre el bloc bàsic" +- +-#: cfgrtl.c:2054 +-msgid "wrong insn in the fallthru edge" +-msgstr "insn erroni en la vora del respatller" +- +-#: cfgrtl.c:2110 +-msgid "insn outside basic block" +-msgstr "insn fora del bloc bàsic" +- +-#: cfgrtl.c:2117 +-msgid "return not followed by barrier" +-msgstr "return no és seguit per una barrera" +- +-#: cgraph.c:339 ipa-inline.c:417 +-msgid "function body not available" +-msgstr "la funció cso no és disponible" +- +-#: cgraph.c:341 cgraphbuild.c:96 +-msgid "redefined extern inline functions are not considered for inlining" +-msgstr "" +- +-#: cgraph.c:344 cgraphbuild.c:103 +-msgid "function not considered for inlining" +-msgstr "" +- +-#: cgraph.c:346 cgraphbuild.c:99 +-msgid "function not inlinable" +-msgstr "la funció no pot ser «inline»" +- +-#: cgraphbuild.c:101 +-#, fuzzy +-msgid "mismatched arguments" +-msgstr "claus sense coincidència en especificacions" +- +-#: collect2.c:378 gcc.c:6897 +-#, fuzzy, c-format +-msgid "internal gcc abort in %s, at %s:%d" +-msgstr "abandó en %s, en %s:%d" +- +-#: collect2.c:889 +-#, c-format +-msgid "no arguments" +-msgstr "sense arguments" +- +-#: collect2.c:1263 collect2.c:1411 collect2.c:1446 +-#, c-format +-msgid "fopen %s" +-msgstr "fopen %s" +- +-#: collect2.c:1266 collect2.c:1416 collect2.c:1449 +-#, c-format +-msgid "fclose %s" +-msgstr "fclose %s" +- +-#: collect2.c:1275 +-#, c-format +-msgid "collect2 version %s" +-msgstr "collect2 versió %s" +- +-#: collect2.c:1365 +-#, c-format +-msgid "%d constructor(s) found\n" +-msgstr "es troba(en) %d constructor(s)\n" +- +-#: collect2.c:1366 +-#, c-format +-msgid "%d destructor(s) found\n" +-msgstr "es troba(en) %d destructor(s)\n" +- +-#: collect2.c:1367 +-#, c-format +-msgid "%d frame table(s) found\n" +-msgstr "es troba(en) %d marcs de matriu(es)\n" +- +-#: collect2.c:1504 +-#, fuzzy, c-format +-msgid "can't get program status" +-msgstr "%s: %s: no es pot obtenir l'estat: %s\n" +- +-#: collect2.c:1573 +-#, fuzzy, c-format +-msgid "could not open response file %s" +-msgstr "No es pot obrir el fitxer de codi font %s.\n" +- +-#: collect2.c:1578 +-#, fuzzy, c-format +-msgid "could not write to response file %s" +-msgstr "No es pot trobar el fitxer d'especificacions %s\n" +- +-#: collect2.c:1583 +-#, fuzzy, c-format +-msgid "could not close response file %s" +-msgstr "No es pot obrir el fitxer de codi font %s.\n" +- +-#: collect2.c:1601 +-#, c-format +-msgid "[cannot find %s]" +-msgstr "[no es pot trobar %s]" +- +-#: collect2.c:1616 +-#, fuzzy, c-format +-msgid "cannot find '%s'" +-msgstr "no es pot trobar \"%s\"" +- +-#: collect2.c:1620 collect2.c:2112 collect2.c:2267 gcc.c:2978 +-#, c-format +-msgid "pex_init failed" +-msgstr "" +- +-#: collect2.c:1658 +-#, c-format +-msgid "[Leaving %s]\n" +-msgstr "[Deixant %s]\n" +- +-#: collect2.c:1878 +-#, c-format +-msgid "" +-"\n" +-"write_c_file - output name is %s, prefix is %s\n" +-msgstr "" +-"\n" +-"write_c_file - el nom de sortida és %s, el prefix és %s\n" +- +-#: collect2.c:2086 +-#, fuzzy, c-format +-msgid "cannot find 'nm'" +-msgstr "no es pot trobar \"nm\"" +- +-#: collect2.c:2133 +-#, fuzzy, c-format +-msgid "can't open nm output" +-msgstr "no es pot obrir %s" +- +-#: collect2.c:2177 +-#, c-format +-msgid "init function found in object %s" +-msgstr "es va trobar la funció init en l'objecte %s" +- +-#: collect2.c:2185 +-#, c-format +-msgid "fini function found in object %s" +-msgstr "es va trobar la funció fini en l'objecte %s" +- +-#: collect2.c:2288 +-#, fuzzy, c-format +-msgid "can't open ldd output" +-msgstr "no es pot obrir %s" +- +-#: collect2.c:2291 +-#, c-format +-msgid "" +-"\n" +-"ldd output with constructors/destructors.\n" +-msgstr "" +-"\n" +-"sortida de ldd amb constructors/destructors.\n" +- +-#: collect2.c:2306 +-#, c-format +-msgid "dynamic dependency %s not found" +-msgstr "no es troba la dependència dinàmica %s" +- +-#: collect2.c:2318 +-#, c-format +-msgid "unable to open dynamic dependency '%s'" +-msgstr "no es pot obrir la dependència dinàmica \"%s\"" +- +-#: collect2.c:2474 +-#, c-format +-msgid "%s: not a COFF file" +-msgstr "%s: no és un fitxer COFF" +- +-#: collect2.c:2594 +-#, c-format +-msgid "%s: cannot open as COFF file" +-msgstr "%s: no es pot obrir com un fitxer COFF" +- +-#: collect2.c:2652 +-#, c-format +-msgid "library lib%s not found" +-msgstr "no es troba la biblioteca lib%s" +- +-#: cppspec.c:106 +-#, c-format +-msgid "\"%s\" is not a valid option to the preprocessor" +-msgstr "\"%s\" no es una opció vàlida per el preprocessador" +- +-#: cppspec.c:128 +-#, c-format +-msgid "too many input files" +-msgstr "massa fitxers d'entrada" +- +-#: diagnostic.c:188 +-#, c-format +-msgid "%s:%d: confused by earlier errors, bailing out\n" +-msgstr "%s:%d: confusió per errors precedentes, abandó\n" +- +-#: diagnostic.c:235 +-#, fuzzy, c-format +-msgid "compilation terminated due to -Wfatal-errors.\n" +-msgstr "compilació acabada.\n" +- +-#: diagnostic.c:244 +-#, c-format +-msgid "" +-"Please submit a full bug report,\n" +-"with preprocessed source if appropriate.\n" +-"See %s for instructions.\n" +-msgstr "" +-"Si us plau, envieu un informe d'error complet,\n" +-"amb la font preprocessada si és oportú.\n" +-"Consulta %s per a les instruccions.\n" +- +-#: diagnostic.c:253 +-#, c-format +-msgid "compilation terminated.\n" +-msgstr "compilació acabada.\n" +- +-#: diagnostic.c:641 +-#, c-format +-msgid "Internal compiler error: Error reporting routines re-entered.\n" +-msgstr "Error intern del compilador: Error al reportar rutines reentrades.\n" +- +-#: final.c:1136 +-msgid "negative insn length" +-msgstr "longitud insn negativa" +- +-#: final.c:2609 +-msgid "could not split insn" +-msgstr "no es pot separar insn" +- +-#: final.c:2979 +-#, fuzzy +-msgid "invalid 'asm': " +-msgstr "\"asm\" no vàlid: " +- +-#: final.c:3162 +-#, c-format +-msgid "nested assembly dialect alternatives" +-msgstr "alternatives de dialecte d'ensamblador imbricades" +- +-#: final.c:3179 final.c:3191 +-#, c-format +-msgid "unterminated assembly dialect alternative" +-msgstr "alternativa de dialecte d'ensamblador no terminada" +- +-#: final.c:3238 +-#, c-format +-msgid "operand number missing after %%-letter" +-msgstr "falta nombre operand després de %%-letter" +- +-#: final.c:3241 final.c:3282 +-#, c-format +-msgid "operand number out of range" +-msgstr "nombre operador fora de límits" +- +-#: final.c:3301 +-#, c-format +-msgid "invalid %%-code" +-msgstr "%%-codi no vàlid" +- +-#: final.c:3331 +-#, fuzzy, c-format +-msgid "'%%l' operand isn't a label" +-msgstr "l'operand \"%%l\" no és una etiqueta" +- +-#. We can't handle floating point constants; +-#. PRINT_OPERAND must handle them. +-#. We can't handle floating point constants; PRINT_OPERAND must +-#. handle them. +-#. We can't handle floating point constants; +-#. PRINT_OPERAND must handle them. +-#: final.c:3433 vmsdbgout.c:487 config/i386/i386.c:8143 +-#: config/pdp11/pdp11.c:1704 +-#, c-format +-msgid "floating constant misused" +-msgstr "constant de coma flotant mal usada" +- +-#: final.c:3493 vmsdbgout.c:544 config/i386/i386.c:8224 +-#: config/pdp11/pdp11.c:1751 +-#, c-format +-msgid "invalid expression as operand" +-msgstr "expressió no vàlida com a operand" +- +-#: gcc.c:1704 +-#, c-format +-msgid "Using built-in specs.\n" +-msgstr "Usant especificacions internes.\n" +- +-#: gcc.c:1887 +-#, c-format +-msgid "" +-"Setting spec %s to '%s'\n" +-"\n" +-msgstr "" +-"Canviant l'especificació de %s a \"%s\"\n" +-"\n" +- +-#: gcc.c:2002 +-#, c-format +-msgid "Reading specs from %s\n" +-msgstr "Llegint especificacions de %s\n" +- +-#: gcc.c:2098 gcc.c:2117 +-#, c-format +-msgid "specs %%include syntax malformed after %ld characters" +-msgstr "specs sintaxi mal formada de %%include després de %ld caràcters" +- +-#: gcc.c:2125 +-#, c-format +-msgid "could not find specs file %s\n" +-msgstr "No es pot trobar el fitxer d'especificacions %s\n" +- +-#: gcc.c:2142 gcc.c:2150 gcc.c:2159 gcc.c:2168 +-#, c-format +-msgid "specs %%rename syntax malformed after %ld characters" +-msgstr "specs sintaxi mal formada de %%rename després de %ld caràcters" +- +-#: gcc.c:2177 +-#, c-format +-msgid "specs %s spec was not found to be renamed" +-msgstr "specs l'especificació %s no es va trobar per a ser re-nomenada" +- +-#: gcc.c:2184 +-#, c-format +-msgid "%s: attempt to rename spec '%s' to already defined spec '%s'" +-msgstr "" +- +-#: gcc.c:2189 +-#, c-format +-msgid "rename spec %s to %s\n" +-msgstr "re-nomenada especificació %s a %s\n" +- +-#: gcc.c:2191 +-#, c-format +-msgid "" +-"spec is '%s'\n" +-"\n" +-msgstr "" +-"la especificació és \"%s\"\n" +-"\n" +- +-#: gcc.c:2204 +-#, c-format +-msgid "specs unknown %% command after %ld characters" +-msgstr "specs ordre %% desconegut després de %ld caràcters" +- +-#: gcc.c:2215 gcc.c:2228 +-#, c-format +-msgid "specs file malformed after %ld characters" +-msgstr "specs fitxer mal format després de %ld caràcters" +- +-#: gcc.c:2281 +-#, c-format +-msgid "spec file has no spec for linking" +-msgstr "el fitxer d'especificacions no té especificacions per a enllaçar" +- +-#: gcc.c:2609 gcc.c:4751 +-#, c-format +-msgid "%s\n" +-msgstr "%s\n" +- +-#: gcc.c:2809 +-#, fuzzy, c-format +-msgid "system path '%s' is not absolute" +-msgstr "la reservació \"%s\" no s'utilitza" +- +-#: gcc.c:2872 +-#, c-format +-msgid "-pipe not supported" +-msgstr "-pipe no té suport" +- +-#: gcc.c:2934 +-#, c-format +-msgid "" +-"\n" +-"Go ahead? (y or n) " +-msgstr "" +-"\n" +-"Continuar? (s o n) " +- +-#: gcc.c:3017 +-#, fuzzy +-msgid "failed to get exit status" +-msgstr "ld va retornar l'estat de sortida %d" +- +-#: gcc.c:3023 +-msgid "failed to get process times" +-msgstr "" +- +-#: gcc.c:3049 +-#, c-format +-msgid "" +-"Internal error: %s (program %s)\n" +-"Please submit a full bug report.\n" +-"See %s for instructions." +-msgstr "" +-"Error intern: %s (programa %s)\n" +-"Per favor envieu un informe complet d'error.\n" +-"Consulta %s per a més instruccions." +- +-#: gcc.c:3075 +-#, c-format +-msgid "# %s %.2f %.2f\n" +-msgstr "# %s %.2f %.2f\n" +- +-#: gcc.c:3211 +-#, c-format +-msgid "Usage: %s [options] file...\n" +-msgstr "Utilització: %s [opcions] fitxer...\n" +- +-#: gcc.c:3212 +-msgid "Options:\n" +-msgstr "Opcions:\n" +- +-#: gcc.c:3214 +-msgid " -pass-exit-codes Exit with highest error code from a phase\n" +-msgstr " -pass-exit-codes Sortir amb el codi d'error més alt d'una fase\n" +- +-#: gcc.c:3215 +-msgid " --help Display this information\n" +-msgstr " --help Mostra aquesta informació\n" +- +-#: gcc.c:3216 +-msgid " --target-help Display target specific command line options\n" +-msgstr "" +-" --target-help Mostra opcions de línia d'ordres específiques de\n" +-" l'objectiu\n" +- +-#: gcc.c:3217 +-msgid " --help={target|optimizers|warnings|undocumented|params}[,{[^]joined|[^]separate}]\n" +-msgstr "" +- +-#: gcc.c:3218 +-#, fuzzy +-msgid " Display specific types of command line options\n" +-msgstr "" +-" --target-help Mostra opcions de línia d'ordres específiques de\n" +-" l'objectiu\n" +- +-#: gcc.c:3220 +-msgid " (Use '-v --help' to display command line options of sub-processes)\n" +-msgstr " (Usi \"-v --help\" per a mostrar les opcions de línia d'ordres dels subprocès)\n" +- +-#: gcc.c:3221 +-msgid " -dumpspecs Display all of the built in spec strings\n" +-msgstr " -dumpspecs Mostra totes les cadenes internes d'especificació\n" +- +-#: gcc.c:3222 +-msgid " -dumpversion Display the version of the compiler\n" +-msgstr " -dumpversion Mostra la versió del compilador\n" +- +-#: gcc.c:3223 +-msgid " -dumpmachine Display the compiler's target processor\n" +-msgstr " -dumpmachine Mostra el processador objectiu del compilador\n" +- +-#: gcc.c:3224 +-msgid " -print-search-dirs Display the directories in the compiler's search path\n" +-msgstr "" +-" -print-search-dirs Mostra els directoris en la ruta de recerca del\n" +-" compilador\n" +- +-#: gcc.c:3225 +-msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n" +-msgstr "" +-" -print-libgcc-file-name Mostra el nom de la biblioteca que acompanya el\n" +-" compilador\n" +- +-#: gcc.c:3226 +-msgid " -print-file-name= Display the full path to library \n" +-msgstr " -print-file-name= Mostra la ruta completa a la biblioteca \n" +- +-#: gcc.c:3227 +-msgid " -print-prog-name= Display the full path to compiler component \n" +-msgstr "" +-" -print-prog-name= Mostra la ruta completa del programa component del\n" +-" compilador \n" +- +-#: gcc.c:3228 +-msgid " -print-multi-directory Display the root directory for versions of libgcc\n" +-msgstr " -print-multi-directory Mostra el directori arrel per a versoins de libgcc\n" +- +-#: gcc.c:3229 +-msgid "" +-" -print-multi-lib Display the mapping between command line options and\n" +-" multiple library search directories\n" +-msgstr "" +-" -print-multi-lib Mostra el mapatge entre les opcions de línia\n" +-" d'ordres i els múltiples directoris de la recerca\n" +-" de biblioteques\n" +- +-#: gcc.c:3232 +-msgid " -print-multi-os-directory Display the relative path to OS libraries\n" +-msgstr " -print-multi-os-directory Mostra la ruta relativa per a les biblioteques del SO\n" +- +-#: gcc.c:3233 +-msgid " -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n" +-msgstr "" +- +-#: gcc.c:3234 +-msgid " -Wa, Pass comma-separated on to the assembler\n" +-msgstr " -Wa, Passa separades per coma al ensamblador\n" +- +-#: gcc.c:3235 +-msgid " -Wp, Pass comma-separated on to the preprocessor\n" +-msgstr " -Wp, Passa separades per coma al preprocesador\n" +- +-#: gcc.c:3236 +-msgid " -Wl, Pass comma-separated on to the linker\n" +-msgstr " -Wl, Passa separades per coma al enllaçador\n" +- +-#: gcc.c:3237 +-msgid " -Xassembler Pass on to the assembler\n" +-msgstr " -Xassembler Passa al ensamblador\n" +- +-#: gcc.c:3238 +-msgid " -Xpreprocessor Pass on to the preprocessor\n" +-msgstr " -Xpreprocessor Passa el al preprocesador\n" +- +-#: gcc.c:3239 +-msgid " -Xlinker Pass on to the linker\n" +-msgstr " -Xlinker Passa el al enllaçador\n" +- +-#: gcc.c:3240 +-#, fuzzy +-msgid " -combine Pass multiple source files to compiler at once\n" +-msgstr " -o Col·loca la sortida en el \n" +- +-#: gcc.c:3241 +-msgid " -save-temps Do not delete intermediate files\n" +-msgstr " -save-temps No esborra els fitxers intermedis\n" +- +-#: gcc.c:3242 +-msgid " -pipe Use pipes rather than intermediate files\n" +-msgstr " -pipe Usa canonades en lloc de fitxers intermedis\n" +- +-#: gcc.c:3243 +-msgid " -time Time the execution of each subprocess\n" +-msgstr " -time Obté el temps d'execució de cada subprocès\n" +- +-#: gcc.c:3244 +-msgid " -specs= Override built-in specs with the contents of \n" +-msgstr "" +-" -specs= Sobreposa les especificacions internes amb el\n" +-" contingut de \n" +- +-#: gcc.c:3245 +-msgid " -std= Assume that the input sources are for \n" +-msgstr "" +-" -std= Assumeix qu'els fitxers d'entrada són per a el\n" +-" \n" +- +-#: gcc.c:3246 +-msgid "" +-" --sysroot= Use as the root directory for headers\n" +-" and libraries\n" +-msgstr "" +- +-#: gcc.c:3249 +-msgid " -B Add to the compiler's search paths\n" +-msgstr "" +-" -B Agrega el a les rutes de recerca del\n" +-" compilador\n" +- +-#: gcc.c:3250 +-msgid " -b Run gcc for target , if installed\n" +-msgstr "" +-" -b Executa gcc per a l'objectiu ,\n" +-" si va ser instal·lat\n" +- +-#: gcc.c:3251 +-msgid " -V Run gcc version number , if installed\n" +-msgstr "" +-" -V Executa el gcc amb nombre de versió ,\n" +-" si va ser instal·lat\n" +- +-#: gcc.c:3252 +-msgid " -v Display the programs invoked by the compiler\n" +-msgstr " -v Mostra els programes invocats pel compilador\n" +- +-#: gcc.c:3253 +-msgid " -### Like -v but options quoted and commands not executed\n" +-msgstr "" +-" -### Com -v però les opcions i ordres entr \"\" no estan\n" +-" executades\n" +- +-#: gcc.c:3254 +-msgid " -E Preprocess only; do not compile, assemble or link\n" +-msgstr " -E Solament preprocessa; no compila, ensambla o enllaça\n" +- +-#: gcc.c:3255 +-msgid " -S Compile only; do not assemble or link\n" +-msgstr " -S Solament compila; no ensambla o enllaça\n" +- +-#: gcc.c:3256 +-msgid " -c Compile and assemble, but do not link\n" +-msgstr " -c Compila i ensambla, però no enllaça\n" +- +-#: gcc.c:3257 +-msgid " -o Place the output into \n" +-msgstr " -o Col·loca la sortida en el \n" +- +-#: gcc.c:3258 +-msgid "" +-" -x Specify the language of the following input files\n" +-" Permissible languages include: c c++ assembler none\n" +-" 'none' means revert to the default behavior of\n" +-" guessing the language based on the file's extension\n" +-msgstr "" +-" -x Especifica el llenguatge dels següents fitxers d''\n" +-" entrada. Els llenguatges permesos inclouen: c c++\n" +-" assembler none. \"none\" significa revertir a la\n" +-" conducta habitual de endevinar el llenguatge basat\n" +-" en l'extensió del fitxer\n" +- +-#: gcc.c:3265 +-#, c-format +-msgid "" +-"\n" +-"Options starting with -g, -f, -m, -O, -W, or --param are automatically\n" +-" passed on to the various sub-processes invoked by %s. In order to pass\n" +-" other options on to these processes the -W options must be used.\n" +-msgstr "" +-"\n" +-"Les opcions que comencen amb -g, -f, -m, -O, -W, o --param es passen\n" +-" automàticament als varis subprocesos invocats per %s. Per passar altres\n" +-" opcions a aquests processos es deuen usar les opcions -W\n" +- +-#: gcc.c:3389 +-#, fuzzy, c-format +-msgid "'-%c' option must have argument" +-msgstr "l'opció \"-%c\" ha de tenir arguments" +- +-#: gcc.c:3411 +-#, fuzzy, c-format +-msgid "couldn't run '%s': %s" +-msgstr "no és pot obrir %s" +- +-#. translate_options () has turned --version into -fversion. +-#: gcc.c:3612 +-#, fuzzy, c-format +-msgid "%s %s%s\n" +-msgstr "%s \"%s\"\n" +- +-#: gcc.c:3615 gcov.c:426 fortran/gfortranspec.c:380 java/jcf-dump.c:1168 +-msgid "(C)" +-msgstr "" +- +-#: gcc.c:3616 java/jcf-dump.c:1169 +-#, c-format +-msgid "" +-"This is free software; see the source for copying conditions. There is NO\n" +-"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +-"\n" +-msgstr "" +-"Això és programari lliure; vegi el codi font per a les condicions de còpia.\n" +-"No hi ha CAP garantia; ni tan sols de COMERCIABILITAT o\n" +-"ADEQUACIÓ A UN PROPÒSIT PARTICULAR.\n" +- +-#: gcc.c:3728 +-#, fuzzy, c-format +-msgid "argument to '-Xlinker' is missing" +-msgstr "falta l'argument per a \"-Xlinker\"" +- +-#: gcc.c:3736 +-#, fuzzy, c-format +-msgid "argument to '-Xpreprocessor' is missing" +-msgstr "falta l'argument per a \"-Xpreprocessor\"" +- +-#: gcc.c:3743 +-#, fuzzy, c-format +-msgid "argument to '-Xassembler' is missing" +-msgstr "falta l'argument per a \"-Xassembler\"" +- +-#: gcc.c:3750 +-#, fuzzy, c-format +-msgid "argument to '-l' is missing" +-msgstr "falta l'argument per a \"-I\"" +- +-#: gcc.c:3771 +-#, fuzzy, c-format +-msgid "argument to '-specs' is missing" +-msgstr "falta l'argument per a \"-specs\"" +- +-#: gcc.c:3785 +-#, fuzzy, c-format +-msgid "argument to '-specs=' is missing" +-msgstr "falta l'argument per a \"-specs=\"" +- +-#: gcc.c:3826 +-#, c-format +-msgid "'-%c' must come at the start of the command line" +-msgstr "" +- +-#: gcc.c:3835 +-#, fuzzy, c-format +-msgid "argument to '-B' is missing" +-msgstr "falta l'argument per a \"-B\"" +- +-#: gcc.c:4185 +-#, fuzzy, c-format +-msgid "argument to '-x' is missing" +-msgstr "falta l'argument per a \"-x\"" +- +-#: gcc.c:4213 +-#, fuzzy, c-format +-msgid "argument to '-%s' is missing" +-msgstr "falta l'argument per a \"-%s\"" +- +-#: gcc.c:4541 +-#, c-format +-msgid "switch '%s' does not start with '-'" +-msgstr "" +- +-#: gcc.c:4685 +-#, c-format +-msgid "spec '%s' invalid" +-msgstr "" +- +-#: gcc.c:4824 +-#, fuzzy, c-format +-msgid "spec '%s' has invalid '%%0%c'" +-msgstr "el camp de bits \"%s\" té un tipus no vàlid" +- +-#: gcc.c:5053 +-#, fuzzy, c-format +-msgid "could not open temporary response file %s" +-msgstr "no es pot obrir el fitxer de dump \"%s\"" +- +-#: gcc.c:5059 +-#, fuzzy, c-format +-msgid "could not write to temporary response file %s" +-msgstr "No es pot trobar el fitxer d'especificacions %s\n" +- +-#: gcc.c:5065 +-#, fuzzy, c-format +-msgid "could not close temporary response file %s" +-msgstr "no es pot obrir el fitxer de dump \"%s\"" +- +-#: gcc.c:5099 +-#, fuzzy, c-format +-msgid "spec '%s' has invalid '%%W%c" +-msgstr "el camp de bits \"%s\" té un tipus no vàlid" +- +-#: gcc.c:5119 +-#, fuzzy, c-format +-msgid "spec '%s' has invalid '%%x%c'" +-msgstr "el camp de bits \"%s\" té un tipus no vàlid" +- +-#: gcc.c:5341 +-#, c-format +-msgid "Processing spec %c%s%c, which is '%s'\n" +-msgstr "Processant l'especificació %c%s%c, el qual és \"%s\"\n" +- +-#: gcc.c:5465 +-#, fuzzy, c-format +-msgid "unknown spec function '%s'" +-msgstr "funció d'especificació \"%s\" desconeguda" +- +-#: gcc.c:5484 +-#, fuzzy, c-format +-msgid "error in args to spec function '%s'" +-msgstr "error en els arguments per a la funció d'especificació \"%s\"" +- +-#: gcc.c:5532 +-#, c-format +-msgid "malformed spec function name" +-msgstr "nom de la funció d'especificació malformat" +- +-#. ) +-#: gcc.c:5535 +-#, c-format +-msgid "no arguments for spec function" +-msgstr "molt pocs arguments per a la funció spec" +- +-#: gcc.c:5554 +-#, c-format +-msgid "malformed spec function arguments" +-msgstr "" +- +-#: gcc.c:5800 +-#, c-format +-msgid "braced spec '%s' is invalid at '%c'" +-msgstr "" +- +-#: gcc.c:5888 +-#, c-format +-msgid "braced spec body '%s' is invalid" +-msgstr "" +- +-#: gcc.c:6421 +-#, c-format +-msgid "install: %s%s\n" +-msgstr "instal·lar: %s%s\n" +- +-#: gcc.c:6424 +-#, c-format +-msgid "programs: %s\n" +-msgstr "programes: %s\n" +- +-#: gcc.c:6426 +-#, c-format +-msgid "libraries: %s\n" +-msgstr "biblioteques: %s\n" +- +-#. The error status indicates that only one set of fixed +-#. headers should be built. +-#: gcc.c:6480 +-#, c-format +-msgid "not configured with sysroot headers suffix" +-msgstr "" +- +-#: gcc.c:6489 +-#, c-format +-msgid "" +-"\n" +-"For bug reporting instructions, please see:\n" +-msgstr "" +-"\n" +-"Per a instruccions de report de bug, si us plau per favor vegi:\n" +- +-#: gcc.c:6505 +-#, fuzzy, c-format +-msgid "Target: %s\n" +-msgstr "biblioteques: %s\n" +- +-#: gcc.c:6506 +-#, c-format +-msgid "Configured with: %s\n" +-msgstr "Configurat amb: %s\n" +- +-#: gcc.c:6520 +-#, c-format +-msgid "Thread model: %s\n" +-msgstr "Model de fils: %s\n" +- +-#: gcc.c:6531 +-#, fuzzy, c-format +-msgid "gcc version %s %s\n" +-msgstr "gcc versió %s\n" +- +-#: gcc.c:6533 +-#, fuzzy, c-format +-msgid "gcc driver version %s %sexecuting gcc version %s\n" +-msgstr "controlador gcc versió %s executant gcc versió %s\n" +- +-#: gcc.c:6541 +-#, c-format +-msgid "no input files" +-msgstr "no hi ha fitxers d'entrada" +- +-#: gcc.c:6590 +-#, fuzzy, c-format +-msgid "cannot specify -o with -c or -S with multiple files" +-msgstr "no es pot especificar -o amb -c o -S i múltiples llenguatges" +- +-#: gcc.c:6624 +-#, fuzzy, c-format +-msgid "spec '%s' is invalid" +-msgstr "el paràmetre \"%s\" té valor inicial" +- +-#: gcc.c:6760 +-#, c-format +-msgid "" +-"\n" +-"Linker options\n" +-"==============\n" +-"\n" +-msgstr "" +- +-#: gcc.c:6761 +-#, c-format +-msgid "" +-"Use \"-Wl,OPTION\" to pass \"OPTION\" to the linker.\n" +-"\n" +-msgstr "" +- +-#: gcc.c:7112 +-#, fuzzy, c-format +-msgid "multilib spec '%s' is invalid" +-msgstr "l'argument de patró %d no és vàlid" +- +-#: gcc.c:7303 +-#, fuzzy, c-format +-msgid "multilib exclusions '%s' is invalid" +-msgstr "múltiples camps inicialitzats en la unió \"%#T\"" +- +-#: gcc.c:7361 gcc.c:7502 +-#, fuzzy, c-format +-msgid "multilib select '%s' is invalid" +-msgstr "l'argument de patró %d no és vàlid" +- +-#: gcc.c:7540 +-#, fuzzy, c-format +-msgid "multilib exclusion '%s' is invalid" +-msgstr "múltiples camps inicialitzats en la unió \"%#T\"" +- +-#: gcc.c:7746 +-#, fuzzy, c-format +-msgid "environment variable \"%s\" not defined" +-msgstr "no es va definir la variable d'ambient DJGPP" +- +-#: gcc.c:7837 gcc.c:7842 +-#, fuzzy, c-format +-msgid "invalid version number `%s'" +-msgstr "opció \"%s\" no vàlida" +- +-#: gcc.c:7885 +-#, fuzzy, c-format +-msgid "too few arguments to %%:version-compare" +-msgstr "molt pocs arguments per a la funció" +- +-#: gcc.c:7891 +-#, fuzzy, c-format +-msgid "too many arguments to %%:version-compare" +-msgstr "massa arguments per a la funció" +- +-#: gcc.c:7932 +-#, c-format +-msgid "unknown operator '%s' in %%:version-compare" +-msgstr "" +- +-#: gcc.c:7966 +-#, c-format +-msgid "" +-"Assembler options\n" +-"=================\n" +-"\n" +-msgstr "" +- +-#: gcc.c:7967 +-#, c-format +-msgid "" +-"Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n" +-"\n" +-msgstr "" +- +-#: gcov.c:399 +-#, fuzzy, c-format +-msgid "" +-"Usage: gcov [OPTION]... SOURCEFILE...\n" +-"\n" +-msgstr "" +-"Us: gcov [OPCIO]... FITXERFONT\n" +-"\n" +- +-#: gcov.c:400 +-#, c-format +-msgid "" +-"Print code coverage information.\n" +-"\n" +-msgstr "" +-"Escriure les informacions de la covertura del codi.\n" +-"\n" +- +-#: gcov.c:401 +-#, c-format +-msgid " -h, --help Print this help, then exit\n" +-msgstr " -h, --help Mostra aquesta informació, i surt\n" +- +-#: gcov.c:402 +-#, c-format +-msgid " -v, --version Print version number, then exit\n" +-msgstr " -v, --version Mostra el numero de versió, i surt\n" +- +-#: gcov.c:403 +-#, c-format +-msgid " -a, --all-blocks Show information for every basic block\n" +-msgstr "" +- +-#: gcov.c:404 +-#, c-format +-msgid " -b, --branch-probabilities Include branch probabilities in output\n" +-msgstr " -b, --branch-probabilities Incloure les probabilitats de brancament en la sortida\n" +- +-#: gcov.c:405 +-#, c-format +-msgid "" +-" -c, --branch-counts Given counts of branches taken\n" +-" rather than percentages\n" +-msgstr "" +-" -c, --branch-counts Dóna el compte de branques preses\n" +-" enlloc de percentatges\n" +- +-#: gcov.c:407 +-#, c-format +-msgid " -n, --no-output Do not create an output file\n" +-msgstr " -n, --no-output No crea un fitxer de sortida\n" +- +-#: gcov.c:408 +-#, c-format +-msgid "" +-" -l, --long-file-names Use long output file names for included\n" +-" source files\n" +-msgstr "" +-" -l, --long-file-names Usar nom de fitxers de sortida llargs pels\n" +-" fitxers font inclòs\n" +- +-#: gcov.c:410 +-#, c-format +-msgid " -f, --function-summaries Output summaries for each function\n" +-msgstr " -f, --function-summaries Fer un resum per a cada funció\n" +- +-#: gcov.c:411 +-#, c-format +-msgid " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n" +-msgstr " -o, --object-directory DIR|FIT Cerca els fitxers objectes en DIR o el FITxer\n" +- +-#: gcov.c:412 +-#, c-format +-msgid " -p, --preserve-paths Preserve all pathname components\n" +-msgstr "" +- +-#: gcov.c:413 +-#, c-format +-msgid " -u, --unconditional-branches Show unconditional branch counts too\n" +-msgstr "" +- +-#: gcov.c:414 +-#, c-format +-msgid "" +-"\n" +-"For bug reporting instructions, please see:\n" +-"%s.\n" +-msgstr "" +-"\n" +-"Per a instrucions d'informe de bug, si us plau consulta:\n" +-"%s.\n" +- +-#: gcov.c:424 +-#, fuzzy, c-format +-msgid "gcov %s%s\n" +-msgstr "gcov (GCC) %s\n" +- +-#: gcov.c:428 +-#, c-format +-msgid "" +-"This is free software; see the source for copying conditions.\n" +-"There is NO warranty; not even for MERCHANTABILITY or \n" +-"FITNESS FOR A PARTICULAR PURPOSE.\n" +-"\n" +-msgstr "" +-"Això és programari lliure; vegi el codi font per a les condicions de còpia.\n" +-"No hi ha CAP garantia; ni tan sols de COMERCIABILITAT o\n" +-"ADEQUACIÓ A UN PROPÒSIT PARTICULAR.\n" +- +-#: gcov.c:524 +-#, c-format +-msgid "%s:no functions found\n" +-msgstr "%s:no es troben funcions\n" +- +-#: gcov.c:556 gcov.c:584 fortran/dump-parse-tree.c:63 +-#, c-format +-msgid "\n" +-msgstr "\n" +- +-#: gcov.c:571 +-#, fuzzy, c-format +-msgid "%s:creating '%s'\n" +-msgstr "%s:creant \"%s\"\n" +- +-#: gcov.c:575 +-#, fuzzy, c-format +-msgid "%s:error writing output file '%s'\n" +-msgstr "%s:error escrivint al fitxer de sortida \"%s\"\n" +- +-#: gcov.c:580 +-#, fuzzy, c-format +-msgid "%s:could not open output file '%s'\n" +-msgstr "%s:no es pot obrir el fitxer de sortida \"%s\"\n" +- +-#: gcov.c:729 +-#, fuzzy, c-format +-msgid "%s:source file is newer than graph file '%s'\n" +-msgstr "%s:el fitxer font és més nou qu'el fitxer graf \"%s\"\n" +- +-#: gcov.c:734 +-#, c-format +-msgid "(the message is only displayed one per source file)\n" +-msgstr "" +- +-#: gcov.c:758 +-#, c-format +-msgid "%s:cannot open graph file\n" +-msgstr "%s:no es pot obrir el fitxer de graf\n" +- +-#: gcov.c:764 +-#, c-format +-msgid "%s:not a gcov graph file\n" +-msgstr "%s:no és un fitxer de graf gcov\n" +- +-#: gcov.c:777 +-#, fuzzy, c-format +-msgid "%s:version '%.4s', prefer '%.4s'\n" +-msgstr "%s:versió \"%.4s\", prefereix \"%.4s\"\n" +- +-#: gcov.c:829 +-#, fuzzy, c-format +-msgid "%s:already seen blocks for '%s'\n" +-msgstr "%s:no línies per a \"%s\"\n" +- +-#: gcov.c:947 +-#, c-format +-msgid "%s:corrupted\n" +-msgstr "%s:corromput\n" +- +-#: gcov.c:1023 +-#, fuzzy, c-format +-msgid "%s:cannot open data file, assuming not executed\n" +-msgstr "%s:no es pot obrir el fitxer de dades\n" +- +-#: gcov.c:1030 +-#, c-format +-msgid "%s:not a gcov data file\n" +-msgstr "%s:no és un fitxer de dades gcov\n" +- +-#: gcov.c:1043 +-#, fuzzy, c-format +-msgid "%s:version '%.4s', prefer version '%.4s'\n" +-msgstr "%s:versió \"%.4s\", prefereix \"%.4s\"\n" +- +-#: gcov.c:1049 +-#, c-format +-msgid "%s:stamp mismatch with graph file\n" +-msgstr "" +- +-#: gcov.c:1078 +-#, fuzzy, c-format +-msgid "%s:unknown function '%u'\n" +-msgstr "%s:funció \"%u\" desconeguda\n" +- +-#: gcov.c:1091 +-#, fuzzy, c-format +-msgid "%s:profile mismatch for '%s'\n" +-msgstr "%s:no línies per a \"%s\"\n" +- +-#: gcov.c:1110 +-#, c-format +-msgid "%s:overflowed\n" +-msgstr "%s:sobreeixit\n" +- +-#: gcov.c:1134 +-#, c-format +-msgid "%s:'%s' lacks entry and/or exit blocks\n" +-msgstr "" +- +-#: gcov.c:1139 +-#, c-format +-msgid "%s:'%s' has arcs to entry block\n" +-msgstr "" +- +-#: gcov.c:1147 +-#, c-format +-msgid "%s:'%s' has arcs from exit block\n" +-msgstr "" +- +-#: gcov.c:1355 +-#, fuzzy, c-format +-msgid "%s:graph is unsolvable for '%s'\n" +-msgstr "%s:no línies per a \"%s\"\n" +- +-#: gcov.c:1435 +-#, fuzzy, c-format +-msgid "%s '%s'\n" +-msgstr "%s \"%s\"\n" +- +-#: gcov.c:1438 +-#, c-format +-msgid "Lines executed:%s of %d\n" +-msgstr "Es van executar %s de %d línies\n" +- +-#: gcov.c:1442 +-#, fuzzy, c-format +-msgid "No executable lines\n" +-msgstr "No hi ha línies de codi font executable" +- +-#: gcov.c:1448 +-#, c-format +-msgid "Branches executed:%s of %d\n" +-msgstr "%s de %d ramificacions executades\n" +- +-#: gcov.c:1452 +-#, c-format +-msgid "Taken at least once:%s of %d\n" +-msgstr "%s de %d ramificacions visitades almenys una vegada\n" +- +-#: gcov.c:1458 +-#, c-format +-msgid "No branches\n" +-msgstr "No hi ha ramificacions\n" +- +-#: gcov.c:1460 +-#, c-format +-msgid "Calls executed:%s of %d\n" +-msgstr "%s de %d crides executades\n" +- +-#: gcov.c:1464 +-#, c-format +-msgid "No calls\n" +-msgstr "No hi ha crides\n" +- +-#: gcov.c:1611 +-#, fuzzy, c-format +-msgid "%s:no lines for '%s'\n" +-msgstr "%s:no línies per a \"%s\"\n" +- +-#: gcov.c:1806 +-#, c-format +-msgid "call %2d returned %s\n" +-msgstr "la crida %2d retorna %s\n" +- +-#: gcov.c:1811 +-#, c-format +-msgid "call %2d never executed\n" +-msgstr "la crida %2d mai s'executa\n" +- +-#: gcov.c:1816 +-#, c-format +-msgid "branch %2d taken %s%s\n" +-msgstr "ramificació %2d presa %s%s\n" +- +-#: gcov.c:1820 +-#, c-format +-msgid "branch %2d never executed\n" +-msgstr "la ramificació %2d mai s'executa\n" +- +-#: gcov.c:1825 +-#, c-format +-msgid "unconditional %2d taken %s\n" +-msgstr "incondicional %2d va prendre %s\n" +- +-#: gcov.c:1828 +-#, c-format +-msgid "unconditional %2d never executed\n" +-msgstr "l'incondicional %2d mai s'executa\n" +- +-#: gcov.c:1864 +-#, c-format +-msgid "%s:cannot open source file\n" +-msgstr "%s:no es pot obrir el fitxer font\n" +- +-#: gcse.c:685 +-msgid "GCSE disabled" +-msgstr "GCSE desactivat" +- +-#: gcse.c:6600 +-msgid "jump bypassing disabled" +-msgstr "evitació de salts desactivada" +- +-#. Opening quotation mark. +-#: intl.c:57 +-msgid "`" +-msgstr "" +- +-#. Closing quotation mark. +-#: intl.c:60 +-msgid "'" +-msgstr "" +- +-#: ipa-inline.c:377 +-msgid "--param large-function-growth limit reached" +-msgstr "" +- +-#: ipa-inline.c:392 +-msgid "--param large-stack-frame-growth limit reached" +-msgstr "" +- +-#: ipa-inline.c:410 +-#, fuzzy +-msgid "function not inline candidate" +-msgstr "la funció no pot ser «inline»" +- +-#: ipa-inline.c:426 +-msgid "--param max-inline-insns-single limit reached" +-msgstr "" +- +-#: ipa-inline.c:435 +-msgid "--param max-inline-insns-auto limit reached" +-msgstr "" +- +-#: ipa-inline.c:461 ipa-inline.c:914 ipa-inline.c:1105 ipa-inline.c:1225 +-msgid "recursive inlining" +-msgstr "" +- +-#: ipa-inline.c:922 +-msgid "call is unlikely and code size would grow" +-msgstr "" +- +-#: ipa-inline.c:925 +-msgid "function not declared inline and code size would grow" +-msgstr "" +- +-#: ipa-inline.c:927 +-msgid "optimizing for size and code size would grow" +-msgstr "" +- +-#: ipa-inline.c:1013 +-msgid "--param inline-unit-growth limit reached" +-msgstr "" +- +-#: langhooks.c:389 +-msgid "At top level:" +-msgstr "En el nivell principal:" +- +-#: langhooks.c:407 +-#, fuzzy, c-format +-msgid "In member function %qs" +-msgstr "en la funció membre \"%s\":" +- +-#: langhooks.c:411 +-#, fuzzy, c-format +-msgid "In function %qs" +-msgstr "En la funció \"%s\":" +- +-#: langhooks.c:461 +-#, fuzzy, c-format +-msgid " inlined from %qs at %s:%d:%d" +-msgstr "En el fitxer inclòs de %s:%d" +- +-#: langhooks.c:467 +-#, fuzzy, c-format +-msgid " inlined from %qs at %s:%d" +-msgstr "En el fitxer inclòs de %s:%d" +- +-#: langhooks.c:473 +-#, fuzzy, c-format +-msgid " inlined from %qs" +-msgstr "En el fitxer inclòs des de %s:%u" +- +-#: loop-iv.c:2805 tree-ssa-loop-niter.c:1818 +-msgid "assuming that the loop is not infinite" +-msgstr "" +- +-#: loop-iv.c:2806 tree-ssa-loop-niter.c:1819 +-msgid "cannot optimize possibly infinite loops" +-msgstr "" +- +-#: loop-iv.c:2814 tree-ssa-loop-niter.c:1823 +-msgid "assuming that the loop counter does not overflow" +-msgstr "" +- +-#: loop-iv.c:2815 tree-ssa-loop-niter.c:1824 +-msgid "cannot optimize loop, the loop counter may overflow" +-msgstr "" +- +-#. What to print when a switch has no documentation. +-#: opts.c:348 +-msgid "This switch lacks documentation" +-msgstr "" +- +-#: opts.c:1159 +-msgid "[enabled]" +-msgstr "" +- +-#: opts.c:1159 +-#, fuzzy +-msgid "[disabled]" +-msgstr "GCSE desactivat" +- +-#: opts.c:1170 +-#, c-format +-msgid " No options with the desired characteristics were found\n" +-msgstr "" +- +-#: opts.c:1172 +-#, c-format +-msgid " All options with the desired characteristics have already been displayed\n" +-msgstr "" +- +-#: opts.c:1226 +-msgid "The following options are target specific" +-msgstr "" +- +-#: opts.c:1229 +-msgid "The following options control compiler warning messages" +-msgstr "" +- +-#: opts.c:1232 +-#, fuzzy +-msgid "The following options control optimizations" +-msgstr "Realitzar les optimitzacions de cicle" +- +-#: opts.c:1235 opts.c:1273 +-msgid "The following options are language-independent" +-msgstr "" +- +-#: opts.c:1238 +-msgid "The --param option recognizes the following as parameters" +-msgstr "" +- +-#: opts.c:1245 +-msgid "The following options are specific to the language " +-msgstr "" +- +-#: opts.c:1249 +-msgid "The following options are supported by the language " +-msgstr "" +- +-#: opts.c:1260 +-#, fuzzy +-msgid "The following options are not documented" +-msgstr " Existeixen, però no estan documentades.\n" +- +-#: opts.c:1271 +-msgid "The following options are language-related" +-msgstr "" +- +-#: opts.c:1403 +-#, c-format +-msgid "warning: unrecognized argument to --help= switch: %.*s\n" +-msgstr "" +- +-#: protoize.c:582 +-#, fuzzy, c-format +-msgid "%s: error writing file '%s': %s\n" +-msgstr "%s: error escrivint el fitxer \"%s\": %s\n" +- +-#: protoize.c:626 +-#, c-format +-msgid "%s: usage '%s [ -VqfnkN ] [ -i ] [ filename ... ]'\n" +-msgstr "%s: ùs \"%s [ -VqfnkN ] [ -i ] [ nom_fitxer ... ]\"\n" +- +-#: protoize.c:629 +-#, c-format +-msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B ] [ filename ... ]'\n" +-msgstr "%s: ùs \"%s [ -VqfnkNlgC ] [ -B ] [ nom_fitxer ... ]\"\n" +- +-#: protoize.c:730 +-#, fuzzy, c-format +-msgid "%s: warning: no read access for file '%s'\n" +-msgstr "%s: avís: no hi ha accés de lectura pel fitxer \"%s\"\n" +- +-#: protoize.c:738 +-#, fuzzy, c-format +-msgid "%s: warning: no write access for file '%s'\n" +-msgstr "%s: avís: no hi ha accés d'escriptura pel fitxer \"%s\"\n" +- +-#: protoize.c:746 +-#, fuzzy, c-format +-msgid "%s: warning: no write access for dir containing '%s'\n" +-msgstr "%s: avís: no hi ha accés d'escriptura pel directori que conté \"%s\"\n" +- +-#. Catch cases like /.. where we try to backup to a +-#. point above the absolute root of the logical file +-#. system. +-#: protoize.c:1133 +-#, c-format +-msgid "%s: invalid file name: %s\n" +-msgstr "%s: nom de fitxer no vàlid: %s\n" +- +-#: protoize.c:1281 +-#, c-format +-msgid "%s: %s: can't get status: %s\n" +-msgstr "%s: %s: no es pot obtenir l'estat: %s\n" +- +-#: protoize.c:1302 +-#, c-format +-msgid "" +-"\n" +-"%s: fatal error: aux info file corrupted at line %d\n" +-msgstr "" +-"\n" +-"%s: error fatal: fitxer d'informació auxiliar corrupte a la línia %d\n" +- +-#: protoize.c:1631 +-#, fuzzy, c-format +-msgid "%s:%d: declaration of function '%s' takes different forms\n" +-msgstr "%s:%d: la declaració de la funció `%s' pren formes diferents\n" +- +-#: protoize.c:1886 +-#, fuzzy, c-format +-msgid "%s: compiling '%s'\n" +-msgstr "%s: compilant `%s'\n" +- +-#: protoize.c:1909 +-#, c-format +-msgid "%s: wait: %s\n" +-msgstr "%s: esperar: %s\n" +- +-#: protoize.c:1914 +-#, c-format +-msgid "%s: subprocess got fatal signal %d\n" +-msgstr "%s: el subproces va rebre el senyal fatal %d\n" +- +-#: protoize.c:1922 +-#, c-format +-msgid "%s: %s exited with status %d\n" +-msgstr "%s: %s va acabar amb estat %d\n" +- +-#: protoize.c:1971 +-#, fuzzy, c-format +-msgid "%s: warning: missing SYSCALLS file '%s'\n" +-msgstr "%s: avís: falta el fitxer SYSCALLS \"%s\"\n" +- +-#: protoize.c:1980 protoize.c:2009 +-#, fuzzy, c-format +-msgid "%s: can't read aux info file '%s': %s\n" +-msgstr "%s: no es pot llegir el fitxer d'informació auxiliar \"%s\": %s\n" +- +-#: protoize.c:2025 protoize.c:2053 +-#, fuzzy, c-format +-msgid "%s: can't get status of aux info file '%s': %s\n" +-msgstr "%s: no es pot obtenir l'estat del fitxer d'informació auxiliar \"%s\": %s\n" +- +-#: protoize.c:2081 +-#, fuzzy, c-format +-msgid "%s: can't open aux info file '%s' for reading: %s\n" +-msgstr "%s: no es pot obrir el fitxer d'informació auxiliar \"%s\" per a lectura: %s\n" +- +-#: protoize.c:2099 +-#, fuzzy, c-format +-msgid "%s: error reading aux info file '%s': %s\n" +-msgstr "%s: error llegint el fitxer d'informació auxiliar \"%s\": %s\n" +- +-#: protoize.c:2112 +-#, fuzzy, c-format +-msgid "%s: error closing aux info file '%s': %s\n" +-msgstr "%s: error tancant el fitxer d'informació auxiliar \"%s\": %s\n" +- +-#: protoize.c:2128 +-#, fuzzy, c-format +-msgid "%s: can't delete aux info file '%s': %s\n" +-msgstr "%s: no es pot esborrar el fitxer d'informació auxiliar \"%s\": %s\n" +- +-#: protoize.c:2210 protoize.c:4180 +-#, fuzzy, c-format +-msgid "%s: can't delete file '%s': %s\n" +-msgstr "%s: no es pot esborrar el fitxer \"%s\": %s\n" +- +-#: protoize.c:2288 +-#, fuzzy, c-format +-msgid "%s: warning: can't rename file '%s' to '%s': %s\n" +-msgstr "%s: avís: no es pot renomenar el fitxer \"%s\" a \"%s\": %s\n" +- +-#: protoize.c:2410 +-#, c-format +-msgid "%s: conflicting extern definitions of '%s'\n" +-msgstr "%s: definicions externes de \"%s\" en conflicte\n" +- +-#: protoize.c:2414 +-#, c-format +-msgid "%s: declarations of '%s' will not be converted\n" +-msgstr "%s: les declaracions de \"%s\" no es convertiran\n" +- +-#: protoize.c:2416 +-#, c-format +-msgid "%s: conflict list for '%s' follows:\n" +-msgstr "%s: llistes de conflictes per a \"%s\" a continuació:\n" +- +-#: protoize.c:2449 +-#, fuzzy, c-format +-msgid "%s: warning: using formals list from %s(%d) for function '%s'\n" +-msgstr "%s: avís: usant llistes formals de %s(%d) per a la funció \"%s\"\n" +- +-#: protoize.c:2489 +-#, fuzzy, c-format +-msgid "%s: %d: '%s' used but missing from SYSCALLS\n" +-msgstr "%s: %d: s'usa \"%s\" però falta en SYSCALLS\n" +- +-#: protoize.c:2495 +-#, fuzzy, c-format +-msgid "%s: %d: warning: no extern definition for '%s'\n" +-msgstr "%s: %d: avís: no hi ha definició extern per a \"%s\"\n" +- +-#: protoize.c:2525 +-#, fuzzy, c-format +-msgid "%s: warning: no static definition for '%s' in file '%s'\n" +-msgstr "%s: avís: no hi ha definició static per a \"%s\" en el fitxer \"%s\"\n" +- +-#: protoize.c:2531 +-#, fuzzy, c-format +-msgid "%s: multiple static defs of '%s' in file '%s'\n" +-msgstr "%s: definicions static múltiples de \"%s\" en el fitxer \"%s\"\n" +- +-#: protoize.c:2701 protoize.c:2704 +-#, c-format +-msgid "%s: %d: warning: source too confusing\n" +-msgstr "%s: %d: avís: codi font massa confús\n" +- +-#: protoize.c:2899 +-#, c-format +-msgid "%s: %d: warning: varargs function declaration not converted\n" +-msgstr "%s: %d: avís: no es va convertir la declaració de la funció varargs\n" +- +-#: protoize.c:2914 +-#, fuzzy, c-format +-msgid "%s: declaration of function '%s' not converted\n" +-msgstr "%s: no es va convertir la declaració de la funció \"%s\"\n" +- +-#: protoize.c:3037 +-#, fuzzy, c-format +-msgid "%s: warning: too many parameter lists in declaration of '%s'\n" +-msgstr "%s: avís: massa llistes de paràmetres en la declaració de \"%s\"\n" +- +-#: protoize.c:3058 +-#, fuzzy, c-format +-msgid "" +-"\n" +-"%s: warning: too few parameter lists in declaration of '%s'\n" +-msgstr "" +-"\n" +-"%s: avís: molt poques llistes de paràmetres en la declaració de \"%s\"\n" +- +-#: protoize.c:3154 +-#, fuzzy, c-format +-msgid "%s: %d: warning: found '%s' but expected '%s'\n" +-msgstr "%s: %d: avís: es va trobar \"%s\" però s'esperava \"%s\"\n" +- +-#: protoize.c:3329 +-#, fuzzy, c-format +-msgid "%s: local declaration for function '%s' not inserted\n" +-msgstr "%s: no es va inserir la declaració local per a la funció \"%s\"\n" +- +-#: protoize.c:3356 +-#, fuzzy, c-format +-msgid "" +-"\n" +-"%s: %d: warning: can't add declaration of '%s' into macro call\n" +-msgstr "" +-"\n" +-"%s: %d: avís: no es pot afegir la declaració per a\"%s\" en la crida de macro\n" +- +-#: protoize.c:3428 +-#, fuzzy, c-format +-msgid "%s: global declarations for file '%s' not inserted\n" +-msgstr "%s: no es van inserir les declaracions globals pel fitxer \"%s\"\n" +- +-#: protoize.c:3518 protoize.c:3548 +-#, fuzzy, c-format +-msgid "%s: definition of function '%s' not converted\n" +-msgstr "%s: no es va convertir la definició de la funció \"%s\"\n" +- +-#: protoize.c:3537 +-#, c-format +-msgid "%s: %d: warning: definition of %s not converted\n" +-msgstr "%s: %d: avís: no es va convertir la definició de %s\n" +- +-#: protoize.c:3863 +-#, fuzzy, c-format +-msgid "%s: found definition of '%s' at %s(%d)\n" +-msgstr "%s: es va trobar la definició de \"%s\" en %s(%d)\n" +- +-#. If we make it here, then we did not know about this +-#. function definition. +-#: protoize.c:3879 +-#, fuzzy, c-format +-msgid "%s: %d: warning: '%s' excluded by preprocessing\n" +-msgstr "%s: %d: avís: \"%s\" va ser exclòs pel preprocessament\n" +- +-#: protoize.c:3882 +-#, c-format +-msgid "%s: function definition not converted\n" +-msgstr "%s: no es va convertir la definició de la funció\n" +- +-#: protoize.c:3940 +-#, fuzzy, c-format +-msgid "%s: '%s' not converted\n" +-msgstr "%s: no es va convertir \"%s\"\n" +- +-#: protoize.c:3948 +-#, fuzzy, c-format +-msgid "%s: would convert file '%s'\n" +-msgstr "%s: es podria convertir el fitxer \"%s\"\n" +- +-#: protoize.c:3951 +-#, fuzzy, c-format +-msgid "%s: converting file '%s'\n" +-msgstr "%s: convertint el fitxer \"%s\"\n" +- +-#: protoize.c:3961 +-#, fuzzy, c-format +-msgid "%s: can't get status for file '%s': %s\n" +-msgstr "%s: no es pot obtenir l'estat del fitxer \"%s\": %s\n" +- +-#: protoize.c:4003 +-#, fuzzy, c-format +-msgid "%s: can't open file '%s' for reading: %s\n" +-msgstr "%s: no es pot obrir el fitxer \"%s\" per a lectura: %s\n" +- +-#: protoize.c:4018 +-#, fuzzy, c-format +-msgid "" +-"\n" +-"%s: error reading input file '%s': %s\n" +-msgstr "" +-"\n" +-"%s: error al llegint el fitxer d'entrada \"%s\": %s\n" +- +-#: protoize.c:4052 +-#, fuzzy, c-format +-msgid "%s: can't create/open clean file '%s': %s\n" +-msgstr "%s: no es pot crear/obrir el fitxer net \"%s\": %s\n" +- +-#: protoize.c:4157 +-#, fuzzy, c-format +-msgid "%s: warning: file '%s' already saved in '%s'\n" +-msgstr "%s: avís: el fitxer \"%s\" ja havia estat guardat en \"%s\"\n" +- +-#: protoize.c:4165 +-#, fuzzy, c-format +-msgid "%s: can't link file '%s' to '%s': %s\n" +-msgstr "%s: no es pot enllaçar el fitxer \"%s\" a \"%s\": %s\n" +- +-#: protoize.c:4195 +-#, fuzzy, c-format +-msgid "%s: can't create/open output file '%s': %s\n" +-msgstr "%s: no es pot crear/obrir el fitxer de sortida \"%s\": %s\n" +- +-#: protoize.c:4228 +-#, fuzzy, c-format +-msgid "%s: can't change mode of file '%s': %s\n" +-msgstr "%s: no es pot canviar el mode del fitxer \"%s\": %s\n" +- +-#: protoize.c:4404 +-#, c-format +-msgid "%s: cannot get working directory: %s\n" +-msgstr "%s: no es pot obtenir el directori de treball: %s\n" +- +-#: protoize.c:4502 +-#, c-format +-msgid "%s: input file names must have .c suffixes: %s\n" +-msgstr "%s: els noms de fitxer d'entrada deuen tenir sufixos .c: %s\n" +- +-#: reload.c:3734 +-msgid "unable to generate reloads for:" +-msgstr "no es poden generar recarregues per a:" +- +-#: reload1.c:2000 +-msgid "this is the insn:" +-msgstr "això és el insn:" +- +-#. It's the compiler's fault. +-#: reload1.c:5363 +-msgid "could not find a spill register" +-msgstr "no es pot trobar un registre de buidat " +- +-#. It's the compiler's fault. +-#: reload1.c:7038 +-msgid "VOIDmode on an output" +-msgstr "VOIDmode en una sortida" +- +-#: reload1.c:8043 +-msgid "Failure trying to reload:" +-msgstr "" +- +-#: rtl-error.c:127 +-msgid "unrecognizable insn:" +-msgstr "insn no recognoscible:" +- +-#: rtl-error.c:129 +-msgid "insn does not satisfy its constraints:" +-msgstr "insn no satisfà les seves restriccions:" +- +-#: timevar.c:411 +-msgid "" +-"\n" +-"Execution times (seconds)\n" +-msgstr "" +-"\n" +-"Temps d'execució (segons)\n" +- +-#. Print total time. +-#: timevar.c:469 +-msgid " TOTAL :" +-msgstr " TOTAL :" +- +-#: timevar.c:502 +-#, c-format +-msgid "time in %s: %ld.%06ld (%ld%%)\n" +-msgstr "temps en %s: %ld.%06ld (%ld%%)\n" +- +-#: tlink.c:383 +-#, c-format +-msgid "collect: reading %s\n" +-msgstr "collect: llegint %s\n" +- +-#: tlink.c:477 +-#, c-format +-msgid "removing .rpo file" +-msgstr "" +- +-#: tlink.c:479 +-#, c-format +-msgid "renaming .rpo file" +-msgstr "" +- +-#: tlink.c:533 +-#, c-format +-msgid "collect: recompiling %s\n" +-msgstr "collect: recompilant %s\n" +- +-#: tlink.c:737 +-#, c-format +-msgid "collect: tweaking %s in %s\n" +-msgstr "collect: alterant %s en %s\n" +- +-#: tlink.c:787 +-#, c-format +-msgid "collect: relinking\n" +-msgstr "collect: reenllaçant\n" +- +-#: toplev.c:606 +-#, fuzzy, c-format +-msgid "unrecoverable error" +-msgstr "error intern" +- +-#: toplev.c:1180 +-#, fuzzy, c-format +-msgid "" +-"%s%s%s %sversion %s (%s)\n" +-"%s\tcompiled by GNU C version %s, " +-msgstr "" +-"%s%s%s versió %s (%s)\n" +-"%s\tcompilat amb GNU C versió %s.\n" +-"%s%s%s versió %s (%s) compilada per a CC.\n" +- +-#: toplev.c:1182 +-#, c-format +-msgid "%s%s%s %sversion %s (%s) compiled by CC, " +-msgstr "" +- +-#: toplev.c:1186 +-#, fuzzy, c-format +-msgid "GMP version %s, MPFR version %s.\n" +-msgstr "\"%s\" en versió \"%.4s\", s'espera la versió \"%.4s\"" +- +-#: toplev.c:1188 +-#, c-format +-msgid "warning: %s header version %s differs from library version %s.\n" +-msgstr "" +- +-#: toplev.c:1190 +-#, c-format +-msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" +-msgstr "" +- +-#: toplev.c:1340 +-msgid "options passed: " +-msgstr "opcions passades: " +- +-#: toplev.c:1374 +-msgid "options enabled: " +-msgstr "opcions activades: " +- +-#: toplev.c:1509 +-#, c-format +-msgid "created and used with differing settings of '%s'" +-msgstr "" +- +-#: toplev.c:1511 +-msgid "out of memory" +-msgstr "" +- +-#: toplev.c:1526 +-msgid "created and used with different settings of -fpic" +-msgstr "" +- +-#: toplev.c:1528 +-msgid "created and used with different settings of -fpie" +-msgstr "" +- +-#: tree-inline.c:2571 +-msgid "originally indirect function call not considered for inlining" +-msgstr "" +- +-#. The remainder are real diagnostic types. +-#: diagnostic.def:15 +-#, fuzzy +-msgid "fatal error: " +-msgstr "error intern: " +- +-#: diagnostic.def:16 +-#, fuzzy +-msgid "internal compiler error: " +-msgstr "error intern: " +- +-#: diagnostic.def:17 +-#, fuzzy +-msgid "error: " +-msgstr "error intern: " +- +-#: diagnostic.def:18 +-#, fuzzy +-msgid "sorry, unimplemented: " +-msgstr "disculpi, no s'ha implementat: #pragma noalign NAME" +- +-#: diagnostic.def:19 +-msgid "warning: " +-msgstr "avís: " +- +-#: diagnostic.def:20 +-msgid "anachronism: " +-msgstr "" +- +-#: diagnostic.def:21 +-#, fuzzy +-msgid "note: " +-msgstr "nota:" +- +-#: diagnostic.def:22 +-msgid "debug: " +-msgstr "" +- +-#: params.def:46 +-msgid "The maximum number of fields in a structure variable without direct structure accesses that GCC will attempt to track separately" +-msgstr "" +- +-#: params.def:53 +-#, fuzzy +-msgid "The maximum number of elements in an array for wich we track its elements separately" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a inlining" +- +-#: params.def:62 +-msgid "The maximum structure size (in bytes) for which GCC will use by-element copies" +-msgstr "" +- +-#: params.def:71 +-#, fuzzy +-msgid "The maximum number of structure fields for which GCC will use by-element copies" +-msgstr "El nombre màxim d'instruccions pel inliner RTL" +- +-#: params.def:83 +-msgid "The threshold ratio between instantiated fields and the total structure size" +-msgstr "" +- +-#: params.def:93 +-msgid "The threshold ratio between current and hotest structure counts" +-msgstr "" +- +-#: params.def:110 +-msgid "The maximum number of instructions in a single function eligible for inlining" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a inlining" +- +-#: params.def:122 +-msgid "The maximum number of instructions when automatically inlining" +-msgstr "El nombre màxim d'instruccions quan es fa inlining automàticament" +- +-#: params.def:127 +-#, fuzzy +-msgid "The maximum number of instructions inline function can grow to via recursive inlining" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a inlining" +- +-#: params.def:132 +-#, fuzzy +-msgid "The maximum number of instructions non-inline function can grow to via recursive inlining" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a inlining" +- +-#: params.def:137 +-msgid "The maximum depth of recursive inlining for inline functions" +-msgstr "" +- +-#: params.def:142 +-msgid "The maximum depth of recursive inlining for non-inline functions" +-msgstr "" +- +-#: params.def:147 +-msgid "Inline recursively only when the probability of call being executed exceeds the parameter" +-msgstr "" +- +-#: params.def:154 +-msgid "If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will be expanded during loop unrolling" +-msgstr "" +- +-#: params.def:160 +-msgid "If -ftree-vectorize is used, the minimal loop bound of a loop to be considered for vectorization" +-msgstr "" +- +-#: params.def:171 +-msgid "The maximum number of instructions to consider to fill a delay slot" +-msgstr "El nombre màxim d'instruccions per a considerar l'omplert d'una ranura de retard" +- +-#: params.def:182 +-msgid "The maximum number of instructions to consider to find accurate live register information" +-msgstr "El nombre màxim d'instruccions per a considerar la recerca d'informació de registres en viu exacta" +- +-#: params.def:192 +-msgid "The maximum length of scheduling's pending operations list" +-msgstr "La longitud màxima de la llista d'operacions pendents del planificador de tasques" +- +-#: params.def:197 +-msgid "The size of function body to be considered large" +-msgstr "" +- +-#: params.def:201 +-msgid "Maximal growth due to inlining of large function (in percent)" +-msgstr "" +- +-#: params.def:205 +-msgid "The size of translation unit to be considered large" +-msgstr "" +- +-#: params.def:209 +-msgid "how much can given compilation unit grow because of the inlining (in percent)" +-msgstr "" +- +-#: params.def:213 +-msgid "expense of call operation relative to ordinary arithmetic operations" +-msgstr "" +- +-#: params.def:217 +-msgid "The size of stack frame to be considered large" +-msgstr "" +- +-#: params.def:221 +-msgid "Maximal stack frame growth due to inlining (in percent)" +-msgstr "" +- +-#: params.def:228 +-msgid "The maximum amount of memory to be allocated by GCSE" +-msgstr "La quantitat màxima de memòria a ser assignada per GCSE" +- +-#: params.def:233 +-msgid "The maximum number of passes to make when doing GCSE" +-msgstr "El nombre màxim de passos a realitzar quan es fa GCSE" +- +-#: params.def:243 +-msgid "The threshold ratio for performing partial redundancy elimination after reload" +-msgstr "" +- +-#: params.def:250 +-msgid "The threshold ratio of critical edges execution count that permit performing redundancy elimination after reload" +-msgstr "" +- +-#: params.def:261 +-msgid "The maximum number of instructions to consider to unroll in a loop" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:267 +-#, fuzzy +-msgid "The maximum number of instructions to consider to unroll in a loop on average" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:272 +-msgid "The maximum number of unrollings of a single loop" +-msgstr "" +- +-#: params.def:277 +-#, fuzzy +-msgid "The maximum number of insns of a peeled loop" +-msgstr "El nombre màxim d'instruccions per a considerar l'omplert d'una ranura de retard" +- +-#: params.def:282 +-#, fuzzy +-msgid "The maximum number of peelings of a single loop" +-msgstr "El nombre màxim de passos a realitzar quan es fa GCSE" +- +-#: params.def:287 +-#, fuzzy +-msgid "The maximum number of insns of a completely peeled loop" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:292 +-#, fuzzy +-msgid "The maximum number of peelings of a single loop that is peeled completely" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a inlining" +- +-#: params.def:297 +-#, fuzzy +-msgid "The maximum number of insns of a peeled loop that rolls only once" +-msgstr "El nombre màxim d'instruccions per al inliner de RTL" +- +-#: params.def:303 +-#, fuzzy +-msgid "The maximum number of insns of an unswitched loop" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:308 +-#, fuzzy +-msgid "The maximum number of unswitchings in a single loop" +-msgstr "El nombre màxim d'instruccions en una sola funció elegible per a un sol cicle" +- +-#: params.def:315 +-msgid "Bound on the number of iterations the brute force # of iterations analysis algorithm evaluates" +-msgstr "" +- +-#: params.def:321 +-msgid "Bound on the cost of an expression to compute the number of iterations" +-msgstr "" +- +-#: params.def:327 +-msgid "A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop" +-msgstr "" +- +-#: params.def:331 +-msgid "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA" +-msgstr "" +- +-#: params.def:335 +-msgid "A threshold on the average loop count considered by the swing modulo scheduler" +-msgstr "" +- +-#: params.def:340 +-msgid "Select fraction of the maximal count of repetitions of basic block in program given basic block needs to have to be considered hot" +-msgstr "" +- +-#: params.def:344 +-msgid "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot" +-msgstr "" +- +-#: params.def:349 +-msgid "Select fraction of the maximal frequency of executions of basic block in function given basic block get alignment" +-msgstr "" +- +-#: params.def:354 +-msgid "Loops iterating at least selected number of iterations will get loop alignement." +-msgstr "" +- +-#: params.def:370 +-#, fuzzy +-msgid "The maximum number of loop iterations we predict statically" +-msgstr "El nombre màxim d'instruccions quan es fa inlining automàticament" +- +-#: params.def:374 +-msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available" +-msgstr "" +- +-#: params.def:378 +-msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available" +-msgstr "" +- +-#: params.def:382 +-msgid "Maximal code growth caused by tail duplication (in percent)" +-msgstr "" +- +-#: params.def:386 +-msgid "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percent)" +-msgstr "" +- +-#: params.def:390 +-msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is available" +-msgstr "" +- +-#: params.def:394 +-msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is not available" +-msgstr "" +- +-#: params.def:400 +-msgid "The maximum number of incoming edges to consider for crossjumping" +-msgstr "El nombre màxim de vores d'entrada per a considerar el salt creuat" +- +-#: params.def:406 +-#, fuzzy +-msgid "The minimum number of matching instructions to consider for crossjumping" +-msgstr "El nombre màxim de vores d'entrada per a considerar el salt creuat" +- +-#: params.def:412 +-msgid "The maximum expansion factor when copying basic blocks" +-msgstr "" +- +-#: params.def:418 +-#, fuzzy +-msgid "The maximum number of insns to duplicate when unfactoring computed gotos" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:424 +-#, fuzzy +-msgid "The maximum length of path considered in cse" +-msgstr "La longitud màxima de la llista d'operacions pendents del planificador de tasques" +- +-#: params.def:428 +-#, fuzzy +-msgid "The maximum instructions CSE process before flushing" +-msgstr "El nombre màxim d'instruccions pel inliner RTL" +- +-#: params.def:435 +-msgid "The minimum cost of an expensive expression in the loop invariant motion" +-msgstr "" +- +-#: params.def:444 +-msgid "Bound on number of candidates below that all candidates are considered in iv optimizations" +-msgstr "" +- +-#: params.def:452 +-#, fuzzy +-msgid "Bound on number of iv uses in loop optimized in iv optimizations" +-msgstr "Realitzar un nombre menor d'optimitzacions costoses" +- +-#: params.def:460 +-msgid "If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization" +-msgstr "" +- +-#: params.def:465 +-msgid "Bound on size of expressions used in the scalar evolutions analyzer" +-msgstr "" +- +-#: params.def:470 +-msgid "Bound on the number of variables in Omega constraint systems" +-msgstr "" +- +-#: params.def:475 +-msgid "Bound on the number of inequalities in Omega constraint systems" +-msgstr "" +- +-#: params.def:480 +-msgid "Bound on the number of equalities in Omega constraint systems" +-msgstr "" +- +-#: params.def:485 +-msgid "Bound on the number of wild cards in Omega constraint systems" +-msgstr "" +- +-#: params.def:490 +-msgid "Bound on the size of the hash table in Omega constraint systems" +-msgstr "" +- +-#: params.def:495 +-msgid "Bound on the number of keys in Omega constraint systems" +-msgstr "" +- +-#: params.def:500 +-msgid "When set to 1, use expensive methods to eliminate all redundant constraints" +-msgstr "" +- +-#: params.def:505 +-msgid "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alignment check" +-msgstr "" +- +-#: params.def:510 +-msgid "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alias check" +-msgstr "" +- +-#: params.def:515 +-#, fuzzy +-msgid "The maximum memory locations recorded by cselib" +-msgstr "El nombre màxim d'instruccions per al inliner de RTL" +- +-#: params.def:519 +-#, fuzzy +-msgid "The maximum memory locations recorded by flow" +-msgstr "El nombre màxim d'instruccions per al inliner de RTL" +- +-#: params.def:532 +-msgid "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap" +-msgstr "" +- +-#: params.def:537 +-msgid "Minimum heap size before we start collecting garbage, in kilobytes" +-msgstr "" +- +-#: params.def:545 +-#, fuzzy +-msgid "The maximum number of instructions to search backward when looking for equivalent reload" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:550 +-msgid "The maximum number of virtual operators that a function is allowed to have before triggering memory partitioning heuristics" +-msgstr "" +- +-#: params.def:555 +-msgid "The average number of virtual operators that memory statements are allowed to have before triggering memory partitioning heuristics" +-msgstr "" +- +-#: params.def:560 +-#, fuzzy +-msgid "The maximum number of blocks in a region to be considered for interblock scheduling" +-msgstr "El nombre màxim de vores d'entrada per a considerar el salt creuat" +- +-#: params.def:565 +-#, fuzzy +-msgid "The maximum number of insns in a region to be considered for interblock scheduling" +-msgstr "El nombre màxim de vores d'entrada per a considerar el salt creuat" +- +-#: params.def:570 +-msgid "The minimum probability of reaching a source block for interblock speculative scheduling" +-msgstr "" +- +-#: params.def:575 +-#, fuzzy +-msgid "The maximum number of iterations through CFG to extend regions" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:580 +-#, fuzzy +-msgid "The maximum conflict delay for an insn to be considered for speculative motion" +-msgstr "El nombre màxim de vores d'entrada per a considerar el salt creuat" +- +-#: params.def:585 +-msgid "The minimal probability of speculation success (in percents), so that speculative insn will be scheduled." +-msgstr "" +- +-#: params.def:590 +-msgid "The maximum number of RTL nodes that can be recorded as combiner's last value" +-msgstr "" +- +-#: params.def:598 +-#, fuzzy +-msgid "The upper bound for sharing integer constants" +-msgstr "el valor de enumerator per a \"%s\" no és una constant entera" +- +-#: params.def:617 +-#, fuzzy +-msgid "Minimum number of virtual mappings to consider switching to full virtual renames" +-msgstr "El nombre màxim d'instruccions per a considerar l'omplert d'una ranura de retard" +- +-#: params.def:622 +-msgid "Ratio between virtual mappings and virtual symbols to do full virtual renames" +-msgstr "" +- +-#: params.def:627 +-msgid "The lower bound for a buffer to be considered for stack smashing protection" +-msgstr "" +- +-#: params.def:645 +-msgid "Maximum number of statements allowed in a block that needs to be duplicated when threading jumps" +-msgstr "" +- +-#: params.def:654 +-msgid "Maximum number of fields in a structure before pointer analysis treats the structure as a single variable" +-msgstr "" +- +-#: params.def:659 +-#, fuzzy +-msgid "The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass" +-msgstr "El nombre màxim d'instruccions per a considerar el desenrotllo en un cicle" +- +-#: params.def:669 +-msgid "The number of insns executed before prefetch is completed" +-msgstr "" +- +-#: params.def:676 +-msgid "The number of prefetches that can run at the same time" +-msgstr "" +- +-#: params.def:683 +-msgid "The size of L1 cache" +-msgstr "" +- +-#: params.def:690 +-msgid "The size of L1 cache line" +-msgstr "" +- +-#: params.def:697 +-msgid "The size of L2 cache" +-msgstr "" +- +-#: params.def:708 +-msgid "Whether to use canonical types" +-msgstr "" +- +-#: params.def:713 +-msgid "Maximum length of partial antic set when performing tree pre optimization" +-msgstr "" +- +-#: config/alpha/alpha.c:5015 +-#, c-format +-msgid "invalid %%H value" +-msgstr "valor %%H no vàlid" +- +-#: config/alpha/alpha.c:5036 config/bfin/bfin.c:1423 +-#, c-format +-msgid "invalid %%J value" +-msgstr "valor %%J no vàlid" +- +-#: config/alpha/alpha.c:5066 config/ia64/ia64.c:4718 +-#, c-format +-msgid "invalid %%r value" +-msgstr "valor %%r no vàlid" +- +-#: config/alpha/alpha.c:5076 config/ia64/ia64.c:4672 +-#: config/rs6000/rs6000.c:11670 config/xtensa/xtensa.c:2036 +-#, c-format +-msgid "invalid %%R value" +-msgstr "valor %%R no vàlid" +- +-#: config/alpha/alpha.c:5082 config/rs6000/rs6000.c:11589 +-#: config/xtensa/xtensa.c:2003 +-#, c-format +-msgid "invalid %%N value" +-msgstr "valor %%N no vàlid" +- +-#: config/alpha/alpha.c:5090 config/rs6000/rs6000.c:11617 +-#, c-format +-msgid "invalid %%P value" +-msgstr "valor %%P no vàlid" +- +-#: config/alpha/alpha.c:5098 +-#, c-format +-msgid "invalid %%h value" +-msgstr "valor %%h no vàlid" +- +-#: config/alpha/alpha.c:5106 config/xtensa/xtensa.c:2029 +-#, c-format +-msgid "invalid %%L value" +-msgstr "valor %%L no vàlid" +- +-#: config/alpha/alpha.c:5145 config/rs6000/rs6000.c:11571 +-#, c-format +-msgid "invalid %%m value" +-msgstr "valor %%m no vàlid" +- +-#: config/alpha/alpha.c:5153 config/rs6000/rs6000.c:11579 +-#, c-format +-msgid "invalid %%M value" +-msgstr "valor %%M no vàlid" +- +-#: config/alpha/alpha.c:5197 +-#, c-format +-msgid "invalid %%U value" +-msgstr "valor %%U no vàlid" +- +-#: config/alpha/alpha.c:5209 config/alpha/alpha.c:5223 +-#: config/rs6000/rs6000.c:11678 +-#, c-format +-msgid "invalid %%s value" +-msgstr "valor %%s no vàlid" +- +-#: config/alpha/alpha.c:5246 +-#, c-format +-msgid "invalid %%C value" +-msgstr "valor %%C no vàlid" +- +-#: config/alpha/alpha.c:5283 config/rs6000/rs6000.c:11406 +-#: config/rs6000/rs6000.c:11425 +-#, c-format +-msgid "invalid %%E value" +-msgstr "valor %%E no vàlid" +- +-#: config/alpha/alpha.c:5308 config/alpha/alpha.c:5356 +-#, c-format +-msgid "unknown relocation unspec" +-msgstr "reubicació unspec desconeguda" +- +-#: config/alpha/alpha.c:5317 config/crx/crx.c:1081 +-#: config/rs6000/rs6000.c:12005 config/spu/spu.c:1492 +-#, c-format +-msgid "invalid %%xn code" +-msgstr "codi %%xn no vàlid" +- +-#: config/arc/arc.c:1724 config/m32r/m32r.c:1805 +-#, c-format +-msgid "invalid operand to %%R code" +-msgstr "operand no vàlid per al codi %%R" +- +-#: config/arc/arc.c:1756 config/m32r/m32r.c:1828 +-#, c-format +-msgid "invalid operand to %%H/%%L code" +-msgstr "operand no vàlid per al codi %%H/%%L" +- +-#: config/arc/arc.c:1778 config/m32r/m32r.c:1899 +-#, c-format +-msgid "invalid operand to %%U code" +-msgstr "operand no vàlid per al codi %%U" +- +-#: config/arc/arc.c:1789 +-#, c-format +-msgid "invalid operand to %%V code" +-msgstr "operand no vàlid per al codi %%V" +- +-#. Unknown flag. +-#. Undocumented flag. +-#: config/arc/arc.c:1796 config/m32r/m32r.c:1926 config/sparc/sparc.c:6995 +-#, c-format +-msgid "invalid operand output code" +-msgstr "operand no vàlid per al codi de sortida" +- +-#: config/arm/arm.c:12521 config/arm/arm.c:12539 +-#, fuzzy, c-format +-msgid "predicated Thumb instruction" +-msgstr "Generar instruccions char" +- +-#: config/arm/arm.c:12527 +-#, fuzzy, c-format +-msgid "predicated instruction in conditional sequence" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: config/arm/arm.c:12686 +-#, fuzzy, c-format +-msgid "invalid shift operand" +-msgstr "operand %%f no vàlid" +- +-#: config/arm/arm.c:12733 config/arm/arm.c:12743 config/arm/arm.c:12753 +-#: config/arm/arm.c:12763 config/arm/arm.c:12773 config/arm/arm.c:12812 +-#: config/arm/arm.c:12830 config/arm/arm.c:12865 config/arm/arm.c:12884 +-#: config/arm/arm.c:12899 config/arm/arm.c:12927 config/arm/arm.c:12934 +-#: config/arm/arm.c:12942 config/arm/arm.c:12963 config/arm/arm.c:12970 +-#: config/bfin/bfin.c:1436 config/bfin/bfin.c:1443 config/bfin/bfin.c:1450 +-#: config/bfin/bfin.c:1457 config/bfin/bfin.c:1466 config/bfin/bfin.c:1473 +-#: config/bfin/bfin.c:1480 config/bfin/bfin.c:1487 +-#, fuzzy, c-format +-msgid "invalid operand for code '%c'" +-msgstr "codi d'operand \"%c\" no vàlid" +- +-#: config/arm/arm.c:12825 +-#, fuzzy, c-format +-msgid "instruction never executed" +-msgstr "l'incondicional %2d mai s'executa\n" +- +-#: config/arm/arm.c:13037 +-#, fuzzy, c-format +-msgid "missing operand" +-msgstr "\"(\" faltant" +- +-#: config/avr/avr.c:1022 +-#, c-format +-msgid "address operand requires constraint for X, Y, or Z register" +-msgstr "" +- +-#: config/avr/avr.c:1129 +-msgid "bad address, not (reg+disp):" +-msgstr "adreça errònia, no (reg+disp)" +- +-#: config/avr/avr.c:1136 +-#, fuzzy +-msgid "bad address, not post_inc or pre_dec:" +-msgstr "adreça errònia, no (reg+disp)" +- +-#: config/avr/avr.c:1147 +-msgid "internal compiler error. Bad address:" +-msgstr "error intern del compilador. Direcció errònia:" +- +-#: config/avr/avr.c:1160 +-msgid "internal compiler error. Unknown mode:" +-msgstr "error intern del compilador. Mode desconegut:" +- +-#: config/avr/avr.c:1775 config/avr/avr.c:2463 +-msgid "invalid insn:" +-msgstr "insn no vàlid:" +- +-#: config/avr/avr.c:1814 config/avr/avr.c:1900 config/avr/avr.c:1949 +-#: config/avr/avr.c:1977 config/avr/avr.c:2072 config/avr/avr.c:2241 +-#: config/avr/avr.c:2502 config/avr/avr.c:2614 +-msgid "incorrect insn:" +-msgstr "insn incorrecte:" +- +-#: config/avr/avr.c:1996 config/avr/avr.c:2157 config/avr/avr.c:2312 +-#: config/avr/avr.c:2680 +-msgid "unknown move insn:" +-msgstr "desplaçament insn desconegut:" +- +-#: config/avr/avr.c:2910 +-msgid "bad shift insn:" +-msgstr "desplaçament insn erròni:" +- +-#: config/avr/avr.c:3026 config/avr/avr.c:3446 config/avr/avr.c:3804 +-msgid "internal compiler error. Incorrect shift:" +-msgstr "error intern del compilador. Direcció errònia:" +- +-#: config/bfin/bfin.c:1385 +-#, c-format +-msgid "invalid %%j value" +-msgstr "valor %%j no vàlid" +- +-#: config/bfin/bfin.c:1578 +-#, fuzzy, c-format +-msgid "invalid const_double operand" +-msgstr "restriccions no vàlides per a l'operand" +- +-#: config/c4x/c4x.c:1583 +-msgid "using CONST_DOUBLE for address" +-msgstr "ùs de CONST_DOUBLE per a l'adreça" +- +-#: config/c4x/c4x.c:1721 +-msgid "c4x_address_cost: Invalid addressing mode" +-msgstr "c4x_address_cost: Moda d'adreçament no vàlid" +- +-#: config/c4x/c4x.c:1856 +-#, c-format +-msgid "c4x_print_operand: %%L inconsistency" +-msgstr "c4x_print_operand: inconsistència %%L" +- +-#: config/c4x/c4x.c:1862 +-#, c-format +-msgid "c4x_print_operand: %%N inconsistency" +-msgstr "c4x_print_operand: inconsistència %%N" +- +-#: config/c4x/c4x.c:1903 +-#, c-format +-msgid "c4x_print_operand: %%O inconsistency" +-msgstr "c4x_print_operand: inconsistència %%O" +- +-#: config/c4x/c4x.c:1998 +-msgid "c4x_print_operand: Bad operand case" +-msgstr "c4x_print_operand: Operand «case» erroni" +- +-#: config/c4x/c4x.c:2039 +-msgid "c4x_print_operand_address: Bad post_modify" +-msgstr "c4x_print_operand_address: post_modify erroni" +- +-#: config/c4x/c4x.c:2061 +-msgid "c4x_print_operand_address: Bad pre_modify" +-msgstr "c4x_print_operand_address: pre_modify erroni" +- +-#: config/c4x/c4x.c:2109 config/c4x/c4x.c:2121 config/c4x/c4x.c:2136 +-msgid "c4x_print_operand_address: Bad operand case" +-msgstr "c4x_print_operand_address: Operand «case» erroni" +- +-#: config/c4x/c4x.c:2387 +-msgid "c4x_rptb_insert: Cannot find start label" +-msgstr "c4x_rptb_insert: No es pot trobar l'etiqueta d'inici" +- +-#: config/c4x/c4x.c:2985 +-msgid "invalid indirect memory address" +-msgstr "adreça indirecta de memòria no vàlida" +- +-#: config/c4x/c4x.c:3074 +-msgid "invalid indirect (S) memory address" +-msgstr "adreça indirecta de memòria (S) no vàlida" +- +-#: config/c4x/c4x.c:3409 +-msgid "c4x_valid_operands: Internal error" +-msgstr "c4x_valid_operands: error intern" +- +-#: config/c4x/c4x.c:3848 +-msgid "c4x_operand_subword: invalid mode" +-msgstr "c4x_operand_subword: mode no vàlid" +- +-#: config/c4x/c4x.c:3851 +-msgid "c4x_operand_subword: invalid operand" +-msgstr "c4x_operand_subword: operand no vàlid" +- +-#. We could handle these with some difficulty. +-#. e.g., *p-- => *(p-=2); *(p+1). +-#: config/c4x/c4x.c:3877 +-msgid "c4x_operand_subword: invalid autoincrement" +-msgstr "c4x_operand_subword: autoincrement no vàlid" +- +-#: config/c4x/c4x.c:3883 +-msgid "c4x_operand_subword: invalid address" +-msgstr "c4x_operand_subword: adreça no vàlid" +- +-#: config/c4x/c4x.c:3894 +-msgid "c4x_operand_subword: address not offsettable" +-msgstr "c4x_operand_subword: adreça no desplaçada" +- +-#: config/c4x/c4x.c:4096 +-#, fuzzy +-msgid "c4x_rptb_rpts_p: Repeat block top label moved" +-msgstr "c4x_rptb_rpts_p: etiqueta superior de bloc de repetició desplaçada\n" +- +-#. Use `%s' to print the string in case there are any escape +-#. characters in the message. +-#: config/cris/cris.c:491 fortran/dump-parse-tree.c:78 +-#: fortran/dump-parse-tree.c:430 fortran/dump-parse-tree.c:776 +-#: fortran/dump-parse-tree.c:821 c-typeck.c:4607 c-typeck.c:4622 +-#: c-typeck.c:4637 final.c:2984 final.c:2986 gcc.c:4737 loop-iv.c:2807 +-#: loop-iv.c:2816 rtl-error.c:112 toplev.c:610 tree-ssa-loop-niter.c:1829 +-#: cp/parser.c:2188 cp/typeck.c:4559 java/expr.c:409 +-#, gcc-internal-format +-msgid "%s" +-msgstr "%s" +- +-#: config/cris/cris.c:542 +-msgid "unexpected index-type in cris_print_index" +-msgstr "index-type inesperat en cris_print_index" +- +-#: config/cris/cris.c:556 +-msgid "unexpected base-type in cris_print_base" +-msgstr "base-type inesperat en cris_print_base" +- +-#: config/cris/cris.c:672 +-msgid "invalid operand for 'b' modifier" +-msgstr "operand no vàlid per al modificador \"b\"" +- +-#: config/cris/cris.c:689 +-#, fuzzy +-msgid "invalid operand for 'o' modifier" +-msgstr "operand no vàlid per al modificador \"b\"" +- +-#: config/cris/cris.c:708 +-#, fuzzy +-msgid "invalid operand for 'O' modifier" +-msgstr "operand no vàlid per al modificador \"b\"" +- +-#: config/cris/cris.c:741 +-msgid "invalid operand for 'p' modifier" +-msgstr "operand no vàlid per al modificador \"p\"" +- +-#: config/cris/cris.c:780 +-msgid "invalid operand for 'z' modifier" +-msgstr "operand no vàlid per al modificador \"z\"" +- +-#: config/cris/cris.c:834 config/cris/cris.c:864 +-msgid "invalid operand for 'H' modifier" +-msgstr "operand no vàlid per al modificador \"H\"" +- +-#: config/cris/cris.c:840 +-msgid "bad register" +-msgstr "registre erroni" +- +-#: config/cris/cris.c:884 +-msgid "invalid operand for 'e' modifier" +-msgstr "operand no vàlid per al modificador \"e\"" +- +-#: config/cris/cris.c:901 +-msgid "invalid operand for 'm' modifier" +-msgstr "operand no vàlid per al modificador \"m\"" +- +-#: config/cris/cris.c:926 +-msgid "invalid operand for 'A' modifier" +-msgstr "operand no vàlid per al modificador \"A\"" +- +-#: config/cris/cris.c:949 +-msgid "invalid operand for 'D' modifier" +-msgstr "operand no vàlid per al modificador \"D\"" +- +-#: config/cris/cris.c:963 +-msgid "invalid operand for 'T' modifier" +-msgstr "operand no vàlid per al modificador \"T\"" +- +-#: config/cris/cris.c:972 +-msgid "invalid operand modifier letter" +-msgstr "lletra de modificador d'operand no vàlid" +- +-#: config/cris/cris.c:1029 +-msgid "unexpected multiplicative operand" +-msgstr "operand multiplicatiu inesperat" +- +-#: config/cris/cris.c:1049 +-msgid "unexpected operand" +-msgstr "operand inesperat" +- +-#: config/cris/cris.c:1082 config/cris/cris.c:1092 +-msgid "unrecognized address" +-msgstr "adreça no reconeguda" +- +-#: config/cris/cris.c:2019 +-msgid "unrecognized supposed constant" +-msgstr "suposada constant no reconeguda" +- +-#: config/cris/cris.c:2394 config/cris/cris.c:2458 +-msgid "unexpected side-effects in address" +-msgstr "effecte de vora inesperat en l'adreça" +- +-#. Can't possibly get a GOT-needing-fixup for a function-call, +-#. right? +-#: config/cris/cris.c:3253 +-msgid "Unidentifiable call op" +-msgstr "" +- +-#: config/cris/cris.c:3304 +-#, c-format +-msgid "PIC register isn't set up" +-msgstr "el registre PIC no està preparat" +- +-#: config/fr30/fr30.c:464 +-#, c-format +-msgid "fr30_print_operand_address: unhandled address" +-msgstr "fr30_print_operand_address: adreça sense manejar" +- +-#: config/fr30/fr30.c:488 +-#, c-format +-msgid "fr30_print_operand: unrecognized %%p code" +-msgstr "fr30_print_operand_address: no es reconeix el codi %%p" +- +-#: config/fr30/fr30.c:508 +-#, c-format +-msgid "fr30_print_operand: unrecognized %%b code" +-msgstr "fr30_print_operand_address: no es reconeix el codi %%b" +- +-#: config/fr30/fr30.c:529 +-#, c-format +-msgid "fr30_print_operand: unrecognized %%B code" +-msgstr "fr30_print_operand_address: no es reconeix el codi %%B" +- +-#: config/fr30/fr30.c:537 +-#, c-format +-msgid "fr30_print_operand: invalid operand to %%A code" +-msgstr "fr30_print_operand: operand no vàlid per al codi %%A" +- +-#: config/fr30/fr30.c:554 +-#, c-format +-msgid "fr30_print_operand: invalid %%x code" +-msgstr "fr30_print_operand: codi %%x no vàlid" +- +-#: config/fr30/fr30.c:561 +-#, c-format +-msgid "fr30_print_operand: invalid %%F code" +-msgstr "fr30_print_operand: codi %%F no vàlid" +- +-#: config/fr30/fr30.c:578 +-#, c-format +-msgid "fr30_print_operand: unknown code" +-msgstr "fr30_print_operand: codi desconegut" +- +-#: config/fr30/fr30.c:606 config/fr30/fr30.c:615 config/fr30/fr30.c:626 +-#: config/fr30/fr30.c:639 +-#, c-format +-msgid "fr30_print_operand: unhandled MEM" +-msgstr "fr30_print_operand: MEM sense manejar" +- +-#: config/frv/frv.c:2542 +-#, fuzzy +-msgid "bad insn to frv_print_operand_address:" +-msgstr "insn erroni per a frv_print_operand_address:" +- +-#: config/frv/frv.c:2553 +-#, fuzzy +-msgid "bad register to frv_print_operand_memory_reference_reg:" +-msgstr "insn erroni per a frv_print_operand_memory_reference_reg:" +- +-#: config/frv/frv.c:2592 config/frv/frv.c:2602 config/frv/frv.c:2611 +-#: config/frv/frv.c:2632 config/frv/frv.c:2637 +-#, fuzzy +-msgid "bad insn to frv_print_operand_memory_reference:" +-msgstr "insn erroni per a frv_print_operand_memory_reference:" +- +-#: config/frv/frv.c:2723 +-#, fuzzy, c-format +-msgid "bad condition code" +-msgstr "codi d'extensió de registre erroni" +- +-#: config/frv/frv.c:2798 +-#, fuzzy +-msgid "bad insn in frv_print_operand, bad const_double" +-msgstr "insn erroni per a frv_print_operand,·bad·const_double" +- +-#: config/frv/frv.c:2859 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'e' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"e\":" +- +-#: config/frv/frv.c:2867 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'F' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"F\":" +- +-#: config/frv/frv.c:2883 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'f' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"f\":" +- +-#: config/frv/frv.c:2897 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'g' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"C\":" +- +-#: config/frv/frv.c:2945 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'L' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"L\":" +- +-#: config/frv/frv.c:2958 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'M/N' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"M/N\":" +- +-#: config/frv/frv.c:2979 +-#, fuzzy +-msgid "bad insn to frv_print_operand, 'O' modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"O\":" +- +-#: config/frv/frv.c:2997 +-#, fuzzy +-msgid "bad insn to frv_print_operand, P modifier:" +-msgstr "insn erroni per a frv_print_operand, modificador \"P\":" +- +-#: config/frv/frv.c:3017 +-#, fuzzy +-msgid "bad insn in frv_print_operand, z case" +-msgstr "insn erroni per a frv_print_operand, «case» z" +- +-#: config/frv/frv.c:3048 +-#, fuzzy +-msgid "bad insn in frv_print_operand, 0 case" +-msgstr "insn erroni per a frv_print_operand, «case» 0" +- +-#: config/frv/frv.c:3053 +-msgid "frv_print_operand: unknown code" +-msgstr "frv_print_operand: codi desconegut" +- +-#: config/frv/frv.c:4422 +-#, fuzzy +-msgid "bad output_move_single operand" +-msgstr "Operand output_move_single erroni" +- +-#: config/frv/frv.c:4549 +-#, fuzzy +-msgid "bad output_move_double operand" +-msgstr "Operand output_move_single erroni" +- +-#: config/frv/frv.c:4691 +-#, fuzzy +-msgid "bad output_condmove_single operand" +-msgstr "Operand output_condmove_single erroni" +- +-#. This macro is a C statement to print on `stderr' a string describing the +-#. particular machine description choice. Every machine description should +-#. define `TARGET_VERSION'. For example: +-#. +-#. #ifdef MOTOROLA +-#. #define TARGET_VERSION fprintf (stderr, " (68k, Motorola syntax)"); +-#. #else +-#. #define TARGET_VERSION fprintf (stderr, " (68k, MIT syntax)"); +-#. #endif +-#: config/frv/frv.h:328 +-#, c-format +-msgid " (frv)" +-msgstr "" +- +-#: config/i386/i386.c:8218 +-#, c-format +-msgid "invalid UNSPEC as operand" +-msgstr "UNSPEC no vàlid com a operand" +- +-#: config/i386/i386.c:8924 +-#, c-format +-msgid "operand is neither a constant nor a condition code, invalid operand code 'c'" +-msgstr "l'operand no és una constant ni un codi de condició, codi d'operand \"c\" no vàlid" +- +-#: config/i386/i386.c:9040 +-#, fuzzy, c-format +-msgid "invalid operand code '%c'" +-msgstr "codi d'operand \"%c\" no vàlid" +- +-#: config/i386/i386.c:9089 +-#, c-format +-msgid "invalid constraints for operand" +-msgstr "restriccions no vàlides per a l'operand" +- +-#: config/i386/i386.c:16348 +-msgid "unknown insn mode" +-msgstr "mode insn desconegut" +- +-#. If the environment variable DJDIR is not defined, then DJGPP is not installed correctly and GCC will quickly become confused with the default prefix settings. Report the problem now so the user doesn't receive deceptive "file not found" error messages later. +-#. DJDIR is automatically defined by the DJGPP environment config file pointed to by the environment variable DJGPP. Examine DJGPP to try and figure out what's wrong. +-#: config/i386/xm-djgpp.h:61 +-#, c-format +-msgid "environment variable DJGPP not defined" +-msgstr "no es va definir la variable d'ambient DJGPP" +- +-#: config/i386/xm-djgpp.h:63 +-#, c-format +-msgid "environment variable DJGPP points to missing file '%s'" +-msgstr "la variable d'ambient DJGPP punta al fitxer faltant\"%s\"" +- +-#: config/i386/xm-djgpp.h:66 +-#, c-format +-msgid "environment variable DJGPP points to corrupt file '%s'" +-msgstr "la variable d'ambient DJGPP punta al fitxer corrupte \"%s\"" +- +-#: config/ia64/ia64.c:4770 +-#, c-format +-msgid "ia64_print_operand: unknown code" +-msgstr "ia64_print_operand: codi desconegut" +- +-#: config/ia64/ia64.c:9889 +-#, fuzzy +-msgid "invalid conversion from %<__fpreg%>" +-msgstr "conversió no vàlida de \"%T\" a \"%T\"" +- +-#: config/ia64/ia64.c:9892 +-#, fuzzy +-msgid "invalid conversion to %<__fpreg%>" +-msgstr "conversió no vàlida del tipus \"%T\" a partir del tipus \"%T\"" +- +-#: config/ia64/ia64.c:9905 config/ia64/ia64.c:9916 +-#, fuzzy +-msgid "invalid operation on %<__fpreg%>" +-msgstr "no vàlid operand per al codi %%p" +- +-#: config/iq2000/iq2000.c:3118 +-#, c-format +-msgid "invalid %%P operand" +-msgstr "operand no vàlid per a %%P" +- +-#: config/iq2000/iq2000.c:3126 config/rs6000/rs6000.c:11607 +-#, c-format +-msgid "invalid %%p value" +-msgstr "valor no vàlid per a %%p" +- +-#: config/iq2000/iq2000.c:3182 +-#, c-format +-msgid "invalid use of %%d, %%x, or %%X" +-msgstr "ùs no vàlid de %%d, %%x, o %%X" +- +-#: config/m32r/m32r.c:1775 +-#, c-format +-msgid "invalid operand to %%s code" +-msgstr "no vàlid operand per al codi %%s" +- +-#: config/m32r/m32r.c:1782 +-#, c-format +-msgid "invalid operand to %%p code" +-msgstr "no vàlid operand per al codi %%p" +- +-#: config/m32r/m32r.c:1837 +-msgid "bad insn for 'A'" +-msgstr "insn erroni per a \"A\"" +- +-#: config/m32r/m32r.c:1884 +-#, c-format +-msgid "invalid operand to %%T/%%B code" +-msgstr "no vàlid operand per al codi %%T/%%B" +- +-#: config/m32r/m32r.c:1907 +-#, c-format +-msgid "invalid operand to %%N code" +-msgstr "no vàlid operand per al codi %%N" +- +-#: config/m32r/m32r.c:1940 +-msgid "pre-increment address is not a register" +-msgstr "l'adreça de pre-increment no és un registre" +- +-#: config/m32r/m32r.c:1947 +-msgid "pre-decrement address is not a register" +-msgstr "l'adreça de pre-decrement no és un registre" +- +-#: config/m32r/m32r.c:1954 +-msgid "post-increment address is not a register" +-msgstr "l'adreça de post-increment no és un registre" +- +-#: config/m32r/m32r.c:2030 config/m32r/m32r.c:2044 +-#: config/rs6000/rs6000.c:19870 +-msgid "bad address" +-msgstr "adreça erroni" +- +-#: config/m32r/m32r.c:2049 +-msgid "lo_sum not of register" +-msgstr "lo_sum no és un registre" +- +-#. !!!! SCz wrong here. +-#: config/m68hc11/m68hc11.c:3189 config/m68hc11/m68hc11.c:3567 +-msgid "move insn not handled" +-msgstr "no es maneja move insn" +- +-#: config/m68hc11/m68hc11.c:3413 config/m68hc11/m68hc11.c:3497 +-#: config/m68hc11/m68hc11.c:3770 +-msgid "invalid register in the move instruction" +-msgstr "registre no vàlid en la instrucció move" +- +-#: config/m68hc11/m68hc11.c:3447 +-msgid "invalid operand in the instruction" +-msgstr "operand no vàlid en la instrucció" +- +-#: config/m68hc11/m68hc11.c:3744 +-msgid "invalid register in the instruction" +-msgstr "registre no vàlid en la instrucció" +- +-#: config/m68hc11/m68hc11.c:3777 +-msgid "operand 1 must be a hard register" +-msgstr "l'operand 1 ha de ser un registre fix" +- +-#: config/m68hc11/m68hc11.c:3791 +-msgid "invalid rotate insn" +-msgstr "rotació de insn no vàlida" +- +-#: config/m68hc11/m68hc11.c:4215 +-msgid "registers IX, IY and Z used in the same INSN" +-msgstr "es van usar els registres IX, IY i Z en el mateix INSN" +- +-#: config/m68hc11/m68hc11.c:4548 config/m68hc11/m68hc11.c:4848 +-msgid "cannot do z-register replacement" +-msgstr "no es pot reemplaçar el registre-z" +- +-#: config/m68hc11/m68hc11.c:4911 +-msgid "invalid Z register replacement for insn" +-msgstr "reemplaçament de registre Z no vàlid per al insn" +- +-#: config/mips/mips.c:6313 config/mips/mips.c:6334 config/mips/mips.c:6438 +-#, fuzzy, c-format +-msgid "'%%%c' is not a valid operand prefix" +-msgstr "\"%T\" no és una expressió vàlida" +- +-#: config/mips/mips.c:6382 config/mips/mips.c:6389 config/mips/mips.c:6396 +-#: config/mips/mips.c:6456 +-#, fuzzy, c-format +-msgid "invalid use of '%%%c'" +-msgstr "ús no vàlid de \"%D\"" +- +-#: config/mips/mips.c:6701 +-msgid "mips_debugger_offset called with non stack/frame/arg pointer" +-msgstr "" +- +-#: config/mmix/mmix.c:1487 config/mmix/mmix.c:1617 +-msgid "MMIX Internal: Expected a CONST_INT, not this" +-msgstr "MMIX intern: Esperant un CONS_INT, no això" +- +-#: config/mmix/mmix.c:1566 +-msgid "MMIX Internal: Bad value for 'm', not a CONST_INT" +-msgstr "MMIX intern: valor erroni per a \"m\", no és un CONST_INT" +- +-#: config/mmix/mmix.c:1585 +-msgid "MMIX Internal: Expected a register, not this" +-msgstr "MMIX intern: Esperant un registre, no això" +- +-#: config/mmix/mmix.c:1595 +-msgid "MMIX Internal: Expected a constant, not this" +-msgstr "MMIX intern: Esperant una constant, no això" +- +-#. We need the original here. +-#: config/mmix/mmix.c:1679 +-msgid "MMIX Internal: Cannot decode this operand" +-msgstr "MMIX intern: aquest operand no es pot dexifrar" +- +-#: config/mmix/mmix.c:1736 +-msgid "MMIX Internal: This is not a recognized address" +-msgstr "MMIX intern: adreça no reconeguda" +- +-#: config/mmix/mmix.c:2669 +-msgid "MMIX Internal: Trying to output invalidly reversed condition:" +-msgstr "MMIX intern: Intentant de mostrar una condició invertida de forma no vàlida:" +- +-#: config/mmix/mmix.c:2676 +-msgid "MMIX Internal: What's the CC of this?" +-msgstr "MMIX Internal: Quin és el CC per això" +- +-#: config/mmix/mmix.c:2680 +-msgid "MMIX Internal: What is the CC of this?" +-msgstr "MMIX Internal: Quin és el CC per això" +- +-#: config/mmix/mmix.c:2744 +-msgid "MMIX Internal: This is not a constant:" +-msgstr "MMIX Internal: Això no és una constant:" +- +-#: config/mt/mt.c:299 +-msgid "mt_final_prescan_insn, invalid insn #1" +-msgstr "" +- +-#: config/mt/mt.c:370 +-#, fuzzy +-msgid "PRINT_OPERAND_ADDRESS, 2 regs" +-msgstr "PRINT_OPERAND_ADDRESS, punter nul" +- +-#: config/mt/mt.c:394 +-#, fuzzy +-msgid "PRINT_OPERAND_ADDRESS, invalid insn #1" +-msgstr "PRINT_OPERAND_ADDRESS, punter nul" +- +-#: config/rs6000/host-darwin.c:96 +-#, c-format +-msgid "Out of stack space.\n" +-msgstr "" +- +-#: config/rs6000/host-darwin.c:117 +-#, c-format +-msgid "Try running '%s' in the shell to raise its limit.\n" +-msgstr "" +- +-#: config/rs6000/rs6000.c:11434 +-#, c-format +-msgid "invalid %%f value" +-msgstr "valor %%f no vàlid" +- +-#: config/rs6000/rs6000.c:11443 +-#, c-format +-msgid "invalid %%F value" +-msgstr "valor %%F no vàlid" +- +-#: config/rs6000/rs6000.c:11452 +-#, c-format +-msgid "invalid %%G value" +-msgstr "valor %%G no vàlid" +- +-#: config/rs6000/rs6000.c:11487 +-#, c-format +-msgid "invalid %%j code" +-msgstr "valor %%j no vàlid" +- +-#: config/rs6000/rs6000.c:11497 +-#, c-format +-msgid "invalid %%J code" +-msgstr "valor %%J no vàlid" +- +-#: config/rs6000/rs6000.c:11507 +-#, c-format +-msgid "invalid %%k value" +-msgstr "valor %%k no vàlid" +- +-#: config/rs6000/rs6000.c:11527 config/xtensa/xtensa.c:2022 +-#, c-format +-msgid "invalid %%K value" +-msgstr "valor %%K no vàlid" +- +-#: config/rs6000/rs6000.c:11597 +-#, c-format +-msgid "invalid %%O value" +-msgstr "valor %%O no vàlid" +- +-#: config/rs6000/rs6000.c:11644 +-#, c-format +-msgid "invalid %%q value" +-msgstr "valor no vàlid per a %%q" +- +-#: config/rs6000/rs6000.c:11688 +-#, c-format +-msgid "invalid %%S value" +-msgstr "valor %%S no vàlid" +- +-#: config/rs6000/rs6000.c:11728 +-#, c-format +-msgid "invalid %%T value" +-msgstr "valor %%T no vàlid" +- +-#: config/rs6000/rs6000.c:11738 +-#, c-format +-msgid "invalid %%u value" +-msgstr "valor %%u no vàlid" +- +-#: config/rs6000/rs6000.c:11747 config/xtensa/xtensa.c:1992 +-#, c-format +-msgid "invalid %%v value" +-msgstr "valor %%v no vàlid" +- +-#: config/rs6000/rs6000.c:21768 +-#, fuzzy +-msgid "AltiVec argument passed to unprototyped function" +-msgstr "molt pocs arguments per a la funció" +- +-#: config/s390/s390.c:4561 +-#, fuzzy, c-format +-msgid "cannot decompose address" +-msgstr "No es pot descompondre l'adreça." +- +-#: config/s390/s390.c:4771 +-msgid "UNKNOWN in print_operand !?" +-msgstr "UNKNOWN en print_operand !?" +- +-#: config/score/score3.c:1262 config/score/score3.c:1282 +-#: config/score/score7.c:1253 +-#, fuzzy, c-format +-msgid "invalid operand for code: '%c'" +-msgstr "codi d'operand \"%c\" no vàlid" +- +-#: config/sh/sh.c:746 +-#, fuzzy, c-format +-msgid "invalid operand to %%R" +-msgstr "operand no vàlid per al codi %%R" +- +-#: config/sh/sh.c:773 +-#, fuzzy, c-format +-msgid "invalid operand to %%S" +-msgstr "operand no vàlid per al codi %%R" +- +-#: config/sh/sh.c:8095 +-#, fuzzy +-msgid "created and used with different architectures / ABIs" +-msgstr "\"%#D\" redeclarat com un tipus diferent de símbol" +- +-#: config/sh/sh.c:8097 +-#, fuzzy +-msgid "created and used with different ABIs" +-msgstr "\"%#D\" redeclarat com un tipus diferent de símbol" +- +-#: config/sh/sh.c:8099 +-#, fuzzy +-msgid "created and used with different endianness" +-msgstr "inicialitzador de dades en l'ordinador amb \"endianness\" diferent" +- +-#: config/sparc/sparc.c:6803 config/sparc/sparc.c:6809 +-#, c-format +-msgid "invalid %%Y operand" +-msgstr "operand %%Y no vàlid" +- +-#: config/sparc/sparc.c:6879 +-#, c-format +-msgid "invalid %%A operand" +-msgstr "operand %%A no vàlid" +- +-#: config/sparc/sparc.c:6889 +-#, c-format +-msgid "invalid %%B operand" +-msgstr "operand %%B no vàlid" +- +-#: config/sparc/sparc.c:6928 +-#, c-format +-msgid "invalid %%c operand" +-msgstr "operand %%c no vàlid" +- +-#: config/sparc/sparc.c:6950 +-#, c-format +-msgid "invalid %%d operand" +-msgstr "operand %%d no vàlid" +- +-#: config/sparc/sparc.c:6967 +-#, c-format +-msgid "invalid %%f operand" +-msgstr "operand %%f no vàlid" +- +-#: config/sparc/sparc.c:6981 +-#, c-format +-msgid "invalid %%s operand" +-msgstr "operand %%s no vàlid" +- +-#: config/sparc/sparc.c:7035 +-#, c-format +-msgid "long long constant not a valid immediate operand" +-msgstr "la constant long long no és un operand immediat vàlid" +- +-#: config/sparc/sparc.c:7038 +-#, c-format +-msgid "floating point constant not a valid immediate operand" +-msgstr "la constant de coma flotant no és un operand immediat vàlid" +- +-#: config/stormy16/stormy16.c:1775 config/stormy16/stormy16.c:1846 +-#, fuzzy, c-format +-msgid "'B' operand is not constant" +-msgstr "l'operand \"B\" no és una constant" +- +-#: config/stormy16/stormy16.c:1802 +-#, fuzzy, c-format +-msgid "'B' operand has multiple bits set" +-msgstr "l'operand \"B\" té establerts múltiples bits" +- +-#: config/stormy16/stormy16.c:1828 +-#, fuzzy, c-format +-msgid "'o' operand is not constant" +-msgstr "l'operand \"o\" no és una constant" +- +-#: config/stormy16/stormy16.c:1860 +-#, c-format +-msgid "xstormy16_print_operand: unknown code" +-msgstr "xstormy16_print_operand: codi desconegut" +- +-#: config/v850/v850.c:372 +-msgid "const_double_split got a bad insn:" +-msgstr "const_double_split va rebre un insn erroni:" +- +-#: config/v850/v850.c:936 +-msgid "output_move_single:" +-msgstr "output_move_single:" +- +-#: config/xtensa/xtensa.c:652 config/xtensa/xtensa.c:684 +-#: config/xtensa/xtensa.c:693 +-msgid "bad test" +-msgstr "prova errònia" +- +-#: config/xtensa/xtensa.c:1980 +-#, c-format +-msgid "invalid %%D value" +-msgstr "valor no vàlid per a %%D" +- +-#: config/xtensa/xtensa.c:2017 +-msgid "invalid mask" +-msgstr "màscara no vàlida" +- +-#: config/xtensa/xtensa.c:2043 +-#, fuzzy, c-format +-msgid "invalid %%x value" +-msgstr "valor no vàlid per a %%x/X" +- +-#: config/xtensa/xtensa.c:2050 +-#, fuzzy, c-format +-msgid "invalid %%d value" +-msgstr "valor %%v no vàlid" +- +-#: config/xtensa/xtensa.c:2071 config/xtensa/xtensa.c:2081 +-#, fuzzy, c-format +-msgid "invalid %%t/%%b value" +-msgstr "valor %%b no vàlid" +- +-#: config/xtensa/xtensa.c:2123 +-msgid "invalid address" +-msgstr "adreça no vàlida" +- +-#: config/xtensa/xtensa.c:2148 +-msgid "no register in address" +-msgstr "no hi ha registre en l'adreça" +- +-#: config/xtensa/xtensa.c:2156 +-msgid "address offset not a constant" +-msgstr "el desplaçament d'adreça no és una constant" +- +-#: cp/call.c:2514 +-msgid "candidates are:" +-msgstr "" +- +-#: cp/call.c:6463 +-msgid "candidate 1:" +-msgstr "" +- +-#: cp/call.c:6464 +-msgid "candidate 2:" +-msgstr "" +- +-#: cp/decl2.c:668 +-msgid "candidates are: %+#D" +-msgstr "" +- +-#: cp/decl2.c:670 +-#, fuzzy +-msgid "candidate is: %+#D" +-msgstr "no es pot escriure %s: %m" +- +-#: cp/g++spec.c:251 java/jvspec.c:406 +-#, fuzzy, c-format +-msgid "argument to '%s' missing\n" +-msgstr "falta l'argument per a `%s'\n" +- +-#: fortran/arith.c:90 +-msgid "Arithmetic OK at %L" +-msgstr "" +- +-#: fortran/arith.c:93 +-msgid "Arithmetic overflow at %L" +-msgstr "" +- +-#: fortran/arith.c:96 +-msgid "Arithmetic underflow at %L" +-msgstr "" +- +-#: fortran/arith.c:99 +-msgid "Arithmetic NaN at %L" +-msgstr "" +- +-#: fortran/arith.c:102 +-#, fuzzy +-msgid "Division by zero at %L" +-msgstr "divisió per zero" +- +-#: fortran/arith.c:105 +-msgid "Array operands are incommensurate at %L" +-msgstr "" +- +-#: fortran/arith.c:109 +-msgid "Integer outside symmetric range implied by Standard Fortran at %L" +-msgstr "" +- +-#: fortran/arith.c:1425 +-msgid "elemental binary operation" +-msgstr "" +- +-#: fortran/arith.c:1997 +-#, fuzzy, no-c-format +-msgid "Arithmetic OK converting %s to %s at %L" +-msgstr "la conversion de %s a %s ha fallat" +- +-#: fortran/arith.c:2001 +-#, no-c-format +-msgid "Arithmetic overflow converting %s to %s at %L. This check can be disabled with the option -fno-range-check" +-msgstr "" +- +-#: fortran/arith.c:2006 +-#, no-c-format +-msgid "Arithmetic underflow converting %s to %s at %L" +-msgstr "" +- +-#: fortran/arith.c:2010 +-#, no-c-format +-msgid "Arithmetic NaN converting %s to %s at %L" +-msgstr "" +- +-#: fortran/arith.c:2014 +-#, fuzzy, no-c-format +-msgid "Division by zero converting %s to %s at %L" +-msgstr "divisió per zero en \"%E %% 0\"" +- +-#: fortran/arith.c:2018 +-#, no-c-format +-msgid "Array operands are incommensurate converting %s to %s at %L" +-msgstr "" +- +-#: fortran/arith.c:2022 +-#, no-c-format +-msgid "Integer outside symmetric range implied by Standard Fortran converting %s to %s at %L" +-msgstr "" +- +-#: fortran/arith.c:2355 +-#, fuzzy, no-c-format +-msgid "The Hollerith constant at %L is too long to convert to %s" +-msgstr "La constant de caràcter en %0 no té l'apòstrofe que tanca en %1" +- +-#: fortran/arith.c:2513 +-#, no-c-format +-msgid "Enumerator exceeds the C integer type at %C" +-msgstr "" +- +-#: fortran/array.c:97 +-#, fuzzy, no-c-format +-msgid "Expected array subscript at %C" +-msgstr "el subindici de matriu té un tipus \"char\"" +- +-#: fortran/array.c:124 +-#, fuzzy, no-c-format +-msgid "Expected array subscript stride at %C" +-msgstr "el subindici de matriu té un tipus \"char\"" +- +-#: fortran/array.c:167 +-#, fuzzy, no-c-format +-msgid "Invalid form of array reference at %C" +-msgstr "Element null en %0 per a la referència de matriu en %1" +- +-#: fortran/array.c:172 +-#, no-c-format +-msgid "Array reference at %C cannot have more than %d dimensions" +-msgstr "" +- +-#: fortran/array.c:223 +-#, no-c-format +-msgid "Variable '%s' at %L in this context must be constant" +-msgstr "" +- +-#: fortran/array.c:299 +-#, no-c-format +-msgid "Expected expression in array specification at %C" +-msgstr "" +- +-#: fortran/array.c:386 +-#, no-c-format +-msgid "Bad array specification for an explicitly shaped array at %C" +-msgstr "" +- +-#: fortran/array.c:396 +-#, no-c-format +-msgid "Bad array specification for assumed shape array at %C" +-msgstr "" +- +-#: fortran/array.c:410 +-#, fuzzy, no-c-format +-msgid "Bad specification for deferred shape array at %C" +-msgstr "No hi ha especificació per al iterador del DO implícit `%A' en %0" +- +-#: fortran/array.c:414 +-#, fuzzy, no-c-format +-msgid "Bad specification for assumed size array at %C" +-msgstr "No hi ha especificació per al iterador del DO implícit `%A' en %0" +- +-#: fortran/array.c:423 +-#, no-c-format +-msgid "Expected another dimension in array declaration at %C" +-msgstr "" +- +-#: fortran/array.c:429 +-#, no-c-format +-msgid "Array specification at %C has more than %d dimensions" +-msgstr "" +- +-#: fortran/array.c:635 +-#, fuzzy, no-c-format +-msgid "duplicated initializer" +-msgstr "valor inicial no vàlid" +- +-#: fortran/array.c:727 +-#, no-c-format +-msgid "DO-iterator '%s' at %L is inside iterator of the same name" +-msgstr "" +- +-#: fortran/array.c:829 fortran/array.c:938 +-#, fuzzy, no-c-format +-msgid "Syntax error in array constructor at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/array.c:884 +-#, no-c-format +-msgid "Fortran 2003: [...] style array constructors at %C" +-msgstr "" +- +-#: fortran/array.c:898 +-#, fuzzy, no-c-format +-msgid "Empty array constructor at %C is not allowed" +-msgstr "l'argument per a l'atribut \"%s\" és més gran que %d" +- +-#: fortran/array.c:982 +-#, no-c-format +-msgid "Element in %s array constructor at %L is %s" +-msgstr "" +- +-#: fortran/array.c:1309 +-#, no-c-format +-msgid "Iterator step at %L cannot be zero" +-msgstr "" +- +-#: fortran/check.c:44 +-#, fuzzy, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a scalar" +-msgstr "l'argument 1 de __builtin__spe_predicate ha de ser una constant" +- +-#: fortran/check.c:59 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be %s" +-msgstr "" +- +-#: fortran/check.c:87 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a numeric type" +-msgstr "" +- +-#: fortran/check.c:101 fortran/check.c:817 fortran/check.c:827 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be INTEGER or REAL" +-msgstr "" +- +-#: fortran/check.c:118 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be REAL or COMPLEX" +-msgstr "" +- +-#: fortran/check.c:147 +-#, fuzzy, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a constant" +-msgstr "l'argument 1 de __builtin__spe_predicate ha de ser una constant" +- +-#: fortran/check.c:156 +-#, fuzzy, no-c-format +-msgid "Invalid kind for %s at %L" +-msgstr "constant de cadena no vàlida \"%E\"" +- +-#: fortran/check.c:175 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be double precision" +-msgstr "" +- +-#: fortran/check.c:192 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a logical array" +-msgstr "" +- +-#: fortran/check.c:210 +-#, fuzzy, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be an array" +-msgstr "l'argument 1 de __builtin__spe_predicate ha de ser una constant" +- +-#: fortran/check.c:225 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be the same type and kind as '%s'" +-msgstr "" +- +-#: fortran/check.c:241 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of rank %d" +-msgstr "" +- +-#: fortran/check.c:256 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must not be OPTIONAL" +-msgstr "" +- +-#: fortran/check.c:275 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of kind %d" +-msgstr "" +- +-#: fortran/check.c:297 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L cannot be INTENT(IN)" +-msgstr "" +- +-#: fortran/check.c:303 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a variable" +-msgstr "" +- +-#: fortran/check.c:320 +-#, no-c-format +-msgid "Missing DIM parameter in intrinsic '%s' at %L" +-msgstr "" +- +-#: fortran/check.c:363 +-#, no-c-format +-msgid "'dim' argument of '%s' intrinsic at %L is not a valid dimension index" +-msgstr "" +- +-#: fortran/check.c:433 +-#, no-c-format +-msgid "Unequal character lengths (%ld and %ld) in %s intrinsic at %L" +-msgstr "" +- +-#: fortran/check.c:535 fortran/check.c:1938 fortran/check.c:1953 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be ALLOCATABLE" +-msgstr "" +- +-#: fortran/check.c:559 fortran/check.c:3703 +-#, no-c-format +-msgid "'%s' and '%s' arguments of '%s' intrinsic at %L must have the same type" +-msgstr "" +- +-#: fortran/check.c:568 fortran/check.c:1143 fortran/check.c:1286 +-#: fortran/check.c:1360 fortran/check.c:1616 +-#, no-c-format +-msgid "Extension: Different type kinds at %L" +-msgstr "" +- +-#: fortran/check.c:608 fortran/check.c:2022 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a POINTER" +-msgstr "" +- +-#: fortran/check.c:628 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a pointer or target VARIABLE or FUNCTION" +-msgstr "" +- +-#: fortran/check.c:636 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a POINTER or a TARGET" +-msgstr "" +- +-#: fortran/check.c:652 +-#, no-c-format +-msgid "Array section with a vector subscript at %L shall not be the target of a pointer" +-msgstr "" +- +-#: fortran/check.c:663 +-#, no-c-format +-msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" +-msgstr "" +- +-#: fortran/check.c:798 fortran/check.c:915 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must not be present if 'x' is COMPLEX" +-msgstr "" +- +-#: fortran/check.c:848 fortran/check.c:1205 fortran/check.c:1308 +-#: fortran/check.c:1467 fortran/check.c:1484 fortran/check.c:2318 +-#: fortran/check.c:2444 fortran/check.c:2779 fortran/check.c:2821 +-#, no-c-format +-msgid "Fortran 2003: '%s' intrinsic with KIND argument at %L" +-msgstr "" +- +-#: fortran/check.c:964 fortran/check.c:1712 fortran/check.c:1720 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be numeric or LOGICAL" +-msgstr "" +- +-#: fortran/check.c:978 +-#, no-c-format +-msgid "Different shape for arguments '%s' and '%s' at %L for intrinsic 'dot_product'" +-msgstr "" +- +-#: fortran/check.c:997 fortran/check.c:1005 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be default real" +-msgstr "" +- +-#: fortran/check.c:1256 +-#, no-c-format +-msgid "Argument of %s at %L must be of length one" +-msgstr "" +- +-#: fortran/check.c:1315 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be the same kind as '%s'" +-msgstr "" +- +-#: fortran/check.c:1440 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be a non-derived type" +-msgstr "" +- +-#: fortran/check.c:1589 +-#, fuzzy, no-c-format +-msgid "Intrinsic '%s' at %L must have at least two arguments" +-msgstr "\"%D\" ha de prendre dos arguments exactament" +- +-#: fortran/check.c:1622 +-#, no-c-format +-msgid "'a%d' argument of '%s' intrinsic at %L must be %s(%d)" +-msgstr "" +- +-#: fortran/check.c:1655 +-#, no-c-format +-msgid "Fortran 2003: '%s' intrinsic with CHARACTER argument at %L" +-msgstr "" +- +-#: fortran/check.c:1662 +-#, no-c-format +-msgid "'a1' argument of '%s' intrinsic at %L must be INTEGER, REAL or CHARACTER" +-msgstr "" +- +-#: fortran/check.c:1734 +-#, no-c-format +-msgid "Different shape on dimension 1 for arguments '%s' and '%s' at %L for intrinsic matmul" +-msgstr "" +- +-#: fortran/check.c:1753 +-#, no-c-format +-msgid "Different shape on dimension 2 for argument '%s' and dimension 1 for argument '%s' at %L for intrinsic matmul" +-msgstr "" +- +-#: fortran/check.c:1762 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of rank 1 or 2" +-msgstr "" +- +-#: fortran/check.c:1964 +-#, no-c-format +-msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must have the same rank %d/%d" +-msgstr "" +- +-#: fortran/check.c:1973 +-#, no-c-format +-msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must be of the same kind %d/%d" +-msgstr "" +- +-#: fortran/check.c:2069 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of type REAL or COMPLEX" +-msgstr "" +- +-#: fortran/check.c:2090 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of a dummy variable" +-msgstr "" +- +-#: fortran/check.c:2098 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of an OPTIONAL dummy variable" +-msgstr "" +- +-#: fortran/check.c:2114 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must not be a subobject of '%s'" +-msgstr "" +- +-#: fortran/check.c:2231 +-#, no-c-format +-msgid "'shape' argument of 'reshape' intrinsic at %L must be an array of constant size" +-msgstr "" +- +-#: fortran/check.c:2241 +-#, no-c-format +-msgid "'shape' argument of 'reshape' intrinsic at %L has more than %d elements" +-msgstr "" +- +-#: fortran/check.c:2279 +-#, no-c-format +-msgid "Without padding, there are not enough elements in the intrinsic RESHAPE source at %L to match the shape" +-msgstr "" +- +-#: fortran/check.c:2364 +-#, fuzzy, no-c-format +-msgid "Missing arguments to %s intrinsic at %L" +-msgstr "Falten arguments per a l'opció \"%s\"" +- +-#: fortran/check.c:2405 +-#, no-c-format +-msgid "'source' argument of 'shape' intrinsic at %L must not be an assumed size array" +-msgstr "" +- +-#: fortran/check.c:2479 +-#, fuzzy, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be less than rank %d" +-msgstr "l'argument per a l'atribut \"%s\" és més gran que %d" +- +-#: fortran/check.c:2731 +-#, no-c-format +-msgid "'MOLD' argument of 'TRANSFER' intrinsic at %L must not be %s" +-msgstr "" +- +-#: fortran/check.c:3050 +-#, fuzzy, no-c-format +-msgid "Too many arguments to %s at %L" +-msgstr "massa arguments per a %s \"%+#D\"" +- +-#: fortran/check.c:3162 fortran/check.c:3616 fortran/check.c:3640 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be INTEGER or PROCEDURE" +-msgstr "" +- +-#: fortran/check.c:3338 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be of a kind not wider than the default kind (%d)" +-msgstr "" +- +-#: fortran/check.c:3687 fortran/check.c:3695 +-#, no-c-format +-msgid "'%s' argument of '%s' intrinsic at %L must be INTEGER or LOGICAL" +-msgstr "" +- +-#: fortran/data.c:64 +-#, fuzzy, no-c-format +-msgid "non-constant array in DATA statement %L" +-msgstr "índex de matriu no constant en valor inicial" +- +-#: fortran/data.c:193 +-#, no-c-format +-msgid "failure to simplify substring reference in DATA statement at %L" +-msgstr "" +- +-#: fortran/data.c:224 +-#, fuzzy, no-c-format +-msgid "initialization string truncated to match variable at %L" +-msgstr "no es poden niuar els designadors d'iniciació" +- +-#: fortran/data.c:293 +-#, no-c-format +-msgid "'%s' at %L already is initialized at %L" +-msgstr "" +- +-#: fortran/data.c:412 +-#, fuzzy, no-c-format +-msgid "Extension: re-initialization of '%s' at %L" +-msgstr " salta la inicialización de \"%#D\"" +- +-#: fortran/decl.c:254 +-#, no-c-format +-msgid "Host associated variable '%s' may not be in the DATA statement at %C" +-msgstr "" +- +-#: fortran/decl.c:261 +-#, no-c-format +-msgid "Extension: initialization of common block variable '%s' in DATA statement at %C" +-msgstr "" +- +-#: fortran/decl.c:366 +-#, no-c-format +-msgid "Symbol '%s' must be a PARAMETER in DATA statement at %C" +-msgstr "" +- +-#: fortran/decl.c:470 +-#, no-c-format +-msgid "Initialization at %C is not allowed in a PURE procedure" +-msgstr "" +- +-#: fortran/decl.c:529 +-#, no-c-format +-msgid "DATA statement at %C is not allowed in a PURE procedure" +-msgstr "" +- +-#: fortran/decl.c:558 +-#, no-c-format +-msgid "Bad INTENT specification at %C" +-msgstr "" +- +-#: fortran/decl.c:600 +-#, no-c-format +-msgid "Conflict in attributes of function argument at %C" +-msgstr "" +- +-#: fortran/decl.c:647 +-#, fuzzy, no-c-format +-msgid "Syntax error in character length specification at %C" +-msgstr "error de decodificació en l'especificació del mètode" +- +-#: fortran/decl.c:757 +-#, fuzzy, no-c-format +-msgid "Procedure '%s' at %C is already defined at %L" +-msgstr "\"%D\" ja està definit en \"%T\"" +- +-#: fortran/decl.c:765 +-#, fuzzy, no-c-format +-msgid "Name '%s' at %C is already defined as a generic interface at %L" +-msgstr "L'etiqueta %A ja es va definir en %1 quan es va redefinir en %0" +- +-#: fortran/decl.c:778 +-#, no-c-format +-msgid "Procedure '%s' at %C has an explicit interface and must not have attributes declared at %L" +-msgstr "" +- +-#: fortran/decl.c:850 +-#, no-c-format +-msgid "Procedure '%s' at %L must have the BIND(C) attribute to be C interoperable" +-msgstr "" +- +-#: fortran/decl.c:880 +-#, no-c-format +-msgid "Type '%s' at %L is a parameter to the BIND(C) procedure '%s' but is not C interoperable because derived type '%s' is not C interoperable" +-msgstr "" +- +-#: fortran/decl.c:887 +-#, no-c-format +-msgid "Variable '%s' at %L is a parameter to the BIND(C) procedure '%s' but may not be C interoperable" +-msgstr "" +- +-#: fortran/decl.c:902 +-#, no-c-format +-msgid "Character argument '%s' at %L must be length 1 because procedure '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:916 +-#, no-c-format +-msgid "Variable '%s' at %L cannot have the ALLOCATABLE attribute because procedure '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:925 +-#, no-c-format +-msgid "Variable '%s' at %L cannot have the POINTER attribute because procedure '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:934 +-#, no-c-format +-msgid "Variable '%s' at %L cannot have the OPTIONAL attribute because procedure '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:947 +-#, no-c-format +-msgid "Assumed-shape array '%s' at %L cannot be an argument to the procedure '%s' at %L because the procedure is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:957 +-#, no-c-format +-msgid "Deferred-shape array '%s' at %L cannot be an argument to the procedure '%s' at %L because the procedure is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:1033 +-#, no-c-format +-msgid "Variable '%s' in common block '%s' at %C must be declared with a C interoperable kind since common block '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:1069 +-#, no-c-format +-msgid "CHARACTER expression at %L is being truncated (%d/%d)" +-msgstr "" +- +-#: fortran/decl.c:1075 +-#, no-c-format +-msgid "The CHARACTER elements of the array constructor at %L must have the same length (%d/%d)" +-msgstr "" +- +-#: fortran/decl.c:1165 +-#, no-c-format +-msgid "Initializer not allowed for PARAMETER '%s' at %C" +-msgstr "" +- +-#: fortran/decl.c:1174 +-#, no-c-format +-msgid "Initializer not allowed for COMMON variable '%s' at %C" +-msgstr "" +- +-#: fortran/decl.c:1184 +-#, fuzzy, no-c-format +-msgid "PARAMETER at %L is missing an initializer" +-msgstr "falta valor inicial" +- +-#: fortran/decl.c:1194 +-#, no-c-format +-msgid "Variable '%s' at %C with an initializer already appears in a DATA statement" +-msgstr "" +- +-#: fortran/decl.c:1344 +-#, no-c-format +-msgid "Component at %C must have the POINTER attribute" +-msgstr "" +- +-#: fortran/decl.c:1352 +-#, no-c-format +-msgid "Array component of structure at %C must have explicit or deferred shape" +-msgstr "" +- +-#: fortran/decl.c:1378 +-#, no-c-format +-msgid "Allocatable component at %C must be an array" +-msgstr "" +- +-#: fortran/decl.c:1389 +-#, no-c-format +-msgid "Pointer array component of structure at %C must have a deferred shape" +-msgstr "" +- +-#: fortran/decl.c:1398 +-#, no-c-format +-msgid "Allocatable component of structure at %C must have a deferred shape" +-msgstr "" +- +-#: fortran/decl.c:1407 +-#, no-c-format +-msgid "Array component of structure at %C must have an explicit shape" +-msgstr "" +- +-#: fortran/decl.c:1433 +-#, no-c-format +-msgid "NULL() initialization at %C is ambiguous" +-msgstr "" +- +-#: fortran/decl.c:1556 fortran/decl.c:5197 +-#, no-c-format +-msgid "Duplicate array spec for Cray pointee at %C" +-msgstr "" +- +-#: fortran/decl.c:1616 +-#, no-c-format +-msgid "the type of '%s' at %C has not been declared within the interface" +-msgstr "" +- +-#: fortran/decl.c:1632 +-#, fuzzy, no-c-format +-msgid "Function name '%s' not allowed at %C" +-msgstr "%Jno es permet un atribut de secció per a \"%D\"" +- +-#: fortran/decl.c:1648 +-#, no-c-format +-msgid "Extension: Old-style initialization at %C" +-msgstr "" +- +-#: fortran/decl.c:1663 +-#, no-c-format +-msgid "Initialization at %C isn't for a pointer variable" +-msgstr "" +- +-#: fortran/decl.c:1671 +-#, no-c-format +-msgid "Pointer initialization requires a NULL() at %C" +-msgstr "" +- +-#: fortran/decl.c:1677 +-#, no-c-format +-msgid "Initialization of pointer at %C is not allowed in a PURE procedure" +-msgstr "" +- +-#: fortran/decl.c:1690 +-#, no-c-format +-msgid "Pointer initialization at %C requires '=>', not '='" +-msgstr "" +- +-#: fortran/decl.c:1699 fortran/decl.c:6129 +-#, fuzzy, no-c-format +-msgid "Expected an initialization expression at %C" +-msgstr "inicialització de l'expressió new amb \"=\"" +- +-#: fortran/decl.c:1705 +-#, no-c-format +-msgid "Initialization of variable at %C is not allowed in a PURE procedure" +-msgstr "" +- +-#: fortran/decl.c:1718 +-#, no-c-format +-msgid "Initialization of allocatable component at %C is not allowed" +-msgstr "" +- +-#: fortran/decl.c:1772 fortran/decl.c:1781 +-#, fuzzy, no-c-format +-msgid "Old-style type declaration %s*%d not supported at %C" +-msgstr "no es dóna suport a la declaració feble de \"%s\"" +- +-#: fortran/decl.c:1786 +-#, fuzzy, no-c-format +-msgid "Nonstandard type declaration %s*%d at %C" +-msgstr "declaració extern niada de \"%s\"" +- +-#: fortran/decl.c:1838 fortran/decl.c:1897 +-#, no-c-format +-msgid "Missing right parenthesis at %C" +-msgstr "" +- +-#: fortran/decl.c:1853 fortran/decl.c:1931 +-#, fuzzy, no-c-format +-msgid "Expected initialization expression at %C" +-msgstr "inicialització de l'expressió new amb \"=\"" +- +-#: fortran/decl.c:1861 fortran/decl.c:1937 +-#, fuzzy, no-c-format +-msgid "Expected scalar initialization expression at %C" +-msgstr "inicialització de l'expressió new amb \"=\"" +- +-#: fortran/decl.c:1891 +-#, fuzzy, no-c-format +-msgid "Kind %d not supported for type %s at %C" +-msgstr "el mode d'arrodoniment no té suport per a floats de VAX" +- +-#: fortran/decl.c:1957 +-#, fuzzy, no-c-format +-msgid "Kind %d is not supported for CHARACTER at %C" +-msgstr "el mode d'arrodoniment no té suport per a floats de VAX" +- +-#: fortran/decl.c:2086 +-#, no-c-format +-msgid "Syntax error in CHARACTER declaration at %C" +-msgstr "" +- +-#: fortran/decl.c:2156 +-#, no-c-format +-msgid "Extension: BYTE type at %C" +-msgstr "" +- +-#: fortran/decl.c:2162 +-#, no-c-format +-msgid "BYTE type used at %C is not available on the target machine" +-msgstr "" +- +-#: fortran/decl.c:2211 +-#, no-c-format +-msgid "DOUBLE COMPLEX at %C does not conform to the Fortran 95 standard" +-msgstr "" +- +-#: fortran/decl.c:2245 fortran/decl.c:2252 fortran/decl.c:2558 +-#: fortran/decl.c:2566 +-#, fuzzy, no-c-format +-msgid "Type name '%s' at %C is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: fortran/decl.c:2321 +-#, no-c-format +-msgid "Missing character range in IMPLICIT at %C" +-msgstr "" +- +-#: fortran/decl.c:2367 +-#, no-c-format +-msgid "Letters must be in alphabetic order in IMPLICIT statement at %C" +-msgstr "" +- +-#: fortran/decl.c:2421 +-#, no-c-format +-msgid "Empty IMPLICIT statement at %C" +-msgstr "" +- +-#: fortran/decl.c:2524 +-#, no-c-format +-msgid "IMPORT statement at %C only permitted in an INTERFACE body" +-msgstr "" +- +-#: fortran/decl.c:2529 +-#, fuzzy, no-c-format +-msgid "Fortran 2003: IMPORT statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/decl.c:2544 +-#, no-c-format +-msgid "Expecting list of named entities at %C" +-msgstr "" +- +-#: fortran/decl.c:2572 +-#, no-c-format +-msgid "Cannot IMPORT '%s' from host scoping unit at %C - does not exist." +-msgstr "" +- +-#: fortran/decl.c:2579 +-#, no-c-format +-msgid "'%s' is already IMPORTed from host scoping unit at %C." +-msgstr "" +- +-#: fortran/decl.c:2608 +-#, fuzzy, no-c-format +-msgid "Syntax error in IMPORT statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:2850 +-#, fuzzy, no-c-format +-msgid "Missing dimension specification at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/decl.c:2924 +-#, no-c-format +-msgid "Duplicate %s attribute at %L" +-msgstr "" +- +-#: fortran/decl.c:2943 +-#, no-c-format +-msgid "Fortran 2003: ALLOCATABLE attribute at %C in a TYPE definition" +-msgstr "" +- +-#: fortran/decl.c:2953 +-#, fuzzy, no-c-format +-msgid "Attribute at %L is not allowed in a TYPE definition" +-msgstr "la variable de registre global segueix a una definició de funció" +- +-#: fortran/decl.c:2971 +-#, no-c-format +-msgid "Fortran 2003: Attribute %s at %L in a TYPE definition" +-msgstr "" +- +-#: fortran/decl.c:2982 +-#, no-c-format +-msgid "%s attribute at %L is not allowed outside of the specification part of a module" +-msgstr "" +- +-#: fortran/decl.c:3034 fortran/decl.c:5437 +-#, no-c-format +-msgid "PROTECTED at %C only allowed in specification part of a module" +-msgstr "" +- +-#: fortran/decl.c:3040 +-#, no-c-format +-msgid "Fortran 2003: PROTECTED attribute at %C" +-msgstr "" +- +-#: fortran/decl.c:3071 +-#, no-c-format +-msgid "Fortran 2003: VALUE attribute at %C" +-msgstr "" +- +-#: fortran/decl.c:3081 +-#, no-c-format +-msgid "Fortran 2003: VOLATILE attribute at %C" +-msgstr "" +- +-#: fortran/decl.c:3121 +-#, no-c-format +-msgid "Multiple identifiers provided with single NAME= specifier at %C" +-msgstr "" +- +-#. Print an error, but continue parsing line. +-#: fortran/decl.c:3171 +-#, no-c-format +-msgid "C kind parameter is for type %s but symbol '%s' at %L is of type %s" +-msgstr "" +- +-#: fortran/decl.c:3235 +-#, no-c-format +-msgid "Implicitly declared BIND(C) function '%s' at %L may not be C interoperable" +-msgstr "" +- +-#: fortran/decl.c:3257 +-#, no-c-format +-msgid "Variable '%s' in common block '%s' at %L may not be a C interoperable kind though common block '%s' is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:3266 +-#, no-c-format +-msgid "Type declaration '%s' at %L is not C interoperable but it is BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:3270 +-#, no-c-format +-msgid "Variable '%s' at %L may not be a C interoperable kind but it is bind(c)" +-msgstr "" +- +-#: fortran/decl.c:3282 +-#, no-c-format +-msgid "Variable '%s' in common block '%s' at %L cannot be declared with BIND(C) since it is not a global" +-msgstr "" +- +-#: fortran/decl.c:3296 +-#, no-c-format +-msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes" +-msgstr "" +- +-#: fortran/decl.c:3304 +-#, no-c-format +-msgid "Variable '%s' at %L cannot have both the ALLOCATABLE and BIND(C) attributes" +-msgstr "" +- +-#: fortran/decl.c:3314 +-#, no-c-format +-msgid "Return type of BIND(C) function '%s' at %L cannot be an array" +-msgstr "" +- +-#: fortran/decl.c:3322 +-#, no-c-format +-msgid "Return type of BIND(C) function '%s' at %L cannot be a character string" +-msgstr "" +- +-#. Use gfc_warning_now because we won't say that the symbol fails +-#. just because of this. +-#: fortran/decl.c:3334 +-#, no-c-format +-msgid "Symbol '%s' at %L is marked PRIVATE but has been given the binding label '%s'" +-msgstr "" +- +-#: fortran/decl.c:3409 +-#, no-c-format +-msgid "Need either entity or common block name for attribute specification statement at %C" +-msgstr "" +- +-#: fortran/decl.c:3456 +-#, no-c-format +-msgid "Missing entity or common block name for attribute specification statement at %C" +-msgstr "" +- +-#. Now we have an error, which we signal, and then fix up +-#. because the knock-on is plain and simple confusing. +-#: fortran/decl.c:3563 +-#, no-c-format +-msgid "Derived type at %C has not been previously defined and so cannot appear in a derived type definition" +-msgstr "" +- +-#: fortran/decl.c:3595 +-#, fuzzy, no-c-format +-msgid "Syntax error in data declaration at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/decl.c:3742 +-#, no-c-format +-msgid "Name '%s' at %C is the name of the procedure" +-msgstr "" +- +-#: fortran/decl.c:3754 +-#, no-c-format +-msgid "Unexpected junk in formal argument list at %C" +-msgstr "" +- +-#: fortran/decl.c:3771 +-#, no-c-format +-msgid "Duplicate symbol '%s' in formal argument list at %C" +-msgstr "" +- +-#: fortran/decl.c:3822 +-#, no-c-format +-msgid "RESULT variable at %C must be different than function name" +-msgstr "" +- +-#: fortran/decl.c:3892 +-#, fuzzy, no-c-format +-msgid "Unexpected junk after function declaration at %C" +-msgstr "causa conflicte amb la declaració de la funció \"%#D\"" +- +-#: fortran/decl.c:3951 +-#, no-c-format +-msgid "Interface '%s' at %C may not be generic" +-msgstr "" +- +-#: fortran/decl.c:3956 +-#, fuzzy, no-c-format +-msgid "Interface '%s' at %C may not be a statement function" +-msgstr "el constructor no pot ser una funció membre de tipus static" +- +-#: fortran/decl.c:3967 +-#, no-c-format +-msgid "Intrinsic procedure '%s' not allowed in PROCEDURE statement at %C" +-msgstr "" +- +-#: fortran/decl.c:3975 +-#, no-c-format +-msgid "Fortran 2003: Support for intrinsic procedure '%s' in PROCEDURE statement at %C not yet implemented in gfortran" +-msgstr "" +- +-#: fortran/decl.c:4014 +-#, no-c-format +-msgid "BIND(C) attribute at %C requires an interface with BIND(C)" +-msgstr "" +- +-#: fortran/decl.c:4021 +-#, no-c-format +-msgid "BIND(C) procedure with NAME may not have POINTER attribute at %C" +-msgstr "" +- +-#: fortran/decl.c:4027 +-#, no-c-format +-msgid "Dummy procedure at %C may not have BIND(C) attribute with NAME" +-msgstr "" +- +-#: fortran/decl.c:4060 fortran/decl.c:4103 +-#, fuzzy, no-c-format +-msgid "Syntax error in PROCEDURE statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:4077 +-#, no-c-format +-msgid "PROCEDURE at %C must be in a generic interface" +-msgstr "" +- +-#: fortran/decl.c:4128 +-#, no-c-format +-msgid "Fortran 2003: Procedure components at %C are not yet implemented in gfortran" +-msgstr "" +- +-#: fortran/decl.c:4138 +-#, no-c-format +-msgid "Fortran 2003: PROCEDURE statement at %C" +-msgstr "" +- +-#: fortran/decl.c:4186 +-#, no-c-format +-msgid "Expected formal argument list in function definition at %C" +-msgstr "" +- +-#: fortran/decl.c:4210 fortran/decl.c:4214 fortran/decl.c:4536 +-#: fortran/decl.c:4540 fortran/symbol.c:1402 +-#, no-c-format +-msgid "BIND(C) attribute at %L can only be used for variables or common blocks" +-msgstr "" +- +-#: fortran/decl.c:4246 +-#, fuzzy, no-c-format +-msgid "Function '%s' at %C already has a type of %s" +-msgstr "Els inicis de les funcions són alineats a aquesta potència de 2" +- +-#: fortran/decl.c:4322 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a PROGRAM" +-msgstr "" +- +-#: fortran/decl.c:4325 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a MODULE" +-msgstr "" +- +-#: fortran/decl.c:4328 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a BLOCK DATA" +-msgstr "" +- +-#: fortran/decl.c:4332 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within an INTERFACE" +-msgstr "" +- +-#: fortran/decl.c:4336 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a DERIVED TYPE block" +-msgstr "" +- +-#: fortran/decl.c:4340 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within an IF-THEN block" +-msgstr "" +- +-#: fortran/decl.c:4344 +-#, fuzzy, no-c-format +-msgid "ENTRY statement at %C cannot appear within a DO block" +-msgstr "La declaració RETURN en %0 no és vàlida dintre d'una unitat de programa principal" +- +-#: fortran/decl.c:4348 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a SELECT block" +-msgstr "" +- +-#: fortran/decl.c:4352 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a FORALL block" +-msgstr "" +- +-#: fortran/decl.c:4356 +-#, no-c-format +-msgid "ENTRY statement at %C cannot appear within a WHERE block" +-msgstr "" +- +-#: fortran/decl.c:4360 +-#, fuzzy, no-c-format +-msgid "ENTRY statement at %C cannot appear within a contained subprogram" +-msgstr "La declaració RETURN en %0 no és vàlida dintre d'una unitat de programa principal" +- +-#: fortran/decl.c:4378 +-#, fuzzy, no-c-format +-msgid "ENTRY statement at %C cannot appear in a contained procedure" +-msgstr "desbordament en la constant implícita" +- +-#: fortran/decl.c:4560 +-#, no-c-format +-msgid "Missing required parentheses before BIND(C) at %C" +-msgstr "" +- +-#: fortran/decl.c:4618 fortran/decl.c:4634 +-#, no-c-format +-msgid "Syntax error in NAME= specifier for binding label at %C" +-msgstr "" +- +-#: fortran/decl.c:4649 +-#, no-c-format +-msgid "Missing closing quote '\"' for binding label at %C" +-msgstr "" +- +-#: fortran/decl.c:4658 +-#, no-c-format +-msgid "Missing closing quote ''' for binding label at %C" +-msgstr "" +- +-#: fortran/decl.c:4668 +-#, fuzzy, no-c-format +-msgid "Missing closing paren for binding label at %C" +-msgstr "Falta el primer operand binari per a l'operador binari en %0" +- +-#: fortran/decl.c:4703 +-#, no-c-format +-msgid "NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C" +-msgstr "" +- +-#: fortran/decl.c:4876 +-#, fuzzy, no-c-format +-msgid "Unexpected END statement at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#. We would have required END [something]. +-#: fortran/decl.c:4885 +-#, no-c-format +-msgid "%s statement expected at %L" +-msgstr "" +- +-#: fortran/decl.c:4896 +-#, fuzzy, no-c-format +-msgid "Expecting %s statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/decl.c:4911 +-#, no-c-format +-msgid "Expected block name of '%s' in %s statement at %C" +-msgstr "" +- +-#: fortran/decl.c:4928 +-#, no-c-format +-msgid "Expected terminating name at %C" +-msgstr "" +- +-#: fortran/decl.c:4937 +-#, fuzzy, no-c-format +-msgid "Expected label '%s' for %s statement at %C" +-msgstr "No hi ha definició d'etiqueta per a la declaració FORMAT en %0" +- +-#: fortran/decl.c:4991 +-#, fuzzy, no-c-format +-msgid "Missing array specification at %L in DIMENSION statement" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/decl.c:5000 +-#, no-c-format +-msgid "Array specification must be deferred at %L" +-msgstr "" +- +-#: fortran/decl.c:5077 +-#, no-c-format +-msgid "Unexpected character in variable list at %C" +-msgstr "" +- +-#: fortran/decl.c:5114 +-#, no-c-format +-msgid "Expected '(' at %C" +-msgstr "" +- +-#: fortran/decl.c:5128 fortran/decl.c:5168 +-#, no-c-format +-msgid "Expected variable name at %C" +-msgstr "" +- +-#: fortran/decl.c:5144 +-#, fuzzy, no-c-format +-msgid "Cray pointer at %C must be an integer" +-msgstr "el predicat ha de ser un identificador" +- +-#: fortran/decl.c:5148 +-#, no-c-format +-msgid "Cray pointer at %C has %d bytes of precision; memory addresses require %d bytes" +-msgstr "" +- +-#: fortran/decl.c:5154 +-#, no-c-format +-msgid "Expected \",\" at %C" +-msgstr "" +- +-#: fortran/decl.c:5217 +-#, no-c-format +-msgid "Expected \")\" at %C" +-msgstr "" +- +-#: fortran/decl.c:5229 +-#, fuzzy, no-c-format +-msgid "Expected \",\" or end of statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5293 +-#, no-c-format +-msgid "Cray pointer declaration at %C requires -fcray-pointer flag" +-msgstr "" +- +-#: fortran/decl.c:5388 +-#, no-c-format +-msgid "Access specification of the %s operator at %C has already been specified" +-msgstr "" +- +-#: fortran/decl.c:5405 +-#, no-c-format +-msgid "Access specification of the .%s. operator at %C has already been specified" +-msgstr "" +- +-#: fortran/decl.c:5443 +-#, no-c-format +-msgid "Fortran 2003: PROTECTED statement at %C" +-msgstr "" +- +-#: fortran/decl.c:5483 +-#, fuzzy, no-c-format +-msgid "Syntax error in PROTECTED statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5504 +-#, fuzzy, no-c-format +-msgid "PRIVATE statement at %C is only allowed in the specification part of a module" +-msgstr "L'especificador d'accés o la declaració PRIVATE en %0 no és vàlid per a la definició de tipus derivat dintre d'un altre que la part d'especificació d'un mòdul" +- +-#: fortran/decl.c:5541 +-#, fuzzy, no-c-format +-msgid "PUBLIC statement at %C is only allowed in the specification part of a module" +-msgstr "L'especificador d'accés o la declaració PRIVATE en %0 no és vàlid per a la definició de tipus derivat dintre d'un altre que la part d'especificació d'un mòdul" +- +-#: fortran/decl.c:5568 +-#, no-c-format +-msgid "Expected variable name at %C in PARAMETER statement" +-msgstr "" +- +-#: fortran/decl.c:5575 +-#, fuzzy, no-c-format +-msgid "Expected = sign in PARAMETER statement at %C" +-msgstr "Signe espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5581 +-#, no-c-format +-msgid "Expected expression at %C in PARAMETER statement" +-msgstr "" +- +-#: fortran/decl.c:5639 +-#, fuzzy, no-c-format +-msgid "Unexpected characters in PARAMETER statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5663 +-#, no-c-format +-msgid "Blanket SAVE statement at %C follows previous SAVE statement" +-msgstr "" +- +-#: fortran/decl.c:5675 +-#, no-c-format +-msgid "SAVE statement at %C follows blanket SAVE statement" +-msgstr "" +- +-#: fortran/decl.c:5722 +-#, fuzzy, no-c-format +-msgid "Syntax error in SAVE statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5733 +-#, no-c-format +-msgid "Fortran 2003: VALUE statement at %C" +-msgstr "" +- +-#: fortran/decl.c:5773 +-#, fuzzy, no-c-format +-msgid "Syntax error in VALUE statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5784 +-#, fuzzy, no-c-format +-msgid "Fortran 2003: VOLATILE statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5826 +-#, fuzzy, no-c-format +-msgid "Syntax error in VOLATILE statement at %C" +-msgstr "Nombre espuri en la declaració FORMAT en %0" +- +-#: fortran/decl.c:5848 +-#, no-c-format +-msgid "MODULE PROCEDURE at %C must be in a generic module interface" +-msgstr "" +- +-#: fortran/decl.c:5910 +-#, no-c-format +-msgid "Derived type at %C can only be PRIVATE in the specification part of a module" +-msgstr "" +- +-#: fortran/decl.c:5922 +-#, no-c-format +-msgid "Derived type at %C can only be PUBLIC in the specification part of a module" +-msgstr "" +- +-#: fortran/decl.c:5979 +-#, no-c-format +-msgid "Expected :: in TYPE definition at %C" +-msgstr "" +- +-#: fortran/decl.c:5990 +-#, fuzzy, no-c-format +-msgid "Type name '%s' at %C cannot be the same as an intrinsic type" +-msgstr "El nom de tipus en %0 no és el mateix que el nom en %1" +- +-#: fortran/decl.c:6000 +-#, no-c-format +-msgid "Derived type name '%s' at %C already has a basic type of %s" +-msgstr "" +- +-#: fortran/decl.c:6016 +-#, no-c-format +-msgid "Derived type definition of '%s' at %C has already been defined" +-msgstr "" +- +-#: fortran/decl.c:6054 +-#, no-c-format +-msgid "Cray Pointee at %C cannot be assumed shape array" +-msgstr "" +- +-#: fortran/decl.c:6074 +-#, no-c-format +-msgid "Fortran 2003: ENUM and ENUMERATOR at %C" +-msgstr "" +- +-#: fortran/decl.c:6146 +-#, no-c-format +-msgid "ENUMERATOR %L not initialized with integer expression" +-msgstr "" +- +-#: fortran/decl.c:6195 +-#, fuzzy, no-c-format +-msgid "ENUM definition statement expected before %C" +-msgstr "s'esperava nom de tipus abans de \"*\"" +- +-#: fortran/decl.c:6228 +-#, no-c-format +-msgid "Syntax error in ENUMERATOR definition at %C" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:48 +-#, c-format +-msgid "%-5d " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:50 +-#, fuzzy, c-format +-msgid " " +-msgstr " \"%D\"" +- +-#: fortran/dump-parse-tree.c:73 fortran/dump-parse-tree.c:626 +-#, fuzzy, c-format +-msgid "(%s " +-msgstr "%s " +- +-#: fortran/dump-parse-tree.c:86 fortran/dump-parse-tree.c:1069 +-#: fortran/dump-parse-tree.c:1113 fortran/dump-parse-tree.c:1123 +-#, c-format +-msgid "%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:90 fortran/dump-parse-tree.c:116 +-#: fortran/dump-parse-tree.c:159 fortran/dump-parse-tree.c:395 +-#: fortran/dump-parse-tree.c:518 fortran/dump-parse-tree.c:613 +-#: fortran/dump-parse-tree.c:636 +-#, c-format +-msgid ")" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:99 fortran/dump-parse-tree.c:435 +-#, c-format +-msgid "(" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:105 +-#, fuzzy, c-format +-msgid "%s = " +-msgstr "%s " +- +-#: fortran/dump-parse-tree.c:109 +-#, c-format +-msgid "(arg not-present)" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:113 fortran/dump-parse-tree.c:389 +-#: fortran/dump-parse-tree.c:514 +-#, c-format +-msgid " " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:130 fortran/dump-parse-tree.c:325 +-#, c-format +-msgid "()" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:134 +-#, c-format +-msgid "(%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:148 +-#, fuzzy, c-format +-msgid " %s " +-msgstr "%s " +- +-#: fortran/dump-parse-tree.c:175 +-#, c-format +-msgid "FULL" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:206 fortran/dump-parse-tree.c:215 +-#: fortran/dump-parse-tree.c:288 +-#, c-format +-msgid " , " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:220 +-#, c-format +-msgid "UNKNOWN" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:244 +-#, fuzzy, c-format +-msgid " %% %s" +-msgstr "%s: %s" +- +-#: fortran/dump-parse-tree.c:302 +-#, c-format +-msgid "''" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:307 +-#, c-format +-msgid "' // ACHAR(" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:309 +-#, c-format +-msgid ") // '" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:337 +-#, fuzzy, c-format +-msgid "%s(" +-msgstr "%s" +- +-#: fortran/dump-parse-tree.c:343 +-#, c-format +-msgid "(/ " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:345 +-#, c-format +-msgid " /)" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:351 +-#, c-format +-msgid "NULL()" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:361 fortran/dump-parse-tree.c:374 +-#: fortran/dump-parse-tree.c:387 fortran/dump-parse-tree.c:393 +-#, c-format +-msgid "_%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:366 +-#, c-format +-msgid ".true." +-msgstr "" +- +-#: fortran/dump-parse-tree.c:368 +-#, fuzzy, c-format +-msgid ".false." +-msgstr "fclose" +- +-#: fortran/dump-parse-tree.c:383 +-#, c-format +-msgid "(complex " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:399 +-#, c-format +-msgid "%dH" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:408 +-#, c-format +-msgid "???" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:414 +-#, c-format +-msgid " {" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:418 +-#, c-format +-msgid "%.2x" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:429 fortran/dump-parse-tree.c:732 +-#, fuzzy, c-format +-msgid "%s:" +-msgstr "%s" +- +-#: fortran/dump-parse-tree.c:439 +-#, c-format +-msgid "U+ " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:442 +-#, c-format +-msgid "U- " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:445 +-#, c-format +-msgid "+ " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:448 +-#, c-format +-msgid "- " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:451 +-#, c-format +-msgid "* " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:454 +-#, c-format +-msgid "/ " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:457 +-#, c-format +-msgid "** " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:460 +-#, c-format +-msgid "// " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:463 +-#, c-format +-msgid "AND " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:466 +-#, c-format +-msgid "OR " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:469 +-#, c-format +-msgid "EQV " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:472 +-#, c-format +-msgid "NEQV " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:476 +-#, c-format +-msgid "= " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:480 +-#, c-format +-msgid "/= " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:484 +-#, c-format +-msgid "> " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:488 +-#, c-format +-msgid ">= " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:492 +-#, c-format +-msgid "< " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:496 +-#, c-format +-msgid "<= " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:499 +-#, c-format +-msgid "NOT " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:502 +-#, fuzzy, c-format +-msgid "parens" +-msgstr "obrir %s" +- +-#: fortran/dump-parse-tree.c:524 +-#, fuzzy, c-format +-msgid "%s[" +-msgstr "%s" +- +-#: fortran/dump-parse-tree.c:530 +-#, fuzzy, c-format +-msgid "%s[[" +-msgstr "%s" +- +-#: fortran/dump-parse-tree.c:551 +-#, fuzzy, c-format +-msgid "(%s %s %s %s %s" +-msgstr "%s: %s: " +- +-#: fortran/dump-parse-tree.c:558 +-#, c-format +-msgid " ALLOCATABLE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:560 fortran/dump-parse-tree.c:631 +-#, c-format +-msgid " DIMENSION" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:562 +-#, c-format +-msgid " EXTERNAL" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:564 +-#, c-format +-msgid " INTRINSIC" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:566 +-#, c-format +-msgid " OPTIONAL" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:568 fortran/dump-parse-tree.c:629 +-#, c-format +-msgid " POINTER" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:570 +-#, c-format +-msgid " PROTECTED" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:572 +-#, c-format +-msgid " VALUE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:574 +-#, c-format +-msgid " VOLATILE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:576 +-#, c-format +-msgid " THREADPRIVATE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:578 +-#, c-format +-msgid " TARGET" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:580 +-#, c-format +-msgid " DUMMY" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:582 +-#, c-format +-msgid " RESULT" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:584 +-#, c-format +-msgid " ENTRY" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:587 +-#, c-format +-msgid " DATA" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:589 +-#, c-format +-msgid " USE-ASSOC" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:591 +-#, c-format +-msgid " IN-NAMELIST" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:593 +-#, c-format +-msgid " IN-COMMON" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:596 +-#, c-format +-msgid " ABSTRACT INTERFACE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:598 +-#, c-format +-msgid " FUNCTION" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:600 +-#, c-format +-msgid " SUBROUTINE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:602 +-#, c-format +-msgid " IMPLICIT-TYPE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:605 +-#, c-format +-msgid " SEQUENCE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:607 +-#, c-format +-msgid " ELEMENTAL" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:609 +-#, c-format +-msgid " PURE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:611 +-#, c-format +-msgid " RECURSIVE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:635 fortran/dump-parse-tree.c:682 +-#: fortran/dump-parse-tree.c:706 fortran/dump-parse-tree.c:735 +-#: fortran/dump-parse-tree.c:1276 fortran/dump-parse-tree.c:1282 +-#: fortran/dump-parse-tree.c:1784 +-#, c-format +-msgid " %s" +-msgstr " %s" +- +-#: fortran/dump-parse-tree.c:659 +-#, c-format +-msgid "symbol %s " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:666 +-#, c-format +-msgid "value: " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:673 +-#, c-format +-msgid "Array spec:" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:680 +-#, fuzzy, c-format +-msgid "Generic interfaces:" +-msgstr "Usar la interfície Cygwin" +- +-#: fortran/dump-parse-tree.c:688 +-#, fuzzy, c-format +-msgid "result: %s" +-msgstr "%s: %s" +- +-#: fortran/dump-parse-tree.c:694 +-#, c-format +-msgid "components: " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:701 +-#, c-format +-msgid "Formal arglist:" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:708 +-#, c-format +-msgid " [Alt Return]" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:715 +-#, fuzzy, c-format +-msgid "Formal namespace" +-msgstr "\"%D\" és un nom d'espai" +- +-#: fortran/dump-parse-tree.c:771 +-#, c-format +-msgid "common: /%s/ " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:779 fortran/dump-parse-tree.c:1720 +-#, c-format +-msgid ", " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:791 +-#, c-format +-msgid "symtree: %s Ambig %d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:794 +-#, fuzzy, c-format +-msgid " from namespace %s" +-msgstr "espai de noms \"%D\" desconegut" +- +-#: fortran/dump-parse-tree.c:820 +-#, fuzzy, c-format +-msgid "%s," +-msgstr "%s" +- +-#: fortran/dump-parse-tree.c:852 +-#, c-format +-msgid "!$OMP %s" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:867 fortran/dump-parse-tree.c:1010 +-#, fuzzy, c-format +-msgid " (%s)" +-msgstr " %s" +- +-#: fortran/dump-parse-tree.c:872 +-#, c-format +-msgid " (" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:888 +-#, c-format +-msgid " IF(" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:894 +-#, c-format +-msgid " NUM_THREADS(" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:910 +-#, c-format +-msgid " SCHEDULE (%s" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:930 +-#, c-format +-msgid " DEFAULT(%s)" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:933 +-#, c-format +-msgid " ORDERED" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:958 +-#, c-format +-msgid " REDUCTION(%s:" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:972 +-#, fuzzy, c-format +-msgid " %s(" +-msgstr " %s" +- +-#: fortran/dump-parse-tree.c:988 +-#, c-format +-msgid "!$OMP SECTION\n" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:997 +-#, c-format +-msgid "!$OMP END %s" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1002 +-#, c-format +-msgid " COPYPRIVATE(" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1007 +-#, c-format +-msgid " NOWAIT" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1034 +-#, c-format +-msgid "NOP" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1038 +-#, c-format +-msgid "CONTINUE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1042 +-#, c-format +-msgid "ENTRY %s" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1047 +-#, c-format +-msgid "ASSIGN " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1054 +-#, c-format +-msgid "LABEL ASSIGN " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1056 +-#, fuzzy, c-format +-msgid " %d" +-msgstr " %s" +- +-#: fortran/dump-parse-tree.c:1060 +-#, c-format +-msgid "POINTER ASSIGN " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1067 +-#, c-format +-msgid "GOTO " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1076 +-#, c-format +-msgid ", (" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1092 fortran/dump-parse-tree.c:1094 +-#, c-format +-msgid "CALL %s " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1096 +-#, c-format +-msgid "CALL ?? " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1102 +-#, c-format +-msgid "RETURN " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1108 +-#, c-format +-msgid "PAUSE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1118 +-#, c-format +-msgid "STOP " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1128 fortran/dump-parse-tree.c:1136 +-#, c-format +-msgid "IF " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1130 +-#, fuzzy, c-format +-msgid " %d, %d, %d" +-msgstr "%s: %s: " +- +-#: fortran/dump-parse-tree.c:1147 +-#, c-format +-msgid "ELSE\n" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1150 +-#, c-format +-msgid "ELSE IF " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1160 +-#, c-format +-msgid "ENDIF" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1165 +-#, c-format +-msgid "SELECT CASE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1173 +-#, c-format +-msgid "CASE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1189 +-#, c-format +-msgid "END SELECT" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1193 +-#, c-format +-msgid "WHERE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1204 +-#, c-format +-msgid "ELSE WHERE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1211 +-#, c-format +-msgid "END WHERE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1216 +-#, c-format +-msgid "FORALL " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1241 +-#, c-format +-msgid "END FORALL" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1245 +-#, c-format +-msgid "DO " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1259 fortran/dump-parse-tree.c:1270 +-#, c-format +-msgid "END DO" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1263 +-#, c-format +-msgid "DO WHILE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1274 +-#, c-format +-msgid "CYCLE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1280 +-#, c-format +-msgid "EXIT" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1286 +-#, c-format +-msgid "ALLOCATE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1289 fortran/dump-parse-tree.c:1305 +-#, c-format +-msgid " STAT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1302 +-#, c-format +-msgid "DEALLOCATE " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1318 +-#, c-format +-msgid "OPEN" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1323 fortran/dump-parse-tree.c:1402 +-#: fortran/dump-parse-tree.c:1444 fortran/dump-parse-tree.c:1467 +-#: fortran/dump-parse-tree.c:1619 +-#, c-format +-msgid " UNIT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1328 fortran/dump-parse-tree.c:1407 +-#: fortran/dump-parse-tree.c:1449 fortran/dump-parse-tree.c:1478 +-#: fortran/dump-parse-tree.c:1636 +-#, c-format +-msgid " IOMSG=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1333 fortran/dump-parse-tree.c:1412 +-#: fortran/dump-parse-tree.c:1454 fortran/dump-parse-tree.c:1483 +-#: fortran/dump-parse-tree.c:1641 +-#, c-format +-msgid " IOSTAT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1338 fortran/dump-parse-tree.c:1472 +-#, c-format +-msgid " FILE=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1343 fortran/dump-parse-tree.c:1417 +-#, c-format +-msgid " STATUS=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1348 fortran/dump-parse-tree.c:1513 +-#, c-format +-msgid " ACCESS=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1353 fortran/dump-parse-tree.c:1529 +-#, c-format +-msgid " FORM=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1358 fortran/dump-parse-tree.c:1544 +-#, c-format +-msgid " RECL=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1363 fortran/dump-parse-tree.c:1554 +-#, c-format +-msgid " BLANK=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1368 fortran/dump-parse-tree.c:1559 +-#, c-format +-msgid " POSITION=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1373 fortran/dump-parse-tree.c:1564 +-#, c-format +-msgid " ACTION=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1378 fortran/dump-parse-tree.c:1584 +-#, c-format +-msgid " DELIM=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1383 fortran/dump-parse-tree.c:1589 +-#, c-format +-msgid " PAD=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1388 fortran/dump-parse-tree.c:1594 +-#, c-format +-msgid " CONVERT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1392 fortran/dump-parse-tree.c:1421 +-#: fortran/dump-parse-tree.c:1458 fortran/dump-parse-tree.c:1599 +-#: fortran/dump-parse-tree.c:1676 +-#, c-format +-msgid " ERR=%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1397 +-#, c-format +-msgid "CLOSE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1425 +-#, c-format +-msgid "BACKSPACE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1429 +-#, c-format +-msgid "ENDFILE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1433 +-#, c-format +-msgid "REWIND" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1437 +-#, c-format +-msgid "FLUSH" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1462 +-#, c-format +-msgid "INQUIRE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1488 +-#, c-format +-msgid " EXIST=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1493 +-#, c-format +-msgid " OPENED=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1498 +-#, c-format +-msgid " NUMBER=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1503 +-#, c-format +-msgid " NAMED=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1508 +-#, c-format +-msgid " NAME=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1518 +-#, c-format +-msgid " SEQUENTIAL=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1524 +-#, c-format +-msgid " DIRECT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1534 +-#, c-format +-msgid " FORMATTED" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1539 +-#, c-format +-msgid " UNFORMATTED=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1549 +-#, c-format +-msgid " NEXTREC=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1569 +-#, c-format +-msgid " READ=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1574 +-#, c-format +-msgid " WRITE=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1579 +-#, c-format +-msgid " READWRITE=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1603 +-#, c-format +-msgid "IOLENGTH " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1609 +-#, c-format +-msgid "READ" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1613 +-#, c-format +-msgid "WRITE" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1625 +-#, c-format +-msgid " FMT=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1630 +-#, c-format +-msgid " FMT=%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1632 +-#, fuzzy, c-format +-msgid " NML=%s" +-msgstr " %s" +- +-#: fortran/dump-parse-tree.c:1646 +-#, c-format +-msgid " SIZE=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1651 +-#, c-format +-msgid " REC=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1656 +-#, c-format +-msgid " ADVANCE=" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1667 +-#, c-format +-msgid "TRANSFER " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1672 +-#, c-format +-msgid "DT_END" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1678 +-#, c-format +-msgid " END=%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1680 +-#, c-format +-msgid " EOR=%d" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1714 +-#, c-format +-msgid "Equivalence: " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1740 +-#, c-format +-msgid "Namespace:" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1754 +-#, c-format +-msgid " %c-%c: " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1756 +-#, c-format +-msgid " %c: " +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1765 +-#, c-format +-msgid "procedure name = %s" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1781 +-#, fuzzy, c-format +-msgid "Operator interfaces for %s:" +-msgstr "" +-"\n" +-" Opcions per a %s:\n" +- +-#: fortran/dump-parse-tree.c:1790 +-#, c-format +-msgid "User operators:\n" +-msgstr "" +- +-#: fortran/dump-parse-tree.c:1806 +-#, c-format +-msgid "CONTAINS\n" +-msgstr "" +- +-#: fortran/error.c:213 +-#, fuzzy, no-c-format +-msgid " Included at %s:%d:" +-msgstr "En el fitxer inclòs de %s:%d" +- +-#: fortran/error.c:318 +-#, fuzzy, no-c-format +-msgid "\n" +-msgstr "assignació de valors inicials" +- +-#: fortran/error.c:651 +-#, no-c-format +-msgid "Error count reached limit of %d." +-msgstr "" +- +-#: fortran/error.c:670 fortran/error.c:725 fortran/error.c:762 +-#, fuzzy +-msgid "Warning:" +-msgstr "avís:" +- +-#: fortran/error.c:727 fortran/error.c:810 fortran/error.c:836 +-#, fuzzy +-msgid "Error:" +-msgstr "error intern: " +- +-#: fortran/error.c:860 +-#, fuzzy +-msgid "Fatal Error:" +-msgstr "error intern: " +- +-#: fortran/error.c:879 +-#, fuzzy, no-c-format +-msgid "Internal Error at (1):" +-msgstr "error intern: " +- +-#: fortran/expr.c:252 +-#, c-format +-msgid "Constant expression required at %C" +-msgstr "" +- +-#: fortran/expr.c:255 +-#, c-format +-msgid "Integer expression required at %C" +-msgstr "" +- +-#: fortran/expr.c:260 +-#, fuzzy, c-format +-msgid "Integer value too large in expression at %C" +-msgstr "desbordament enter en l'expressió" +- +-#: fortran/expr.c:1018 fortran/expr.c:1189 fortran/expr.c:1240 +-#, no-c-format +-msgid "index in dimension %d is out of bounds at %L" +-msgstr "" +- +-#: fortran/expr.c:1789 +-#, no-c-format +-msgid "elemental function arguments at %C are not compliant" +-msgstr "" +- +-#: fortran/expr.c:1833 +-#, no-c-format +-msgid "Numeric or CHARACTER operands are required in expression at %L" +-msgstr "" +- +-#: fortran/expr.c:1853 +-#, no-c-format +-msgid "Fortran 2003: Noninteger exponent in an initialization expression at %L" +-msgstr "" +- +-#: fortran/expr.c:1868 +-#, no-c-format +-msgid "Concatenation operator in expression at %L must have two CHARACTER operands" +-msgstr "" +- +-#: fortran/expr.c:1875 +-#, no-c-format +-msgid "Concat operator at %L must concatenate strings of the same kind" +-msgstr "" +- +-#: fortran/expr.c:1885 +-#, no-c-format +-msgid ".NOT. operator in expression at %L must have a LOGICAL operand" +-msgstr "" +- +-#: fortran/expr.c:1901 +-#, no-c-format +-msgid "LOGICAL operands are required in expression at %L" +-msgstr "" +- +-#: fortran/expr.c:1912 +-#, fuzzy, no-c-format +-msgid "Only intrinsic operators can be used in expression at %L" +-msgstr "Falta un operand per a l'operador en %1 al final de l'expressió en %0" +- +-#: fortran/expr.c:1920 +-#, fuzzy, no-c-format +-msgid "Numeric operands are required in expression at %L" +-msgstr "Falta un operand per a l'operador en %1 al final de l'expressió en %0" +- +-#: fortran/expr.c:1985 +-#, no-c-format +-msgid "Inquiry function '%s' at %L is not permitted in an initialization expression" +-msgstr "" +- +-#: fortran/expr.c:2015 +-#, no-c-format +-msgid "Assumed character length variable '%s' in constant expression at %L" +-msgstr "" +- +-#: fortran/expr.c:2061 fortran/expr.c:2067 +-#, no-c-format +-msgid "transformational intrinsic '%s' at %L is not permitted in an initialization expression" +-msgstr "" +- +-#: fortran/expr.c:2098 +-#, no-c-format +-msgid "Extension: Evaluation of nonstandard initialization expression at %L" +-msgstr "" +- +-#: fortran/expr.c:2151 +-#, no-c-format +-msgid "Function '%s' in initialization expression at %L must be an intrinsic or a specification function" +-msgstr "" +- +-#: fortran/expr.c:2163 +-#, no-c-format +-msgid "Intrinsic function '%s' at %L is not permitted in an initialization expression" +-msgstr "" +- +-#: fortran/expr.c:2207 +-#, fuzzy, no-c-format +-msgid "Assumed size array '%s' at %L is not permitted in an initialization expression" +-msgstr "la grandària de la matriu \"%D\" no és una expressió constant integral" +- +-#: fortran/expr.c:2213 +-#, no-c-format +-msgid "Assumed shape array '%s' at %L is not permitted in an initialization expression" +-msgstr "" +- +-#: fortran/expr.c:2219 +-#, no-c-format +-msgid "Deferred array '%s' at %L is not permitted in an initialization expression" +-msgstr "" +- +-#: fortran/expr.c:2229 +-#, no-c-format +-msgid "Parameter '%s' at %L has not been declared or is a variable, which does not reduce to a constant expression" +-msgstr "" +- +-#: fortran/expr.c:2317 +-#, fuzzy, no-c-format +-msgid "Initialization expression didn't reduce %C" +-msgstr "inicialització de l'expressió new amb \"=\"" +- +-#: fortran/expr.c:2360 +-#, fuzzy, no-c-format +-msgid "Specification function '%s' at %L cannot be a statement function" +-msgstr "el constructor no pot ser una funció membre de tipus static" +- +-#: fortran/expr.c:2367 +-#, fuzzy, no-c-format +-msgid "Specification function '%s' at %L cannot be an internal function" +-msgstr "%Jla funció interna \"%D\" no és declarada com funció" +- +-#: fortran/expr.c:2374 +-#, no-c-format +-msgid "Specification function '%s' at %L must be PURE" +-msgstr "" +- +-#: fortran/expr.c:2381 +-#, no-c-format +-msgid "Specification function '%s' at %L cannot be RECURSIVE" +-msgstr "" +- +-#: fortran/expr.c:2443 +-#, no-c-format +-msgid "Dummy argument '%s' not allowed in expression at %L" +-msgstr "" +- +-#: fortran/expr.c:2450 +-#, no-c-format +-msgid "Dummy argument '%s' at %L cannot be OPTIONAL" +-msgstr "" +- +-#: fortran/expr.c:2457 +-#, no-c-format +-msgid "Dummy argument '%s' at %L cannot be INTENT(OUT)" +-msgstr "" +- +-#: fortran/expr.c:2479 +-#, fuzzy, no-c-format +-msgid "Variable '%s' cannot appear in the expression at %L" +-msgstr "desbordament en la constant implícita" +- +-#: fortran/expr.c:2528 +-#, no-c-format +-msgid "Expression at %L must be of INTEGER type" +-msgstr "" +- +-#: fortran/expr.c:2537 +-#, no-c-format +-msgid "Function '%s' at %L must be PURE" +-msgstr "" +- +-#: fortran/expr.c:2546 +-#, no-c-format +-msgid "Expression at %L must be scalar" +-msgstr "" +- +-#: fortran/expr.c:2573 +-#, no-c-format +-msgid "Incompatible ranks in %s (%d and %d) at %L" +-msgstr "" +- +-#: fortran/expr.c:2587 +-#, no-c-format +-msgid "Different shape for %s at %L on dimension %d (%d and %d)" +-msgstr "" +- +-#: fortran/expr.c:2633 fortran/expr.c:2800 +-#, no-c-format +-msgid "Cannot assign to INTENT(IN) variable '%s' at %L" +-msgstr "" +- +-#: fortran/expr.c:2676 +-#, no-c-format +-msgid "'%s' at %L is not a VALUE" +-msgstr "" +- +-#: fortran/expr.c:2683 +-#, fuzzy, no-c-format +-msgid "Incompatible ranks %d and %d in assignment at %L" +-msgstr "tipus incompatible en l'assignació de \"%T\" a \"%T\"" +- +-#: fortran/expr.c:2690 +-#, fuzzy, no-c-format +-msgid "Variable type is UNKNOWN in assignment at %L" +-msgstr "tipus incompatible en l'assignació de \"%T\" a \"%T\"" +- +-#: fortran/expr.c:2702 +-#, no-c-format +-msgid "NULL appears on right-hand side in assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2713 +-#, no-c-format +-msgid "Vector assignment to assumed-size Cray Pointee at %L is illegal" +-msgstr "" +- +-#: fortran/expr.c:2722 +-#, no-c-format +-msgid "POINTER valued function appears on right-hand side of assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2727 +-#, fuzzy +-msgid "array assignment" +-msgstr "assignació" +- +-#: fortran/expr.c:2744 +-#, fuzzy, no-c-format +-msgid "Incompatible types in assignment at %L, %s to %s" +-msgstr "tipus incompatible en l'assignació de \"%T\" a \"%T\"" +- +-#: fortran/expr.c:2769 +-#, no-c-format +-msgid "Pointer assignment target is not a POINTER at %L" +-msgstr "" +- +-#: fortran/expr.c:2777 +-#, no-c-format +-msgid "'%s' in the pointer assignment at %L cannot be an l-value since it is a procedure" +-msgstr "" +- +-#: fortran/expr.c:2807 +-#, no-c-format +-msgid "Pointer assignment to non-POINTER at %L" +-msgstr "" +- +-#: fortran/expr.c:2816 +-#, no-c-format +-msgid "Bad pointer object in PURE procedure at %L" +-msgstr "" +- +-#: fortran/expr.c:2828 +-#, no-c-format +-msgid "Different types in pointer assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2835 +-#, no-c-format +-msgid "Different kind type parameters in pointer assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2842 +-#, no-c-format +-msgid "Different ranks in pointer assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2857 +-#, no-c-format +-msgid "Different character lengths in pointer assignment at %L" +-msgstr "" +- +-#: fortran/expr.c:2868 +-#, no-c-format +-msgid "Pointer assignment target is neither TARGET nor POINTER at %L" +-msgstr "" +- +-#: fortran/expr.c:2875 +-#, no-c-format +-msgid "Bad target in pointer assignment in PURE procedure at %L" +-msgstr "" +- +-#: fortran/expr.c:2881 +-#, no-c-format +-msgid "Pointer assignment with vector subscript on rhs at %L" +-msgstr "" +- +-#: fortran/expr.c:2888 +-#, no-c-format +-msgid "Pointer assigment target has PROTECTED attribute at %L" +-msgstr "" +- +-#: fortran/gfortranspec.c:248 +-#, fuzzy, c-format +-msgid "overflowed output arg list for '%s'" +-msgstr "llista d'arguments de sortida desbordada per a \"%s\"" +- +-#: fortran/gfortranspec.c:381 +-#, c-format +-msgid "" +-"GNU Fortran comes with NO WARRANTY, to the extent permitted by law.\n" +-"You may redistribute copies of GNU Fortran\n" +-"under the terms of the GNU General Public License.\n" +-"For more information about these matters, see the file named COPYING\n" +-"\n" +-msgstr "" +- +-#: fortran/gfortranspec.c:403 +-#, fuzzy, c-format +-msgid "argument to '%s' missing" +-msgstr "falta l'argument per a \"%s\"" +- +-#: fortran/gfortranspec.c:407 +-#, c-format +-msgid "no input files; unwilling to write output files" +-msgstr "no hi ha fitxers d'entrada; incapaç d'escriure fitxers de sortida" +- +-#: fortran/gfortranspec.c:566 +-#, fuzzy, c-format +-msgid "Driving:" +-msgstr "avís:" +- +-#: fortran/interface.c:173 +-#, fuzzy, no-c-format +-msgid "Syntax error in generic specification at %C" +-msgstr "error de decodificació en l'especificació del mètode" +- +-#: fortran/interface.c:200 +-#, fuzzy, no-c-format +-msgid "Syntax error: Trailing garbage in INTERFACE statement at %C" +-msgstr "Text espuri addicional al nombre en la declaració FORMAT en %0" +- +-#: fortran/interface.c:219 +-#, no-c-format +-msgid "Dummy procedure '%s' at %C cannot have a generic interface" +-msgstr "" +- +-#: fortran/interface.c:252 +-#, no-c-format +-msgid "Fortran 2003: ABSTRACT INTERFACE at %C" +-msgstr "" +- +-#: fortran/interface.c:260 +-#, no-c-format +-msgid "Syntax error in ABSTRACT INTERFACE statement at %C" +-msgstr "" +- +-#: fortran/interface.c:291 +-#, no-c-format +-msgid "Syntax error: Trailing garbage in END INTERFACE statement at %C" +-msgstr "" +- +-#: fortran/interface.c:304 +-#, fuzzy, no-c-format +-msgid "Expected a nameless interface at %C" +-msgstr " s'esperava un patró de classe, es va obtenir \"%T\"" +- +-#: fortran/interface.c:315 +-#, no-c-format +-msgid "Expected 'END INTERFACE ASSIGNMENT (=)' at %C" +-msgstr "" +- +-#: fortran/interface.c:317 +-#, no-c-format +-msgid "Expecting 'END INTERFACE OPERATOR (%s)' at %C" +-msgstr "" +- +-#: fortran/interface.c:331 +-#, no-c-format +-msgid "Expecting 'END INTERFACE OPERATOR (.%s.)' at %C" +-msgstr "" +- +-#: fortran/interface.c:342 +-#, no-c-format +-msgid "Expecting 'END INTERFACE %s' at %C" +-msgstr "" +- +-#: fortran/interface.c:551 +-#, no-c-format +-msgid "Alternate return cannot appear in operator interface at %L" +-msgstr "" +- +-#: fortran/interface.c:581 +-#, no-c-format +-msgid "Operator interface at %L has the wrong number of arguments" +-msgstr "" +- +-#: fortran/interface.c:592 +-#, no-c-format +-msgid "Assignment operator interface at %L must be a SUBROUTINE" +-msgstr "" +- +-#: fortran/interface.c:598 +-#, no-c-format +-msgid "Assignment operator interface at %L must have two arguments" +-msgstr "" +- +-#: fortran/interface.c:608 +-#, no-c-format +-msgid "Assignment operator interface at %L must not redefine an INTRINSIC type assignment" +-msgstr "" +- +-#: fortran/interface.c:617 +-#, no-c-format +-msgid "Intrinsic operator interface at %L must be a FUNCTION" +-msgstr "" +- +-#: fortran/interface.c:627 +-#, no-c-format +-msgid "First argument of defined assignment at %L must be INTENT(IN) or INTENT(INOUT)" +-msgstr "" +- +-#: fortran/interface.c:631 +-#, no-c-format +-msgid "Second argument of defined assignment at %L must be INTENT(IN)" +-msgstr "" +- +-#: fortran/interface.c:637 fortran/resolve.c:8807 +-#, no-c-format +-msgid "First argument of operator interface at %L must be INTENT(IN)" +-msgstr "" +- +-#: fortran/interface.c:641 fortran/resolve.c:8819 +-#, no-c-format +-msgid "Second argument of operator interface at %L must be INTENT(IN)" +-msgstr "" +- +-#: fortran/interface.c:744 +-#, no-c-format +-msgid "Operator interface at %L conflicts with intrinsic interface" +-msgstr "" +- +-#: fortran/interface.c:1044 +-#, no-c-format +-msgid "Procedure '%s' in %s at %L has no explicit interface" +-msgstr "" +- +-#: fortran/interface.c:1047 +-#, no-c-format +-msgid "Procedure '%s' in %s at %L is neither function nor subroutine" +-msgstr "" +- +-#: fortran/interface.c:1102 fortran/interface.c:1108 +-#, no-c-format +-msgid "Ambiguous interfaces '%s' and '%s' in %s at %L" +-msgstr "" +- +-#: fortran/interface.c:1144 +-#, no-c-format +-msgid "'%s' at %L is not a module procedure" +-msgstr "" +- +-#: fortran/interface.c:1676 +-#, no-c-format +-msgid "Keyword argument '%s' at %L is not in the procedure" +-msgstr "" +- +-#: fortran/interface.c:1684 +-#, no-c-format +-msgid "Keyword argument '%s' at %L is already associated with another actual argument" +-msgstr "" +- +-#: fortran/interface.c:1694 +-#, no-c-format +-msgid "More actual than formal arguments in procedure call at %L" +-msgstr "" +- +-#: fortran/interface.c:1706 fortran/interface.c:1935 +-#, no-c-format +-msgid "Missing alternate return spec in subroutine call at %L" +-msgstr "" +- +-#: fortran/interface.c:1714 +-#, no-c-format +-msgid "Unexpected alternate return spec in subroutine call at %L" +-msgstr "" +- +-#: fortran/interface.c:1729 +-#, no-c-format +-msgid "Fortran 2003: Scalar CHARACTER actual argument with array dummy argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:1742 +-#, no-c-format +-msgid "Type/rank mismatch in argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:1758 +-#, no-c-format +-msgid "Character length mismatch between actual argument and pointer or allocatable dummy argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:1771 +-#, no-c-format +-msgid "Character length of actual argument shorter than of dummy argument '%s' (%lu/%lu) at %L" +-msgstr "" +- +-#: fortran/interface.c:1776 +-#, no-c-format +-msgid "Actual argument contains too few elements for dummy argument '%s' (%lu/%lu) at %L" +-msgstr "" +- +-#: fortran/interface.c:1790 +-#, no-c-format +-msgid "Expected a procedure for argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:1800 +-#, no-c-format +-msgid "Expected a PURE procedure for argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:1814 +-#, no-c-format +-msgid "Actual argument for '%s' cannot be an assumed-size array at %L" +-msgstr "" +- +-#: fortran/interface.c:1823 +-#, fuzzy, no-c-format +-msgid "Actual argument for '%s' must be a pointer at %L" +-msgstr "l'argument per a \"%s\" ha de ser una literal sense signe de 2-bit" +- +-#: fortran/interface.c:1832 +-#, no-c-format +-msgid "Actual argument for '%s' must be ALLOCATABLE at %L" +-msgstr "" +- +-#: fortran/interface.c:1843 +-#, no-c-format +-msgid "Actual argument at %L must be definable to match dummy INTENT = OUT/INOUT" +-msgstr "" +- +-#: fortran/interface.c:1851 +-#, no-c-format +-msgid "Actual argument at %L is use-associated with PROTECTED attribute and dummy argument '%s' is INTENT = OUT/INOUT" +-msgstr "" +- +-#: fortran/interface.c:1864 +-#, no-c-format +-msgid "Array-section actual argument with vector subscripts at %L is incompatible with INTENT(IN), INTENT(INOUT) or VOLATILE attribute of the dummy argument '%s'" +-msgstr "" +- +-#: fortran/interface.c:1881 +-#, no-c-format +-msgid "Assumed-shape actual argument at %L is incompatible with the non-assumed-shape dummy argument '%s' due to VOLATILE attribute" +-msgstr "" +- +-#: fortran/interface.c:1893 +-#, no-c-format +-msgid "Array-section actual argument at %L is incompatible with the non-assumed-shape dummy argument '%s' due to VOLATILE attribute" +-msgstr "" +- +-#: fortran/interface.c:1912 +-#, no-c-format +-msgid "Pointer-array actual argument at %L requires an assumed-shape or pointer-array dummy argument '%s' due to VOLATILE attribute" +-msgstr "" +- +-#: fortran/interface.c:1942 +-#, no-c-format +-msgid "Missing actual argument for argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:2128 +-#, no-c-format +-msgid "Same actual argument associated with INTENT(%s) argument '%s' and INTENT(%s) argument '%s' at %L" +-msgstr "" +- +-#: fortran/interface.c:2184 +-#, no-c-format +-msgid "Procedure argument at %L is INTENT(IN) while interface specifies INTENT(%s)" +-msgstr "" +- +-#: fortran/interface.c:2194 +-#, no-c-format +-msgid "Procedure argument at %L is local to a PURE procedure and is passed to an INTENT(%s) argument" +-msgstr "" +- +-#: fortran/interface.c:2202 +-#, no-c-format +-msgid "Procedure argument at %L is local to a PURE procedure and has the POINTER attribute" +-msgstr "" +- +-#: fortran/interface.c:2225 +-#, no-c-format +-msgid "Procedure '%s' called with an implicit interface at %L" +-msgstr "" +- +-#: fortran/interface.c:2440 +-#, no-c-format +-msgid "Function '%s' called in lieu of an operator at %L must be PURE" +-msgstr "" +- +-#: fortran/interface.c:2519 +-#, no-c-format +-msgid "Entity '%s' at %C is already present in the interface" +-msgstr "" +- +-#: fortran/intrinsic.c:2918 +-#, fuzzy, no-c-format +-msgid "Too many arguments in call to '%s' at %L" +-msgstr "massa arguments per a %s \"%+#D\"" +- +-#: fortran/intrinsic.c:2933 +-#, no-c-format +-msgid "The argument list functions %%VAL, %%LOC or %%REF are not allowed in this context at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:2936 +-#, no-c-format +-msgid "Can't find keyword named '%s' in call to '%s' at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:2943 +-#, no-c-format +-msgid "Argument '%s' is appears twice in call to '%s' at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:2957 +-#, no-c-format +-msgid "Missing actual argument '%s' in call to '%s' at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:2972 +-#, no-c-format +-msgid "ALTERNATE RETURN not permitted at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:3021 +-#, no-c-format +-msgid "Type of argument '%s' in call to '%s' at %L should be %s, not %s" +-msgstr "" +- +-#: fortran/intrinsic.c:3337 +-#, no-c-format +-msgid "Intrinsic '%s' at %L is not included in the selected standard" +-msgstr "" +- +-#: fortran/intrinsic.c:3450 +-#, no-c-format +-msgid "Fortran 2003: Elemental function as initialization expression with non-integer/non-character arguments at %L" +-msgstr "" +- +-#: fortran/intrinsic.c:3508 +-#, no-c-format +-msgid "Subroutine call to intrinsic '%s' at %L is not PURE" +-msgstr "" +- +-#: fortran/intrinsic.c:3579 +-#, fuzzy, no-c-format +-msgid "Extension: Conversion from %s to %s at %L" +-msgstr "conversió no vàlida de \"%T\" a \"%T\"" +- +-#: fortran/intrinsic.c:3582 +-#, fuzzy, no-c-format +-msgid "Conversion from %s to %s at %L" +-msgstr "conversió de \"%#T\" a \"%#T\"" +- +-#: fortran/intrinsic.c:3629 +-#, fuzzy, no-c-format +-msgid "Can't convert %s to %s at %L" +-msgstr "la conversion de %s a %s ha fallat" +- +-#: fortran/io.c:156 fortran/primary.c:738 +-#, no-c-format +-msgid "Extension: backslash character at %C" +-msgstr "" +- +-#: fortran/io.c:187 fortran/io.c:190 +-#, no-c-format +-msgid "Extension: Tab character in format at %C" +-msgstr "" +- +-#: fortran/io.c:450 +-#, fuzzy +-msgid "Positive width required" +-msgstr " però es requereixen %d" +- +-#: fortran/io.c:451 +-#, fuzzy +-msgid "Nonnegative width required" +-msgstr "amplària negativa en el camp de bit \"%s\"" +- +-#: fortran/io.c:452 +-#, fuzzy +-msgid "Unexpected element" +-msgstr "operand inesperat" +- +-#: fortran/io.c:453 +-#, fuzzy +-msgid "Unexpected end of format string" +-msgstr "constant de format sense acabar" +- +-#: fortran/io.c:472 +-#, fuzzy +-msgid "Missing leading left parenthesis" +-msgstr "\"(\" faltant" +- +-#: fortran/io.c:519 +-msgid "Expected P edit descriptor" +-msgstr "" +- +-#. P requires a prior number. +-#: fortran/io.c:527 +-msgid "P descriptor requires leading scale factor" +-msgstr "" +- +-#. X requires a prior number if we're being pedantic. +-#: fortran/io.c:532 +-#, no-c-format +-msgid "Extension: X descriptor requires leading space count at %C" +-msgstr "" +- +-#: fortran/io.c:554 +-#, no-c-format +-msgid "Extension: $ descriptor at %C" +-msgstr "" +- +-#: fortran/io.c:559 +-#, no-c-format +-msgid "$ should be the last specifier in format at %C" +-msgstr "" +- +-#: fortran/io.c:604 +-msgid "Repeat count cannot follow P descriptor" +-msgstr "" +- +-#: fortran/io.c:624 +-#, no-c-format +-msgid "Extension: Missing positive width after L descriptor at %C" +-msgstr "" +- +-#: fortran/io.c:670 fortran/io.c:672 fortran/io.c:733 fortran/io.c:735 +-#, fuzzy, no-c-format +-msgid "Period required in format specifier at %C" +-msgstr "no es reconeix l'especificador de format" +- +-#: fortran/io.c:704 +-msgid "Positive exponent width required" +-msgstr "" +- +-#: fortran/io.c:753 +-#, no-c-format +-msgid "The H format specifier at %C is a Fortran 95 deleted feature" +-msgstr "" +- +-#: fortran/io.c:838 fortran/io.c:895 +-#, no-c-format +-msgid "Extension: Missing comma at %C" +-msgstr "" +- +-#: fortran/io.c:905 +-#, fuzzy, no-c-format +-msgid "%s in format string at %C" +-msgstr "format %s, argument %s (argument %d)" +- +-#: fortran/io.c:946 +-#, no-c-format +-msgid "Format statement in module main block at %C" +-msgstr "" +- +-#: fortran/io.c:952 +-#, fuzzy, no-c-format +-msgid "Missing format label at %C" +-msgstr "nom de fitxer faltant deprés de \"%s\"" +- +-#: fortran/io.c:1010 fortran/io.c:1034 +-#, fuzzy, no-c-format +-msgid "Duplicate %s specification at %C" +-msgstr "després de l'especificació prèvia en \"%#D\"" +- +-#: fortran/io.c:1041 +-#, no-c-format +-msgid "Variable tag cannot be INTENT(IN) at %C" +-msgstr "" +- +-#: fortran/io.c:1048 +-#, no-c-format +-msgid "Variable tag cannot be assigned in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:1085 +-#, fuzzy, no-c-format +-msgid "Duplicate %s label specification at %C" +-msgstr "declaració de l'etiqueta \"%s\" duplicada" +- +-#: fortran/io.c:1106 +-#, no-c-format +-msgid "Constant expression in FORMAT tag at %L must be of type default CHARACTER" +-msgstr "" +- +-#: fortran/io.c:1119 +-#, no-c-format +-msgid "FORMAT tag at %L must be of type CHARACTER or INTEGER" +-msgstr "" +- +-#: fortran/io.c:1125 +-#, no-c-format +-msgid "Deleted feature: ASSIGNED variable in FORMAT tag at %L" +-msgstr "" +- +-#: fortran/io.c:1131 +-#, no-c-format +-msgid "Variable '%s' at %L has not been assigned a format label" +-msgstr "" +- +-#: fortran/io.c:1138 +-#, no-c-format +-msgid "Scalar '%s' in FORMAT tag at %L is not an ASSIGNED variable" +-msgstr "" +- +-#: fortran/io.c:1151 +-#, no-c-format +-msgid "Extension: Character array in FORMAT tag at %L" +-msgstr "" +- +-#: fortran/io.c:1157 +-#, fuzzy, no-c-format +-msgid "Extension: Non-character in FORMAT tag at %L" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/io.c:1182 +-#, fuzzy, no-c-format +-msgid "%s tag at %L must be of type %s" +-msgstr "\"%D\" no és un membre de tipus \"%T\"" +- +-#: fortran/io.c:1189 +-#, no-c-format +-msgid "%s tag at %L must be scalar" +-msgstr "" +- +-#: fortran/io.c:1195 +-#, no-c-format +-msgid "Fortran 2003: IOMSG tag at %L" +-msgstr "" +- +-#: fortran/io.c:1203 +-#, no-c-format +-msgid "Fortran 95 requires default INTEGER in %s tag at %L" +-msgstr "" +- +-#: fortran/io.c:1211 +-#, no-c-format +-msgid "Extension: CONVERT tag at %L" +-msgstr "" +- +-#: fortran/io.c:1367 fortran/io.c:1375 +-#, fuzzy, no-c-format +-msgid "Fortran 2003: %s specifier in %s statement at %C has value '%s'" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/io.c:1393 fortran/io.c:1401 +-#, fuzzy, no-c-format +-msgid "Extension: %s specifier in %s statement at %C has value '%s'" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/io.c:1413 fortran/io.c:1419 +-#, fuzzy, no-c-format +-msgid "%s specifier in %s statement at %C has invalid value '%s'" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/io.c:1473 +-#, no-c-format +-msgid "OPEN statement not allowed in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:1818 +-#, no-c-format +-msgid "CLOSE statement not allowed in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:1955 fortran/match.c:1841 +-#, no-c-format +-msgid "%s statement not allowed in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:2011 +-#, no-c-format +-msgid "Fortran 2003: FLUSH statement at %C" +-msgstr "" +- +-#: fortran/io.c:2072 +-#, no-c-format +-msgid "Duplicate UNIT specification at %C" +-msgstr "" +- +-#: fortran/io.c:2128 +-#, fuzzy, no-c-format +-msgid "Duplicate format specification at %C" +-msgstr "error de decodificació en l'especificació del mètode" +- +-#: fortran/io.c:2145 +-#, no-c-format +-msgid "Symbol '%s' in namelist '%s' is INTENT(IN) at %C" +-msgstr "" +- +-#: fortran/io.c:2181 +-#, fuzzy, no-c-format +-msgid "Duplicate NML specification at %C" +-msgstr "inicialització duplicada de %D" +- +-#: fortran/io.c:2190 +-#, no-c-format +-msgid "Symbol '%s' at %C must be a NAMELIST group name" +-msgstr "" +- +-#: fortran/io.c:2231 +-#, no-c-format +-msgid "END tag at %C not allowed in output statement" +-msgstr "" +- +-#: fortran/io.c:2288 +-#, no-c-format +-msgid "UNIT specification at %L must be an INTEGER expression or a CHARACTER variable" +-msgstr "" +- +-#: fortran/io.c:2297 +-#, no-c-format +-msgid "Internal unit with vector subscript at %L" +-msgstr "" +- +-#: fortran/io.c:2304 +-#, no-c-format +-msgid "External IO UNIT cannot be an array at %L" +-msgstr "" +- +-#: fortran/io.c:2314 +-#, fuzzy, no-c-format +-msgid "ERR tag label %d at %L not defined" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/io.c:2326 +-#, fuzzy, no-c-format +-msgid "END tag label %d at %L not defined" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/io.c:2338 +-#, fuzzy, no-c-format +-msgid "EOR tag label %d at %L not defined" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/io.c:2348 +-#, fuzzy, no-c-format +-msgid "FORMAT label %d at %L not defined" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/io.c:2469 +-#, fuzzy, no-c-format +-msgid "Syntax error in I/O iterator at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/io.c:2500 +-#, fuzzy, no-c-format +-msgid "Expected variable in READ statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/io.c:2506 +-#, fuzzy, no-c-format +-msgid "Expected expression in %s statement at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/io.c:2516 +-#, no-c-format +-msgid "Variable '%s' in input list at %C cannot be INTENT(IN)" +-msgstr "" +- +-#: fortran/io.c:2525 +-#, no-c-format +-msgid "Cannot read to variable '%s' in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:2541 +-#, no-c-format +-msgid "Cannot write to internal file unit '%s' at %C inside a PURE procedure" +-msgstr "" +- +-#. A general purpose syntax error. +-#: fortran/io.c:2602 fortran/io.c:3004 fortran/gfortran.h:1998 +-#, fuzzy, no-c-format +-msgid "Syntax error in %s statement at %C" +-msgstr "error sintàctic en l'element \"%s\"" +- +-#: fortran/io.c:2670 +-#, no-c-format +-msgid "Fortran 2003: Internal file at %L with namelist" +-msgstr "" +- +-#: fortran/io.c:2833 +-#, no-c-format +-msgid "PRINT namelist at %C is an extension" +-msgstr "" +- +-#: fortran/io.c:2965 +-#, no-c-format +-msgid "Extension: Comma before i/o item list at %C" +-msgstr "" +- +-#: fortran/io.c:2974 +-#, fuzzy, no-c-format +-msgid "Expected comma in I/O list at %C" +-msgstr "Coma sobrant en la declaració FORMAT en %0" +- +-#: fortran/io.c:3036 +-#, fuzzy, no-c-format +-msgid "PRINT statement at %C not allowed within PURE procedure" +-msgstr "La declaració RETURN en %0 no és vàlida dintre d'una unitat de programa principal" +- +-#: fortran/io.c:3176 fortran/io.c:3227 +-#, no-c-format +-msgid "INQUIRE statement not allowed in PURE procedure at %C" +-msgstr "" +- +-#: fortran/io.c:3203 +-#, no-c-format +-msgid "IOLENGTH tag invalid in INQUIRE statement at %C" +-msgstr "" +- +-#: fortran/io.c:3213 fortran/trans-io.c:1144 +-#, no-c-format +-msgid "INQUIRE statement at %L cannot contain both FILE and UNIT specifiers" +-msgstr "" +- +-#: fortran/io.c:3220 +-#, no-c-format +-msgid "INQUIRE statement at %L requires either FILE or UNIT specifier" +-msgstr "" +- +-#: fortran/match.c:270 +-#, fuzzy, no-c-format +-msgid "Integer too large at %C" +-msgstr "Enter en %0 massa gran" +- +-#: fortran/match.c:363 fortran/parse.c:442 +-#, no-c-format +-msgid "Too many digits in statement label at %C" +-msgstr "" +- +-#: fortran/match.c:369 +-#, no-c-format +-msgid "Statement label at %C is zero" +-msgstr "" +- +-#: fortran/match.c:402 +-#, fuzzy, no-c-format +-msgid "Label name '%s' at %C is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: fortran/match.c:408 +-#, fuzzy, no-c-format +-msgid "Duplicate construct label '%s' at %C" +-msgstr "etiqueta duplicada \"%D\"" +- +-#: fortran/match.c:438 +-#, fuzzy, no-c-format +-msgid "Invalid character in name at %C" +-msgstr "caracter no vàlid \"%c\" en #if" +- +-#: fortran/match.c:451 fortran/match.c:523 +-#, no-c-format +-msgid "Name at %C is too long" +-msgstr "" +- +-#: fortran/match.c:506 fortran/match.c:552 +-#, no-c-format +-msgid "Invalid C name in NAME= specifier at %C" +-msgstr "" +- +-#: fortran/match.c:543 +-#, no-c-format +-msgid "Embedded space in NAME= specifier at %C" +-msgstr "" +- +-#: fortran/match.c:868 +-#, no-c-format +-msgid "Loop variable at %C cannot be a sub-component" +-msgstr "" +- +-#: fortran/match.c:874 +-#, no-c-format +-msgid "Loop variable '%s' at %C cannot be INTENT(IN)" +-msgstr "" +- +-#: fortran/match.c:907 +-#, no-c-format +-msgid "Expected a step value in iterator at %C" +-msgstr "" +- +-#: fortran/match.c:919 +-#, fuzzy, no-c-format +-msgid "Syntax error in iterator at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/match.c:1155 +-#, fuzzy, no-c-format +-msgid "Invalid form of PROGRAM statement at %C" +-msgstr "Coma faltant en la declaració FORMAT en %0" +- +-#: fortran/match.c:1196 +-#, no-c-format +-msgid "Setting value of PROTECTED variable at %C" +-msgstr "" +- +-#: fortran/match.c:1249 +-#, no-c-format +-msgid "Assigning to a PROTECTED pointer at %C" +-msgstr "" +- +-#: fortran/match.c:1292 fortran/match.c:1365 +-#, no-c-format +-msgid "Obsolescent: arithmetic IF statement at %C" +-msgstr "" +- +-#: fortran/match.c:1340 +-#, fuzzy, no-c-format +-msgid "Syntax error in IF-expression at %C" +-msgstr "desbordament enter en l'expressió" +- +-#: fortran/match.c:1351 +-#, no-c-format +-msgid "Block label not appropriate for arithmetic IF statement at %C" +-msgstr "" +- +-#: fortran/match.c:1389 +-#, fuzzy, no-c-format +-msgid "Block label is not appropriate IF statement at %C" +-msgstr "No hi ha definició d'etiqueta per a la declaració FORMAT en %0" +- +-#: fortran/match.c:1468 fortran/primary.c:2522 +-#, no-c-format +-msgid "Cannot assign to a named constant at %C" +-msgstr "" +- +-#: fortran/match.c:1478 +-#, no-c-format +-msgid "Unclassifiable statement in IF-clause at %C" +-msgstr "" +- +-#: fortran/match.c:1485 +-#, no-c-format +-msgid "Syntax error in IF-clause at %C" +-msgstr "" +- +-#: fortran/match.c:1529 +-#, no-c-format +-msgid "Unexpected junk after ELSE statement at %C" +-msgstr "" +- +-#: fortran/match.c:1535 fortran/match.c:1570 +-#, no-c-format +-msgid "Label '%s' at %C doesn't match IF label '%s'" +-msgstr "" +- +-#: fortran/match.c:1564 +-#, no-c-format +-msgid "Unexpected junk after ELSE IF statement at %C" +-msgstr "" +- +-#: fortran/match.c:1727 +-#, no-c-format +-msgid "Name '%s' in %s statement at %C is not a loop name" +-msgstr "" +- +-#: fortran/match.c:1743 +-#, fuzzy, no-c-format +-msgid "%s statement at %C is not within a loop" +-msgstr "la declaració continue no està dintre dintre d'un cicle" +- +-#: fortran/match.c:1746 +-#, fuzzy, no-c-format +-msgid "%s statement at %C is not within loop '%s'" +-msgstr "la declaració break no està dintre d'un cicle o «switch»" +- +-#: fortran/match.c:1754 +-#, no-c-format +-msgid "%s statement at %C leaving OpenMP structured block" +-msgstr "" +- +-#: fortran/match.c:1767 +-#, no-c-format +-msgid "EXIT statement at %C terminating !$OMP DO loop" +-msgstr "" +- +-#: fortran/match.c:1819 +-#, no-c-format +-msgid "Too many digits in STOP code at %C" +-msgstr "" +- +-#: fortran/match.c:1872 +-#, no-c-format +-msgid "Deleted feature: PAUSE statement at %C" +-msgstr "" +- +-#: fortran/match.c:1920 +-#, no-c-format +-msgid "Deleted feature: ASSIGN statement at %C" +-msgstr "" +- +-#: fortran/match.c:1966 +-#, no-c-format +-msgid "Deleted feature: Assigned GOTO statement at %C" +-msgstr "" +- +-#: fortran/match.c:2013 fortran/match.c:2065 +-#, no-c-format +-msgid "Statement label list in GOTO at %C cannot be empty" +-msgstr "" +- +-#: fortran/match.c:2149 +-#, no-c-format +-msgid "Bad allocate-object in ALLOCATE statement at %C for a PURE procedure" +-msgstr "" +- +-#: fortran/match.c:2173 +-#, no-c-format +-msgid "STAT variable '%s' of ALLOCATE statement at %C cannot be INTENT(IN)" +-msgstr "" +- +-#: fortran/match.c:2180 +-#, no-c-format +-msgid "Illegal STAT variable in ALLOCATE statement at %C for a PURE procedure" +-msgstr "" +- +-#: fortran/match.c:2218 fortran/match.c:2382 +-#, no-c-format +-msgid "STAT expression at %C must be a variable" +-msgstr "" +- +-#: fortran/match.c:2272 +-#, no-c-format +-msgid "Illegal variable in NULLIFY at %C for a PURE procedure" +-msgstr "" +- +-#: fortran/match.c:2349 +-#, no-c-format +-msgid "Illegal deallocate-expression in DEALLOCATE at %C for a PURE procedure" +-msgstr "" +- +-#: fortran/match.c:2368 +-#, no-c-format +-msgid "STAT variable '%s' of DEALLOCATE statement at %C cannot be INTENT(IN)" +-msgstr "" +- +-#: fortran/match.c:2375 +-#, no-c-format +-msgid "Illegal STAT variable in DEALLOCATE statement at %C for a PURE procedure" +-msgstr "" +- +-#: fortran/match.c:2424 +-#, no-c-format +-msgid "Alternate RETURN statement at %C is only allowed within a SUBROUTINE" +-msgstr "" +- +-#: fortran/match.c:2455 +-#, fuzzy, no-c-format +-msgid "Extension: RETURN statement in main program at %C" +-msgstr "La declaració RETURN en %0 no és vàlida dintre d'una unitat de programa principal" +- +-#: fortran/match.c:2665 +-#, fuzzy, no-c-format +-msgid "Syntax error in common block name at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/match.c:2701 +-#, no-c-format +-msgid "Symbol '%s' at %C is already an external symbol that is not COMMON" +-msgstr "" +- +-#: fortran/match.c:2719 +-#, no-c-format +-msgid "BLOCK DATA unit cannot contain blank COMMON at %C" +-msgstr "" +- +-#. If we find an error, just print it and continue, +-#. cause it's just semantic, and we can see if there +-#. are more errors. +-#: fortran/match.c:2765 +-#, no-c-format +-msgid "Variable '%s' at %L in common block '%s' at %C must be declared with a C interoperable kind since common block '%s' is bind(c)" +-msgstr "" +- +-#: fortran/match.c:2774 +-#, no-c-format +-msgid "Variable '%s' in common block '%s' at %C can not be bind(c) since it is not global" +-msgstr "" +- +-#: fortran/match.c:2781 +-#, no-c-format +-msgid "Symbol '%s' at %C is already in a COMMON block" +-msgstr "" +- +-#: fortran/match.c:2793 +-#, no-c-format +-msgid "Previously initialized symbol '%s' in blank COMMON block at %C" +-msgstr "" +- +-#: fortran/match.c:2796 +-#, no-c-format +-msgid "Previously initialized symbol '%s' in COMMON block '%s' at %C" +-msgstr "" +- +-#: fortran/match.c:2821 +-#, no-c-format +-msgid "Array specification for symbol '%s' in COMMON at %C must be explicit" +-msgstr "" +- +-#: fortran/match.c:2831 +-#, no-c-format +-msgid "Symbol '%s' in COMMON at %C cannot be a POINTER array" +-msgstr "" +- +-#: fortran/match.c:2863 +-#, no-c-format +-msgid "Symbol '%s', in COMMON block '%s' at %C is being indirectly equivalenced to another COMMON block '%s'" +-msgstr "" +- +-#: fortran/match.c:2971 +-#, no-c-format +-msgid "Namelist group name '%s' at %C already has a basic type of %s" +-msgstr "" +- +-#: fortran/match.c:2979 +-#, no-c-format +-msgid "Namelist group name '%s' at %C already is USE associated and cannot be respecified." +-msgstr "" +- +-#: fortran/match.c:3006 +-#, no-c-format +-msgid "Assumed size array '%s' in namelist '%s' at %C is not allowed" +-msgstr "" +- +-#: fortran/match.c:3013 +-#, no-c-format +-msgid "Assumed character length '%s' in namelist '%s' at %C is not allowed" +-msgstr "" +- +-#: fortran/match.c:3140 +-#, no-c-format +-msgid "Derived type component %C is not a permitted EQUIVALENCE member" +-msgstr "" +- +-#: fortran/match.c:3148 +-#, no-c-format +-msgid "Array reference in EQUIVALENCE at %C cannot be an array section" +-msgstr "" +- +-#: fortran/match.c:3176 +-#, no-c-format +-msgid "EQUIVALENCE at %C requires two or more objects" +-msgstr "" +- +-#: fortran/match.c:3190 +-#, no-c-format +-msgid "Attempt to indirectly overlap COMMON blocks %s and %s by EQUIVALENCE at %C" +-msgstr "" +- +-#: fortran/match.c:3351 +-#, no-c-format +-msgid "Statement function at %L is recursive" +-msgstr "" +- +-#: fortran/match.c:3439 +-#, fuzzy, no-c-format +-msgid "Expected initialization expression in CASE at %C" +-msgstr "inicialització de l'expressió new amb \"=\"" +- +-#: fortran/match.c:3462 +-#, no-c-format +-msgid "Expected the name of the SELECT CASE construct at %C" +-msgstr "" +- +-#: fortran/match.c:3474 +-#, no-c-format +-msgid "Expected case name of '%s' at %C" +-msgstr "" +- +-#: fortran/match.c:3518 +-#, fuzzy, no-c-format +-msgid "Unexpected CASE statement at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/match.c:3570 +-#, fuzzy, no-c-format +-msgid "Syntax error in CASE-specification at %C" +-msgstr "error de decodificació en l'especificació del mètode" +- +-#: fortran/match.c:3690 +-#, no-c-format +-msgid "ELSEWHERE statement at %C not enclosed in WHERE block" +-msgstr "" +- +-#: fortran/match.c:3728 +-#, no-c-format +-msgid "Label '%s' at %C doesn't match WHERE label '%s'" +-msgstr "" +- +-#: fortran/match.c:3828 +-#, fuzzy, no-c-format +-msgid "Syntax error in FORALL iterator at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/matchexp.c:28 +-#, fuzzy, c-format +-msgid "Syntax error in expression at %C" +-msgstr "desbordament enter en l'expressió" +- +-#: fortran/matchexp.c:72 +-#, fuzzy, no-c-format +-msgid "Bad character '%c' in OPERATOR name at %C" +-msgstr "caracter no vàlid \"%c\" en #if" +- +-#: fortran/matchexp.c:80 +-#, fuzzy, no-c-format +-msgid "The name '%s' cannot be used as a defined operator at %C" +-msgstr "no es pot usar \"%s\" com un nom de macro perquè és un operador en C++" +- +-#: fortran/matchexp.c:187 +-#, fuzzy, no-c-format +-msgid "Expected a right parenthesis in expression at %C" +-msgstr "S'esperava un operador binari entre les expressions en %0 i en %1" +- +-#: fortran/matchexp.c:312 +-#, fuzzy, no-c-format +-msgid "Expected exponent in expression at %C" +-msgstr "S'esperava un operador binari entre les expressions en %0 i en %1" +- +-#: fortran/matchexp.c:348 fortran/matchexp.c:452 +-#, no-c-format +-msgid "Extension: Unary operator following arithmetic operator (use parentheses) at %C" +-msgstr "" +- +-#: fortran/misc.c:39 +-#, no-c-format +-msgid "Out of memory-- malloc() failed" +-msgstr "" +- +-#: fortran/module.c:516 +-#, no-c-format +-msgid "Fortran 2003: module nature in USE statement at %C" +-msgstr "" +- +-#: fortran/module.c:528 +-#, no-c-format +-msgid "Module nature in USE statement at %C shall be either INTRINSIC or NON_INTRINSIC" +-msgstr "" +- +-#: fortran/module.c:541 +-#, no-c-format +-msgid "\"::\" was expected after module nature at %C but was not found" +-msgstr "" +- +-#: fortran/module.c:550 +-#, no-c-format +-msgid "Fortran 2003: \"USE :: module\" at %C" +-msgstr "" +- +-#: fortran/module.c:602 +-#, fuzzy, no-c-format +-msgid "Missing generic specification in USE statement at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/module.c:610 +-#, no-c-format +-msgid "Fortran 2003: Renaming operators in USE statements at %C" +-msgstr "" +- +-#: fortran/module.c:652 +-#, no-c-format +-msgid "The name '%s' at %C has already been used as an external module name." +-msgstr "" +- +-#: fortran/module.c:930 +-#, no-c-format +-msgid "Reading module %s at line %d column %d: %s" +-msgstr "" +- +-#: fortran/module.c:934 +-#, no-c-format +-msgid "Writing module %s at line %d column %d: %s" +-msgstr "" +- +-#: fortran/module.c:938 +-#, no-c-format +-msgid "Module %s at line %d column %d: %s" +-msgstr "" +- +-#: fortran/module.c:978 +-#, fuzzy +-msgid "Unexpected EOF" +-msgstr "operand inesperat" +- +-#: fortran/module.c:1010 +-#, fuzzy +-msgid "Unexpected end of module in string constant" +-msgstr "conversió obsoleta d'una constant de cadena a \"%T\"" +- +-#: fortran/module.c:1064 +-#, fuzzy +-msgid "Integer overflow" +-msgstr "desbordament enter en l'expressió" +- +-#: fortran/module.c:1095 +-msgid "Name too long" +-msgstr "" +- +-#: fortran/module.c:1202 +-msgid "Bad name" +-msgstr "" +- +-#: fortran/module.c:1246 +-#, fuzzy +-msgid "Expected name" +-msgstr "operand inesperat" +- +-#: fortran/module.c:1249 +-#, fuzzy +-msgid "Expected left parenthesis" +-msgstr "operand inesperat" +- +-#: fortran/module.c:1252 +-msgid "Expected right parenthesis" +-msgstr "" +- +-#: fortran/module.c:1255 +-#, fuzzy +-msgid "Expected integer" +-msgstr "operand inesperat" +- +-#: fortran/module.c:1258 +-#, fuzzy +-msgid "Expected string" +-msgstr "operand inesperat" +- +-#: fortran/module.c:1282 +-msgid "find_enum(): Enum not found" +-msgstr "" +- +-#: fortran/module.c:1296 +-#, fuzzy, no-c-format +-msgid "Error writing modules file: %s" +-msgstr "%s:error escrivint al fitxer de sortida \"%s\"\n" +- +-#: fortran/module.c:1691 +-#, fuzzy +-msgid "Expected attribute bit name" +-msgstr "no és necessari l'atribut packed" +- +-#: fortran/module.c:2503 +-#, fuzzy +-msgid "Expected integer string" +-msgstr "falta la secció de punters" +- +-#: fortran/module.c:2507 +-msgid "Error converting integer" +-msgstr "" +- +-#: fortran/module.c:2529 +-#, fuzzy +-msgid "Expected real string" +-msgstr "constant de format sense acabar" +- +-#: fortran/module.c:2722 +-#, fuzzy +-msgid "Expected expression type" +-msgstr "expressió d'adreça inesperada" +- +-#: fortran/module.c:2776 +-#, fuzzy +-msgid "Bad operator" +-msgstr "operand no vàlid" +- +-#: fortran/module.c:2861 +-#, fuzzy +-msgid "Bad type in constant expression" +-msgstr "desbordament en la constant implícita" +- +-#: fortran/module.c:2898 +-#, no-c-format +-msgid "Namelist %s cannot be renamed by USE association to %s" +-msgstr "" +- +-#: fortran/module.c:3723 +-#, no-c-format +-msgid "Symbol '%s' referenced at %L not found in module '%s'" +-msgstr "" +- +-#: fortran/module.c:3730 +-#, no-c-format +-msgid "User operator '%s' referenced at %L not found in module '%s'" +-msgstr "" +- +-#: fortran/module.c:3735 +-#, no-c-format +-msgid "Intrinsic operator '%s' referenced at %L not found in module '%s'" +-msgstr "" +- +-#: fortran/module.c:4213 +-#, fuzzy, no-c-format +-msgid "Can't open module file '%s' for writing at %C: %s" +-msgstr "no es pot obrir %s per a escriptura" +- +-#: fortran/module.c:4251 +-#, fuzzy, no-c-format +-msgid "Error writing module file '%s' for writing: %s" +-msgstr "%s: error escrivint el fitxer \"%s\": %s\n" +- +-#: fortran/module.c:4281 fortran/module.c:4363 +-#, no-c-format +-msgid "Symbol '%s' referenced at %L does not exist in intrinsic module ISO_C_BINDING." +-msgstr "" +- +-#: fortran/module.c:4394 +-#, no-c-format +-msgid "Symbol '%s' referenced at %L not found in intrinsic module ISO_C_BINDING" +-msgstr "" +- +-#: fortran/module.c:4416 +-#, no-c-format +-msgid "Symbol '%s' already declared" +-msgstr "" +- +-#: fortran/module.c:4471 +-#, no-c-format +-msgid "Use of intrinsic module '%s' at %C conflicts with non-intrinsic module name used previously" +-msgstr "" +- +-#: fortran/module.c:4484 +-#, no-c-format +-msgid "Symbol '%s' referenced at %L does not exist in intrinsic module ISO_FORTRAN_ENV" +-msgstr "" +- +-#: fortran/module.c:4492 +-#, no-c-format +-msgid "Use of the NUMERIC_STORAGE_SIZE named constant from intrinsic module ISO_FORTRAN_ENV at %L is incompatible with option %s" +-msgstr "" +- +-#: fortran/module.c:4520 +-#, no-c-format +-msgid "Use of the NUMERIC_STORAGE_SIZE named constant from intrinsic module ISO_FORTRAN_ENV at %C is incompatible with option %s" +-msgstr "" +- +-#: fortran/module.c:4536 +-#, no-c-format +-msgid "Symbol '%s' referenced at %L not found in intrinsic module ISO_FORTRAN_ENV" +-msgstr "" +- +-#: fortran/module.c:4569 +-#, no-c-format +-msgid "Fortran 2003: ISO_FORTRAN_ENV intrinsic module at %C" +-msgstr "" +- +-#: fortran/module.c:4577 +-#, no-c-format +-msgid "Fortran 2003: ISO_C_BINDING module at %C" +-msgstr "" +- +-#: fortran/module.c:4587 +-#, no-c-format +-msgid "Can't find an intrinsic module named '%s' at %C" +-msgstr "" +- +-#: fortran/module.c:4592 +-#, fuzzy, no-c-format +-msgid "Can't open module file '%s' for reading at %C: %s" +-msgstr "%s: no es pot obrir el fitxer \"%s\" per a lectura: %s\n" +- +-#: fortran/module.c:4600 +-#, no-c-format +-msgid "Use of non-intrinsic module '%s' at %C conflicts with intrinsic module name used previously" +-msgstr "" +- +-#: fortran/module.c:4615 +-#, fuzzy +-msgid "Unexpected end of module" +-msgstr "símbol PIC inesperat" +- +-#: fortran/module.c:4620 +-#, no-c-format +-msgid "File '%s' opened at %C is not a GFORTRAN module file" +-msgstr "" +- +-#: fortran/module.c:4630 +-#, no-c-format +-msgid "Can't USE the same module we're building!" +-msgstr "" +- +-#: fortran/openmp.c:134 fortran/openmp.c:499 +-#, no-c-format +-msgid "COMMON block /%s/ not found at %C" +-msgstr "" +- +-#: fortran/openmp.c:165 +-#, fuzzy, no-c-format +-msgid "Syntax error in OpenMP variable list at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/openmp.c:291 +-#, no-c-format +-msgid "%s is not INTRINSIC procedure name at %C" +-msgstr "" +- +-#: fortran/openmp.c:478 +-#, no-c-format +-msgid "Threadprivate variable at %C is an element of a COMMON block" +-msgstr "" +- +-#: fortran/openmp.c:518 +-#, no-c-format +-msgid "Syntax error in !$OMP THREADPRIVATE list at %C" +-msgstr "" +- +-#: fortran/openmp.c:696 fortran/resolve.c:5822 fortran/resolve.c:6133 +-#, no-c-format +-msgid "IF clause at %L requires a scalar LOGICAL expression" +-msgstr "" +- +-#: fortran/openmp.c:704 +-#, no-c-format +-msgid "NUM_THREADS clause at %L requires a scalar INTEGER expression" +-msgstr "" +- +-#: fortran/openmp.c:712 +-#, no-c-format +-msgid "SCHEDULE clause's chunk_size at %L requires a scalar INTEGER expression" +-msgstr "" +- +-#: fortran/openmp.c:726 fortran/openmp.c:736 fortran/openmp.c:743 +-#: fortran/openmp.c:753 +-#, no-c-format +-msgid "Symbol '%s' present on multiple clauses at %L" +-msgstr "" +- +-#: fortran/openmp.c:776 +-#, no-c-format +-msgid "Non-THREADPRIVATE object '%s' in COPYIN clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:779 +-#, no-c-format +-msgid "COPYIN clause object '%s' is ALLOCATABLE at %L" +-msgstr "" +- +-#: fortran/openmp.c:782 +-#, no-c-format +-msgid "COPYIN clause object '%s' at %L has ALLOCATABLE components" +-msgstr "" +- +-#: fortran/openmp.c:790 +-#, no-c-format +-msgid "Assumed size array '%s' in COPYPRIVATE clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:793 +-#, no-c-format +-msgid "COPYPRIVATE clause object '%s' is ALLOCATABLE at %L" +-msgstr "" +- +-#: fortran/openmp.c:796 +-#, no-c-format +-msgid "COPYPRIVATE clause object '%s' at %L has ALLOCATABLE components" +-msgstr "" +- +-#: fortran/openmp.c:804 +-#, no-c-format +-msgid "THREADPRIVATE object '%s' in SHARED clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:807 +-#, no-c-format +-msgid "Cray pointee '%s' in SHARED clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:815 +-#, no-c-format +-msgid "THREADPRIVATE object '%s' in %s clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:818 +-#, no-c-format +-msgid "Cray pointee '%s' in %s clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:823 +-#, no-c-format +-msgid "POINTER object '%s' in %s clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:826 +-#, no-c-format +-msgid "%s clause object '%s' is ALLOCATABLE at %L" +-msgstr "" +- +-#: fortran/openmp.c:831 +-#, no-c-format +-msgid "%s clause object '%s' has ALLOCATABLE components at %L" +-msgstr "" +- +-#: fortran/openmp.c:834 +-#, no-c-format +-msgid "Cray pointer '%s' in %s clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:838 +-#, no-c-format +-msgid "Assumed size array '%s' in %s clause at %L" +-msgstr "" +- +-#: fortran/openmp.c:843 +-#, no-c-format +-msgid "Variable '%s' in %s clause is used in NAMELIST statement at %L" +-msgstr "" +- +-#: fortran/openmp.c:852 +-#, no-c-format +-msgid "%c REDUCTION variable '%s' at %L must be of numeric type, got %s" +-msgstr "" +- +-#: fortran/openmp.c:863 +-#, no-c-format +-msgid "%s REDUCTION variable '%s' must be LOGICAL at %L" +-msgstr "" +- +-#: fortran/openmp.c:874 +-#, no-c-format +-msgid "%s REDUCTION variable '%s' must be INTEGER or REAL at %L" +-msgstr "" +- +-#: fortran/openmp.c:883 +-#, no-c-format +-msgid "%s REDUCTION variable '%s' must be INTEGER at %L" +-msgstr "" +- +-#: fortran/openmp.c:995 +-#, no-c-format +-msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L" +-msgstr "" +- +-#: fortran/openmp.c:1035 +-#, no-c-format +-msgid "!$OMP ATOMIC assignment operator must be +, *, -, /, .AND., .OR., .EQV. or .NEQV. at %L" +-msgstr "" +- +-#: fortran/openmp.c:1083 +-#, no-c-format +-msgid "!$OMP ATOMIC assignment must be var = var op expr or var = expr op var at %L" +-msgstr "" +- +-#: fortran/openmp.c:1097 +-#, no-c-format +-msgid "!$OMP ATOMIC var = var op expr not mathematically equivalent to var = var op (expr) at %L" +-msgstr "" +- +-#: fortran/openmp.c:1129 +-#, no-c-format +-msgid "expr in !$OMP ATOMIC assignment var = var op expr must be scalar and cannot reference var at %L" +-msgstr "" +- +-#: fortran/openmp.c:1153 +-#, no-c-format +-msgid "!$OMP ATOMIC assignment intrinsic IAND, IOR or IEOR must have two arguments at %L" +-msgstr "" +- +-#: fortran/openmp.c:1160 +-#, no-c-format +-msgid "!$OMP ATOMIC assignment intrinsic must be MIN, MAX, IAND, IOR or IEOR at %L" +-msgstr "" +- +-#: fortran/openmp.c:1176 +-#, no-c-format +-msgid "!$OMP ATOMIC intrinsic arguments except one must not reference '%s' at %L" +-msgstr "" +- +-#: fortran/openmp.c:1179 +-#, no-c-format +-msgid "!$OMP ATOMIC intrinsic arguments must be scalar at %L" +-msgstr "" +- +-#: fortran/openmp.c:1185 +-#, no-c-format +-msgid "First or last !$OMP ATOMIC intrinsic argument must be '%s' at %L" +-msgstr "" +- +-#: fortran/openmp.c:1203 +-#, no-c-format +-msgid "!$OMP ATOMIC assignment must have an operator or intrinsic on right hand side at %L" +-msgstr "" +- +-#: fortran/openmp.c:1305 +-#, no-c-format +-msgid "!$OMP DO cannot be a DO WHILE or DO without loop control at %L" +-msgstr "" +- +-#: fortran/openmp.c:1311 +-#, no-c-format +-msgid "!$OMP DO iteration variable must be of type integer at %L" +-msgstr "" +- +-#: fortran/openmp.c:1315 +-#, no-c-format +-msgid "!$OMP DO iteration variable must not be THREADPRIVATE at %L" +-msgstr "" +- +-#: fortran/openmp.c:1323 +-#, no-c-format +-msgid "!$OMP DO iteration variable present on clause other than PRIVATE or LASTPRIVATE at %L" +-msgstr "" +- +-#: fortran/options.c:219 +-#, no-c-format +-msgid "Option -fwhole-program is not supported for Fortran" +-msgstr "" +- +-#: fortran/options.c:273 +-#, no-c-format +-msgid "Reading file '%s' as free form" +-msgstr "" +- +-#: fortran/options.c:283 +-#, no-c-format +-msgid "'-fd-lines-as-comments' has no effect in free form" +-msgstr "" +- +-#: fortran/options.c:286 +-#, no-c-format +-msgid "'-fd-lines-as-code' has no effect in free form" +-msgstr "" +- +-#: fortran/options.c:312 +-#, no-c-format +-msgid "Flag -fno-automatic overwrites -fmax-stack-var-size=%d" +-msgstr "" +- +-#: fortran/options.c:315 +-#, no-c-format +-msgid "Flag -fno-automatic overwrites -frecursive" +-msgstr "" +- +-#: fortran/options.c:317 +-#, no-c-format +-msgid "Flag -fno-automatic overwrites -frecursive implied by -fopenmp" +-msgstr "" +- +-#: fortran/options.c:321 +-#, no-c-format +-msgid "Flag -frecursive overwrites -fmax-stack-var-size=%d" +-msgstr "" +- +-#: fortran/options.c:325 +-#, no-c-format +-msgid "Flag -fmax-stack-var-size=%d overwrites -frecursive implied by -fopenmp" +-msgstr "" +- +-#: fortran/options.c:392 +-#, c-format +-msgid "gfortran: Only one -M option allowed\n" +-msgstr "" +- +-#: fortran/options.c:398 +-#, c-format +-msgid "gfortran: Directory required after -M\n" +-msgstr "" +- +-#: fortran/options.c:443 +-#, no-c-format +-msgid "Argument to -ffpe-trap is not valid: %s" +-msgstr "" +- +-#: fortran/options.c:573 +-#, no-c-format +-msgid "Fixed line length must be at least seven." +-msgstr "" +- +-#: fortran/options.c:591 +-#, no-c-format +-msgid "Free line length must be at least three." +-msgstr "" +- +-#: fortran/options.c:605 +-#, fuzzy, no-c-format +-msgid "-static-libgfortran is not supported in this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: fortran/options.c:649 +-#, no-c-format +-msgid "Maximum supported identifier length is %d" +-msgstr "" +- +-#: fortran/options.c:681 +-#, fuzzy, no-c-format +-msgid "Unrecognized option to -finit-logical: %s" +-msgstr "opció \"-%s\" no reconeguda" +- +-#: fortran/options.c:695 +-#, fuzzy, no-c-format +-msgid "Unrecognized option to -finit-real: %s" +-msgstr "opció \"-%s\" no reconeguda" +- +-#: fortran/options.c:711 +-#, no-c-format +-msgid "The value of n in -finit-character=n must be between 0 and 127" +-msgstr "" +- +-#: fortran/options.c:794 +-#, no-c-format +-msgid "Maximum subrecord length cannot exceed %d" +-msgstr "" +- +-#: fortran/parse.c:304 +-#, fuzzy, no-c-format +-msgid "Unclassifiable statement at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/parse.c:328 +-#, no-c-format +-msgid "OpenMP directives at %C may not appear in PURE or ELEMENTAL procedures" +-msgstr "" +- +-#: fortran/parse.c:406 +-#, no-c-format +-msgid "Unclassifiable OpenMP directive at %C" +-msgstr "" +- +-#: fortran/parse.c:445 fortran/parse.c:586 +-#, fuzzy, no-c-format +-msgid "Zero is not a valid statement label at %C" +-msgstr "\"%E\" no és un argument de patró vàlid" +- +-#: fortran/parse.c:452 fortran/parse.c:578 +-#, fuzzy, no-c-format +-msgid "Non-numeric character in statement label at %C" +-msgstr "Caràcter no numèric en %0 en el camp d'etiqueta [info -f g77 M LEX]" +- +-#: fortran/parse.c:464 fortran/parse.c:500 fortran/parse.c:626 +-#, no-c-format +-msgid "Semicolon at %C needs to be preceded by statement" +-msgstr "" +- +-#: fortran/parse.c:472 fortran/parse.c:638 +-#, no-c-format +-msgid "Ignoring statement label in empty statement at %C" +-msgstr "" +- +-#: fortran/parse.c:565 fortran/parse.c:605 +-#, no-c-format +-msgid "Bad continuation line at %C" +-msgstr "" +- +-#: fortran/parse.c:664 +-#, no-c-format +-msgid "Line truncated at %C" +-msgstr "" +- +-#: fortran/parse.c:841 +-#, no-c-format +-msgid "FORMAT statement at %L does not have a statement label" +-msgstr "" +- +-#: fortran/parse.c:913 +-msgid "arithmetic IF" +-msgstr "" +- +-#: fortran/parse.c:919 +-#, fuzzy +-msgid "attribute declaration" +-msgstr "declaració buida" +- +-#: fortran/parse.c:949 +-#, fuzzy +-msgid "data declaration" +-msgstr "declaració buida" +- +-#: fortran/parse.c:958 +-#, fuzzy +-msgid "derived type declaration" +-msgstr "declaració buida" +- +-#: fortran/parse.c:1037 +-msgid "block IF" +-msgstr "" +- +-#: fortran/parse.c:1046 +-msgid "implied END DO" +-msgstr "" +- +-#: fortran/parse.c:1119 +-msgid "assignment" +-msgstr "assignació" +- +-#: fortran/parse.c:1122 +-#, fuzzy +-msgid "pointer assignment" +-msgstr "assignació" +- +-#: fortran/parse.c:1131 +-msgid "simple IF" +-msgstr "" +- +-#: fortran/parse.c:1347 +-#, fuzzy, no-c-format +-msgid "Unexpected %s statement at %C" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/parse.c:1486 +-#, fuzzy, no-c-format +-msgid "%s statement at %C cannot follow %s statement at %L" +-msgstr "La declaració en %0 no és vàlida en el context establert per la declaració en %1" +- +-#: fortran/parse.c:1503 +-#, fuzzy, no-c-format +-msgid "Unexpected end of file in '%s'" +-msgstr "EOF inesperat mentre es llegia el fitxer de codi font %s.\n" +- +-#: fortran/parse.c:1558 +-#, no-c-format +-msgid "Fortran 2003: Derived type definition at %C without components" +-msgstr "" +- +-#: fortran/parse.c:1569 +-#, no-c-format +-msgid "PRIVATE statement in TYPE at %C must be inside a MODULE" +-msgstr "" +- +-#: fortran/parse.c:1577 +-#, no-c-format +-msgid "PRIVATE statement at %C must precede structure components" +-msgstr "" +- +-#: fortran/parse.c:1585 +-#, fuzzy, no-c-format +-msgid "Duplicate PRIVATE statement at %C" +-msgstr "Coma faltant en la declaració FORMAT en %0" +- +-#: fortran/parse.c:1597 +-#, no-c-format +-msgid "SEQUENCE statement at %C must precede structure components" +-msgstr "" +- +-#: fortran/parse.c:1604 +-#, no-c-format +-msgid "SEQUENCE attribute at %C already specified in TYPE statement" +-msgstr "" +- +-#: fortran/parse.c:1609 +-#, no-c-format +-msgid "Duplicate SEQUENCE statement at %C" +-msgstr "" +- +-#: fortran/parse.c:1700 +-#, no-c-format +-msgid "ENUM declaration at %C has no ENUMERATORS" +-msgstr "" +- +-#: fortran/parse.c:1778 +-#, no-c-format +-msgid "Unexpected %s statement in INTERFACE block at %C" +-msgstr "" +- +-#: fortran/parse.c:1804 +-#, no-c-format +-msgid "SUBROUTINE at %C does not belong in a generic function interface" +-msgstr "" +- +-#: fortran/parse.c:1808 +-#, no-c-format +-msgid "FUNCTION at %C does not belong in a generic subroutine interface" +-msgstr "" +- +-#: fortran/parse.c:1818 +-#, no-c-format +-msgid "Name '%s' of ABSTRACT INTERFACE at %C cannot be the same as an intrinsic type" +-msgstr "" +- +-#: fortran/parse.c:1849 +-#, no-c-format +-msgid "Unexpected %s statement at %C in INTERFACE body" +-msgstr "" +- +-#: fortran/parse.c:1863 +-#, no-c-format +-msgid "INTERFACE procedure '%s' at %L has the same name as the enclosing procedure" +-msgstr "" +- +-#: fortran/parse.c:1958 +-#, no-c-format +-msgid "%s statement must appear in a MODULE" +-msgstr "" +- +-#: fortran/parse.c:1965 +-#, no-c-format +-msgid "%s statement at %C follows another accessibility specification" +-msgstr "" +- +-#: fortran/parse.c:2015 +-#, fuzzy, no-c-format +-msgid "Bad kind expression for function '%s' at %L" +-msgstr "classe d'emmagatzematge no vàlida per a la funció \"%s\"" +- +-#: fortran/parse.c:2018 +-#, no-c-format +-msgid "The type for function '%s' at %L is not accessible" +-msgstr "" +- +-#: fortran/parse.c:2070 +-#, no-c-format +-msgid "ELSEWHERE statement at %C follows previous unmasked ELSEWHERE" +-msgstr "" +- +-#: fortran/parse.c:2091 +-#, no-c-format +-msgid "Unexpected %s statement in WHERE block at %C" +-msgstr "" +- +-#: fortran/parse.c:2150 +-#, no-c-format +-msgid "Unexpected %s statement in FORALL block at %C" +-msgstr "" +- +-#: fortran/parse.c:2201 +-#, fuzzy, no-c-format +-msgid "ELSE IF statement at %C cannot follow ELSE statement at %L" +-msgstr "La declaració PUBLIC o PRIVATE en %1 no es pot especificar juntament amb la declaració PUBLIC o PRIVATE en %0" +- +-#: fortran/parse.c:2219 +-#, no-c-format +-msgid "Duplicate ELSE statements at %L and %C" +-msgstr "" +- +-#: fortran/parse.c:2280 +-#, no-c-format +-msgid "Expected a CASE or END SELECT statement following SELECT CASE at %C" +-msgstr "" +- +-#: fortran/parse.c:2338 +-#, no-c-format +-msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L" +-msgstr "" +- +-#: fortran/parse.c:2372 +-#, no-c-format +-msgid "End of nonblock DO statement at %C is within another block" +-msgstr "" +- +-#: fortran/parse.c:2381 +-#, no-c-format +-msgid "End of nonblock DO statement at %C is interwoven with another DO loop" +-msgstr "" +- +-#: fortran/parse.c:2430 +-#, no-c-format +-msgid "Statement label in ENDDO at %C doesn't match DO label" +-msgstr "" +- +-#: fortran/parse.c:2446 +-#, no-c-format +-msgid "named block DO at %L requires matching ENDDO name" +-msgstr "" +- +-#: fortran/parse.c:2702 +-#, no-c-format +-msgid "Name after !$omp critical and !$omp end critical does not match at %C" +-msgstr "" +- +-#: fortran/parse.c:2758 +-#, no-c-format +-msgid "%s statement at %C cannot terminate a non-block DO loop" +-msgstr "" +- +-#: fortran/parse.c:2943 +-#, no-c-format +-msgid "Contained procedure '%s' at %C is already ambiguous" +-msgstr "" +- +-#: fortran/parse.c:2993 +-#, no-c-format +-msgid "Unexpected %s statement in CONTAINS section at %C" +-msgstr "" +- +-#. This is valid in Fortran 2008. +-#: fortran/parse.c:3018 +-#, no-c-format +-msgid "Extension: CONTAINS statement without FUNCTION or SUBROUTINE statement at %C" +-msgstr "" +- +-#: fortran/parse.c:3089 +-#, fuzzy, no-c-format +-msgid "CONTAINS statement at %C is already in a contained program unit" +-msgstr "La declaració RETURN en %0 no és vàlida dintre d'una unitat de programa principal" +- +-#: fortran/parse.c:3138 +-#, no-c-format +-msgid "Global name '%s' at %L is already being used as a %s at %L" +-msgstr "" +- +-#: fortran/parse.c:3159 +-#, no-c-format +-msgid "Blank BLOCK DATA at %C conflicts with prior BLOCK DATA at %L" +-msgstr "" +- +-#: fortran/parse.c:3185 +-#, no-c-format +-msgid "Unexpected %s statement in BLOCK DATA at %C" +-msgstr "" +- +-#: fortran/parse.c:3228 +-#, no-c-format +-msgid "Unexpected %s statement in MODULE at %C" +-msgstr "" +- +-#. If we see a duplicate main program, shut down. If the second +-#. instance is an implied main program, ie data decls or executable +-#. statements, we're in for lots of errors. +-#: fortran/parse.c:3416 +-#, no-c-format +-msgid "Two main PROGRAMs at %L and %C" +-msgstr "" +- +-#: fortran/primary.c:87 +-#, fuzzy, no-c-format +-msgid "Missing kind-parameter at %C" +-msgstr "falta parèntesi dret en la llista de paràmetres de macro" +- +-#: fortran/primary.c:210 +-#, fuzzy, no-c-format +-msgid "Integer kind %d at %C not available" +-msgstr "la funció cso no és disponible" +- +-#: fortran/primary.c:218 +-#, no-c-format +-msgid "Integer too big for its kind at %C. This check can be disabled with the option -fno-range-check" +-msgstr "" +- +-#: fortran/primary.c:247 +-#, no-c-format +-msgid "Extension: Hollerith constant at %C" +-msgstr "" +- +-#: fortran/primary.c:259 +-#, no-c-format +-msgid "Invalid Hollerith constant: %L must contain at least one character" +-msgstr "" +- +-#: fortran/primary.c:265 +-#, no-c-format +-msgid "Invalid Hollerith constant: Integer kind at %L should be default" +-msgstr "" +- +-#: fortran/primary.c:353 +-#, no-c-format +-msgid "Extension: Hexadecimal constant at %C uses non-standard syntax." +-msgstr "" +- +-#: fortran/primary.c:363 +-#, no-c-format +-msgid "Empty set of digits in BOZ constant at %C" +-msgstr "" +- +-#: fortran/primary.c:369 +-#, fuzzy, no-c-format +-msgid "Illegal character in BOZ constant at %C" +-msgstr "Constant de caràcter de longitud zero en %0" +- +-#: fortran/primary.c:391 +-#, no-c-format +-msgid "Extension: BOZ constant at %C uses non-standard postfix syntax." +-msgstr "" +- +-#: fortran/primary.c:417 +-#, no-c-format +-msgid "Integer too big for integer kind %i at %C" +-msgstr "" +- +-#: fortran/primary.c:517 +-#, fuzzy, no-c-format +-msgid "Missing exponent in real number at %C" +-msgstr "Falta un valor en %1 per a l'exponent de nombre real en %0" +- +-#: fortran/primary.c:573 +-#, no-c-format +-msgid "Real number at %C has a 'd' exponent and an explicit kind" +-msgstr "" +- +-#: fortran/primary.c:586 +-#, no-c-format +-msgid "Invalid real kind %d at %C" +-msgstr "" +- +-#: fortran/primary.c:600 +-#, no-c-format +-msgid "Real constant overflows its kind at %C" +-msgstr "" +- +-#: fortran/primary.c:605 +-#, no-c-format +-msgid "Real constant underflows its kind at %C" +-msgstr "" +- +-#: fortran/primary.c:697 +-#, fuzzy, no-c-format +-msgid "Syntax error in SUBSTRING specification at %C" +-msgstr "error de decodificació en l'especificació del mètode" +- +-#: fortran/primary.c:902 +-#, no-c-format +-msgid "Invalid kind %d for CHARACTER constant at %C" +-msgstr "" +- +-#: fortran/primary.c:923 +-#, fuzzy, no-c-format +-msgid "Unterminated character constant beginning at %C" +-msgstr "Constant de caràcter de longitud zero en %0" +- +-#: fortran/primary.c:1035 +-#, no-c-format +-msgid "Bad kind for logical constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1074 +-#, no-c-format +-msgid "Expected PARAMETER symbol in complex constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1080 +-#, no-c-format +-msgid "Numeric PARAMETER required in complex constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1086 +-#, no-c-format +-msgid "Scalar PARAMETER required in complex constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1090 +-#, no-c-format +-msgid "Fortran 2003: PARAMETER symbol in complex constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1120 +-#, no-c-format +-msgid "Error converting PARAMETER constant in complex constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1249 +-#, no-c-format +-msgid "Syntax error in COMPLEX constant at %C" +-msgstr "" +- +-#: fortran/primary.c:1430 +-#, no-c-format +-msgid "Keyword '%s' at %C has already appeared in the current argument list" +-msgstr "" +- +-#: fortran/primary.c:1494 +-#, fuzzy, no-c-format +-msgid "Extension: argument list function at %C" +-msgstr "massa arguments per a la funció \"%s\"" +- +-#: fortran/primary.c:1561 +-#, no-c-format +-msgid "Expected alternate return label at %C" +-msgstr "" +- +-#: fortran/primary.c:1579 +-#, no-c-format +-msgid "Missing keyword name in actual argument list at %C" +-msgstr "" +- +-#: fortran/primary.c:1624 +-#, fuzzy, no-c-format +-msgid "Syntax error in argument list at %C" +-msgstr "errore sintàctic en la llista de paràmetre de macro" +- +-#: fortran/primary.c:1708 +-#, no-c-format +-msgid "Expected structure component name at %C" +-msgstr "" +- +-#: fortran/primary.c:1961 +-#, no-c-format +-msgid "Too many components in structure constructor at %C" +-msgstr "" +- +-#: fortran/primary.c:1974 +-#, no-c-format +-msgid "Structure constructor for '%s' at %C has PRIVATE components" +-msgstr "" +- +-#: fortran/primary.c:1984 +-#, no-c-format +-msgid "Too few components in structure constructor at %C" +-msgstr "" +- +-#: fortran/primary.c:2002 +-#, no-c-format +-msgid "Syntax error in structure constructor at %C" +-msgstr "" +- +-#: fortran/primary.c:2086 +-#, no-c-format +-msgid "'%s' at %C is the name of a recursive function and so refers to the result variable. Use an explicit RESULT variable for direct recursion (12.5.2.1)" +-msgstr "" +- +-#: fortran/primary.c:2188 +-#, no-c-format +-msgid "Unexpected use of subroutine name '%s' at %C" +-msgstr "" +- +-#: fortran/primary.c:2219 +-#, no-c-format +-msgid "Statement function '%s' requires argument list at %C" +-msgstr "" +- +-#: fortran/primary.c:2222 +-#, fuzzy, no-c-format +-msgid "Function '%s' requires an argument list at %C" +-msgstr "\"union %s\" declarat dintre d'una llista de paràmetres" +- +-#: fortran/primary.c:2267 +-#, fuzzy, no-c-format +-msgid "Missing argument to '%s' at %C" +-msgstr "Falten arguments per a l'opció \"%s\"" +- +-#: fortran/primary.c:2408 +-#, fuzzy, no-c-format +-msgid "Missing argument list in function '%s' at %C" +-msgstr "Falten arguments per a l'opció \"%s\"" +- +-#: fortran/primary.c:2436 +-#, fuzzy, no-c-format +-msgid "Symbol at %C is not appropriate for an expression" +-msgstr "desbordament de coma flotant en l'expressió" +- +-#: fortran/primary.c:2504 +-#, no-c-format +-msgid "Assigning to PROTECTED variable at %C" +-msgstr "" +- +-#: fortran/primary.c:2520 +-#, no-c-format +-msgid "Named constant at %C in an EQUIVALENCE" +-msgstr "" +- +-#: fortran/primary.c:2543 +-#, no-c-format +-msgid "Expected VARIABLE at %C" +-msgstr "" +- +-#: fortran/resolve.c:120 +-#, fuzzy, no-c-format +-msgid "Alternate return specifier in elemental subroutine '%s' at %L is not allowed" +-msgstr "L'especificador de retorn alternatiu en %0 no és vàlid dintre d'una funció" +- +-#: fortran/resolve.c:124 +-#, fuzzy, no-c-format +-msgid "Alternate return specifier in function '%s' at %L is not allowed" +-msgstr "L'especificador de retorn alternatiu en %0 no és vàlid dintre d'una funció" +- +-#: fortran/resolve.c:137 +-#, no-c-format +-msgid "Dummy procedure '%s' of PURE procedure at %L must also be PURE" +-msgstr "" +- +-#: fortran/resolve.c:144 +-#, no-c-format +-msgid "Dummy procedure at %L not allowed in ELEMENTAL procedure" +-msgstr "" +- +-#: fortran/resolve.c:157 fortran/resolve.c:1080 +-#, no-c-format +-msgid "Unable to find a specific INTRINSIC procedure for the reference '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:201 +-#, no-c-format +-msgid "Argument '%s' of pure function '%s' at %L must be INTENT(IN)" +-msgstr "" +- +-#: fortran/resolve.c:206 +-#, no-c-format +-msgid "Argument '%s' of pure subroutine '%s' at %L must have its INTENT specified" +-msgstr "" +- +-#: fortran/resolve.c:215 +-#, no-c-format +-msgid "Argument '%s' of elemental procedure at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:222 +-#, no-c-format +-msgid "Argument '%s' of elemental procedure at %L cannot have the POINTER attribute" +-msgstr "" +- +-#: fortran/resolve.c:234 +-#, no-c-format +-msgid "Argument '%s' of statement function at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:244 +-#, no-c-format +-msgid "Character-valued argument '%s' of statement function at %L must have constant length" +-msgstr "" +- +-#: fortran/resolve.c:299 +-#, no-c-format +-msgid "Contained function '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#: fortran/resolve.c:302 +-#, no-c-format +-msgid "Result '%s' of contained function '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#: fortran/resolve.c:319 +-#, no-c-format +-msgid "Character-valued internal function '%s' at %L must not be assumed length" +-msgstr "" +- +-#: fortran/resolve.c:490 +-#, no-c-format +-msgid "Procedure %s at %L has entries with mismatched array specifications" +-msgstr "" +- +-#: fortran/resolve.c:516 +-#, no-c-format +-msgid "FUNCTION result %s can't be an array in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:520 +-#, no-c-format +-msgid "ENTRY result %s can't be an array in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:527 +-#, no-c-format +-msgid "FUNCTION result %s can't be a POINTER in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:531 +-#, no-c-format +-msgid "ENTRY result %s can't be a POINTER in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:569 +-#, no-c-format +-msgid "FUNCTION result %s can't be of type %s in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:574 +-#, no-c-format +-msgid "ENTRY result %s can't be of type %s in FUNCTION %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:643 +-#, no-c-format +-msgid "Derived type variable '%s' in COMMON at %L has neither the SEQUENCE nor the BIND(C) attribute" +-msgstr "" +- +-#: fortran/resolve.c:647 +-#, no-c-format +-msgid "Derived type variable '%s' in COMMON at %L has an ultimate component that is allocatable" +-msgstr "" +- +-#: fortran/resolve.c:651 +-#, no-c-format +-msgid "Derived type variable '%s' in COMMON at %L may not have default initializer" +-msgstr "" +- +-#: fortran/resolve.c:661 +-#, no-c-format +-msgid "COMMON block '%s' at %L is used as PARAMETER at %L" +-msgstr "" +- +-#: fortran/resolve.c:665 +-#, no-c-format +-msgid "COMMON block '%s' at %L is also an intrinsic procedure" +-msgstr "" +- +-#: fortran/resolve.c:669 +-#, no-c-format +-msgid "Fortran 2003: COMMON block '%s' at %L that is also a function result" +-msgstr "" +- +-#: fortran/resolve.c:674 +-#, no-c-format +-msgid "Fortran 2003: COMMON block '%s' at %L that is also a global procedure" +-msgstr "" +- +-#: fortran/resolve.c:736 +-#, no-c-format +-msgid "Components of structure constructor '%s' at %L are PRIVATE" +-msgstr "" +- +-#: fortran/resolve.c:756 +-#, no-c-format +-msgid "The rank of the element in the derived type constructor at %L does not match that of the component (%d/%d)" +-msgstr "" +- +-#: fortran/resolve.c:769 +-#, no-c-format +-msgid "The element in the derived type constructor at %L, for pointer component '%s', is %s but should be %s" +-msgstr "" +- +-#: fortran/resolve.c:786 +-#, no-c-format +-msgid "The element in the derived type constructor at %L, for pointer component '%s' should be a POINTER or a TARGET" +-msgstr "" +- +-#: fortran/resolve.c:913 +-#, no-c-format +-msgid "The upper bound in the last dimension must appear in the reference to the assumed size array '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:976 fortran/resolve.c:5434 fortran/resolve.c:6098 +-#, fuzzy, no-c-format +-msgid "Label %d referenced at %L is never defined" +-msgstr "L'etiqueta %A ja es va definir en %1 quan es va redefinir en %0" +- +-#: fortran/resolve.c:986 +-#, fuzzy, no-c-format +-msgid "'%s' at %L is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: fortran/resolve.c:1018 +-#, no-c-format +-msgid "Statement function '%s' at %L is not allowed as an actual argument" +-msgstr "" +- +-#: fortran/resolve.c:1026 +-#, no-c-format +-msgid "Intrinsic '%s' at %L is not allowed as an actual argument" +-msgstr "" +- +-#: fortran/resolve.c:1033 +-#, no-c-format +-msgid "Internal procedure '%s' is not allowed as an actual argument at %L" +-msgstr "" +- +-#: fortran/resolve.c:1039 +-#, no-c-format +-msgid "ELEMENTAL non-INTRINSIC procedure '%s' is not allowed as an actual argument at %L" +-msgstr "" +- +-#: fortran/resolve.c:1059 +-#, no-c-format +-msgid "GENERIC procedure '%s' is not allowed as an actual argument at %L" +-msgstr "" +- +-#: fortran/resolve.c:1098 +-#, fuzzy, no-c-format +-msgid "Symbol '%s' at %L is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: fortran/resolve.c:1143 +-#, no-c-format +-msgid "By-value argument at %L is not of numeric type" +-msgstr "" +- +-#: fortran/resolve.c:1150 +-#, no-c-format +-msgid "By-value argument at %L cannot be an array or an array section" +-msgstr "" +- +-#: fortran/resolve.c:1164 +-#, fuzzy, no-c-format +-msgid "By-value argument at %L is not allowed in this context" +-msgstr "La declaració en %0 no és vàlida en aquest context" +- +-#: fortran/resolve.c:1176 +-#, no-c-format +-msgid "Passing internal procedure at %L by location not allowed" +-msgstr "" +- +-#: fortran/resolve.c:1293 +-#, no-c-format +-msgid "'%s' at %L is an array and OPTIONAL; IF IT IS MISSING, it cannot be the actual argument of an ELEMENTAL procedure unless there is a non-optional argument with the same rank (12.4.1.5)" +-msgstr "" +- +-#: fortran/resolve.c:1315 +-msgid "elemental procedure" +-msgstr "" +- +-#: fortran/resolve.c:1332 +-#, no-c-format +-msgid "Actual argument at %L for INTENT(%s) dummy '%s' of ELEMENTAL subroutine '%s' is a scalar, but another actual argument is an array" +-msgstr "" +- +-#: fortran/resolve.c:1466 +-#, no-c-format +-msgid "There is no specific function for the generic '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:1475 +-#, no-c-format +-msgid "Generic function '%s' at %L is not consistent with a specific intrinsic interface" +-msgstr "" +- +-#: fortran/resolve.c:1513 +-#, no-c-format +-msgid "Function '%s' at %L is INTRINSIC but is not compatible with an intrinsic" +-msgstr "" +- +-#: fortran/resolve.c:1559 +-#, no-c-format +-msgid "Unable to resolve the specific function '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:1615 fortran/resolve.c:8740 +-#, no-c-format +-msgid "Function '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#: fortran/resolve.c:1799 +-#, fuzzy, no-c-format +-msgid "Argument to '%s' at %L is not a variable" +-msgstr "l'argument de l'atribut \"%s\" no es una cadena constant" +- +-#: fortran/resolve.c:1871 +-#, no-c-format +-msgid "More actual than formal arguments in '%s' call at %L" +-msgstr "" +- +-#: fortran/resolve.c:1883 +-#, no-c-format +-msgid "Parameter '%s' to '%s' at %L must be either a TARGET or an associated pointer" +-msgstr "" +- +-#: fortran/resolve.c:1909 +-#, no-c-format +-msgid "Allocatable variable '%s' used as a parameter to '%s' at %L must not be an array of zero size" +-msgstr "" +- +-#: fortran/resolve.c:1926 +-#, no-c-format +-msgid "Assumed-shape array '%s' at %L cannot be an argument to the procedure '%s' because it is not C interoperable" +-msgstr "" +- +-#: fortran/resolve.c:1936 +-#, no-c-format +-msgid "Deferred-shape array '%s' at %L cannot be an argument to the procedure '%s' because it is not C interoperable" +-msgstr "" +- +-#: fortran/resolve.c:1959 fortran/resolve.c:1998 +-#, no-c-format +-msgid "CHARACTER argument '%s' to '%s' at %L must have a length of 1" +-msgstr "" +- +-#. Case 1c, section 15.1.2.5, J3/04-007: an associated +-#. scalar pointer. +-#: fortran/resolve.c:1974 +-#, no-c-format +-msgid "Argument '%s' to '%s' at %L must be an associated scalar POINTER" +-msgstr "" +- +-#: fortran/resolve.c:1990 +-#, no-c-format +-msgid "Parameter '%s' to '%s' at %L must be a scalar" +-msgstr "" +- +-#. TODO: Update this error message to allow for procedure +-#. pointers once they are implemented. +-#: fortran/resolve.c:2012 +-#, no-c-format +-msgid "Parameter '%s' to '%s' at %L must be a procedure" +-msgstr "" +- +-#: fortran/resolve.c:2020 +-#, no-c-format +-msgid "Parameter '%s' to '%s' at %L must be BIND(C)" +-msgstr "" +- +-#: fortran/resolve.c:2062 +-#, fuzzy, no-c-format +-msgid "'%s' at %L is not a function" +-msgstr "\"%D\" no és una funció," +- +-#: fortran/resolve.c:2068 +-#, no-c-format +-msgid "ABSTRACT INTERFACE '%s' must not be referenced at %L" +-msgstr "" +- +-#. Internal procedures are taken care of in resolve_contained_fntype. +-#: fortran/resolve.c:2111 +-#, no-c-format +-msgid "Function '%s' is declared CHARACTER(*) and cannot be used at %L since it is not a dummy argument" +-msgstr "" +- +-#: fortran/resolve.c:2164 +-#, no-c-format +-msgid "User defined non-ELEMENTAL function '%s' at %L not allowed in WORKSHARE construct" +-msgstr "" +- +-#: fortran/resolve.c:2213 +-#, no-c-format +-msgid "reference to non-PURE function '%s' at %L inside a FORALL %s" +-msgstr "" +- +-#: fortran/resolve.c:2220 +-#, no-c-format +-msgid "Function reference to '%s' at %L is to a non-PURE procedure within a PURE procedure" +-msgstr "" +- +-#: fortran/resolve.c:2235 +-#, no-c-format +-msgid "Function '%s' at %L cannot call itself, as it is not RECURSIVE" +-msgstr "" +- +-#: fortran/resolve.c:2243 +-#, no-c-format +-msgid "Call to ENTRY '%s' at %L is recursive, but function '%s' is not declared as RECURSIVE" +-msgstr "" +- +-#: fortran/resolve.c:2285 +-#, no-c-format +-msgid "Subroutine call to '%s' in FORALL block at %L is not PURE" +-msgstr "" +- +-#: fortran/resolve.c:2288 +-#, no-c-format +-msgid "Subroutine call to '%s' at %L is not PURE" +-msgstr "" +- +-#: fortran/resolve.c:2351 +-#, no-c-format +-msgid "There is no specific subroutine for the generic '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:2360 +-#, no-c-format +-msgid "Generic subroutine '%s' at %L is not consistent with an intrinsic subroutine interface" +-msgstr "" +- +-#: fortran/resolve.c:2468 +-#, no-c-format +-msgid "Missing SHAPE parameter for call to %s at %L" +-msgstr "" +- +-#: fortran/resolve.c:2476 +-#, no-c-format +-msgid "SHAPE parameter for call to %s at %L must be a rank 1 INTEGER array" +-msgstr "" +- +-#: fortran/resolve.c:2543 +-#, no-c-format +-msgid "Subroutine '%s' at %L is INTRINSIC but is not compatible with an intrinsic" +-msgstr "" +- +-#: fortran/resolve.c:2587 +-#, no-c-format +-msgid "Unable to resolve the specific subroutine '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:2644 +-#, no-c-format +-msgid "'%s' at %L has a type, which is not consistent with the CALL at %L" +-msgstr "" +- +-#: fortran/resolve.c:2663 +-#, no-c-format +-msgid "SUBROUTINE '%s' at %L cannot call itself, as it is not RECURSIVE" +-msgstr "" +- +-#: fortran/resolve.c:2671 +-#, no-c-format +-msgid "Call to ENTRY '%s' at %L is recursive, but subroutine '%s' is not declared as RECURSIVE" +-msgstr "" +- +-#: fortran/resolve.c:2741 +-#, no-c-format +-msgid "Shapes for operands at %L and %L are not conformable" +-msgstr "" +- +-#: fortran/resolve.c:2792 +-#, c-format +-msgid "Invalid context for NULL() pointer at %%L" +-msgstr "" +- +-#: fortran/resolve.c:2808 +-#, c-format +-msgid "Operand of unary numeric operator '%s' at %%L is %s" +-msgstr "" +- +-#: fortran/resolve.c:2824 +-#, c-format +-msgid "Operands of binary numeric operator '%s' at %%L are %s/%s" +-msgstr "" +- +-#: fortran/resolve.c:2838 +-#, c-format +-msgid "Operands of string concatenation operator at %%L are %s/%s" +-msgstr "" +- +-#: fortran/resolve.c:2857 +-#, c-format +-msgid "Operands of logical operator '%s' at %%L are %s/%s" +-msgstr "" +- +-#: fortran/resolve.c:2871 +-#, c-format +-msgid "Operand of .not. operator at %%L is %s" +-msgstr "" +- +-#: fortran/resolve.c:2885 +-#, fuzzy +-msgid "COMPLEX quantities cannot be compared at %L" +-msgstr "els qualificadors \"%V\" no es poden aplicar a \"%T\"" +- +-#: fortran/resolve.c:2913 +-#, c-format +-msgid "Logicals at %%L must be compared with %s instead of %s" +-msgstr "" +- +-#: fortran/resolve.c:2919 +-#, c-format +-msgid "Operands of comparison operator '%s' at %%L are %s/%s" +-msgstr "" +- +-#: fortran/resolve.c:2927 +-#, c-format +-msgid "Unknown operator '%s' at %%L" +-msgstr "" +- +-#: fortran/resolve.c:2929 +-#, c-format +-msgid "Operand of user operator '%s' at %%L is %s" +-msgstr "" +- +-#: fortran/resolve.c:2932 +-#, c-format +-msgid "Operands of user operator '%s' at %%L are %s/%s" +-msgstr "" +- +-#: fortran/resolve.c:3018 +-#, c-format +-msgid "Inconsistent ranks for operator at %%L and %%L" +-msgstr "" +- +-#: fortran/resolve.c:3212 +-#, no-c-format +-msgid "Array reference at %L is out of bounds (%ld < %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3220 +-#, no-c-format +-msgid "Array reference at %L is out of bounds (%ld > %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3239 +-#, no-c-format +-msgid "Illegal stride of zero at %L" +-msgstr "" +- +-#: fortran/resolve.c:3256 +-#, no-c-format +-msgid "Lower array reference at %L is out of bounds (%ld < %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3264 +-#, no-c-format +-msgid "Lower array reference at %L is out of bounds (%ld > %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3280 +-#, no-c-format +-msgid "Upper array reference at %L is out of bounds (%ld < %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3289 +-#, no-c-format +-msgid "Upper array reference at %L is out of bounds (%ld > %ld) in dimension %d" +-msgstr "" +- +-#: fortran/resolve.c:3328 +-#, no-c-format +-msgid "Rightmost upper bound of assumed size array section not specified at %L" +-msgstr "" +- +-#: fortran/resolve.c:3338 +-#, no-c-format +-msgid "Rank mismatch in array reference at %L (%d/%d)" +-msgstr "" +- +-#: fortran/resolve.c:3366 +-#, no-c-format +-msgid "Array index at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:3372 +-#, no-c-format +-msgid "Array index at %L must be of INTEGER type" +-msgstr "" +- +-#: fortran/resolve.c:3378 +-#, no-c-format +-msgid "Extension: REAL array index at %L" +-msgstr "" +- +-#: fortran/resolve.c:3408 +-#, no-c-format +-msgid "Argument dim at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:3414 +-#, no-c-format +-msgid "Argument dim at %L must be of INTEGER type" +-msgstr "" +- +-#: fortran/resolve.c:3534 +-#, no-c-format +-msgid "Array index at %L is an array of rank %d" +-msgstr "" +- +-#: fortran/resolve.c:3571 +-#, no-c-format +-msgid "Substring start index at %L must be of type INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:3578 +-#, no-c-format +-msgid "Substring start index at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:3587 +-#, no-c-format +-msgid "Substring start index at %L is less than one" +-msgstr "" +- +-#: fortran/resolve.c:3600 +-#, no-c-format +-msgid "Substring end index at %L must be of type INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:3607 +-#, fuzzy, no-c-format +-msgid "Substring end index at %L must be scalar" +-msgstr "El punt d'inici/fi de la subcadena en %0 està fora del rang definit" +- +-#: fortran/resolve.c:3617 +-#, no-c-format +-msgid "Substring end index at %L exceeds the string length" +-msgstr "" +- +-#: fortran/resolve.c:3755 +-#, no-c-format +-msgid "Component to the right of a part reference with nonzero rank must not have the POINTER attribute at %L" +-msgstr "" +- +-#: fortran/resolve.c:3762 +-#, no-c-format +-msgid "Component to the right of a part reference with nonzero rank must not have the ALLOCATABLE attribute at %L" +-msgstr "" +- +-#: fortran/resolve.c:3781 +-#, no-c-format +-msgid "Two or more part references with nonzero rank must not be specified at %L" +-msgstr "" +- +-#: fortran/resolve.c:3956 +-#, no-c-format +-msgid "Variable '%s', used in a specification expression, is referenced at %L before the ENTRY statement in which it is a parameter" +-msgstr "" +- +-#: fortran/resolve.c:3961 +-#, no-c-format +-msgid "Variable '%s' is used at %L before the ENTRY statement in which it is a parameter" +-msgstr "" +- +-#: fortran/resolve.c:4238 +-#, no-c-format +-msgid "%s at %L must be a scalar" +-msgstr "" +- +-#: fortran/resolve.c:4248 +-#, no-c-format +-msgid "Deleted feature: %s at %L must be integer" +-msgstr "" +- +-#: fortran/resolve.c:4252 fortran/resolve.c:4259 +-#, no-c-format +-msgid "%s at %L must be INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:4279 +-#, no-c-format +-msgid "Cannot assign to loop variable in PURE procedure at %L" +-msgstr "" +- +-#: fortran/resolve.c:4303 +-#, no-c-format +-msgid "Step expression in DO loop at %L cannot be zero" +-msgstr "" +- +-#: fortran/resolve.c:4378 +-#, no-c-format +-msgid "FORALL index-name at %L must be a scalar INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:4383 +-#, no-c-format +-msgid "FORALL start expression at %L must be a scalar INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:4390 +-#, no-c-format +-msgid "FORALL end expression at %L must be a scalar INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:4398 +-#, no-c-format +-msgid "FORALL stride expression at %L must be a scalar %s" +-msgstr "" +- +-#: fortran/resolve.c:4403 +-#, no-c-format +-msgid "FORALL stride expression at %L cannot be zero" +-msgstr "" +- +-#: fortran/resolve.c:4419 +-#, no-c-format +-msgid "FORALL index '%s' may not appear in triplet specification at %L" +-msgstr "" +- +-#: fortran/resolve.c:4499 +-#, no-c-format +-msgid "Expression in DEALLOCATE statement at %L must be ALLOCATABLE or a POINTER" +-msgstr "" +- +-#: fortran/resolve.c:4506 +-#, no-c-format +-msgid "Cannot deallocate INTENT(IN) variable '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:4675 +-#, no-c-format +-msgid "The STAT variable '%s' in an ALLOCATE statement must not be allocated in the same statement at %L" +-msgstr "" +- +-#: fortran/resolve.c:4711 +-#, no-c-format +-msgid "Expression in ALLOCATE statement at %L must be ALLOCATABLE or a POINTER" +-msgstr "" +- +-#: fortran/resolve.c:4719 +-#, no-c-format +-msgid "Cannot allocate INTENT(IN) variable '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:4743 +-#, fuzzy, no-c-format +-msgid "Array specification required in ALLOCATE statement at %L" +-msgstr "Falta l'especificador %A en la declaració en %0" +- +-#: fortran/resolve.c:4773 +-#, fuzzy, no-c-format +-msgid "Bad array specification in ALLOCATE statement at %L" +-msgstr "No hi ha definició d'etiqueta per a la declaració FORMAT en %0" +- +-#: fortran/resolve.c:4791 +-#, no-c-format +-msgid "'%s' must not appear an the array specification at %L in the same ALLOCATE statement where it is itself allocated" +-msgstr "" +- +-#. The cases overlap, or they are the same +-#. element in the list. Either way, we must +-#. issue an error and get the next case from P. +-#. FIXME: Sort P and Q by line number. +-#: fortran/resolve.c:4949 +-#, no-c-format +-msgid "CASE label at %L overlaps with CASE label at %L" +-msgstr "" +- +-#: fortran/resolve.c:5000 +-#, fuzzy, no-c-format +-msgid "Expression in CASE statement at %L must be of type %s" +-msgstr "la declaració de l'expressió té tipus de dada incompleta" +- +-#: fortran/resolve.c:5011 +-#, no-c-format +-msgid "Expression in CASE statement at %L must be kind %d" +-msgstr "" +- +-#: fortran/resolve.c:5023 +-#, no-c-format +-msgid "Expression in CASE statement at %L must be scalar" +-msgstr "" +- +-#: fortran/resolve.c:5069 +-#, no-c-format +-msgid "Selection expression in computed GOTO statement at %L must be a scalar integer expression" +-msgstr "" +- +-#: fortran/resolve.c:5087 +-#, no-c-format +-msgid "Argument of SELECT statement at %L cannot be %s" +-msgstr "" +- +-#: fortran/resolve.c:5096 +-#, no-c-format +-msgid "Argument of SELECT statement at %L must be a scalar expression" +-msgstr "" +- +-#: fortran/resolve.c:5161 +-#, no-c-format +-msgid "The DEFAULT CASE at %L cannot be followed by a second DEFAULT CASE at %L" +-msgstr "" +- +-#: fortran/resolve.c:5187 +-#, no-c-format +-msgid "Logical range in CASE statement at %L is not allowed" +-msgstr "" +- +-#: fortran/resolve.c:5199 +-#, no-c-format +-msgid "constant logical value in CASE statement is repeated at %L" +-msgstr "" +- +-#: fortran/resolve.c:5213 +-#, no-c-format +-msgid "Range specification at %L can never be matched" +-msgstr "" +- +-#: fortran/resolve.c:5316 +-#, no-c-format +-msgid "Logical SELECT CASE block at %L has more that two cases" +-msgstr "" +- +-#: fortran/resolve.c:5354 +-#, no-c-format +-msgid "Data transfer element at %L cannot have POINTER components" +-msgstr "" +- +-#: fortran/resolve.c:5361 +-#, no-c-format +-msgid "Data transfer element at %L cannot have ALLOCATABLE components" +-msgstr "" +- +-#: fortran/resolve.c:5368 +-#, no-c-format +-msgid "Data transfer element at %L cannot have PRIVATE components" +-msgstr "" +- +-#: fortran/resolve.c:5377 +-#, no-c-format +-msgid "Data transfer element at %L cannot be a full reference to an assumed-size array" +-msgstr "" +- +-#: fortran/resolve.c:5441 +-#, fuzzy, no-c-format +-msgid "Statement at %L is not a valid branch target statement for the branch statement at %L" +-msgstr "La declaració en %0 no és vàlida en el context establert per la declaració en %1" +- +-#: fortran/resolve.c:5450 +-#, no-c-format +-msgid "Branch at %L causes an infinite loop" +-msgstr "" +- +-#. The label is not in an enclosing block, so illegal. This was +-#. allowed in Fortran 66, so we allow it as extension. No +-#. further checks are necessary in this case. +-#: fortran/resolve.c:5463 +-#, fuzzy, no-c-format +-msgid "Label at %L is not in the same block as the GOTO statement at %L" +-msgstr "La declaració en %0 no és vàlida en el context establert per la declaració en %1" +- +-#: fortran/resolve.c:5478 fortran/resolve.c:5492 +-#, no-c-format +-msgid "Deleted feature: GOTO at %L jumps to END of construct at %L" +-msgstr "" +- +-#: fortran/resolve.c:5569 +-#, no-c-format +-msgid "WHERE mask at %L has inconsistent shape" +-msgstr "" +- +-#: fortran/resolve.c:5585 +-#, no-c-format +-msgid "WHERE assignment target at %L has inconsistent shape" +-msgstr "" +- +-#: fortran/resolve.c:5600 fortran/resolve.c:5682 +-#, no-c-format +-msgid "Unsupported statement inside WHERE at %L" +-msgstr "" +- +-#: fortran/resolve.c:5631 +-#, no-c-format +-msgid "Assignment to a FORALL index variable at %L" +-msgstr "" +- +-#: fortran/resolve.c:5639 +-#, no-c-format +-msgid "The FORALL with index '%s' cause more than one assignment to this object at %L" +-msgstr "" +- +-#: fortran/resolve.c:5774 +-#, no-c-format +-msgid "An outer FORALL construct already has an index with this name %L" +-msgstr "" +- +-#: fortran/resolve.c:5830 +-#, no-c-format +-msgid "WHERE/ELSEWHERE clause at %L requires a LOGICAL array" +-msgstr "" +- +-#: fortran/resolve.c:5890 +-#, no-c-format +-msgid "Subroutine '%s' called instead of assignment at %L must be PURE" +-msgstr "" +- +-#: fortran/resolve.c:5927 +-#, no-c-format +-msgid "CHARACTER expression will be truncated in assignment (%d/%d) at %L" +-msgstr "" +- +-#: fortran/resolve.c:5950 +-#, no-c-format +-msgid "Cannot assign to variable '%s' in PURE procedure at %L" +-msgstr "" +- +-#: fortran/resolve.c:5962 +-#, no-c-format +-msgid "The impure variable at %L is assigned to a derived type variable with a POINTER component in a PURE procedure (12.6)" +-msgstr "" +- +-#: fortran/resolve.c:6066 +-#, no-c-format +-msgid "ASSIGNED GOTO statement at %L requires an INTEGER variable" +-msgstr "" +- +-#: fortran/resolve.c:6069 +-#, no-c-format +-msgid "Variable '%s' has not been assigned a target label at %L" +-msgstr "" +- +-#: fortran/resolve.c:6080 +-#, no-c-format +-msgid "Alternate RETURN statement at %L requires a SCALAR-INTEGER return specifier" +-msgstr "" +- +-#: fortran/resolve.c:6106 +-#, no-c-format +-msgid "ASSIGN statement at %L requires a scalar default INTEGER variable" +-msgstr "" +- +-#: fortran/resolve.c:6121 +-#, no-c-format +-msgid "Arithmetic IF statement at %L requires a numeric expression" +-msgstr "" +- +-#: fortran/resolve.c:6163 +-#, no-c-format +-msgid "Exit condition of DO WHILE loop at %L must be a scalar LOGICAL expression" +-msgstr "" +- +-#: fortran/resolve.c:6170 +-#, no-c-format +-msgid "STAT tag in ALLOCATE statement at %L must be of type INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:6182 +-#, no-c-format +-msgid "STAT tag in DEALLOCATE statement at %L must be of type INTEGER" +-msgstr "" +- +-#: fortran/resolve.c:6247 +-#, no-c-format +-msgid "FORALL mask clause at %L requires a LOGICAL expression" +-msgstr "" +- +-#: fortran/resolve.c:6317 fortran/resolve.c:6373 +-#, no-c-format +-msgid "Binding label '%s' for common block '%s' at %L collides with the global entity '%s' at %L" +-msgstr "" +- +-#. Common block names match but binding labels do not. +-#: fortran/resolve.c:6338 +-#, no-c-format +-msgid "Binding label '%s' for common block '%s' at %L does not match the binding label '%s' for common block '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:6385 +-#, no-c-format +-msgid "Binding label '%s' for common block '%s' at %L collides with global entity '%s' at %L" +-msgstr "" +- +-#. Make sure global procedures don't collide with anything. +-#: fortran/resolve.c:6437 +-#, no-c-format +-msgid "Binding label '%s' at %L collides with the global entity '%s' at %L" +-msgstr "" +- +-#. Make sure procedures in interface bodies don't collide. +-#: fortran/resolve.c:6450 +-#, no-c-format +-msgid "Binding label '%s' in interface body at %L collides with the global entity '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:6463 +-#, no-c-format +-msgid "Binding label '%s' at %L collides with global entity '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:6540 +-#, no-c-format +-msgid "CHARACTER variable has zero length at %L" +-msgstr "" +- +-#: fortran/resolve.c:6828 +-#, no-c-format +-msgid "Allocatable array '%s' at %L must have a deferred shape" +-msgstr "" +- +-#: fortran/resolve.c:6831 +-#, no-c-format +-msgid "Scalar object '%s' at %L may not be ALLOCATABLE" +-msgstr "" +- +-#: fortran/resolve.c:6838 +-#, no-c-format +-msgid "Array pointer '%s' at %L must have a deferred shape" +-msgstr "" +- +-#: fortran/resolve.c:6849 +-#, no-c-format +-msgid "Array '%s' at %L cannot have a deferred shape" +-msgstr "" +- +-#: fortran/resolve.c:6878 +-#, no-c-format +-msgid "The type '%s' cannot be host associated at %L because it is blocked by an incompatible object of the same name declared at %L" +-msgstr "" +- +-#: fortran/resolve.c:6901 +-#, no-c-format +-msgid "Object '%s' at %L must have the SAVE attribute for default initialization of a component" +-msgstr "" +- +-#. The shape of a main program or module array needs to be +-#. constant. +-#: fortran/resolve.c:6948 +-#, no-c-format +-msgid "The module or main program array '%s' at %L must have constant shape" +-msgstr "" +- +-#: fortran/resolve.c:6961 +-#, no-c-format +-msgid "Entity with assumed character length at %L must be a dummy argument or a PARAMETER" +-msgstr "" +- +-#: fortran/resolve.c:6980 +-#, no-c-format +-msgid "'%s' at %L must have constant character length in this context" +-msgstr "" +- +-#: fortran/resolve.c:7012 +-#, fuzzy, no-c-format +-msgid "Allocatable '%s' at %L cannot have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7015 +-#, fuzzy, no-c-format +-msgid "External '%s' at %L cannot have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7019 +-#, fuzzy, no-c-format +-msgid "Dummy '%s' at %L cannot have an initializer" +-msgstr "\"%s\" té \"extern\" i assignador de valor inicial al mateix temps" +- +-#: fortran/resolve.c:7022 +-#, fuzzy, no-c-format +-msgid "Intrinsic '%s' at %L cannot have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7025 +-#, fuzzy, no-c-format +-msgid "Function result '%s' at %L cannot have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7028 +-#, no-c-format +-msgid "Automatic array '%s' at %L cannot have an initializer" +-msgstr "" +- +-#: fortran/resolve.c:7051 +-#, no-c-format +-msgid "Although not referenced, '%s' at %L has ambiguous interfaces" +-msgstr "" +- +-#: fortran/resolve.c:7070 +-#, no-c-format +-msgid "Character-valued statement function '%s' at %L must have constant length" +-msgstr "" +- +-#: fortran/resolve.c:7078 +-#, no-c-format +-msgid "Automatic character length function '%s' at %L must have an explicit interface" +-msgstr "" +- +-#: fortran/resolve.c:7103 +-#, no-c-format +-msgid "Fortran 2003: '%s' is of a PRIVATE type and cannot be a dummy argument of '%s', which is PUBLIC at %L" +-msgstr "" +- +-#: fortran/resolve.c:7126 fortran/resolve.c:7151 +-#, no-c-format +-msgid "Fortran 2003: Procedure '%s' in PUBLIC interface '%s' at %L takes dummy arguments of '%s' which is PRIVATE" +-msgstr "" +- +-#: fortran/resolve.c:7168 +-#, fuzzy, no-c-format +-msgid "Function '%s' at %L cannot have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7177 +-#, fuzzy, no-c-format +-msgid "External object '%s' at %L may not have an initializer" +-msgstr "no existeix el camp \"%D\" en el union que s'està inicialitzant" +- +-#: fortran/resolve.c:7185 +-#, no-c-format +-msgid "ELEMENTAL function '%s' at %L must have a scalar result" +-msgstr "" +- +-#: fortran/resolve.c:7206 +-#, no-c-format +-msgid "CHARACTER(*) function '%s' at %L cannot be array-valued" +-msgstr "" +- +-#: fortran/resolve.c:7210 +-#, no-c-format +-msgid "CHARACTER(*) function '%s' at %L cannot be pointer-valued" +-msgstr "" +- +-#: fortran/resolve.c:7214 +-#, no-c-format +-msgid "CHARACTER(*) function '%s' at %L cannot be pure" +-msgstr "" +- +-#: fortran/resolve.c:7218 +-#, no-c-format +-msgid "CHARACTER(*) function '%s' at %L cannot be recursive" +-msgstr "" +- +-#: fortran/resolve.c:7227 +-#, no-c-format +-msgid "CHARACTER(*) function '%s' at %L is obsolescent in fortran 95" +-msgstr "" +- +-#: fortran/resolve.c:7299 +-#, no-c-format +-msgid "Character length of component '%s' needs to be a constant specification expression at %L" +-msgstr "" +- +-#: fortran/resolve.c:7314 +-#, no-c-format +-msgid "The component '%s' is a PRIVATE type and cannot be a component of '%s', which is PUBLIC at %L" +-msgstr "" +- +-#: fortran/resolve.c:7324 +-#, no-c-format +-msgid "Component %s of SEQUENCE type declared at %L does not have the SEQUENCE attribute" +-msgstr "" +- +-#: fortran/resolve.c:7334 +-#, no-c-format +-msgid "The pointer component '%s' of '%s' at %L is a type that has not been declared" +-msgstr "" +- +-#: fortran/resolve.c:7352 +-#, no-c-format +-msgid "Component '%s' of '%s' at %L must have constant array bounds" +-msgstr "" +- +-#: fortran/resolve.c:7395 +-#, no-c-format +-msgid "NAMELIST object '%s' was declared PRIVATE and cannot be member of PUBLIC namelist '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7405 +-#, no-c-format +-msgid "NAMELIST object '%s' has use-associated PRIVATE components and cannot be member of namelist '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7418 +-#, no-c-format +-msgid "NAMELIST object '%s' has PRIVATE components and cannot be a member of PUBLIC namelist '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7430 +-#, no-c-format +-msgid "NAMELIST array object '%s' must not have assumed shape in namelist '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7439 +-#, no-c-format +-msgid "NAMELIST array object '%s' must have constant shape in namelist '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7451 +-#, no-c-format +-msgid "NAMELIST object '%s' in namelist '%s' at %L cannot have ALLOCATABLE components" +-msgstr "" +- +-#: fortran/resolve.c:7459 +-#, no-c-format +-msgid "NAMELIST object '%s' in namelist '%s' at %L cannot have POINTER components" +-msgstr "" +- +-#: fortran/resolve.c:7485 +-#, no-c-format +-msgid "PROCEDURE attribute conflicts with NAMELIST attribute in '%s' at %L" +-msgstr "" +- +-#: fortran/resolve.c:7504 +-#, no-c-format +-msgid "Parameter array '%s' at %L cannot be automatic or of deferred shape" +-msgstr "" +- +-#: fortran/resolve.c:7515 +-#, no-c-format +-msgid "Implicitly typed PARAMETER '%s' at %L doesn't match a later IMPLICIT type" +-msgstr "" +- +-#: fortran/resolve.c:7526 +-#, fuzzy, no-c-format +-msgid "Incompatible derived type in PARAMETER at %L" +-msgstr "tipus incompatibles en %s" +- +-#: fortran/resolve.c:7597 +-#, no-c-format +-msgid "Interface '%s' of procedure '%s' at %L must be explicit" +-msgstr "" +- +-#: fortran/resolve.c:7622 +-#, no-c-format +-msgid "Type specified for intrinsic function '%s' at %L is ignored" +-msgstr "" +- +-#: fortran/resolve.c:7629 +-#, no-c-format +-msgid "Intrinsic subroutine '%s' at %L shall not have a type specifier" +-msgstr "" +- +-#: fortran/resolve.c:7636 +-#, no-c-format +-msgid "Intrinsic '%s' at %L does not exist" +-msgstr "" +- +-#: fortran/resolve.c:7676 +-#, no-c-format +-msgid "Assumed size array at %L must be a dummy argument" +-msgstr "" +- +-#: fortran/resolve.c:7679 +-#, no-c-format +-msgid "Assumed shape array at %L must be a dummy argument" +-msgstr "" +- +-#: fortran/resolve.c:7691 +-#, no-c-format +-msgid "Symbol at %L is not a DUMMY variable" +-msgstr "" +- +-#: fortran/resolve.c:7697 +-#, no-c-format +-msgid "'%s' at %L cannot have the VALUE attribute because it is not a dummy argument" +-msgstr "" +- +-#: fortran/resolve.c:7707 +-#, no-c-format +-msgid "Character dummy variable '%s' at %L with VALUE attribute must have constant length" +-msgstr "" +- +-#: fortran/resolve.c:7716 +-#, no-c-format +-msgid "C interoperable character dummy variable '%s' at %L with VALUE attribute must have length one" +-msgstr "" +- +-#: fortran/resolve.c:7742 +-#, no-c-format +-msgid "Variable '%s' at %L cannot be BIND(C) because it is neither a COMMON block nor declared at the module level scope" +-msgstr "" +- +-#: fortran/resolve.c:7795 +-#, no-c-format +-msgid "The derived type '%s' at %L is of type '%s', which has not been defined" +-msgstr "" +- +-#: fortran/resolve.c:7811 +-#, no-c-format +-msgid "Fortran 2003: PUBLIC %s '%s' at %L of PRIVATE derived type '%s'" +-msgstr "" +- +-#: fortran/resolve.c:7830 +-#, no-c-format +-msgid "The INTENT(OUT) dummy argument '%s' at %L is ASSUMED SIZE and so cannot have a default initializer" +-msgstr "" +- +-#: fortran/resolve.c:7889 +-#, no-c-format +-msgid "Threadprivate at %L isn't SAVEd" +-msgstr "" +- +-#: fortran/resolve.c:7967 +-#, no-c-format +-msgid "BLOCK DATA element '%s' at %L must be in COMMON" +-msgstr "" +- +-#: fortran/resolve.c:8011 +-#, no-c-format +-msgid "Nonconstant array section at %L in DATA statement" +-msgstr "" +- +-#: fortran/resolve.c:8024 +-#, no-c-format +-msgid "DATA statement at %L has more variables than values" +-msgstr "" +- +-#: fortran/resolve.c:8118 +-#, no-c-format +-msgid "iterator start at %L does not simplify" +-msgstr "" +- +-#: fortran/resolve.c:8125 +-#, no-c-format +-msgid "iterator end at %L does not simplify" +-msgstr "" +- +-#: fortran/resolve.c:8132 +-#, no-c-format +-msgid "iterator step at %L does not simplify" +-msgstr "" +- +-#: fortran/resolve.c:8258 +-#, no-c-format +-msgid "DATA statement at %L has more values than variables" +-msgstr "" +- +-#: fortran/resolve.c:8349 +-#, fuzzy, no-c-format +-msgid "Label %d at %L defined but not used" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/resolve.c:8354 +-#, fuzzy, no-c-format +-msgid "Label %d at %L defined but cannot be used" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: fortran/resolve.c:8439 +-#, no-c-format +-msgid "Derived type variable '%s' at %L must have SEQUENCE attribute to be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8448 +-#, no-c-format +-msgid "Derived type variable '%s' at %L cannot have ALLOCATABLE components to be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8465 +-#, no-c-format +-msgid "Derived type variable '%s' at %L with pointer component(s) cannot be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8570 +-#, no-c-format +-msgid "Syntax error in EQUIVALENCE statement at %L" +-msgstr "" +- +-#: fortran/resolve.c:8585 +-#, no-c-format +-msgid "Either all or none of the objects in the EQUIVALENCE set at %L shall have the PROTECTED attribute" +-msgstr "" +- +-#: fortran/resolve.c:8597 +-#, no-c-format +-msgid "Common block member '%s' at %L cannot be an EQUIVALENCE object in the pure procedure '%s'" +-msgstr "" +- +-#: fortran/resolve.c:8606 +-#, no-c-format +-msgid "Named constant '%s' at %L cannot be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8685 +-#, no-c-format +-msgid "Array '%s' at %L with non-constant bounds cannot be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8696 +-#, no-c-format +-msgid "Structure component '%s' at %L cannot be an EQUIVALENCE object" +-msgstr "" +- +-#: fortran/resolve.c:8707 +-#, no-c-format +-msgid "Substring at %L has length zero" +-msgstr "" +- +-#: fortran/resolve.c:8750 +-#, no-c-format +-msgid "PUBLIC function '%s' at %L cannot be of PRIVATE type '%s'" +-msgstr "" +- +-#: fortran/resolve.c:8762 +-#, no-c-format +-msgid "ENTRY '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#: fortran/resolve.c:8788 +-#, no-c-format +-msgid "User operator procedure '%s' at %L must be a FUNCTION" +-msgstr "" +- +-#: fortran/resolve.c:8795 +-#, no-c-format +-msgid "User operator procedure '%s' at %L cannot be assumed character length" +-msgstr "" +- +-#: fortran/resolve.c:8801 +-#, no-c-format +-msgid "User operator procedure '%s' at %L must have at least one argument" +-msgstr "" +- +-#: fortran/resolve.c:8811 +-#, no-c-format +-msgid "First argument of operator interface at %L cannot be optional" +-msgstr "" +- +-#: fortran/resolve.c:8823 +-#, no-c-format +-msgid "Second argument of operator interface at %L cannot be optional" +-msgstr "" +- +-#: fortran/resolve.c:8827 +-#, no-c-format +-msgid "Operator interface at %L must have, at most, two arguments" +-msgstr "" +- +-#: fortran/resolve.c:8867 +-#, no-c-format +-msgid "Contained procedure '%s' at %L of a PURE procedure must also be PURE" +-msgstr "" +- +-#: fortran/scanner.c:526 +-#, no-c-format +-msgid "!$OMP at %C starts a commented line as it neither is followed by a space nor is a continuation line" +-msgstr "" +- +-#: fortran/scanner.c:816 fortran/scanner.c:937 +-#, no-c-format +-msgid "Limit of %d continuations exceeded in statement at %C" +-msgstr "" +- +-#: fortran/scanner.c:861 +-#, fuzzy, no-c-format +-msgid "Missing '&' in continued character constant at %C" +-msgstr "Constant de caràcter de longitud zero en %0" +- +-#: fortran/scanner.c:1071 +-#, no-c-format +-msgid "Nonconforming tab character at %C" +-msgstr "" +- +-#: fortran/scanner.c:1153 fortran/scanner.c:1156 +-#, no-c-format +-msgid "'&' not allowed by itself in line %d" +-msgstr "" +- +-#: fortran/scanner.c:1189 +-#, no-c-format +-msgid "Nonconforming tab character in column 1 of line %d" +-msgstr "" +- +-#: fortran/scanner.c:1387 +-#, no-c-format +-msgid "%s:%d: file %s left but not entered" +-msgstr "" +- +-#: fortran/scanner.c:1419 +-#, fuzzy, no-c-format +-msgid "%s:%d: Illegal preprocessor directive" +-msgstr "%s en directiva de preprocessament" +- +-#: fortran/scanner.c:1514 +-#, no-c-format +-msgid "File '%s' is being included recursively" +-msgstr "" +- +-#: fortran/scanner.c:1529 +-#, fuzzy, no-c-format +-msgid "Can't open file '%s'" +-msgstr "no es pot obrir el fitxer \"%s\"" +- +-#: fortran/scanner.c:1538 +-#, fuzzy, no-c-format +-msgid "Can't open included file '%s'" +-msgstr "no es pot tancar el fitxer temporal" +- +-#: fortran/scanner.c:1676 +-#, fuzzy, c-format +-msgid "%s:%3d %s\n" +-msgstr "%s: %s" +- +-#: fortran/simplify.c:82 +-#, no-c-format +-msgid "Result of %s overflows its kind at %L" +-msgstr "" +- +-#: fortran/simplify.c:87 +-#, no-c-format +-msgid "Result of %s underflows its kind at %L" +-msgstr "" +- +-#: fortran/simplify.c:92 +-#, no-c-format +-msgid "Result of %s is NaN at %L" +-msgstr "" +- +-#: fortran/simplify.c:96 +-#, no-c-format +-msgid "Result of %s gives range error for its kind at %L" +-msgstr "" +- +-#: fortran/simplify.c:119 +-#, no-c-format +-msgid "KIND parameter of %s at %L must be an initialization expression" +-msgstr "" +- +-#: fortran/simplify.c:127 +-#, fuzzy, no-c-format +-msgid "Invalid KIND parameter of %s at %L" +-msgstr "el paràmetre \"%s\" no és vàlid" +- +-#: fortran/simplify.c:282 +-#, no-c-format +-msgid "Argument of ACHAR function at %L outside of range [0,127]" +-msgstr "" +- +-#: fortran/simplify.c:307 +-#, no-c-format +-msgid "Argument of ACOS at %L must be between -1 and 1" +-msgstr "" +- +-#: fortran/simplify.c:329 +-#, no-c-format +-msgid "Argument of ACOSH at %L must not be less than 1" +-msgstr "" +- +-#: fortran/simplify.c:546 +-#, no-c-format +-msgid "Argument of ASIN at %L must be between -1 and 1" +-msgstr "" +- +-#: fortran/simplify.c:602 +-#, no-c-format +-msgid "Argument of ATANH at %L must be inside the range -1 to 1" +-msgstr "" +- +-#: fortran/simplify.c:627 +-#, no-c-format +-msgid "If first argument of ATAN2 %L is zero, then the second argument must not be zero" +-msgstr "" +- +-#: fortran/simplify.c:714 +-#, no-c-format +-msgid "Argument of CHAR function at %L outside of range [0,255]" +-msgstr "" +- +-#: fortran/simplify.c:1247 +-#, no-c-format +-msgid "Argument of IACHAR at %L must be of length one" +-msgstr "" +- +-#: fortran/simplify.c:1254 +-#, no-c-format +-msgid "Argument of IACHAR function at %L outside of range 0..127" +-msgstr "" +- +-#: fortran/simplify.c:1293 +-#, fuzzy, no-c-format +-msgid "Invalid second argument of IBCLR at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1301 +-#, no-c-format +-msgid "Second argument of IBCLR exceeds bit size at %L" +-msgstr "" +- +-#: fortran/simplify.c:1335 +-#, fuzzy, no-c-format +-msgid "Invalid second argument of IBITS at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1341 +-#, fuzzy, no-c-format +-msgid "Invalid third argument of IBITS at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1351 +-#, no-c-format +-msgid "Sum of second and third arguments of IBITS exceeds bit size at %L" +-msgstr "" +- +-#: fortran/simplify.c:1393 +-#, fuzzy, no-c-format +-msgid "Invalid second argument of IBSET at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1401 +-#, no-c-format +-msgid "Second argument of IBSET exceeds bit size at %L" +-msgstr "" +- +-#: fortran/simplify.c:1431 +-#, no-c-format +-msgid "Argument of ICHAR at %L must be of length one" +-msgstr "" +- +-#: fortran/simplify.c:1646 +-#, fuzzy, no-c-format +-msgid "Argument of INT at %L is not a valid type" +-msgstr "l'argument de \"asm\" no és una cadena constant" +- +-#: fortran/simplify.c:1688 +-#, fuzzy, no-c-format +-msgid "Argument of %s at %L is not a valid type" +-msgstr "l'argument de l'atribut \"%s\" no es una cadena constant" +- +-#: fortran/simplify.c:1786 +-#, fuzzy, no-c-format +-msgid "Invalid second argument of ISHFT at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1801 +-#, no-c-format +-msgid "Magnitude of second argument of ISHFT exceeds bit size at %L" +-msgstr "" +- +-#: fortran/simplify.c:1865 +-#, fuzzy, no-c-format +-msgid "Invalid second argument of ISHFTC at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1879 +-#, fuzzy, no-c-format +-msgid "Invalid third argument of ISHFTC at %L" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: fortran/simplify.c:1885 +-#, no-c-format +-msgid "Magnitude of third argument of ISHFTC exceeds BIT_SIZE of first argument at %L" +-msgstr "" +- +-#: fortran/simplify.c:1901 +-#, no-c-format +-msgid "Magnitude of second argument of ISHFTC exceeds third argument at %L" +-msgstr "" +- +-#: fortran/simplify.c:1904 +-#, no-c-format +-msgid "Magnitude of second argument of ISHFTC exceeds BIT_SIZE of first argument at %L" +-msgstr "" +- +-#: fortran/simplify.c:1975 +-#, no-c-format +-msgid "Argument of KIND at %L is a DERIVED type" +-msgstr "" +- +-#: fortran/simplify.c:2163 +-#, fuzzy, no-c-format +-msgid "DIM argument at %L is out of bounds" +-msgstr "l'argument \"%d\" no és una constant" +- +-#: fortran/simplify.c:2318 +-#, no-c-format +-msgid "Argument of LOG at %L cannot be less than or equal to zero" +-msgstr "" +- +-#: fortran/simplify.c:2331 +-#, no-c-format +-msgid "Complex argument of LOG at %L cannot be zero" +-msgstr "" +- +-#: fortran/simplify.c:2374 +-#, no-c-format +-msgid "Argument of LOG10 at %L cannot be less than or equal to zero" +-msgstr "" +- +-#. Result is processor-dependent. +-#: fortran/simplify.c:2579 +-#, no-c-format +-msgid "Second argument MOD at %L is zero" +-msgstr "" +- +-#. Result is processor-dependent. +-#: fortran/simplify.c:2590 +-#, no-c-format +-msgid "Second argument of MOD at %L is zero" +-msgstr "" +- +-#. Result is processor-dependent. This processor just opts +-#. to not handle it at all. +-#. Result is processor-dependent. +-#: fortran/simplify.c:2638 fortran/simplify.c:2650 +-#, no-c-format +-msgid "Second argument of MODULO at %L is zero" +-msgstr "" +- +-#: fortran/simplify.c:2702 +-#, no-c-format +-msgid "Second argument of NEAREST at %L shall not be zero" +-msgstr "" +- +-#: fortran/simplify.c:2977 +-#, no-c-format +-msgid "Argument NCOPIES of REPEAT intrinsic is negative at %L" +-msgstr "" +- +-#: fortran/simplify.c:3032 +-#, no-c-format +-msgid "Argument NCOPIES of REPEAT intrinsic is too large at %L" +-msgstr "" +- +-#: fortran/simplify.c:3122 +-#, fuzzy, no-c-format +-msgid "Integer too large in shape specification at %L" +-msgstr "després de l'especificació prèvia en \"%#D\"" +- +-#: fortran/simplify.c:3132 +-#, no-c-format +-msgid "Too many dimensions in shape specification for RESHAPE at %L" +-msgstr "" +- +-#: fortran/simplify.c:3140 +-#, no-c-format +-msgid "Shape specification at %L cannot be negative" +-msgstr "" +- +-#: fortran/simplify.c:3150 +-#, no-c-format +-msgid "Shape specification at %L cannot be the null array" +-msgstr "" +- +-#: fortran/simplify.c:3171 +-#, no-c-format +-msgid "ORDER parameter of RESHAPE at %L is not the same size as SHAPE parameter" +-msgstr "" +- +-#: fortran/simplify.c:3178 +-#, no-c-format +-msgid "Error in ORDER parameter of RESHAPE at %L" +-msgstr "" +- +-#: fortran/simplify.c:3188 +-#, no-c-format +-msgid "ORDER parameter of RESHAPE at %L is out of range" +-msgstr "" +- +-#: fortran/simplify.c:3197 +-#, no-c-format +-msgid "Invalid permutation in ORDER parameter at %L" +-msgstr "" +- +-#: fortran/simplify.c:3253 +-#, no-c-format +-msgid "PAD parameter required for short SOURCE parameter at %L" +-msgstr "" +- +-#: fortran/simplify.c:3372 +-#, no-c-format +-msgid "Result of SCALE overflows its kind at %L" +-msgstr "" +- +-#: fortran/simplify.c:3942 +-#, fuzzy, no-c-format +-msgid "Argument of SQRT at %L has a negative value" +-msgstr "la crida a la funció té valor agregat" +- +-#: fortran/simplify.c:4069 +-#, no-c-format +-msgid "Intrinsic TRANSFER at %L has partly undefined result: source size %ld < result size %ld" +-msgstr "" +- +-#: fortran/symbol.c:120 +-#, no-c-format +-msgid "Duplicate IMPLICIT NONE statement at %C" +-msgstr "" +- +-#: fortran/symbol.c:160 +-#, no-c-format +-msgid "Letter '%c' already set in IMPLICIT statement at %C" +-msgstr "" +- +-#: fortran/symbol.c:182 +-#, no-c-format +-msgid "Cannot specify IMPLICIT at %C after IMPLICIT NONE" +-msgstr "" +- +-#: fortran/symbol.c:193 +-#, no-c-format +-msgid "Letter %c already has an IMPLICIT type at %C" +-msgstr "" +- +-#: fortran/symbol.c:247 +-#, no-c-format +-msgid "Symbol '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#. BIND(C) variables should not be implicitly declared. +-#: fortran/symbol.c:261 +-#, no-c-format +-msgid "Implicitly declared BIND(C) variable '%s' at %L may not be C interoperable" +-msgstr "" +- +-#. Dummy args to a BIND(C) routine may not be interoperable if +-#. they are implicitly typed. +-#: fortran/symbol.c:275 +-#, no-c-format +-msgid "Implicity declared variable '%s' at %L may not be C interoperable but it is a dummy argument to the BIND(C) procedure '%s' at %L" +-msgstr "" +- +-#: fortran/symbol.c:316 +-#, no-c-format +-msgid "Function result '%s' at %L has no IMPLICIT type" +-msgstr "" +- +-#: fortran/symbol.c:395 +-#, no-c-format +-msgid "%s attribute not allowed in BLOCK DATA program unit at %L" +-msgstr "" +- +-#: fortran/symbol.c:561 +-#, no-c-format +-msgid "Fortran 2003: Procedure pointers at %L are not yet implemented in gfortran" +-msgstr "" +- +-#: fortran/symbol.c:690 fortran/symbol.c:1300 +-#, fuzzy, no-c-format +-msgid "%s attribute conflicts with %s attribute at %L" +-msgstr "l'atribut \"%s\" solament aplica a variables" +- +-#: fortran/symbol.c:693 +-#, no-c-format +-msgid "%s attribute conflicts with %s attribute in '%s' at %L" +-msgstr "" +- +-#: fortran/symbol.c:701 +-#, no-c-format +-msgid "Fortran 2003: %s attribute with %s attribute at %L" +-msgstr "" +- +-#: fortran/symbol.c:707 +-#, no-c-format +-msgid "Fortran 2003: %s attribute with %s attribute in '%s' at %L" +-msgstr "" +- +-#: fortran/symbol.c:751 +-#, no-c-format +-msgid "Cannot change attributes of USE-associated symbol at %L" +-msgstr "" +- +-#: fortran/symbol.c:754 +-#, no-c-format +-msgid "Cannot change attributes of USE-associated symbol %s at %L" +-msgstr "" +- +-#: fortran/symbol.c:770 +-#, no-c-format +-msgid "Duplicate %s attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:912 +-#, no-c-format +-msgid "Cray Pointee at %L appears in multiple pointer() statements" +-msgstr "" +- +-#: fortran/symbol.c:931 +-#, no-c-format +-msgid "Duplicate PROTECTED attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:964 +-#, fuzzy, no-c-format +-msgid "SAVE attribute at %L cannot be specified in a PURE procedure" +-msgstr "La declaració o atribut SAVE en %1 no es pot especificar juntament amb la declaració o atribut SAVE en %0" +- +-#: fortran/symbol.c:972 +-#, no-c-format +-msgid "Duplicate SAVE attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:993 +-#, no-c-format +-msgid "Duplicate VALUE attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:1013 +-#, no-c-format +-msgid "Duplicate VOLATILE attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:1296 +-#, fuzzy, no-c-format +-msgid "%s attribute of '%s' conflicts with %s attribute at %L" +-msgstr "%Jl'àrea d'adreça de \"%s\" és en conflicte amb una declaració prèvia" +- +-#: fortran/symbol.c:1330 +-#, no-c-format +-msgid "%s procedure at %L is already declared as %s procedure" +-msgstr "" +- +-#: fortran/symbol.c:1365 +-#, no-c-format +-msgid "INTENT (%s) conflicts with INTENT(%s) at %L" +-msgstr "" +- +-#: fortran/symbol.c:1388 +-#, no-c-format +-msgid "ACCESS specification at %L was already specified" +-msgstr "" +- +-#: fortran/symbol.c:1405 +-#, no-c-format +-msgid "Duplicate BIND attribute specified at %L" +-msgstr "" +- +-#: fortran/symbol.c:1412 +-#, no-c-format +-msgid "Fortran 2003: BIND(C) at %L" +-msgstr "" +- +-#: fortran/symbol.c:1434 +-#, no-c-format +-msgid "Symbol '%s' at %L already has an explicit interface" +-msgstr "" +- +-#: fortran/symbol.c:1479 +-#, no-c-format +-msgid "Symbol '%s' at %L cannot have a type" +-msgstr "" +- +-#: fortran/symbol.c:1636 +-#, no-c-format +-msgid "Component '%s' at %C already declared at %L" +-msgstr "" +- +-#: fortran/symbol.c:1714 +-#, fuzzy, no-c-format +-msgid "Symbol '%s' at %C is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: fortran/symbol.c:1746 +-#, no-c-format +-msgid "Derived type '%s' at %C is being used before it is defined" +-msgstr "" +- +-#: fortran/symbol.c:1774 +-#, fuzzy, no-c-format +-msgid "'%s' at %C is not a member of the '%s' structure" +-msgstr "\"%D\" no és un membre de tipus \"%T\"" +- +-#: fortran/symbol.c:1781 +-#, no-c-format +-msgid "Component '%s' at %C is a PRIVATE component of '%s'" +-msgstr "" +- +-#: fortran/symbol.c:1938 +-#, no-c-format +-msgid "Duplicate statement label %d at %L and %L" +-msgstr "" +- +-#: fortran/symbol.c:1948 +-#, no-c-format +-msgid "Label %d at %C already referenced as branch target" +-msgstr "" +- +-#: fortran/symbol.c:1957 +-#, no-c-format +-msgid "Label %d at %C already referenced as a format label" +-msgstr "" +- +-#: fortran/symbol.c:1999 +-#, no-c-format +-msgid "Label %d at %C previously used as a FORMAT label" +-msgstr "" +- +-#: fortran/symbol.c:2007 +-#, no-c-format +-msgid "Label %d at %C previously used as branch target" +-msgstr "" +- +-#: fortran/symbol.c:2314 +-#, no-c-format +-msgid "Name '%s' at %C is an ambiguous reference to '%s' from module '%s'" +-msgstr "" +- +-#: fortran/symbol.c:2317 +-#, no-c-format +-msgid "Name '%s' at %C is an ambiguous reference to '%s' from current program unit" +-msgstr "" +- +-#. Symbol is from another namespace. +-#: fortran/symbol.c:2461 +-#, no-c-format +-msgid "Symbol '%s' at %C has already been host associated" +-msgstr "" +- +-#: fortran/symbol.c:3162 +-#, no-c-format +-msgid "Derived type '%s' declared at %L must have the BIND attribute to be C interoperable" +-msgstr "" +- +-#: fortran/symbol.c:3173 +-#, fuzzy, no-c-format +-msgid "Derived type '%s' at %L is empty" +-msgstr "el predicat de la resposta està buidor" +- +-#: fortran/symbol.c:3190 +-#, no-c-format +-msgid "Component '%s' at %L cannot have the POINTER attribute because it is a member of the BIND(C) derived type '%s' at %L" +-msgstr "" +- +-#: fortran/symbol.c:3202 +-#, no-c-format +-msgid "Component '%s' at %L cannot have the ALLOCATABLE attribute because it is a member of the BIND(C) derived type '%s' at %L" +-msgstr "" +- +-#. If the derived type is bind(c), all fields must be +-#. interop. +-#: fortran/symbol.c:3241 +-#, no-c-format +-msgid "Component '%s' in derived type '%s' at %L may not be C interoperable, even though derived type '%s' is BIND(C)" +-msgstr "" +- +-#. If derived type is param to bind(c) routine, or to one +-#. of the iso_c_binding procs, it must be interoperable, so +-#. all fields must interop too. +-#: fortran/symbol.c:3250 +-#, no-c-format +-msgid "Component '%s' in derived type '%s' at %L may not be C interoperable" +-msgstr "" +- +-#: fortran/symbol.c:3264 +-#, no-c-format +-msgid "Derived type '%s' at %L cannot be declared with both PRIVATE and BIND(C) attributes" +-msgstr "" +- +-#: fortran/symbol.c:3272 +-#, no-c-format +-msgid "Derived type '%s' at %L cannot have the SEQUENCE attribute because it is BIND(C)" +-msgstr "" +- +-#: fortran/target-memory.c:548 +-#, no-c-format +-msgid "Overlapping unequal initializers in EQUIVALENCE at %L" +-msgstr "" +- +-#: fortran/trans-common.c:396 +-#, no-c-format +-msgid "Named COMMON block '%s' at %L shall be of the same size" +-msgstr "" +- +-#: fortran/trans-common.c:817 +-#, fuzzy, no-c-format +-msgid "Bad array reference at %L" +-msgstr "Element null en %0 per a la referència de matriu en %1" +- +-#: fortran/trans-common.c:825 +-#, no-c-format +-msgid "Illegal reference type at %L as EQUIVALENCE object" +-msgstr "" +- +-#: fortran/trans-common.c:865 +-#, no-c-format +-msgid "Inconsistent equivalence rules involving '%s' at %L and '%s' at %L" +-msgstr "" +- +-#. Aligning this field would misalign a previous field. +-#: fortran/trans-common.c:998 +-#, no-c-format +-msgid "The equivalence set for variable '%s' declared at %L violates alignment requirements" +-msgstr "" +- +-#: fortran/trans-common.c:1063 +-#, no-c-format +-msgid "Equivalence for '%s' does not match ordering of COMMON '%s' at %L" +-msgstr "" +- +-#: fortran/trans-common.c:1078 +-#, no-c-format +-msgid "The equivalence set for '%s' cause an invalid extension to COMMON '%s' at %L" +-msgstr "" +- +-#. The required offset conflicts with previous alignment +-#. requirements. Insert padding immediately before this +-#. segment. +-#: fortran/trans-common.c:1089 +-#, no-c-format +-msgid "Padding of %d bytes required before '%s' in COMMON '%s' at %L" +-msgstr "" +- +-#: fortran/trans-common.c:1115 +-#, no-c-format +-msgid "COMMON '%s' at %L does not exist" +-msgstr "" +- +-#: fortran/trans-common.c:1122 +-#, no-c-format +-msgid "COMMON '%s' at %L requires %d bytes of padding at start" +-msgstr "" +- +-#: fortran/trans-decl.c:3016 +-#, no-c-format +-msgid "Dummy argument '%s' at %L was declared INTENT(OUT) but was not set" +-msgstr "" +- +-#: fortran/trans-decl.c:3020 +-#, no-c-format +-msgid "Unused dummy argument '%s' at %L" +-msgstr "" +- +-#: fortran/trans-decl.c:3026 +-#, fuzzy, no-c-format +-msgid "Unused variable '%s' declared at %L" +-msgstr "%Jla variable \"%D\" és declarada com \"inline\"" +- +-#: fortran/trans-decl.c:3052 +-#, fuzzy, no-c-format +-msgid "Unused parameter '%s' declared at %L" +-msgstr "el paràmetre \"%s\" es va declarar void" +- +-#: fortran/trans-expr.c:2036 +-#, fuzzy, no-c-format +-msgid "Unknown argument list function at %L" +-msgstr "massa pocs arguments per a la funció \"%s\"" +- +-#: fortran/trans-intrinsic.c:829 +-#, no-c-format +-msgid "'dim' argument of %s intrinsic at %L is not a valid dimension index" +-msgstr "" +- +-#: fortran/trans-io.c:1850 +-#, no-c-format +-msgid "Derived type '%s' at %L has PRIVATE components" +-msgstr "" +- +-#: fortran/trans-stmt.c:438 +-#, fuzzy, no-c-format +-msgid "An alternate return at %L without a * dummy argument" +-msgstr "L'especificador de retorn alternatiu en %0 no és vàlid dintre d'una unitat de programa principal" +- +-#: fortran/trans.c:49 +-msgid "Array bound mismatch" +-msgstr "" +- +-#: fortran/trans.c:50 +-#, fuzzy +-msgid "Array reference out of bounds" +-msgstr "formant la referència a void" +- +-#: fortran/trans.c:51 +-#, fuzzy +-msgid "Incorrect function return value" +-msgstr "la funció \"no return\" retorna un valor que no és \"void\"" +- +-#: fortran/trans.c:465 fortran/trans.c:859 +-msgid "Attempt to allocate a negative amount of memory." +-msgstr "" +- +-#: fortran/trans.c:479 +-msgid "Memory allocation failed" +-msgstr "" +- +-#: fortran/trans.c:567 +-msgid "Attempt to allocate negative amount of memory. Possible integer overflow" +-msgstr "" +- +-#: fortran/trans.c:598 fortran/trans.c:876 +-msgid "Out of memory" +-msgstr "" +- +-#: fortran/trans.c:678 +-msgid "Attempting to allocate already allocated array" +-msgstr "" +- +-#: fortran/trans.c:776 +-msgid "Attempt to DEALLOCATE unallocated memory." +-msgstr "" +- +-#: java/jcf-dump.c:1066 +-#, c-format +-msgid "Not a valid Java .class file.\n" +-msgstr "" +- +-#: java/jcf-dump.c:1072 +-#, fuzzy, c-format +-msgid "error while parsing constant pool\n" +-msgstr "%s abans d'una constant de cadena" +- +-#: java/jcf-dump.c:1078 java/jcf-parse.c:1458 +-#, gcc-internal-format +-msgid "error in constant pool entry #%d\n" +-msgstr "" +- +-#: java/jcf-dump.c:1088 +-#, c-format +-msgid "error while parsing fields\n" +-msgstr "" +- +-#: java/jcf-dump.c:1094 +-#, c-format +-msgid "error while parsing methods\n" +-msgstr "" +- +-#: java/jcf-dump.c:1100 +-#, c-format +-msgid "error while parsing final attributes\n" +-msgstr "" +- +-#: java/jcf-dump.c:1137 +-#, c-format +-msgid "Try 'jcf-dump --help' for more information.\n" +-msgstr "" +- +-#: java/jcf-dump.c:1144 +-#, fuzzy, c-format +-msgid "" +-"Usage: jcf-dump [OPTION]... CLASS...\n" +-"\n" +-msgstr "" +-"Us: gcov [OPCIO]... FITXERFONT\n" +-"\n" +- +-#: java/jcf-dump.c:1145 +-#, c-format +-msgid "" +-"Display contents of a class file in readable form.\n" +-"\n" +-msgstr "" +- +-#: java/jcf-dump.c:1146 +-#, fuzzy, c-format +-msgid " -c Disassemble method bodies\n" +-msgstr " -W Activar avisos extra\n" +- +-#: java/jcf-dump.c:1147 +-#, fuzzy, c-format +-msgid " --javap Generate output in 'javap' format\n" +-msgstr " --help Mostra aquesta informació\n" +- +-#: java/jcf-dump.c:1149 +-#, c-format +-msgid " --classpath PATH Set path to find .class files\n" +-msgstr "" +- +-#: java/jcf-dump.c:1150 +-#, fuzzy, c-format +-msgid " -IDIR Append directory to class path\n" +-msgstr "" +-" -B Agrega el a les rutes de recerca del\n" +-" compilador\n" +- +-#: java/jcf-dump.c:1151 +-#, c-format +-msgid " --bootclasspath PATH Override built-in class path\n" +-msgstr "" +- +-#: java/jcf-dump.c:1152 +-#, c-format +-msgid " --extdirs PATH Set extensions directory path\n" +-msgstr "" +- +-#: java/jcf-dump.c:1153 +-#, fuzzy, c-format +-msgid " -o FILE Set output file name\n" +-msgstr " -o Col·loca la sortida en el \n" +- +-#: java/jcf-dump.c:1155 +-#, fuzzy, c-format +-msgid " --help Print this help, then exit\n" +-msgstr " -h, --help Mostra aquesta informació, i surt\n" +- +-#: java/jcf-dump.c:1156 +-#, fuzzy, c-format +-msgid " --version Print version number, then exit\n" +-msgstr " -v, --version Mostra el numero de versió, i surt\n" +- +-#: java/jcf-dump.c:1157 +-#, fuzzy, c-format +-msgid " -v, --verbose Print extra information while running\n" +-msgstr " -v, --version Mostra el numero de versió, i surt\n" +- +-#: java/jcf-dump.c:1159 +-#, fuzzy, c-format +-msgid "" +-"For bug reporting instructions, please see:\n" +-"%s.\n" +-msgstr "" +-"\n" +-"Per a instrucions d'informe de bug, si us plau consulta:\n" +-"%s.\n" +- +-#: java/jcf-dump.c:1187 java/jcf-dump.c:1255 +-#, c-format +-msgid "jcf-dump: no classes specified\n" +-msgstr "" +- +-#: java/jcf-dump.c:1275 +-#, fuzzy, c-format +-msgid "Cannot open '%s' for output.\n" +-msgstr "no es pot obrir %s" +- +-#: java/jcf-dump.c:1321 +-#, c-format +-msgid "bad format of .zip/.jar archive\n" +-msgstr "" +- +-#: java/jcf-dump.c:1439 +-#, c-format +-msgid "Bad byte codes.\n" +-msgstr "" +- +-#: java/jvgenmain.c:47 +-#, fuzzy, c-format +-msgid "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n" +-msgstr "" +-"Us: gcov [OPCIO]... FITXERFONT\n" +-"\n" +- +-#: java/jvgenmain.c:109 +-#, fuzzy, c-format +-msgid "%s: Cannot open output file: %s\n" +-msgstr "%s:no es pot obrir el fitxer de sortida \"%s\"\n" +- +-#: java/jvgenmain.c:151 +-#, fuzzy, c-format +-msgid "%s: Failed to close output file %s\n" +-msgstr "%s:no es pot obrir el fitxer de sortida \"%s\"\n" +- +-#: java/jvspec.c:409 +-#, c-format +-msgid "can't specify '-D' without '--main'\n" +-msgstr "" +- +-#: java/jvspec.c:412 +-#, fuzzy, c-format +-msgid "'%s' is not a valid class name" +-msgstr "\"%s\" no és un nom de fitxer vàlid" +- +-#: java/jvspec.c:418 +-#, c-format +-msgid "--resource requires -o" +-msgstr "" +- +-#: java/jvspec.c:432 +-#, c-format +-msgid "cannot specify both -C and -o" +-msgstr "" +- +-#: java/jvspec.c:444 +-#, c-format +-msgid "cannot create temporary file" +-msgstr "" +- +-#: java/jvspec.c:466 +-#, c-format +-msgid "using both @FILE with multiple files not implemented" +-msgstr "" +- +-#: java/jvspec.c:588 +-#, c-format +-msgid "cannot specify 'main' class when not linking" +-msgstr "" +- +-#: config/i386/nwld.h:34 +-#, fuzzy +-msgid "Static linking is not supported.\n" +-msgstr "no es dóna suport a l'expressió del límit de la pila" +- +-#: java/jvspec.c:80 gcc.c:820 ada/lang-specs.h:33 +-msgid "-pg and -fomit-frame-pointer are incompatible" +-msgstr "" +- +-#: config/vax/netbsd-elf.h:41 +-#, fuzzy +-msgid "the -shared option is not currently supported for VAX ELF" +-msgstr "L'opció -shared no se suporta actualment per a ELF de VAX." +- +-#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22 +-#: config/sparc/sol2-bi.h:189 config/sparc/sol2-bi.h:194 +-msgid "does not support multilib" +-msgstr "no es dóna suport a multilib" +- +-#: config/vax/vax.h:49 config/vax/vax.h:50 +-msgid "profiling not supported with -mg\n" +-msgstr "" +- +-#: config/rs6000/linux64.h:347 config/rs6000/linux64.h:349 config/linux.h:106 +-#: config/linux.h:108 config/rs6000/sysv4.h:897 config/rs6000/sysv4.h:899 +-#: config/alpha/linux-elf.h:33 config/alpha/linux-elf.h:35 +-#: config/sparc/linux.h:126 config/sparc/linux.h:128 +-#: config/sparc/linux64.h:152 config/sparc/linux64.h:154 +-msgid "-mglibc and -muclibc used together" +-msgstr "" +- +-#: config/i386/cygwin.h:28 +-msgid "mno-cygwin and mno-win32 are not compatible" +-msgstr "" +- +-#: config/i386/cygwin.h:74 config/i386/mingw32.h:74 +-msgid "shared and mdll are not compatible" +-msgstr "" +- +-#: config/i386/sco5.h:188 +-msgid "-pg not supported on this platform" +-msgstr "-pg no té suport en aquesta plataforma" +- +-#: config/i386/sco5.h:189 +-msgid "-p and -pp specified - pick one" +-msgstr "-p i -pp especificats - tria un" +- +-#: config/i386/sco5.h:258 +-msgid "-G and -static are mutually exclusive" +-msgstr "-G·i·-static són mútuament exclusius" +- +-#: gcc.c:792 +-msgid "GCC does not support -C or -CC without -E" +-msgstr "GCC no dóna suport a -C o -CC sense usar -E" +- +-#: gcc.c:1002 +-msgid "-E or -x required when input is from standard input" +-msgstr "" +- +-#: java/lang-specs.h:33 +-msgid "-fjni and -femit-class-files are incompatible" +-msgstr "" +- +-#: java/lang-specs.h:34 +-msgid "-fjni and -femit-class-file are incompatible" +-msgstr "" +- +-#: java/lang-specs.h:35 java/lang-specs.h:36 +-msgid "-femit-class-file should used along with -fsyntax-only" +-msgstr "" +- +-#: config/mcore/mcore.h:56 +-msgid "the m210 does not have little endian support" +-msgstr "" +- +-#: config/lynx.h:70 +-msgid "cannot use mthreads and mlegacy-threads together" +-msgstr "" +- +-#: config/lynx.h:95 +-msgid "cannot use mshared and static together" +-msgstr "" +- +-#: config/sh/sh.h:461 +-#, fuzzy +-msgid "SH2a does not support little-endian" +-msgstr "no es dóna suport a multilib" +- +-#: config/mips/mips.h:1042 config/arc/arc.h:61 +-msgid "may not use both -EB and -EL" +-msgstr "" +- +-#: config/s390/tpf.h:119 +-#, fuzzy +-msgid "static is not supported on TPF-OS" +-msgstr "no es dóna suport a límits de pila en aquest objectiu" +- +-#: config/rs6000/darwin.h:95 +-msgid " conflicting code gen style switches are used" +-msgstr "" +- +-#: ada/lang-specs.h:34 +-msgid "-c or -S required for Ada" +-msgstr "" +- +-#: config/mips/r3900.h:34 +-msgid "-mhard-float not supported" +-msgstr "" +- +-#: config/mips/r3900.h:36 +-msgid "-msingle-float and -msoft-float cannot both be specified" +-msgstr "" +- +-#: config/vxworks.h:71 +-#, fuzzy +-msgid "-Xbind-now and -Xbind-lazy are incompatible" +-msgstr "-membedded-pic i -mabicalls són incompatibles" +- +-#: config/darwin.h:269 +-msgid "-current_version only allowed with -dynamiclib" +-msgstr "" +- +-#: config/darwin.h:271 +-msgid "-install_name only allowed with -dynamiclib" +-msgstr "" +- +-#: config/darwin.h:276 +-msgid "-bundle not allowed with -dynamiclib" +-msgstr "no es permet -bundle amb -dynamiclib" +- +-#: config/darwin.h:277 +-msgid "-bundle_loader not allowed with -dynamiclib" +-msgstr "no es permet -bundle_loader amb -dynamiclib" +- +-#: config/darwin.h:278 +-msgid "-client_name not allowed with -dynamiclib" +-msgstr "no es permet -client_name amb -dynamiclib" +- +-#: config/darwin.h:283 +-msgid "-force_flat_namespace not allowed with -dynamiclib" +-msgstr "" +- +-#: config/darwin.h:285 +-msgid "-keep_private_externs not allowed with -dynamiclib" +-msgstr "" +- +-#: config/darwin.h:286 +-msgid "-private_bundle not allowed with -dynamiclib" +-msgstr "no es permet -private_bundle amb -dynamiclib" +- +-#: config/sparc/linux64.h:211 config/sparc/linux64.h:222 +-#: config/sparc/netbsd-elf.h:125 config/sparc/netbsd-elf.h:144 +-#: config/sparc/sol2-bi.h:217 config/sparc/sol2-bi.h:227 +-msgid "may not use both -m32 and -m64" +-msgstr "" +- +-#: config/arm/arm.h:147 +-msgid "-msoft-float and -mhard_float may not be used together" +-msgstr "" +- +-#: config/arm/arm.h:149 +-msgid "-mbig-endian and -mlittle-endian may not be used together" +-msgstr "" +- +-#: java/lang.opt:65 +-#, fuzzy +-msgid "Warn if a deprecated compiler feature, class, method, or field is used" +-msgstr "No anunciar característiques obsoletes del compilador" +- +-#: java/lang.opt:69 +-msgid "Warn if deprecated empty statements are found" +-msgstr "" +- +-#: java/lang.opt:73 +-msgid "Warn if .class files are out of date" +-msgstr "" +- +-#: java/lang.opt:77 +-msgid "Warn if modifiers are specified when not necessary" +-msgstr "" +- +-#: java/lang.opt:81 +-msgid "Deprecated; use --classpath instead" +-msgstr "" +- +-#: java/lang.opt:88 +-msgid "Permit the use of the assert keyword" +-msgstr "" +- +-#: java/lang.opt:110 +-msgid "Replace system path" +-msgstr "" +- +-#: java/lang.opt:114 +-#, fuzzy +-msgid "Generate checks for references to NULL" +-msgstr "Generar codi per a una DLL" +- +-#: java/lang.opt:118 +-msgid "Set class path" +-msgstr "" +- +-#: java/lang.opt:125 +-msgid "Output a class file" +-msgstr "" +- +-#: java/lang.opt:129 +-msgid "Alias for -femit-class-file" +-msgstr "" +- +-#: java/lang.opt:133 +-msgid "Choose input encoding (defaults from your locale)" +-msgstr "" +- +-#: java/lang.opt:137 +-msgid "Set the extension directory path" +-msgstr "" +- +-#: java/lang.opt:144 +-msgid "Input file is a file with a list of filenames to compile" +-msgstr "" +- +-#: java/lang.opt:151 +-msgid "Always check for non gcj generated classes archives" +-msgstr "" +- +-#: java/lang.opt:155 +-msgid "Assume the runtime uses a hash table to map an object to its synchronization structure" +-msgstr "" +- +-#: java/lang.opt:159 +-msgid "Generate instances of Class at runtime" +-msgstr "" +- +-#: java/lang.opt:163 +-msgid "Use offset tables for virtual method calls" +-msgstr "" +- +-#: java/lang.opt:170 +-msgid "Assume native functions are implemented using JNI" +-msgstr "" +- +-#: java/lang.opt:174 +-#, fuzzy +-msgid "Enable optimization of static class initialization code" +-msgstr "(es requereix una inicialització fora de la classe)" +- +-#: java/lang.opt:181 +-msgid "Reduce the amount of reflection meta-data generated" +-msgstr "" +- +-#: java/lang.opt:185 +-msgid "Enable assignability checks for stores into object arrays" +-msgstr "" +- +-#: java/lang.opt:189 +-#, fuzzy +-msgid "Generate code for the Boehm GC" +-msgstr "Generar codi per a M*Core M340" +- +-#: java/lang.opt:193 +-msgid "Call a library routine to do integer divisions" +-msgstr "" +- +-#: java/lang.opt:197 +-msgid "Generated should be loaded by bootstrap loader" +-msgstr "" +- +-#: java/lang.opt:201 +-msgid "Set the source language version" +-msgstr "" +- +-#: java/lang.opt:205 +-#, fuzzy +-msgid "Set the target VM version" +-msgstr "versió d'encapçalat errònia" +- +-#: ada/lang.opt:96 +-msgid "Specify options to GNAT" +-msgstr "" +- +-#: fortran/lang.opt:29 +-#, fuzzy +-msgid "Add a directory for INCLUDE and MODULE searching" +-msgstr "Agregar un directori per a la recerca de INCLUDE" +- +-#: fortran/lang.opt:33 +-msgid "Put MODULE files in 'directory'" +-msgstr "" +- +-#: fortran/lang.opt:41 +-#, fuzzy +-msgid "Warn about possible aliasing of dummy arguments" +-msgstr "Avisar sobre possibles parèntesis faltantes" +- +-#: fortran/lang.opt:45 +-#, fuzzy +-msgid "Warn about missing ampersand in continued character constants" +-msgstr "Avisar sobre l'ús de literals multicaràcters" +- +-#: fortran/lang.opt:49 +-#, fuzzy +-msgid "Warn about truncated character expressions" +-msgstr "No anunciar característiques obsoletes del compilador" +- +-#: fortran/lang.opt:53 +-#, fuzzy +-msgid "Warn about implicit conversion" +-msgstr "Avisar sobre la declaració implícita de funcions" +- +-#: fortran/lang.opt:57 +-#, fuzzy +-msgid "Warn about calls with implicit interface" +-msgstr "Avisar sobre conversions que descarten calificators" +- +-#: fortran/lang.opt:61 +-#, fuzzy +-msgid "Warn about truncated source lines" +-msgstr "No anunciar característiques obsoletes del compilador" +- +-#: fortran/lang.opt:65 +-#, fuzzy +-msgid "Warn about usage of non-standard intrinsics" +-msgstr "Avisar sobre l'ús d' (només algunes per ara) extensions Fortran" +- +-#: fortran/lang.opt:69 +-#, fuzzy +-msgid "Warn about \"suspicious\" constructs" +-msgstr "Avisar sobre declaracions sospitoses de main" +- +-#: fortran/lang.opt:73 +-msgid "Permit nonconforming uses of the tab character" +-msgstr "" +- +-#: fortran/lang.opt:77 +-#, fuzzy +-msgid "Warn about underflow of numerical constant expressions" +-msgstr "desbordament en la constant implícita" +- +-#: fortran/lang.opt:81 +-msgid "All intrinsics procedures are available regardless of selected standard" +-msgstr "" +- +-#: fortran/lang.opt:89 +-#, fuzzy +-msgid "Do not treat local variables and COMMON blocks as if they were named in SAVE statements" +-msgstr "Tractar les variables locals i els blocs COMMON com si fossin nomenats en declaracions SAVE" +- +-#: fortran/lang.opt:93 +-msgid "Specify that backslash in string introduces an escape character" +-msgstr "" +- +-#: fortran/lang.opt:97 +-msgid "Produce a backtrace when a runtime error is encountered" +-msgstr "" +- +-#: fortran/lang.opt:101 +-msgid "-fblas-matmul-limit= Size of the smallest matrix for which matmul will use BLAS" +-msgstr "" +- +-#: fortran/lang.opt:105 +-#, fuzzy +-msgid "Use big-endian format for unformatted files" +-msgstr "Usar ordre de bit big-endian" +- +-#: fortran/lang.opt:109 +-#, fuzzy +-msgid "Use little-endian format for unformatted files" +-msgstr "Usar l'ordre d'octet little-endian per a les dades" +- +-#: fortran/lang.opt:113 +-msgid "Use native format for unformatted files" +-msgstr "" +- +-#: fortran/lang.opt:117 +-msgid "Swap endianness for unformatted files" +-msgstr "" +- +-#: fortran/lang.opt:121 +-#, fuzzy +-msgid "Use the Cray Pointer extension" +-msgstr "Usar la interfície Cygwin" +- +-#: fortran/lang.opt:125 +-msgid "Ignore 'D' in column one in fixed form" +-msgstr "" +- +-#: fortran/lang.opt:129 +-msgid "Treat lines with 'D' in column one as comments" +-msgstr "" +- +-#: fortran/lang.opt:133 +-msgid "Set the default double precision kind to an 8 byte wide type" +-msgstr "" +- +-#: fortran/lang.opt:137 +-msgid "Set the default integer kind to an 8 byte wide type" +-msgstr "" +- +-#: fortran/lang.opt:141 +-msgid "Set the default real kind to an 8 byte wide type" +-msgstr "" +- +-#: fortran/lang.opt:145 +-msgid "Allow dollar signs in entity names" +-msgstr "" +- +-#: fortran/lang.opt:149 +-msgid "Dump a core file when a runtime error occurs" +-msgstr "" +- +-#: fortran/lang.opt:153 +-#, fuzzy +-msgid "Display the code tree after parsing" +-msgstr "Mostra la versió del compilador" +- +-#: fortran/lang.opt:157 +-msgid "Specify that an external BLAS library should be used for matmul calls on large-size arrays" +-msgstr "" +- +-#: fortran/lang.opt:161 +-#, fuzzy +-msgid "Use f2c calling convention" +-msgstr "Usar convenció de cridada normal" +- +-#: fortran/lang.opt:165 +-#, fuzzy +-msgid "Assume that the source file is fixed form" +-msgstr "Assumir que els punters no tenen alies" +- +-#: fortran/lang.opt:169 +-msgid "Specify where to find the compiled intrinsic modules" +-msgstr "" +- +-#: fortran/lang.opt:173 +-msgid "Allow arbitrary character line width in fixed mode" +-msgstr "" +- +-#: fortran/lang.opt:177 +-msgid "Use n as character line width in fixed mode" +-msgstr "" +- +-#: fortran/lang.opt:181 +-#, fuzzy +-msgid "Stop on following floating point exceptions" +-msgstr "Especifica la versió de l'emulador de nombre de coma flotant" +- +-#: fortran/lang.opt:185 +-msgid "Assume that the source file is free form" +-msgstr "" +- +-#: fortran/lang.opt:189 +-msgid "Allow arbitrary character line width in free mode" +-msgstr "" +- +-#: fortran/lang.opt:193 +-msgid "Use n as character line width in free mode" +-msgstr "" +- +-#: fortran/lang.opt:197 +-msgid "Specify that no implicit typing is allowed, unless overridden by explicit IMPLICIT statements" +-msgstr "" +- +-#: fortran/lang.opt:201 +-msgid "-finit-character= Initialize local character variables to ASCII value n" +-msgstr "" +- +-#: fortran/lang.opt:205 +-msgid "-finit-integer= Initialize local integer variables to n" +-msgstr "" +- +-#: fortran/lang.opt:209 +-#, fuzzy +-msgid "Initialize local variables to zero (from g77)" +-msgstr "Inicialitza les variables locals i matrius a zero" +- +-#: fortran/lang.opt:213 +-msgid "-finit-logical= Initialize local logical variables" +-msgstr "" +- +-#: fortran/lang.opt:217 +-msgid "-finit-real= Initialize local real variables" +-msgstr "" +- +-#: fortran/lang.opt:221 +-#, fuzzy +-msgid "Maximum number of errors to report" +-msgstr "Especificar el nombre màxim d'iteracions per a RPTS" +- +-#: fortran/lang.opt:225 +-#, fuzzy +-msgid "Maximum identifier length" +-msgstr "Establir la longitud màxima de línia" +- +-#: fortran/lang.opt:229 +-msgid "Maximum length for subrecords" +-msgstr "" +- +-#: fortran/lang.opt:233 +-msgid "Size in bytes of the largest array that will be put on the stack" +-msgstr "" +- +-#: fortran/lang.opt:237 +-msgid "Set default accessibility of module entities to PRIVATE." +-msgstr "" +- +-#: fortran/lang.opt:241 +-msgid "Enable OpenMP (also sets frecursive)" +-msgstr "" +- +-#: fortran/lang.opt:245 +-msgid "Try to lay out derived types as compactly as possible" +-msgstr "" +- +-#: fortran/lang.opt:249 +-msgid "Treat the input file as preprocessed" +-msgstr "" +- +-#: fortran/lang.opt:253 +-msgid "Enable range checking during compilation" +-msgstr "" +- +-#: fortran/lang.opt:257 +-msgid "Use a 4-byte record marker for unformatted files" +-msgstr "" +- +-#: fortran/lang.opt:261 +-msgid "Use an 8-byte record marker for unformatted files" +-msgstr "" +- +-#: fortran/lang.opt:265 +-msgid "Allocate local variables on the stack to allow indirect recursion" +-msgstr "" +- +-#: fortran/lang.opt:269 +-msgid "Copy array sections into a contiguous block on procedure entry" +-msgstr "" +- +-#: fortran/lang.opt:273 +-msgid "Append a second underscore if the name already contains an underscore" +-msgstr "" +- +-#: fortran/lang.opt:277 c.opt:714 +-msgid "Use the narrowest integer type possible for enumeration types" +-msgstr "" +- +-#: fortran/lang.opt:281 +-msgid "Apply negative sign to zero values" +-msgstr "" +- +-#: fortran/lang.opt:285 +-#, fuzzy +-msgid "Append underscores to externally visible names" +-msgstr "Mai agregar un segon subratllat als externs" +- +-#: fortran/lang.opt:289 +-msgid "Statically link the GNU Fortran helper library (libgfortran)" +-msgstr "" +- +-#: fortran/lang.opt:293 +-msgid "Conform to the ISO Fortran 2003 standard" +-msgstr "" +- +-#: fortran/lang.opt:297 +-msgid "Conform to the ISO Fortran 95 standard" +-msgstr "" +- +-#: fortran/lang.opt:301 +-msgid "Conform to nothing in particular" +-msgstr "" +- +-#: fortran/lang.opt:305 +-msgid "Accept extensions to support legacy code" +-msgstr "" +- +-#: treelang/lang.opt:30 +-msgid "Trace lexical analysis" +-msgstr "" +- +-#: treelang/lang.opt:34 +-#, fuzzy +-msgid "Trace the parsing process" +-msgstr "Apuntar al processador AM33" +- +-#: config/alpha/alpha.opt:23 config/i386/i386.opt:155 +-msgid "Do not use hardware fp" +-msgstr "No usar fp de maquinari" +- +-#: config/alpha/alpha.opt:27 +-msgid "Use fp registers" +-msgstr "Usar registres fp" +- +-#: config/alpha/alpha.opt:31 +-msgid "Assume GAS" +-msgstr "Assumir GAS" +- +-#: config/alpha/alpha.opt:35 +-msgid "Do not assume GAS" +-msgstr "No assumir GAS" +- +-#: config/alpha/alpha.opt:39 +-msgid "Request IEEE-conformant math library routines (OSF/1)" +-msgstr "Requerir rutines de biblioteca matemàtica que compleixin amb IEEE (OSF/1)" +- +-#: config/alpha/alpha.opt:43 +-msgid "Emit IEEE-conformant code, without inexact exceptions" +-msgstr "Emetre codi que compleixi amb IEEE, sense excepcions inexactes" +- +-#: config/alpha/alpha.opt:50 +-msgid "Do not emit complex integer constants to read-only memory" +-msgstr "No emetre constants enteres complexes a memòria de només lectura" +- +-#: config/alpha/alpha.opt:54 +-msgid "Use VAX fp" +-msgstr "Usar fp VAX" +- +-#: config/alpha/alpha.opt:58 +-msgid "Do not use VAX fp" +-msgstr "No usar fp VAX" +- +-#: config/alpha/alpha.opt:62 +-msgid "Emit code for the byte/word ISA extension" +-msgstr "Emetre codi per a l'extensió ISA octet/word" +- +-#: config/alpha/alpha.opt:66 +-msgid "Emit code for the motion video ISA extension" +-msgstr "Emetre codi per a l'extensió ISA de vídeo en moviment" +- +-#: config/alpha/alpha.opt:70 +-msgid "Emit code for the fp move and sqrt ISA extension" +-msgstr "Emetre codi per a l'extensió ISA de move i sqrt de fp" +- +-#: config/alpha/alpha.opt:74 +-msgid "Emit code for the counting ISA extension" +-msgstr "Emetre codi per a l'extensió ISA de compte" +- +-#: config/alpha/alpha.opt:78 +-msgid "Emit code using explicit relocation directives" +-msgstr "Emetre codi utilitzant directives explícites de reassignació" +- +-#: config/alpha/alpha.opt:82 +-msgid "Emit 16-bit relocations to the small data areas" +-msgstr "Emetre reassignació de 16 bits per a les àrees de dades petites" +- +-#: config/alpha/alpha.opt:86 +-msgid "Emit 32-bit relocations to the small data areas" +-msgstr "Emetre reassignació de 32 bits per a les àrees de dades petites" +- +-#: config/alpha/alpha.opt:90 +-#, fuzzy +-msgid "Emit direct branches to local functions" +-msgstr "Ometre el marc de referència per a les funcions fulles" +- +-#: config/alpha/alpha.opt:94 +-#, fuzzy +-msgid "Emit indirect branches to local functions" +-msgstr "Ometre el marc de referència per a les funcions fulles" +- +-#: config/alpha/alpha.opt:98 +-msgid "Emit rdval instead of rduniq for thread pointer" +-msgstr "" +- +-#: config/alpha/alpha.opt:102 config/s390/s390.opt:59 +-#: config/sparc/long-double-switch.opt:23 +-#, fuzzy +-msgid "Use 128-bit long double" +-msgstr "Usar long doubles de 128 bits" +- +-#: config/alpha/alpha.opt:106 config/s390/s390.opt:63 +-#: config/sparc/long-double-switch.opt:27 +-#, fuzzy +-msgid "Use 64-bit long double" +-msgstr "Usar long doubles de 64 bit" +- +-#: config/alpha/alpha.opt:110 +-msgid "Use features of and schedule given CPU" +-msgstr "Usar les característiques d'el i el planificador del CPU donat" +- +-#: config/alpha/alpha.opt:114 +-msgid "Schedule given CPU" +-msgstr "planificat per al CPU donat" +- +-#: config/alpha/alpha.opt:118 +-msgid "Control the generated fp rounding mode" +-msgstr "Controlar el mode d'arrodoniment generat de fp" +- +-#: config/alpha/alpha.opt:122 +-msgid "Control the IEEE trap mode" +-msgstr "Controlar el mode de captura IEEE" +- +-#: config/alpha/alpha.opt:126 +-msgid "Control the precision given to fp exceptions" +-msgstr "Controlar la precisió donada a les excepcions de fp" +- +-#: config/alpha/alpha.opt:130 +-msgid "Tune expected memory latency" +-msgstr "Ajustar la latència esperada de memòria" +- +-#: config/alpha/alpha.opt:134 config/ia64/ia64.opt:93 +-#: config/rs6000/sysv4.opt:32 +-msgid "Specify bit size of immediate TLS offsets" +-msgstr "" +- +-#: config/frv/frv.opt:23 +-#, fuzzy +-msgid "Use 4 media accumulators" +-msgstr "Usar el acumulador de multiplicació" +- +-#: config/frv/frv.opt:27 +-#, fuzzy +-msgid "Use 8 media accumulators" +-msgstr "Usar el acumulador de multiplicació" +- +-#: config/frv/frv.opt:31 +-#, fuzzy +-msgid "Enable label alignment optimizations" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: config/frv/frv.opt:35 +-#, fuzzy +-msgid "Dynamically allocate cc registers" +-msgstr "No assignar el registre BK" +- +-#: config/frv/frv.opt:42 +-msgid "Set the cost of branches" +-msgstr "" +- +-#: config/frv/frv.opt:46 +-msgid "Enable conditional execution other than moves/scc" +-msgstr "" +- +-#: config/frv/frv.opt:50 +-#, fuzzy +-msgid "Change the maximum length of conditionally-executed sequences" +-msgstr "La longitud màxima de la llista d'operacions pendents del planificador de tasques" +- +-#: config/frv/frv.opt:54 +-msgid "Change the number of temporary registers that are available to conditionally-executed sequences" +-msgstr "" +- +-#: config/frv/frv.opt:58 +-#, fuzzy +-msgid "Enable conditional moves" +-msgstr "Activar l'ús de les instruccions condicionals move" +- +-#: config/frv/frv.opt:62 +-#, fuzzy +-msgid "Set the target CPU type" +-msgstr "Especificar el nom del CPU destinació" +- +-#: config/frv/frv.opt:84 +-#, fuzzy +-msgid "Use fp double instructions" +-msgstr "Usar instruccions AltiVec" +- +-#: config/frv/frv.opt:88 +-msgid "Change the ABI to allow double word insns" +-msgstr "" +- +-#: config/frv/frv.opt:92 config/bfin/bfin.opt:73 +-#, fuzzy +-msgid "Enable Function Descriptor PIC mode" +-msgstr "Habilitar l'anàlisi de perfil de les funcions" +- +-#: config/frv/frv.opt:96 +-msgid "Just use icc0/fcc0" +-msgstr "" +- +-#: config/frv/frv.opt:100 +-msgid "Only use 32 FPRs" +-msgstr "" +- +-#: config/frv/frv.opt:104 +-msgid "Use 64 FPRs" +-msgstr "" +- +-#: config/frv/frv.opt:108 +-msgid "Only use 32 GPRs" +-msgstr "" +- +-#: config/frv/frv.opt:112 +-msgid "Use 64 GPRs" +-msgstr "" +- +-#: config/frv/frv.opt:116 +-msgid "Enable use of GPREL for read-only data in FDPIC" +-msgstr "" +- +-#: config/frv/frv.opt:120 config/rs6000/rs6000.opt:112 +-#: config/pdp11/pdp11.opt:71 +-msgid "Use hardware floating point" +-msgstr "Usar coma flotant de maquinari" +- +-#: config/frv/frv.opt:124 config/bfin/bfin.opt:77 +-#, fuzzy +-msgid "Enable inlining of PLT in function calls" +-msgstr "Activar l'ús de la instrucció RTPS" +- +-#: config/frv/frv.opt:128 +-#, fuzzy +-msgid "Enable PIC support for building libraries" +-msgstr "Activar el suport per a objectes enormes" +- +-#: config/frv/frv.opt:132 +-msgid "Follow the EABI linkage requirements" +-msgstr "" +- +-#: config/frv/frv.opt:136 +-#, fuzzy +-msgid "Disallow direct calls to global functions" +-msgstr "Ometre el marc de referència per a les funcions fulles" +- +-#: config/frv/frv.opt:140 +-#, fuzzy +-msgid "Use media instructions" +-msgstr "Usar instruccions de camps de bit" +- +-#: config/frv/frv.opt:144 +-#, fuzzy +-msgid "Use multiply add/subtract instructions" +-msgstr "Usar instruccions de fp per a multiplicar-acumular" +- +-#: config/frv/frv.opt:148 +-msgid "Enable optimizing &&/|| in conditional execution" +-msgstr "" +- +-#: config/frv/frv.opt:152 +-#, fuzzy +-msgid "Enable nested conditional execution optimizations" +-msgstr "Activar l'ús de les instruccions condicionals move" +- +-#: config/frv/frv.opt:157 +-msgid "Do not mark ABI switches in e_flags" +-msgstr "" +- +-#: config/frv/frv.opt:161 +-msgid "Remove redundant membars" +-msgstr "" +- +-#: config/frv/frv.opt:165 +-#, fuzzy +-msgid "Pack VLIW instructions" +-msgstr "Usar instruccions AltiVec" +- +-#: config/frv/frv.opt:169 +-msgid "Enable setting GPRs to the result of comparisons" +-msgstr "" +- +-#: config/frv/frv.opt:173 +-msgid "Change the amount of scheduler lookahead" +-msgstr "" +- +-#: config/frv/frv.opt:177 config/pa/pa.opt:104 +-msgid "Use software floating point" +-msgstr "Usar coma flotant de programari" +- +-#: config/frv/frv.opt:181 +-msgid "Assume a large TLS segment" +-msgstr "" +- +-#: config/frv/frv.opt:185 +-#, fuzzy +-msgid "Do not assume a large TLS segment" +-msgstr "No assumir GAS" +- +-#: config/frv/frv.opt:190 +-msgid "Cause gas to print tomcat statistics" +-msgstr "" +- +-#: config/frv/frv.opt:195 +-msgid "Link with the library-pic libraries" +-msgstr "" +- +-#: config/frv/frv.opt:199 +-msgid "Allow branches to be packed with other instructions" +-msgstr "" +- +-#: config/mn10300/mn10300.opt:23 +-msgid "Target the AM33 processor" +-msgstr "Apuntar al processador AM33" +- +-#: config/mn10300/mn10300.opt:27 +-#, fuzzy +-msgid "Target the AM33/2.0 processor" +-msgstr "Apuntar al processador AM33" +- +-#: config/mn10300/mn10300.opt:31 +-msgid "Work around hardware multiply bug" +-msgstr "Evitar el error de multiplicació de maquinari" +- +-#: config/mn10300/mn10300.opt:36 +-msgid "Enable linker relaxations" +-msgstr "Activar la relaxació del enllaçador" +- +-#: config/mn10300/mn10300.opt:40 +-msgid "Return pointers in both a0 and d0" +-msgstr "" +- +-#: config/s390/tpf.opt:23 +-msgid "Enable TPF-OS tracing code" +-msgstr "" +- +-#: config/s390/tpf.opt:27 +-#, fuzzy +-msgid "Specify main object for TPF-OS" +-msgstr "Especificar el nombre màxim d'iteracions per a RPTS" +- +-#: config/s390/s390.opt:23 +-#, fuzzy +-msgid "31 bit ABI" +-msgstr "Usar el ABI 64 bits" +- +-#: config/s390/s390.opt:27 +-#, fuzzy +-msgid "64 bit ABI" +-msgstr "Usar el ABI 64 bits" +- +-#: config/s390/s390.opt:31 config/i386/i386.opt:59 config/spu/spu.opt:60 +-msgid "Generate code for given CPU" +-msgstr "Generar codi per al CPU donat" +- +-#: config/s390/s390.opt:35 +-msgid "Maintain backchain pointer" +-msgstr "" +- +-#: config/s390/s390.opt:39 +-msgid "Additional debug prints" +-msgstr "Impressions addicionals de depuració" +- +-#: config/s390/s390.opt:43 +-msgid "ESA/390 architecture" +-msgstr "" +- +-#: config/s390/s390.opt:47 +-#, fuzzy +-msgid "Enable fused multiply/add instructions" +-msgstr "Generar instruccions multiply/add de curt circuit" +- +-#: config/s390/s390.opt:51 +-#, fuzzy +-msgid "Enable decimal floating point hardware support" +-msgstr "la constant de coma flotant hexadecimal requereixe un exponent" +- +-#: config/s390/s390.opt:55 +-#, fuzzy +-msgid "Enable hardware floating point" +-msgstr "Usar coma flotant de maquinari" +- +-#: config/s390/s390.opt:67 +-msgid "Use packed stack layout" +-msgstr "" +- +-#: config/s390/s390.opt:71 +-msgid "Use bras for executable < 64k" +-msgstr "Usar bras per a executable < 64k" +- +-#: config/s390/s390.opt:75 +-#, fuzzy +-msgid "Disable hardware floating point" +-msgstr "Usar coma flotant de maquinari" +- +-#: config/s390/s390.opt:79 +-msgid "Set the max. number of bytes which has to be left to stack size before a trap instruction is triggered" +-msgstr "" +- +-#: config/s390/s390.opt:83 +-msgid "Emit extra code in the function prologue in order to trap if the stack size exceeds the given limit" +-msgstr "" +- +-#: config/s390/s390.opt:87 config/ia64/ia64.opt:97 config/sparc/sparc.opt:95 +-#: config/i386/i386.opt:183 config/rs6000/rs6000.opt:226 config/spu/spu.opt:64 +-msgid "Schedule code for given CPU" +-msgstr "Codi de planificador per al CPU donat" +- +-#: config/s390/s390.opt:91 +-msgid "mvcle use" +-msgstr "ùs de mvcle" +- +-#: config/s390/s390.opt:95 +-msgid "Warn if a function uses alloca or creates an array with dynamic size" +-msgstr "" +- +-#: config/s390/s390.opt:99 +-msgid "Warn if a single function's framesize exceeds the given framesize" +-msgstr "" +- +-#: config/s390/s390.opt:103 +-msgid "z/Architecture" +-msgstr "" +- +-#: config/ia64/ilp32.opt:3 +-#, fuzzy +-msgid "Generate ILP32 code" +-msgstr "Generar codi 32 bit per a i386" +- +-#: config/ia64/ilp32.opt:7 +-#, fuzzy +-msgid "Generate LP64 code" +-msgstr "Generar codi 64 bit per a x86-64" +- +-#: config/ia64/ia64.opt:3 +-msgid "Generate big endian code" +-msgstr "Generar codi big endian" +- +-#: config/ia64/ia64.opt:7 +-msgid "Generate little endian code" +-msgstr "Generar codi little endian" +- +-#: config/ia64/ia64.opt:11 +-msgid "Generate code for GNU as" +-msgstr "Generar codi per a GNU as" +- +-#: config/ia64/ia64.opt:15 +-msgid "Generate code for GNU ld" +-msgstr "Generar codi per a GNU ld" +- +-#: config/ia64/ia64.opt:19 +-msgid "Emit stop bits before and after volatile extended asms" +-msgstr "Emetre bits de desocupada abans i després de asms estesos amb volatile" +- +-#: config/ia64/ia64.opt:23 +-msgid "Use in/loc/out register names" +-msgstr "Usar noms de registre in/loc/out" +- +-#: config/ia64/ia64.opt:30 +-msgid "Enable use of sdata/scommon/sbss" +-msgstr "Activar l'ús de sdata/scommon/sbss" +- +-#: config/ia64/ia64.opt:34 +-msgid "Generate code without GP reg" +-msgstr "Generar codi sense registre GP" +- +-#: config/ia64/ia64.opt:38 +-msgid "gp is constant (but save/restore gp on indirect calls)" +-msgstr "gp és constant (però hi ha save/restore de gp en crides indirectes)" +- +-#: config/ia64/ia64.opt:42 +-msgid "Generate self-relocatable code" +-msgstr "Generar codi self-relocatable" +- +-#: config/ia64/ia64.opt:46 +-msgid "Generate inline floating point division, optimize for latency" +-msgstr "Generar divisió de coma flotant «inline», optimitzar per a latència" +- +-#: config/ia64/ia64.opt:50 +-msgid "Generate inline floating point division, optimize for throughput" +-msgstr "Generar divisió de coma flotant «inline», optimitzar per a sortida" +- +-#: config/ia64/ia64.opt:57 +-msgid "Generate inline integer division, optimize for latency" +-msgstr "Generar divisió entera «inline», optimitzar per a latència" +- +-#: config/ia64/ia64.opt:61 +-msgid "Generate inline integer division, optimize for throughput" +-msgstr "Generar divisió entera «inline», optimitzar per a sortida" +- +-#: config/ia64/ia64.opt:65 +-#, fuzzy +-msgid "Do not inline integer division" +-msgstr "No avisar sobre la divisió entera per zero en temps de compilació" +- +-#: config/ia64/ia64.opt:69 +-msgid "Generate inline square root, optimize for latency" +-msgstr "Generar arrel quadrada «inline», optimitzar per a latència" +- +-#: config/ia64/ia64.opt:73 +-msgid "Generate inline square root, optimize for throughput" +-msgstr "Generar arrel quadrada «inline», optimitzar per a sortida" +- +-#: config/ia64/ia64.opt:77 +-#, fuzzy +-msgid "Do not inline square root" +-msgstr "No desactivar registres d'espai" +- +-#: config/ia64/ia64.opt:81 +-msgid "Enable Dwarf 2 line debug info via GNU as" +-msgstr "Activar la informació de la línia de depuració Dwarf2 a través com de GNU" +- +-#: config/ia64/ia64.opt:85 +-msgid "Enable earlier placing stop bits for better scheduling" +-msgstr "" +- +-#: config/ia64/ia64.opt:89 config/spu/spu.opt:56 config/pa/pa.opt:51 +-msgid "Specify range of registers to make fixed" +-msgstr "Especifica el rang de registres a convertir en fixos" +- +-#: config/ia64/ia64.opt:101 +-#, fuzzy +-msgid "Use data speculation before reload" +-msgstr "Permetre el moviment especulatiu de més càrregues" +- +-#: config/ia64/ia64.opt:105 +-msgid "Use data speculation after reload" +-msgstr "" +- +-#: config/ia64/ia64.opt:109 +-#, fuzzy +-msgid "Use control speculation" +-msgstr "Crear una aplicació de consola" +- +-#: config/ia64/ia64.opt:113 +-msgid "Use in block data speculation before reload" +-msgstr "" +- +-#: config/ia64/ia64.opt:117 +-msgid "Use in block data speculation after reload" +-msgstr "" +- +-#: config/ia64/ia64.opt:121 +-msgid "Use in block control speculation" +-msgstr "" +- +-#: config/ia64/ia64.opt:125 +-msgid "Use simple data speculation check" +-msgstr "" +- +-#: config/ia64/ia64.opt:129 +-msgid "Use simple data speculation check for control speculation" +-msgstr "" +- +-#: config/ia64/ia64.opt:133 +-msgid "Print information about speculative motions." +-msgstr "" +- +-#: config/ia64/ia64.opt:137 +-msgid "If set, data speculative instructions will be chosen for schedule only if there are no other choices at the moment " +-msgstr "" +- +-#: config/ia64/ia64.opt:141 +-msgid "If set, control speculative instructions will be chosen for schedule only if there are no other choices at the moment " +-msgstr "" +- +-#: config/ia64/ia64.opt:145 +-msgid "Count speculative dependencies while calculating priority of instructions" +-msgstr "" +- +-#: config/m32c/m32c.opt:24 config/bfin/bfin.opt:23 config/mt/mt.opt:27 +-msgid "Use simulator runtime" +-msgstr "" +- +-#: config/m32c/m32c.opt:28 +-#, fuzzy +-msgid "Compile code for R8C variants" +-msgstr "Compilar per a punters de 64-bit" +- +-#: config/m32c/m32c.opt:32 +-#, fuzzy +-msgid "Compile code for M16C variants" +-msgstr "Compilar per a punters de 64-bit" +- +-#: config/m32c/m32c.opt:36 +-#, fuzzy +-msgid "Compile code for M32CM variants" +-msgstr "Compilar per a punters de 32-bit" +- +-#: config/m32c/m32c.opt:40 +-#, fuzzy +-msgid "Compile code for M32C variants" +-msgstr "Compilar per a punters de 32-bit" +- +-#: config/m32c/m32c.opt:44 +-msgid "Number of memreg bytes (default: 16, range: 0..16)" +-msgstr "" +- +-#: config/sparc/little-endian.opt:23 +-#, fuzzy +-msgid "Generate code for little-endian" +-msgstr "Generar codi per a little endian" +- +-#: config/sparc/little-endian.opt:27 +-#, fuzzy +-msgid "Generate code for big-endian" +-msgstr "Generar codi per a big endian" +- +-#: config/sparc/sparc.opt:23 config/sparc/sparc.opt:27 +-#, fuzzy +-msgid "Use hardware FP" +-msgstr "Usar fp de maquinari" +- +-#: config/sparc/sparc.opt:31 +-#, fuzzy +-msgid "Do not use hardware FP" +-msgstr "No usar fp de maquinari" +- +-#: config/sparc/sparc.opt:35 +-msgid "Assume possible double misalignment" +-msgstr "Assumir desalineació de double possible" +- +-#: config/sparc/sparc.opt:39 +-msgid "Pass -assert pure-text to linker" +-msgstr "Passar el text pur de -assert al enllaçador" +- +-#: config/sparc/sparc.opt:43 +-msgid "Use ABI reserved registers" +-msgstr "Usar els registres ABI reservats" +- +-#: config/sparc/sparc.opt:47 +-#, fuzzy +-msgid "Use hardware quad FP instructions" +-msgstr "Usar instruccions de fp quad de maquinari" +- +-#: config/sparc/sparc.opt:51 +-msgid "Do not use hardware quad fp instructions" +-msgstr "No usar instruccions de fp quad de maquinari" +- +-#: config/sparc/sparc.opt:55 +-#, fuzzy +-msgid "Compile for V8+ ABI" +-msgstr "Compilar per a el ABI de v8plus" +- +-#: config/sparc/sparc.opt:59 +-#, fuzzy +-msgid "Use UltraSPARC Visual Instruction Set extensions" +-msgstr "Utilitzar el Conjunt d'Instruccions Visuals" +- +-#: config/sparc/sparc.opt:63 +-msgid "Pointers are 64-bit" +-msgstr "El punters són de 64 bits" +- +-#: config/sparc/sparc.opt:67 +-msgid "Pointers are 32-bit" +-msgstr "El punters són de 32 bits" +- +-#: config/sparc/sparc.opt:71 +-msgid "Use 64-bit ABI" +-msgstr "Usar el ABI 64 bits" +- +-#: config/sparc/sparc.opt:75 +-msgid "Use 32-bit ABI" +-msgstr "Usar el ABI 32 bits" +- +-#: config/sparc/sparc.opt:79 +-msgid "Use stack bias" +-msgstr "Usar tendència de la pila" +- +-#: config/sparc/sparc.opt:83 +-msgid "Use structs on stronger alignment for double-word copies" +-msgstr "Usar structs en alineació més forta per a còpies double-word" +- +-#: config/sparc/sparc.opt:87 +-msgid "Optimize tail call instructions in assembler and linker" +-msgstr "Optimitzar les instruccions de la crida extrem en l'ensamblador i l'enllaçador" +- +-#: config/sparc/sparc.opt:91 config/rs6000/rs6000.opt:222 +-msgid "Use features of and schedule code for given CPU" +-msgstr "Usar característiques i calendaritzar el codi per al CPU donat" +- +-#: config/sparc/sparc.opt:99 +-#, fuzzy +-msgid "Use given SPARC-V9 code model" +-msgstr "Usar el model de codi del SPARC donat" +- +-#: config/sparc/sparc.opt:103 +-msgid "Enable strict 32-bit psABI struct return checking." +-msgstr "" +- +-#: config/m32r/m32r.opt:23 +-#, fuzzy +-msgid "Compile for the m32rx" +-msgstr "Compilar per a un 68HC12" +- +-#: config/m32r/m32r.opt:27 +-#, fuzzy +-msgid "Compile for the m32r2" +-msgstr "Compilar per a un 68HC12" +- +-#: config/m32r/m32r.opt:31 +-#, fuzzy +-msgid "Compile for the m32r" +-msgstr "Compilar per a un 68HC12" +- +-#: config/m32r/m32r.opt:35 +-msgid "Align all loops to 32 byte boundary" +-msgstr "Alinear tots els cicles al límit de 32 octet" +- +-#: config/m32r/m32r.opt:39 +-msgid "Prefer branches over conditional execution" +-msgstr "Preferir les branques sobre l'execució condicional" +- +-#: config/m32r/m32r.opt:43 +-msgid "Give branches their default cost" +-msgstr "" +- +-#: config/m32r/m32r.opt:47 +-msgid "Display compile time statistics" +-msgstr "Mostrar estadístiques de tepms de compilació" +- +-#: config/m32r/m32r.opt:51 +-msgid "Specify cache flush function" +-msgstr "Especificar una funció de neteja de memòria cau" +- +-#: config/m32r/m32r.opt:55 +-#, fuzzy +-msgid "Specify cache flush trap number" +-msgstr "Especificar una funció de neteja de memòria cau" +- +-#: config/m32r/m32r.opt:59 +-msgid "Only issue one instruction per cycle" +-msgstr "Només executar una instrucció per cicle" +- +-#: config/m32r/m32r.opt:63 +-#, fuzzy +-msgid "Allow two instructions to be issued per cycle" +-msgstr "Només executar una instrucció per cicle" +- +-#: config/m32r/m32r.opt:67 +-msgid "Code size: small, medium or large" +-msgstr "Grandària del codi: small, medium o large" +- +-#: config/m32r/m32r.opt:71 +-msgid "Don't call any cache flush functions" +-msgstr "No cridar cap funció de neteja de memòria cau" +- +-#: config/m32r/m32r.opt:75 +-#, fuzzy +-msgid "Don't call any cache flush trap" +-msgstr "No cridar cap funció de neteja de memòria cau" +- +-#: config/m32r/m32r.opt:82 +-msgid "Small data area: none, sdata, use" +-msgstr " Àrea de dades small: none, sdata, use" +- +-#: config/m68k/m68k.opt:23 +-msgid "Generate code for a 520X" +-msgstr "Generar codi per a un 520X" +- +-#: config/m68k/m68k.opt:27 +-#, fuzzy +-msgid "Generate code for a 5206e" +-msgstr "Generar codi per a un 520X" +- +-#: config/m68k/m68k.opt:31 +-#, fuzzy +-msgid "Generate code for a 528x" +-msgstr "Generar codi per a un 520X" +- +-#: config/m68k/m68k.opt:35 +-#, fuzzy +-msgid "Generate code for a 5307" +-msgstr "Generar codi per a un 520X" +- +-#: config/m68k/m68k.opt:39 +-#, fuzzy +-msgid "Generate code for a 5407" +-msgstr "Generar codi per a un 520X" +- +-#: config/m68k/m68k.opt:43 config/m68k/m68k.opt:104 +-msgid "Generate code for a 68000" +-msgstr "Generar codi per a un 68000" +- +-#: config/m68k/m68k.opt:47 +-#, fuzzy +-msgid "Generate code for a 68010" +-msgstr "Generar codi per a un 68020" +- +-#: config/m68k/m68k.opt:51 config/m68k/m68k.opt:108 +-msgid "Generate code for a 68020" +-msgstr "Generar codi per a un 68020" +- +-#: config/m68k/m68k.opt:55 +-msgid "Generate code for a 68040, without any new instructions" +-msgstr "Generar codi per a un 68040, sense cap instrucció nova" +- +-#: config/m68k/m68k.opt:59 +-msgid "Generate code for a 68060, without any new instructions" +-msgstr "Generar codi per a un 68060, sense cap instrucció nova" +- +-#: config/m68k/m68k.opt:63 +-msgid "Generate code for a 68030" +-msgstr "Generar codi per a un 68030" +- +-#: config/m68k/m68k.opt:67 +-msgid "Generate code for a 68040" +-msgstr "Generar codi per a un 68040" +- +-#: config/m68k/m68k.opt:71 +-msgid "Generate code for a 68060" +-msgstr "Generar codi per a un 68060" +- +-#: config/m68k/m68k.opt:75 +-msgid "Generate code for a 68302" +-msgstr "Generar codi per a un 68302" +- +-#: config/m68k/m68k.opt:79 +-msgid "Generate code for a 68332" +-msgstr "Generar codi per a un 68332" +- +-#: config/m68k/m68k.opt:84 +-msgid "Generate code for a 68851" +-msgstr "Generar codi per a un 68851" +- +-#: config/m68k/m68k.opt:88 +-#, fuzzy +-msgid "Generate code that uses 68881 floating-point instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/m68k/m68k.opt:92 +-msgid "Align variables on a 32-bit boundary" +-msgstr "Alinear les variables en un límit de 32-bit" +- +-#: config/m68k/m68k.opt:96 config/arm/arm.opt:49 config/score/score.opt:63 +-msgid "Specify the name of the target architecture" +-msgstr "Especificar el nom de l'arquitectura destinació" +- +-#: config/m68k/m68k.opt:100 +-msgid "Use the bit-field instructions" +-msgstr "Usar instruccions de camps de bit" +- +-#: config/m68k/m68k.opt:112 +-#, fuzzy +-msgid "Generate code for a ColdFire v4e" +-msgstr "Generar codi per a M*Core M340" +- +-#: config/m68k/m68k.opt:116 +-#, fuzzy +-msgid "Specify the target CPU" +-msgstr "Especificar el nom del CPU destinació" +- +-#: config/m68k/m68k.opt:120 +-msgid "Generate code for a cpu32" +-msgstr "Generar codi per a un cpu32" +- +-#: config/m68k/m68k.opt:124 +-#, fuzzy +-msgid "Use hardware division instructions on ColdFire" +-msgstr "Usar instruccions de fp quad de maquinari" +- +-#: config/m68k/m68k.opt:128 +-#, fuzzy +-msgid "Generate code for a Fido A" +-msgstr "Generar codi per a un Sun FPA" +- +-#: config/m68k/m68k.opt:132 +-#, fuzzy +-msgid "Generate code which uses hardware floating point instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/m68k/m68k.opt:136 +-msgid "Enable ID based shared library" +-msgstr "" +- +-#: config/m68k/m68k.opt:140 +-msgid "Do not use the bit-field instructions" +-msgstr "No usar instruccions de camps de bit" +- +-#: config/m68k/m68k.opt:144 +-msgid "Use normal calling convention" +-msgstr "Usar convenció de cridada normal" +- +-#: config/m68k/m68k.opt:148 +-#, fuzzy +-msgid "Consider type 'int' to be 32 bits wide" +-msgstr "Considerar que el tipus \"int\" és de 32 bits d'amplària" +- +-#: config/m68k/m68k.opt:152 +-msgid "Generate pc-relative code" +-msgstr "Generar codi relatiu al pc" +- +-#: config/m68k/m68k.opt:156 +-msgid "Use different calling convention using 'rtd'" +-msgstr "Usar la convenció de cridada diferent usant 'rtd'" +- +-#: config/m68k/m68k.opt:160 config/bfin/bfin.opt:61 +-msgid "Enable separate data segment" +-msgstr "" +- +-#: config/m68k/m68k.opt:164 config/bfin/bfin.opt:57 +-msgid "ID of shared library to build" +-msgstr "" +- +-#: config/m68k/m68k.opt:168 +-#, fuzzy +-msgid "Consider type 'int' to be 16 bits wide" +-msgstr "Considerar que el tipus \"int\" és de 16 bits d'amplària" +- +-#: config/m68k/m68k.opt:172 +-msgid "Generate code with library calls for floating point" +-msgstr "Generar codi amb crides a biblioteques per a coma flotant" +- +-#: config/m68k/m68k.opt:176 +-msgid "Do not use unaligned memory references" +-msgstr "No permetre referències a memòria sense alinear" +- +-#: config/m68k/m68k.opt:180 +-#, fuzzy +-msgid "Tune for the specified target CPU or architecture" +-msgstr "Especificar el nom de l'arquitectura destinació" +- +-#: config/m68k/ieee.opt:24 config/i386/i386.opt:95 +-msgid "Use IEEE math for fp comparisons" +-msgstr "Usar matemàtica IEEE per a comparances fp" +- +-#: config/i386/djgpp.opt:25 +-msgid "Ignored (obsolete)" +-msgstr "" +- +-#: config/i386/i386.opt:23 +-msgid "sizeof(long double) is 16" +-msgstr "sizeof(long double) és 16." +- +-#: config/i386/i386.opt:27 config/i386/i386.opt:91 +-msgid "Use hardware fp" +-msgstr "Usar fp de maquinari" +- +-#: config/i386/i386.opt:31 +-msgid "sizeof(long double) is 12" +-msgstr "sizeof(long double) és 12." +- +-#: config/i386/i386.opt:35 +-msgid "Reserve space for outgoing arguments in the function prologue" +-msgstr "" +- +-#: config/i386/i386.opt:39 +-msgid "Align some doubles on dword boundary" +-msgstr "Alinear alguns dobles en límits de dword" +- +-#: config/i386/i386.opt:43 +-msgid "Function starts are aligned to this power of 2" +-msgstr "Els inicis de les funcions són alineats a aquesta potència de 2" +- +-#: config/i386/i386.opt:47 +-msgid "Jump targets are aligned to this power of 2" +-msgstr "Els objectius de salt són alineats a aquesta potència de 2" +- +-#: config/i386/i386.opt:51 +-msgid "Loop code aligned to this power of 2" +-msgstr "El codi de cicle és alineat a aquesta potència de 2" +- +-#: config/i386/i386.opt:55 +-msgid "Align destination of the string operations" +-msgstr "Alinear destinació de les operacions de cadenes" +- +-#: config/i386/i386.opt:63 +-msgid "Use given assembler dialect" +-msgstr "Usar el dialecte de l'ensamblador donat" +- +-#: config/i386/i386.opt:67 +-msgid "Branches are this expensive (1-5, arbitrary units)" +-msgstr "Les ramificacions són així de cares (1-5, unitats arbitràries)" +- +-#: config/i386/i386.opt:71 +-msgid "Data greater than given threshold will go into .ldata section in x86-64 medium model" +-msgstr "" +- +-#: config/i386/i386.opt:75 +-msgid "Use given x86-64 code model" +-msgstr "Usar el mpdel de codi x86-64 donat" +- +-#: config/i386/i386.opt:79 +-msgid "Generate sin, cos, sqrt for FPU" +-msgstr "Generar sin, cos, sqrt per a FPU" +- +-#: config/i386/i386.opt:83 +-msgid "Return values of functions in FPU registers" +-msgstr "Retornar valors de funcions en registres FPU" +- +-#: config/i386/i386.opt:87 +-msgid "Generate floating point mathematics using given instruction set" +-msgstr "Generar matemàtiques de coma flotant usant el conjunt d'instruccions donat" +- +-#: config/i386/i386.opt:99 +-msgid "Inline all known string operations" +-msgstr "Convertir a «inline» totes les operacions de cadenes conegudes" +- +-#: config/i386/i386.opt:103 +-msgid "Inline memset/memcpy string operations, but perform inline version only for small blocks" +-msgstr "" +- +-#: config/i386/i386.opt:111 +-msgid "Use native (MS) bitfield layout" +-msgstr "" +- +-#: config/i386/i386.opt:127 +-msgid "Omit the frame pointer in leaf functions" +-msgstr "Ometre el marc de referència per a les funcions fulles" +- +-#: config/i386/i386.opt:131 +-msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)" +-msgstr "" +- +-#: config/i386/i386.opt:135 +-msgid "Attempt to keep stack aligned to this power of 2" +-msgstr "Es tracta de mantenir la pila alineada a aquesta potència de 2" +- +-#: config/i386/i386.opt:139 +-msgid "Use push instructions to save outgoing arguments" +-msgstr "Usar instruccions push per a guardar els arguments de sortida" +- +-#: config/i386/i386.opt:143 +-msgid "Use red-zone in the x86-64 code" +-msgstr "Usar red-zone en el codi x86-64" +- +-#: config/i386/i386.opt:147 +-msgid "Number of registers used to pass integer arguments" +-msgstr "Nombre de registres usats per a passar arguments enters" +- +-#: config/i386/i386.opt:151 +-msgid "Alternate calling convention" +-msgstr "Convenció de cridada alternativa" +- +-#: config/i386/i386.opt:159 +-msgid "Use SSE register passing conventions for SF and DF mode" +-msgstr "" +- +-#: config/i386/i386.opt:163 +-msgid "Realign stack in prologue" +-msgstr "" +- +-#: config/i386/i386.opt:167 +-msgid "Enable stack probing" +-msgstr "Habilitar la prova de la pila" +- +-#: config/i386/i386.opt:171 +-msgid "Chose strategy to generate stringop using" +-msgstr "" +- +-#: config/i386/i386.opt:175 +-msgid "Use given thread-local storage dialect" +-msgstr "Usar el dialecte d'emmagatzematge thread-local donat" +- +-#: config/i386/i386.opt:179 +-#, c-format +-msgid "Use direct references against %gs when accessing tls data" +-msgstr "" +- +-#: config/i386/i386.opt:187 +-#, fuzzy +-msgid "Vector library ABI to use" +-msgstr "Especificar el ABI a utilitzar" +- +-#: config/i386/i386.opt:193 +-msgid "Generate 32bit i386 code" +-msgstr "Generar codi 32 bit per a i386" +- +-#: config/i386/i386.opt:197 +-msgid "Generate 64bit x86-64 code" +-msgstr "Generar codi 64 bit per a x86-64" +- +-#: config/i386/i386.opt:201 +-msgid "Support MMX built-in functions" +-msgstr "Donar suport per a funcions internes MMX" +- +-#: config/i386/i386.opt:205 +-msgid "Support 3DNow! built-in functions" +-msgstr "Donar suport per a funcions internes 3DNow!" +- +-#: config/i386/i386.opt:209 +-#, fuzzy +-msgid "Support Athlon 3Dnow! built-in functions" +-msgstr "Donar suport per a funcions internes 3DNow!" +- +-#: config/i386/i386.opt:213 +-msgid "Support MMX and SSE built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX i SSE i generació de codi" +- +-#: config/i386/i386.opt:217 +-msgid "Support MMX, SSE and SSE2 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE i SSE2 i generació de codi" +- +-#: config/i386/i386.opt:221 +-msgid "Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE, SSE2 i SSE3 i generació de codi" +- +-#: config/i386/i386.opt:225 +-#, fuzzy +-msgid "Support MMX, SSE, SSE2, SSE3 and SSSE3 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE, SSE2 i SSE3 i generació de codi" +- +-#: config/i386/i386.opt:229 +-#, fuzzy +-msgid "Support MMX, SSE, SSE2, SSE3, SSSE3 and SSE4.1 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE, SSE2 i SSE3 i generació de codi" +- +-#: config/i386/i386.opt:233 config/i386/i386.opt:237 +-#, fuzzy +-msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE, SSE2 i SSE3 i generació de codi" +- +-#: config/i386/i386.opt:241 +-#, fuzzy +-msgid "Do not support SSE4.1 and SSE4.2 built-in functions and code generation" +-msgstr "No donar suport per a funcions internes MMX, SSE i SSE2 i generació de codi" +- +-#: config/i386/i386.opt:245 +-#, fuzzy +-msgid "Support MMX, SSE, SSE2, SSE3 and SSE4A built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX, SSE, SSE2 i SSE3 i generació de codi" +- +-#: config/i386/i386.opt:249 +-#, fuzzy +-msgid "Support SSE5 built-in functions and code generation" +-msgstr "Donar suport per a funcions internes MMX i SSE i generació de codi" +- +-#: config/i386/i386.opt:255 +-msgid "Support code generation of Advanced Bit Manipulation (ABM) instructions." +-msgstr "" +- +-#: config/i386/i386.opt:259 +-#, fuzzy +-msgid "Support code generation of cmpxchg16b instruction." +-msgstr "No generar instruccions char" +- +-#: config/i386/i386.opt:263 +-#, fuzzy +-msgid "Support code generation of popcnt instruction." +-msgstr "No generar instruccions char" +- +-#: config/i386/i386.opt:267 +-msgid "Support code generation of sahf instruction in 64bit x86-64 code." +-msgstr "" +- +-#: config/i386/i386.opt:271 +-msgid "Generate reciprocals instead of divss and sqrtss." +-msgstr "" +- +-#: config/i386/i386.opt:275 +-#, fuzzy +-msgid "Enable automatic generation of fused floating point multiply-add instructions" +-msgstr "No generar instruccions multiply/add de curt circuit" +- +-#: config/i386/cygming.opt:23 +-msgid "Create console application" +-msgstr "Crear una aplicació de consola" +- +-#: config/i386/cygming.opt:27 +-msgid "Use the Cygwin interface" +-msgstr "Usar la interfície Cygwin" +- +-#: config/i386/cygming.opt:31 +-msgid "Generate code for a DLL" +-msgstr "Generar codi per a una DLL" +- +-#: config/i386/cygming.opt:35 +-msgid "Ignore dllimport for functions" +-msgstr "Ignorar dllimport per a funcions" +- +-#: config/i386/cygming.opt:39 +-msgid "Use Mingw-specific thread support" +-msgstr "Usar suport de fils específic de Mingw" +- +-#: config/i386/cygming.opt:43 +-msgid "Set Windows defines" +-msgstr "Establir les definicions de Windows" +- +-#: config/i386/cygming.opt:47 +-msgid "Create GUI application" +-msgstr "Crear una aplicació amb interfície gràfica d'usuari (GUI)" +- +-#: config/i386/sco5.opt:24 +-msgid "Generate ELF output" +-msgstr "Generar sortida ELF" +- +-#: config/rs6000/aix41.opt:24 config/rs6000/aix64.opt:32 +-msgid "Support message passing with the Parallel Environment" +-msgstr "Suport per al pas de missatges amb l'Ambient Paral·lel" +- +-#: config/rs6000/aix.opt:24 config/rs6000/rs6000.opt:147 +-msgid "Conform more closely to IBM XLC semantics" +-msgstr "" +- +-#: config/rs6000/darwin.opt:24 config/rs6000/sysv4.opt:132 +-#, fuzzy +-msgid "Generate 64-bit code" +-msgstr "Generar codi 64 bit per a x86-64" +- +-#: config/rs6000/darwin.opt:28 config/rs6000/sysv4.opt:136 +-#, fuzzy +-msgid "Generate 32-bit code" +-msgstr "Generar codi 32 bit per a i386" +- +-#: config/rs6000/darwin.opt:32 +-msgid "Generate code suitable for executables (NOT shared libs)" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:24 +-msgid "Use POWER instruction set" +-msgstr "Usar el conjunt d'instruccions POWER" +- +-#: config/rs6000/rs6000.opt:28 +-msgid "Do not use POWER instruction set" +-msgstr "No usar el conjunt d'instruccions POWER" +- +-#: config/rs6000/rs6000.opt:32 +-msgid "Use POWER2 instruction set" +-msgstr "Usar el conjunt d'instruccions POWER2" +- +-#: config/rs6000/rs6000.opt:36 +-msgid "Use PowerPC instruction set" +-msgstr "Usar el conjunt d'instruccions PowerPC" +- +-#: config/rs6000/rs6000.opt:40 +-msgid "Do not use PowerPC instruction set" +-msgstr "No usar el conjunt d'instruccions PowerPC" +- +-#: config/rs6000/rs6000.opt:44 +-msgid "Use PowerPC-64 instruction set" +-msgstr "Usar el conjunt d'instruccions PowerPC-64" +- +-#: config/rs6000/rs6000.opt:48 +-msgid "Use PowerPC General Purpose group optional instructions" +-msgstr "Usar el grup opcional d'instruccions PowerPC de Propòsit General" +- +-#: config/rs6000/rs6000.opt:52 +-msgid "Use PowerPC Graphics group optional instructions" +-msgstr "Usar el grup opcional d'instruccions PowerPC de Gràfiques" +- +-#: config/rs6000/rs6000.opt:56 +-#, fuzzy +-msgid "Use PowerPC V2.01 single field mfcr instruction" +-msgstr "Generar instruccions char" +- +-#: config/rs6000/rs6000.opt:60 +-#, fuzzy +-msgid "Use PowerPC V2.02 popcntb instruction" +-msgstr "Usar el conjunt d'instruccions PowerPC" +- +-#: config/rs6000/rs6000.opt:64 +-#, fuzzy +-msgid "Use PowerPC V2.02 floating point rounding instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/rs6000/rs6000.opt:68 +-#, fuzzy +-msgid "Use PowerPC V2.05 compare bytes instruction" +-msgstr "Usar el conjunt d'instruccions PowerPC" +- +-#: config/rs6000/rs6000.opt:72 +-#, fuzzy +-msgid "Use extended PowerPC V2.05 move floating point to/from GPR instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/rs6000/rs6000.opt:76 +-msgid "Use AltiVec instructions" +-msgstr "Usar instruccions AltiVec" +- +-#: config/rs6000/rs6000.opt:80 +-#, fuzzy +-msgid "Use decimal floating point instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/rs6000/rs6000.opt:84 +-#, fuzzy +-msgid "Use 4xx half-word multiply instructions" +-msgstr "Generar instruccions multiply/add de curt circuit" +- +-#: config/rs6000/rs6000.opt:88 +-#, fuzzy +-msgid "Use 4xx string-search dlmzb instruction" +-msgstr "Usar instruccions AltiVec" +- +-#: config/rs6000/rs6000.opt:92 +-msgid "Generate load/store multiple instructions" +-msgstr "Generar múltiples instruccions load/store" +- +-#: config/rs6000/rs6000.opt:96 +-msgid "Generate string instructions for block moves" +-msgstr "Generar instruccions de cadena per a moviment de blocs" +- +-#: config/rs6000/rs6000.opt:100 +-msgid "Use new mnemonics for PowerPC architecture" +-msgstr "Usar els mnemònics nous per a l'arquitectura PowerPC" +- +-#: config/rs6000/rs6000.opt:104 +-msgid "Use old mnemonics for PowerPC architecture" +-msgstr "Usar els mnemònics vells per a l'arquitectura PowerPC" +- +-#: config/rs6000/rs6000.opt:108 config/pdp11/pdp11.opt:83 +-msgid "Do not use hardware floating point" +-msgstr "No usa coma flotant de maquinari" +- +-#: config/rs6000/rs6000.opt:116 +-msgid "Do not generate load/store with update instructions" +-msgstr "No generar load/store amb instruccions d'actualització" +- +-#: config/rs6000/rs6000.opt:120 +-msgid "Generate load/store with update instructions" +-msgstr "Generar load/store amb instruccions d'actualització" +- +-#: config/rs6000/rs6000.opt:124 +-#, fuzzy +-msgid "Do not generate fused multiply/add instructions" +-msgstr "No generar instruccions multiply/add de curt circuit" +- +-#: config/rs6000/rs6000.opt:128 +-msgid "Generate fused multiply/add instructions" +-msgstr "Generar instruccions multiply/add de curt circuit" +- +-#: config/rs6000/rs6000.opt:132 +-#, fuzzy +-msgid "Schedule the start and end of the procedure" +-msgstr "No calendaritzar l'inici i el final del procediment" +- +-#: config/rs6000/rs6000.opt:139 +-msgid "Return all structures in memory (AIX default)" +-msgstr "Regressar totes les estructures en memòria (per omissió en AIX)" +- +-#: config/rs6000/rs6000.opt:143 +-msgid "Return small structures in registers (SVR4 default)" +-msgstr "Regressar les petites estructures en registres (per omissió en SVR4)" +- +-#: config/rs6000/rs6000.opt:151 +-#, fuzzy +-msgid "Generate software reciprocal sqrt for better throughput" +-msgstr "Generar arrel quadrada «inline», optimitzar per a sortida" +- +-#: config/rs6000/rs6000.opt:155 +-#, fuzzy +-msgid "Do not place floating point constants in TOC" +-msgstr "No col·locar les constants de coma flotant en TOC" +- +-#: config/rs6000/rs6000.opt:159 +-msgid "Place floating point constants in TOC" +-msgstr "Col·locar les constants de coma flotant en TOC" +- +-#: config/rs6000/rs6000.opt:163 +-#, fuzzy +-msgid "Do not place symbol+offset constants in TOC" +-msgstr "No col·locar les constants símbol+desplaçament en TOC" +- +-#: config/rs6000/rs6000.opt:167 +-msgid "Place symbol+offset constants in TOC" +-msgstr "Col·locar les constants símbol+desplaçament en TOC" +- +-#: config/rs6000/rs6000.opt:178 +-msgid "Use only one TOC entry per procedure" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:182 +-msgid "Put everything in the regular TOC" +-msgstr "Col·locar tot en el TOC normal" +- +-#: config/rs6000/rs6000.opt:186 +-msgid "Generate VRSAVE instructions when generating AltiVec code" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:190 +-msgid "Deprecated option. Use -mvrsave/-mno-vrsave instead" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:194 +-#, fuzzy +-msgid "Generate isel instructions" +-msgstr "Generar instruccions char" +- +-#: config/rs6000/rs6000.opt:198 +-msgid "Deprecated option. Use -misel/-mno-isel instead" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:202 +-#, fuzzy +-msgid "Generate SPE SIMD instructions on E500" +-msgstr "Generar instruccions char" +- +-#: config/rs6000/rs6000.opt:206 +-#, fuzzy +-msgid "Generate PPC750CL paired-single instructions" +-msgstr "Generar instruccions char" +- +-#: config/rs6000/rs6000.opt:210 +-msgid "Deprecated option. Use -mspe/-mno-spe instead" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:214 +-msgid "Enable debug output" +-msgstr "Activar la sortida de depuració" +- +-#: config/rs6000/rs6000.opt:218 +-msgid "Specify ABI to use" +-msgstr "Especificar el ABI a utilitzar" +- +-#: config/rs6000/rs6000.opt:230 +-msgid "Select full, part, or no traceback table" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:234 +-#, fuzzy +-msgid "Avoid all range limits on call instructions" +-msgstr "Evitar tots els límits de rang en les instruccions de crides" +- +-#: config/rs6000/rs6000.opt:238 +-msgid "Warn about deprecated 'vector long ...' AltiVec type usage" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:242 +-msgid "Select GPR floating point method" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:246 +-msgid "Specify size of long double (64 or 128 bits)" +-msgstr "Especificar la grandària de long double (64 o 128 bits)" +- +-#: config/rs6000/rs6000.opt:250 +-msgid "Determine which dependences between insns are considered costly" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:254 +-msgid "Specify which post scheduling nop insertion scheme to apply" +-msgstr "" +- +-#: config/rs6000/rs6000.opt:258 +-#, fuzzy +-msgid "Specify alignment of structure fields default/natural" +-msgstr "Especificar l'alineació mínima de bit de les estructures" +- +-#: config/rs6000/rs6000.opt:262 +-msgid "Specify scheduling priority for dispatch slot restricted insns" +-msgstr "" +- +-#: config/rs6000/aix64.opt:24 +-msgid "Compile for 64-bit pointers" +-msgstr "Compilar per a punters de 64-bit" +- +-#: config/rs6000/aix64.opt:28 +-msgid "Compile for 32-bit pointers" +-msgstr "Compilar per a punters de 32-bit" +- +-#: config/rs6000/linux64.opt:24 +-#, fuzzy +-msgid "Call mcount for profiling before a function prologue" +-msgstr "No moure les instruccions al pròleg d'una funció" +- +-#: config/rs6000/sysv4.opt:24 +-msgid "Select ABI calling convention" +-msgstr "Seleccionar la convenció de cridada ABI" +- +-#: config/rs6000/sysv4.opt:28 +-msgid "Select method for sdata handling" +-msgstr "Seleccionar el mètode per al maneig de sdata" +- +-#: config/rs6000/sysv4.opt:36 config/rs6000/sysv4.opt:40 +-msgid "Align to the base type of the bit-field" +-msgstr "Alinear al tipus base del camp de bit" +- +-#: config/rs6000/sysv4.opt:45 config/rs6000/sysv4.opt:49 +-msgid "Produce code relocatable at runtime" +-msgstr "Produir codi re-ubicable en el moment d'execució" +- +-#: config/rs6000/sysv4.opt:53 config/rs6000/sysv4.opt:57 +-msgid "Produce little endian code" +-msgstr "Produir codi little endian" +- +-#: config/rs6000/sysv4.opt:61 config/rs6000/sysv4.opt:65 +-msgid "Produce big endian code" +-msgstr "Produir codi big endian" +- +-#: config/rs6000/sysv4.opt:70 config/rs6000/sysv4.opt:74 +-#: config/rs6000/sysv4.opt:83 config/rs6000/sysv4.opt:100 +-#: config/rs6000/sysv4.opt:128 config/rs6000/sysv4.opt:140 +-msgid "no description yet" +-msgstr "sense descripció encara" +- +-#: config/rs6000/sysv4.opt:78 +-msgid "Assume all variable arg functions are prototyped" +-msgstr "" +- +-#: config/rs6000/sysv4.opt:87 +-msgid "Use EABI" +-msgstr "Usar EABI" +- +-#: config/rs6000/sysv4.opt:91 +-#, fuzzy +-msgid "Allow bit-fields to cross word boundaries" +-msgstr "No permetre que els camps de bits creuin els límits de word" +- +-#: config/rs6000/sysv4.opt:95 +-msgid "Use alternate register names" +-msgstr "Usar noms de registre alternats" +- +-#: config/rs6000/sysv4.opt:104 +-msgid "Link with libsim.a, libc.a and sim-crt0.o" +-msgstr "Enllaçar amb libsim.a, libc.a i sim-crt0.o" +- +-#: config/rs6000/sysv4.opt:108 +-msgid "Link with libads.a, libc.a and crt0.o" +-msgstr "Enllaçar amb libads.a, libc.a i crt0.o" +- +-#: config/rs6000/sysv4.opt:112 +-msgid "Link with libyk.a, libc.a and crt0.o" +-msgstr "Enllaçar amb libyk.a, libc.a i crt0.o" +- +-#: config/rs6000/sysv4.opt:116 +-msgid "Link with libmvme.a, libc.a and crt0.o" +-msgstr "Enllaçar amb libmvme.a, libc.a i crt0.o" +- +-#: config/rs6000/sysv4.opt:120 +-msgid "Set the PPC_EMB bit in the ELF flags header" +-msgstr "Activar el bit PPC_EMB en els interruptors de l'encapçalat ELF" +- +-#: config/rs6000/sysv4.opt:124 +-msgid "Use the WindISS simulator" +-msgstr "" +- +-#: config/rs6000/sysv4.opt:144 +-#, fuzzy +-msgid "Generate code to use a non-exec PLT and GOT" +-msgstr "Generar codi per a un Sun Sky board" +- +-#: config/rs6000/sysv4.opt:148 +-#, fuzzy +-msgid "Generate code for old exec BSS PLT" +-msgstr "Generar codi per a un Sun FPA" +- +-#: config/spu/spu.opt:20 +-msgid "Emit warnings when run-time relocations are generated" +-msgstr "" +- +-#: config/spu/spu.opt:24 +-msgid "Emit errors when run-time relocations are generated" +-msgstr "" +- +-#: config/spu/spu.opt:28 +-msgid "Specify cost of branches (Default 20)" +-msgstr "" +- +-#: config/spu/spu.opt:32 +-#, fuzzy +-msgid "Make sure loads and stores are not moved past DMA instructions" +-msgstr "Generar load/store amb instruccions d'actualització" +- +-#: config/spu/spu.opt:36 +-msgid "volatile must be specified on any memory that is effected by DMA" +-msgstr "" +- +-#: config/spu/spu.opt:40 +-#, fuzzy +-msgid "Use standard main function as entry for startup" +-msgstr "Usar jsr i rts per a crides i retorns de funció" +- +-#: config/spu/spu.opt:44 +-#, fuzzy +-msgid "Generate branch hints for branches" +-msgstr "Generar instruccions de cadena per a moviment de blocs" +- +-#: config/spu/spu.opt:48 +-#, fuzzy +-msgid "Generate code for 18 bit addressing" +-msgstr "Generar codi per a big endian" +- +-#: config/spu/spu.opt:52 +-#, fuzzy +-msgid "Generate code for 32 bit addressing" +-msgstr "Generar codi per a big endian" +- +-#: config/mcore/mcore.opt:23 +-#, fuzzy +-msgid "Generate code for the M*Core M210" +-msgstr "Generar codi per a M*Core M340" +- +-#: config/mcore/mcore.opt:27 +-msgid "Generate code for the M*Core M340" +-msgstr "Generar codi per a M*Core M340" +- +-#: config/mcore/mcore.opt:31 +-msgid "Set maximum alignment to 4" +-msgstr "Establir l'alineació màxima a 4" +- +-#: config/mcore/mcore.opt:35 +-msgid "Force functions to be aligned to a 4 byte boundary" +-msgstr "Forçar que les funcions s'alineïn a un límit de 4 octet" +- +-#: config/mcore/mcore.opt:39 +-msgid "Set maximum alignment to 8" +-msgstr "Establir l'alineació màxima a 8" +- +-#: config/mcore/mcore.opt:43 config/score/score.opt:23 +-#, fuzzy +-msgid "Generate big-endian code" +-msgstr "Generar codi big endian" +- +-#: config/mcore/mcore.opt:47 +-msgid "Emit call graph information" +-msgstr "Emetre informació de graf de crides" +- +-#: config/mcore/mcore.opt:51 +-#, fuzzy +-msgid "Use the divide instruction" +-msgstr "No usar la instrucció divideix" +- +-#: config/mcore/mcore.opt:55 +-msgid "Inline constants if it can be done in 2 insns or less" +-msgstr "«inline» constants si pot ser fet en 2 insns o menys" +- +-#: config/mcore/mcore.opt:59 config/score/score.opt:27 +-#, fuzzy +-msgid "Generate little-endian code" +-msgstr "Generar codi little endian" +- +-#: config/mcore/mcore.opt:67 +-#, fuzzy +-msgid "Use arbitrary sized immediates in bit operations" +-msgstr "No intervenir en immediats de grandàries arbitràries en operacions de bit" +- +-#: config/mcore/mcore.opt:71 +-msgid "Prefer word accesses over byte accesses" +-msgstr "Preferir accessos word sobre accés octet" +- +-#: config/mcore/mcore.opt:75 +-#, fuzzy +-msgid "Set the maximum amount for a single stack increment operation" +-msgstr "Quantitat màxima per a una sola operació d'increment de pila" +- +-#: config/mcore/mcore.opt:79 +-#, fuzzy +-msgid "Always treat bitfields as int-sized" +-msgstr "Tractar sempre als camps de bit com de grandària int" +- +-#: config/arc/arc.opt:32 +-msgid "Prepend the name of the cpu to all public symbol names" +-msgstr "" +- +-#: config/arc/arc.opt:42 +-#, fuzzy +-msgid "Compile code for ARC variant CPU" +-msgstr "Codi de planificador per al CPU donat" +- +-#: config/arc/arc.opt:46 +-msgid "Put functions in SECTION" +-msgstr "" +- +-#: config/arc/arc.opt:50 +-msgid "Put data in SECTION" +-msgstr "" +- +-#: config/arc/arc.opt:54 +-msgid "Put read-only data in SECTION" +-msgstr "" +- +-#: config/sh/sh.opt:44 +-#, fuzzy +-msgid "Generate SH1 code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:48 +-#, fuzzy +-msgid "Generate SH2 code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:52 +-#, fuzzy +-msgid "Generate SH2a code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:56 +-#, fuzzy +-msgid "Generate SH2a FPU-less code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:60 +-#, fuzzy +-msgid "Generate default single-precision SH2a code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:64 +-#, fuzzy +-msgid "Generate only single-precision SH2a code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:68 +-#, fuzzy +-msgid "Generate SH2e code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:72 +-#, fuzzy +-msgid "Generate SH3 code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:76 +-#, fuzzy +-msgid "Generate SH3e code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:80 +-#, fuzzy +-msgid "Generate SH4 code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:84 +-#, fuzzy +-msgid "Generate SH4-100 code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:88 +-#, fuzzy +-msgid "Generate SH4-200 code" +-msgstr "Generar codi H8S/2600" +- +-#: config/sh/sh.opt:94 +-#, fuzzy +-msgid "Generate SH4-300 code" +-msgstr "Generar codi H8/300H" +- +-#: config/sh/sh.opt:98 +-#, fuzzy +-msgid "Generate SH4 FPU-less code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:102 +-#, fuzzy +-msgid "Generate SH4-100 FPU-less code" +-msgstr "Generar codi H8/300H" +- +-#: config/sh/sh.opt:106 +-#, fuzzy +-msgid "Generate SH4-200 FPU-less code" +-msgstr "Generar codi H8S/2600" +- +-#: config/sh/sh.opt:110 +-#, fuzzy +-msgid "Generate SH4-300 FPU-less code" +-msgstr "Generar codi H8/300H" +- +-#: config/sh/sh.opt:114 +-#, fuzzy +-msgid "Generate code for SH4 340 series (MMU/FPU-less)" +-msgstr "Generar codi per al CPU C30" +- +-#: config/sh/sh.opt:119 +-#, fuzzy +-msgid "Generate code for SH4 400 series (MMU/FPU-less)" +-msgstr "Generar codi per al CPU C40" +- +-#: config/sh/sh.opt:124 +-#, fuzzy +-msgid "Generate code for SH4 500 series (FPU-less)." +-msgstr "Generar codi per al CPU C40" +- +-#: config/sh/sh.opt:129 +-#, fuzzy +-msgid "Generate default single-precision SH4 code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:133 +-msgid "Generate default single-precision SH4-100 code" +-msgstr "" +- +-#: config/sh/sh.opt:137 +-msgid "Generate default single-precision SH4-200 code" +-msgstr "" +- +-#: config/sh/sh.opt:141 +-msgid "Generate default single-precision SH4-300 code" +-msgstr "" +- +-#: config/sh/sh.opt:145 +-#, fuzzy +-msgid "Generate only single-precision SH4 code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:149 +-#, fuzzy +-msgid "Generate only single-precision SH4-100 code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:153 +-#, fuzzy +-msgid "Generate only single-precision SH4-200 code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:157 +-#, fuzzy +-msgid "Generate only single-precision SH4-300 code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:161 +-#, fuzzy +-msgid "Generate SH4a code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:165 +-#, fuzzy +-msgid "Generate SH4a FPU-less code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:169 +-#, fuzzy +-msgid "Generate default single-precision SH4a code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:173 +-#, fuzzy +-msgid "Generate only single-precision SH4a code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:177 +-#, fuzzy +-msgid "Generate SH4al-dsp code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:181 +-#, fuzzy +-msgid "Generate 32-bit SHmedia code" +-msgstr "Generar codi 32 bit per a i386" +- +-#: config/sh/sh.opt:185 +-#, fuzzy +-msgid "Generate 32-bit FPU-less SHmedia code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:189 +-#, fuzzy +-msgid "Generate 64-bit SHmedia code" +-msgstr "Generar codi 64 bit per a x86-64" +- +-#: config/sh/sh.opt:193 +-#, fuzzy +-msgid "Generate 64-bit FPU-less SHmedia code" +-msgstr "Generar codi little endian" +- +-#: config/sh/sh.opt:197 +-#, fuzzy +-msgid "Generate SHcompact code" +-msgstr "Generar codi SA" +- +-#: config/sh/sh.opt:201 +-#, fuzzy +-msgid "Generate FPU-less SHcompact code" +-msgstr "Generar codi relatiu al pc" +- +-#: config/sh/sh.opt:205 +-msgid "Throttle unrolling to avoid thrashing target registers unless the unroll benefit outweighs this" +-msgstr "" +- +-#: config/sh/sh.opt:209 +-#, fuzzy +-msgid "Generate code in big endian mode" +-msgstr "Generar codi per a big endian" +- +-#: config/sh/sh.opt:213 +-#, fuzzy +-msgid "Generate 32-bit offsets in switch tables" +-msgstr "Usar entrades de 4 octet en les matrius de «switch»" +- +-#: config/sh/sh.opt:217 +-msgid "Cost to assume for a branch insn" +-msgstr "" +- +-#: config/sh/sh.opt:221 +-msgid "Enable cbranchdi4 pattern" +-msgstr "" +- +-#: config/sh/sh.opt:225 +-msgid "Expand cbranchdi4 pattern early into separate comparisons and branches." +-msgstr "" +- +-#: config/sh/sh.opt:229 +-msgid "Emit cmpeqdi_t pattern even when -mcbranchdi and -mexpand-cbranchdi are in effect." +-msgstr "" +- +-#: config/sh/sh.opt:233 +-msgid "Enable SH5 cut2 workaround" +-msgstr "" +- +-#: config/sh/sh.opt:237 +-#, fuzzy +-msgid "Align doubles at 64-bit boundaries" +-msgstr "Alinear les variables en un límit de 16-bit" +- +-#: config/sh/sh.opt:241 +-msgid "Division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp, call-div1, call-fp, call-table" +-msgstr "" +- +-#: config/sh/sh.opt:245 +-#, fuzzy +-msgid "Specify name for 32 bit signed division function" +-msgstr "Especificar un nom alternatiu per a la secció bss" +- +-#: config/sh/sh.opt:252 +-#, fuzzy +-msgid "Enable the use of the fused floating point multiply-accumulate operation" +-msgstr "Activar l'ús de les instruccions short load" +- +-#: config/sh/sh.opt:256 +-msgid "Cost to assume for gettr insn" +-msgstr "" +- +-#: config/sh/sh.opt:260 config/sh/sh.opt:310 +-msgid "Follow Renesas (formerly Hitachi) / SuperH calling conventions" +-msgstr "" +- +-#: config/sh/sh.opt:264 +-msgid "Increase the IEEE compliance for floating-point code" +-msgstr "" +- +-#: config/sh/sh.opt:268 +-msgid "Enable the use of the indexed addressing mode for SHmedia32/SHcompact" +-msgstr "" +- +-#: config/sh/sh.opt:272 +-msgid "inline code to invalidate instruction cache entries after setting up nested function trampolines" +-msgstr "" +- +-#: config/sh/sh.opt:276 +-msgid "Assume symbols might be invalid" +-msgstr "" +- +-#: config/sh/sh.opt:280 +-msgid "Annotate assembler instructions with estimated addresses" +-msgstr "" +- +-#: config/sh/sh.opt:284 +-#, fuzzy +-msgid "Generate code in little endian mode" +-msgstr "Generar codi per a little endian" +- +-#: config/sh/sh.opt:288 +-#, fuzzy +-msgid "Mark MAC register as call-clobbered" +-msgstr "nom de registre desconegut \"%s\" en \"asm\"" +- +-#: config/sh/sh.opt:294 +-msgid "Make structs a multiple of 4 bytes (warning: ABI altered)" +-msgstr "" +- +-#: config/sh/sh.opt:298 +-msgid "Emit function-calls using global offset table when generating PIC" +-msgstr "" +- +-#: config/sh/sh.opt:302 +-#, fuzzy +-msgid "Assume pt* instructions won't trap" +-msgstr "Les operacions de coma flotant poden capturar" +- +-#: config/sh/sh.opt:306 +-msgid "Shorten address references during linking" +-msgstr "" +- +-#: config/sh/sh.opt:314 +-msgid "Deprecated. Use -Os instead" +-msgstr "" +- +-#: config/sh/sh.opt:318 +-msgid "Cost to assume for a multiply insn" +-msgstr "" +- +-#: config/sh/sh.opt:322 +-msgid "Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if the inline code would not work in user mode." +-msgstr "" +- +-#: config/sh/sh.opt:328 +-msgid "Pretend a branch-around-a-move is a conditional move." +-msgstr "" +- +-#: config/sh/superh.opt:6 +-msgid "Board name [and memory region]." +-msgstr "" +- +-#: config/sh/superh.opt:10 +-#, fuzzy +-msgid "Runtime name." +-msgstr "No hi ha fitxers d'entrada" +- +-#: config/arm/arm.opt:23 +-msgid "Specify an ABI" +-msgstr "Especificar un ABI" +- +-#: config/arm/arm.opt:27 +-msgid "Generate a call to abort if a noreturn function returns" +-msgstr "Generar una cridada a avortar si una funció \"noreturn\" retorna" +- +-#: config/arm/arm.opt:34 +-msgid "Pass FP arguments in FP registers" +-msgstr "Passar els arguments FP en els registres FP" +- +-#: config/arm/arm.opt:38 +-msgid "Generate APCS conformant stack frames" +-msgstr "Generar marcs de pila que compleixin amb APCS" +- +-#: config/arm/arm.opt:42 +-msgid "Generate re-entrant, PIC code" +-msgstr "Generar codi PIC que es torna a introduir" +- +-#: config/arm/arm.opt:56 +-msgid "Assume target CPU is configured as big endian" +-msgstr "Assumir que el CPU destinació està configurat com big endian" +- +-#: config/arm/arm.opt:60 +-msgid "Thumb: Assume non-static functions may be called from ARM code" +-msgstr "Thumb: Assumir que les funcions no static poden ser crides des de codi ARM" +- +-#: config/arm/arm.opt:64 +-msgid "Thumb: Assume function pointers may go to non-Thumb aware code" +-msgstr "Thumb: Assumir que els punters de funció poden anar a codi no informat sobre Thumb" +- +-#: config/arm/arm.opt:68 +-msgid "Cirrus: Place NOPs to avoid invalid instruction combinations" +-msgstr "" +- +-#: config/arm/arm.opt:72 config/bfin/bfin.opt:27 +-msgid "Specify the name of the target CPU" +-msgstr "Especificar el nom del CPU destinació" +- +-#: config/arm/arm.opt:76 +-#, fuzzy +-msgid "Specify if floating point hardware should be used" +-msgstr "Especifica la versió de l'emulador de nombre de coma flotant" +- +-#: config/arm/arm.opt:90 +-#, fuzzy +-msgid "Specify the name of the target floating point hardware/format" +-msgstr "Especifica la versió de l'emulador de nombre de coma flotant" +- +-#: config/arm/arm.opt:94 +-msgid "Alias for -mfloat-abi=hard" +-msgstr "" +- +-#: config/arm/arm.opt:98 +-msgid "Assume target CPU is configured as little endian" +-msgstr "Assumir que el CPU destinació està configurat com little endian" +- +-#: config/arm/arm.opt:102 +-msgid "Generate call insns as indirect calls, if necessary" +-msgstr "Generar les crides insns com crides indirectes, si és necessari" +- +-#: config/arm/arm.opt:106 +-msgid "Specify the register to be used for PIC addressing" +-msgstr "Especificar el registre a usar per l'adreçament PIC" +- +-#: config/arm/arm.opt:110 +-msgid "Store function names in object code" +-msgstr "Emmagatzemar noms de funció en el codi objecte" +- +-#: config/arm/arm.opt:114 +-#, fuzzy +-msgid "Permit scheduling of a function's prologue sequence" +-msgstr "Usar caps per als pròlegs de funció" +- +-#: config/arm/arm.opt:118 +-msgid "Do not load the PIC register in function prologues" +-msgstr "No carregar el registre PIC en els pròlegs de funció" +- +-#: config/arm/arm.opt:122 +-msgid "Alias for -mfloat-abi=soft" +-msgstr "" +- +-#: config/arm/arm.opt:126 +-msgid "Specify the minimum bit alignment of structures" +-msgstr "Especificar l'alineació mínima de bit de les estructures" +- +-#: config/arm/arm.opt:130 +-msgid "Compile for the Thumb not the ARM" +-msgstr "Compilar per al Thumb on per al ARM" +- +-#: config/arm/arm.opt:134 +-msgid "Support calls between Thumb and ARM instruction sets" +-msgstr "Suport a crides entre els conjunts d'instruccions Thumb i ARM" +- +-#: config/arm/arm.opt:138 +-#, fuzzy +-msgid "Specify how to access the thread pointer" +-msgstr "Especificar el nom de l'arquitectura destinació" +- +-#: config/arm/arm.opt:142 +-msgid "Thumb: Generate (non-leaf) stack frames even if not needed" +-msgstr "Thumb: Generar marcs de pila (no-fulles) encara si no és necessari" +- +-#: config/arm/arm.opt:146 +-msgid "Thumb: Generate (leaf) stack frames even if not needed" +-msgstr "Thumb: Generar marcs de pila (fulles) encara si no és necessari" +- +-#: config/arm/arm.opt:150 +-#, fuzzy +-msgid "Tune code for the given processor" +-msgstr "Compilar per al processador v850" +- +-#: config/arm/arm.opt:154 +-msgid "Assume big endian bytes, little endian words" +-msgstr "Assumir octets big endian ,mots little endian" +- +-#: config/arm/arm.opt:158 +-msgid "Use Neon quad-word (rather than double-word) registers for vectorization" +-msgstr "" +- +-#: config/arm/pe.opt:23 +-msgid "Ignore dllimport attribute for functions" +-msgstr "Ignorar l'atribut dllimport per a les funcions" +- +-#: config/pdp11/pdp11.opt:23 +-msgid "Generate code for an 11/10" +-msgstr "Generar codi per a un 11/10" +- +-#: config/pdp11/pdp11.opt:27 +-msgid "Generate code for an 11/40" +-msgstr "Generar codi per a un 11/40" +- +-#: config/pdp11/pdp11.opt:31 +-msgid "Generate code for an 11/45" +-msgstr "5Generar codi per a un 11/45" +- +-#: config/pdp11/pdp11.opt:35 +-#, fuzzy +-msgid "Use 16-bit abs patterns" +-msgstr "Usar registres FP de 64 bits" +- +-#: config/pdp11/pdp11.opt:39 +-#, fuzzy +-msgid "Return floating-point results in ac0 (fr0 in Unix assembler syntax)" +-msgstr "Retorna els resultats en coma flotant en ac0" +- +-#: config/pdp11/pdp11.opt:43 +-msgid "Do not use inline patterns for copying memory" +-msgstr "" +- +-#: config/pdp11/pdp11.opt:47 +-msgid "Use inline patterns for copying memory" +-msgstr "" +- +-#: config/pdp11/pdp11.opt:51 +-msgid "Do not pretend that branches are expensive" +-msgstr "" +- +-#: config/pdp11/pdp11.opt:55 +-msgid "Pretend that branches are expensive" +-msgstr "" +- +-#: config/pdp11/pdp11.opt:59 +-#, fuzzy +-msgid "Use the DEC assembler syntax" +-msgstr "Usar sintaxi de l'ensamblador DEC" +- +-#: config/pdp11/pdp11.opt:63 +-msgid "Use 32 bit float" +-msgstr "Usar float de 32 bits" +- +-#: config/pdp11/pdp11.opt:67 +-msgid "Use 64 bit float" +-msgstr "Usar float de 64 bits" +- +-#: config/pdp11/pdp11.opt:75 +-msgid "Use 16 bit int" +-msgstr "Usar int de 16 bits" +- +-#: config/pdp11/pdp11.opt:79 +-msgid "Use 32 bit int" +-msgstr "Usar int de 32 bits" +- +-#: config/pdp11/pdp11.opt:87 +-msgid "Target has split I&D" +-msgstr "L'objectiu té un I&D dividit" +- +-#: config/pdp11/pdp11.opt:91 +-msgid "Use UNIX assembler syntax" +-msgstr "Usar sintaxi de l'ensamblador UNIX" +- +-#: config/avr/avr.opt:23 +-#, fuzzy +-msgid "Use subroutines for function prologues and epilogues" +-msgstr "Usar subrutines per al pròleg/epíleg de funció" +- +-#: config/avr/avr.opt:27 +-#, fuzzy +-msgid "Select the target MCU" +-msgstr "Especificar el nom del CPU destinació" +- +-#: config/avr/avr.opt:34 +-#, fuzzy +-msgid "Use an 8-bit 'int' type" +-msgstr "Usar tipus int de 64 bits" +- +-#: config/avr/avr.opt:38 +-msgid "Change the stack pointer without disabling interrupts" +-msgstr "Canviar el punter de la pila sense desactivar les interrupcions" +- +-#: config/avr/avr.opt:42 +-msgid "Do not generate tablejump insns" +-msgstr "No generar insns de salt de matriu" +- +-#: config/avr/avr.opt:52 +-msgid "Use rjmp/rcall (limited range) on >8K devices" +-msgstr "" +- +-#: config/avr/avr.opt:56 +-msgid "Output instruction sizes to the asm file" +-msgstr "Grandàries d'instrucció de sortida al fitxer asm" +- +-#: config/avr/avr.opt:60 +-msgid "Change only the low 8 bits of the stack pointer" +-msgstr "Canviar només els 8 bits baixos del punter de pila" +- +-#: config/crx/crx.opt:23 +-#, fuzzy +-msgid "Support multiply accumulate instructions" +-msgstr "Usar instruccions de fp per a multiplicar-acumular" +- +-#: config/crx/crx.opt:27 +-#, fuzzy +-msgid "Do not use push to store function arguments" +-msgstr "No usar instruccions push per a guardar els arguments de sortida" +- +-#: config/crx/crx.opt:31 +-msgid "Restrict doloop to the given nesting level" +-msgstr "" +- +-#: config/c4x/c4x.opt:23 +-msgid "Generate code for C30 CPU" +-msgstr "Generar codi per al CPU C30" +- +-#: config/c4x/c4x.opt:27 +-msgid "Generate code for C31 CPU" +-msgstr "Generar codi per al CPU C31" +- +-#: config/c4x/c4x.opt:31 +-msgid "Generate code for C32 CPU" +-msgstr "Generar codi per al CPU C32" +- +-#: config/c4x/c4x.opt:35 +-msgid "Generate code for C33 CPU" +-msgstr "Generar codi per al CPU C33" +- +-#: config/c4x/c4x.opt:39 +-msgid "Generate code for C40 CPU" +-msgstr "Generar codi per al CPU C40" +- +-#: config/c4x/c4x.opt:43 +-msgid "Generate code for C44 CPU" +-msgstr "Generar codi per al CPU C44" +- +-#: config/c4x/c4x.opt:47 +-msgid "Assume that pointers may be aliased" +-msgstr "Assumir que es poden fer alies dels punters" +- +-#: config/c4x/c4x.opt:51 +-msgid "Big memory model" +-msgstr "Model de memòria big" +- +-#: config/c4x/c4x.opt:55 +-msgid "Use the BK register as a general purpose register" +-msgstr "Usar el registre BK com un registre de propòsit general" +- +-#: config/c4x/c4x.opt:59 +-#, fuzzy +-msgid "Generate code for CPU" +-msgstr "Generar codi per al CPU C30" +- +-#: config/c4x/c4x.opt:63 +-msgid "Enable use of DB instruction" +-msgstr "Activar l'ús de la instrucció DB" +- +-#: config/c4x/c4x.opt:67 +-msgid "Enable debugging" +-msgstr "Activar la depuració" +- +-#: config/c4x/c4x.opt:71 +-msgid "Enable new features under development" +-msgstr "Activar noves característiques en desenvolupament" +- +-#: config/c4x/c4x.opt:75 +-msgid "Use fast but approximate float to integer conversion" +-msgstr "Usar conversió de coma flotant a enter ràpida però aproximada" +- +-#: config/c4x/c4x.opt:79 +-msgid "Force RTL generation to emit valid 3 operand insns" +-msgstr "Forçar que la generació de RTL emeti 3 operandes insns vàlids" +- +-#: config/c4x/c4x.opt:83 +-msgid "Force constants into registers to improve hoisting" +-msgstr "Forçar les constants dintre de registres per a millorar l'aixecament" +- +-#: config/c4x/c4x.opt:87 config/c4x/c4x.opt:111 +-msgid "Save DP across ISR in small memory model" +-msgstr "Guardar DP entre ISR en el model de memòria small" +- +-#: config/c4x/c4x.opt:91 +-msgid "Allow unsigned iteration counts for RPTB/DB" +-msgstr "Permetre comptes d'iteracions unsigned per a RPTB/DB" +- +-#: config/c4x/c4x.opt:95 +-msgid "Pass arguments on the stack" +-msgstr "Passar els arguments en la pila" +- +-#: config/c4x/c4x.opt:99 +-msgid "Use MPYI instruction for C3x" +-msgstr "Usar instrucció MPYI per a C3x" +- +-#: config/c4x/c4x.opt:103 +-msgid "Enable parallel instructions" +-msgstr "Activar les funcions paral·leles" +- +-#: config/c4x/c4x.opt:107 +-msgid "Enable MPY||ADD and MPY||SUB instructions" +-msgstr "Activar les instruccions MPY||ADD i MPY||SUB" +- +-#: config/c4x/c4x.opt:115 +-msgid "Preserve all 40 bits of FP reg across call" +-msgstr "Preservar els 40 bits del registre FP entre crides" +- +-#: config/c4x/c4x.opt:119 +-msgid "Pass arguments in registers" +-msgstr "Passar els arguments en els registres" +- +-#: config/c4x/c4x.opt:123 +-msgid "Enable use of RTPB instruction" +-msgstr "Activar l'ús de la instrucció RTPB" +- +-#: config/c4x/c4x.opt:127 +-msgid "Enable use of RTPS instruction" +-msgstr "Activar l'ús de la instrucció RTPS" +- +-#: config/c4x/c4x.opt:131 +-#, fuzzy +-msgid "Set the maximum number of iterations for RPTS to N" +-msgstr "Especificar el nombre màxim d'iteracions per a RPTS" +- +-#: config/c4x/c4x.opt:135 +-msgid "Small memory model" +-msgstr "Model de memòria small" +- +-#: config/c4x/c4x.opt:139 +-msgid "Emit code compatible with TI tools" +-msgstr "Emetre codi compatible amb les eines TI" +- +-#: config/pa/pa-hpux.opt:23 +-msgid "Generate cpp defines for server IO" +-msgstr "Generar definicions cpp per a IO de servidor" +- +-#: config/pa/pa-hpux.opt:27 config/pa/pa-hpux1010.opt:23 +-#: config/pa/pa-hpux1111.opt:23 +-msgid "Specify UNIX standard for predefines and linking" +-msgstr "" +- +-#: config/pa/pa-hpux.opt:31 +-msgid "Generate cpp defines for workstation IO" +-msgstr "Generar definicions cpp per a IO d'estació de treball" +- +-#: config/pa/pa.opt:23 config/pa/pa.opt:76 config/pa/pa.opt:84 +-msgid "Generate PA1.0 code" +-msgstr "Generar codi PA1.0" +- +-#: config/pa/pa.opt:27 config/pa/pa.opt:88 config/pa/pa.opt:108 +-msgid "Generate PA1.1 code" +-msgstr "Generar codi PA1.1" +- +-#: config/pa/pa.opt:31 config/pa/pa.opt:92 +-msgid "Generate PA2.0 code (requires binutils 2.10 or later)" +-msgstr "" +- +-#: config/pa/pa.opt:35 +-msgid "Generate code for huge switch statements" +-msgstr "Generar codi per a declaracions «switch» llargues" +- +-#: config/pa/pa.opt:39 +-msgid "Disable FP regs" +-msgstr "Desactivar els registres FP" +- +-#: config/pa/pa.opt:43 +-msgid "Disable indexed addressing" +-msgstr "Desactivar adreçament d'index" +- +-#: config/pa/pa.opt:47 +-msgid "Generate fast indirect calls" +-msgstr "Generar crides indirectes ràpides" +- +-#: config/pa/pa.opt:55 +-msgid "Assume code will be assembled by GAS" +-msgstr "" +- +-#: config/pa/pa.opt:59 +-msgid "Put jumps in call delay slots" +-msgstr "" +- +-#: config/pa/pa.opt:64 +-msgid "Enable linker optimizations" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: config/pa/pa.opt:68 +-msgid "Always generate long calls" +-msgstr "Generar sempre crides llargues" +- +-#: config/pa/pa.opt:72 +-msgid "Emit long load/store sequences" +-msgstr "" +- +-#: config/pa/pa.opt:80 +-msgid "Disable space regs" +-msgstr "" +- +-#: config/pa/pa.opt:96 +-msgid "Use portable calling conventions" +-msgstr "Usar convencions de cridada portable" +- +-#: config/pa/pa.opt:100 +-#, fuzzy +-msgid "Specify CPU for scheduling purposes. Valid arguments are 700, 7100, 7100LC, 7200, 7300, and 8000" +-msgstr "" +-"opció -mschedule= desconeguda (%s).\n" +-"Les opcions vàlides són 700, 7100, 7100LC, 7200, 7300, i 8000\n" +- +-#: config/pa/pa.opt:112 +-msgid "Do not disable space regs" +-msgstr "No desactivar registres d'espai" +- +-#: config/pa/pa64-hpux.opt:23 +-msgid "Assume code will be linked by GNU ld" +-msgstr "" +- +-#: config/pa/pa64-hpux.opt:27 +-msgid "Assume code will be linked by HP ld" +-msgstr "" +- +-#: config/xtensa/xtensa.opt:23 +-#, fuzzy +-msgid "Use CONST16 instruction to load constants" +-msgstr "Usar instruccions push per a guardar els arguments de sortida" +- +-#: config/xtensa/xtensa.opt:27 +-msgid "Enable fused multiply/add and multiply/subtract FP instructions" +-msgstr "Activar les instruccions FP multiply/add i multiply/substract de curt circuit" +- +-#: config/xtensa/xtensa.opt:31 +-msgid "Use indirect CALLXn instructions for large programs" +-msgstr "Usar instruccions CALLXn indirectes per a programes grans" +- +-#: config/xtensa/xtensa.opt:35 +-msgid "Automatically align branch targets to reduce branch penalties" +-msgstr "Alinear automàticament els objectius de les ramificacions per a reduir les faltes de ramificació" +- +-#: config/xtensa/xtensa.opt:39 +-msgid "Intersperse literal pools with code in the text section" +-msgstr "Entremesclar els conjunts de literals amb codi en la secció de text" +- +-#: config/stormy16/stormy16.opt:24 +-msgid "Provide libraries for the simulator" +-msgstr "" +- +-#: config/mips/mips.opt:23 +-#, fuzzy +-msgid "Generate code that conforms to the given ABI" +-msgstr "Generar codi per al CPU donat" +- +-#: config/mips/mips.opt:27 +-msgid "Generate code that can be used in SVR4-style dynamic objects" +-msgstr "" +- +-#: config/mips/mips.opt:31 +-#, fuzzy +-msgid "Use PMC-style 'mad' instructions" +-msgstr "Usar instruccions de camps de bit" +- +-#: config/mips/mips.opt:35 +-#, fuzzy +-msgid "Generate code for the given ISA" +-msgstr "Generar codi per al CPU donat" +- +-#: config/mips/mips.opt:39 +-#, fuzzy +-msgid "Set the cost of branches to roughly COST instructions" +-msgstr "Activar l'ús de les instruccions short load" +- +-#: config/mips/mips.opt:43 +-msgid "Use Branch Likely instructions, overriding the architecture default" +-msgstr "" +- +-#: config/mips/mips.opt:47 +-msgid "Switch on/off MIPS16 ASE on alternating functions for compiler testing" +-msgstr "" +- +-#: config/mips/mips.opt:51 +-msgid "Trap on integer divide by zero" +-msgstr "Atrapar la divisió entera per zero" +- +-#: config/mips/mips.opt:55 +-msgid "Specify when instructions are allowed to access code" +-msgstr "" +- +-#: config/mips/mips.opt:59 +-msgid "Use branch-and-break sequences to check for integer divide by zero" +-msgstr "" +- +-#: config/mips/mips.opt:63 +-#, fuzzy +-msgid "Use trap instructions to check for integer divide by zero" +-msgstr "Atrapar la divisió entera per zero" +- +-#: config/mips/mips.opt:67 +-#, fuzzy +-msgid "Allow the use of MDMX instructions" +-msgstr "Activar l'ús de la instrucció DB" +- +-#: config/mips/mips.opt:71 +-msgid "Allow hardware floating-point instructions to cover both 32-bit and 64-bit operations" +-msgstr "" +- +-#: config/mips/mips.opt:75 +-#, fuzzy +-msgid "Use MIPS-DSP instructions" +-msgstr "No usar instruccions MIPS16" +- +-#: config/mips/mips.opt:79 +-#, fuzzy +-msgid "Use MIPS-DSP REV 2 instructions" +-msgstr "Usar el conjunt d'instruccions POWER2" +- +-#: config/mips/mips.opt:89 +-msgid "Use big-endian byte order" +-msgstr "Usar ordre de bit big-endian" +- +-#: config/mips/mips.opt:93 +-msgid "Use little-endian byte order" +-msgstr "Usar ordre de bit little-endian" +- +-#: config/mips/mips.opt:97 config/iq2000/iq2000.opt:31 +-msgid "Use ROM instead of RAM" +-msgstr "Usar ROM enlloc de RAM" +- +-#: config/mips/mips.opt:101 +-msgid "Use NewABI-style %reloc() assembly operators" +-msgstr "" +- +-#: config/mips/mips.opt:105 +-msgid "Use -G for data that is not defined by the current object" +-msgstr "" +- +-#: config/mips/mips.opt:109 +-#, fuzzy +-msgid "Work around certain R4000 errata" +-msgstr "Evitar el bug del primer maquinari 4300" +- +-#: config/mips/mips.opt:113 +-#, fuzzy +-msgid "Work around certain R4400 errata" +-msgstr "Evitar el bug del primer maquinari 4300" +- +-#: config/mips/mips.opt:117 +-msgid "Work around errata for early SB-1 revision 2 cores" +-msgstr "" +- +-#: config/mips/mips.opt:121 +-msgid "Work around certain VR4120 errata" +-msgstr "" +- +-#: config/mips/mips.opt:125 +-msgid "Work around VR4130 mflo/mfhi errata" +-msgstr "" +- +-#: config/mips/mips.opt:129 +-#, fuzzy +-msgid "Work around an early 4300 hardware bug" +-msgstr "Evitar el bug del primer maquinari 4300" +- +-#: config/mips/mips.opt:133 +-#, fuzzy +-msgid "FP exceptions are enabled" +-msgstr "opcions activades: " +- +-#: config/mips/mips.opt:137 +-#, fuzzy +-msgid "Use 32-bit floating-point registers" +-msgstr "Usar registres generals de 32 bits" +- +-#: config/mips/mips.opt:141 +-#, fuzzy +-msgid "Use 64-bit floating-point registers" +-msgstr "Usar registres generals de 64 bits" +- +-#: config/mips/mips.opt:145 +-msgid "Use FUNC to flush the cache before calling stack trampolines" +-msgstr "" +- +-#: config/mips/mips.opt:149 +-#, fuzzy +-msgid "Generate floating-point multiply-add instructions" +-msgstr "Generar instruccions multiply/add de curt circuit" +- +-#: config/mips/mips.opt:153 +-msgid "Use 32-bit general registers" +-msgstr "Usar registres generals de 32 bits" +- +-#: config/mips/mips.opt:157 +-msgid "Use 64-bit general registers" +-msgstr "Usar registres generals de 64 bits" +- +-#: config/mips/mips.opt:161 +-msgid "Use GP-relative addressing to access small data" +-msgstr "" +- +-#: config/mips/mips.opt:165 +-#, fuzzy +-msgid "Allow the use of hardware floating-point ABI and instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/mips/mips.opt:169 +-msgid "Generate code that can be safely linked with MIPS16 code." +-msgstr "" +- +-#: config/mips/mips.opt:173 +-#, fuzzy +-msgid "Generate code for ISA level N" +-msgstr "Generar codi per a Intel as" +- +-#: config/mips/mips.opt:177 +-#, fuzzy +-msgid "Generate MIPS16 code" +-msgstr "Generar codi SA" +- +-#: config/mips/mips.opt:181 +-#, fuzzy +-msgid "Use MIPS-3D instructions" +-msgstr "No usar instruccions MIPS16" +- +-#: config/mips/mips.opt:185 +-#, fuzzy +-msgid "Use ll, sc and sync instructions" +-msgstr "Usar instruccions AltiVec" +- +-#: config/mips/mips.opt:189 +-msgid "Use -G for object-local data" +-msgstr "" +- +-#: config/mips/mips.opt:193 +-msgid "Use indirect calls" +-msgstr "Usar crides indirectes" +- +-#: config/mips/mips.opt:197 +-#, fuzzy +-msgid "Use a 32-bit long type" +-msgstr "Usar tipus long de 32 bits" +- +-#: config/mips/mips.opt:201 +-#, fuzzy +-msgid "Use a 64-bit long type" +-msgstr "Usar tipus long de 64 bits" +- +-#: config/mips/mips.opt:205 +-msgid "Don't optimize block moves" +-msgstr "No optimitzar els moviments de blocs" +- +-#: config/mips/mips.opt:209 +-#, fuzzy +-msgid "Use the mips-tfile postpass" +-msgstr "Usar mips-tfile asm postpass" +- +-#: config/mips/mips.opt:213 +-#, fuzzy +-msgid "Allow the use of MT instructions" +-msgstr "Activar l'ús de la instrucció RTPS" +- +-#: config/mips/mips.opt:217 +-msgid "Do not use a cache-flushing function before calling stack trampolines" +-msgstr "" +- +-#: config/mips/mips.opt:221 +-#, fuzzy +-msgid "Do not use MDMX instructions" +-msgstr "No usar instruccions AltiVec" +- +-#: config/mips/mips.opt:225 +-#, fuzzy +-msgid "Generate normal-mode code" +-msgstr "Generar codi SA" +- +-#: config/mips/mips.opt:229 +-#, fuzzy +-msgid "Do not use MIPS-3D instructions" +-msgstr "No usar instruccions MIPS16" +- +-#: config/mips/mips.opt:233 +-#, fuzzy +-msgid "Use paired-single floating-point instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/mips/mips.opt:237 +-msgid "When generating -mabicalls code, make the code suitable for use in shared libraries" +-msgstr "" +- +-#: config/mips/mips.opt:241 +-#, fuzzy +-msgid "Restrict the use of hardware floating-point instructions to 32-bit operations" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/mips/mips.opt:245 +-#, fuzzy +-msgid "Use SmartMIPS instructions" +-msgstr "No usar instruccions MIPS16" +- +-#: config/mips/mips.opt:249 +-#, fuzzy +-msgid "Prevent the use of all hardware floating-point instructions" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/mips/mips.opt:253 +-msgid "Optimize lui/addiu address loads" +-msgstr "Optimitzar les càrregues de les adreces lui/addiu" +- +-#: config/mips/mips.opt:257 +-#, fuzzy +-msgid "Assume all symbols have 32-bit values" +-msgstr "Assumir que tots els doubles estan alineats" +- +-#: config/mips/mips.opt:261 +-msgid "Optimize the output for PROCESSOR" +-msgstr "" +- +-#: config/mips/mips.opt:265 config/iq2000/iq2000.opt:44 +-msgid "Put uninitialized constants in ROM (needs -membedded-data)" +-msgstr "Posar les constants sense inicialitzar en ROM (necessita -membedded-data)" +- +-#: config/mips/mips.opt:269 +-#, fuzzy +-msgid "Perform VR4130-specific alignment optimizations" +-msgstr "Realitzar optimitzacions de filat de salts" +- +-#: config/mips/mips.opt:273 +-msgid "Lift restrictions on GOT size" +-msgstr "" +- +-#: config/mips/sdemtk.opt:23 +-#, fuzzy +-msgid "Prevent the use of all floating-point operations" +-msgstr "es requereixen registres booleans per a l'opció de coma flotant" +- +-#: config/fr30/fr30.opt:23 +-msgid "Assume small address space" +-msgstr "Assumint espai d'adreces petit" +- +-#: config/m68hc11/m68hc11.opt:23 config/m68hc11/m68hc11.opt:31 +-msgid "Compile for a 68HC11" +-msgstr "Compilar per a un 68HC11" +- +-#: config/m68hc11/m68hc11.opt:27 config/m68hc11/m68hc11.opt:35 +-msgid "Compile for a 68HC12" +-msgstr "Compilar per a un 68HC12" +- +-#: config/m68hc11/m68hc11.opt:41 config/m68hc11/m68hc11.opt:45 +-msgid "Compile for a 68HCS12" +-msgstr "Compilar per a un 68HCS12" +- +-#: config/m68hc11/m68hc11.opt:49 +-msgid "Auto pre/post decrement increment allowed" +-msgstr "Es permet el pre/post decrement increment automàtic" +- +-#: config/m68hc11/m68hc11.opt:53 +-msgid "Min/max instructions allowed" +-msgstr "" +- +-#: config/m68hc11/m68hc11.opt:57 +-msgid "Use call and rtc for function calls and returns" +-msgstr "Usar call i rtc per a crides i retorns de funció" +- +-#: config/m68hc11/m68hc11.opt:61 +-msgid "Auto pre/post decrement increment not allowed" +-msgstr "No es permet el pre/post decrement increment automàtic" +- +-#: config/m68hc11/m68hc11.opt:65 +-msgid "Use jsr and rts for function calls and returns" +-msgstr "Usar jsr i rts per a crides i retorns de funció" +- +-#: config/m68hc11/m68hc11.opt:69 +-msgid "Min/max instructions not allowed" +-msgstr "" +- +-#: config/m68hc11/m68hc11.opt:73 +-msgid "Use direct addressing mode for soft registers" +-msgstr "Usar el mode d'adreçament direct per a registres soft" +- +-#: config/m68hc11/m68hc11.opt:77 +-msgid "Compile with 32-bit integer mode" +-msgstr "Compilar amb el mode enter de 32-bit" +- +-#: config/m68hc11/m68hc11.opt:82 +-msgid "Specify the register allocation order" +-msgstr "Especificar l'ordre d'assignació de registres" +- +-#: config/m68hc11/m68hc11.opt:86 +-msgid "Do not use direct addressing mode for soft registers" +-msgstr "No usar el mode d'adreçament direct per a registres soft" +- +-#: config/m68hc11/m68hc11.opt:90 +-msgid "Compile with 16-bit integer mode" +-msgstr "Compilar amb el mode enter de 16-bit" +- +-#: config/m68hc11/m68hc11.opt:94 +-msgid "Indicate the number of soft registers available" +-msgstr "Indicar el nombre de registres suaus disponibles" +- +-#: config/vax/vax.opt:23 config/vax/vax.opt:27 +-msgid "Target DFLOAT double precision code" +-msgstr "" +- +-#: config/vax/vax.opt:31 config/vax/vax.opt:35 +-#, fuzzy +-msgid "Generate GFLOAT double precision code" +-msgstr "Generar codi little endian" +- +-#: config/vax/vax.opt:39 +-#, fuzzy +-msgid "Generate code for GNU assembler (gas)" +-msgstr "Generar codi per a GNU as" +- +-#: config/vax/vax.opt:43 +-#, fuzzy +-msgid "Generate code for UNIX assembler" +-msgstr "Generar codi per a GNU as" +- +-#: config/vax/vax.opt:47 +-#, fuzzy +-msgid "Use VAXC structure conventions" +-msgstr "Usar convencions de cridada portable" +- +-#: config/cris/linux.opt:27 +-msgid "Together with -fpic and -fPIC, do not use GOTPLT references" +-msgstr "Juntament amb -fpic i -fPIC, no utilitzar referències GOTPLT" +- +-#: config/cris/cris.opt:45 +-#, fuzzy +-msgid "Work around bug in multiplication instruction" +-msgstr "No usar instruccions de fp per a multiplicar-acumular" +- +-#: config/cris/cris.opt:51 +-msgid "Compile for ETRAX 4 (CRIS v3)" +-msgstr "Compilar per a ETRAX 4 (CRIS v3)" +- +-#: config/cris/cris.opt:56 +-msgid "Compile for ETRAX 100 (CRIS v8)" +-msgstr "Compilar per a ETRAX 100 (CRIS v8)" +- +-#: config/cris/cris.opt:64 +-msgid "Emit verbose debug information in assembly code" +-msgstr "Emetre informació de depuració detallada en el codi ensamblador" +- +-#: config/cris/cris.opt:71 +-msgid "Do not use condition codes from normal instructions" +-msgstr "No usar codis de condició per a les instruccions normals" +- +-#: config/cris/cris.opt:80 +-msgid "Do not emit addressing modes with side-effect assignment" +-msgstr "No emetre modes d'adreçament amb assignacions col·laterals" +- +-#: config/cris/cris.opt:89 +-msgid "Do not tune stack alignment" +-msgstr "No ajustar l'alineació de la pila" +- +-#: config/cris/cris.opt:98 +-msgid "Do not tune writable data alignment" +-msgstr "No ajustar l'alineació de les dades modificables" +- +-#: config/cris/cris.opt:107 +-msgid "Do not tune code and read-only data alignment" +-msgstr "No ajustar l'alineació del codi i de dades només de lectura" +- +-#: config/cris/cris.opt:116 +-msgid "Align code and data to 32 bits" +-msgstr "Alinear codi i dades a 32 bits" +- +-#: config/cris/cris.opt:133 +-msgid "Don't align items in code or data" +-msgstr "No alinear elements en el codi o les dades" +- +-#: config/cris/cris.opt:142 +-msgid "Do not emit function prologue or epilogue" +-msgstr "No emetre pròleg o epíleg de funcions" +- +-#: config/cris/cris.opt:149 +-msgid "Use the most feature-enabling options allowed by other options" +-msgstr "Usar la major quantitat de característiques permeses per altres opcions" +- +-#: config/cris/cris.opt:158 +-msgid "Override -mbest-lib-options" +-msgstr "Anular -mbest-lib-options" +- +-#: config/cris/cris.opt:165 +-msgid "Generate code for the specified chip or CPU version" +-msgstr "Generar codi per al xip especificat o la versió de CPU" +- +-#: config/cris/cris.opt:169 +-msgid "Tune alignment for the specified chip or CPU version" +-msgstr "Ajustar alineació per al xip especificat o la versió de CPU" +- +-#: config/cris/cris.opt:173 +-msgid "Warn when a stackframe is larger than the specified size" +-msgstr "Avisar quan un marc de pila sigui més gran que la grandària especificada" +- +-#: config/cris/aout.opt:27 +-msgid "Compile for the MMU-less Etrax 100-based elinux system" +-msgstr "Compilar per al sistema elinux Etrax basat en 100 sense MMU" +- +-#: config/cris/aout.opt:33 +-msgid "For elinux, request a specified stack-size for this program" +-msgstr "Per a elinux, sol·licitar una grandària de pila especificada per a aquest programa" +- +-#: config/h8300/h8300.opt:23 +-msgid "Generate H8S code" +-msgstr "Generar codi H8S" +- +-#: config/h8300/h8300.opt:27 +-#, fuzzy +-msgid "Generate H8SX code" +-msgstr "Generar codi H8S" +- +-#: config/h8300/h8300.opt:31 +-msgid "Generate H8S/2600 code" +-msgstr "Generar codi H8S/2600" +- +-#: config/h8300/h8300.opt:35 +-msgid "Make integers 32 bits wide" +-msgstr "Fer enters de 32 bits d'amplària" +- +-#: config/h8300/h8300.opt:42 +-msgid "Use registers for argument passing" +-msgstr "Usar registres per a pas de paràmetres" +- +-#: config/h8300/h8300.opt:46 +-msgid "Consider access to byte sized memory slow" +-msgstr "Considerar lent l'accés a la memòria de grandària octet" +- +-#: config/h8300/h8300.opt:50 +-msgid "Enable linker relaxing" +-msgstr "Activar la relaxació del enllaçador" +- +-#: config/h8300/h8300.opt:54 +-msgid "Generate H8/300H code" +-msgstr "Generar codi H8/300H" +- +-#: config/h8300/h8300.opt:58 +-msgid "Enable the normal mode" +-msgstr "" +- +-#: config/h8300/h8300.opt:62 +-msgid "Use H8/300 alignment rules" +-msgstr "Usar regles d'alineació H8/300" +- +-#: config/v850/v850.opt:23 +-#, fuzzy +-msgid "Use registers r2 and r5" +-msgstr "No usar els registres r2 i r5" +- +-#: config/v850/v850.opt:27 +-msgid "Use 4 byte entries in switch tables" +-msgstr "Usar entrades de 4 octet en les matrius de «switch»" +- +-#: config/v850/v850.opt:31 +-msgid "Enable backend debugging" +-msgstr "Habilitar la depuració per la fi" +- +-#: config/v850/v850.opt:35 +-msgid "Do not use the callt instruction" +-msgstr "No usar la instrucció callt" +- +-#: config/v850/v850.opt:39 +-msgid "Reuse r30 on a per function basis" +-msgstr "Reusar r30 basat per funció" +- +-#: config/v850/v850.opt:43 +-msgid "Support Green Hills ABI" +-msgstr "Dóna suport a l'ABI Green Hills" +- +-#: config/v850/v850.opt:47 +-msgid "Prohibit PC relative function calls" +-msgstr "Prohibir la crida a funcions relatives al PC" +- +-#: config/v850/v850.opt:51 +-msgid "Use stubs for function prologues" +-msgstr "Usar caps per als pròlegs de funció" +- +-#: config/v850/v850.opt:55 +-msgid "Set the max size of data eligible for the SDA area" +-msgstr "Establir la grandària màxima de dades elegibles per a l'àrea SDA" +- +-#: config/v850/v850.opt:59 +-msgid "Enable the use of the short load instructions" +-msgstr "Activar l'ús de les instruccions short load" +- +-#: config/v850/v850.opt:63 +-msgid "Same as: -mep -mprolog-function" +-msgstr "Igual que: -mep -mprolog-function" +- +-#: config/v850/v850.opt:67 +-msgid "Set the max size of data eligible for the TDA area" +-msgstr "Establir la grandària màxima de dades elegibles per a l'àrea TDA" +- +-#: config/v850/v850.opt:71 +-msgid "Enforce strict alignment" +-msgstr "Reforçar l'alineació estricta" +- +-#: config/v850/v850.opt:78 +-msgid "Compile for the v850 processor" +-msgstr "Compilar per al processador v850" +- +-#: config/v850/v850.opt:82 +-#, fuzzy +-msgid "Compile for the v850e processor" +-msgstr "Compilar per al processador v850" +- +-#: config/v850/v850.opt:86 +-#, fuzzy +-msgid "Compile for the v850e1 processor" +-msgstr "Compilar per al processador v850" +- +-#: config/v850/v850.opt:90 +-msgid "Set the max size of data eligible for the ZDA area" +-msgstr "Establir la grandària màxima de dades elegibles per a l'àrea ZDA" +- +-#: config/mmix/mmix.opt:24 +-msgid "For intrinsics library: pass all parameters in registers" +-msgstr "Per a biblioteques intrínsiques: passar els paràmetres en registres" +- +-#: config/mmix/mmix.opt:28 +-msgid "Use register stack for parameters and return value" +-msgstr "Usar registres de pila per a paràmetres i valors de retorn" +- +-#: config/mmix/mmix.opt:32 +-msgid "Use call-clobbered registers for parameters and return value" +-msgstr "Usar registres maltractats per a paràmetres i valors de retorn" +- +-#: config/mmix/mmix.opt:37 +-msgid "Use epsilon-respecting floating point compare instructions" +-msgstr "Usar instuccions de comparança en coma flotant que respectent epsilon" +- +-#: config/mmix/mmix.opt:41 +-msgid "Use zero-extending memory loads, not sign-extending ones" +-msgstr "Usar càrregues de memòria d'extensió zero, no les d'extensió amb signe" +- +-#: config/mmix/mmix.opt:45 +-msgid "Generate divide results with reminder having the same sign as the divisor (not the dividend)" +-msgstr "Generar resultats de divisió amb residu que tingui el mateix signe que el divisor (no el del dividend)" +- +-#: config/mmix/mmix.opt:49 +-msgid "Prepend global symbols with \":\" (for use with PREFIX)" +-msgstr "Precedir als símbols globals amb \":\" (per a usar-se amb PREFIX)" +- +-#: config/mmix/mmix.opt:53 +-msgid "Do not provide a default start-address 0x100 of the program" +-msgstr "No proveir una adreça d'inici per omissió 0x100 del programa" +- +-#: config/mmix/mmix.opt:57 +-msgid "Link to emit program in ELF format (rather than mmo)" +-msgstr "Enllaçar per a emetre el programa en format ELF (en lloc de mmo)" +- +-#: config/mmix/mmix.opt:61 +-msgid "Use P-mnemonics for branches statically predicted as taken" +-msgstr "Usar Mnemónicos-P per a ramificacions predites estàticament com preses" +- +-#: config/mmix/mmix.opt:65 +-msgid "Don't use P-mnemonics for branches" +-msgstr "No usar Mnemónicos-P per a ramificacions" +- +-#: config/mmix/mmix.opt:79 +-msgid "Use addresses that allocate global registers" +-msgstr "Usar adreces que reservin registres globals" +- +-#: config/mmix/mmix.opt:83 +-msgid "Do not use addresses that allocate global registers" +-msgstr "No usar adreces que reservin registres globals" +- +-#: config/mmix/mmix.opt:87 +-msgid "Generate a single exit point for each function" +-msgstr "Generar només un punt de sortida per a cada funció" +- +-#: config/mmix/mmix.opt:91 +-msgid "Do not generate a single exit point for each function" +-msgstr "No generar només un punt de sortida per a cada funció" +- +-#: config/mmix/mmix.opt:95 +-msgid "Set start-address of the program" +-msgstr "Definir l'adreça d'inici del programa" +- +-#: config/mmix/mmix.opt:99 +-msgid "Set start-address of data" +-msgstr "Definir l'adreça d'inici de les dades" +- +-#: config/iq2000/iq2000.opt:23 config/mt/mt.opt:55 +-msgid "Specify CPU for code generation purposes" +-msgstr "Especificar el CPU per a propòsits de generació de codi" +- +-#: config/iq2000/iq2000.opt:27 +-msgid "Specify CPU for scheduling purposes" +-msgstr "Especificar el CPU per a propòsits de calendarització" +- +-#: config/iq2000/iq2000.opt:35 +-msgid "Use GP relative sdata/sbss sections" +-msgstr "Usar seccions sdata/sbss relatives a GP" +- +-#: config/iq2000/iq2000.opt:40 +-msgid "No default crt0.o" +-msgstr "No està el crt0.o per omissió" +- +-#: config/bfin/bfin.opt:31 +-#, fuzzy +-msgid "Omit frame pointer for leaf functions" +-msgstr "Ometre el marc de referència per a les funcions fulles" +- +-#: config/bfin/bfin.opt:35 +-msgid "Program is entirely located in low 64k of memory" +-msgstr "" +- +-#: config/bfin/bfin.opt:39 +-msgid "Work around a hardware anomaly by adding a number of NOPs before a" +-msgstr "" +- +-#: config/bfin/bfin.opt:44 +-msgid "Avoid speculative loads to work around a hardware anomaly." +-msgstr "" +- +-#: config/bfin/bfin.opt:48 +-msgid "Enabled ID based shared library" +-msgstr "" +- +-#: config/bfin/bfin.opt:52 +-msgid "Generate code that won't be linked against any other ID shared libraries," +-msgstr "" +- +-#: config/bfin/bfin.opt:65 +-msgid "Avoid generating pc-relative calls; use indirection" +-msgstr "" +- +-#: config/bfin/bfin.opt:69 +-#, fuzzy +-msgid "Link with the fast floating-point library" +-msgstr "Usar la unitat de coma flotant de Xtensa" +- +-#: config/bfin/bfin.opt:81 +-msgid "Do stack checking using bounds in L1 scratch memory" +-msgstr "" +- +-#: config/mt/mt.opt:23 +-msgid "Use byte loads and stores when generating code." +-msgstr "" +- +-#: config/mt/mt.opt:31 +-msgid "Do not include crt0.o in the startup files" +-msgstr "" +- +-#: config/mt/mt.opt:35 config/mt/mt.opt:39 config/mt/mt.opt:43 +-#: config/mt/mt.opt:47 config/mt/mt.opt:51 +-#, fuzzy +-msgid "Internal debug switch" +-msgstr "interruptor -mdebug-%s desconegut" +- +-#: config/vxworks.opt:24 +-#, fuzzy +-msgid "Assume the VxWorks RTP environment" +-msgstr "Assumir l'ambient normal d'execució C" +- +-#: config/vxworks.opt:31 +-#, fuzzy +-msgid "Assume the VxWorks vThreads environment" +-msgstr "Assumir l'ambient normal d'execució C" +- +-#: config/darwin.opt:23 +-#, fuzzy +-msgid "Generate code suitable for fast turn around debugging" +-msgstr "Generar codi per a un Sun Sky board" +- +-#: config/darwin.opt:31 +-msgid "The earliest MacOS X version on which this program will run" +-msgstr "" +- +-#: config/darwin.opt:35 +-#, fuzzy +-msgid "Set sizeof(bool) to 1" +-msgstr "sizeof(long double) és 16." +- +-#: config/darwin.opt:39 +-#, fuzzy +-msgid "Generate code for darwin loadable kernel extensions" +-msgstr "Generar codi per a little endian" +- +-#: config/darwin.opt:43 +-#, fuzzy +-msgid "Generate code for the kernel or loadable kernel extensions" +-msgstr "Generar codi per al xip especificat o la versió de CPU" +- +-#: config/darwin.opt:47 +-msgid "Add to the end of the system framework include path" +-msgstr "" +- +-#: config/lynx.opt:23 +-msgid "Support legacy multi-threading" +-msgstr "" +- +-#: config/lynx.opt:27 +-#, fuzzy +-msgid "Use shared libraries" +-msgstr "Usar fp de maquinari" +- +-#: config/lynx.opt:31 +-msgid "Support multi-threading" +-msgstr "" +- +-#: config/score/score.opt:31 +-#, fuzzy +-msgid "Disable bcnz instruction" +-msgstr "Desactivar l'ús de la instrucció DB" +- +-#: config/score/score.opt:35 +-#, fuzzy +-msgid "Enable unaligned load/store instruction" +-msgstr "Activar l'ús de la instrucció DB" +- +-#: config/score/score.opt:39 +-msgid "Support SCORE 5 ISA" +-msgstr "" +- +-#: config/score/score.opt:43 +-msgid "Support SCORE 5U ISA" +-msgstr "" +- +-#: config/score/score.opt:47 +-msgid "Support SCORE 7 ISA" +-msgstr "" +- +-#: config/score/score.opt:51 +-msgid "Support SCORE 7D ISA" +-msgstr "" +- +-#: config/score/score.opt:55 +-msgid "Support SCORE 3 ISA" +-msgstr "" +- +-#: config/score/score.opt:59 +-msgid "Support SCORE 3d ISA" +-msgstr "" +- +-#: config/linux.opt:24 +-#, fuzzy +-msgid "Use uClibc instead of GNU libc" +-msgstr "Usar ROM enlloc de RAM" +- +-#: config/linux.opt:28 +-#, fuzzy +-msgid "Use GNU libc instead of uClibc" +-msgstr "Usar ROM enlloc de RAM" +- +-#: c.opt:41 +-msgid "Assert the to . Putting '-' before disables the to " +-msgstr "" +- +-#: c.opt:45 +-#, fuzzy +-msgid "Do not discard comments" +-msgstr "No desactivar registres d'espai" +- +-#: c.opt:49 +-msgid "Do not discard comments in macro expansions" +-msgstr "" +- +-#: c.opt:53 +-msgid "Define a with as its value. If just is given, is taken to be 1" +-msgstr "" +- +-#: c.opt:60 +-msgid "Add to the end of the main framework include path" +-msgstr "" +- +-#: c.opt:64 +-#, fuzzy +-msgid "Print the name of header files as they are used" +-msgstr "Mostrar els noms de les unitats de programa mentre són compilades" +- +-#: c.opt:68 c.opt:859 +-msgid "Add to the end of the main include path" +-msgstr "" +- +-#: c.opt:72 +-#, fuzzy +-msgid "Generate make dependencies" +-msgstr "Generar codi little endian" +- +-#: c.opt:76 +-#, fuzzy +-msgid "Generate make dependencies and compile" +-msgstr "Generar codi little endian" +- +-#: c.opt:80 +-msgid "Write dependency output to the given file" +-msgstr "" +- +-#: c.opt:84 +-msgid "Treat missing header files as generated files" +-msgstr "" +- +-#: c.opt:88 +-msgid "Like -M but ignore system header files" +-msgstr "" +- +-#: c.opt:92 +-msgid "Like -MD but ignore system header files" +-msgstr "" +- +-#: c.opt:96 +-#, fuzzy +-msgid "Generate phony targets for all headers" +-msgstr "Generar codi com de Intel" +- +-#: c.opt:100 +-msgid "Add a MAKE-quoted target" +-msgstr "" +- +-#: c.opt:104 +-msgid "Add an unquoted target" +-msgstr "" +- +-#: c.opt:108 +-#, fuzzy +-msgid "Do not generate #line directives" +-msgstr "No generar directives .size" +- +-#: c.opt:112 +-msgid "Undefine " +-msgstr "" +- +-#: c.opt:116 +-msgid "Warn about things that will change when compiling with an ABI-compliant compiler" +-msgstr "" +- +-#: c.opt:120 +-#, fuzzy +-msgid "Warn about suspicious uses of memory addresses" +-msgstr "Avisar sobre declaracions sospitoses de main" +- +-#: c.opt:124 +-msgid "Enable most warning messages" +-msgstr "Activar gairebé tots els missatges d'avís" +- +-#: c.opt:128 +-#, fuzzy +-msgid "Warn if a comparison is always true or always false due to the limited range of the data type" +-msgstr "la comparança sempre és falsa a causa dels límits limitats del tipus de dades" +- +-#: c.opt:132 +-msgid "Warn whenever an Objective-C assignment is being intercepted by the garbage collector" +-msgstr "" +- +-#: c.opt:136 +-msgid "Warn about casting functions to incompatible types" +-msgstr "Avisar per funcions de conversió a tipus incompatibles" +- +-#: c.opt:140 +-msgid "Warn about C constructs that are not in the common subset of C and C++" +-msgstr "" +- +-#: c.opt:144 +-#, fuzzy +-msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 200x" +-msgstr "Avisar sobre construccions el significat de les quals canvia en ISO C" +- +-#: c.opt:148 +-msgid "Warn about casts which discard qualifiers" +-msgstr "Avisar sobre conversions que descarten calificators" +- +-#: c.opt:152 +-#, fuzzy +-msgid "Warn about subscripts whose type is \"char\"" +-msgstr "Avisar sobre subindicis el tipus del qual és \"char\"" +- +-#: c.opt:156 +-#, fuzzy +-msgid "Warn about variables that might be changed by \"longjmp\" or \"vfork\"" +-msgstr "%Jla variable \"%D\" podria ser apallissada per \"longjmp\" o \"vfork\"" +- +-#: c.opt:160 +-msgid "Warn about possibly nested block comments, and C++ comments spanning more than one physical line" +-msgstr "" +- +-#: c.opt:164 +-msgid "Synonym for -Wcomment" +-msgstr "" +- +-#: c.opt:168 +-msgid "Warn for implicit type conversions that may change a value" +-msgstr "" +- +-#: c.opt:172 +-#, fuzzy +-msgid "Warn for implicit type conversions between signed and unsigned integers" +-msgstr "comparança entre expressions enteres signed i unsigned" +- +-#: c.opt:176 +-#, fuzzy +-msgid "Warn when all constructors and destructors are private" +-msgstr "No avisar quan tots els ctors/dtors són privats" +- +-#: c.opt:180 +-#, fuzzy +-msgid "Warn when a declaration is found after a statement" +-msgstr "Avisar quan una declaració no especifiqui un tipus" +- +-#: c.opt:184 +-#, fuzzy +-msgid "Warn about deprecated compiler features" +-msgstr "No anunciar característiques obsoletes del compilador" +- +-#: c.opt:188 +-#, fuzzy +-msgid "Warn about compile-time integer division by zero" +-msgstr "No avisar sobre la divisió entera per zero en temps de compilació" +- +-#: c.opt:192 +-msgid "Warn about violations of Effective C++ style rules" +-msgstr "Avisar violacions de regles d'estil de Effective C++" +- +-#: c.opt:196 +-#, fuzzy +-msgid "Warn about an empty body in an if or else statement" +-msgstr "cos buit en una declaració else" +- +-#: c.opt:200 +-msgid "Warn about stray tokens after #elif and #endif" +-msgstr "" +- +-#: c.opt:208 +-msgid "This switch is deprecated; use -Werror=implicit-function-declaration instead" +-msgstr "" +- +-#: c.opt:212 +-#, fuzzy +-msgid "Warn if testing floating point numbers for equality" +-msgstr "Avisar sobre l'equitat de proves de nombres de coma flotant" +- +-#: c.opt:216 +-#, fuzzy +-msgid "Warn about printf/scanf/strftime/strfmon format string anomalies" +-msgstr "Avisar sobre anomalies amb format de printf/scanf/strftime/strfmon" +- +-#: c.opt:220 +-#, fuzzy +-msgid "Warn if passing too many arguments to a function for its format string" +-msgstr "massa arguments per a la funció \"va_start\"" +- +-#: c.opt:224 +-#, fuzzy +-msgid "Warn about format strings that are not literals" +-msgstr "Avisar sobre l'ús de literals multicaràcters" +- +-#: c.opt:228 +-#, fuzzy +-msgid "Warn about format strings that contain NUL bytes" +-msgstr "Avisar sobre l'ús de literals multicaràcters" +- +-#: c.opt:232 +-msgid "Warn about possible security problems with format functions" +-msgstr "Avisar sobre possibles problemes de seguretat amb funcions de format" +- +-#: c.opt:236 +-#, fuzzy +-msgid "Warn about strftime formats yielding 2-digit years" +-msgstr "No avisar sobre formats de strftime que produeixen dos dígits per a l'any" +- +-#: c.opt:240 +-#, fuzzy +-msgid "Warn about zero-length formats" +-msgstr "cadena de format %s de longitud zero" +- +-#: c.opt:247 +-msgid "Warn about variables which are initialized to themselves" +-msgstr "" +- +-#: c.opt:254 +-msgid "Warn about implicit function declarations" +-msgstr "Avisar sobre la declaració implícita de funcions" +- +-#: c.opt:258 +-msgid "Warn when a declaration does not specify a type" +-msgstr "Avisar quan una declaració no especifiqui un tipus" +- +-#: c.opt:262 +-msgid "Deprecated. This switch has no effect" +-msgstr "" +- +-#: c.opt:266 +-#, fuzzy +-msgid "Warn when there is a cast to a pointer from an integer of a different size" +-msgstr "conversió a punter des d'un enter de grandària diferent" +- +-#: c.opt:270 +-#, fuzzy +-msgid "Warn about invalid uses of the \"offsetof\" macro" +-msgstr "Avisar sobre l'ús de la directiva #import" +- +-#: c.opt:274 +-msgid "Warn about PCH files that are found but not used" +-msgstr "" +- +-#: c.opt:278 +-#, fuzzy +-msgid "Do not warn about using \"long long\" when -pedantic" +-msgstr "No avisar sobre l'ús de \"long long\" quan s'usi -pedantic" +- +-#: c.opt:282 +-#, fuzzy +-msgid "Warn about suspicious declarations of \"main\"" +-msgstr "Avisar sobre declaracions sospitoses de main" +- +-#: c.opt:286 +-msgid "Warn about possibly missing braces around initializers" +-msgstr "Avisar sobre possibles claus faltantes al voltant d'assignadorsº" +- +-#: c.opt:290 +-#, fuzzy +-msgid "Warn about global functions without previous declarations" +-msgstr "Avisar sobre funcions globals sense declaracions prèvies" +- +-#: c.opt:294 +-#, fuzzy +-msgid "Warn about missing fields in struct initializers" +-msgstr "Avisar sobre possibles claus faltantes al voltant d'assignadorsº" +- +-#: c.opt:298 +-msgid "Warn about functions which might be candidates for format attributes" +-msgstr "Avisar per funcions que podrien ser candidates per a atributs de format" +- +-#: c.opt:302 +-msgid "Warn about user-specified include directories that do not exist" +-msgstr "" +- +-#: c.opt:306 +-msgid "Warn about function parameters declared without a type specifier in K&R-style functions" +-msgstr "" +- +-#: c.opt:310 +-#, fuzzy +-msgid "Warn about global functions without prototypes" +-msgstr "Avisar sobre funcions globals sense prototips" +- +-#: c.opt:314 +-#, fuzzy +-msgid "Warn about use of multi-character character constants" +-msgstr "Avisar sobre l'ús de literals multicaràcters" +- +-#: c.opt:318 +-#, fuzzy +-msgid "Warn about \"extern\" declarations not at file scope" +-msgstr "Avisar sobre externs que no estan en el nivell de l'abast del fitxer" +- +-#: c.opt:322 +-#, fuzzy +-msgid "Warn when non-templatized friend functions are declared within a template" +-msgstr "No avisar quan les funcions friend sense patró són declarades dintre d'un patró" +- +-#: c.opt:326 +-#, fuzzy +-msgid "Warn about non-virtual destructors" +-msgstr "Avisar sobre destructors no virtuals" +- +-#: c.opt:330 +-msgid "Warn about NULL being passed to argument slots marked as requiring non-NULL" +-msgstr "" +- +-#: c.opt:334 +-#, fuzzy +-msgid "Warn about non-normalised Unicode strings" +-msgstr "Avisar sobre cadenes de format que no són cadenes literals" +- +-#: c.opt:338 +-#, fuzzy +-msgid "Warn if a C-style cast is used in a program" +-msgstr "Avisar quan s'usi una conversió d'estil C en un programa" +- +-#: c.opt:342 +-#, fuzzy +-msgid "Warn for obsolescent usage in a declaration" +-msgstr "Avisar sobre la declaració implícita de funcions" +- +-#: c.opt:346 +-#, fuzzy +-msgid "Warn if an old-style parameter definition is used" +-msgstr "Avisar quan no s'usi un paràmetre d'una funció" +- +-#: c.opt:350 +-msgid "Warn if a string is longer than the maximum portable length specified by the standard" +-msgstr "" +- +-#: c.opt:354 +-msgid "Warn about overloaded virtual function names" +-msgstr "Avisar sobre noms de funcions virtual sobrecarregades" +- +-#: c.opt:358 +-#, fuzzy +-msgid "Warn about overriding initializers without side effects" +-msgstr "Avisar sobre variables automàtiques sense iniciar" +- +-#: c.opt:362 +-#, fuzzy +-msgid "Warn about possibly missing parentheses" +-msgstr "Avisar sobre possibles parèntesis faltantes" +- +-#: c.opt:366 +-#, fuzzy +-msgid "Warn when converting the type of pointers to member functions" +-msgstr "avisar quan el tipus converteix punters a funcions membre" +- +-#: c.opt:370 +-msgid "Warn about function pointer arithmetic" +-msgstr "Avisar sobre l'aritmètica de punters de funcions" +- +-#: c.opt:374 +-#, fuzzy +-msgid "Warn when a pointer is cast to an integer of a different size" +-msgstr "conversió de punter a enter de grandària diferent" +- +-#: c.opt:378 +-#, fuzzy +-msgid "Warn about misuses of pragmas" +-msgstr "Avisar sobre pragmas no reconeguts" +- +-#: c.opt:382 +-#, fuzzy +-msgid "Warn if inherited methods are unimplemented" +-msgstr "Avisar si es detecten comentaris niats" +- +-#: c.opt:386 +-msgid "Warn about multiple declarations of the same object" +-msgstr "Avisar sobre declaracions múltiples del mateix objecte" +- +-#: c.opt:390 +-msgid "Warn when the compiler reorders code" +-msgstr "Avisar quan el compilador reordeni codi" +- +-#: c.opt:394 +-#, fuzzy +-msgid "Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++)" +-msgstr "Avisar quan el tipus de retorn per defecte d'una funció canvia a int" +- +-#: c.opt:398 +-msgid "Warn if a selector has multiple methods" +-msgstr "" +- +-#: c.opt:402 +-msgid "Warn about possible violations of sequence point rules" +-msgstr "Avisar sobre possibles violacions a les regles de seqüència de punt" +- +-#: c.opt:406 +-#, fuzzy +-msgid "Warn about signed-unsigned comparisons" +-msgstr "Avisar sobre comparances signed/unsigned" +- +-#: c.opt:410 +-msgid "Warn when overload promotes from unsigned to signed" +-msgstr "Avisar quan la sobrecàrrega promogui de unsigned a signed" +- +-#: c.opt:414 +-msgid "Warn about uncasted NULL used as sentinel" +-msgstr "" +- +-#: c.opt:418 +-#, fuzzy +-msgid "Warn about unprototyped function declarations" +-msgstr "Avisar sobre declaracions de funció sense prototip" +- +-#: c.opt:422 +-msgid "Warn if type signatures of candidate methods do not match exactly" +-msgstr "" +- +-#: c.opt:426 +-msgid "Warn when synthesis behavior differs from Cfront" +-msgstr "Avisar quan el comportament de síntesi difereixi de Cfront" +- +-#: c.opt:430 common.opt:182 +-msgid "Do not suppress warnings from system headers" +-msgstr "No suprimir els avisos dels encapçalats del sistema" +- +-#: c.opt:434 +-#, fuzzy +-msgid "Warn about features not present in traditional C" +-msgstr "es suggereix no usar #elif en C tradicional" +- +-#: c.opt:438 +-msgid "Warn of prototypes causing type conversions different from what would happen in the absence of prototype" +-msgstr "" +- +-#: c.opt:442 +-msgid "Warn if trigraphs are encountered that might affect the meaning of the program" +-msgstr "" +- +-#: c.opt:446 +-#, fuzzy +-msgid "Warn about @selector()s without previously declared methods" +-msgstr "Avisar sobre funcions globals sense declaracions prèvies" +- +-#: c.opt:450 +-#, fuzzy +-msgid "Warn if an undefined macro is used in an #if directive" +-msgstr "directiva # no definida o no vàlida" +- +-#: c.opt:454 +-msgid "Warn about unrecognized pragmas" +-msgstr "Avisar sobre pragmas no reconeguts" +- +-#: c.opt:458 +-msgid "Warn about macros defined in the main file that are not used" +-msgstr "" +- +-#: c.opt:462 +-#, fuzzy +-msgid "Do not warn about using variadic macros when -pedantic" +-msgstr "No avisar sobre l'ús de \"long long\" quan s'usi -pedantic" +- +-#: c.opt:466 +-#, fuzzy +-msgid "Warn if a variable length array is used" +-msgstr "Avisar quan no s'usi una variable" +- +-#: c.opt:470 +-msgid "In C++, nonzero means warn about deprecated conversion from string literals to `char *'. In C, similar warning, except that the conversion is of course not deprecated by the ISO C standard." +-msgstr "" +- +-#: c.opt:474 +-#, fuzzy +-msgid "Warn when a pointer differs in signedness in an assignment" +-msgstr "Avisar quan la sobrecàrrega promogui de unsigned a signed" +- +-#: c.opt:478 +-msgid "A synonym for -std=c89 (for C) or -std=c++98 (for C++)" +-msgstr "" +- +-#: c.opt:486 +-#, fuzzy +-msgid "Enforce class member access control semantics" +-msgstr "No obeir les semàntiques de control d'accés" +- +-#: c.opt:493 +-msgid "Change when template instances are emitted" +-msgstr "Canviar quan s'emetin les instàncies del patró" +- +-#: c.opt:497 +-#, fuzzy +-msgid "Recognize the \"asm\" keyword" +-msgstr "No reconèixer la paraula clau \"asm\"" +- +-#: c.opt:501 +-#, fuzzy +-msgid "Recognize built-in functions" +-msgstr "No reconèixer cap funció interna" +- +-#: c.opt:508 +-msgid "Check the return value of new" +-msgstr "Revisar el valor de retorn de new" +- +-#: c.opt:512 +-#, fuzzy +-msgid "Allow the arguments of the '?' operator to have different types" +-msgstr "els operands de ?: tenen tipus diferents" +- +-#: c.opt:516 +-#, fuzzy +-msgid "Reduce the size of object files" +-msgstr "Reduir la grandària dels fitxers objecte" +- +-#: c.opt:520 +-#, fuzzy +-msgid "Use class for constant strings" +-msgstr "Especificar un nom alternatiu per a la secció constant" +- +-#: c.opt:524 +-msgid "Inline member functions by default" +-msgstr "Fer que les funcions membre siguin «inline» per omissió" +- +-#: c.opt:528 +-#, fuzzy +-msgid "Preprocess directives only." +-msgstr "Processar directives #ident" +- +-#: c.opt:532 +-#, fuzzy +-msgid "Permit '$' as an identifier character" +-msgstr "el format és una cadena de caràcter ampla" +- +-#: c.opt:539 +-#, fuzzy +-msgid "Generate code to check exception specifications" +-msgstr "No generar codi per a revisar excepcions d'especificacions" +- +-#: c.opt:546 +-msgid "Convert all strings and character constants to character set " +-msgstr "" +- +-#: c.opt:550 +-#, fuzzy +-msgid "Permit universal character names (\\u and \\U) in identifiers" +-msgstr "universal-character-name \"\\u%04x\" no és vàlid en l'identificador" +- +-#: c.opt:554 +-msgid "Specify the default character set for source files" +-msgstr "" +- +-#: c.opt:562 +-#, fuzzy +-msgid "Scope of for-init-statement variables is local to the loop" +-msgstr "L'àmbit de les variables de la declaració d'inici de for s'estén cap a fora" +- +-#: c.opt:566 +-#, fuzzy +-msgid "Do not assume that standard C libraries and \"main\" exist" +-msgstr "Assumir que podrien no existir les biblioteques estàndard i main" +- +-#: c.opt:570 +-#, fuzzy +-msgid "Recognize GNU-defined keywords" +-msgstr "No reconèixer les paraules claus definides per GNU" +- +-#: c.opt:574 +-msgid "Generate code for GNU runtime environment" +-msgstr "" +- +-#: c.opt:578 +-#, fuzzy +-msgid "Use traditional GNU semantics for inline functions" +-msgstr "C tradicional rebutja els valors inicials d'unions" +- +-#: c.opt:591 +-msgid "Assume normal C execution environment" +-msgstr "Assumir l'ambient normal d'execució C" +- +-#: c.opt:595 +-msgid "Enable support for huge objects" +-msgstr "Activar el suport per a objectes enormes" +- +-#: c.opt:599 +-msgid "Export functions even if they can be inlined" +-msgstr "Exportar funcions encara si poden ser «inline»" +- +-#: c.opt:603 +-#, fuzzy +-msgid "Emit implicit instantiations of inline templates" +-msgstr "Emetre solament instanciacions explícites de patrons «inline»" +- +-#: c.opt:607 +-#, fuzzy +-msgid "Emit implicit instantiations of templates" +-msgstr "Emetre solament instanciacions explícites de patrons «inline»" +- +-#: c.opt:611 +-#, fuzzy +-msgid "Inject friend functions into enclosing namespace" +-msgstr "Integrar les funcions simples en els seus invocators" +- +-#: c.opt:618 +-msgid "Allow implicit conversions between vectors with differing numbers of subparts and/or differing element types." +-msgstr "" +- +-#: c.opt:622 +-#, fuzzy +-msgid "Don't warn about uses of Microsoft extensions" +-msgstr "No avisar pedantment sobre els usos d'extensions Microsoft" +- +-#: c.opt:632 +-msgid "Generate code for NeXT (Apple Mac OS X) runtime environment" +-msgstr "" +- +-#: c.opt:636 +-msgid "Assume that receivers of Objective-C messages may be nil" +-msgstr "" +- +-#: c.opt:648 +-msgid "Generate special Objective-C methods to initialize/destroy non-POD C++ ivars, if needed" +-msgstr "" +- +-#: c.opt:652 +-msgid "Allow fast jumps to the message dispatcher" +-msgstr "" +- +-#: c.opt:658 +-msgid "Enable Objective-C exception and synchronization syntax" +-msgstr "" +- +-#: c.opt:662 +-msgid "Enable garbage collection (GC) in Objective-C/Objective-C++ programs" +-msgstr "" +- +-#: c.opt:667 +-#, fuzzy +-msgid "Enable Objective-C setjmp exception handling runtime" +-msgstr "Activar el maneig d'excepcions" +- +-#: c.opt:671 +-#, fuzzy +-msgid "Enable OpenMP" +-msgstr "Activar la depuració" +- +-#: c.opt:675 +-msgid "Recognize C++ kewords like \"compl\" and \"xor\"" +-msgstr "" +- +-#: c.opt:679 +-#, fuzzy +-msgid "Enable optional diagnostics" +-msgstr "Desactivar els diagnòstics opcionals" +- +-#: c.opt:686 +-msgid "Look for and use PCH files even when preprocessing" +-msgstr "" +- +-#: c.opt:690 +-msgid "Downgrade conformance errors to warnings" +-msgstr "Degradar els errors de concordança a advertiments" +- +-#: c.opt:694 +-msgid "Treat the input file as already preprocessed" +-msgstr "" +- +-#: c.opt:698 +-msgid "Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime" +-msgstr "" +- +-#: c.opt:702 +-msgid "Enable automatic template instantiation" +-msgstr "Activar l'instanciació automàtica de patrons" +- +-#: c.opt:706 +-#, fuzzy +-msgid "Generate run time type descriptor information" +-msgstr "No generar informació del tipus de descriptor en temps d'execució" +- +-#: c.opt:710 +-msgid "Use the same size for double as for float" +-msgstr "Usar la mateixa grandària per a double que per a float" +- +-#: c.opt:718 +-#, fuzzy +-msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\"" +-msgstr "Fer de costat el tipus sota wchar_t per \"unsigned short\"" +- +-#: c.opt:722 +-msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed" +-msgstr "" +- +-#: c.opt:726 +-#, fuzzy +-msgid "Make \"char\" signed by default" +-msgstr "Fer que \"char\" sigui signed per omissió" +- +-#: c.opt:733 +-msgid "Display statistics accumulated during compilation" +-msgstr "Mostrar les estadístiques acumulades durant la compilació" +- +-#: c.opt:740 +-msgid "Distance between tab stops for column reporting" +-msgstr "" +- +-#: c.opt:744 +-#, fuzzy +-msgid "Specify maximum template instantiation depth" +-msgstr "Especificar la profunditat màxima d'instanciació de patrons" +- +-#: c.opt:751 +-#, fuzzy +-msgid "Do not generate thread-safe code for initializing local statics" +-msgstr "No generis codi per a crides near" +- +-#: c.opt:755 +-msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned" +-msgstr "" +- +-#: c.opt:759 +-msgid "Make \"char\" unsigned by default" +-msgstr "Fer que \"char\" sigui unsigned per omissió" +- +-#: c.opt:763 +-msgid "Use __cxa_atexit to register destructors" +-msgstr "Usar __cxa_atexit per a registrar destructors" +- +-#: c.opt:767 +-msgid "Use __cxa_get_exception_ptr in exception handling" +-msgstr "" +- +-#: c.opt:771 +-msgid "Marks all inlined methods as having hidden visibility" +-msgstr "" +- +-#: c.opt:775 +-msgid "Changes visibility to match Microsoft Visual Studio by default" +-msgstr "" +- +-#: c.opt:779 +-msgid "Discard unused virtual functions" +-msgstr "Descartar funcions virtual sense usar" +- +-#: c.opt:783 +-msgid "Implement vtables using thunks" +-msgstr "Implementar vtables usant thunks" +- +-#: c.opt:787 +-msgid "Emit common-like symbols as weak symbols" +-msgstr "Emetre símbols comuns com símbols febles" +- +-#: c.opt:791 +-msgid "Convert all wide strings and character constants to character set " +-msgstr "" +- +-#: c.opt:795 +-msgid "Generate a #line directive pointing at the current working directory" +-msgstr "" +- +-#: c.opt:799 +-msgid "Emit cross referencing information" +-msgstr "Emetre informació de referència creuada" +- +-#: c.opt:803 +-msgid "Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode" +-msgstr "" +- +-#: c.opt:807 +-msgid "Dump declarations to a .decl file" +-msgstr "" +- +-#: c.opt:811 +-msgid "Aggressive reduced debug info for structs" +-msgstr "" +- +-#: c.opt:815 +-msgid "Conservative reduced debug info for structs" +-msgstr "" +- +-#: c.opt:819 +-msgid "Detailed reduced debug info for structs" +-msgstr "" +- +-#: c.opt:823 c.opt:855 +-msgid "Add to the end of the system include path" +-msgstr "" +- +-#: c.opt:827 +-#, fuzzy +-msgid "Accept definition of macros in " +-msgstr "cicle en la definició de la reservació \"%s\"" +- +-#: c.opt:831 +-msgid "-imultilib Set to be the multilib include subdirectory" +-msgstr "" +- +-#: c.opt:835 +-msgid "Include the contents of before other files" +-msgstr "" +- +-#: c.opt:839 +-#, fuzzy +-msgid "Specify as a prefix for next two options" +-msgstr "Especificar un nom alternatiu per a la secció de text" +- +-#: c.opt:843 +-msgid "Set to be the system root directory" +-msgstr "" +- +-#: c.opt:847 +-msgid "Add to the start of the system include path" +-msgstr "" +- +-#: c.opt:851 +-msgid "Add to the end of the quote include path" +-msgstr "" +- +-#: c.opt:872 +-msgid "Do not search standard system include directories (those specified with -isystem will still be used)" +-msgstr "" +- +-#: c.opt:876 +-msgid "Do not search standard system include directories for C++" +-msgstr "" +- +-#: c.opt:892 +-msgid "Generate C header of platform-specific features" +-msgstr "" +- +-#: c.opt:896 +-msgid "Print a checksum of the executable for PCH validity checking, and stop" +-msgstr "" +- +-#: c.opt:900 +-msgid "Remap file names when including files" +-msgstr "" +- +-#: c.opt:904 +-msgid "Conform to the ISO 1998 C++ standard" +-msgstr "" +- +-#: c.opt:908 +-msgid "Conform to the ISO 1998 C++ standard, with extensions that are likely to" +-msgstr "" +- +-#: c.opt:915 c.opt:950 +-msgid "Conform to the ISO 1990 C standard" +-msgstr "" +- +-#: c.opt:919 c.opt:958 +-msgid "Conform to the ISO 1999 C standard" +-msgstr "" +- +-#: c.opt:923 +-msgid "Deprecated in favor of -std=c99" +-msgstr "" +- +-#: c.opt:927 +-msgid "Conform to the ISO 1998 C++ standard with GNU extensions" +-msgstr "" +- +-#: c.opt:931 +-msgid "Conform to the ISO 1998 C++ standard, with GNU extensions and" +-msgstr "" +- +-#: c.opt:938 +-msgid "Conform to the ISO 1990 C standard with GNU extensions" +-msgstr "" +- +-#: c.opt:942 +-msgid "Conform to the ISO 1999 C standard with GNU extensions" +-msgstr "" +- +-#: c.opt:946 +-msgid "Deprecated in favor of -std=gnu99" +-msgstr "" +- +-#: c.opt:954 +-msgid "Conform to the ISO 1990 C standard as amended in 1994" +-msgstr "" +- +-#: c.opt:962 +-msgid "Deprecated in favor of -std=iso9899:1999" +-msgstr "" +- +-#: c.opt:966 +-msgid "Enable traditional preprocessing" +-msgstr "" +- +-#: c.opt:970 +-msgid "Support ISO C trigraphs" +-msgstr "" +- +-#: c.opt:974 +-msgid "Do not predefine system-specific and GCC-specific macros" +-msgstr "" +- +-#: c.opt:978 +-msgid "Enable verbose output" +-msgstr "Activar la sortida de depuració verbosa" +- +-#: common.opt:27 +-#, fuzzy +-msgid "Display this information" +-msgstr " --help Mostra aquesta informació\n" +- +-#: common.opt:31 +-msgid "Display descriptions of a specific class of options. is one or more of optimizers, target, warnings, undocumented, params" +-msgstr "" +- +-#: common.opt:35 +-msgid "Alias for --help=target" +-msgstr "" +- +-#: common.opt:51 +-msgid "Set parameter to value. See below for a complete list of parameters" +-msgstr "" +- +-#: common.opt:58 +-#, fuzzy +-msgid "Put global and static data smaller than bytes into a special section (on some targets)" +-msgstr "" +-" -G Col·locar les dades globals i estàtics més petits que \n" +-" octets en una secció especial (en alguns objectius)\n" +- +-#: common.opt:62 +-#, fuzzy +-msgid "Set optimization level to " +-msgstr " -O[nombre] Establir el nivell d'optimització a [nombre]\n" +- +-#: common.opt:66 +-#, fuzzy +-msgid "Optimize for space rather than speed" +-msgstr " -Os Optimitzar per a espai en lloc de velocitat\n" +- +-#: common.opt:70 +-msgid "This switch is deprecated; use -Wextra instead" +-msgstr "" +- +-#: common.opt:74 +-msgid "Warn about returning structures, unions or arrays" +-msgstr "Avisar sobre la retorn d'estructures, unions o matrius" +- +-#: common.opt:78 +-msgid "Warn if an array is accessed out of bounds" +-msgstr "" +- +-#: common.opt:82 +-#, fuzzy +-msgid "Warn about inappropriate attribute usage" +-msgstr "Avisar sobre l'aritmètica de punters de funcions" +- +-#: common.opt:86 +-msgid "Warn about pointer casts which increase alignment" +-msgstr "Avisar sobre conversió de punters que incrementi l'alineació" +- +-#: common.opt:90 +-msgid "Warn about uses of __attribute__((deprecated)) declarations" +-msgstr "Avisar sobre el ùs de declaracions __attribute__((deprecated))" +- +-#: common.opt:94 +-msgid "Warn when an optimization pass is disabled" +-msgstr "Avisar quan es va desactivar un pas d'optimització" +- +-#: common.opt:98 +-msgid "Treat all warnings as errors" +-msgstr "Tractar tots els avisos com errors" +- +-#: common.opt:102 +-#, fuzzy +-msgid "Treat specified warning as error" +-msgstr "Tractar tots els avisos com errors" +- +-#: common.opt:106 +-msgid "Print extra (possibly unwanted) warnings" +-msgstr "" +- +-#: common.opt:110 +-msgid "Exit on the first error occurred" +-msgstr "" +- +-#: common.opt:114 +-msgid "Warn when an inlined function cannot be inlined" +-msgstr "Avisar quan una funció «inline» no pot ser «inline»" +- +-#: common.opt:118 +-#, fuzzy +-msgid "Warn if an object is larger than bytes" +-msgstr " -Wlarger-than- Avisar si un objecte és més gran que octets\n" +- +-#: common.opt:122 +-msgid "Warn when a logical operator is suspicously always evaluating to true or false" +-msgstr "" +- +-#: common.opt:126 +-msgid "Warn if the loop cannot be optimized due to nontrivial assumptions." +-msgstr "" +- +-#: common.opt:130 +-#, fuzzy +-msgid "Warn about functions which might be candidates for __attribute__((noreturn))" +-msgstr "Avisar sobre funcions que podrien ser candidates per a l'atribut noreturn" +- +-#: common.opt:134 +-#, fuzzy +-msgid "Warn about overflow in arithmetic expressions" +-msgstr "desbordament de coma flotant en l'expressió" +- +-#: common.opt:138 +-msgid "Warn when the packed attribute has no effect on struct layout" +-msgstr "Avisar quan l'atribut packed no té efecte en la disposició d'un struct" +- +-#: common.opt:142 +-#, fuzzy +-msgid "Warn when padding is required to align structure members" +-msgstr "Avisar quan es requereix farcit per a alinear als membres d'un struct" +- +-#: common.opt:146 +-msgid "Warn when one local variable shadows another" +-msgstr "Avisar quan una variable local enfosque una altra" +- +-#: common.opt:150 +-msgid "Warn when not issuing stack smashing protection for some reason" +-msgstr "" +- +-#: common.opt:154 common.opt:158 +-#, fuzzy +-msgid "Warn about code which might break strict aliasing rules" +-msgstr "Avisar sobre codi que pugui trencar les regles estrictes d'aliessis" +- +-#: common.opt:162 common.opt:166 +-msgid "Warn about optimizations that assume that signed overflow is undefined" +-msgstr "" +- +-#: common.opt:170 +-msgid "Warn about enumerated switches, with no default, missing a case" +-msgstr "Avisar sobre «switch» enumerats, sense valor per defecte, que manquin d'un «case»" +- +-#: common.opt:174 +-#, fuzzy +-msgid "Warn about enumerated switches missing a \"default:\" statement" +-msgstr "Avisar sobre «switch» enumerats que manquin d'un \"default:\"" +- +-#: common.opt:178 +-msgid "Warn about all enumerated switches missing a specific case" +-msgstr "Avisar sobre tots els «switch» enumerats que manquin d'un «case» específic" +- +-#: common.opt:186 +-msgid "Warn about uninitialized automatic variables" +-msgstr "Avisar sobre variables automàtiques sense iniciar" +- +-#: common.opt:190 +-msgid "Warn about code that will never be executed" +-msgstr "Avisar sobre codi que mai s'executarà" +- +-#: common.opt:194 +-msgid "Enable all -Wunused- warnings" +-msgstr "" +- +-#: common.opt:198 +-msgid "Warn when a function is unused" +-msgstr "Avisar quan no s'usi una funció" +- +-#: common.opt:202 +-msgid "Warn when a label is unused" +-msgstr "Avisar quan no s'usi una etiqueta" +- +-#: common.opt:206 +-msgid "Warn when a function parameter is unused" +-msgstr "Avisar quan no s'usi un paràmetre d'una funció" +- +-#: common.opt:210 +-msgid "Warn when an expression value is unused" +-msgstr "Avisar quan no s'usi un valor d'una expressió" +- +-#: common.opt:214 +-msgid "Warn when a variable is unused" +-msgstr "Avisar quan no s'usi una variable" +- +-#: common.opt:218 +-#, fuzzy +-msgid "Warn when a register variable is declared volatile" +-msgstr "Avisar quan no s'usi una variable" +- +-#: common.opt:222 +-msgid "Warn instead of error in case profiles in -fprofile-use do not match" +-msgstr "" +- +-#: common.opt:226 +-#, fuzzy +-msgid "Emit declaration information into " +-msgstr " -aux-info Emetre la informació de declaracions en el \n" +- +-#: common.opt:239 +-#, fuzzy +-msgid "Enable dumps from specific passes of the compiler" +-msgstr " -d[lletres] Activa els bolcats des de passos específics del compilador\n" +- +-#: common.opt:243 +-#, fuzzy +-msgid "Set the file basename to be used for dumps" +-msgstr " -dumpbase Nom base a usar per als bolcats des de passos específics\n" +- +-#: common.opt:263 +-msgid "Align the start of functions" +-msgstr "Alinear l'inici de les funcions" +- +-#: common.opt:270 +-msgid "Align labels which are only reached by jumping" +-msgstr "Alinear les etiquetes que solament s'arriben a saltant" +- +-#: common.opt:277 +-msgid "Align all labels" +-msgstr "Alinear totes les etiquetes" +- +-#: common.opt:284 +-msgid "Align the start of loops" +-msgstr "Alinear l'inici dels cicles" +- +-#: common.opt:299 +-#, fuzzy +-msgid "Specify that arguments may alias each other and globals" +-msgstr "Especifica que els arguments poden ser alies de cada altre i dels globals" +- +-#: common.opt:303 +-msgid "Assume arguments may alias globals but not each other" +-msgstr "Assumir que els arguments poden ser alies de globals però no de cada altre" +- +-#: common.opt:307 +-#, fuzzy +-msgid "Assume arguments alias neither each other nor globals" +-msgstr "Assumir que els arguments no poden ser alies de globals o de cada altre" +- +-#: common.opt:311 +-#, fuzzy +-msgid "Assume arguments alias no other storage" +-msgstr "Assumir que els arguments no poden ser alies de globals o de cada altre" +- +-#: common.opt:315 +-#, fuzzy +-msgid "Generate unwind tables that are exact at each instruction boundary" +-msgstr "Generar matrius de desembolico exactament en cada límit d'instrucció" +- +-#: common.opt:319 +-#, fuzzy +-msgid "Generate auto-inc/dec instructions" +-msgstr "Generar instruccions char" +- +-#: common.opt:327 +-msgid "Generate code to check bounds before indexing arrays" +-msgstr "Generar codi per a revisar els límits abans de matrius" +- +-#: common.opt:331 +-#, fuzzy +-msgid "Replace add, compare, branch with branch on count register" +-msgstr "Reemplaçar add,compare,branch per branch en el compte de registres" +- +-#: common.opt:335 +-msgid "Use profiling information for branch probabilities" +-msgstr "Usar la informació d'anàlisi de perfil per a les probabilitats de ramificació" +- +-#: common.opt:339 +-msgid "Perform branch target load optimization before prologue / epilogue threading" +-msgstr "" +- +-#: common.opt:343 +-msgid "Perform branch target load optimization after prologue / epilogue threading" +-msgstr "" +- +-#: common.opt:347 +-msgid "Restrict target load migration not to re-use registers in any basic block" +-msgstr "" +- +-#: common.opt:351 +-#, fuzzy +-msgid "Mark as being preserved across functions" +-msgstr " -fcall-saved- Marca el com preservat entre funcions\n" +- +-#: common.opt:355 +-#, fuzzy +-msgid "Mark as being corrupted by function calls" +-msgstr " -fcall-used- Marca el com corrupte per a crides de funció\n" +- +-#: common.opt:362 +-#, fuzzy +-msgid "Save registers around function calls" +-msgstr "Permetre guardar registres al voltant de crides de funció" +- +-#: common.opt:366 +-msgid "Compare the results of several data dependence analyzers." +-msgstr "" +- +-#: common.opt:370 +-msgid "Do not put uninitialized globals in the common section" +-msgstr "No posar globals sense iniciar en la secció comuna" +- +-#: common.opt:374 +-#, fuzzy +-msgid "Perform a register copy-propagation optimization pass" +-msgstr "Fer el pas d'optimització de còpia-propagació de registres" +- +-#: common.opt:378 +-msgid "Perform cross-jumping optimization" +-msgstr "Realitzar optimitzacions de salts creuats" +- +-#: common.opt:382 +-msgid "When running CSE, follow jumps to their targets" +-msgstr "Quan s'estigui executant CSE, seguir als salts als seus objectius" +- +-#: common.opt:386 +-msgid "When running CSE, follow conditional jumps" +-msgstr "Quan s'estigui executant CSE, seguir als salts condicionals" +- +-#: common.opt:390 +-msgid "Omit range reduction step when performing complex division" +-msgstr "" +- +-#: common.opt:394 +-#, fuzzy +-msgid "Place data items into their own section" +-msgstr "col·locar els elements de dades en la seva pròpia secció" +- +-#: common.opt:398 +-msgid "List all available debugging counters with their limits and counts." +-msgstr "" +- +-#: common.opt:402 +-msgid "-fdbg-cnt=:[,:,...] Set the debug counter limit. " +-msgstr "" +- +-#: common.opt:406 +-msgid "Map one directory name to another in debug information" +-msgstr "" +- +-#: common.opt:412 +-msgid "Defer popping functions args from stack until later" +-msgstr "Diferir l'extracció d'arguments de funcions de la pila fins més tard" +- +-#: common.opt:416 +-msgid "Attempt to fill delay slots of branch instructions" +-msgstr "Intentar emplenar les ranures de retard de les instruccions de ramificació" +- +-#: common.opt:420 +-msgid "Delete useless null pointer checks" +-msgstr "Esborrar les revisions de punters nuls sense ús" +- +-#: common.opt:424 +-#, fuzzy +-msgid "How often to emit source location at the beginning of line-wrapped diagnostics" +-msgstr " -fdiagnostics-show-location=[once | every-line] Indica que tan seguit es ha d'emetre la informació d'ubicació del codi, com prefix, a l'inici dels diagnòstics quan està activat el cort de línia\n" +- +-#: common.opt:428 +-msgid "Amend appropriate diagnostic messages with the command line option that controls them" +-msgstr "" +- +-#: common.opt:432 +-msgid "Dump various compiler internals to a file" +-msgstr "" +- +-#: common.opt:436 +-#, fuzzy +-msgid "Suppress output of addresses in debugging dumps" +-msgstr "Suprimir la sortida de notes de nombres d'instrucció i nombres de línia en els bolcats de depuració" +- +-#: common.opt:440 +-#, fuzzy +-msgid "Suppress output of instruction numbers, line number notes and addresses in debugging dumps" +-msgstr "Suprimir la sortida de notes de nombres d'instrucció i nombres de línia en els bolcats de depuració" +- +-#: common.opt:444 +-#, fuzzy +-msgid "Perform early inlining" +-msgstr "Realitzar les optimitzacions de cicle" +- +-#: common.opt:448 +-msgid "Perform DWARF2 duplicate elimination" +-msgstr "Realitzar l'eliminació de DWARF2 duplicats" +- +-#: common.opt:452 common.opt:456 +-msgid "Perform unused type elimination in debug info" +-msgstr "" +- +-#: common.opt:460 +-msgid "Do not suppress C++ class debug information." +-msgstr "" +- +-#: common.opt:464 +-msgid "Enable exception handling" +-msgstr "Activar el maneig d'excepcions" +- +-#: common.opt:468 +-msgid "Perform a number of minor, expensive optimizations" +-msgstr "Realitzar un nombre menor d'optimitzacions costoses" +- +-#: common.opt:475 +-msgid "Assume no NaNs or infinities are generated" +-msgstr "" +- +-#: common.opt:479 +-#, fuzzy +-msgid "Mark as being unavailable to the compiler" +-msgstr " -ffixed- Marca el com no disponible per al compilador\n" +- +-#: common.opt:483 +-msgid "Don't allocate floats and doubles in extended-precision registers" +-msgstr "" +- +-#: common.opt:489 +-#, fuzzy +-msgid "Copy memory address constants into registers before use" +-msgstr "Copiar les constants d'adreces de memòria en registres abans d'usar-los" +- +-#: common.opt:493 +-#, fuzzy +-msgid "Perform a forward propagation pass on RTL" +-msgstr "Fer el pas d'optimització de còpia-propagació de registres" +- +-#: common.opt:500 +-msgid "Allow function addresses to be held in registers" +-msgstr "Permetre que les adreces de les funcions es conserven en registres" +- +-#: common.opt:504 +-#, fuzzy +-msgid "Place each function into its own section" +-msgstr "col·locar cada funció en la seva pròpia secció" +- +-#: common.opt:508 +-#, fuzzy +-msgid "Perform global common subexpression elimination" +-msgstr "Realitzar l'eliminació de subexpressions comuns globals" +- +-#: common.opt:512 +-#, fuzzy +-msgid "Perform enhanced load motion during global common subexpression elimination" +-msgstr "Realitzar el moviment de càrrega millorada durant l'eliminació de subexpressions globals" +- +-#: common.opt:516 +-#, fuzzy +-msgid "Perform store motion after global common subexpression elimination" +-msgstr "Realitzar el moviment de guardat després de l'eliminació de subexpressions globals" +- +-#: common.opt:520 +-#, fuzzy +-msgid "Perform redundant load after store elimination in global common subexpression" +-msgstr "Realitzar el moviment de càrrega millorada durant l'eliminació de subexpressions globals" +- +-#: common.opt:525 +-#, fuzzy +-msgid "Perform global common subexpression elimination after register allocation" +-msgstr "Realitzar l'eliminació de subexpressions comuns globals" +- +-#: common.opt:530 +-#, fuzzy +-msgid "Enable guessing of branch probabilities" +-msgstr "Activar la predicció de probabilitats de ramificació" +- +-#: common.opt:538 +-msgid "Process #ident directives" +-msgstr "Processar directives #ident" +- +-#: common.opt:542 +-msgid "Perform conversion of conditional jumps to branchless equivalents" +-msgstr "" +- +-#: common.opt:546 +-msgid "Perform conversion of conditional jumps to conditional execution" +-msgstr "Realitzar la conversió de salts condicionals a execució condicional" +- +-#: common.opt:554 +-msgid "Do not generate .size directives" +-msgstr "No generar directives .size" +- +-#: common.opt:563 +-#, fuzzy +-msgid "Pay attention to the \"inline\" keyword" +-msgstr "Fer atenció a la paraula clau \"inline\"" +- +-#: common.opt:567 +-#, fuzzy +-msgid "Integrate simple functions into their callers when code size is known to not growth" +-msgstr "Integrar les funcions simples en els seus invocators" +- +-#: common.opt:571 +-msgid "Integrate simple functions into their callers" +-msgstr "Integrar les funcions simples en els seus invocators" +- +-#: common.opt:575 +-#, fuzzy +-msgid "Integrate functions called once into their callers" +-msgstr "Integrar les funcions simples en els seus invocators" +- +-#: common.opt:582 +-#, fuzzy +-msgid "Limit the size of inlined functions to " +-msgstr "-finline-limit=\tLimita la grandària de funcions «inline» a \n" +- +-#: common.opt:586 +-#, fuzzy +-msgid "Instrument function entry and exit with profiling calls" +-msgstr "Instrumentar funcions entrada/sortida amb crides d'anàlisi de perfil" +- +-#: common.opt:590 +-msgid "-finstrument-functions-exclude-function-list=name,... Do not instrument listed functions" +-msgstr "" +- +-#: common.opt:594 +-msgid "-finstrument-functions-exclude-file-list=filename,... Do not instrument functions listed in files" +-msgstr "" +- +-#: common.opt:598 +-#, fuzzy +-msgid "Perform Interprocedural constant propagation" +-msgstr "Activar la propagació de les constants condicionals SSA" +- +-#: common.opt:602 +-#, fuzzy +-msgid "Discover pure and const functions" +-msgstr "Descartar funcions virtual sense usar" +- +-#: common.opt:606 +-msgid "Perform interprocedural points-to analysis" +-msgstr "" +- +-#: common.opt:610 +-msgid "Discover readonly and non addressable static variables" +-msgstr "" +- +-#: common.opt:614 +-msgid "Type based escape and alias analysis" +-msgstr "" +- +-#: common.opt:618 +-msgid "Perform matrix layout flattening and transposing based" +-msgstr "" +- +-#: common.opt:623 +-#, fuzzy +-msgid "Perform structure layout optimizations based" +-msgstr "Realitzar optimitzacions de reducció de força" +- +-#: common.opt:628 +-msgid "Optimize induction variables on trees" +-msgstr "" +- +-#: common.opt:632 +-#, fuzzy +-msgid "Use jump tables for sufficiently large switch statements" +-msgstr "l'etiqueta «case» no es troba dintre d'una declaració «switch»" +- +-#: common.opt:636 +-#, fuzzy +-msgid "Generate code for functions even if they are fully inlined" +-msgstr "Generar codi per a les funcions encara si estan completament «inline»" +- +-#: common.opt:640 +-msgid "Emit static const variables even if they are not used" +-msgstr "Emetre variables static const encara si no s'usen" +- +-#: common.opt:644 +-#, fuzzy +-msgid "Give external symbols a leading underscore" +-msgstr "Els símbols externs tenen un subratllat inicial" +- +-#: common.opt:648 common.opt:852 common.opt:983 +-msgid "Does nothing. Preserved for backward compatibility." +-msgstr "" +- +-#: common.opt:652 +-msgid "Set errno after built-in math functions" +-msgstr "Establir errno després de les funcions matemàtiques internes" +- +-#: common.opt:656 +-#, fuzzy +-msgid "Report on permanent memory allocation" +-msgstr "Reportar l'allotjament en memòria permanent al final de l'execució" +- +-#: common.opt:663 +-msgid "Attempt to merge identical constants and constant variables" +-msgstr "Intentar barrejar constants idèntiques i variables constants" +- +-#: common.opt:667 +-msgid "Attempt to merge identical constants across compilation units" +-msgstr "Intentar barrejar constants idèntiques a través de les unitats de compilació" +- +-#: common.opt:671 +-#, fuzzy +-msgid "Limit diagnostics to characters per line. 0 suppresses line-wrapping" +-msgstr " -fmessage-length= Limita la longitud dels missatges de diagnòstic a caràcters per línia. 0 suprimeix el cort de línia\n" +- +-#: common.opt:675 +-msgid "Perform SMS based modulo scheduling before the first scheduling pass" +-msgstr "" +- +-#: common.opt:679 +-msgid "Perform SMS based modulo scheduling with register moves allowed" +-msgstr "" +- +-#: common.opt:683 +-#, fuzzy +-msgid "Move loop invariant computations out of loops" +-msgstr "Forçar que totes les computacions invariantes del cicle siguin fora del cicle" +- +-#: common.opt:687 +-msgid "Add mudflap bounds-checking instrumentation for single-threaded program" +-msgstr "" +- +-#: common.opt:691 +-msgid "Add mudflap bounds-checking instrumentation for multi-threaded program" +-msgstr "" +- +-#: common.opt:695 +-msgid "Ignore read operations when inserting mudflap instrumentation" +-msgstr "" +- +-#: common.opt:699 +-#, fuzzy +-msgid "Use the RTL dead code elimination pass" +-msgstr "Activar l'eliminació agressiva de codi mort SSA" +- +-#: common.opt:703 +-#, fuzzy +-msgid "Use the RTL dead store elimination pass" +-msgstr "Fa el pas complet d'optimització de moviment de registres" +- +-#: common.opt:707 +-msgid "Enable/Disable the traditional scheduling in loops that already passed modulo scheduling" +-msgstr "" +- +-#: common.opt:711 +-msgid "Support synchronous non-call exceptions" +-msgstr "Suport per a excepcions síncrones no de crides" +- +-#: common.opt:715 +-msgid "When possible do not generate stack frames" +-msgstr "Quan sigui possible no generar marcs de pila" +- +-#: common.opt:719 +-msgid "Expand OpenMP operations on SSA form" +-msgstr "" +- +-#: common.opt:723 +-#, fuzzy +-msgid "Do the full register move optimization pass" +-msgstr "Fa el pas complet d'optimització de moviment de registres" +- +-#: common.opt:727 +-msgid "Optimize sibling and tail recursive calls" +-msgstr "Optimitzar les crides recursives germanades i d'extrem" +- +-#: common.opt:731 common.opt:735 +-msgid "Report on memory allocation before interprocedural optimization" +-msgstr "" +- +-#: common.opt:739 +-msgid "Pack structure members together without holes" +-msgstr "Empaqueta junts als membres de l'estructura sense forats" +- +-#: common.opt:743 +-msgid "Set initial maximum structure member alignment" +-msgstr "" +- +-#: common.opt:747 +-#, fuzzy +-msgid "Return small aggregates in memory, not registers" +-msgstr "Retornar els agregats \"short\" en memòria, no en registres" +- +-#: common.opt:751 +-#, fuzzy +-msgid "Perform loop peeling" +-msgstr "Realitzar les optimitzacions de cicle" +- +-#: common.opt:755 +-msgid "Enable machine specific peephole optimizations" +-msgstr "Activar les optimitzacions de forats específiques de la màquina" +- +-#: common.opt:759 +-#, fuzzy +-msgid "Enable an RTL peephole pass before sched2" +-msgstr "Activa una execució de passada de forats rtl abans de sched2" +- +-#: common.opt:763 +-#, fuzzy +-msgid "Generate position-independent code if possible (large mode)" +-msgstr "Generar codi independent de posició, si és possible" +- +-#: common.opt:767 +-#, fuzzy +-msgid "Generate position-independent code for executables if possible (large mode)" +-msgstr "Generar codi independent de posició, si és possible" +- +-#: common.opt:771 +-#, fuzzy +-msgid "Generate position-independent code if possible (small mode)" +-msgstr "Generar codi independent de posició, si és possible" +- +-#: common.opt:775 +-#, fuzzy +-msgid "Generate position-independent code for executables if possible (small mode)" +-msgstr "Generar codi independent de posició, si és possible" +- +-#: common.opt:779 +-#, fuzzy +-msgid "Run predictive commoning optimization." +-msgstr "Permet una optimització de moviment de registres" +- +-#: common.opt:783 +-msgid "Generate prefetch instructions, if available, for arrays in loops" +-msgstr "Generar instruccions de precarregament, si estan disponibles, per a matrius en cicles" +- +-#: common.opt:787 +-msgid "Enable basic program profiling code" +-msgstr "Activar el codi bàsic d'anàlisi de perfil del programa" +- +-#: common.opt:791 +-#, fuzzy +-msgid "Insert arc-based program profiling code" +-msgstr "Inserir codi d'anàlisi de perfil basat en el programa arc" +- +-#: common.opt:795 +-msgid "Enable common options for generating profile info for profile feedback directed optimizations" +-msgstr "" +- +-#: common.opt:799 +-msgid "Enable common options for performing profile feedback directed optimizations" +-msgstr "" +- +-#: common.opt:803 +-msgid "Insert code to profile values of expressions" +-msgstr "" +- +-#: common.opt:810 +-msgid "Make compile reproducible using " +-msgstr "" +- +-#: common.opt:820 +-msgid "Record gcc command line switches in the object file." +-msgstr "" +- +-#: common.opt:824 +-#, fuzzy +-msgid "Return small aggregates in registers" +-msgstr "Retornar els agregats \"short\" en registres" +- +-#: common.opt:828 +-msgid "Enables a register move optimization" +-msgstr "Permet una optimització de moviment de registres" +- +-#: common.opt:832 +-#, fuzzy +-msgid "Perform a register renaming optimization pass" +-msgstr "Fer el pas d'optimització de renomenació de registres" +- +-#: common.opt:836 +-msgid "Reorder basic blocks to improve code placement" +-msgstr "Reordenar els blocs bàsics per a millorar la ubicació del codi" +- +-#: common.opt:840 +-#, fuzzy +-msgid "Reorder basic blocks and partition into hot and cold sections" +-msgstr "Reordenar els blocs bàsics per a millorar la ubicació del codi" +- +-#: common.opt:844 +-msgid "Reorder functions to improve code placement" +-msgstr "Reordenar les funcions per a millorar la ubicació del codi" +- +-#: common.opt:848 +-#, fuzzy +-msgid "Add a common subexpression elimination pass after loop optimizations" +-msgstr "Executar un pas CSE abans de les optimitzacions de cicles" +- +-#: common.opt:856 +-msgid "Disable optimizations that assume default FP rounding behavior" +-msgstr "" +- +-#: common.opt:860 +-msgid "Enable scheduling across basic blocks" +-msgstr "Activar la calendarització entre blocs bàsics" +- +-#: common.opt:864 +-msgid "Allow speculative motion of non-loads" +-msgstr "Permetre el moviment especulatiu de cap càrrega" +- +-#: common.opt:868 +-msgid "Allow speculative motion of some loads" +-msgstr "Permetre el moviment especulatiu d'unes càrregues" +- +-#: common.opt:872 +-msgid "Allow speculative motion of more loads" +-msgstr "Permetre el moviment especulatiu de més càrregues" +- +-#: common.opt:876 +-#, fuzzy +-msgid "Set the verbosity level of the scheduler" +-msgstr " -fsched-verbose= Estableix el nivell de detall del calendaritzador\n" +- +-#: common.opt:880 +-msgid "If scheduling post reload, do superblock scheduling" +-msgstr "" +- +-#: common.opt:884 +-msgid "If scheduling post reload, do trace scheduling" +-msgstr "" +- +-#: common.opt:888 +-msgid "Reschedule instructions before register allocation" +-msgstr "Recalendaritzar les instruccions abans de l'allotjament de registres" +- +-#: common.opt:892 +-msgid "Reschedule instructions after register allocation" +-msgstr "Recalendaritzar les instruccions després de l'allotjament de registres" +- +-#: common.opt:898 +-msgid "Allow premature scheduling of queued insns" +-msgstr "" +- +-#: common.opt:902 +-msgid "Set number of queued insns that can be prematurely scheduled" +-msgstr "" +- +-#: common.opt:910 common.opt:914 +-msgid "Set dependence distance checking in premature scheduling of queued insns" +-msgstr "" +- +-#: common.opt:918 +-msgid "Access data in the same section from shared anchor points" +-msgstr "" +- +-#: common.opt:922 +-#, fuzzy +-msgid "Perform sequence abstraction optimization on RTL" +-msgstr "Realitzar optimitzacions de reducció de força" +- +-#: common.opt:926 +-msgid "Eliminate redundant sign extensions using LCM." +-msgstr "" +- +-#: common.opt:930 +-msgid "Show column numbers in diagnostics, when available. Default off" +-msgstr "" +- +-#: common.opt:934 +-msgid "Disable optimizations observable by IEEE signaling NaNs" +-msgstr "" +- +-#: common.opt:938 +-msgid "Disable floating point optimizations that ignore the IEEE signedness of zero" +-msgstr "" +- +-#: common.opt:942 +-#, fuzzy +-msgid "Convert floating point constants to single precision constants" +-msgstr "Convertir constants de coma flotant a constants de precisió simple" +- +-#: common.opt:946 +-msgid "Split lifetimes of induction variables when loops are unrolled" +-msgstr "" +- +-#: common.opt:950 +-msgid "Split wide types into independent registers" +-msgstr "" +- +-#: common.opt:954 +-msgid "Apply variable expansion when loops are unrolled" +-msgstr "" +- +-#: common.opt:960 +-msgid "Insert stack checking code into the program" +-msgstr "Insereix codi de revisió de la pila en el programa" +- +-#: common.opt:967 +-msgid "Trap if the stack goes past " +-msgstr "" +- +-#: common.opt:971 +-msgid "Trap if the stack goes past symbol " +-msgstr "" +- +-#: common.opt:975 +-msgid "Use propolice as a stack protection method" +-msgstr "" +- +-#: common.opt:979 +-msgid "Use a stack protection method for every function" +-msgstr "" +- +-#: common.opt:991 +-msgid "Assume strict aliasing rules apply" +-msgstr "Assumir que s'apliquen les regles estrictes d'alies" +- +-#: common.opt:995 +-#, fuzzy +-msgid "Treat signed overflow as undefined" +-msgstr "Establir les definicions de Windows" +- +-#: common.opt:999 +-msgid "Check for syntax errors, then stop" +-msgstr "Buscar errors de sintaxi, i aleshores detenir-se" +- +-#: common.opt:1003 +-#, fuzzy +-msgid "Create data files needed by \"gcov\"" +-msgstr "Crear fitxers de dades necessàries per a gcov" +- +-#: common.opt:1007 +-msgid "Perform jump threading optimizations" +-msgstr "Realitzar optimitzacions de filat de salts" +- +-#: common.opt:1011 +-#, fuzzy +-msgid "Report the time taken by each compiler pass" +-msgstr "Reportar el temps pres per cada pas del compilador al final de l'execució" +- +-#: common.opt:1015 +-msgid "Set the default thread-local storage code generation model" +-msgstr "" +- +-#: common.opt:1019 +-msgid "Reorder top level functions, variables, and asms" +-msgstr "" +- +-#: common.opt:1023 +-msgid "Perform superblock formation via tail duplication" +-msgstr "" +- +-#: common.opt:1030 +-#, fuzzy +-msgid "Assume floating-point operations can trap" +-msgstr "Les operacions de coma flotant poden capturar" +- +-#: common.opt:1034 +-#, fuzzy +-msgid "Trap for signed overflow in addition, subtraction and multiplication" +-msgstr "Atrapar desbordaments signed en addició / substracció / multiplicació" +- +-#: common.opt:1038 +-#, fuzzy +-msgid "Enable SSA-CCP optimization on trees" +-msgstr "Activar les optimitzacions SSA" +- +-#: common.opt:1042 +-#, fuzzy +-msgid "Enable SSA-CCP optimization for stores and loads" +-msgstr "Activar les optimitzacions SSA" +- +-#: common.opt:1046 +-msgid "Enable loop header copying on trees" +-msgstr "" +- +-#: common.opt:1050 +-msgid "Replace SSA temporaries with better names in copies" +-msgstr "" +- +-#: common.opt:1054 +-msgid "Enable copy propagation on trees" +-msgstr "" +- +-#: common.opt:1058 +-msgid "This switch is obsolete" +-msgstr "" +- +-#: common.opt:1062 +-#, fuzzy +-msgid "Transform condition stores into unconditional ones" +-msgstr "Realitzar la conversió de salts condicionals a execució condicional" +- +-#: common.opt:1066 +-#, fuzzy +-msgid "Enable SSA dead code elimination optimization on trees" +-msgstr "Activar l'eliminació agressiva de codi mort SSA" +- +-#: common.opt:1070 +-#, fuzzy +-msgid "Enable dominator optimizations" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: common.opt:1074 +-#, fuzzy +-msgid "Enable dead store elimination" +-msgstr "Activar l'eliminació agressiva de codi mort SSA" +- +-#: common.opt:1078 +-msgid "Enable Full Redundancy Elimination (FRE) on trees" +-msgstr "" +- +-#: common.opt:1082 +-#, fuzzy +-msgid "Enable loop invariant motion on trees" +-msgstr "Forçar que totes les computacions invariantes del cicle siguin fora del cicle" +- +-#: common.opt:1086 +-#, fuzzy +-msgid "Enable linear loop transforms on trees" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: common.opt:1090 +-#, fuzzy +-msgid "Create canonical induction variables in loops" +-msgstr "Enfortir la reducció de totes les variables generals d'inducció de cicle" +- +-#: common.opt:1094 +-#, fuzzy +-msgid "Enable loop optimizations on tree level" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: common.opt:1098 +-#, fuzzy +-msgid "Enable automatic parallelization of loops" +-msgstr "Activar l'instanciació automàtica de patrons" +- +-#: common.opt:1102 +-#, fuzzy +-msgid "Enable SSA-PRE optimization on trees" +-msgstr "Activar les optimitzacions SSA" +- +-#: common.opt:1106 +-msgid "Enable reassociation on tree level" +-msgstr "" +- +-#: common.opt:1110 +-msgid "Perform structural alias analysis" +-msgstr "" +- +-#: common.opt:1114 +-#, fuzzy +-msgid "Enable SSA code sinking on trees" +-msgstr "Activar les optimitzacions SSA" +- +-#: common.opt:1118 +-msgid "Perform scalar replacement of aggregates" +-msgstr "" +- +-#: common.opt:1122 +-msgid "Replace temporary expressions in the SSA->normal pass" +-msgstr "" +- +-#: common.opt:1126 +-msgid "Perform live range splitting during the SSA->normal pass" +-msgstr "" +- +-#: common.opt:1130 +-#, fuzzy +-msgid "Perform Value Range Propagation on trees" +-msgstr "Fer el pas d'optimització de còpia-propagació de registres" +- +-#: common.opt:1134 +-#, fuzzy +-msgid "Compile whole compilation unit at a time" +-msgstr "Buidar la unitat de traducció completa a un fitxer" +- +-#: common.opt:1138 +-msgid "Perform loop unrolling when iteration count is known" +-msgstr "Realitzar el desenrollament del cicle quan es coneix el compte d'iteració" +- +-#: common.opt:1142 +-msgid "Perform loop unrolling for all loops" +-msgstr "Realitzar el desenrollament del cicle per a tots els cicles" +- +-#: common.opt:1149 +-msgid "Allow loop optimizations to assume that the loops behave in normal way" +-msgstr "" +- +-#: common.opt:1153 +-msgid "Allow optimization for floating-point arithmetic which may change the" +-msgstr "" +- +-#: common.opt:1158 +-msgid "Same as -fassociative-math for expressions which include division." +-msgstr "" +- +-#: common.opt:1166 +-#, fuzzy +-msgid "Allow math optimizations that may violate IEEE or ISO standards" +-msgstr "Permetre optimitzacions matemàtiques que poden violar els estàndards IEEE o ANSI" +- +-#: common.opt:1170 +-#, fuzzy +-msgid "Perform loop unswitching" +-msgstr "Realitzar les optimitzacions de cicle" +- +-#: common.opt:1174 +-msgid "Just generate unwind tables for exception handling" +-msgstr "Només generar matrius de desembolico per a maneig d'excepcions" +- +-#: common.opt:1178 +-#, fuzzy +-msgid "Perform variable tracking" +-msgstr "Realitzar optimització de la crida de l'extrem" +- +-#: common.opt:1182 +-msgid "Perform variable tracking and also tag variables that are uninitialized" +-msgstr "" +- +-#: common.opt:1186 +-#, fuzzy +-msgid "Enable loop vectorization on trees" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: common.opt:1190 +-#, fuzzy +-msgid "Enable use of cost model in vectorization" +-msgstr "Activar l'ús de les instruccions condicionals move" +- +-#: common.opt:1194 +-msgid "Enable loop versioning when doing loop vectorization on trees" +-msgstr "" +- +-#: common.opt:1198 +-#, fuzzy +-msgid "Set the verbosity level of the vectorizer" +-msgstr " -fsched-verbose= Estableix el nivell de detall del calendaritzador\n" +- +-#: common.opt:1202 +-msgid "Enable copy propagation of scalar-evolution information." +-msgstr "" +- +-#: common.opt:1212 +-msgid "Add extra commentary to assembler output" +-msgstr "Agregar comentaris extra a la sortida de l'ensamblador" +- +-#: common.opt:1216 +-msgid "Set the default symbol visibility" +-msgstr "" +- +-#: common.opt:1221 +-#, fuzzy +-msgid "Use expression value profiles in optimizations" +-msgstr "Activar les optimitzacions del enllaçador" +- +-#: common.opt:1225 +-msgid "Construct webs and split unrelated uses of single variable" +-msgstr "" +- +-#: common.opt:1229 +-#, fuzzy +-msgid "Perform whole program optimizations" +-msgstr "Realitzar les optimitzacions de cicle" +- +-#: common.opt:1233 +-msgid "Assume signed arithmetic overflow wraps around" +-msgstr "" +- +-#: common.opt:1237 +-msgid "Put zero initialized data in the bss section" +-msgstr "Posar dades inicialitzades a zero en la secció bss" +- +-#: common.opt:1241 +-msgid "Generate debug information in default format" +-msgstr "Generar informació de depuració en el format per omissió" +- +-#: common.opt:1245 +-msgid "Generate debug information in COFF format" +-msgstr "Generar informació de depuració en el format COFF" +- +-#: common.opt:1249 +-msgid "Generate debug information in DWARF v2 format" +-msgstr "Generar informació de depuració en el format DWARF v2" +- +-#: common.opt:1253 +-msgid "Generate debug information in default extended format" +-msgstr "Generar informació de depuració en el format estès per omissió" +- +-#: common.opt:1257 +-msgid "Generate debug information in STABS format" +-msgstr "Generar informació de depuració en el format STABS" +- +-#: common.opt:1261 +-msgid "Generate debug information in extended STABS format" +-msgstr "Generar informació de depuració en el format STABS estès" +- +-#: common.opt:1265 +-msgid "Generate debug information in VMS format" +-msgstr "Generar informació de depuració en el format VMS" +- +-#: common.opt:1269 +-msgid "Generate debug information in XCOFF format" +-msgstr "Generar informació de depuració en el format XCOFF" +- +-#: common.opt:1273 +-msgid "Generate debug information in extended XCOFF format" +-msgstr "Generar informació de depuració en el format XCOFF estès" +- +-#: common.opt:1277 +-#, fuzzy +-msgid "Place output into " +-msgstr "-o \tSituar la sortida en el " +- +-#: common.opt:1281 +-msgid "Enable function profiling" +-msgstr "Habilitar l'anàlisi de perfil de les funcions" +- +-#: common.opt:1285 +-msgid "Issue warnings needed for strict compliance to the standard" +-msgstr "Activar els avisos necessaris per a complir strictament amb ISO C" +- +-#: common.opt:1289 +-msgid "Like -pedantic but issue them as errors" +-msgstr "" +- +-#: common.opt:1293 +-msgid "Do not display functions compiled or elapsed time" +-msgstr "No mostrar les funcions compilades o el temps transcorregut" +- +-#: common.opt:1297 +-msgid "Display the compiler's version" +-msgstr "Mostra la versió del compilador" +- +-#: common.opt:1301 +-msgid "Suppress warnings" +-msgstr "" +- +-#: common.opt:1305 +-msgid "Create a shared library" +-msgstr "" +- +-#: common.opt:1309 +-#, fuzzy +-msgid "Create a position independent executable" +-msgstr "Generar codi independent de posició, si és possible" +- +-#: attribs.c:244 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute directive ignored" +-msgstr "s'ignora la directiva d'atribut \"%s\"" +- +-#: attribs.c:252 +-#, fuzzy, gcc-internal-format +-msgid "wrong number of arguments specified for %qs attribute" +-msgstr "es va especificar un nombre equivocat d'arguments per a l'atribut \"%s\"" +- +-#: attribs.c:270 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute does not apply to types" +-msgstr "l'atribut \"%s\" no s'aplica a tipus" +- +-#: attribs.c:317 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute only applies to function types" +-msgstr "l'atribut \"%s\" només s'aplica a tipus de funcions" +- +-#: attribs.c:327 +-#, fuzzy, gcc-internal-format +-msgid "type attributes ignored after type is already defined" +-msgstr "l'atribut \"%s\" sol es pot aplicar a definicions de classe" +- +-#: bb-reorder.c:1860 +-#, gcc-internal-format +-msgid "multiple hot/cold transitions found (bb %i)" +-msgstr "" +- +-#: bt-load.c:1546 +-#, gcc-internal-format +-msgid "branch target register load optimization is not intended to be run twice" +-msgstr "" +- +-#: builtins.c:451 +-#, gcc-internal-format +-msgid "offset outside bounds of constant string" +-msgstr "desplaçament fora dels límits de la constant de cadena" +- +-#: builtins.c:1001 +-#, fuzzy, gcc-internal-format +-msgid "second argument to %<__builtin_prefetch%> must be a constant" +-msgstr "el segon argument de \"__builtin_prefetch\" ha de ser una constant" +- +-#: builtins.c:1008 +-#, fuzzy, gcc-internal-format +-msgid "invalid second argument to %<__builtin_prefetch%>; using zero" +-msgstr "el segon argument de __builtin_prefetch no és vàlid; s'utilitzarà zero" +- +-#: builtins.c:1016 +-#, fuzzy, gcc-internal-format +-msgid "third argument to %<__builtin_prefetch%> must be a constant" +-msgstr "el tercer argument de \"__builtin_prefetch\" ha de ser una constant" +- +-#: builtins.c:1023 +-#, fuzzy, gcc-internal-format +-msgid "invalid third argument to %<__builtin_prefetch%>; using zero" +-msgstr "el tercer argument de __builtin_prefetch no és vàlid; s'utilitzarà zero" +- +-#: builtins.c:4592 +-#, fuzzy, gcc-internal-format +-msgid "argument of %<__builtin_args_info%> must be constant" +-msgstr "l'argument de \"__builtin_args_info\" ha de ser constant" +- +-#: builtins.c:4598 +-#, fuzzy, gcc-internal-format +-msgid "argument of %<__builtin_args_info%> out of range" +-msgstr "l'argument de \"__builtin_args_info\" està fora de límits" +- +-#: builtins.c:4604 +-#, fuzzy, gcc-internal-format +-msgid "missing argument in %<__builtin_args_info%>" +-msgstr "falta un argument en \"__builtin_args_info\"" +- +-#: builtins.c:4693 gimplify.c:2117 +-#, fuzzy, gcc-internal-format +-msgid "too few arguments to function %" +-msgstr "massa arguments per a la funció \"va_start\"" +- +-#: builtins.c:4857 +-#, fuzzy, gcc-internal-format +-msgid "first argument to % not of type %" +-msgstr "el primer argument per a \"va_arg\" no és del tipus \"va_list\"" +- +-#. Unfortunately, this is merely undefined, rather than a constraint +-#. violation, so we cannot make this an error. If this call is never +-#. executed, the program is still strictly conforming. +-#: builtins.c:4871 +-#, fuzzy, gcc-internal-format +-msgid "%qT is promoted to %qT when passed through %<...%>" +-msgstr "\"%s\" es promou a \"%s\" quan passa a través de \"...\"" +- +-#: builtins.c:4876 +-#, fuzzy, gcc-internal-format +-msgid "(so you should pass %qT not %qT to %)" +-msgstr "(així que ha de passar \"%s\" i no \"%s\" a \"va_arg\")" +- +-#. We can, however, treat "undefined" any way we please. +-#. Call abort to encourage the user to fix the program. +-#: builtins.c:4882 c-typeck.c:2408 +-#, gcc-internal-format +-msgid "if this code is reached, the program will abort" +-msgstr "si s'arriba a aquest codi, el programa avortarà" +- +-#: builtins.c:5000 +-#, fuzzy, gcc-internal-format +-msgid "invalid argument to %<__builtin_frame_address%>" +-msgstr "argument no vàlid per a \"__builtin_frame_address\"" +- +-#: builtins.c:5002 +-#, fuzzy, gcc-internal-format +-msgid "invalid argument to %<__builtin_return_address%>" +-msgstr "argument no vàlid per a \"__builtin_return_address\"" +- +-#: builtins.c:5015 +-#, fuzzy, gcc-internal-format +-msgid "unsupported argument to %<__builtin_frame_address%>" +-msgstr "argument sense suport per a \"__builtin_frame_address\"" +- +-#: builtins.c:5017 +-#, fuzzy, gcc-internal-format +-msgid "unsupported argument to %<__builtin_return_address%>" +-msgstr "argument sense suport per a \"__builtin_return_address\"" +- +-#: builtins.c:5564 +-#, fuzzy, gcc-internal-format +-msgid "both arguments to %<__builtin___clear_cache%> must be pointers" +-msgstr "l'argument de \"__builtin_eh_return_regno\" ha de ser constant" +- +-#. All valid uses of __builtin_va_arg_pack () are removed during +-#. inlining. +-#: builtins.c:6276 expr.c:8024 +-msgid "%Kinvalid use of %<__builtin_va_arg_pack ()%>" +-msgstr "" +- +-#. All valid uses of __builtin_va_arg_pack_len () are removed during +-#. inlining. +-#: builtins.c:6282 +-msgid "%Kinvalid use of %<__builtin_va_arg_pack_len ()%>" +-msgstr "" +- +-#: builtins.c:6578 +-#, fuzzy, gcc-internal-format +-msgid "%<__builtin_longjmp%> second argument must be 1" +-msgstr "el segon argument de _builtin_longjump ha de ser 1" +- +-#: builtins.c:7209 +-#, gcc-internal-format +-msgid "target format does not support infinity" +-msgstr "el format objectiu no té suport per a infinit" +- +-#: builtins.c:9623 builtins.c:9712 +-#, fuzzy, gcc-internal-format +-msgid "non-floating-point argument to function %qs" +-msgstr "arguments que no són de coma flotant per a la funció \"%s\"" +- +-#: builtins.c:11303 +-#, fuzzy, gcc-internal-format +-msgid "% used in function with fixed args" +-msgstr "es va usar \"va_start\" en una funció amb arguments fixos" +- +-#: builtins.c:11311 +-#, fuzzy, gcc-internal-format +-msgid "wrong number of arguments to function %" +-msgstr "massa arguments per a la funció \"va_start\"" +- +-#. Evidently an out of date version of ; can't validate +-#. va_start's second argument, but can still work as intended. +-#: builtins.c:11324 +-#, fuzzy, gcc-internal-format +-msgid "%<__builtin_next_arg%> called without an argument" +-msgstr "es va cridar a \"__builtin_next_arg\" sense argument" +- +-#: builtins.c:11329 +-#, fuzzy, gcc-internal-format +-msgid "wrong number of arguments to function %<__builtin_next_arg%>" +-msgstr "es va especificar un nombre equivocat d'arguments per a l'atribut \"%s\"" +- +-#. FIXME: Sometimes with the tree optimizers we can get the +-#. not the last argument even though the user used the last +-#. argument. We just warn and set the arg to be the last +-#. argument so that we will get wrong-code because of +-#. it. +-#: builtins.c:11358 +-#, fuzzy, gcc-internal-format +-msgid "second parameter of % not last named argument" +-msgstr "el segon paràmetre de \"va_start\" no és l'últim argument nomenat" +- +-#: builtins.c:11472 +-#, fuzzy +-msgid "%Kfirst argument of %D must be a pointer, second integer constant" +-msgstr "l'argument de l'atribut \"%s\" no és una cadena entera" +- +-#: builtins.c:11485 +-#, fuzzy +-msgid "%Klast argument of %D is not integer constant between 0 and 3" +-msgstr "l'argument de \"asm\" no és una cadena constant" +- +-#: builtins.c:11529 builtins.c:11693 builtins.c:11752 +-msgid "%Kcall to %D will always overflow destination buffer" +-msgstr "" +- +-#: builtins.c:11683 +-msgid "%Kcall to %D might overflow destination buffer" +-msgstr "" +- +-#: c-common.c:859 +-#, fuzzy, gcc-internal-format +-msgid "%qD is not defined outside of function scope" +-msgstr "%Jno es defineix \"%D\" fora de l'àmbit de la funció" +- +-#. Translators: The %d after 'ISO C' will be 90 or 99. Do not +-#. separate the %d from the 'C'. 'ISO' should not be +-#. translated, but it may be moved after 'C%d' in languages +-#. where modifiers follow nouns. +-#: c-common.c:891 +-#, fuzzy, gcc-internal-format +-msgid "string length %qd is greater than the length %qd ISO C%d compilers are required to support" +-msgstr "la longitud de la cadena \"%d\" és major que la longitud `%d\" que es requereix que els compiladors ISO C %d donin suport" +- +-#: c-common.c:941 +-#, gcc-internal-format +-msgid "overflow in constant expression" +-msgstr "desbordament en la constant implícita" +- +-#: c-common.c:963 +-#, gcc-internal-format +-msgid "integer overflow in expression" +-msgstr "desbordament enter en l'expressió" +- +-#: c-common.c:967 +-#, gcc-internal-format +-msgid "floating point overflow in expression" +-msgstr "desbordament de coma flotant en l'expressió" +- +-#: c-common.c:971 +-#, fuzzy, gcc-internal-format +-msgid "fixed-point overflow in expression" +-msgstr "desbordament de coma flotant en l'expressió" +- +-#: c-common.c:975 +-#, gcc-internal-format +-msgid "vector overflow in expression" +-msgstr "desbordament de vector flotant en l'expressió" +- +-#: c-common.c:980 +-#, fuzzy, gcc-internal-format +-msgid "complex integer overflow in expression" +-msgstr "desbordament enter en l'expressió" +- +-#: c-common.c:982 +-#, fuzzy, gcc-internal-format +-msgid "complex floating point overflow in expression" +-msgstr "desbordament de coma flotant en l'expressió" +- +-#: c-common.c:1013 +-#, gcc-internal-format +-msgid "logical %<%s%> with non-zero constant will always evaluate as true" +-msgstr "" +- +-#: c-common.c:1046 +-#, gcc-internal-format +-msgid "type-punning to incomplete type might break strict-aliasing rules" +-msgstr "el càstig de tipus a tipus incomplet pot trencar les regles d'alies estricte" +- +-#: c-common.c:1060 +-#, gcc-internal-format +-msgid "dereferencing type-punned pointer will break strict-aliasing rules" +-msgstr "el retorn de punters de tipus castigat trencarà les regles d'alies estricte" +- +-#: c-common.c:1067 c-common.c:1085 +-#, fuzzy, gcc-internal-format +-msgid "dereferencing type-punned pointer might break strict-aliasing rules" +-msgstr "el retorn de punters de tipus castigat trencarà les regles d'alies estricte" +- +-#: c-common.c:1111 +-#, fuzzy, gcc-internal-format +-msgid "%Hsuggest braces around empty body in an % statement" +-msgstr "%Hcos buit en una declaració «if»" +- +-#: c-common.c:1115 +-#, fuzzy, gcc-internal-format +-msgid "%Hsuggest braces around empty body in an % statement" +-msgstr "cos buit en una declaració else" +- +-#: c-common.c:1141 +-#, fuzzy, gcc-internal-format +-msgid "first argument of %q+D should be %" +-msgstr "%Jel primer argument de \"%D\" ha de ser \"int\"" +- +-#: c-common.c:1149 +-#, fuzzy, gcc-internal-format +-msgid "second argument of %q+D should be %" +-msgstr "%Jel segon argument de \"%D\" ha de ser \"char **\"" +- +-#: c-common.c:1158 +-#, fuzzy, gcc-internal-format +-msgid "third argument of %q+D should probably be %" +-msgstr "%Jel tercer argument de \"%D\" ha de ser \"char **\"" +- +-#: c-common.c:1168 +-#, fuzzy, gcc-internal-format +-msgid "%q+D takes only zero or two arguments" +-msgstr "%J\"%D\" només pren zero o dos arguments" +- +-#: c-common.c:1203 +-#, gcc-internal-format +-msgid "use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts" +-msgstr "" +- +-#: c-common.c:1241 +-#, gcc-internal-format +-msgid "negative integer implicitly converted to unsigned type" +-msgstr "enter negatiu truncat implícitament al tipus unsigned" +- +-#: c-common.c:1244 +-#, gcc-internal-format +-msgid "conversion of unsigned constant value to negative integer" +-msgstr "" +- +-#: c-common.c:1270 +-#, gcc-internal-format +-msgid "conversion to %qT alters %qT constant value" +-msgstr "" +- +-#: c-common.c:1296 +-#, gcc-internal-format +-msgid "conversion to %qT from %qT may change the sign of the result" +-msgstr "" +- +-#: c-common.c:1325 +-#, fuzzy, gcc-internal-format +-msgid "conversion to %qT from %qT may alter its value" +-msgstr "la conversió de \"%E\" des de \"%T\" a \"%T\" és ambigua" +- +-#: c-common.c:1353 +-#, gcc-internal-format +-msgid "large integer implicitly truncated to unsigned type" +-msgstr "enter gran truncat implícitament al tipus unsigned" +- +-#: c-common.c:1359 c-common.c:1366 c-common.c:1374 +-#, gcc-internal-format +-msgid "overflow in implicit constant conversion" +-msgstr "desbordament en la conversió implícita de constant" +- +-#: c-common.c:1528 +-#, fuzzy, gcc-internal-format +-msgid "operation on %qE may be undefined" +-msgstr "l'operació sobre \"%s\" pot estar indefinida" +- +-#: c-common.c:1821 +-#, gcc-internal-format +-msgid "case label does not reduce to an integer constant" +-msgstr "l'etiqueta d'un «case» no es redueix a una constant entera" +- +-#: c-common.c:1861 +-#, gcc-internal-format +-msgid "case label value is less than minimum value for type" +-msgstr "" +- +-#: c-common.c:1869 +-#, gcc-internal-format +-msgid "case label value exceeds maximum value for type" +-msgstr "" +- +-#: c-common.c:1877 +-#, gcc-internal-format +-msgid "lower value in case label range less than minimum value for type" +-msgstr "" +- +-#: c-common.c:1886 +-#, gcc-internal-format +-msgid "upper value in case label range exceeds maximum value for type" +-msgstr "" +- +-#: c-common.c:1960 +-#, gcc-internal-format +-msgid "GCC cannot support operators with integer types and fixed-point types that have too many integral and fractional bits together" +-msgstr "" +- +-#: c-common.c:2450 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands to binary %s (have %qT and %qT)" +-msgstr "operadors no vàlids per al binari %s" +- +-#: c-common.c:2686 +-#, gcc-internal-format +-msgid "comparison is always false due to limited range of data type" +-msgstr "la comparança sempre és falsa a causa dels límits limitats del tipus de dades" +- +-#: c-common.c:2688 +-#, gcc-internal-format +-msgid "comparison is always true due to limited range of data type" +-msgstr "la comparança sempre és certa a causa dels límits limitat del tipus de dades" +- +-#: c-common.c:2767 +-#, gcc-internal-format +-msgid "comparison of unsigned expression >= 0 is always true" +-msgstr "la comparança d'una expressió unsigned >= 0 sempre és certa" +- +-#: c-common.c:2777 +-#, gcc-internal-format +-msgid "comparison of unsigned expression < 0 is always false" +-msgstr "la comparança d'una expressió unsigned < 0 sempre és falsa" +- +-#: c-common.c:2818 +-#, fuzzy, gcc-internal-format +-msgid "pointer of type % used in arithmetic" +-msgstr "es va usar un punter de tipus \"void *\" en l'aritmètica" +- +-#: c-common.c:2824 +-#, gcc-internal-format +-msgid "pointer to a function used in arithmetic" +-msgstr "es va usar un punter a una funció en l'aritmètica" +- +-#: c-common.c:2830 +-#, gcc-internal-format +-msgid "pointer to member function used in arithmetic" +-msgstr "es va usar un punter a una funció membre en l'aritmètica" +- +-#: c-common.c:2982 +-#, fuzzy, gcc-internal-format +-msgid "the address of %qD will always evaluate as %" +-msgstr "l'adreça de \"%D\", sempre serà \"true\"" +- +-#: c-common.c:3051 cp/semantics.c:596 cp/typeck.c:6411 +-#, gcc-internal-format +-msgid "suggest parentheses around assignment used as truth value" +-msgstr "es suggereixen parèntesi al voltant de l'assignació usada com valor veritable" +- +-#: c-common.c:3123 c-typeck.c:8958 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of %" +-msgstr "ús no vàlid de \"restrict\"" +- +-#: c-common.c:3339 +-#, fuzzy, gcc-internal-format +-msgid "invalid application of % to a function type" +-msgstr "aplicació invalida de \"sizeof\" a una expressió de tipus de funció" +- +-#: c-common.c:3349 +-#, fuzzy, gcc-internal-format +-msgid "invalid application of %qs to a void type" +-msgstr "applicació no vàlida de \"%s\" a un tipus void" +- +-#: c-common.c:3355 +-#, fuzzy, gcc-internal-format +-msgid "invalid application of %qs to incomplete type %qT " +-msgstr "aplicació no vàlida de \"%s\" a un tipus incomplet \"T\" " +- +-#: c-common.c:3396 +-#, fuzzy, gcc-internal-format +-msgid "%<__alignof%> applied to a bit-field" +-msgstr "\"__alignof\" aplicat a un camp de bits" +- +-#: c-common.c:3969 +-#, fuzzy, gcc-internal-format +-msgid "cannot disable built-in function %qs" +-msgstr "no es pot desactivar la funció interna \"%s\"" +- +-#: c-common.c:4172 +-#, gcc-internal-format +-msgid "pointers are not permitted as case values" +-msgstr "els punters no són permesos com valors d'un «case»" +- +-#: c-common.c:4178 +-#, gcc-internal-format +-msgid "range expressions in switch statements are non-standard" +-msgstr "les expressions de límits en les declaracions «switch» no són estàndard" +- +-#: c-common.c:4204 +-#, gcc-internal-format +-msgid "empty range specified" +-msgstr "es va especificar uns límits buides" +- +-#: c-common.c:4264 +-#, gcc-internal-format +-msgid "duplicate (or overlapping) case value" +-msgstr "valor d'un «case» duplicat (o sobreposat)" +- +-# +-#: c-common.c:4265 +-#, gcc-internal-format +-msgid "%Jthis is the first entry overlapping that value" +-msgstr "%Jaquesta és la primera entrada que sobreposa aquest valor" +- +-#: c-common.c:4269 +-#, gcc-internal-format +-msgid "duplicate case value" +-msgstr "valor d'un «case» duplicat" +- +-#: c-common.c:4270 +-#, gcc-internal-format +-msgid "%Jpreviously used here" +-msgstr "%Jes va usar prèviament aquí" +- +-#: c-common.c:4274 +-#, gcc-internal-format +-msgid "multiple default labels in one switch" +-msgstr "múltiples etiquetes per omissió en un sol «switch»" +- +-#: c-common.c:4275 +-#, gcc-internal-format +-msgid "%Jthis is the first default label" +-msgstr "%Jaquesta és la primera etiqueta per omissió" +- +-#: c-common.c:4324 +-#, fuzzy, gcc-internal-format +-msgid "%Jcase value %qs not in enumerated type" +-msgstr "el valor de «case» \"%ld\" no és un tipus enumerat" +- +-#: c-common.c:4327 +-#, fuzzy, gcc-internal-format +-msgid "%Jcase value %qs not in enumerated type %qT" +-msgstr "el valor de «case» \"%ld\" no és un tipus enumerat" +- +-#: c-common.c:4385 +-#, fuzzy, gcc-internal-format +-msgid "%Hswitch missing default case" +-msgstr "manca el «case» per defecte per a un «switch»" +- +-#: c-common.c:4448 +-#, fuzzy, gcc-internal-format +-msgid "%Henumeration value %qE not handled in switch" +-msgstr "el valor d'enumeració \"%s\" no es gestiona en un «switch»" +- +-#: c-common.c:4472 +-#, gcc-internal-format +-msgid "taking the address of a label is non-standard" +-msgstr "prendre l'adreça d'una etiqueta no és estàndard" +- +-#: c-common.c:4622 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored for field of type %qT" +-msgstr "atribut \"%s\" ignorat per a \"%s\"" +- +-#: c-common.c:4633 c-common.c:4652 c-common.c:4670 c-common.c:4697 +-#: c-common.c:4724 c-common.c:4750 c-common.c:4769 c-common.c:4793 +-#: c-common.c:4816 c-common.c:4839 c-common.c:4860 c-common.c:4881 +-#: c-common.c:4905 c-common.c:4931 c-common.c:4968 c-common.c:4995 +-#: c-common.c:5046 c-common.c:5130 c-common.c:5160 c-common.c:5179 +-#: c-common.c:5499 c-common.c:5559 c-common.c:5580 c-common.c:5644 +-#: c-common.c:5762 c-common.c:5828 c-common.c:5877 c-common.c:5923 +-#: c-common.c:5993 c-common.c:6017 c-common.c:6301 c-common.c:6324 +-#: c-common.c:6363 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored" +-msgstr "s'ignora l'atribut \"%s\"" +- +-#: c-common.c:4715 c-common.c:4741 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute conflicts with attribute %s" +-msgstr "l'atribut \"%s\" solament aplica a variables" +- +-#: c-common.c:4962 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute have effect only on public objects" +-msgstr "%Jl'atribut \"%E\" s'aplica solament a funcions" +- +-#: c-common.c:5067 +-#, fuzzy, gcc-internal-format +-msgid "destructor priorities are not supported" +-msgstr "els trampolins no tenen suport" +- +-#: c-common.c:5069 +-#, fuzzy, gcc-internal-format +-msgid "constructor priorities are not supported" +-msgstr "els trampolins no tenen suport" +- +-#: c-common.c:5086 +-#, gcc-internal-format +-msgid "destructor priorities from 0 to %d are reserved for the implementation" +-msgstr "" +- +-#: c-common.c:5091 +-#, gcc-internal-format +-msgid "constructor priorities from 0 to %d are reserved for the implementation" +-msgstr "" +- +-#: c-common.c:5099 +-#, gcc-internal-format +-msgid "destructor priorities must be integers from 0 to %d inclusive" +-msgstr "" +- +-#: c-common.c:5102 +-#, gcc-internal-format +-msgid "constructor priorities must be integers from 0 to %d inclusive" +-msgstr "" +- +-#: c-common.c:5221 +-#, fuzzy, gcc-internal-format +-msgid "unknown machine mode %qs" +-msgstr "es desconeix el mode de màquina \"%s\"" +- +-#: c-common.c:5250 +-#, gcc-internal-format +-msgid "specifying vector types with __attribute__ ((mode)) is deprecated" +-msgstr "" +- +-#: c-common.c:5253 +-#, fuzzy, gcc-internal-format +-msgid "use __attribute__ ((vector_size)) instead" +-msgstr "s'ignora la directiva d'atribut \"%s\"" +- +-#: c-common.c:5262 +-#, fuzzy, gcc-internal-format +-msgid "unable to emulate %qs" +-msgstr "no es pot emular \"%s\"" +- +-#: c-common.c:5272 +-#, fuzzy, gcc-internal-format +-msgid "invalid pointer mode %qs" +-msgstr "mode de punter \"%s\" no vàlid" +- +-#: c-common.c:5289 +-#, fuzzy, gcc-internal-format +-msgid "signness of type and machine mode %qs don't match" +-msgstr "el nombre de #-lines per a entrar i sortir dels fitxers no coincideixen" +- +-#: c-common.c:5300 +-#, fuzzy, gcc-internal-format +-msgid "no data type for mode %qs" +-msgstr "no hi ha tipus de dades pel mode \"%s\"" +- +-#: c-common.c:5310 +-#, fuzzy, gcc-internal-format +-msgid "cannot use mode %qs for enumeral types" +-msgstr "no es pot convertir a un tipus punter" +- +-#: c-common.c:5337 +-#, fuzzy, gcc-internal-format +-msgid "mode %qs applied to inappropriate type" +-msgstr "mode \"%s\" aplicat a un tipus no inadequat" +- +-#: c-common.c:5368 +-#, gcc-internal-format +-msgid "%Jsection attribute cannot be specified for local variables" +-msgstr "%Jl'atribut de secció no pot ser especificat per a les variables locals" +- +-#: c-common.c:5379 config/bfin/bfin.c:4879 config/bfin/bfin.c:4930 +-#, fuzzy, gcc-internal-format +-msgid "section of %q+D conflicts with previous declaration" +-msgstr "%Jla secció de \"%D\" causa conflictes amb la declaració prèvia" +- +-#: c-common.c:5388 +-#, fuzzy, gcc-internal-format +-msgid "section attribute not allowed for %q+D" +-msgstr "%Jno es permet un atribut de secció per a \"%D\"" +- +-#: c-common.c:5394 +-#, gcc-internal-format +-msgid "%Jsection attributes are not supported for this target" +-msgstr "%Jatributs de secció no suportats per aquest objectiu" +- +-#: c-common.c:5426 +-#, gcc-internal-format +-msgid "requested alignment is not a constant" +-msgstr "l'alineació sol·licitada no és una constant" +- +-#: c-common.c:5431 +-#, gcc-internal-format +-msgid "requested alignment is not a power of 2" +-msgstr "l'alineació sol·licitada no és una potència de 2" +- +-#: c-common.c:5436 +-#, gcc-internal-format +-msgid "requested alignment is too large" +-msgstr "l'alineació sol·licitada és massa gran" +- +-#: c-common.c:5462 +-#, fuzzy, gcc-internal-format +-msgid "alignment may not be specified for %q+D" +-msgstr "%Jl'alineació no pot ser especificada per a \"%D\"" +- +-#: c-common.c:5469 +-#, gcc-internal-format +-msgid "alignment for %q+D was previously specified as %d and may not be decreased" +-msgstr "" +- +-#: c-common.c:5473 +-#, fuzzy, gcc-internal-format +-msgid "alignment for %q+D must be at least %d" +-msgstr "l'alineació ha de ser una potència petita de dos, no %d" +- +-#: c-common.c:5522 +-#, fuzzy, gcc-internal-format +-msgid "%q+D defined both normally and as an alias" +-msgstr "%J\"%D\" definit normalment i com un alies" +- +-#: c-common.c:5538 +-#, fuzzy, gcc-internal-format +-msgid "alias argument not a string" +-msgstr "l'argument d'alies no és una cadena" +- +-#: c-common.c:5601 +-#, gcc-internal-format +-msgid "%Jweakref attribute must appear before alias attribute" +-msgstr "" +- +-#: c-common.c:5631 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored on non-class types" +-msgstr "atribut \"%s\" ignorat per a \"%s\"" +- +-#: c-common.c:5637 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored because %qT is already defined" +-msgstr "el mateix bypass \"%s - %s\" ja està definit" +- +-#: c-common.c:5650 +-#, fuzzy, gcc-internal-format +-msgid "visibility argument not a string" +-msgstr "l'argument de visibilitat no és una cadena" +- +-#: c-common.c:5662 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored on types" +-msgstr "atribut \"%s\" ignorat per a \"%s\"" +- +-#: c-common.c:5678 +-#, fuzzy, gcc-internal-format +-msgid "visibility argument must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" +-msgstr "l'argument de visibilitat ha de ser \"default\", \"hidden\", \"protected\" o \"internal\"" +- +-#: c-common.c:5689 +-#, fuzzy, gcc-internal-format +-msgid "%qD redeclared with different visibility" +-msgstr "\"%#D\" redeclarat com un tipus diferent de símbol" +- +-#: c-common.c:5692 c-common.c:5696 +-#, gcc-internal-format +-msgid "%qD was declared %qs which implies default visibility" +-msgstr "" +- +-#: c-common.c:5770 +-#, fuzzy, gcc-internal-format +-msgid "tls_model argument not a string" +-msgstr "l'argument tls_model no és una cadena" +- +-#: c-common.c:5783 +-#, fuzzy, gcc-internal-format +-msgid "tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +-msgstr "l'argument de tls_model ha de ser \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" +- +-#: c-common.c:5802 c-common.c:5897 +-#, fuzzy, gcc-internal-format +-msgid "%J%qE attribute applies only to functions" +-msgstr "%Jl'atribut \"%E\" s'aplica solament a funcions" +- +-#: c-common.c:5807 c-common.c:5902 +-#, fuzzy, gcc-internal-format +-msgid "%Jcan%'t set %qE attribute after definition" +-msgstr "%Jno es pot establir l'atribut \"%E\" després de la definició" +- +-#: c-common.c:5858 +-#, gcc-internal-format +-msgid "alloc_size parameter outside range" +-msgstr "" +- +-#: c-common.c:5991 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute ignored for %qE" +-msgstr "atribut \"%s\" ignorat per a \"%s\"" +- +-#: c-common.c:6049 +-#, fuzzy, gcc-internal-format +-msgid "invalid vector type for attribute %qE" +-msgstr "tipus de vector no vàlid per a l'atribut \"%s\"" +- +-#: c-common.c:6055 +-#, gcc-internal-format +-msgid "vector size not an integral multiple of component size" +-msgstr "" +- +-#: c-common.c:6061 +-#, gcc-internal-format +-msgid "zero vector size" +-msgstr "" +- +-#: c-common.c:6069 +-#, gcc-internal-format +-msgid "number of components of the vector not a power of two" +-msgstr "" +- +-#: c-common.c:6097 +-#, gcc-internal-format +-msgid "nonnull attribute without arguments on a non-prototype" +-msgstr "un atribut nonnull sense arguments en un que no és prototip" +- +-#: c-common.c:6112 +-#, fuzzy, gcc-internal-format +-msgid "nonnull argument has invalid operand number (argument %lu)" +-msgstr "un argument no null té un nombre d'operadors no vàlid (arg %lu)" +- +-#: c-common.c:6131 +-#, fuzzy, gcc-internal-format +-msgid "nonnull argument with out-of-range operand number (argument %lu, operand %lu)" +-msgstr "argument no \"null\" amb un nombre d'operadors fora de límits (arg %lu, operand %lu)" +- +-#: c-common.c:6139 +-#, fuzzy, gcc-internal-format +-msgid "nonnull argument references non-pointer operand (argument %lu, operand %lu)" +-msgstr "un argument no null fa referència a un operand que no és un punter (arg %lu, operand %lu)" +- +-#: c-common.c:6215 +-#, fuzzy, gcc-internal-format +-msgid "not enough variable arguments to fit a sentinel" +-msgstr "molt pocs arguments per a la funció" +- +-#: c-common.c:6229 +-#, fuzzy, gcc-internal-format +-msgid "missing sentinel in function call" +-msgstr "Prohibir la crida a funcions relatives al PC" +- +-#: c-common.c:6270 +-#, fuzzy, gcc-internal-format +-msgid "null argument where non-null required (argument %lu)" +-msgstr "argument null on es requereix un que no sigui null (arg %lu)" +- +-#: c-common.c:6335 +-#, fuzzy, gcc-internal-format +-msgid "cleanup argument not an identifier" +-msgstr "l'objecte cridat no és un identificador" +- +-#: c-common.c:6342 +-#, fuzzy, gcc-internal-format +-msgid "cleanup argument not a function" +-msgstr "l'objecte cridat no és una funció" +- +-#: c-common.c:6381 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute requires prototypes with named arguments" +-msgstr "l'atribut \"%s\" requereix una constant entera com argument" +- +-#: c-common.c:6392 +-#, fuzzy, gcc-internal-format +-msgid "%qE attribute only applies to variadic functions" +-msgstr "l'atribut \"%s\" nomès s'aplica a funcions" +- +-#: c-common.c:6404 +-#, fuzzy, gcc-internal-format +-msgid "requested position is not an integer constant" +-msgstr "la init_priority sol·licitada no és una constant entera" +- +-#: c-common.c:6412 +-#, gcc-internal-format +-msgid "requested position is less than zero" +-msgstr "" +- +-#: c-common.c:6736 +-#, fuzzy, gcc-internal-format +-msgid "%Hignoring return value of %qD, declared with attribute warn_unused_result" +-msgstr "%Hignorant el valor de retorn de \"%D\", declarat amb atributs \"warn_unused_result\"" +- +-#: c-common.c:6740 +-#, gcc-internal-format +-msgid "%Hignoring return value of function declared with attribute warn_unused_result" +-msgstr "" +- +-#: c-common.c:6793 +-#, fuzzy, gcc-internal-format +-msgid "cannot apply % to static data member %qD" +-msgstr "ús no vàlid del camp no static \"%D\"" +- +-#: c-common.c:6797 +-#, gcc-internal-format +-msgid "cannot apply % when % is overloaded" +-msgstr "" +- +-#: c-common.c:6818 cp/typeck.c:4525 +-#, fuzzy, gcc-internal-format +-msgid "attempt to take address of bit-field structure member %qD" +-msgstr "es va intentar prendre l'adreça del membre de l'estructura de camps de bits \"%s\"" +- +-#: c-common.c:6871 +-#, fuzzy, gcc-internal-format +-msgid "lvalue required as left operand of assignment" +-msgstr "l-value no vàlid en l'assignació" +- +-#: c-common.c:6874 +-#, gcc-internal-format +-msgid "lvalue required as increment operand" +-msgstr "" +- +-#: c-common.c:6877 +-#, gcc-internal-format +-msgid "lvalue required as decrement operand" +-msgstr "" +- +-#: c-common.c:6880 +-#, gcc-internal-format +-msgid "lvalue required as unary %<&%> operand" +-msgstr "" +- +-#: c-common.c:6883 +-#, fuzzy, gcc-internal-format +-msgid "lvalue required in asm statement" +-msgstr "lvalue no vàlid en declaració asm" +- +-#: c-common.c:7005 +-#, fuzzy, gcc-internal-format +-msgid "size of array is too large" +-msgstr "la grandària de la matriu \"%s\" és massa gran" +- +-#: c-common.c:7041 c-common.c:7090 c-typeck.c:2705 +-#, fuzzy, gcc-internal-format +-msgid "too few arguments to function %qE" +-msgstr "molt pocs arguments per a la funció" +- +-#. ??? This should not be an error when inlining calls to +-#. unprototyped functions. +-#: c-common.c:7058 c-typeck.c:4374 +-#, fuzzy, gcc-internal-format +-msgid "incompatible type for argument %d of %qE" +-msgstr "tipus incompatible per a l'argument %d de \"%s\"" +- +-#: c-common.c:7250 +-#, fuzzy, gcc-internal-format +-msgid "array subscript has type %" +-msgstr "el subindici de matriu té un tipus \"char\"" +- +-#: c-common.c:7273 +-#, gcc-internal-format +-msgid "suggest parentheses around + or - inside shift" +-msgstr "es suggereixen parèntesi al voltant de + o - dintre d'un desplaçament" +- +-#: c-common.c:7281 +-#, gcc-internal-format +-msgid "suggest parentheses around && within ||" +-msgstr "es suggereixen parèntesi al voltant de && dintre de ||" +- +-#: c-common.c:7291 +-#, gcc-internal-format +-msgid "suggest parentheses around arithmetic in operand of |" +-msgstr "es suggereixen parèntesi al voltant de l'aritmètica per a operada de |" +- +-#: c-common.c:7296 +-#, gcc-internal-format +-msgid "suggest parentheses around comparison in operand of |" +-msgstr "es suggereixen parèntesi al voltant de les comparances per a operada de |" +- +-#: c-common.c:7306 +-#, gcc-internal-format +-msgid "suggest parentheses around arithmetic in operand of ^" +-msgstr "es suggereixen parèntesi al voltant de l'aritmètica per a operada de ^" +- +-#: c-common.c:7311 +-#, gcc-internal-format +-msgid "suggest parentheses around comparison in operand of ^" +-msgstr "es suggereixen parèntesi al voltant de les comparances per a operada de ^" +- +-#: c-common.c:7319 +-#, gcc-internal-format +-msgid "suggest parentheses around + or - in operand of &" +-msgstr "es suggereixen parèntesi al voltant de + o - per a operada de &" +- +-#: c-common.c:7324 +-#, gcc-internal-format +-msgid "suggest parentheses around comparison in operand of &" +-msgstr "es suggereixen parèntesi al voltant de les comparances per a operada de &" +- +-#: c-common.c:7332 +-#, fuzzy, gcc-internal-format +-msgid "suggest parentheses around comparison in operand of %s" +-msgstr "es suggereixen parèntesi al voltant de les comparances per a operada de |" +- +-#: c-common.c:7341 +-#, gcc-internal-format +-msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" +-msgstr "les comparances com X<=Y<=Z no tenen el seu significat matemàtic" +- +-#: c-common.c:7354 +-#, fuzzy, gcc-internal-format +-msgid "label %q+D defined but not used" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: c-common.c:7356 +-#, fuzzy, gcc-internal-format +-msgid "label %q+D declared but not defined" +-msgstr "%Jl'etiqueta \"%D\" està declarada però no està definida" +- +-#: c-common.c:7375 +-#, gcc-internal-format +-msgid "division by zero" +-msgstr "divisió per zero" +- +-#. Except for passing an argument to an unprototyped function, +-#. this is a constraint violation. When passing an argument to +-#. an unprototyped function, it is compile-time undefined; +-#. making it a constraint in that case was rejected in +-#. DR#252. +-#: c-convert.c:95 c-typeck.c:1775 c-typeck.c:4012 cp/typeck.c:1502 +-#: cp/typeck.c:5717 cp/typeck.c:6325 fortran/convert.c:88 +-#: treelang/tree-convert.c:79 +-#, gcc-internal-format +-msgid "void value not ignored as it ought to be" +-msgstr "valor void no ignorat com deuria ser" +- +-#: c-convert.c:118 fortran/convert.c:121 java/typeck.c:152 +-#: treelang/tree-convert.c:105 +-#, gcc-internal-format +-msgid "conversion to non-scalar type requested" +-msgstr "es va sol·licitar conversió a tipus no escalar" +- +-#: c-decl.c:546 +-#, fuzzy, gcc-internal-format +-msgid "array %q+D assumed to have one element" +-msgstr "%Js'assumeix que la matriu \"%D\" té un element" +- +-#: c-decl.c:651 +-#, gcc-internal-format +-msgid "GCC supports only %u nested scopes" +-msgstr "" +- +-#: c-decl.c:737 cp/decl.c:358 +-#, fuzzy, gcc-internal-format +-msgid "label %q+D used but not defined" +-msgstr "s'usa l'etiqueta \"%D\" però no està definida" +- +-#: c-decl.c:778 +-#, fuzzy, gcc-internal-format +-msgid "nested function %q+D declared but never defined" +-msgstr "s'usa la funció «inline» \"%D\" però mai es va definir" +- +-#: c-decl.c:788 +-#, fuzzy, gcc-internal-format +-msgid "inline function %q+D declared but never defined" +-msgstr "s'usa la funció «inline» \"%D\" però mai es va definir" +- +-#: c-decl.c:801 cp/decl.c:608 +-#, fuzzy, gcc-internal-format +-msgid "unused variable %q+D" +-msgstr "%Jvariable \"%D\" sense ús" +- +-#: c-decl.c:805 +-#, gcc-internal-format +-msgid "type of array %q+D completed incompatibly with implicit initialization" +-msgstr "" +- +-#: c-decl.c:1039 +-#, fuzzy, gcc-internal-format +-msgid "a parameter list with an ellipsis can%'t match an empty parameter name list declaration" +-msgstr "una llista de paràmetres amb una el·lipse no pot coincidir amb una declaració de nom de llista de paràmetres buida." +- +-#: c-decl.c:1046 +-#, fuzzy, gcc-internal-format +-msgid "an argument type that has a default promotion can%'t match an empty parameter name list declaration" +-msgstr "Un tipus d'argument que té una promoció per omissió no pot coincidir amb una declaració de nom de llista de paràmetres buida." +- +-#: c-decl.c:1087 +-#, gcc-internal-format +-msgid "prototype for %q+D declares more arguments than previous old-style definition" +-msgstr "" +- +-#: c-decl.c:1093 +-#, gcc-internal-format +-msgid "prototype for %q+D declares fewer arguments than previous old-style definition" +-msgstr "" +- +-#: c-decl.c:1102 +-#, fuzzy, gcc-internal-format +-msgid "prototype for %q+D declares argument %d with incompatible type" +-msgstr "el prototip per a \"%s\" a continuació i l'argument %d no coincideixen" +- +-#. If we get here, no errors were found, but do issue a warning +-#. for this poor-style construct. +-#: c-decl.c:1115 +-#, fuzzy, gcc-internal-format +-msgid "prototype for %q+D follows non-prototype definition" +-msgstr "a continuació la definició del no prototip aquí" +- +-#: c-decl.c:1130 +-#, fuzzy, gcc-internal-format +-msgid "previous definition of %q+D was here" +-msgstr "%Jdefinició prèvia de \"%D\" aquí" +- +-#: c-decl.c:1132 +-#, fuzzy, gcc-internal-format +-msgid "previous implicit declaration of %q+D was here" +-msgstr "%Jdeclaració implícita prèvia de \"%D\" aquí" +- +-#: c-decl.c:1134 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+D was here" +-msgstr "%Jdeclaració prèvia de \"%D\" aquí" +- +-#: c-decl.c:1174 +-#, fuzzy, gcc-internal-format +-msgid "%q+D redeclared as different kind of symbol" +-msgstr "\"%#D\" redeclarat com un tipus diferent de símbol" +- +-#: c-decl.c:1178 +-#, fuzzy, gcc-internal-format +-msgid "built-in function %q+D declared as non-function" +-msgstr "%Jla funció interna \"%D\" no és declarada com funció" +- +-#: c-decl.c:1181 c-decl.c:1298 c-decl.c:1983 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D shadows a built-in function" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: c-decl.c:1190 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of enumerator %q+D" +-msgstr "redeclaració de \"enum %s\"" +- +-#. If types don't match for a built-in, throw away the +-#. built-in. No point in calling locate_old_decl here, it +-#. won't print anything. +-#: c-decl.c:1211 +-#, fuzzy, gcc-internal-format +-msgid "conflicting types for built-in function %q+D" +-msgstr "%Jtipus en conflicte per a la funció interna \"%D\"" +- +-#: c-decl.c:1235 c-decl.c:1248 c-decl.c:1258 +-#, fuzzy, gcc-internal-format +-msgid "conflicting types for %q+D" +-msgstr "%Jtipus en conflicte per a \"%D\"" +- +-#: c-decl.c:1256 +-#, fuzzy, gcc-internal-format +-msgid "conflicting type qualifiers for %q+D" +-msgstr "%Jtipus en conflicte per a \"%D\"" +- +-#. Allow OLDDECL to continue in use. +-#: c-decl.c:1273 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of typedef %q+D" +-msgstr "%Jredefinició de typedef \"%D\"" +- +-#: c-decl.c:1324 c-decl.c:1426 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of %q+D" +-msgstr "%Jredefinició de \"%D\"" +- +-#: c-decl.c:1359 c-decl.c:1464 +-#, fuzzy, gcc-internal-format +-msgid "static declaration of %q+D follows non-static declaration" +-msgstr "%Jdeclaració \"static\" de \"%D\" a continuació d'una declaració \"non-static\"" +- +-#: c-decl.c:1369 c-decl.c:1376 c-decl.c:1453 c-decl.c:1461 +-#, fuzzy, gcc-internal-format +-msgid "non-static declaration of %q+D follows static declaration" +-msgstr "%Jdeclaració \"non-static\" de \"%D\" a continuació d'una declaració \"static\"" +- +-#: c-decl.c:1393 +-#, gcc-internal-format +-msgid "% attribute present on %q+D" +-msgstr "" +- +-#: c-decl.c:1395 +-#, fuzzy, gcc-internal-format +-msgid "%Jbut not here" +-msgstr " primer tipus aquí" +- +-#: c-decl.c:1413 +-#, fuzzy, gcc-internal-format +-msgid "thread-local declaration of %q+D follows non-thread-local declaration" +-msgstr "%Jdeclaració \"thread-local\" de \"%D\" a continuació d'una declaració \"non-thread-local\"" +- +-#: c-decl.c:1416 +-#, fuzzy, gcc-internal-format +-msgid "non-thread-local declaration of %q+D follows thread-local declaration" +-msgstr "%Jdeclaració \"non-thread-local\" de \"%D\" a continuació d'una declaració \"thread-local\"" +- +-#: c-decl.c:1446 +-#, fuzzy, gcc-internal-format +-msgid "extern declaration of %q+D follows declaration with no linkage" +-msgstr "%Jla declaració externa de \"%D\" no coincideix amb la declaració sense \"linkage\"" +- +-#: c-decl.c:1482 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D with no linkage follows extern declaration" +-msgstr "%Jla declaració de \"%D\" sense \"linkage\" segueix una declaració \"extern\"" +- +-#: c-decl.c:1488 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of %q+D with no linkage" +-msgstr "%Jredeclaració de \"%D\" sense \"linkage\"" +- +-#: c-decl.c:1502 +-#, gcc-internal-format +-msgid "redeclaration of %q+D with different visibility (old visibility preserved)" +-msgstr "" +- +-#: c-decl.c:1513 +-#, fuzzy, gcc-internal-format +-msgid "inline declaration of %qD follows declaration with attribute noinline" +-msgstr "%Jla declaració externa de \"%D\" no coincideix amb la declaració sense \"linkage\"" +- +-#: c-decl.c:1520 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D with attribute noinline follows inline declaration " +-msgstr "%Jla declaració de \"%D\" sense \"linkage\" segueix una declaració \"extern\"" +- +-#: c-decl.c:1539 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared inline after being called" +-msgstr "%J\"%D\" declarat «inline» abans de ser cridat" +- +-#: c-decl.c:1544 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared inline after its definition" +-msgstr "%J\"%D\" declarat «inline» després de la seva definició" +- +-#: c-decl.c:1563 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of parameter %q+D" +-msgstr "%Jredefinició de typedef \"%D\"" +- +-#: c-decl.c:1590 +-#, fuzzy, gcc-internal-format +-msgid "redundant redeclaration of %q+D" +-msgstr "%Jdeclaració redundant de \"%D\"" +- +-#: c-decl.c:1970 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D shadows previous non-variable" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: c-decl.c:1975 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D shadows a parameter" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: c-decl.c:1978 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D shadows a global declaration" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: c-decl.c:1988 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q+D shadows a previous local" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: c-decl.c:1991 cp/name-lookup.c:988 cp/name-lookup.c:1019 +-#: cp/name-lookup.c:1027 +-#, gcc-internal-format +-msgid "%Jshadowed declaration is here" +-msgstr "%Jla declaració enfosquit és aquí" +- +-#: c-decl.c:2183 +-#, fuzzy, gcc-internal-format +-msgid "nested extern declaration of %qD" +-msgstr "declaració extern niada de \"%s\"" +- +-#: c-decl.c:2346 c-decl.c:2349 +-#, fuzzy, gcc-internal-format +-msgid "implicit declaration of function %qE" +-msgstr "declaració implícita de la funció \"%s\"" +- +-#: c-decl.c:2411 +-#, fuzzy, gcc-internal-format +-msgid "incompatible implicit declaration of built-in function %qD" +-msgstr "declaració implícita de la funció \"%#D\"" +- +-#: c-decl.c:2420 +-#, fuzzy, gcc-internal-format +-msgid "incompatible implicit declaration of function %qD" +-msgstr "declaració implícita de la funció \"%#D\"" +- +-#: c-decl.c:2473 +-#, fuzzy, gcc-internal-format +-msgid "%H%qE undeclared here (not in a function)" +-msgstr "\"%s\" no ha estat declarat aquí (no en una funció)" +- +-#: c-decl.c:2478 +-#, fuzzy, gcc-internal-format +-msgid "%H%qE undeclared (first use in this function)" +-msgstr "\"%s\" no ha estat declarat aquí (primer us en aquesta funció)" +- +-#: c-decl.c:2482 +-#, fuzzy, gcc-internal-format +-msgid "%H(Each undeclared identifier is reported only once" +-msgstr "(Cada identificador no declarat solament es reporta una vegada" +- +-#: c-decl.c:2483 +-#, fuzzy, gcc-internal-format +-msgid "%Hfor each function it appears in.)" +-msgstr "per a cada funció en la qual apareix.)" +- +-#: c-decl.c:2521 cp/decl.c:2397 +-#, fuzzy, gcc-internal-format +-msgid "label %qE referenced outside of any function" +-msgstr "l'etiqueta %s es referenciada fora de qualsevol funció" +- +-#: c-decl.c:2563 +-#, fuzzy, gcc-internal-format +-msgid "duplicate label declaration %qE" +-msgstr "declaració de l'etiqueta \"%s\" duplicada" +- +-#: c-decl.c:2599 +-#, fuzzy, gcc-internal-format +-msgid "%Hduplicate label %qD" +-msgstr "%Hetiqueta duplicada \"%D\"" +- +-#: c-decl.c:2609 +-#, fuzzy, gcc-internal-format +-msgid "%Jjump into statement expression" +-msgstr "desbordament en la constant implícita" +- +-#: c-decl.c:2611 +-#, fuzzy, gcc-internal-format +-msgid "%Jjump into scope of identifier with variably modified type" +-msgstr "l'argument de patró \"%T\" és un tipus modificat variablement" +- +-#: c-decl.c:2626 +-#, gcc-internal-format +-msgid "%Htraditional C lacks a separate namespace for labels, identifier %qE conflicts" +-msgstr "" +- +-#: c-decl.c:2701 +-#, gcc-internal-format +-msgid "%H%qE defined as wrong kind of tag" +-msgstr "" +- +-#: c-decl.c:2903 +-#, gcc-internal-format +-msgid "unnamed struct/union that defines no instances" +-msgstr "struct/union sense nom que no defineix cap instància" +- +-#: c-decl.c:2911 +-#, gcc-internal-format +-msgid "empty declaration with storage class specifier does not redeclare tag" +-msgstr "" +- +-#: c-decl.c:2922 +-#, fuzzy, gcc-internal-format +-msgid "empty declaration with type qualifier does not redeclare tag" +-msgstr "la declaració no declara res" +- +-#: c-decl.c:2943 c-decl.c:2950 +-#, fuzzy, gcc-internal-format +-msgid "useless type name in empty declaration" +-msgstr "paraules claus inútils o noms de tipus en una declaració buida" +- +-#: c-decl.c:2958 +-#, fuzzy, gcc-internal-format +-msgid "% in empty declaration" +-msgstr "declaració buida" +- +-#: c-decl.c:2964 +-#, fuzzy, gcc-internal-format +-msgid "% in file-scope empty declaration" +-msgstr "es van especificar dos tipus en una declaració buida" +- +-#: c-decl.c:2970 +-#, fuzzy, gcc-internal-format +-msgid "% in file-scope empty declaration" +-msgstr "es van especificar dos tipus en una declaració buida" +- +-#: c-decl.c:2976 +-#, fuzzy, gcc-internal-format +-msgid "useless storage class specifier in empty declaration" +-msgstr "especificadors de classe d'emmagatzematge no vàlids en les declaracions de paràmetres" +- +-#: c-decl.c:2982 +-#, fuzzy, gcc-internal-format +-msgid "useless %<__thread%> in empty declaration" +-msgstr "paraules claus inútils o noms de tipus en una declaració buida" +- +-#: c-decl.c:2990 +-#, fuzzy, gcc-internal-format +-msgid "useless type qualifier in empty declaration" +-msgstr "qualificadors de tipus duplicats en la declaració %s" +- +-#: c-decl.c:2997 +-#, gcc-internal-format +-msgid "empty declaration" +-msgstr "declaració buida" +- +-#: c-decl.c:3063 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 does not support % or type qualifiers in parameter array declarators" +-msgstr "ISO C90 no dóna suport a \"static\" o qualificadors de tipus dins matrius de declaradors de paràmetres" +- +-#: c-decl.c:3066 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 does not support %<[*]%> array declarators" +-msgstr "ISO C90 no dóna suport a declaradors de paràmetres \"[*]\"" +- +-#. C99 6.7.5.2p4 +-#. A function definition isn't function prototype scope C99 6.2.1p4. +-#. C99 6.7.5.2p4 +-#: c-decl.c:3073 c-decl.c:5015 +-#, gcc-internal-format +-msgid "%<[*]%> not allowed in other than function prototype scope" +-msgstr "" +- +-#: c-decl.c:3097 +-#, gcc-internal-format +-msgid "static or type qualifiers in abstract declarator" +-msgstr "static o qualificador de tipus en un declarador abstracte" +- +-#: c-decl.c:3183 +-#, fuzzy, gcc-internal-format +-msgid "%q+D is usually a function" +-msgstr "%J\"%D\" és generalment una funció" +- +-#: c-decl.c:3192 cp/decl.c:3983 cp/decl2.c:773 +-#, fuzzy, gcc-internal-format +-msgid "typedef %qD is initialized (use __typeof__ instead)" +-msgstr "typedef \"%D\" està inicialitzat (utilitzi __typeof__ en el seu lloc)" +- +-#: c-decl.c:3197 +-#, fuzzy, gcc-internal-format +-msgid "function %qD is initialized like a variable" +-msgstr "la funció \"%#D\" està inicialitzada com una variable" +- +-#. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. +-#: c-decl.c:3203 +-#, fuzzy, gcc-internal-format +-msgid "parameter %qD is initialized" +-msgstr "el paràmetre \"%s\" té valor inicial" +- +-#: c-decl.c:3228 +-#, fuzzy, gcc-internal-format +-msgid "variable %qD has initializer but incomplete type" +-msgstr "la variable \"%#D\" té inicializador però de tipus de dada incompleta" +- +-#: c-decl.c:3316 c-decl.c:6108 cp/decl.c:4025 cp/decl.c:10985 +-#, fuzzy, gcc-internal-format +-msgid "inline function %q+D given attribute noinline" +-msgstr "%Jha donat un atribut «noinline» a la funció «inline» \"%D\"" +- +-#: c-decl.c:3327 +-#, gcc-internal-format +-msgid "%q+D is static but declared in inline function %qD which is not static" +-msgstr "" +- +-#: c-decl.c:3418 +-#, fuzzy, gcc-internal-format +-msgid "initializer fails to determine size of %q+D" +-msgstr "l'inicializador no pot determinar la grandària de \"%D\"" +- +-#: c-decl.c:3423 +-#, fuzzy, gcc-internal-format +-msgid "array size missing in %q+D" +-msgstr "falta la grandària de la matriu en \"%D\"" +- +-#: c-decl.c:3435 +-#, fuzzy, gcc-internal-format +-msgid "zero or negative size array %q+D" +-msgstr "%Jmatriu \"%D\" de grandària zero o negatiu" +- +-#: c-decl.c:3490 varasm.c:2067 +-#, fuzzy, gcc-internal-format +-msgid "storage size of %q+D isn%'t known" +-msgstr "no es coneix la grandària d'emmagatzematge de \"%D\"" +- +-#: c-decl.c:3500 +-#, fuzzy, gcc-internal-format +-msgid "storage size of %q+D isn%'t constant" +-msgstr "la grandària d'emmagatzematge de \"%D\" no és constant" +- +-#: c-decl.c:3545 +-#, fuzzy, gcc-internal-format +-msgid "ignoring asm-specifier for non-static local variable %q+D" +-msgstr "%Js'ignora l'especificador \"asm\" per a la variable local \"non-static\" \"%D\"" +- +-#: c-decl.c:3573 fortran/f95-lang.c:653 +-#, gcc-internal-format +-msgid "cannot put object with volatile field into register" +-msgstr "no es pot posar objecte amb camp volatile en register" +- +-#: c-decl.c:3702 +-#, gcc-internal-format +-msgid "ISO C forbids forward parameter declarations" +-msgstr "ISO C prohibeix declaracions avançades de paràmetres" +- +-#: c-decl.c:3821 +-#, fuzzy, gcc-internal-format +-msgid "bit-field %qs width not an integer constant" +-msgstr "l'amplària del camp de bits \"%s\" no és una constant entera" +- +-#: c-decl.c:3829 +-#, fuzzy, gcc-internal-format +-msgid "negative width in bit-field %qs" +-msgstr "amplària negativa en el camp de bit \"%s\"" +- +-#: c-decl.c:3834 +-#, fuzzy, gcc-internal-format +-msgid "zero width for bit-field %qs" +-msgstr "amplària zero per al camp de bits \"%s\"" +- +-#: c-decl.c:3844 +-#, fuzzy, gcc-internal-format +-msgid "bit-field %qs has invalid type" +-msgstr "el camp de bits \"%s\" té un tipus no vàlid" +- +-#: c-decl.c:3854 +-#, fuzzy, gcc-internal-format +-msgid "type of bit-field %qs is a GCC extension" +-msgstr "el tipus de camp de bits \"%s\" és una extensió del GCC" +- +-#: c-decl.c:3860 +-#, fuzzy, gcc-internal-format +-msgid "width of %qs exceeds its type" +-msgstr "l'amplària de \"%s\" excedeix el seu tipus" +- +-#: c-decl.c:3873 +-#, fuzzy, gcc-internal-format +-msgid "%qs is narrower than values of its type" +-msgstr "\"%s\" és més estret que els valors del seu tipus" +- +-#: c-decl.c:3892 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 forbids array %qs whose size can%'t be evaluated" +-msgstr "ISO C90 prohibeix matriu \"%s\" que la seua grandària no pot ser avaluada" +- +-#: c-decl.c:3896 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 forbids array whose size can%'t be evaluated" +-msgstr "ISO C90 prohibeix matriu \"%s\" que la seua grandària no pot ser avaluada" +- +-#: c-decl.c:3902 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 forbids variable length array %qs" +-msgstr "ISO C90 prohibeix la matriu \"%s\" de grandària variable" +- +-#: c-decl.c:3905 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 forbids variable length array" +-msgstr "ISO C++ prohibeix la matriu de grandària variable" +- +-#: c-decl.c:3914 +-#, fuzzy, gcc-internal-format +-msgid "the size of array %qs can%'t be evaluated" +-msgstr "la grandària del tipus no pot ser avaluat explícitament" +- +-#: c-decl.c:3918 +-#, fuzzy, gcc-internal-format +-msgid "the size of array can %'t be evaluated" +-msgstr "la grandària del tipus no pot ser avaluat explícitament" +- +-#: c-decl.c:3924 +-#, gcc-internal-format +-msgid "variable length array %qs is used" +-msgstr "" +- +-#: c-decl.c:3928 cp/decl.c:7004 +-#, gcc-internal-format +-msgid "variable length array is used" +-msgstr "" +- +-#: c-decl.c:4051 c-decl.c:4328 +-#, fuzzy, gcc-internal-format +-msgid "variably modified %qs at file scope" +-msgstr "l'argument de patró \"%T\" és un tipus modificat variablement" +- +-#: c-decl.c:4069 +-#, fuzzy, gcc-internal-format +-msgid "type defaults to % in declaration of %qs" +-msgstr "el tipus de dada per omissió és \"int\" en la declaració de \"%s\"" +- +-#: c-decl.c:4097 +-#, fuzzy, gcc-internal-format +-msgid "duplicate %" +-msgstr "\"const\" duplicat" +- +-#: c-decl.c:4099 +-#, fuzzy, gcc-internal-format +-msgid "duplicate %" +-msgstr "\"restrict\" duplicat" +- +-#: c-decl.c:4101 +-#, fuzzy, gcc-internal-format +-msgid "duplicate %" +-msgstr "\"volatile\" duplicat" +- +-#: c-decl.c:4120 +-#, fuzzy, gcc-internal-format +-msgid "function definition declared %" +-msgstr "la definició de la funció ho va declarar com \"auto\"" +- +-#: c-decl.c:4122 +-#, fuzzy, gcc-internal-format +-msgid "function definition declared %" +-msgstr "la definició de la funció ho va declarar com \"register\"" +- +-#: c-decl.c:4124 +-#, fuzzy, gcc-internal-format +-msgid "function definition declared %" +-msgstr "la definició de la funció ho va declarar com \"typedef\"" +- +-#: c-decl.c:4126 +-#, fuzzy, gcc-internal-format +-msgid "function definition declared %<__thread%>" +-msgstr "la definició de la funció ho va declarar com \"__thread\"" +- +-#: c-decl.c:4142 +-#, fuzzy, gcc-internal-format +-msgid "storage class specified for structure field %qs" +-msgstr "es va especificar una classe d'emmagatzematge per al camp de l'estructura \"%s\"" +- +-#: c-decl.c:4146 cp/decl.c:7874 +-#, fuzzy, gcc-internal-format +-msgid "storage class specified for parameter %qs" +-msgstr "es va especificar una classe d'emmagatzematge per al paràmetre \"%s\"" +- +-#: c-decl.c:4149 cp/decl.c:7876 +-#, gcc-internal-format +-msgid "storage class specified for typename" +-msgstr "es va especificar una classe d'emmagatzematge per al nom de tipus" +- +-#: c-decl.c:4166 cp/decl.c:7893 +-#, fuzzy, gcc-internal-format +-msgid "%qs initialized and declared %" +-msgstr "\"%s\" iniciat i declarat com \"extern\"" +- +-#: c-decl.c:4169 cp/decl.c:7896 +-#, fuzzy, gcc-internal-format +-msgid "%qs has both % and initializer" +-msgstr "\"%s\" té \"extern\" i assignador de valor inicial al mateix temps" +- +-#: c-decl.c:4174 +-#, fuzzy, gcc-internal-format +-msgid "file-scope declaration of %qs specifies %" +-msgstr "la declaració al nivell del fitxer de \"%s\" especifica \"auto\"" +- +-#: c-decl.c:4176 +-#, fuzzy, gcc-internal-format +-msgid "file-scope declaration of %qs specifies %" +-msgstr "la declaració al nivell del fitxer de \"%s\" especifica \"auto\"" +- +-#: c-decl.c:4181 cp/decl.c:7900 +-#, fuzzy, gcc-internal-format +-msgid "nested function %qs declared %" +-msgstr "la funció niada \"%s\" es va declarar \"extern\"" +- +-#: c-decl.c:4184 cp/decl.c:7910 +-#, fuzzy, gcc-internal-format +-msgid "function-scope %qs implicitly auto and declared %<__thread%>" +-msgstr "l'àmbit de la funció \"%s\" és implícitament acte i declarada \"__thread\"" +- +-#. Only the innermost declarator (making a parameter be of +-#. array type which is converted to pointer type) +-#. may have static or type qualifiers. +-#: c-decl.c:4231 c-decl.c:4472 +-#, gcc-internal-format +-msgid "static or type qualifiers in non-parameter array declarator" +-msgstr "static o qualificador de tipus en un declarador de matriu que no és paràmetre" +- +-#: c-decl.c:4278 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qs as array of voids" +-msgstr "declaració de \"%s\" com una matriu de voids" +- +-#: c-decl.c:4284 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qs as array of functions" +-msgstr "declaració de \"%s\" com una matriu de funcions" +- +-#: c-decl.c:4289 +-#, gcc-internal-format +-msgid "invalid use of structure with flexible array member" +-msgstr "ús no vàlid d'estructura amb membres de matriu flexible" +- +-#: c-decl.c:4309 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qs has non-integer type" +-msgstr "la grandària de la matriu \"%s\" té un tipus no enter" +- +-#: c-decl.c:4314 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids zero-size array %qs" +-msgstr "ISO C prohibeix la matriu \"%s\" de grandària zero" +- +-#: c-decl.c:4321 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qs is negative" +-msgstr "la grandària de la matriu \"%s\" és negatiu" +- +-#: c-decl.c:4375 c-decl.c:4631 cp/decl.c:8375 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qs is too large" +-msgstr "la grandària de la matriu \"%s\" és massa gran" +- +-#: c-decl.c:4386 +-#, gcc-internal-format +-msgid "ISO C90 does not support flexible array members" +-msgstr "ISO C90 no té suport per a membres de matrius flexibles" +- +-#. C99 6.7.5.2p4 +-#: c-decl.c:4399 +-#, fuzzy, gcc-internal-format +-msgid "%<[*]%> not allowed in other than a declaration" +-msgstr "no es permet l'espai de noms \"%D\" en la declaració d'ús" +- +-#: c-decl.c:4422 +-#, gcc-internal-format +-msgid "array type has incomplete element type" +-msgstr "el tipus array té tipus d'element incomplet" +- +-#: c-decl.c:4504 cp/decl.c:8001 +-#, fuzzy, gcc-internal-format +-msgid "%qs declared as function returning a function" +-msgstr "\"%s\" que és declarat com funció retorna una funció" +- +-#: c-decl.c:4509 cp/decl.c:8006 +-#, fuzzy, gcc-internal-format +-msgid "%qs declared as function returning an array" +-msgstr "\"%s\" que és declarat com funció retorna una matriu" +- +-#: c-decl.c:4531 +-#, fuzzy, gcc-internal-format +-msgid "function definition has qualified void return type" +-msgstr "definició no vàlida del tipus qualificat \"%T\"" +- +-#: c-decl.c:4534 cp/decl.c:7990 cp/pt.c:8568 +-#, gcc-internal-format +-msgid "type qualifiers ignored on function return type" +-msgstr "s'ignoren els qualificadors de tipus en el tipus de retorn de la funció" +- +-#: c-decl.c:4563 c-decl.c:4644 c-decl.c:4732 c-decl.c:4825 +-#, gcc-internal-format +-msgid "ISO C forbids qualified function types" +-msgstr "ISO C prohibeix els tipus de funció qualificats" +- +-#: c-decl.c:4652 +-#, fuzzy, gcc-internal-format +-msgid "typedef %q+D declared %" +-msgstr "%Jla variable \"%D\" és declarada com \"inline\"" +- +-#: c-decl.c:4667 +-#, gcc-internal-format +-msgid "ISO C forbids const or volatile function types" +-msgstr "ISO C prohibeix els tipus de funció const o volatile" +- +-#. C99 6.7.2.1p8 +-#: c-decl.c:4677 +-#, gcc-internal-format +-msgid "a member of a structure or union cannot have a variably modified type" +-msgstr "" +- +-#: c-decl.c:4693 +-#, fuzzy, gcc-internal-format +-msgid "variable or field %qs declared void" +-msgstr "variable o camp \"%s\" declarat void" +- +-#: c-decl.c:4725 +-#, gcc-internal-format +-msgid "attributes in parameter array declarator ignored" +-msgstr "atributs en el declarador de paràmetres de matriu ignorats" +- +-#: c-decl.c:4760 +-#, fuzzy, gcc-internal-format +-msgid "parameter %q+D declared %" +-msgstr "el paràmetre \"%D\" es va declarar void" +- +-#: c-decl.c:4773 +-#, fuzzy, gcc-internal-format +-msgid "field %qs declared as a function" +-msgstr "el camp \"%s\" es declara com una funció" +- +-#: c-decl.c:4779 +-#, fuzzy, gcc-internal-format +-msgid "field %qs has incomplete type" +-msgstr "el camp \"%s\" té tipus de dada incompleta" +- +-#: c-decl.c:4796 c-decl.c:4808 c-decl.c:4812 +-#, fuzzy, gcc-internal-format +-msgid "invalid storage class for function %qs" +-msgstr "classe d'emmagatzematge no vàlida per a la funció \"%s\"" +- +-#: c-decl.c:4831 +-#, fuzzy, gcc-internal-format +-msgid "% function returns non-void value" +-msgstr "la funció \"no return\" retorna un valor que no és \"void\"" +- +-#: c-decl.c:4867 +-#, fuzzy, gcc-internal-format +-msgid "cannot inline function %" +-msgstr "no es pot fer «inline» la funció \"main\"" +- +-#: c-decl.c:4910 +-#, gcc-internal-format +-msgid "variable previously declared % redeclared %" +-msgstr "" +- +-#: c-decl.c:4920 +-#, fuzzy, gcc-internal-format +-msgid "variable %q+D declared %" +-msgstr "%Jla variable \"%D\" és declarada com \"inline\"" +- +-#. C99 6.7.5.2p2 +-#: c-decl.c:4951 +-#, gcc-internal-format +-msgid "object with variably modified type must have no linkage" +-msgstr "" +- +-#: c-decl.c:5020 c-decl.c:6199 +-#, fuzzy, gcc-internal-format +-msgid "function declaration isn%'t a prototype" +-msgstr "la declaració de la funció no és un prototip" +- +-#: c-decl.c:5028 +-#, gcc-internal-format +-msgid "parameter names (without types) in function declaration" +-msgstr "noms de paràmetres (sense tipus) en la declaració de la funció" +- +-#: c-decl.c:5061 +-#, fuzzy, gcc-internal-format +-msgid "parameter %u (%q+D) has incomplete type" +-msgstr "%Jel paràmetre \"%D\" té un tipus incomplet" +- +-#: c-decl.c:5064 +-#, fuzzy, gcc-internal-format +-msgid "%Jparameter %u has incomplete type" +-msgstr "%Jel paràmetre \"%D\" té un tipus incomplet" +- +-#: c-decl.c:5073 +-#, fuzzy, gcc-internal-format +-msgid "parameter %u (%q+D) has void type" +-msgstr "%Jel paràmetre \"%D\" té un tipus incomplet" +- +-#: c-decl.c:5076 +-#, fuzzy, gcc-internal-format +-msgid "%Jparameter %u has void type" +-msgstr "%Jel paràmetre \"%D\" té un tipus incomplet" +- +-#: c-decl.c:5138 +-#, gcc-internal-format +-msgid "% as only parameter may not be qualified" +-msgstr "" +- +-#: c-decl.c:5142 c-decl.c:5176 +-#, gcc-internal-format +-msgid "% must be the only parameter" +-msgstr "" +- +-#: c-decl.c:5170 +-#, fuzzy, gcc-internal-format +-msgid "parameter %q+D has just a forward declaration" +-msgstr "%Jel paràmetre \"%D\" només té una declaració posterior" +- +-#. The %s will be one of 'struct', 'union', or 'enum'. +-#: c-decl.c:5215 +-#, fuzzy, gcc-internal-format +-msgid "%<%s %E%> declared inside parameter list" +-msgstr "\"%s %s\" declarat dintre d'una llista de paràmetres" +- +-#. The %s will be one of 'struct', 'union', or 'enum'. +-#: c-decl.c:5219 +-#, gcc-internal-format +-msgid "anonymous %s declared inside parameter list" +-msgstr "%s anònim declarat dintre d'una llista de paràmetres" +- +-#: c-decl.c:5224 +-#, gcc-internal-format +-msgid "its scope is only this definition or declaration, which is probably not what you want" +-msgstr "el seu àmbit és solament aquesta definició o declaració, la qual cosa probablement no sigui el que desitja." +- +-#: c-decl.c:5358 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of %" +-msgstr "redefinició de \"union %s\"" +- +-#: c-decl.c:5360 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of %" +-msgstr "redefinició de \"struct %s\"" +- +-#: c-decl.c:5365 +-#, fuzzy, gcc-internal-format +-msgid "nested redefinition of %" +-msgstr "redefinició niada de \"%s\"" +- +-#: c-decl.c:5367 +-#, fuzzy, gcc-internal-format +-msgid "nested redefinition of %" +-msgstr "redefinició niada de \"%s\"" +- +-#: c-decl.c:5442 cp/decl.c:3780 +-#, gcc-internal-format +-msgid "declaration does not declare anything" +-msgstr "la declaració no declara res" +- +-#: c-decl.c:5446 +-#, fuzzy, gcc-internal-format +-msgid "ISO C doesn%'t support unnamed structs/unions" +-msgstr "ISO C no té suport per a structs/unions sense nom" +- +-#: c-decl.c:5490 c-decl.c:5506 +-#, fuzzy, gcc-internal-format +-msgid "duplicate member %q+D" +-msgstr "%Jmembre duplicat \"%D\"" +- +-#: c-decl.c:5545 +-#, fuzzy, gcc-internal-format +-msgid "union has no named members" +-msgstr "membres nomenats" +- +-#: c-decl.c:5547 +-#, fuzzy, gcc-internal-format +-msgid "union has no members" +-msgstr "agregat anònim sense membres" +- +-#: c-decl.c:5552 +-#, fuzzy, gcc-internal-format +-msgid "struct has no named members" +-msgstr "membres nomenats" +- +-#: c-decl.c:5554 +-#, fuzzy, gcc-internal-format +-msgid "struct has no members" +-msgstr "%s no té un membre cridat \"%s\"" +- +-#: c-decl.c:5616 +-#, gcc-internal-format +-msgid "%Jflexible array member in union" +-msgstr "%Jmembre de matriu flexible en el union" +- +-#: c-decl.c:5621 +-#, gcc-internal-format +-msgid "%Jflexible array member not at end of struct" +-msgstr "%Jel membre de matriu flexible no està al final del struct" +- +-#: c-decl.c:5626 +-#, gcc-internal-format +-msgid "%Jflexible array member in otherwise empty struct" +-msgstr "%Jel membre de matriu flexible seria d'altra manera un struct buit" +- +-# +-#: c-decl.c:5633 +-#, gcc-internal-format +-msgid "%Jinvalid use of structure with flexible array member" +-msgstr "%Jús no vàlid d'estructura amb membres de matriu flexible" +- +-#: c-decl.c:5742 +-#, gcc-internal-format +-msgid "union cannot be made transparent" +-msgstr "union no es pot fer transparent" +- +-#: c-decl.c:5813 +-#, fuzzy, gcc-internal-format +-msgid "nested redefinition of %" +-msgstr "redefinició niada de \"%s\"" +- +-#. This enum is a named one that has been declared already. +-#: c-decl.c:5820 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of %" +-msgstr "redeclaració de \"enum %s\"" +- +-#: c-decl.c:5883 +-#, gcc-internal-format +-msgid "enumeration values exceed range of largest integer" +-msgstr "els valors d'enumeració excedeixen els límits de l'enter més gran" +- +-#: c-decl.c:5900 +-#, gcc-internal-format +-msgid "specified mode too small for enumeral values" +-msgstr "" +- +-#: c-decl.c:5996 +-#, fuzzy, gcc-internal-format +-msgid "enumerator value for %qE is not an integer constant" +-msgstr "el valor de enumerator per a \"%s\" no és una constant entera" +- +-#: c-decl.c:6013 +-#, gcc-internal-format +-msgid "overflow in enumeration values" +-msgstr "desbordament en valors d'enumeració" +- +-#: c-decl.c:6018 +-#, fuzzy, gcc-internal-format +-msgid "ISO C restricts enumerator values to range of %" +-msgstr "ISO C restringeix els valors d'enumeració als límits de \"int\"" +- +-#: c-decl.c:6125 +-#, gcc-internal-format +-msgid "return type is an incomplete type" +-msgstr "el tipus de retorn és un tipus incomplet" +- +-#: c-decl.c:6133 +-#, fuzzy, gcc-internal-format +-msgid "return type defaults to %" +-msgstr "el tipus de retorn per omissió és \"int\"" +- +-#: c-decl.c:6206 +-#, fuzzy, gcc-internal-format +-msgid "no previous prototype for %q+D" +-msgstr "%Jno hi ha un prototip previ per a \"%D\"" +- +-#: c-decl.c:6215 +-#, fuzzy, gcc-internal-format +-msgid "%q+D was used with no prototype before its definition" +-msgstr "%Jes va usar \"%D\" sense prototip abans de la seva definició" +- +-#: c-decl.c:6221 cp/decl.c:11126 +-#, fuzzy, gcc-internal-format +-msgid "no previous declaration for %q+D" +-msgstr "no hi ha declaració prèvia per a \"%D\"" +- +-#: c-decl.c:6231 +-#, fuzzy, gcc-internal-format +-msgid "%q+D was used with no declaration before its definition" +-msgstr "%Jes va usar \"%D\" sense declaració abans de la seva definició" +- +-#: c-decl.c:6254 c-decl.c:6723 +-#, fuzzy, gcc-internal-format +-msgid "return type of %q+D is not %" +-msgstr "el tipus de retorn de \"%D\" no és \"int\"" +- +-#: c-decl.c:6259 +-#, fuzzy, gcc-internal-format +-msgid "%q+D is normally a non-static function" +-msgstr "%J\"%D\" generalment és una funció «non-static»" +- +-#: c-decl.c:6293 +-#, gcc-internal-format +-msgid "%Jold-style parameter declarations in prototyped function definition" +-msgstr "" +- +-#: c-decl.c:6307 +-#, fuzzy, gcc-internal-format +-msgid "%Jtraditional C rejects ISO C style function definitions" +-msgstr "C tradicional rebutja la definició de funcions d'estil ISO·C" +- +-#: c-decl.c:6323 +-#, gcc-internal-format +-msgid "%Jparameter name omitted" +-msgstr "%Jes va ometre el nom del paràmetre" +- +-#: c-decl.c:6357 +-#, fuzzy, gcc-internal-format +-msgid "%Jold-style function definition" +-msgstr "%s: no es va convertir la definició de la funció\n" +- +-#: c-decl.c:6366 +-#, gcc-internal-format +-msgid "%Jparameter name missing from parameter list" +-msgstr "%Jfalta el nom del paràmetre de la llista de paràmetres" +- +-#: c-decl.c:6377 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared as a non-parameter" +-msgstr "%J\"%D\" declarat com «non-parameter»" +- +-#: c-decl.c:6382 +-#, fuzzy, gcc-internal-format +-msgid "multiple parameters named %q+D" +-msgstr "%Jmúltiples paràmetres nomenats \"%D\"" +- +-#: c-decl.c:6390 +-#, fuzzy, gcc-internal-format +-msgid "parameter %q+D declared with void type" +-msgstr "el paràmetre \"%D\" es va declarar void" +- +-#: c-decl.c:6407 c-decl.c:6409 +-#, fuzzy, gcc-internal-format +-msgid "type of %q+D defaults to %" +-msgstr "%Jel tipus de \"%D\" és \"int\" per omissió" +- +-#: c-decl.c:6428 +-#, fuzzy, gcc-internal-format +-msgid "parameter %q+D has incomplete type" +-msgstr "el paràmetre té tipus incomplet" +- +-#: c-decl.c:6434 +-#, fuzzy, gcc-internal-format +-msgid "declaration for parameter %q+D but no such parameter" +-msgstr "%Jexisteix la declaració per al paràmetre \"%D\" però no hi ha tal paràmetre" +- +-#: c-decl.c:6484 +-#, fuzzy, gcc-internal-format +-msgid "number of arguments doesn%'t match built-in prototype" +-msgstr "el nombre d'arguments no coincideixen amb el prototip" +- +-#: c-decl.c:6488 +-#, fuzzy, gcc-internal-format +-msgid "number of arguments doesn%'t match prototype" +-msgstr "el nombre d'arguments no coincideixen amb el prototip" +- +-#: c-decl.c:6489 c-decl.c:6529 c-decl.c:6542 +-#, gcc-internal-format +-msgid "%Hprototype declaration" +-msgstr "%Hdeclaració de prototip" +- +-#: c-decl.c:6523 +-#, fuzzy, gcc-internal-format +-msgid "promoted argument %qD doesn%'t match built-in prototype" +-msgstr "l'argument promogut \"%D\" no coincideix amb el prototip" +- +-#: c-decl.c:6527 +-#, fuzzy, gcc-internal-format +-msgid "promoted argument %qD doesn%'t match prototype" +-msgstr "l'argument promogut \"%D\" no coincideix amb el prototip" +- +-#: c-decl.c:6537 +-#, fuzzy, gcc-internal-format +-msgid "argument %qD doesn%'t match built-in prototype" +-msgstr "l'argument \"%D\" no coincideix amb el prototip" +- +-#: c-decl.c:6541 +-#, fuzzy, gcc-internal-format +-msgid "argument %qD doesn%'t match prototype" +-msgstr "l'argument \"%D\" no coincideix amb el prototip" +- +-#: c-decl.c:6768 cp/decl.c:11820 +-#, gcc-internal-format +-msgid "no return statement in function returning non-void" +-msgstr "no hi ha una declaració de retorn en una funció que retorna \"non-void\"" +- +-#. If we get here, declarations have been used in a for loop without +-#. the C99 for loop scope. This doesn't make much sense, so don't +-#. allow it. +-#: c-decl.c:6841 +-#, fuzzy, gcc-internal-format +-msgid "% loop initial declaration used outside C99 mode" +-msgstr "es va usar la declaració inicial del cicle \"for\" fora del mode C99" +- +-#: c-decl.c:6870 +-#, fuzzy, gcc-internal-format +-msgid "declaration of static variable %q+D in % loop initial declaration" +-msgstr "%Jdeclaració de la variable \"static\" \"%D\" en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:6873 +-#, fuzzy, gcc-internal-format +-msgid "declaration of % variable %q+D in % loop initial declaration" +-msgstr "%Jdeclaració de la variable \"extern\" \"%D\" en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:6878 +-#, fuzzy, gcc-internal-format +-msgid "% declared in % loop initial declaration" +-msgstr "\"struct %s\" declarat en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:6882 +-#, fuzzy, gcc-internal-format +-msgid "% declared in % loop initial declaration" +-msgstr "\"union %s\" declarat en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:6886 +-#, fuzzy, gcc-internal-format +-msgid "% declared in % loop initial declaration" +-msgstr "\"enum %s\" declarat en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:6890 +-#, fuzzy, gcc-internal-format +-msgid "declaration of non-variable %q+D in % loop initial declaration" +-msgstr "%Jdeclaració de \"%D\" que és \"non-variable\" en la declaració inicial del cicle \"for\"" +- +-#: c-decl.c:7178 c-decl.c:7420 c-decl.c:7716 +-#, fuzzy, gcc-internal-format +-msgid "duplicate %qE" +-msgstr "\"%s\" duplicat" +- +-#: c-decl.c:7201 c-decl.c:7430 c-decl.c:7617 +-#, fuzzy, gcc-internal-format +-msgid "two or more data types in declaration specifiers" +-msgstr "dos o més tipus de dades en la declaració de \"%s\"" +- +-#: c-decl.c:7213 cp/parser.c:2149 +-#, fuzzy, gcc-internal-format +-msgid "% is too long for GCC" +-msgstr "\"long long long\" és massa llarg per a GCC" +- +-#: c-decl.c:7220 c-decl.c:7520 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7226 +-#, fuzzy, gcc-internal-format +-msgid "ISO C90 does not support %" +-msgstr "ISO C90 no dóna suport a \"long long\"" +- +-#: c-decl.c:7231 c-decl.c:7260 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7234 c-decl.c:7437 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7237 c-decl.c:7459 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<_Bool%> in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7240 c-decl.c:7481 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7243 c-decl.c:7501 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7246 +-#, gcc-internal-format +-msgid "both % and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7249 +-#, gcc-internal-format +-msgid "both % and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7252 +-#, gcc-internal-format +-msgid "both % and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7263 c-decl.c:7440 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7266 c-decl.c:7462 +-#, gcc-internal-format +-msgid "both % and %<_Bool%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7269 c-decl.c:7484 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7272 c-decl.c:7504 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7275 c-decl.c:7523 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7278 +-#, gcc-internal-format +-msgid "both % and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7281 +-#, gcc-internal-format +-msgid "both % and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7284 +-#, gcc-internal-format +-msgid "both % and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7292 c-decl.c:7321 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7295 c-decl.c:7443 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7298 c-decl.c:7465 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<_Bool%> in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7301 c-decl.c:7507 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7304 c-decl.c:7526 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7307 +-#, gcc-internal-format +-msgid "both % and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7310 +-#, gcc-internal-format +-msgid "both % and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7313 +-#, gcc-internal-format +-msgid "both % and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7324 c-decl.c:7446 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7327 c-decl.c:7468 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<_Bool%> in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7330 c-decl.c:7510 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7333 c-decl.c:7529 +-#, fuzzy, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7336 +-#, gcc-internal-format +-msgid "both % and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7339 +-#, gcc-internal-format +-msgid "both % and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7342 +-#, gcc-internal-format +-msgid "both % and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7350 +-#, gcc-internal-format +-msgid "ISO C90 does not support complex types" +-msgstr "ISO C90 no té suport per a tipus complexos" +- +-#: c-decl.c:7352 c-decl.c:7449 +-#, gcc-internal-format +-msgid "both % and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7355 c-decl.c:7471 +-#, gcc-internal-format +-msgid "both % and %<_Bool%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7358 +-#, gcc-internal-format +-msgid "both % and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7361 +-#, gcc-internal-format +-msgid "both % and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7364 +-#, gcc-internal-format +-msgid "both % and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7367 +-#, gcc-internal-format +-msgid "both % and %<_Fract%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7370 +-#, gcc-internal-format +-msgid "both % and %<_Accum%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7373 +-#, gcc-internal-format +-msgid "both % and %<_Sat%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7381 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support saturating types" +-msgstr "ISO C no dóna suport a tipus enters complexos" +- +-#: c-decl.c:7383 c-decl.c:7452 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7386 c-decl.c:7474 +-#, gcc-internal-format +-msgid "both %<_Sat%> and %<_Bool%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7389 c-decl.c:7487 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7392 c-decl.c:7494 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7395 c-decl.c:7513 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7398 c-decl.c:7532 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7401 +-#, gcc-internal-format +-msgid "both %<_Sat%> and %<_Decimal32%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7404 +-#, gcc-internal-format +-msgid "both %<_Sat%> and %<_Decimal64%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7407 +-#, gcc-internal-format +-msgid "both %<_Sat%> and %<_Decimal128%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7410 +-#, gcc-internal-format +-msgid "both %<_Sat%> and % in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7549 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7552 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "s'especifica long i short al mateix temps per a \"%s\"" +- +-#: c-decl.c:7555 +-#, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7558 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7561 +-#, fuzzy, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "s'especifica signed i unsigned al mateix temps per a \"%s\"" +- +-#: c-decl.c:7564 c-decl.c:7590 +-#, gcc-internal-format +-msgid "both % and %<%s%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7567 +-#, gcc-internal-format +-msgid "both %<_Sat%> and %<%s%> in declaration specifiers" +-msgstr "" +- +-#: c-decl.c:7577 +-#, fuzzy, gcc-internal-format +-msgid "decimal floating point not supported for this target" +-msgstr "no es dóna suport a -fdata-sections en aquest objectiu" +- +-#: c-decl.c:7579 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support decimal floating point" +-msgstr "ISO C90 no dóna suport a \"long long\"" +- +-#: c-decl.c:7598 +-#, fuzzy, gcc-internal-format +-msgid "fixed-point types not supported for this target" +-msgstr "no es dóna suport a -fdata-sections en aquest objectiu" +- +-#: c-decl.c:7600 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support fixed-point types" +-msgstr "ISO C no dóna suport a tipus enters complexos" +- +-#: c-decl.c:7634 +-#, fuzzy, gcc-internal-format +-msgid "%qE fails to be a typedef or built in type" +-msgstr "\"%s\" falla al ser un typedef o un tipus intern del compilador" +- +-#: c-decl.c:7667 +-#, fuzzy, gcc-internal-format +-msgid "%qE is not at beginning of declaration" +-msgstr "\"%s\" no està en l'inici de la declaració" +- +-#: c-decl.c:7681 +-#, gcc-internal-format +-msgid "%<__thread%> used with %" +-msgstr "" +- +-#: c-decl.c:7683 +-#, gcc-internal-format +-msgid "%<__thread%> used with %" +-msgstr "" +- +-#: c-decl.c:7685 +-#, gcc-internal-format +-msgid "%<__thread%> used with %" +-msgstr "" +- +-#: c-decl.c:7696 +-#, fuzzy, gcc-internal-format +-msgid "%<__thread%> before %" +-msgstr "\"__thread\" abans \"extern\"" +- +-#: c-decl.c:7705 +-#, fuzzy, gcc-internal-format +-msgid "%<__thread%> before %" +-msgstr "\"__thread\" abans \"static\"" +- +-#: c-decl.c:7721 +-#, fuzzy, gcc-internal-format +-msgid "multiple storage classes in declaration specifiers" +-msgstr "múltiples classes d'emmagatzematge en la declaració de \"%s\"" +- +-#: c-decl.c:7728 +-#, gcc-internal-format +-msgid "%<__thread%> used with %qE" +-msgstr "" +- +-#: c-decl.c:7775 +-#, gcc-internal-format +-msgid "%<_Sat%> is used without %<_Fract%> or %<_Accum%>" +-msgstr "" +- +-#: c-decl.c:7787 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support plain % meaning %" +-msgstr "ISO C no té suport per a \"complex\" simples que signifiquen \"double complex\"" +- +-#: c-decl.c:7832 c-decl.c:7858 +-#, gcc-internal-format +-msgid "ISO C does not support complex integer types" +-msgstr "ISO C no dóna suport a tipus enters complexos" +- +-#: c-decl.c:8008 toplev.c:847 +-#, fuzzy, gcc-internal-format +-msgid "%q+F used but never defined" +-msgstr "\"%s\" utilitzat però mai definit" +- +-#: c-format.c:98 c-format.c:207 +-#, gcc-internal-format +-msgid "format string has invalid operand number" +-msgstr "la cadena de format té un nombre d'operadors no vàlid" +- +-#: c-format.c:115 +-#, gcc-internal-format +-msgid "function does not return string type" +-msgstr "la funció no retorna un tipus string" +- +-#: c-format.c:144 +-#, fuzzy, gcc-internal-format +-msgid "format string argument not a string type" +-msgstr "l'argument de la cadena de format no és del tipus cadena de text" +- +-#: c-format.c:187 +-#, gcc-internal-format +-msgid "unrecognized format specifier" +-msgstr "no es reconeix l'especificador de format" +- +-#: c-format.c:199 +-#, fuzzy, gcc-internal-format +-msgid "%qE is an unrecognized format function type" +-msgstr "\"%s\" és un format de tipus de funció no reconegut" +- +-#: c-format.c:213 +-#, fuzzy, gcc-internal-format +-msgid "%<...%> has invalid operand number" +-msgstr "\"...\" té un nombre d'operadors no vàlid" +- +-#: c-format.c:220 +-#, fuzzy, gcc-internal-format +-msgid "format string argument follows the args to be formatted" +-msgstr "l'argument de la cadena de format segueix els arguments que rebran format" +- +-#: c-format.c:927 +-#, fuzzy, gcc-internal-format +-msgid "function might be possible candidate for %qs format attribute" +-msgstr "la funció pot ser un candidat possible per a l'atribut de format \"%s\"" +- +-#: c-format.c:1019 c-format.c:1040 c-format.c:2058 +-#, gcc-internal-format +-msgid "missing $ operand number in format" +-msgstr "falta l'operand numèric $ en el format" +- +-#: c-format.c:1049 +-#, gcc-internal-format +-msgid "%s does not support %%n$ operand number formats" +-msgstr "%s no té suport per a l'operand amb format de nombre %%n$" +- +-#: c-format.c:1056 +-#, gcc-internal-format +-msgid "operand number out of range in format" +-msgstr "operand numèric fora de límits en el format" +- +-#: c-format.c:1079 +-#, gcc-internal-format +-msgid "format argument %d used more than once in %s format" +-msgstr "s'usa més d'una vegada l'argument de format %d en el format %s" +- +-#: c-format.c:1111 +-#, fuzzy, gcc-internal-format +-msgid "$ operand number used after format without operand number" +-msgstr "el nombre de operades especificats per al format no pren arguments" +- +-#: c-format.c:1142 +-#, gcc-internal-format +-msgid "format argument %d unused before used argument %d in $-style format" +-msgstr "no s'usa l'argument de format %d abans d'usar l'argument %d en el format $-style" +- +-#: c-format.c:1237 +-#, gcc-internal-format +-msgid "format not a string literal, format string not checked" +-msgstr "el format no és una cadena literal, no es va revisar la cadena de format" +- +-#: c-format.c:1252 c-format.c:1255 +-#, gcc-internal-format +-msgid "format not a string literal and no format arguments" +-msgstr "el format no és una cadena literal i no té arguments de format" +- +-#: c-format.c:1258 +-#, gcc-internal-format +-msgid "format not a string literal, argument types not checked" +-msgstr "el format no és una cadena literal, no es van revisar els tipus d'argument" +- +-#: c-format.c:1271 +-#, gcc-internal-format +-msgid "too many arguments for format" +-msgstr "massa arguments per al format" +- +-#: c-format.c:1274 +-#, gcc-internal-format +-msgid "unused arguments in $-style format" +-msgstr "no es van usar arguments en el format d'estil-$" +- +-#: c-format.c:1277 +-#, gcc-internal-format +-msgid "zero-length %s format string" +-msgstr "cadena de format %s de longitud zero" +- +-#: c-format.c:1281 +-#, gcc-internal-format +-msgid "format is a wide character string" +-msgstr "el format és una cadena de caràcter ampla" +- +-#: c-format.c:1284 +-#, gcc-internal-format +-msgid "unterminated format string" +-msgstr "constant de format sense acabar" +- +-#: c-format.c:1492 +-#, fuzzy, gcc-internal-format +-msgid "embedded %<\\0%> in format" +-msgstr "\"\\0\" incrustat en el format" +- +-#: c-format.c:1507 +-#, fuzzy, gcc-internal-format +-msgid "spurious trailing %<%%%> in format" +-msgstr "\"%%\" final espuri en el format" +- +-#: c-format.c:1551 c-format.c:1821 +-#, gcc-internal-format +-msgid "repeated %s in format" +-msgstr "es va repetir %s en el format" +- +-#: c-format.c:1564 +-#, gcc-internal-format +-msgid "missing fill character at end of strfmon format" +-msgstr "falta el caràcter de farciment al final del format strfmon" +- +-#: c-format.c:1608 c-format.c:1710 c-format.c:2005 c-format.c:2070 +-#, gcc-internal-format +-msgid "too few arguments for format" +-msgstr "molt pocs arguments per al format" +- +-#: c-format.c:1649 +-#, gcc-internal-format +-msgid "zero width in %s format" +-msgstr "amplària zero en el format %s" +- +-#: c-format.c:1667 +-#, gcc-internal-format +-msgid "empty left precision in %s format" +-msgstr "precisió esquerra buida en el format %s" +- +-#: c-format.c:1740 +-#, gcc-internal-format +-msgid "empty precision in %s format" +-msgstr "precisió buida en el format %s" +- +-#: c-format.c:1805 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support the %qs %s length modifier" +-msgstr "%s no té suport per al modificador de longitud %s \"%s\"" +- +-#: c-format.c:1838 +-#, gcc-internal-format +-msgid "conversion lacks type at end of format" +-msgstr "la conversió manca de tipus al final del format" +- +-#: c-format.c:1849 +-#, fuzzy, gcc-internal-format +-msgid "unknown conversion type character %qc in format" +-msgstr "es desconeix el caràcter de tipus de conversió \"%c\" en el format" +- +-#: c-format.c:1852 +-#, gcc-internal-format +-msgid "unknown conversion type character 0x%x in format" +-msgstr "es desconeix el caràcter de tipus de conversió 0x%x en el format" +- +-#: c-format.c:1859 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support the %<%%%c%> %s format" +-msgstr "%s no té suport per al format \"%%%s%c\" %s" +- +-#: c-format.c:1875 +-#, fuzzy, gcc-internal-format +-msgid "%s used with %<%%%c%> %s format" +-msgstr "es va usar %s amb el format \"%%%c\" %s" +- +-#: c-format.c:1884 +-#, gcc-internal-format +-msgid "%s does not support %s" +-msgstr "%s no té suport per a %s" +- +-#: c-format.c:1894 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support %s with the %<%%%c%> %s format" +-msgstr "%s no té suport per a %s amb el format \"%%%c\" %s" +- +-#: c-format.c:1930 +-#, fuzzy, gcc-internal-format +-msgid "%s ignored with %s and %<%%%c%> %s format" +-msgstr "s'ignora %s amb %s i el format \"%%%c\" %s" +- +-#: c-format.c:1934 +-#, gcc-internal-format +-msgid "%s ignored with %s in %s format" +-msgstr "s'ignora %s amb %s en el format %s" +- +-#: c-format.c:1941 +-#, fuzzy, gcc-internal-format +-msgid "use of %s and %s together with %<%%%c%> %s format" +-msgstr "ús de %s i %s juntament amb el format \"%%%c\" %s" +- +-#: c-format.c:1945 +-#, gcc-internal-format +-msgid "use of %s and %s together in %s format" +-msgstr "ús de %s i %s junts en el format %s" +- +-#: c-format.c:1964 +-#, fuzzy, gcc-internal-format +-msgid "%<%%%c%> yields only last 2 digits of year in some locales" +-msgstr "\"%%%c\" només produeix els dos últims dígits de l'any en alguns llocs" +- +-#: c-format.c:1967 +-#, fuzzy, gcc-internal-format +-msgid "%<%%%c%> yields only last 2 digits of year" +-msgstr "\"%%%c\" només produeix els dos últims dígits de l'any" +- +-#. The end of the format string was reached. +-#: c-format.c:1984 +-#, fuzzy, gcc-internal-format +-msgid "no closing %<]%> for %<%%[%> format" +-msgstr "no hi ha un \"]\" que tancament per al format \"%%[\"" +- +-#: c-format.c:1998 +-#, fuzzy, gcc-internal-format +-msgid "use of %qs length modifier with %qc type character" +-msgstr "ús del modificador de longitud \"%s\" amb el caràcter de tipus \"%c\"" +- +-#: c-format.c:2020 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support the %<%%%s%c%> %s format" +-msgstr "%s no té suport per al format \"%%%s%c\" %s" +- +-#: c-format.c:2037 +-#, gcc-internal-format +-msgid "operand number specified with suppressed assignment" +-msgstr "nombre d'operadors especificat amb assignació suprimida" +- +-#: c-format.c:2040 +-#, gcc-internal-format +-msgid "operand number specified for format taking no argument" +-msgstr "el nombre de operades especificats per al format no pren arguments" +- +-#: c-format.c:2173 +-#, fuzzy, gcc-internal-format +-msgid "writing through null pointer (argument %d)" +-msgstr "escrivint a través d'un punter nul (argument %d)" +- +-#: c-format.c:2181 +-#, fuzzy, gcc-internal-format +-msgid "reading through null pointer (argument %d)" +-msgstr "llegint a través d'un punter nul (argument %d)" +- +-#: c-format.c:2201 +-#, fuzzy, gcc-internal-format +-msgid "writing into constant object (argument %d)" +-msgstr "escrivint en un objecte constant (argument %d)" +- +-#: c-format.c:2212 +-#, fuzzy, gcc-internal-format +-msgid "extra type qualifiers in format argument (argument %d)" +-msgstr "qualificadores de tipus extra en l'argument de format (argument %d)" +- +-#: c-format.c:2323 +-#, gcc-internal-format +-msgid "%s should have type %<%s%s%>, but argument %d has type %qT" +-msgstr "" +- +-#: c-format.c:2327 +-#, gcc-internal-format +-msgid "format %q.*s expects type %<%s%s%>, but argument %d has type %qT" +-msgstr "" +- +-#: c-format.c:2335 +-#, gcc-internal-format +-msgid "%s should have type %<%T%s%>, but argument %d has type %qT" +-msgstr "" +- +-#: c-format.c:2339 +-#, gcc-internal-format +-msgid "format %q.*s expects type %<%T%s%>, but argument %d has type %qT" +-msgstr "" +- +-#: c-format.c:2398 c-format.c:2404 c-format.c:2554 +-#, gcc-internal-format +-msgid "%<__gcc_host_wide_int__%> is not defined as a type" +-msgstr "" +- +-#: c-format.c:2411 c-format.c:2564 +-#, gcc-internal-format +-msgid "%<__gcc_host_wide_int__%> is not defined as % or %" +-msgstr "" +- +-#: c-format.c:2460 +-#, fuzzy, gcc-internal-format +-msgid "% is not defined as a type" +-msgstr "\"%s\" no és definit" +- +-#: c-format.c:2513 +-#, gcc-internal-format +-msgid "% is not defined as a type" +-msgstr "" +- +-#: c-format.c:2530 +-#, fuzzy, gcc-internal-format +-msgid "% is not defined as a type" +-msgstr "\"%s\" no és definit" +- +-#: c-format.c:2535 +-#, fuzzy, gcc-internal-format +-msgid "% is not defined as a pointer type" +-msgstr "new no pot ser aplicat a un tipus de referència" +- +-#: c-format.c:2758 +-#, fuzzy, gcc-internal-format +-msgid "args to be formatted is not %<...%>" +-msgstr "els arguments que rebran format no són \"...\"" +- +-#: c-format.c:2767 +-#, gcc-internal-format +-msgid "strftime formats cannot format arguments" +-msgstr "els formats de strftime no poden donar format als arguments" +- +-#: c-lex.c:245 +-#, gcc-internal-format +-msgid "badly nested C headers from preprocessor" +-msgstr "encapçalats C mal niats del preprocessador" +- +-#: c-lex.c:293 +-#, fuzzy, gcc-internal-format +-msgid "%Hignoring #pragma %s %s" +-msgstr "ignorant el #pragma %s %s" +- +-#. ... or not. +-#: c-lex.c:419 +-#, fuzzy, gcc-internal-format +-msgid "%Hstray %<@%> in program" +-msgstr "%H\"@\" paràsit en el programa" +- +-#: c-lex.c:436 +-#, fuzzy, gcc-internal-format +-msgid "stray %qs in program" +-msgstr "\"%c\" paràsit en el programa" +- +-#: c-lex.c:446 +-#, gcc-internal-format +-msgid "missing terminating %c character" +-msgstr "falta caràcter acabant %c" +- +-#: c-lex.c:448 +-#, fuzzy, gcc-internal-format +-msgid "stray %qc in program" +-msgstr "\"%c\" paràsit en el programa" +- +-#: c-lex.c:450 +-#, fuzzy, gcc-internal-format +-msgid "stray %<\\%o%> in program" +-msgstr "\"\\%o\" paràsit en el programa" +- +-#: c-lex.c:605 +-#, gcc-internal-format +-msgid "this decimal constant is unsigned only in ISO C90" +-msgstr "aquesta constant decimal només és unsigned en ISO C90" +- +-#: c-lex.c:609 +-#, gcc-internal-format +-msgid "this decimal constant would be unsigned in ISO C90" +-msgstr "aquesta constant decimal serà unsigned en ISO C90 " +- +-#: c-lex.c:625 +-#, fuzzy, gcc-internal-format +-msgid "integer constant is too large for %qs type" +-msgstr "la constant entera és massa gran pel tipus \"%s\"" +- +-#: c-lex.c:674 +-#, fuzzy, gcc-internal-format +-msgid "unsupported non-standard suffix on floating constant" +-msgstr "sufix \"%.*s\" no vàlid en la constant de coma flotant" +- +-#: c-lex.c:680 +-#, fuzzy, gcc-internal-format +-msgid "non-standard suffix on floating constant" +-msgstr "sufix \"%.*s\" no vàlid en la constant de coma flotant" +- +-#: c-lex.c:722 c-lex.c:724 +-#, fuzzy, gcc-internal-format +-msgid "floating constant exceeds range of %qT" +-msgstr "la constant de coma flotant excedeix els límits de \"%s\"" +- +-#: c-lex.c:732 +-#, fuzzy, gcc-internal-format +-msgid "floating constant truncated to zero" +-msgstr "constant de coma flotant mal usada" +- +-#: c-lex.c:941 +-#, gcc-internal-format +-msgid "traditional C rejects string constant concatenation" +-msgstr "C tradicional rebutja la concatenació de cadenes constantes" +- +-#: c-omp.c:106 +-#, fuzzy, gcc-internal-format +-msgid "invalid expression type for %<#pragma omp atomic%>" +-msgstr "expressió no vàlida com a operand" +- +-#: c-omp.c:218 +-#, fuzzy, gcc-internal-format +-msgid "%Hinvalid type for iteration variable %qE" +-msgstr "tipus de vector no vàlid per a l'atribut \"%s\"" +- +-#: c-omp.c:222 +-#, fuzzy, gcc-internal-format +-msgid "%Hiteration variable %qE is unsigned" +-msgstr "la variable estàtica \"%s\" està marcada com dllimport" +- +-#: c-omp.c:233 +-#, fuzzy, gcc-internal-format +-msgid "%H%qE is not initialized" +-msgstr "falta valor inicial" +- +-#: c-omp.c:246 cp/semantics.c:3840 +-#, fuzzy, gcc-internal-format +-msgid "%Hmissing controlling predicate" +-msgstr "falta \"(\" abans del predicat" +- +-#: c-omp.c:304 +-#, fuzzy, gcc-internal-format +-msgid "%Hinvalid controlling predicate" +-msgstr "restriccions no vàlides per a l'operand" +- +-#: c-omp.c:311 cp/semantics.c:3846 +-#, fuzzy, gcc-internal-format +-msgid "%Hmissing increment expression" +-msgstr "\")\" faltant en l'expressió" +- +-#: c-omp.c:361 +-#, fuzzy, gcc-internal-format +-msgid "%Hinvalid increment expression" +-msgstr "expressió de valor veritable no vàlida" +- +-#: c-opts.c:153 +-#, fuzzy, gcc-internal-format +-msgid "no class name specified with %qs" +-msgstr "no nom de «class» especificat amb \"%s\"" +- +-#: c-opts.c:157 +-#, fuzzy, gcc-internal-format +-msgid "assertion missing after %qs" +-msgstr "asserció faltant deprés de \"%s\"" +- +-#: c-opts.c:162 +-#, fuzzy, gcc-internal-format +-msgid "macro name missing after %qs" +-msgstr "nom de macro faltant deprés de \"%s\"" +- +-#: c-opts.c:171 +-#, fuzzy, gcc-internal-format +-msgid "missing path after %qs" +-msgstr "falta el camí després de \"%s\"" +- +-#: c-opts.c:180 +-#, fuzzy, gcc-internal-format +-msgid "missing filename after %qs" +-msgstr "nom de fitxer faltant deprés de \"%s\"" +- +-#: c-opts.c:185 +-#, fuzzy, gcc-internal-format +-msgid "missing makefile target after %qs" +-msgstr "falta l'objectiu del «makefile» després de \"%s\"" +- +-#: c-opts.c:337 +-#, gcc-internal-format +-msgid "-I- specified twice" +-msgstr "-I- especificat dues vegades" +- +-#: c-opts.c:340 +-#, gcc-internal-format +-msgid "obsolete option -I- used, please use -iquote instead" +-msgstr "" +- +-#: c-opts.c:508 +-#, fuzzy, gcc-internal-format +-msgid "argument %qs to %<-Wnormalized%> not recognized" +-msgstr "no es reconeix el llenguatge %s" +- +-#: c-opts.c:595 +-#, fuzzy, gcc-internal-format +-msgid "switch %qs is no longer supported" +-msgstr "el «switch» \"%s\" ja no té suport" +- +-#: c-opts.c:705 +-#, gcc-internal-format +-msgid "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)" +-msgstr "es va re-nomenar \"-fhandle-exceptions\" a \"-fexceptions\" (i ara està activat per defecte)" +- +-#: c-opts.c:911 +-#, gcc-internal-format +-msgid "output filename specified twice" +-msgstr "nom de fitxer de sortida especificat dues vegades" +- +-#: c-opts.c:1051 +-#, fuzzy, gcc-internal-format +-msgid "-fno-gnu89-inline is only supported in GNU99 or C99 mode" +-msgstr "-g només té suport quan s'usa GAS en aquest processador," +- +-#: c-opts.c:1126 +-#, gcc-internal-format +-msgid "-Wformat-y2k ignored without -Wformat" +-msgstr "s'ignora -Wformat-y2k sense -Wformat" +- +-#: c-opts.c:1128 +-#, gcc-internal-format +-msgid "-Wformat-extra-args ignored without -Wformat" +-msgstr "s'ignora -Wformat-extra-args sense -Wformat" +- +-#: c-opts.c:1130 +-#, gcc-internal-format +-msgid "-Wformat-zero-length ignored without -Wformat" +-msgstr "s'ignora -Wformat-zero-length sense -Wformat" +- +-#: c-opts.c:1132 +-#, gcc-internal-format +-msgid "-Wformat-nonliteral ignored without -Wformat" +-msgstr "s'ignora -Wformat-nonliteral sense -Wformat" +- +-#: c-opts.c:1134 +-#, fuzzy, gcc-internal-format +-msgid "-Wformat-contains-nul ignored without -Wformat" +-msgstr "s'ignora -Wformat-nonliteral sense -Wformat" +- +-#: c-opts.c:1136 +-#, gcc-internal-format +-msgid "-Wformat-security ignored without -Wformat" +-msgstr "s'ignora -Wformat-security sense -Wformat" +- +-#: c-opts.c:1160 +-#, gcc-internal-format +-msgid "opening output file %s: %m" +-msgstr "obrint el fitxer de sortida %s: %m" +- +-#: c-opts.c:1165 +-#, gcc-internal-format +-msgid "too many filenames given. Type %s --help for usage" +-msgstr "massa noms de fitxers. Teclegi %s --help per a informació d'ùs" +- +-#: c-opts.c:1249 +-#, fuzzy, gcc-internal-format +-msgid "The C parser does not support -dy, option ignored" +-msgstr "no se suporta el codi APCS que es torna a introduir.Ignorat" +- +-#: c-opts.c:1253 +-#, gcc-internal-format +-msgid "The Objective-C parser does not support -dy, option ignored" +-msgstr "" +- +-#: c-opts.c:1256 +-#, fuzzy, gcc-internal-format +-msgid "The C++ parser does not support -dy, option ignored" +-msgstr "no se suporta el codi APCS que es torna a introduir.Ignorat" +- +-#: c-opts.c:1260 +-#, gcc-internal-format +-msgid "The Objective-C++ parser does not support -dy, option ignored" +-msgstr "" +- +-#: c-opts.c:1309 +-#, gcc-internal-format +-msgid "opening dependency file %s: %m" +-msgstr "obrint el fitxer de dependències %s: %m" +- +-#: c-opts.c:1319 +-#, gcc-internal-format +-msgid "closing dependency file %s: %m" +-msgstr "tancant el fitxer de dependències %s: %m" +- +-#: c-opts.c:1322 +-#, gcc-internal-format +-msgid "when writing output to %s: %m" +-msgstr "escrivint la sortida a %s: %m" +- +-#: c-opts.c:1402 +-#, gcc-internal-format +-msgid "to generate dependencies you must specify either -M or -MM" +-msgstr "per a generar dependències s'ha d'especificar -M o -MM" +- +-#: c-opts.c:1448 +-#, gcc-internal-format +-msgid "-fdirectives-only is incompatible with -Wunused_macros" +-msgstr "" +- +-#: c-opts.c:1450 +-#, gcc-internal-format +-msgid "-fdirectives-only is incompatible with -traditional" +-msgstr "" +- +-#: c-opts.c:1588 +-#, gcc-internal-format +-msgid "too late for # directive to set debug directory" +-msgstr "" +- +-#: c-parser.c:1070 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids an empty source file" +-msgstr "ISO C prohibeix un fitxer font buit" +- +-#: c-parser.c:1156 c-parser.c:6091 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C does not allow extra %<;%> outside of a function" +-msgstr "ISO C no permet \";\" extra fora d'una funció" +- +-#: c-parser.c:1259 c-parser.c:6640 +-#, fuzzy, gcc-internal-format +-msgid "expected declaration specifiers" +-msgstr "declaració repetida de la unitat \"%s\"" +- +-#: c-parser.c:1271 +-#, fuzzy, gcc-internal-format +-msgid "%Hempty declaration" +-msgstr "declaració buida" +- +-#: c-parser.c:1307 +-#, fuzzy, gcc-internal-format +-msgid "%Hdata definition has no type or storage class" +-msgstr "la definició de dades no té tipus o classe d'emmagatzematge" +- +-#: c-parser.c:1362 +-#, gcc-internal-format +-msgid "expected %<,%> or %<;%>" +-msgstr "" +- +-#. This can appear in many cases looking nothing like a +-#. function definition, so we don't give a more specific +-#. error suggesting there was one. +-#: c-parser.c:1369 c-parser.c:1386 +-#, gcc-internal-format +-msgid "expected %<=%>, %<,%>, %<;%>, % or %<__attribute__%>" +-msgstr "" +- +-#: c-parser.c:1378 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids nested functions" +-msgstr "ISO C prohibeix les funcions niades" +- +-#: c-parser.c:1743 c-parser.c:2553 c-parser.c:3189 c-parser.c:3445 +-#: c-parser.c:4308 c-parser.c:4895 c-parser.c:5298 c-parser.c:5318 +-#: c-parser.c:5434 c-parser.c:5582 c-parser.c:5599 c-parser.c:5731 +-#: c-parser.c:5743 c-parser.c:5768 c-parser.c:5903 c-parser.c:5932 +-#: c-parser.c:5940 c-parser.c:5968 c-parser.c:5982 c-parser.c:6201 +-#: c-parser.c:6300 c-parser.c:6803 c-parser.c:7426 +-#, fuzzy, gcc-internal-format +-msgid "expected identifier" +-msgstr "operand inesperat" +- +-#: c-parser.c:1773 +-#, fuzzy, gcc-internal-format +-msgid "%Hcomma at end of enumerator list" +-msgstr "coma al final de la llista de numeradors" +- +-#: c-parser.c:1779 +-#, gcc-internal-format +-msgid "expected %<,%> or %<}%>" +-msgstr "" +- +-#: c-parser.c:1793 c-parser.c:1977 c-parser.c:6058 +-#, gcc-internal-format +-msgid "expected %<{%>" +-msgstr "" +- +-#: c-parser.c:1804 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids forward references to % types" +-msgstr "ISO C prohibeix les declaracions posteriors per a tipus \"enum\"" +- +-#: c-parser.c:1911 +-#, fuzzy, gcc-internal-format +-msgid "expected class name" +-msgstr "operand inesperat" +- +-#: c-parser.c:1930 c-parser.c:5835 +-#, fuzzy, gcc-internal-format +-msgid "%Hextra semicolon in struct or union specified" +-msgstr "es va especificar un punt i coma extra en un struct o union" +- +-#: c-parser.c:1959 +-#, fuzzy, gcc-internal-format +-msgid "%Hno semicolon at end of struct or union" +-msgstr "no hi ha punt i coma al final del struct o union" +- +-#: c-parser.c:1963 +-#, gcc-internal-format +-msgid "expected %<;%>" +-msgstr "" +- +-#: c-parser.c:2042 c-parser.c:3014 +-#, gcc-internal-format +-msgid "expected specifier-qualifier-list" +-msgstr "" +- +-#: c-parser.c:2052 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids member declarations with no members" +-msgstr "ISO C prohibeix declaracions de membres sense membres" +- +-#: c-parser.c:2126 +-#, gcc-internal-format +-msgid "expected %<,%>, %<;%> or %<}%>" +-msgstr "" +- +-#: c-parser.c:2133 +-#, gcc-internal-format +-msgid "expected %<:%>, %<,%>, %<;%>, %<}%> or %<__attribute__%>" +-msgstr "" +- +-#: c-parser.c:2184 +-#, fuzzy, gcc-internal-format +-msgid "%H% applied to a bit-field" +-msgstr "\"typeof\" aplicat a un camp de bits" +- +-#: c-parser.c:2421 +-#, gcc-internal-format +-msgid "expected identifier or %<(%>" +-msgstr "" +- +-#: c-parser.c:2622 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C requires a named argument before %<...%>" +-msgstr "ISO C requereix un argument amb nom abans de \"...\"" +- +-#: c-parser.c:2729 +-#, fuzzy, gcc-internal-format +-msgid "expected declaration specifiers or %<...%>" +-msgstr "la declaració del nivell superior de \"%s\" especifica \"auto\"" +- +-#: c-parser.c:2779 +-#, gcc-internal-format +-msgid "%Hwide string literal in %" +-msgstr "" +- +-#: c-parser.c:2786 c-parser.c:6695 cp/parser.c:20393 +-#, fuzzy, gcc-internal-format +-msgid "expected string literal" +-msgstr "_Pragma duu una cadena literal entre parèntesis" +- +-#: c-parser.c:3107 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids empty initializer braces" +-msgstr "ISO C prohibeix les claus de iniciador buides" +- +-#. Use the colon as the error location. +-#: c-parser.c:3154 +-#, fuzzy, gcc-internal-format +-msgid "%Hobsolete use of designated initializer with %<:%>" +-msgstr "ús obsolet de l'iniciador designat amb \":\"" +- +-#: c-parser.c:3285 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids specifying range of elements to initialize" +-msgstr "ISO C prohibeix l'especificació de límits d'elements a iniciar" +- +-#: c-parser.c:3298 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C90 forbids specifying subobject to initialize" +-msgstr "ISO C90 prohibeix l'especificació de «subobject» a iniciar" +- +-#: c-parser.c:3307 +-#, fuzzy, gcc-internal-format +-msgid "%Hobsolete use of designated initializer without %<=%>" +-msgstr "ús obsolet de l'iniciador designat sense \"=\"" +- +-#: c-parser.c:3316 +-#, gcc-internal-format +-msgid "expected %<=%>" +-msgstr "" +- +-#: c-parser.c:3461 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids label declarations" +-msgstr "ISO C prohibeix les declaracions etiquetades" +- +-#: c-parser.c:3466 c-parser.c:3541 +-#, fuzzy, gcc-internal-format +-msgid "expected declaration or statement" +-msgstr "declaració repetida de l'autòmat \"%s\"" +- +-#: c-parser.c:3494 c-parser.c:3522 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C90 forbids mixed declarations and code" +-msgstr "ISO C90 prohibeix les declaracions barrejades amb codi" +- +-#: c-parser.c:3555 +-#, fuzzy, gcc-internal-format +-msgid "%Hlabel at end of compound statement" +-msgstr "etiqueta al final de la declaració composta" +- +-#: c-parser.c:3598 +-#, gcc-internal-format +-msgid "expected %<:%> or %<...%>" +-msgstr "" +- +-#: c-parser.c:3779 +-#, gcc-internal-format +-msgid "expected identifier or %<*%>" +-msgstr "" +- +-#. Avoid infinite loop in error recovery: +-#. c_parser_skip_until_found stops at a closing nesting +-#. delimiter without consuming it, but here we need to consume +-#. it to proceed further. +-#: c-parser.c:3841 +-#, fuzzy, gcc-internal-format +-msgid "expected statement" +-msgstr "operand inesperat" +- +-#: c-parser.c:3851 +-#, gcc-internal-format +-msgid "%Ha label can only be part of a statement and a declaration is not a statement" +-msgstr "" +- +-#: c-parser.c:4036 +-#, fuzzy, gcc-internal-format +-msgid "%Hsuggest braces around empty body in % statement" +-msgstr "%Hcos buit en una declaració «if»" +- +-#: c-parser.c:4192 +-#, fuzzy, gcc-internal-format +-msgid "%H%E qualifier ignored on asm" +-msgstr "qualificador %s ignorat en asm" +- +-#: c-parser.c:4473 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids omitting the middle term of a ?: expression" +-msgstr "ISO C prohibeix l'omissió del terme mig d'una expressió ?:" +- +-#: c-parser.c:4863 +-#, fuzzy, gcc-internal-format +-msgid "%Htraditional C rejects the unary plus operator" +-msgstr "C tradicional rebutja l'operador unari mes" +- +-#. C99 6.7.5.2p4 +-#: c-parser.c:4974 +-#, fuzzy, gcc-internal-format +-msgid "%H%<[*]%> not allowed in other than a declaration" +-msgstr "no es permet l'espai de noms \"%D\" en la declaració d'ús" +- +-#: c-parser.c:4988 +-#, fuzzy, gcc-internal-format +-msgid "%H% applied to a bit-field" +-msgstr "sizeof aplicat a un camp de bits" +- +-#: c-parser.c:5132 c-parser.c:5476 c-parser.c:5498 +-#, fuzzy, gcc-internal-format +-msgid "expected expression" +-msgstr "expressió d'adreça inesperada" +- +-#: c-parser.c:5159 +-#, fuzzy, gcc-internal-format +-msgid "%Hbraced-group within expression allowed only inside a function" +-msgstr "un grup de claus dintre d'una expressió només es permet dintre d'una funció" +- +-#: c-parser.c:5173 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C forbids braced-groups within expressions" +-msgstr "ISO C prohibeix «braced-groups» dintre d'expressions" +- +-#: c-parser.c:5358 +-#, fuzzy, gcc-internal-format +-msgid "%Hfirst argument to %<__builtin_choose_expr%> not a constant" +-msgstr "el primer argument per a __builtin_choose_expr no és una constant" +- +-#: c-parser.c:5527 +-#, gcc-internal-format +-msgid "%Hcompound literal has variable size" +-msgstr "" +- +-#: c-parser.c:5535 +-#, fuzzy, gcc-internal-format +-msgid "%HISO C90 forbids compound literals" +-msgstr "ISO C90 prohibeix els «compound literals»" +- +-#: c-parser.c:6053 +-#, fuzzy, gcc-internal-format +-msgid "%Hextra semicolon in method definition specified" +-msgstr "es va especificar un punt i coma extra en un struct o union" +- +-#: c-parser.c:6600 cp/parser.c:20436 +-#, gcc-internal-format +-msgid "%<#pragma omp barrier%> may only be used in compound statements" +-msgstr "" +- +-#: c-parser.c:6611 cp/parser.c:20451 +-#, gcc-internal-format +-msgid "%<#pragma omp flush%> may only be used in compound statements" +-msgstr "" +- +-#: c-parser.c:6623 +-#, gcc-internal-format +-msgid "%H%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct" +-msgstr "" +- +-#: c-parser.c:6630 cp/parser.c:20426 +-#, gcc-internal-format +-msgid "%<#pragma GCC pch_preprocess%> must be first" +-msgstr "" +- +-#: c-parser.c:6781 cp/parser.c:19277 +-#, fuzzy, gcc-internal-format +-msgid "too many %qs clauses" +-msgstr "massa fitxers d'entrada" +- +-#: c-parser.c:6906 +-#, gcc-internal-format +-msgid "expected % or %" +-msgstr "" +- +-#: c-parser.c:6949 +-#, gcc-internal-format +-msgid "expected %<(%>" +-msgstr "" +- +-#: c-parser.c:6993 c-parser.c:7170 +-#, fuzzy, gcc-internal-format +-msgid "expected integer expression" +-msgstr "expressió d'adreça inesperada" +- +-#: c-parser.c:7002 +-#, gcc-internal-format +-msgid "%H% value must be positive" +-msgstr "" +- +-#: c-parser.c:7082 +-#, gcc-internal-format +-msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>" +-msgstr "" +- +-#: c-parser.c:7165 +-#, gcc-internal-format +-msgid "%Hschedule % does not take a % parameter" +-msgstr "" +- +-#: c-parser.c:7183 +-#, fuzzy, gcc-internal-format +-msgid "invalid schedule kind" +-msgstr "rotació de insn no vàlida" +- +-#: c-parser.c:7269 +-#, gcc-internal-format +-msgid "expected %<#pragma omp%> clause" +-msgstr "" +- +-#: c-parser.c:7278 +-#, fuzzy, gcc-internal-format +-msgid "%H%qs is not valid for %qs" +-msgstr "%s: no per a %s" +- +-#: c-parser.c:7378 +-#, fuzzy, gcc-internal-format +-msgid "invalid operator for %<#pragma omp atomic%>" +-msgstr "operand no vàlid per al modificador \"p\"" +- +-#: c-parser.c:7429 c-parser.c:7449 +-#, gcc-internal-format +-msgid "expected %<(%> or end of line" +-msgstr "" +- +-#: c-parser.c:7467 +-#, fuzzy, gcc-internal-format +-msgid "for statement expected" +-msgstr "%s és més curt de l'esperat" +- +-#: c-parser.c:7540 cp/semantics.c:3826 cp/semantics.c:3870 +-#, fuzzy, gcc-internal-format +-msgid "expected iteration declaration or initialization" +-msgstr "declaració repetida de l'autòmat \"%s\"" +- +-#: c-parser.c:7666 +-#, gcc-internal-format +-msgid "%Hexpected %<#pragma omp section%> or %<}%>" +-msgstr "" +- +-#: c-parser.c:7899 cp/semantics.c:3718 +-#, gcc-internal-format +-msgid "%qE declared % after first use" +-msgstr "" +- +-#: c-parser.c:7901 cp/semantics.c:3720 +-#, gcc-internal-format +-msgid "automatic variable %qE cannot be %" +-msgstr "" +- +-#: c-parser.c:7903 cp/semantics.c:3722 +-#, fuzzy, gcc-internal-format +-msgid "% %qE has incomplete type" +-msgstr "%Jel paràmetre \"%D\" té un tipus incomplet" +- +-#: c-pch.c:132 +-#, fuzzy, gcc-internal-format +-msgid "can%'t create precompiled header %s: %m" +-msgstr "no es pot obtenir el directori actual" +- +-#: c-pch.c:153 +-#, fuzzy, gcc-internal-format +-msgid "can%'t write to %s: %m" +-msgstr "no es pot escriure a %s: %m" +- +-#: c-pch.c:159 +-#, fuzzy, gcc-internal-format +-msgid "%qs is not a valid output file" +-msgstr "\"%s\" no és un nom de fitxer de sortida vàlid" +- +-#: c-pch.c:188 c-pch.c:203 c-pch.c:217 +-#, fuzzy, gcc-internal-format +-msgid "can%'t write %s: %m" +-msgstr "no es pot escriure %s: %m" +- +-#: c-pch.c:193 c-pch.c:210 +-#, fuzzy, gcc-internal-format +-msgid "can%'t seek in %s: %m" +-msgstr "no es pot cercar dintre %s: %m" +- +-#: c-pch.c:201 c-pch.c:243 c-pch.c:283 c-pch.c:334 +-#, fuzzy, gcc-internal-format +-msgid "can%'t read %s: %m" +-msgstr "no es pot llegir %s: %m" +- +-#: c-pch.c:466 +-#, gcc-internal-format +-msgid "pch_preprocess pragma should only be used with -fpreprocessed" +-msgstr "" +- +-#: c-pch.c:467 +-#, fuzzy, gcc-internal-format +-msgid "use #include instead" +-msgstr "#include niat amb massa profunditat" +- +-#: c-pch.c:473 +-#, fuzzy, gcc-internal-format +-msgid "%s: couldn%'t open PCH file: %m" +-msgstr "no es pot llegir el fitxer PCH: %m" +- +-#: c-pch.c:478 +-#, gcc-internal-format +-msgid "use -Winvalid-pch for more information" +-msgstr "" +- +-#: c-pch.c:479 +-#, gcc-internal-format +-msgid "%s: PCH file was invalid" +-msgstr "" +- +-#: c-pragma.c:102 +-#, fuzzy, gcc-internal-format +-msgid "#pragma pack (pop) encountered without matching #pragma pack (push)" +-msgstr "es va trobar un #pragma pack (pop) sense un #pragma pack (push, ) coincident" +- +-#: c-pragma.c:115 +-#, fuzzy, gcc-internal-format +-msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s)" +-msgstr "es va trobar un #pragma pack (pop, %s) sense un #pragma pack (push, %s, ) coincident" +- +-#: c-pragma.c:129 +-#, gcc-internal-format +-msgid "#pragma pack(push[, id], ) is not supported on this target" +-msgstr "no es dóna suport a #pragma pack(push[, id], ) en aquest objectiu" +- +-#: c-pragma.c:131 +-#, gcc-internal-format +-msgid "#pragma pack(pop[, id], ) is not supported on this target" +-msgstr "no es dóna suport a #pragma pack(pop[, id], ) en aquest objectiu" +- +-#: c-pragma.c:152 +-#, fuzzy, gcc-internal-format +-msgid "missing %<(%> after %<#pragma pack%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:163 c-pragma.c:195 +-#, fuzzy, gcc-internal-format +-msgid "invalid constant in %<#pragma pack%> - ignored" +-msgstr "acció \"%s\" desconeguda per a \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:167 c-pragma.c:209 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma pack%> - ignored" +-msgstr "\"#pragma pack\" malformat - ignorat" +- +-#: c-pragma.c:172 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma pack(push[, id][, ])%> - ignored" +-msgstr "\"#pragma pack(push[, id], )\" malformat - ignorat" +- +-#: c-pragma.c:174 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma pack(pop[, id])%> - ignored" +-msgstr "\"#pragma pack(pop[, id])\" malformat - ignorat" +- +-#: c-pragma.c:183 +-#, fuzzy, gcc-internal-format +-msgid "unknown action %qs for %<#pragma pack%> - ignored" +-msgstr "acció \"%s\" desconeguda per a \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:212 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma pack%>" +-msgstr "escombraries al final de \"#pragma pack\"" +- +-#: c-pragma.c:215 +-#, gcc-internal-format +-msgid "#pragma pack has no effect with -fpack-struct - ignored" +-msgstr "" +- +-#: c-pragma.c:235 +-#, gcc-internal-format +-msgid "alignment must be a small power of two, not %d" +-msgstr "l'alineació ha de ser una potència petita de dos, no %d" +- +-#: c-pragma.c:290 +-#, fuzzy, gcc-internal-format +-msgid "missing %<(%> after %<#pragma push_macro%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:298 +-#, fuzzy, gcc-internal-format +-msgid "invalid constant in %<#pragma push_macro%> - ignored" +-msgstr "nom de secció faltant en \"#pragma %s\" - ignorat" +- +-#: c-pragma.c:301 +-#, fuzzy, gcc-internal-format +-msgid "missing %<)%> after %<#pragma push_macro%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:304 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma push_macro%>" +-msgstr "escombraries al final de #pragma map" +- +-#: c-pragma.c:347 +-#, fuzzy, gcc-internal-format +-msgid "missing %<(%> after %<#pragma pop_macro%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:355 +-#, fuzzy, gcc-internal-format +-msgid "invalid constant in %<#pragma pop_macro%> - ignored" +-msgstr "nom de secció faltant en \"#pragma %s\" - ignorat" +- +-#: c-pragma.c:358 +-#, fuzzy, gcc-internal-format +-msgid "missing %<)%> after %<#pragma pop_macro%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma pack\" - ignorat" +- +-#: c-pragma.c:361 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma pop_macro%>" +-msgstr "escombraries al final de #pragma map" +- +-#: c-pragma.c:406 +-#, fuzzy, gcc-internal-format +-msgid "applying #pragma weak %q+D after first use results in unspecified behavior" +-msgstr "%Jl'aplicació del #pragma weak \"%s\" després del primer ús resulta en conducta no especificada" +- +-#: c-pragma.c:480 c-pragma.c:485 +-#, gcc-internal-format +-msgid "malformed #pragma weak, ignored" +-msgstr "#pragma weak malformat, ignorat" +- +-#: c-pragma.c:489 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma weak%>" +-msgstr "escombraries al final de \"#pragma weak\"" +- +-#: c-pragma.c:557 c-pragma.c:559 +-#, gcc-internal-format +-msgid "malformed #pragma redefine_extname, ignored" +-msgstr "#pragma redefine_extname malformat, ignorat" +- +-#: c-pragma.c:562 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma redefine_extname%>" +-msgstr "escombraries al final de #pragma redefine_extname" +- +-#: c-pragma.c:568 +-#, fuzzy, gcc-internal-format +-msgid "#pragma redefine_extname not supported on this target" +-msgstr "no es dóna suport a _builtin_eh_return en aquest objectiu" +- +-#: c-pragma.c:585 c-pragma.c:672 +-#, fuzzy, gcc-internal-format +-msgid "#pragma redefine_extname ignored due to conflict with previous rename" +-msgstr "#pragma redefine_extname té conflictes amb la declaració" +- +-#: c-pragma.c:608 +-#, fuzzy, gcc-internal-format +-msgid "#pragma redefine_extname ignored due to conflict with previous #pragma redefine_extname" +-msgstr "#pragma redefine_extname té conflictes amb la declaració" +- +-#: c-pragma.c:627 +-#, gcc-internal-format +-msgid "malformed #pragma extern_prefix, ignored" +-msgstr "#pragma extern_prefix malformat, ignorat" +- +-#: c-pragma.c:630 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma extern_prefix%>" +-msgstr "escombraries al final de #pragma extern_prefix" +- +-#: c-pragma.c:637 +-#, fuzzy, gcc-internal-format +-msgid "#pragma extern_prefix not supported on this target" +-msgstr "No es dóna suport a anàlisi de perfil en aquest objectiu." +- +-#: c-pragma.c:663 +-#, fuzzy, gcc-internal-format +-msgid "asm declaration ignored due to conflict with previous rename" +-msgstr "la declaració asm causa conflictes amb el rename previ" +- +-#: c-pragma.c:694 +-#, fuzzy, gcc-internal-format +-msgid "#pragma redefine_extname ignored due to conflict with __asm__ declaration" +-msgstr "#pragma redefine_extname té conflictes amb la declaració" +- +-#: c-pragma.c:756 +-#, gcc-internal-format +-msgid "#pragma GCC visibility push() must specify default, internal, hidden or protected" +-msgstr "" +- +-#: c-pragma.c:791 +-#, gcc-internal-format +-msgid "#pragma GCC visibility must be followed by push or pop" +-msgstr "" +- +-#: c-pragma.c:797 +-#, gcc-internal-format +-msgid "no matching push for %<#pragma GCC visibility pop%>" +-msgstr "" +- +-#: c-pragma.c:804 c-pragma.c:811 +-#, fuzzy, gcc-internal-format +-msgid "missing %<(%> after %<#pragma GCC visibility push%> - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma %s\" - ignorat" +- +-#: c-pragma.c:807 +-#, fuzzy, gcc-internal-format +-msgid "malformed #pragma GCC visibility push" +-msgstr "secció #pragma builtin malformada" +- +-#: c-pragma.c:815 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma GCC visibility%>" +-msgstr "escombraries al final de #pragma %s" +- +-#: c-pragma.c:831 +-#, fuzzy, gcc-internal-format +-msgid "#pragma GCC diagnostic not allowed inside functions" +-msgstr "ISO C no permet \";\" extra fora d'una funció" +- +-#: c-pragma.c:837 +-#, gcc-internal-format +-msgid "missing [error|warning|ignored] after %<#pragma GCC diagnostic%>" +-msgstr "" +- +-#: c-pragma.c:846 +-#, gcc-internal-format +-msgid "expected [error|warning|ignored] after %<#pragma GCC diagnostic%>" +-msgstr "" +- +-#: c-pragma.c:850 +-#, fuzzy, gcc-internal-format +-msgid "missing option after %<#pragma GCC diagnostic%> kind" +-msgstr "\"(\" faltant desprès de \"#pragma %s\" - ignorat" +- +-#: c-pragma.c:864 +-#, fuzzy, gcc-internal-format +-msgid "unknown option after %<#pragma GCC diagnostic%> kind" +-msgstr "acció \"%s\" desconeguda per a \"#pragma pack\" - ignorat" +- +-#: c-typeck.c:174 +-#, fuzzy, gcc-internal-format +-msgid "%qD has an incomplete type" +-msgstr "\"%s\" té un tipus incompleta" +- +-#: c-typeck.c:195 cp/call.c:2785 +-#, gcc-internal-format +-msgid "invalid use of void expression" +-msgstr "ús no vàlid de l'expressió void" +- +-#: c-typeck.c:203 +-#, gcc-internal-format +-msgid "invalid use of flexible array member" +-msgstr "ús no vàlid de membres de matriu flexible" +- +-#: c-typeck.c:209 +-#, gcc-internal-format +-msgid "invalid use of array with unspecified bounds" +-msgstr "ús no vàlid de matrius amb límits sense especificar" +- +-#: c-typeck.c:217 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of undefined type %<%s %E%>" +-msgstr "ús no vàlid del tipus indefinit \"%s %s\"" +- +-#. If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. +-#: c-typeck.c:221 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of incomplete typedef %qD" +-msgstr "ús no vàlid del typedef incomplet \"%s\"" +- +-#: c-typeck.c:474 c-typeck.c:499 +-#, gcc-internal-format +-msgid "function types not truly compatible in ISO C" +-msgstr "els tipus de funció no són totalment compatibles en ISO C" +- +-#: c-typeck.c:621 +-#, gcc-internal-format +-msgid "can%'t mix operands of decimal float and vector types" +-msgstr "" +- +-#: c-typeck.c:626 +-#, gcc-internal-format +-msgid "can%'t mix operands of decimal float and complex types" +-msgstr "" +- +-#: c-typeck.c:631 +-#, gcc-internal-format +-msgid "can%'t mix operands of decimal float and other float types" +-msgstr "" +- +-#: c-typeck.c:1037 +-#, gcc-internal-format +-msgid "types are not quite compatible" +-msgstr "els tipus no són totalment compatibles" +- +-#: c-typeck.c:1356 +-#, fuzzy, gcc-internal-format +-msgid "function return types not compatible due to %" +-msgstr "el tipus de retorn d'una funció no pot ser una funció" +- +-#: c-typeck.c:1515 c-typeck.c:2853 +-#, gcc-internal-format +-msgid "arithmetic on pointer to an incomplete type" +-msgstr "aritmètica en punter a un tipus incomplet" +- +-#: c-typeck.c:1912 +-#, fuzzy, gcc-internal-format +-msgid "%qT has no member named %qE" +-msgstr "\"%D\" no té un membre cridat \"%E\"" +- +-#: c-typeck.c:1953 +-#, fuzzy, gcc-internal-format +-msgid "request for member %qE in something not a structure or union" +-msgstr "petició del membre \"%s\" en alguna cosa que no és estructura o unió" +- +-#: c-typeck.c:1997 +-#, gcc-internal-format +-msgid "dereferencing pointer to incomplete type" +-msgstr "punter dereferènciat a tipus de dada incompleta" +- +-#: c-typeck.c:2001 +-#, fuzzy, gcc-internal-format +-msgid "dereferencing % pointer" +-msgstr "dereferènciant el punter \"void *\"" +- +-#: c-typeck.c:2018 +-#, fuzzy, gcc-internal-format +-msgid "invalid type argument of %qs (have %qT)" +-msgstr "argument de tipus no vàlid de \"%s\"" +- +-#: c-typeck.c:2046 cp/typeck.c:2524 +-#, gcc-internal-format +-msgid "subscripted value is neither array nor pointer" +-msgstr "el valor indicat pel subindici no és ni matriu ni punter" +- +-#: c-typeck.c:2057 cp/typeck.c:2443 cp/typeck.c:2529 +-#, gcc-internal-format +-msgid "array subscript is not an integer" +-msgstr "el subindici de la matriu no és un enter" +- +-#: c-typeck.c:2063 +-#, fuzzy, gcc-internal-format +-msgid "subscripted value is pointer to function" +-msgstr "passant l'argument del punter a la funció" +- +-#: c-typeck.c:2110 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids subscripting % array" +-msgstr "ISO C prohibeix el subindici d'una matriu \"register\"" +- +-#: c-typeck.c:2112 +-#, gcc-internal-format +-msgid "ISO C90 forbids subscripting non-lvalue array" +-msgstr "ISO C90 prohibeix el subindici d'una matriu non-lvalue" +- +-#: c-typeck.c:2228 +-#, gcc-internal-format +-msgid "%H%qD is static but used in inline function %qD which is not static" +-msgstr "" +- +-#: c-typeck.c:2376 +-#, fuzzy, gcc-internal-format +-msgid "called object %qE is not a function" +-msgstr "l'objecte cridat no és una funció" +- +-#. This situation leads to run-time undefined behavior. We can't, +-#. therefore, simply error unless we can prove that all possible +-#. executions of the program must execute the code. +-#: c-typeck.c:2404 +-#, gcc-internal-format +-msgid "function called through a non-compatible type" +-msgstr "" +- +-#: c-typeck.c:2515 +-#, fuzzy, gcc-internal-format +-msgid "too many arguments to function %qE" +-msgstr "massa arguments per a la funció" +- +-#: c-typeck.c:2536 +-#, gcc-internal-format +-msgid "type of formal parameter %d is incomplete" +-msgstr "el tipus de dada del paràmetre formal %d està incomplet" +- +-#: c-typeck.c:2549 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as integer rather than floating due to prototype" +-msgstr "%s com enter en lloc de coma flotant a causa del prototip" +- +-#: c-typeck.c:2554 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as integer rather than complex due to prototype" +-msgstr "%s com enter en lloc de complex a causa del prototip" +- +-#: c-typeck.c:2559 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as complex rather than floating due to prototype" +-msgstr "%s com complex en lloc de coma flotant a causa del prototip" +- +-#: c-typeck.c:2564 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as floating rather than integer due to prototype" +-msgstr "%s com coma flotant en lloc d'enter a causa del prototip" +- +-#: c-typeck.c:2569 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as complex rather than integer due to prototype" +-msgstr "%s com complex en lloc d'enter a causa del prototip" +- +-#: c-typeck.c:2574 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as floating rather than complex due to prototype" +-msgstr "%s com coma flotant en lloc de complex a causa del prototip" +- +-#: c-typeck.c:2587 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as % rather than % due to prototype" +-msgstr "%s com \"float\" en lloc de \"double\" a causa del prototip" +- +-#: c-typeck.c:2612 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as %qT rather than %qT due to prototype" +-msgstr "%s com enter en lloc de complex a causa del prototip" +- +-#: c-typeck.c:2633 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE with different width due to prototype" +-msgstr "%s amb amplària diferent a causa del prototip" +- +-#: c-typeck.c:2656 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as unsigned due to prototype" +-msgstr "%s com unsigned a causa del prototip" +- +-#: c-typeck.c:2660 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE as signed due to prototype" +-msgstr "%s com signed a causa del prototip" +- +-#: c-typeck.c:2766 c-typeck.c:2770 +-#, fuzzy, gcc-internal-format +-msgid "comparison with string literal results in unspecified behavior" +-msgstr "la declaració feble de \"%s\" després del primer ús resulta en una conducta no especificada" +- +-#: c-typeck.c:2795 +-#, fuzzy, gcc-internal-format +-msgid "pointer of type % used in subtraction" +-msgstr "es va usar un punter de tipus \"void *\" en la substracció" +- +-#: c-typeck.c:2797 +-#, gcc-internal-format +-msgid "pointer to a function used in subtraction" +-msgstr "es va usar un punter a una funció en la substracció" +- +-#: c-typeck.c:2908 +-#, gcc-internal-format +-msgid "wrong type argument to unary plus" +-msgstr "argument de tipus erroni per a l'increment unari" +- +-#: c-typeck.c:2921 +-#, gcc-internal-format +-msgid "wrong type argument to unary minus" +-msgstr "argument de tipus erroni per al decrement unari" +- +-#: c-typeck.c:2941 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support %<~%> for complex conjugation" +-msgstr "ISO C no té suport de \"~\" per a conjugacions complexes" +- +-#: c-typeck.c:2947 +-#, gcc-internal-format +-msgid "wrong type argument to bit-complement" +-msgstr "argument de tipus erroni per a complement de bits" +- +-#: c-typeck.c:2955 +-#, gcc-internal-format +-msgid "wrong type argument to abs" +-msgstr "argument de tipus erroni per a abs" +- +-#: c-typeck.c:2967 +-#, gcc-internal-format +-msgid "wrong type argument to conjugation" +-msgstr "argument de tipus erroni per a la conjugació" +- +-#: c-typeck.c:2979 +-#, gcc-internal-format +-msgid "wrong type argument to unary exclamation mark" +-msgstr "argument de tipus erroni per al signe d'exclamació unari" +- +-#: c-typeck.c:3013 +-#, fuzzy, gcc-internal-format +-msgid "ISO C does not support %<++%> and %<--%> on complex types" +-msgstr "ISO C no té suport per a \"++\" i \"--\" en tipus complexos" +- +-#: c-typeck.c:3032 c-typeck.c:3064 +-#, gcc-internal-format +-msgid "wrong type argument to increment" +-msgstr "argument de tipus erroni per a l'increment" +- +-#: c-typeck.c:3034 c-typeck.c:3066 +-#, gcc-internal-format +-msgid "wrong type argument to decrement" +-msgstr "argument de tipus erroni pel decrement" +- +-#: c-typeck.c:3055 +-#, gcc-internal-format +-msgid "increment of pointer to unknown structure" +-msgstr "increment de punter a estructura desconeguda" +- +-#: c-typeck.c:3057 +-#, gcc-internal-format +-msgid "decrement of pointer to unknown structure" +-msgstr "decrement de punter a estructura desconeguda" +- +-#: c-typeck.c:3258 +-#, fuzzy, gcc-internal-format +-msgid "assignment of read-only member %qD" +-msgstr "%s del membre de només lectura \"%s\"" +- +-#: c-typeck.c:3259 +-#, fuzzy, gcc-internal-format +-msgid "increment of read-only member %qD" +-msgstr "%s del membre de només lectura \"%s\"" +- +-#: c-typeck.c:3260 +-#, fuzzy, gcc-internal-format +-msgid "decrement of read-only member %qD" +-msgstr "%s del membre de només lectura \"%s\"" +- +-#: c-typeck.c:3261 +-#, gcc-internal-format +-msgid "read-only member %qD used as % output" +-msgstr "" +- +-#: c-typeck.c:3265 +-#, fuzzy, gcc-internal-format +-msgid "assignment of read-only variable %qD" +-msgstr "%s de la variable de només lectura \"%s\"" +- +-#: c-typeck.c:3266 +-#, fuzzy, gcc-internal-format +-msgid "increment of read-only variable %qD" +-msgstr "%s de la variable de només lectura \"%s\"" +- +-#: c-typeck.c:3267 +-#, fuzzy, gcc-internal-format +-msgid "decrement of read-only variable %qD" +-msgstr "%s de la variable de només lectura \"%s\"" +- +-#: c-typeck.c:3268 +-#, gcc-internal-format +-msgid "read-only variable %qD used as % output" +-msgstr "" +- +-#: c-typeck.c:3271 +-#, fuzzy, gcc-internal-format +-msgid "assignment of read-only location %qE" +-msgstr "%s de la ubicació de només lectura" +- +-#: c-typeck.c:3272 +-#, fuzzy, gcc-internal-format +-msgid "increment of read-only location %qE" +-msgstr "%s de la ubicació de només lectura" +- +-#: c-typeck.c:3273 +-#, fuzzy, gcc-internal-format +-msgid "decrement of read-only location %qE" +-msgstr "%s de la ubicació de només lectura" +- +-#: c-typeck.c:3274 +-#, gcc-internal-format +-msgid "read-only location %qE used as % output" +-msgstr "" +- +-#: c-typeck.c:3310 +-#, fuzzy, gcc-internal-format +-msgid "cannot take address of bit-field %qD" +-msgstr "no es pot adquirir l'adreça del camp de bits \"%s\"" +- +-#: c-typeck.c:3338 +-#, fuzzy, gcc-internal-format +-msgid "global register variable %qD used in nested function" +-msgstr "es va usar la variable de registre global \"%s\" en funcions niades" +- +-#: c-typeck.c:3341 +-#, fuzzy, gcc-internal-format +-msgid "register variable %qD used in nested function" +-msgstr "es va usar la va variable \"%s\" en funcions niades" +- +-#: c-typeck.c:3346 +-#, fuzzy, gcc-internal-format +-msgid "address of global register variable %qD requested" +-msgstr "es va sol·licitar l'adreça de la variable de registre global \"%s\"" +- +-#: c-typeck.c:3348 +-#, fuzzy, gcc-internal-format +-msgid "address of register variable %qD requested" +-msgstr "es va sol·licitar l'adreça de la variable register \"%s\"" +- +-#: c-typeck.c:3394 +-#, fuzzy, gcc-internal-format +-msgid "non-lvalue array in conditional expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: c-typeck.c:3442 +-#, gcc-internal-format +-msgid "signed and unsigned type in conditional expression" +-msgstr "tipus signed i unsigned en l'expressió condicional" +- +-#: c-typeck.c:3449 +-#, gcc-internal-format +-msgid "ISO C forbids conditional expr with only one void side" +-msgstr "ISO C prohibeix una expressió condicional amb només un costat void" +- +-#: c-typeck.c:3463 c-typeck.c:3471 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids conditional expr between % and function pointer" +-msgstr "ISO C prohibeix expressions condicionals entre \"void *\" i punters de funcions" +- +-#: c-typeck.c:3478 +-#, gcc-internal-format +-msgid "pointer type mismatch in conditional expression" +-msgstr "els tipus de dades punters no coincideixen en l'expressió condicional" +- +-#: c-typeck.c:3485 c-typeck.c:3495 +-#, gcc-internal-format +-msgid "pointer/integer type mismatch in conditional expression" +-msgstr "els tipus de dades punters/enters no coincideixen en l'expressió condicional" +- +-#: c-typeck.c:3509 tree-cfg.c:3783 +-#, gcc-internal-format +-msgid "type mismatch in conditional expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: c-typeck.c:3552 +-#, gcc-internal-format +-msgid "left-hand operand of comma expression has no effect" +-msgstr "l'operador del costat esquerre de l'expressió coma no té efecte" +- +-#: c-typeck.c:3589 +-#, gcc-internal-format +-msgid "cast specifies array type" +-msgstr "la conversió especifica el tipus matriu" +- +-#: c-typeck.c:3595 +-#, gcc-internal-format +-msgid "cast specifies function type" +-msgstr "la conversió especifica el tipus funció" +- +-#: c-typeck.c:3612 +-#, gcc-internal-format +-msgid "ISO C forbids casting nonscalar to the same type" +-msgstr "ISO C prohibeix la conversió d'un no escalar al mateix tipus" +- +-#: c-typeck.c:3629 +-#, gcc-internal-format +-msgid "ISO C forbids casts to union type" +-msgstr "ISO C prohibeix la conversió al tipus union" +- +-#: c-typeck.c:3637 +-#, gcc-internal-format +-msgid "cast to union type from type not present in union" +-msgstr "conversió a tipus union des d'un tipus no presenti en union" +- +-#: c-typeck.c:3683 +-#, gcc-internal-format +-msgid "cast adds new qualifiers to function type" +-msgstr "la conversió afegeix nous qualificadors del tipus de la funció" +- +-#. There are qualifiers present in IN_OTYPE that are not +-#. present in IN_TYPE. +-#: c-typeck.c:3688 +-#, gcc-internal-format +-msgid "cast discards qualifiers from pointer target type" +-msgstr "la conversió descarta els qualificadors del tipus de la destinació del punter" +- +-#: c-typeck.c:3704 +-#, gcc-internal-format +-msgid "cast increases required alignment of target type" +-msgstr "la conversió incrementa l'alineació requerida del tipus de la destinació" +- +-#: c-typeck.c:3715 +-#, gcc-internal-format +-msgid "cast from pointer to integer of different size" +-msgstr "conversió de punter a enter de grandària diferent" +- +-#: c-typeck.c:3719 +-#, gcc-internal-format +-msgid "cast from function call of type %qT to non-matching type %qT" +-msgstr "" +- +-#: c-typeck.c:3727 +-#, gcc-internal-format +-msgid "cast to pointer from integer of different size" +-msgstr "conversió a punter des d'un enter de grandària diferent" +- +-#: c-typeck.c:3741 +-#, gcc-internal-format +-msgid "ISO C forbids conversion of function pointer to object pointer type" +-msgstr "ISO C prohibeix la conversió d'un punter de funció a un tipus punter d'objecte" +- +-#: c-typeck.c:3749 +-#, gcc-internal-format +-msgid "ISO C forbids conversion of object pointer to function pointer type" +-msgstr "ISO C prohibeix la conversió d'un punter d'objecte a un tipus punter de funció" +- +-#: c-typeck.c:4026 +-#, gcc-internal-format +-msgid "cannot pass rvalue to reference parameter" +-msgstr "no es pot passar un valor-r a un paràmetre de referència" +- +-#: c-typeck.c:4139 c-typeck.c:4306 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE makes qualified function pointer from unqualified" +-msgstr "%s fa un punter de funció qualificat des d'un no qualificat" +- +-#: c-typeck.c:4142 c-typeck.c:4309 +-#, fuzzy, gcc-internal-format +-msgid "assignment makes qualified function pointer from unqualified" +-msgstr "%s fa un punter de funció qualificat des d'un no qualificat" +- +-#: c-typeck.c:4145 c-typeck.c:4311 +-#, fuzzy, gcc-internal-format +-msgid "initialization makes qualified function pointer from unqualified" +-msgstr "%s fa un punter de funció qualificat des d'un no qualificat" +- +-#: c-typeck.c:4148 c-typeck.c:4313 +-#, fuzzy, gcc-internal-format +-msgid "return makes qualified function pointer from unqualified" +-msgstr "%s fa un punter de funció qualificat des d'un no qualificat" +- +-#: c-typeck.c:4152 c-typeck.c:4273 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE discards qualifiers from pointer target type" +-msgstr "la conversió de \"%T\" a \"%T\" descarta els qualificadors del tipus de la destinació del punter" +- +-#: c-typeck.c:4154 c-typeck.c:4275 +-#, fuzzy, gcc-internal-format +-msgid "assignment discards qualifiers from pointer target type" +-msgstr "la conversió descarta els qualificadors del tipus de la destinació del punter" +- +-#: c-typeck.c:4156 c-typeck.c:4277 +-#, fuzzy, gcc-internal-format +-msgid "initialization discards qualifiers from pointer target type" +-msgstr "la conversió descarta els qualificadors del tipus de la destinació del punter" +- +-#: c-typeck.c:4158 c-typeck.c:4279 +-#, fuzzy, gcc-internal-format +-msgid "return discards qualifiers from pointer target type" +-msgstr "la conversió descarta els qualificadors del tipus de la destinació del punter" +- +-#: c-typeck.c:4165 +-#, gcc-internal-format +-msgid "ISO C prohibits argument conversion to union type" +-msgstr "ISO C prohibeix la conversió d'arguments a tipus union" +- +-#: c-typeck.c:4201 +-#, fuzzy, gcc-internal-format +-msgid "request for implicit conversion from %qT to %qT not permitted in C++" +-msgstr "iconv no dóna suport a la conversió de \"%s\" a \"%s\"" +- +-#: c-typeck.c:4214 +-#, fuzzy, gcc-internal-format +-msgid "argument %d of %qE might be a candidate for a format attribute" +-msgstr "la funció pot ser un candidat possible per a l'atribut de format \"%s\"" +- +-#: c-typeck.c:4220 +-#, fuzzy, gcc-internal-format +-msgid "assignment left-hand side might be a candidate for a format attribute" +-msgstr "Avisar per funcions que podrien ser candidates per a atributs de format" +- +-#: c-typeck.c:4225 +-#, fuzzy, gcc-internal-format +-msgid "initialization left-hand side might be a candidate for a format attribute" +-msgstr "la funció pot ser un candidat possible per a l'atribut de format \"%s\"" +- +-#: c-typeck.c:4230 +-#, fuzzy, gcc-internal-format +-msgid "return type might be a candidate for a format attribute" +-msgstr "la funció pot ser un candidat possible per a l'atribut de format \"%s\"" +- +-#: c-typeck.c:4253 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids passing argument %d of %qE between function pointer and %" +-msgstr "ISO C prohibeix %s entre punters a funció i \"void *\"" +- +-#: c-typeck.c:4256 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids assignment between function pointer and %" +-msgstr "ISO C prohibeix %s entre punters a funció i \"void *\"" +- +-#: c-typeck.c:4258 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids initialization between function pointer and %" +-msgstr "ISO C prohibeix %s entre punters a funció i \"void *\"" +- +-#: c-typeck.c:4260 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids return between function pointer and %" +-msgstr "ISO C prohibeix %s entre punters a funció i \"void *\"" +- +-#: c-typeck.c:4289 +-#, fuzzy, gcc-internal-format +-msgid "pointer targets in passing argument %d of %qE differ in signedness" +-msgstr "el punter que punta a %s difereix en signe" +- +-#: c-typeck.c:4291 +-#, fuzzy, gcc-internal-format +-msgid "pointer targets in assignment differ in signedness" +-msgstr "el punter que punta a %s difereix en signe" +- +-#: c-typeck.c:4293 +-#, fuzzy, gcc-internal-format +-msgid "pointer targets in initialization differ in signedness" +-msgstr "el punter que punta a %s difereix en signe" +- +-#: c-typeck.c:4295 +-#, fuzzy, gcc-internal-format +-msgid "pointer targets in return differ in signedness" +-msgstr "el punter que punta a %s difereix en signe" +- +-#: c-typeck.c:4320 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE from incompatible pointer type" +-msgstr "%s de tipus de punter incompatible" +- +-#: c-typeck.c:4322 +-#, fuzzy, gcc-internal-format +-msgid "assignment from incompatible pointer type" +-msgstr "%s de tipus de punter incompatible" +- +-#: c-typeck.c:4323 +-#, fuzzy, gcc-internal-format +-msgid "initialization from incompatible pointer type" +-msgstr "%s de tipus de punter incompatible" +- +-#: c-typeck.c:4325 +-#, fuzzy, gcc-internal-format +-msgid "return from incompatible pointer type" +-msgstr "%s de tipus de punter incompatible" +- +-#: c-typeck.c:4342 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE makes pointer from integer without a cast" +-msgstr "%s crea un punter des d'un enter sense una conversió" +- +-#: c-typeck.c:4344 +-#, fuzzy, gcc-internal-format +-msgid "assignment makes pointer from integer without a cast" +-msgstr "%s crea un punter des d'un enter sense una conversió" +- +-#: c-typeck.c:4346 +-#, fuzzy, gcc-internal-format +-msgid "initialization makes pointer from integer without a cast" +-msgstr "%s crea un punter des d'un enter sense una conversió" +- +-#: c-typeck.c:4348 +-#, fuzzy, gcc-internal-format +-msgid "return makes pointer from integer without a cast" +-msgstr "%s crea un punter des d'un enter sense una conversió" +- +-#: c-typeck.c:4355 +-#, fuzzy, gcc-internal-format +-msgid "passing argument %d of %qE makes integer from pointer without a cast" +-msgstr "%s crea un enter des d'un punter sense una conversió" +- +-#: c-typeck.c:4357 +-#, fuzzy, gcc-internal-format +-msgid "assignment makes integer from pointer without a cast" +-msgstr "%s crea un enter des d'un punter sense una conversió" +- +-#: c-typeck.c:4359 +-#, fuzzy, gcc-internal-format +-msgid "initialization makes integer from pointer without a cast" +-msgstr "%s crea un enter des d'un punter sense una conversió" +- +-#: c-typeck.c:4361 +-#, fuzzy, gcc-internal-format +-msgid "return makes integer from pointer without a cast" +-msgstr "%s crea un enter des d'un punter sense una conversió" +- +-#: c-typeck.c:4377 +-#, fuzzy, gcc-internal-format +-msgid "incompatible types in assignment" +-msgstr "tipus incompatibles en %s" +- +-#: c-typeck.c:4380 +-#, fuzzy, gcc-internal-format +-msgid "incompatible types in initialization" +-msgstr "tipus incompatibles en %s" +- +-#: c-typeck.c:4383 +-#, fuzzy, gcc-internal-format +-msgid "incompatible types in return" +-msgstr "tipus incompatibles en %s" +- +-#: c-typeck.c:4439 +-#, gcc-internal-format +-msgid "traditional C rejects automatic aggregate initialization" +-msgstr "C tradicional rebutja la iniciació automàtica d'agregats" +- +-#: c-typeck.c:4610 c-typeck.c:4625 c-typeck.c:4640 +-#, fuzzy, gcc-internal-format +-msgid "(near initialization for %qs)" +-msgstr "(prop de l'assignació de valors inicials per a \"%s\")" +- +-#: c-typeck.c:5180 cp/decl.c:4975 +-#, gcc-internal-format +-msgid "opaque vector types cannot be initialized" +-msgstr "" +- +-#: c-typeck.c:5803 +-#, fuzzy, gcc-internal-format +-msgid "unknown field %qE specified in initializer" +-msgstr "camp \"%s\" desconegut especificat en el valor inicial" +- +-#: c-typeck.c:6703 +-#, gcc-internal-format +-msgid "traditional C rejects initialization of unions" +-msgstr "C tradicional rebutja els valors inicials d'unions" +- +-#: c-typeck.c:7011 +-#, fuzzy, gcc-internal-format +-msgid "jump into statement expression" +-msgstr "desbordament en la constant implícita" +- +-#: c-typeck.c:7017 +-#, fuzzy, gcc-internal-format +-msgid "jump into scope of identifier with variably modified type" +-msgstr "l'argument de patró \"%T\" és un tipus modificat variablement" +- +-#: c-typeck.c:7054 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids %" +-msgstr "ISO C prohibeix \"goto *expr;\"" +- +-#: c-typeck.c:7069 cp/typeck.c:6592 +-#, fuzzy, gcc-internal-format +-msgid "function declared % has a % statement" +-msgstr "la funció declarada \"noreturn\" té una declaració \"return\"" +- +-#: c-typeck.c:7077 +-#, fuzzy, gcc-internal-format +-msgid "% with no value, in function returning non-void" +-msgstr "\"return\" sense valors, en una funció que retorna \"non-void\"" +- +-#: c-typeck.c:7086 +-#, fuzzy, gcc-internal-format +-msgid "% with a value, in function returning void" +-msgstr "\"return\" amb valor, en una funció que retorna \"void\"" +- +-#: c-typeck.c:7088 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids % with expression, in function returning void" +-msgstr "\"return\" amb valor, en una funció que retorna \"void\"" +- +-#: c-typeck.c:7145 +-#, gcc-internal-format +-msgid "function returns address of local variable" +-msgstr "la funció retorna l'adreça d'una variable local" +- +-#: c-typeck.c:7217 cp/semantics.c:949 +-#, gcc-internal-format +-msgid "switch quantity not an integer" +-msgstr "la quantitat del «switch» no és un enter" +- +-#: c-typeck.c:7229 +-#, fuzzy, gcc-internal-format +-msgid "% switch expression not converted to % in ISO C" +-msgstr "no es converteix l'expressió de «switch» \"long\" a \"int\" en ISO C" +- +-#: c-typeck.c:7269 +-#, fuzzy, gcc-internal-format +-msgid "case label in statement expression not containing enclosing switch statement" +-msgstr "l'etiqueta «case» no es troba dintre d'una declaració «switch»" +- +-#: c-typeck.c:7272 +-#, fuzzy, gcc-internal-format +-msgid "% label in statement expression not containing enclosing switch statement" +-msgstr "l'etiqueta \"default\" no està dintre d'una declaració «switch»" +- +-#: c-typeck.c:7278 +-#, gcc-internal-format +-msgid "case label in scope of identifier with variably modified type not containing enclosing switch statement" +-msgstr "" +- +-#: c-typeck.c:7281 +-#, gcc-internal-format +-msgid "% label in scope of identifier with variably modified type not containing enclosing switch statement" +-msgstr "" +- +-#: c-typeck.c:7285 cp/parser.c:6804 +-#, gcc-internal-format +-msgid "case label not within a switch statement" +-msgstr "l'etiqueta «case» no es troba dintre d'una declaració «switch»" +- +-#: c-typeck.c:7287 +-#, fuzzy, gcc-internal-format +-msgid "% label not within a switch statement" +-msgstr "l'etiqueta \"default\" no està dintre d'una declaració «switch»" +- +-#: c-typeck.c:7364 +-#, fuzzy, gcc-internal-format +-msgid "%Hsuggest explicit braces to avoid ambiguous %" +-msgstr "%Hsuggereix parèntesis explícits per evitar \"else\" ambigu" +- +-#: c-typeck.c:7475 cp/cp-gimplify.c:97 cp/parser.c:7409 +-#, gcc-internal-format +-msgid "break statement not within loop or switch" +-msgstr "la declaració break no està dintre d'un cicle o «switch»" +- +-#: c-typeck.c:7477 cp/parser.c:7430 +-#, gcc-internal-format +-msgid "continue statement not within a loop" +-msgstr "la declaració continue no està dintre dintre d'un cicle" +- +-#: c-typeck.c:7482 cp/parser.c:7420 +-#, fuzzy, gcc-internal-format +-msgid "break statement used with OpenMP for loop" +-msgstr "la declaració break no està dintre d'un cicle o «switch»" +- +-#: c-typeck.c:7505 +-#, gcc-internal-format +-msgid "%Hstatement with no effect" +-msgstr "" +- +-#: c-typeck.c:7527 +-#, gcc-internal-format +-msgid "expression statement has incomplete type" +-msgstr "la declaració de l'expressió té tipus de dada incompleta" +- +-#: c-typeck.c:8082 cp/typeck.c:3259 +-#, gcc-internal-format +-msgid "right shift count is negative" +-msgstr "el valor de desplaçament a la dreta és negatiu" +- +-#: c-typeck.c:8089 cp/typeck.c:3265 +-#, gcc-internal-format +-msgid "right shift count >= width of type" +-msgstr "valor de desplaçament a la dreta >= amplària del tipus" +- +-#: c-typeck.c:8111 cp/typeck.c:3284 +-#, gcc-internal-format +-msgid "left shift count is negative" +-msgstr "el valor de desplaçament a l'esquerra és negatiu" +- +-#: c-typeck.c:8114 cp/typeck.c:3286 +-#, gcc-internal-format +-msgid "left shift count >= width of type" +-msgstr "valor de desplaçament a l'esquerra >= amplària del tipus" +- +-#: c-typeck.c:8132 cp/typeck.c:3324 +-#, gcc-internal-format +-msgid "comparing floating point with == or != is unsafe" +-msgstr "no és segura la comparança de coma flotant amb == o !=" +- +-#: c-typeck.c:8156 c-typeck.c:8163 +-#, fuzzy, gcc-internal-format +-msgid "ISO C forbids comparison of % with function pointer" +-msgstr "ISO C prohibeix la comparança de \"void *\" amb un punter de funció" +- +-#: c-typeck.c:8169 c-typeck.c:8227 +-#, gcc-internal-format +-msgid "comparison of distinct pointer types lacks a cast" +-msgstr "la comparança de diferents tipus de punter manca d'una conversió" +- +-#: c-typeck.c:8178 c-typeck.c:8186 cp/typeck.c:3344 cp/typeck.c:3353 +-#, fuzzy, gcc-internal-format +-msgid "the address of %qD will never be NULL" +-msgstr "l'adreça de \"%D\", sempre serà \"true\"" +- +-#: c-typeck.c:8193 c-typeck.c:8198 c-typeck.c:8245 c-typeck.c:8250 +-#, gcc-internal-format +-msgid "comparison between pointer and integer" +-msgstr "comparança entre punter i enter" +- +-#: c-typeck.c:8219 +-#, gcc-internal-format +-msgid "comparison of complete and incomplete pointers" +-msgstr "comparança de punters complets i incomplets" +- +-#: c-typeck.c:8222 +-#, gcc-internal-format +-msgid "ISO C forbids ordered comparisons of pointers to functions" +-msgstr "ISO C prohibeix la comparança entre punters a funcions" +- +-#: c-typeck.c:8234 c-typeck.c:8240 +-#, gcc-internal-format +-msgid "ordered comparison of pointer with integer zero" +-msgstr "comparança ordenada de punter amb l'enter zero" +- +-#: c-typeck.c:8500 +-#, gcc-internal-format +-msgid "comparison between signed and unsigned" +-msgstr "comparança entre signed i unsigned" +- +-#: c-typeck.c:8546 cp/typeck.c:3830 +-#, gcc-internal-format +-msgid "comparison of promoted ~unsigned with constant" +-msgstr "comparança d'un ~unsigned promogut amb una constant" +- +-#: c-typeck.c:8554 cp/typeck.c:3838 +-#, gcc-internal-format +-msgid "comparison of promoted ~unsigned with unsigned" +-msgstr "comparança d'un ~unsigned promogut amb unsigned" +- +-#: c-typeck.c:8612 +-#, fuzzy, gcc-internal-format +-msgid "used array that cannot be converted to pointer where scalar is required" +-msgstr "s'usa un valor de tipus matriu quan es requereix un escalar" +- +-#: c-typeck.c:8616 +-#, fuzzy, gcc-internal-format +-msgid "used struct type value where scalar is required" +-msgstr "s'usa un valor de tipus struct quan es requereix un escalar" +- +-#: c-typeck.c:8620 +-#, fuzzy, gcc-internal-format +-msgid "used union type value where scalar is required" +-msgstr "s'usa un valor de tipus union quan es requereix un escalar" +- +-#: c-typeck.c:8725 cp/semantics.c:3523 +-#, fuzzy, gcc-internal-format +-msgid "%qE has invalid type for %" +-msgstr "tipus de retorn no vàlid per a la funció \"%#D\"" +- +-#: c-typeck.c:8759 cp/semantics.c:3536 +-#, fuzzy, gcc-internal-format +-msgid "%qE has invalid type for %" +-msgstr "tipus de retorn no vàlid per a la funció \"%#D\"" +- +-#: c-typeck.c:8775 cp/semantics.c:3546 +-#, gcc-internal-format +-msgid "%qE must be % for %" +-msgstr "" +- +-#: c-typeck.c:8784 cp/semantics.c:3351 +-#, fuzzy, gcc-internal-format +-msgid "%qE is not a variable in clause %qs" +-msgstr "\"%s\" no és un nom de fitxer vàlid" +- +-#: c-typeck.c:8791 c-typeck.c:8811 c-typeck.c:8831 cp/semantics.c:3377 +-#: cp/semantics.c:3396 +-#, gcc-internal-format +-msgid "%qE appears more than once in data clauses" +-msgstr "" +- +-#: c-typeck.c:8805 cp/semantics.c:3371 +-#, gcc-internal-format +-msgid "%qE is not a variable in clause %" +-msgstr "" +- +-#: c-typeck.c:8825 cp/semantics.c:3390 +-#, gcc-internal-format +-msgid "%qE is not a variable in clause %" +-msgstr "" +- +-#: c-typeck.c:8883 cp/semantics.c:3587 +-#, gcc-internal-format +-msgid "%qE is predetermined %qs for %qs" +-msgstr "" +- +-#: calls.c:2032 +-#, gcc-internal-format +-msgid "function call has aggregate value" +-msgstr "la crida a la funció té valor agregat" +- +-#: cfgexpand.c:1884 +-#, gcc-internal-format +-msgid "not protecting local variables: variable length buffer" +-msgstr "" +- +-#: cfgexpand.c:1887 +-#, gcc-internal-format +-msgid "not protecting function: no buffer at least %d bytes long" +-msgstr "" +- +-#: cfghooks.c:97 +-#, gcc-internal-format +-msgid "bb %d on wrong place" +-msgstr "bb %d en un lloc equivocat" +- +-#: cfghooks.c:103 +-#, gcc-internal-format +-msgid "prev_bb of %d should be %d, not %d" +-msgstr "el prev_bb de %d ha de ser %d, no %d" +- +-#: cfghooks.c:120 +-#, gcc-internal-format +-msgid "verify_flow_info: Block %i has loop_father, but there are no loops" +-msgstr "" +- +-#: cfghooks.c:126 +-#, fuzzy, gcc-internal-format +-msgid "verify_flow_info: Block %i lacks loop_father" +-msgstr "verify_flow_info: El bloc bàsic %d succ edge està corrupte" +- +-#: cfghooks.c:132 +-#, gcc-internal-format +-msgid "verify_flow_info: Wrong count of block %i %i" +-msgstr "verify_flow_info: Compte erroni del bloc %i %i" +- +-#: cfghooks.c:138 +-#, gcc-internal-format +-msgid "verify_flow_info: Wrong frequency of block %i %i" +-msgstr "verify_flow_info: Freqüència errònia del bloc %i %i" +- +-#: cfghooks.c:146 +-#, gcc-internal-format +-msgid "verify_flow_info: Duplicate edge %i->%i" +-msgstr "verify_flow_info: Vora duplicada %i->%i" +- +-#: cfghooks.c:152 +-#, gcc-internal-format +-msgid "verify_flow_info: Wrong probability of edge %i->%i %i" +-msgstr "verify_flow_info: Probabilitat errònia de la vora %i->%i %i" +- +-#: cfghooks.c:158 +-#, gcc-internal-format +-msgid "verify_flow_info: Wrong count of edge %i->%i %i" +-msgstr "verify_flow_info: Compte erroni de la vora %i->%i %i" +- +-#: cfghooks.c:170 +-#, gcc-internal-format +-msgid "verify_flow_info: Basic block %d succ edge is corrupted" +-msgstr "verify_flow_info: El bloc bàsic %d succ edge està corrupte" +- +-#: cfghooks.c:184 cfgrtl.c:1840 +-#, fuzzy, gcc-internal-format +-msgid "wrong amount of branch edges after unconditional jump %i" +-msgstr "Quantitat errònia de vores de ramificació després del salt incondicional %i" +- +-#: cfghooks.c:192 cfghooks.c:203 +-#, gcc-internal-format +-msgid "basic block %d pred edge is corrupted" +-msgstr "el bloc bàsic %d pred edge està corrupte" +- +-#: cfghooks.c:204 +-#, fuzzy, gcc-internal-format +-msgid "its dest_idx should be %d, not %d" +-msgstr "el prev_bb de %d ha de ser %d, no %d" +- +-#: cfghooks.c:233 +-#, gcc-internal-format +-msgid "basic block %i edge lists are corrupted" +-msgstr "les llistes de vora del bloc bàsic %i estan corruptes" +- +-#: cfghooks.c:246 +-#, gcc-internal-format +-msgid "verify_flow_info failed" +-msgstr "verify_flow_info fallat" +- +-#: cfghooks.c:307 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support redirect_edge_and_branch" +-msgstr "%s no té suport per a l'operand amb format de nombre %%n$" +- +-#: cfghooks.c:327 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support can_remove_branch_p" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:381 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support redirect_edge_and_branch_force" +-msgstr "%s no té suport per a l'operand amb format de nombre %%n$" +- +-#: cfghooks.c:417 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support split_block" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:460 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support move_block_after" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:473 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support delete_basic_block" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:523 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support split_edge" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:596 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support create_basic_block" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:624 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support can_merge_blocks_p" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:635 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support predict_edge" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:644 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support predicted_by_p" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:658 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support merge_blocks" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:711 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support make_forwarder_block" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:845 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support can_duplicate_block_p" +-msgstr "no es dóna suport a multilib" +- +-#: cfghooks.c:867 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support duplicate_block" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:944 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support block_ends_with_call_p" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:955 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support block_ends_with_condjump_p" +-msgstr "%s no té suport per a %s" +- +-#: cfghooks.c:973 +-#, fuzzy, gcc-internal-format +-msgid "%s does not support flow_call_edges_add" +-msgstr "%s no té suport per a %s" +- +-#: cfgloop.c:1328 +-#, fuzzy, gcc-internal-format +-msgid "size of loop %d should be %d, not %d" +-msgstr "La grandària del cicle %d ha de ser %d, no %d." +- +-#: cfgloop.c:1342 +-#, fuzzy, gcc-internal-format +-msgid "bb %d do not belong to loop %d" +-msgstr "Bb %d no pertany al cicle %d." +- +-#: cfgloop.c:1357 +-#, fuzzy, gcc-internal-format +-msgid "loop %d's header does not have exactly 2 entries" +-msgstr "L'encapçalat del cicle %d no té exactament 2 entrades." +- +-#: cfgloop.c:1364 +-#, fuzzy, gcc-internal-format +-msgid "loop %d's latch does not have exactly 1 successor" +-msgstr "El forrellat del cicle %d no té exactament 1 successor." +- +-#: cfgloop.c:1369 +-#, fuzzy, gcc-internal-format +-msgid "loop %d's latch does not have header as successor" +-msgstr "El forrellat del cicle %d no té un encapçalat com successor." +- +-#: cfgloop.c:1374 +-#, fuzzy, gcc-internal-format +-msgid "loop %d's latch does not belong directly to it" +-msgstr "El forrellat del cicle %d no pertany directament a ell." +- +-#: cfgloop.c:1380 +-#, fuzzy, gcc-internal-format +-msgid "loop %d's header does not belong directly to it" +-msgstr "L'encapçalat del cicle %d no pertany directament a ell." +- +-#: cfgloop.c:1386 +-#, gcc-internal-format +-msgid "loop %d's latch is marked as part of irreducible region" +-msgstr "" +- +-#: cfgloop.c:1419 +-#, fuzzy, gcc-internal-format +-msgid "basic block %d should be marked irreducible" +-msgstr "el bloc bàsic %d pred edge està corrupte" +- +-#: cfgloop.c:1425 +-#, fuzzy, gcc-internal-format +-msgid "basic block %d should not be marked irreducible" +-msgstr "les llistes de vora del bloc bàsic %i estan corruptes" +- +-#: cfgloop.c:1433 +-#, gcc-internal-format +-msgid "edge from %d to %d should be marked irreducible" +-msgstr "" +- +-#: cfgloop.c:1440 +-#, gcc-internal-format +-msgid "edge from %d to %d should not be marked irreducible" +-msgstr "" +- +-#: cfgloop.c:1455 +-#, gcc-internal-format +-msgid "corrupted head of the exits list of loop %d" +-msgstr "" +- +-#: cfgloop.c:1473 +-#, gcc-internal-format +-msgid "corrupted exits list of loop %d" +-msgstr "" +- +-#: cfgloop.c:1482 +-#, gcc-internal-format +-msgid "nonempty exits list of loop %d, but exits are not recorded" +-msgstr "" +- +-#: cfgloop.c:1508 +-#, gcc-internal-format +-msgid "Exit %d->%d not recorded" +-msgstr "" +- +-#: cfgloop.c:1526 +-#, gcc-internal-format +-msgid "Wrong list of exited loops for edge %d->%d" +-msgstr "" +- +-#: cfgloop.c:1535 +-#, gcc-internal-format +-msgid "Too many loop exits recorded" +-msgstr "" +- +-#: cfgloop.c:1546 +-#, gcc-internal-format +-msgid "%d exits recorded for loop %d (having %d exits)" +-msgstr "" +- +-#: cfgrtl.c:1734 +-#, gcc-internal-format +-msgid "BB_RTL flag not set for block %d" +-msgstr "" +- +-#: cfgrtl.c:1741 +-#, gcc-internal-format +-msgid "insn %d basic block pointer is %d, should be %d" +-msgstr "" +- +-#: cfgrtl.c:1752 +-#, gcc-internal-format +-msgid "insn %d in header of bb %d has non-NULL basic block" +-msgstr "" +- +-#: cfgrtl.c:1760 +-#, gcc-internal-format +-msgid "insn %d in footer of bb %d has non-NULL basic block" +-msgstr "" +- +-#: cfgrtl.c:1782 +-#, gcc-internal-format +-msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i" +-msgstr "verify_flow_info: REG_BR_PROB no coincideix amb la configuració %wi %i" +- +-#: cfgrtl.c:1797 +-#, gcc-internal-format +-msgid "fallthru edge crosses section boundary (bb %i)" +-msgstr "" +- +-#: cfgrtl.c:1822 +-#, fuzzy, gcc-internal-format +-msgid "missing REG_EH_REGION note in the end of bb %i" +-msgstr "Manca la nota REG_EH_REGION al final de bb %i" +- +-#: cfgrtl.c:1830 +-#, fuzzy, gcc-internal-format +-msgid "too many outgoing branch edges from bb %i" +-msgstr "Massa vores de ramificació de sortida de bb %i" +- +-#: cfgrtl.c:1835 +-#, fuzzy, gcc-internal-format +-msgid "fallthru edge after unconditional jump %i" +-msgstr "Vora de caiguda després del salt incondicional %i" +- +-#: cfgrtl.c:1846 +-#, fuzzy, gcc-internal-format +-msgid "wrong amount of branch edges after conditional jump %i" +-msgstr "Quantitat errònia de vores de ramificació després del salt condicional %i" +- +-#: cfgrtl.c:1852 +-#, fuzzy, gcc-internal-format +-msgid "call edges for non-call insn in bb %i" +-msgstr "Bords de cridada per a una insn que no és cridada en bb %i" +- +-#: cfgrtl.c:1861 +-#, fuzzy, gcc-internal-format +-msgid "abnormal edges for no purpose in bb %i" +-msgstr "Vores anormals sense cap propòsit en bb %i" +- +-#: cfgrtl.c:1873 +-#, gcc-internal-format +-msgid "insn %d inside basic block %d but block_for_insn is NULL" +-msgstr "insn %d està dintre del bloc bàsic %d però block_for_insn és NULL" +- +-#: cfgrtl.c:1877 +-#, gcc-internal-format +-msgid "insn %d inside basic block %d but block_for_insn is %i" +-msgstr "insn %d està dintre del bloc bàsic %d però block_for_insn és %i" +- +-#: cfgrtl.c:1891 cfgrtl.c:1901 +-#, gcc-internal-format +-msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d" +-msgstr "NOTE_INSN_BASIC_BLOCK mancada per al bloc %d" +- +-#: cfgrtl.c:1914 +-#, gcc-internal-format +-msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d" +-msgstr "NOTE_INSN_BASIC_BLOCK %d en el mitjà del bloc bàsic %d" +- +-#: cfgrtl.c:1924 +-#, gcc-internal-format +-msgid "in basic block %d:" +-msgstr "en el bloc bàsic %d:" +- +-#: cfgrtl.c:1977 cfgrtl.c:2067 +-#, fuzzy, gcc-internal-format +-msgid "insn %d outside of basic blocks has non-NULL bb field" +-msgstr "insn fora del bloc bàsic" +- +-#: cfgrtl.c:1985 +-#, gcc-internal-format +-msgid "end insn %d for block %d not found in the insn stream" +-msgstr "el insn final %d per al bloc %d no es troba en el fluix insn" +- +-#: cfgrtl.c:1998 +-#, gcc-internal-format +-msgid "insn %d is in multiple basic blocks (%d and %d)" +-msgstr "insn %d està en múltiples blocs bàsics (%d i %d)" +- +-#: cfgrtl.c:2010 +-#, gcc-internal-format +-msgid "head insn %d for block %d not found in the insn stream" +-msgstr "el cap insn %d per al bloc %d no es troba en el fluix insn" +- +-#: cfgrtl.c:2030 +-#, gcc-internal-format +-msgid "missing barrier after block %i" +-msgstr "falta una barrera després del bloc %i" +- +-#: cfgrtl.c:2043 +-#, gcc-internal-format +-msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i" +-msgstr "verify_flow_info: Blocs incorrectes per al respatller %i->%i" +- +-#: cfgrtl.c:2052 +-#, gcc-internal-format +-msgid "verify_flow_info: Incorrect fallthru %i->%i" +-msgstr "verify_flow_info: Respatller incorrecte %i->%i" +- +-#: cfgrtl.c:2085 +-#, gcc-internal-format +-msgid "basic blocks not laid down consecutively" +-msgstr "els blocs bàsics no estan col·locats consecutivament" +- +-#: cfgrtl.c:2124 +-#, gcc-internal-format +-msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" +-msgstr "el nombre de notes bb en la cadena insn (%d) != n_basic_blocks (%d)" +- +-#: cgraph.c:794 +-#, gcc-internal-format +-msgid "%D renamed after being referenced in assembly" +-msgstr "" +- +-#: cgraphunit.c:670 +-#, gcc-internal-format +-msgid "aux field set for edge %s->%s" +-msgstr "" +- +-#: cgraphunit.c:676 +-#, fuzzy, gcc-internal-format +-msgid "Execution count is negative" +-msgstr "el valor de desplaçament a l'esquerra és negatiu" +- +-#: cgraphunit.c:683 +-#, fuzzy, gcc-internal-format +-msgid "caller edge count is negative" +-msgstr "el valor de desplaçament a l'esquerra és negatiu" +- +-#: cgraphunit.c:688 +-#, gcc-internal-format +-msgid "caller edge frequency is negative" +-msgstr "" +- +-#: cgraphunit.c:693 +-#, gcc-internal-format +-msgid "caller edge frequency is too large" +-msgstr "" +- +-#: cgraphunit.c:702 +-#, fuzzy, gcc-internal-format +-msgid "inlined_to pointer is wrong" +-msgstr "falta la secció de punters" +- +-#: cgraphunit.c:707 +-#, fuzzy, gcc-internal-format +-msgid "multiple inline callers" +-msgstr "specificadors \"virtual\" múltiples" +- +-#: cgraphunit.c:714 +-#, gcc-internal-format +-msgid "inlined_to pointer set for noninline callers" +-msgstr "" +- +-#: cgraphunit.c:720 +-#, gcc-internal-format +-msgid "inlined_to pointer is set but no predecessors found" +-msgstr "" +- +-#: cgraphunit.c:725 +-#, fuzzy, gcc-internal-format +-msgid "inlined_to pointer refers to itself" +-msgstr "punter no vàlid al camp de bit \"%D\"" +- +-#: cgraphunit.c:735 +-#, gcc-internal-format +-msgid "node not found in cgraph_hash" +-msgstr "" +- +-#: cgraphunit.c:763 +-#, gcc-internal-format +-msgid "shared call_stmt:" +-msgstr "" +- +-#: cgraphunit.c:770 +-#, fuzzy, gcc-internal-format +-msgid "edge points to wrong declaration:" +-msgstr "s'usa \"%s\" previ a la declaració" +- +-#: cgraphunit.c:779 +-#, gcc-internal-format +-msgid "missing callgraph edge for call stmt:" +-msgstr "" +- +-#: cgraphunit.c:795 +-#, gcc-internal-format +-msgid "edge %s->%s has no corresponding call_stmt" +-msgstr "" +- +-#: cgraphunit.c:807 +-#, fuzzy, gcc-internal-format +-msgid "verify_cgraph_node failed" +-msgstr "verify_flow_info fallat" +- +-#: cgraphunit.c:909 cgraphunit.c:932 +-#, gcc-internal-format +-msgid "%J% attribute have effect only on public objects" +-msgstr "" +- +-#: cgraphunit.c:1122 +-#, fuzzy, gcc-internal-format +-msgid "failed to reclaim unneeded function" +-msgstr "el camp \"%s\" es declara com una funció" +- +-#: cgraphunit.c:1454 +-#, gcc-internal-format +-msgid "nodes with no released memory found" +-msgstr "" +- +-#: collect2.c:1189 +-#, fuzzy, gcc-internal-format +-msgid "unknown demangling style '%s'" +-msgstr "es desconeix el mode de màquina \"%s\"" +- +-#: collect2.c:1512 +-#, gcc-internal-format +-msgid "%s terminated with signal %d [%s]%s" +-msgstr "%s acabat amb el senyal %d [%s]%s" +- +-#: collect2.c:1530 +-#, gcc-internal-format +-msgid "%s returned %d exit status" +-msgstr "%s va retornar l'estat de sortida %d" +- +-#: collect2.c:2242 +-#, fuzzy, gcc-internal-format +-msgid "cannot find 'ldd'" +-msgstr "no es troba \"ldd\"" +- +-#: convert.c:69 +-#, gcc-internal-format +-msgid "cannot convert to a pointer type" +-msgstr "no es pot convertir a un tipus punter" +- +-#: convert.c:333 +-#, gcc-internal-format +-msgid "pointer value used where a floating point value was expected" +-msgstr "es va usar un valor de punter on s'esperava un valor de coma flotant" +- +-#: convert.c:337 +-#, gcc-internal-format +-msgid "aggregate value used where a float was expected" +-msgstr "es va usar un valor agregat on s'esperava un float" +- +-#: convert.c:362 +-#, gcc-internal-format +-msgid "conversion to incomplete type" +-msgstr "conversió a tipus de dada incompleta" +- +-#: convert.c:731 convert.c:807 +-#, gcc-internal-format +-msgid "can't convert between vector values of different size" +-msgstr "no es pot convertir entre valors vectorials de grandàries diferents" +- +-#: convert.c:737 +-#, gcc-internal-format +-msgid "aggregate value used where an integer was expected" +-msgstr "es va usar un valor agregat on s'esperava un enter" +- +-#: convert.c:787 +-#, gcc-internal-format +-msgid "pointer value used where a complex was expected" +-msgstr "es va usar un valor de punter on s'esperava un complex" +- +-#: convert.c:791 +-#, gcc-internal-format +-msgid "aggregate value used where a complex was expected" +-msgstr "es va usar un valor agregat on s'esperava un complex" +- +-#: convert.c:813 +-#, gcc-internal-format +-msgid "can't convert value to a vector" +-msgstr "no es pot convertir el valor a un vector" +- +-#: convert.c:852 +-#, fuzzy, gcc-internal-format +-msgid "aggregate value used where a fixed-point was expected" +-msgstr "es va usar un valor agregat on s'esperava un float" +- +-#: coverage.c:182 +-#, fuzzy, gcc-internal-format +-msgid "%qs is not a gcov data file" +-msgstr "\"%s\" no és fitxer de dades gcov" +- +-#: coverage.c:193 +-#, fuzzy, gcc-internal-format +-msgid "%qs is version %q.*s, expected version %q.*s" +-msgstr "\"%s\" en versió \"%.4s\", s'espera la versió \"%.4s\"" +- +-#: coverage.c:273 coverage.c:281 +-#, gcc-internal-format +-msgid "coverage mismatch for function %u while reading execution counters" +-msgstr "" +- +-#: coverage.c:275 coverage.c:370 +-#, gcc-internal-format +-msgid "checksum is %x instead of %x" +-msgstr "" +- +-#: coverage.c:283 coverage.c:372 +-#, gcc-internal-format +-msgid "number of counters is %d instead of %d" +-msgstr "" +- +-#: coverage.c:289 +-#, gcc-internal-format +-msgid "cannot merge separate %s counters for function %u" +-msgstr "" +- +-#: coverage.c:310 +-#, fuzzy, gcc-internal-format +-msgid "%qs has overflowed" +-msgstr "desbordament de la pila per a \"%s\"" +- +-#: coverage.c:347 +-#, fuzzy, gcc-internal-format +-msgid "no coverage for function %qs found" +-msgstr "%s:no es troben funcions\n" +- +-#: coverage.c:361 coverage.c:364 +-#, gcc-internal-format +-msgid "coverage mismatch for function %qs while reading counter %qs" +-msgstr "" +- +-#: coverage.c:380 +-#, gcc-internal-format +-msgid "coverage mismatch ignored due to -Wcoverage-mismatch" +-msgstr "" +- +-#: coverage.c:382 +-#, gcc-internal-format +-msgid "execution counts estimated" +-msgstr "" +- +-#: coverage.c:385 +-#, gcc-internal-format +-msgid "this can result in poorly optimized code" +-msgstr "" +- +-#: coverage.c:543 +-#, gcc-internal-format +-msgid "cannot open %s" +-msgstr "no es pot obrir %s" +- +-#: coverage.c:578 +-#, fuzzy, gcc-internal-format +-msgid "error writing %qs" +-msgstr "error a l'escriure a \"%s\"" +- +-#: dbgcnt.c:127 +-#, gcc-internal-format +-msgid "Can not find a valid counter:value pair:" +-msgstr "" +- +-#: dbgcnt.c:128 +-#, gcc-internal-format +-msgid "-fdbg-cnt=%s" +-msgstr "" +- +-#: dbgcnt.c:129 +-#, fuzzy, gcc-internal-format +-msgid " %s" +-msgstr " \"%D\"" +- +-#: diagnostic.c:660 +-#, gcc-internal-format +-msgid "in %s, at %s:%d" +-msgstr "en %s, en %s:%d" +- +-#: dominance.c:983 +-#, fuzzy, gcc-internal-format +-msgid "dominator of %d status unknown" +-msgstr "el tipus de \"%E\" és desconegut" +- +-#: dominance.c:990 +-#, gcc-internal-format +-msgid "dominator of %d should be %d, not %d" +-msgstr "" +- +-#: dwarf2out.c:3634 +-#, fuzzy, gcc-internal-format +-msgid "DW_LOC_OP %s not implemented" +-msgstr "DW_LOC_OP %s no està implementat\n" +- +-#: emit-rtl.c:2326 +-#, fuzzy, gcc-internal-format +-msgid "invalid rtl sharing found in the insn" +-msgstr "operand no vàlid en la instrucció" +- +-#: emit-rtl.c:2328 +-#, gcc-internal-format +-msgid "shared rtx" +-msgstr "" +- +-#: emit-rtl.c:2330 +-#, fuzzy, gcc-internal-format +-msgid "internal consistency failure" +-msgstr "avortament intern de gcc" +- +-#: emit-rtl.c:3417 +-#, gcc-internal-format +-msgid "ICE: emit_insn used where emit_jump_insn needed:\n" +-msgstr "ICE:s'usa emit_insn on es necessita emit_jump_insn:\n" +- +-#: errors.c:132 +-#, gcc-internal-format +-msgid "abort in %s, at %s:%d" +-msgstr "abandó en %s, en %s:%d" +- +-#: except.c:337 +-#, gcc-internal-format +-msgid "exception handling disabled, use -fexceptions to enable" +-msgstr "maneig d'excepcions desactivat, usi -fexceptions per a activar" +- +-#: except.c:2889 +-#, fuzzy, gcc-internal-format +-msgid "argument of %<__builtin_eh_return_regno%> must be constant" +-msgstr "l'argument de \"__builtin_eh_return_regno\" ha de ser constant" +- +-#: except.c:3022 +-#, gcc-internal-format +-msgid "__builtin_eh_return not supported on this target" +-msgstr "no es dóna suport a _builtin_eh_return en aquest objectiu" +- +-#: except.c:3903 except.c:3912 +-#, gcc-internal-format +-msgid "region_array is corrupted for region %i" +-msgstr "" +- +-#: except.c:3917 +-#, gcc-internal-format +-msgid "outer block of region %i is wrong" +-msgstr "" +- +-#: except.c:3922 +-#, gcc-internal-format +-msgid "region %i may contain throw and is contained in region that may not" +-msgstr "" +- +-#: except.c:3928 +-#, gcc-internal-format +-msgid "negative nesting depth of region %i" +-msgstr "" +- +-#: except.c:3948 +-#, gcc-internal-format +-msgid "tree list ends on depth %i" +-msgstr "" +- +-#: except.c:3953 +-#, fuzzy, gcc-internal-format +-msgid "array does not match the region tree" +-msgstr "la conversió no coincideix amb el tipus de la funció" +- +-#: except.c:3959 +-#, fuzzy, gcc-internal-format +-msgid "verify_eh_tree failed" +-msgstr "verify_flow_info fallat" +- +-#: explow.c:1281 +-#, gcc-internal-format +-msgid "stack limits not supported on this target" +-msgstr "no es dóna suport a límits de pila en aquest objectiu" +- +-#: expr.c:8031 +-#, fuzzy +-msgid "%Kcall to %qs declared with attribute error: %s" +-msgstr "funció \"%s\" re-declarada amb l'atribut «noinline»" +- +-#: expr.c:8037 +-#, fuzzy +-msgid "%Kcall to %qs declared with attribute warning: %s" +-msgstr "funció \"%s\" re-declarada amb l'atribut «noinline»" +- +-#: final.c:1431 +-#, fuzzy, gcc-internal-format +-msgid "invalid argument %qs to -fdebug-prefix-map" +-msgstr "no vàlid argument per a l'atribut \"%s\"" +- +-#: fixed-value.c:104 +-#, fuzzy, gcc-internal-format +-msgid "large fixed-point constant implicitly truncated to fixed-point type" +-msgstr "enter gran truncat implícitament al tipus unsigned" +- +-#: fold-const.c:992 tree-ssa-loop-niter.c:1827 tree-vrp.c:5060 +-#, fuzzy, gcc-internal-format +-msgid "%H%s" +-msgstr "%s" +- +-#: fold-const.c:1363 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when negating a division" +-msgstr "" +- +-#: fold-const.c:3989 fold-const.c:4000 +-#, gcc-internal-format +-msgid "comparison is always %d due to width of bit-field" +-msgstr "la comparança sempre és %d a causa de l'amplària del camp de bit" +- +-#: fold-const.c:5317 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when simplifying range test" +-msgstr "" +- +-#: fold-const.c:5691 fold-const.c:5706 +-#, gcc-internal-format +-msgid "comparison is always %d" +-msgstr "la comparança sempre és %d" +- +-#: fold-const.c:5835 +-#, fuzzy, gcc-internal-format +-msgid "% of unmatched not-equal tests is always 1" +-msgstr "un \"or\" de proves no equivalents sense coincidència sempre és 1" +- +-#: fold-const.c:5840 +-#, fuzzy, gcc-internal-format +-msgid "% of mutually exclusive equal-tests is always 0" +-msgstr "un \"and\" de proves equivalents mútuament exclusives sempre és 0" +- +-#: fold-const.c:8617 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when reducing constant in comparison" +-msgstr "" +- +-#: fold-const.c:8871 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when combining constants around a comparison" +-msgstr "" +- +-#: fold-const.c:13236 +-#, gcc-internal-format +-msgid "fold check: original tree changed by fold" +-msgstr "" +- +-#: function.c:377 +-#, fuzzy, gcc-internal-format +-msgid "%Jtotal size of local objects too large" +-msgstr "%Jla grandària de la variable \"%D\" és massa gran" +- +-#: function.c:837 varasm.c:2095 +-#, fuzzy, gcc-internal-format +-msgid "size of variable %q+D is too large" +-msgstr "%Jla grandària de la variable \"%D\" és massa gran" +- +-#: function.c:1554 gimplify.c:4250 +-#, fuzzy, gcc-internal-format +-msgid "impossible constraint in %" +-msgstr "restricció impossible en \"asm\"" +- +-#: function.c:3538 +-#, fuzzy, gcc-internal-format +-msgid "variable %q+D might be clobbered by % or %" +-msgstr "%Jla variable \"%D\" podria ser apallissada per \"longjmp\" o \"vfork\"" +- +-#: function.c:3559 +-#, fuzzy, gcc-internal-format +-msgid "argument %q+D might be clobbered by % or %" +-msgstr "%Jl'argument \"%D\" podria ser apallissat per \"longjmp\" o \"vfork\"" +- +-#: function.c:4004 +-#, gcc-internal-format +-msgid "function returns an aggregate" +-msgstr "la funció retorna un agregat" +- +-#: function.c:4401 +-#, fuzzy, gcc-internal-format +-msgid "unused parameter %q+D" +-msgstr "%Jparàmetre \"%D\" sense ús" +- +-#: gcc.c:1286 +-#, gcc-internal-format +-msgid "ambiguous abbreviation %s" +-msgstr "abreujament ambigu %s" +- +-#: gcc.c:1313 +-#, fuzzy, gcc-internal-format +-msgid "incomplete '%s' option" +-msgstr "Opció \"%s\" incompleta" +- +-#: gcc.c:1324 +-#, fuzzy, gcc-internal-format +-msgid "missing argument to '%s' option" +-msgstr "Falten arguments per a l'opció \"%s\"" +- +-#: gcc.c:1337 +-#, fuzzy, gcc-internal-format +-msgid "extraneous argument to '%s' option" +-msgstr "argument estrany per a l'opció \"%s\"" +- +-#: gcc.c:3987 +-#, gcc-internal-format +-msgid "warning: -pipe ignored because -save-temps specified" +-msgstr "Avís: s'ignora -pipe perquè es va especificar -save-temps" +- +-#: gcc.c:4276 +-#, fuzzy, gcc-internal-format +-msgid "warning: '-x %s' after last input file has no effect" +-msgstr "avís: \"-x %s\" després de l'últim fitxer d'entrada no té efecte" +- +-#. Catch the case where a spec string contains something like +-#. '%{foo:%*}'. i.e. there is no * in the pattern on the left +-#. hand side of the :. +-#: gcc.c:5314 +-#, gcc-internal-format +-msgid "spec failure: '%%*' has not been initialized by pattern match" +-msgstr "Falla en spec: \"%%*\" no ha estat iniciat per coincidència de patró" +- +-#: gcc.c:5323 +-#, gcc-internal-format +-msgid "warning: use of obsolete %%[ operator in specs" +-msgstr "Avís: ús de l'operador obsolet %%[ en specs" +- +-#: gcc.c:5404 +-#, gcc-internal-format +-msgid "spec failure: unrecognized spec option '%c'" +-msgstr "Falla en spec: Opció d'especificació \"%c\" no reconeguda" +- +-#: gcc.c:6305 +-#, gcc-internal-format +-msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC" +-msgstr "" +- +-#: gcc.c:6328 +-#, gcc-internal-format +-msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC" +-msgstr "" +- +-#: gcc.c:6415 +-#, fuzzy, gcc-internal-format +-msgid "unrecognized option '-%s'" +-msgstr "opció \"-%s\" no reconeguda" +- +-#: gcc.c:6615 gcc.c:6678 +-#, gcc-internal-format +-msgid "%s: %s compiler not installed on this system" +-msgstr "%s: el compilador %s no està instal·lat en aquest sistema" +- +-#: gcc.c:6778 +-#, gcc-internal-format +-msgid "%s: linker input file unused because linking not done" +-msgstr "%s: fitxer d'entrada de l'enllaçador sense ùs perquè no es va fer enllaç" +- +-#: gcc.c:6818 +-#, gcc-internal-format +-msgid "language %s not recognized" +-msgstr "no es reconeix el llenguatge %s" +- +-#: gcc.c:6889 +-#, gcc-internal-format +-msgid "%s: %s" +-msgstr "%s: %s" +- +-#: gcse.c:6660 +-#, fuzzy, gcc-internal-format +-msgid "%s: %d basic blocks and %d edges/basic block" +-msgstr "GCSE desactivat: %d > 1000 blocs bàsics i %d >= 20 blocs bord/bàsics" +- +-#: gcse.c:6673 +-#, fuzzy, gcc-internal-format +-msgid "%s: %d basic blocks and %d registers" +-msgstr "GCSE desactivat: %d blocs bàsics i %d registres" +- +-#: ggc-common.c:403 ggc-common.c:411 ggc-common.c:479 ggc-common.c:498 +-#: ggc-page.c:2138 ggc-page.c:2169 ggc-page.c:2176 ggc-zone.c:2290 +-#: ggc-zone.c:2305 +-#, gcc-internal-format +-msgid "can't write PCH file: %m" +-msgstr "no es pot escriure el fitxer PCH: %m" +- +-#: ggc-common.c:491 config/i386/host-cygwin.c:57 +-#, fuzzy, gcc-internal-format +-msgid "can't get position in PCH file: %m" +-msgstr "no es pot crear el fitxer d'informació de \"repository\" \"%s\"" +- +-#: ggc-common.c:501 +-#, fuzzy, gcc-internal-format +-msgid "can't write padding to PCH file: %m" +-msgstr "no es pot escriure al fitxer de sortida" +- +-#: ggc-common.c:556 ggc-common.c:564 ggc-common.c:571 ggc-common.c:574 +-#: ggc-common.c:584 ggc-common.c:587 ggc-page.c:2266 ggc-zone.c:2324 +-#, gcc-internal-format +-msgid "can't read PCH file: %m" +-msgstr "no es pot llegir el fitxer PCH: %m" +- +-#: ggc-common.c:579 +-#, gcc-internal-format +-msgid "had to relocate PCH" +-msgstr "" +- +-#: ggc-page.c:1471 +-#, gcc-internal-format +-msgid "open /dev/zero: %m" +-msgstr "open /dev/zero: %m" +- +-#: ggc-page.c:2154 ggc-page.c:2160 +-#, gcc-internal-format +-msgid "can't write PCH file" +-msgstr "no es pot escriure el fitxer PCH" +- +-#: ggc-zone.c:2287 ggc-zone.c:2298 +-#, fuzzy, gcc-internal-format +-msgid "can't seek PCH file: %m" +-msgstr "no es pot llegir el fitxer PCH: %m" +- +-#: ggc-zone.c:2301 +-#, fuzzy, gcc-internal-format +-msgid "can't write PCH fle: %m" +-msgstr "no es pot escriure el fitxer PCH: %m" +- +-#: gimplify.c:4139 +-#, fuzzy, gcc-internal-format +-msgid "invalid lvalue in asm output %d" +-msgstr "lvalue no vàlid en declaració asm" +- +-#: gimplify.c:4251 +-#, gcc-internal-format +-msgid "non-memory input %d must stay in memory" +-msgstr "" +- +-#: gimplify.c:4264 +-#, fuzzy, gcc-internal-format +-msgid "memory input %d is not directly addressable" +-msgstr "el nombre de sortida %d no és directament adreçable" +- +-#: gimplify.c:4743 +-#, gcc-internal-format +-msgid "%qs not specified in enclosing parallel" +-msgstr "" +- +-#: gimplify.c:4745 +-#, gcc-internal-format +-msgid "%Henclosing parallel" +-msgstr "" +- +-#: gimplify.c:4799 +-#, gcc-internal-format +-msgid "iteration variable %qs should be private" +-msgstr "" +- +-#: gimplify.c:4813 +-#, gcc-internal-format +-msgid "iteration variable %qs should not be firstprivate" +-msgstr "" +- +-#: gimplify.c:4816 +-#, fuzzy, gcc-internal-format +-msgid "iteration variable %qs should not be reduction" +-msgstr "es va usar la va variable \"%s\" en funcions niades" +- +-#: gimplify.c:4940 +-#, fuzzy, gcc-internal-format +-msgid "%s variable %qs is private in outer context" +-msgstr "\"%D\" no es va declarar en aquest àmbit" +- +-#: gimplify.c:6108 +-#, gcc-internal-format +-msgid "gimplification failed" +-msgstr "" +- +-#: global.c:284 global.c:297 global.c:311 +-#, fuzzy, gcc-internal-format +-msgid "%s cannot be used in asm here" +-msgstr "no es pot usar %s en ensamblador aquí" +- +-#: graph.c:401 java/jcf-parse.c:1757 java/jcf-parse.c:1897 objc/objc-act.c:500 +-#, fuzzy, gcc-internal-format +-msgid "can't open %s: %m" +-msgstr "no es pot obrir %s" +- +-#: haifa-sched.c:184 +-#, gcc-internal-format +-msgid "fix_sched_param: unknown param: %s" +-msgstr "fix_sched_param: paràmetre desconegut: %s" +- +-#: omp-low.c:1288 +-#, gcc-internal-format +-msgid "work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region" +-msgstr "" +- +-#: omp-low.c:1304 +-#, gcc-internal-format +-msgid "master region may not be closely nested inside of work-sharing region" +-msgstr "" +- +-#: omp-low.c:1318 +-#, gcc-internal-format +-msgid "ordered region may not be closely nested inside of critical region" +-msgstr "" +- +-#: omp-low.c:1324 +-#, gcc-internal-format +-msgid "ordered region must be closely nested inside a loop region with an ordered clause" +-msgstr "" +- +-#: omp-low.c:1338 +-#, gcc-internal-format +-msgid "critical region may not be nested inside a critical region with the same name" +-msgstr "" +- +-#: omp-low.c:5050 cp/decl.c:2660 cp/parser.c:7417 cp/parser.c:7437 +-#, gcc-internal-format +-msgid "invalid exit from OpenMP structured block" +-msgstr "" +- +-#: omp-low.c:5052 +-#, gcc-internal-format +-msgid "invalid entry to OpenMP structured block" +-msgstr "" +- +-#: opts.c:173 +-#, gcc-internal-format +-msgid "argument %qs to %<-femit-struct-debug-detailed%> not recognized" +-msgstr "" +- +-#: opts.c:207 +-#, gcc-internal-format +-msgid "argument %qs to %<-femit-struct-debug-detailed%> unknown" +-msgstr "" +- +-#: opts.c:213 +-#, gcc-internal-format +-msgid "%<-femit-struct-debug-detailed=dir:...%> must allow at least as much as %<-femit-struct-debug-detailed=ind:...%>" +-msgstr "" +- +-#. Eventually this should become a hard error IMO. +-#: opts.c:438 +-#, gcc-internal-format +-msgid "command line option \"%s\" is valid for %s but not for %s" +-msgstr "l'opció de línia d'ordres \"%s\" és vàlida per a %s però no per a %s" +- +-#: opts.c:492 +-#, fuzzy, gcc-internal-format +-msgid "command line option %qs is not supported by this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: opts.c:545 +-#, gcc-internal-format +-msgid "missing argument to \"%s\"" +-msgstr "falten arguments per a \"%s\"" +- +-#: opts.c:555 +-#, gcc-internal-format +-msgid "argument to \"%s\" should be a non-negative integer" +-msgstr "l'argument per a \"%s\" ha de ser un enter non negatiu" +- +-#: opts.c:728 +-#, gcc-internal-format +-msgid "unrecognized command line option \"%s\"" +-msgstr "opció de línia d'ordres \"%s\" desconeguda" +- +-#: opts.c:947 +-#, gcc-internal-format +-msgid "-Wuninitialized is not supported without -O" +-msgstr "no es dóna suport a -Wuninitialized sense -O" +- +-#: opts.c:962 +-#, gcc-internal-format +-msgid "-freorder-blocks-and-partition does not work with exceptions" +-msgstr "" +- +-#: opts.c:973 +-#, gcc-internal-format +-msgid "-freorder-blocks-and-partition does not support unwind info" +-msgstr "" +- +-#: opts.c:987 +-#, gcc-internal-format +-msgid "-freorder-blocks-and-partition does not work on this architecture" +-msgstr "" +- +-#: opts.c:1263 +-#, gcc-internal-format +-msgid "unrecognized include_flags 0x%x passed to print_specific_help" +-msgstr "" +- +-#: opts.c:1593 +-#, fuzzy, gcc-internal-format +-msgid "structure alignment must be a small power of two, not %d" +-msgstr "l'alineació ha de ser una potència petita de dos, no %d" +- +-#: opts.c:1656 +-#, fuzzy, gcc-internal-format +-msgid "unrecognized visibility value \"%s\"" +-msgstr "no es reconeix el nom de registre \"%s\"" +- +-#: opts.c:1704 +-#, gcc-internal-format +-msgid "unrecognized register name \"%s\"" +-msgstr "no es reconeix el nom de registre \"%s\"" +- +-#: opts.c:1728 +-#, gcc-internal-format +-msgid "unknown tls-model \"%s\"" +-msgstr "tls-model \"%s\" desconegut" +- +-#: opts.c:1803 +-#, gcc-internal-format +-msgid "%s: --param arguments should be of the form NAME=VALUE" +-msgstr "" +- +-#: opts.c:1808 +-#, fuzzy, gcc-internal-format +-msgid "invalid --param value %qs" +-msgstr "valor de --param \"%s\" no vàlid" +- +-#: opts.c:1931 +-#, gcc-internal-format +-msgid "target system does not support debug output" +-msgstr "el sistema objectiu no té suport per a sortides de depuració" +- +-#: opts.c:1938 +-#, gcc-internal-format +-msgid "debug format \"%s\" conflicts with prior selection" +-msgstr "format de depuració \"%s\" en conflicte amb una selecció prèvia" +- +-#: opts.c:1954 +-#, gcc-internal-format +-msgid "unrecognised debug output level \"%s\"" +-msgstr "no es reconeix el nivell de sortida de depuració \"%s\"" +- +-#: opts.c:1956 +-#, gcc-internal-format +-msgid "debug output level %s is too high" +-msgstr "el nivell de sortida de depuració %s és massa alt" +- +-#: opts.c:2038 +-#, gcc-internal-format +-msgid "-Werror=%s: No option -%s" +-msgstr "" +- +-#: params.c:68 +-#, fuzzy, gcc-internal-format +-msgid "minimum value of parameter %qs is %u" +-msgstr "el paràmetre \"%s\" no és vàlid" +- +-#: params.c:73 +-#, gcc-internal-format +-msgid "maximum value of parameter %qs is %u" +-msgstr "" +- +-#. If we didn't find this parameter, issue an error message. +-#: params.c:85 +-#, fuzzy, gcc-internal-format +-msgid "invalid parameter %qs" +-msgstr "el paràmetre \"%s\" no és vàlid" +- +-#: profile.c:304 +-#, gcc-internal-format +-msgid "corrupted profile info: run_max * runs < sum_max" +-msgstr "" +- +-#: profile.c:310 +-#, gcc-internal-format +-msgid "corrupted profile info: sum_all is smaller than sum_max" +-msgstr "" +- +-#: profile.c:355 +-#, gcc-internal-format +-msgid "corrupted profile info: edge from %i to %i exceeds maximal count" +-msgstr "informació de perfil corrupta: el tall des de %i fins a %i excedeix el compte màxim" +- +-#: profile.c:519 +-#, gcc-internal-format +-msgid "corrupted profile info: number of iterations for basic block %d thought to be %i" +-msgstr "informació de perfil corrupta: el nombre d'iteracions pel bloc bàsica %d hauria de ser %i" +- +-#: profile.c:540 +-#, gcc-internal-format +-msgid "corrupted profile info: number of executions for edge %d-%d thought to be %i" +-msgstr "informació de perfil corrupta: el nombre d'execicions pel tall %d-%d hauria de ser %i" +- +-#: reg-stack.c:538 +-#, gcc-internal-format +-msgid "output constraint %d must specify a single register" +-msgstr "la restricció de sortida %d s'ha d'especificar un sol registre" +- +-#: reg-stack.c:548 +-#, gcc-internal-format +-msgid "output constraint %d cannot be specified together with \"%s\" clobber" +-msgstr "la restricció de sortida %d no es pot especificar amb el clobber \"%s\"" +- +-#: reg-stack.c:571 +-#, gcc-internal-format +-msgid "output regs must be grouped at top of stack" +-msgstr "els registres de sortida deuen ser agrupats en la part superior de la pila" +- +-#: reg-stack.c:608 +-#, gcc-internal-format +-msgid "implicitly popped regs must be grouped at top of stack" +-msgstr "els registres extrets implícitament deuen ser agrupats en la part superior de la pila" +- +-#: reg-stack.c:627 +-#, fuzzy, gcc-internal-format +-msgid "output operand %d must use %<&%> constraint" +-msgstr "l'operand de sortida %d ha d'usar la restricció \"&\"" +- +-#: regclass.c:875 +-#, gcc-internal-format +-msgid "can't use '%s' as a %s register" +-msgstr "no es pot usar \"%s\" com un registre %s" +- +-#: regclass.c:890 config/ia64/ia64.c:5138 config/ia64/ia64.c:5145 +-#: config/pa/pa.c:359 config/pa/pa.c:366 config/spu/spu.c:3886 +-#: config/spu/spu.c:3893 +-#, gcc-internal-format +-msgid "unknown register name: %s" +-msgstr "nom de registre desconegut: %s" +- +-#: regclass.c:900 +-#, gcc-internal-format +-msgid "global register variable follows a function definition" +-msgstr "la variable de registre global segueix a una definició de funció" +- +-#: regclass.c:904 +-#, gcc-internal-format +-msgid "register used for two global register variables" +-msgstr "nom de registre usat per dues variables de registre globals" +- +-#: regclass.c:909 +-#, gcc-internal-format +-msgid "call-clobbered register used for global register variable" +-msgstr "registre de cridada alterada usat per a una variable de registre global" +- +-#: regrename.c:1893 +-#, gcc-internal-format +-msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" +-msgstr "validate_value_data: [%u] next_regno erroni per a la cadena buida (%u)" +- +-#: regrename.c:1905 +-#, gcc-internal-format +-msgid "validate_value_data: Loop in regno chain (%u)" +-msgstr "validate_value_data: Cicle en la cadena regno (%u)" +- +-#: regrename.c:1908 +-#, gcc-internal-format +-msgid "validate_value_data: [%u] Bad oldest_regno (%u)" +-msgstr "validate_value_data: [%u] oldest_regno erroni (%u)" +- +-#: regrename.c:1920 +-#, gcc-internal-format +-msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" +-msgstr "validate_value_data: [%u] Registre no buit en la cadena (%s %u %i)" +- +-#: reload.c:1252 +-#, fuzzy, gcc-internal-format +-msgid "cannot reload integer constant operand in %" +-msgstr "no es pot recarregar un operador constant enter en \"asm\"" +- +-#: reload.c:1266 +-#, fuzzy, gcc-internal-format +-msgid "impossible register constraint in %" +-msgstr "restricció de registres impossible en \"asm\"" +- +-#: reload.c:3564 +-#, fuzzy, gcc-internal-format +-msgid "%<&%> constraint used with no register class" +-msgstr "es va usar la restricció \"&\" sense classe de registre" +- +-#: reload.c:3735 reload.c:3975 +-#, fuzzy, gcc-internal-format +-msgid "inconsistent operand constraints in an %" +-msgstr "restriccions d'operand inconsistents en un \"asm\"" +- +-#: reload1.c:1301 +-#, fuzzy, gcc-internal-format +-msgid "% operand has impossible constraints" +-msgstr "l'operand asm %d probablement no coincideix amb les restriccions" +- +-#: reload1.c:1321 +-#, gcc-internal-format +-msgid "frame size too large for reliable stack checking" +-msgstr "la grandària del marc és massa gran per a una revisió fiable de la pila" +- +-#: reload1.c:1324 +-#, gcc-internal-format +-msgid "try reducing the number of local variables" +-msgstr "intenti reduir el nombre de variables locals" +- +-#: reload1.c:1987 +-#, fuzzy, gcc-internal-format +-msgid "can't find a register in class %qs while reloading %" +-msgstr "no es pot trobar un registre en la classe \"%s\" mentre es recarrega \"asm\"." +- +-#: reload1.c:1992 +-#, fuzzy, gcc-internal-format +-msgid "unable to find a register to spill in class %qs" +-msgstr "no es pot trobar un registre per a buidar la classe \"%s\"." +- +-#: reload1.c:4160 +-#, fuzzy, gcc-internal-format +-msgid "% operand requires impossible reload" +-msgstr "l'operand \"asm\" requereix una recarrega impossible" +- +-#: reload1.c:5368 +-#, fuzzy, gcc-internal-format +-msgid "% operand constraint incompatible with operand size" +-msgstr "la restricció de l'operand \"asm\" és incompatible amb la grandària de l'operand" +- +-#: reload1.c:7039 +-#, fuzzy, gcc-internal-format +-msgid "output operand is constant in %" +-msgstr "l'operand de sortida és constant en \"asm\"" +- +-#: rtl.c:484 +-#, fuzzy, gcc-internal-format +-msgid "RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d" +-msgstr "revisió RTL: accés de elt %d de \"%s\" amb l'últim elt %d en %s, en %s:%d" +- +-#: rtl.c:494 +-#, gcc-internal-format +-msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" +-msgstr "revisió RTL: s'esperava el tipus elt %d \"%c\", es té \"%c\" (rtx %s) en %s, en %s:%d" +- +-#: rtl.c:504 +-#, gcc-internal-format +-msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" +-msgstr "revisió RTL: s'esperava el tipus elt %d \"%c\" o \"%c\", es té \"%c\" (rtx %s) en %s, en %s:%d" +- +-#: rtl.c:513 +-#, fuzzy, gcc-internal-format +-msgid "RTL check: expected code '%s', have '%s' in %s, at %s:%d" +-msgstr "Revisió RTL: s'esperava el codi \"%s\", es té \"%s\" en %s, en %s:%d" +- +-#: rtl.c:523 +-#, fuzzy, gcc-internal-format +-msgid "RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d" +-msgstr "Revisió RTL: s'esperava el codi \"%s\" o \"%s\", es té \"%s\" en %s, en %s:%d" +- +-#: rtl.c:550 +-#, fuzzy, gcc-internal-format +-msgid "RTL check: attempt to treat non-block symbol as a block symbol in %s, at %s:%d" +-msgstr "revisió RTL: accés de elt %d de \"%s\" amb l'últim elt %d en %s, en %s:%d" +- +-#: rtl.c:560 +-#, gcc-internal-format +-msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" +-msgstr "Revisió RTL: accés de elt %d de vector amb l'últim elt %d en %s, en %s:%d" +- +-#: rtl.c:571 +-#, fuzzy, gcc-internal-format +-msgid "RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d" +-msgstr "Revisió RTL: es va usar %s amb el codi rtx inesperat \"%s\" en %s, en %s:%d" +- +-#: stmt.c:317 +-#, fuzzy, gcc-internal-format +-msgid "output operand constraint lacks %<=%>" +-msgstr "la restricció d'operand de sortida manca de \"=\"" +- +-#: stmt.c:332 +-#, fuzzy, gcc-internal-format +-msgid "output constraint %qc for operand %d is not at the beginning" +-msgstr "la restricció de sortida \"%c\" per a l'operand %d no està al principi" +- +-#: stmt.c:355 +-#, fuzzy, gcc-internal-format +-msgid "operand constraint contains incorrectly positioned %<+%> or %<=%>" +-msgstr "la restricció d'operand conté \"+\" o \"=\" mal posicionat" +- +-#: stmt.c:362 stmt.c:461 +-#, fuzzy, gcc-internal-format +-msgid "%<%%%> constraint used with last operand" +-msgstr "restricció \"%%\" utilitzada amb l'últim operand" +- +-#: stmt.c:381 +-#, gcc-internal-format +-msgid "matching constraint not valid in output operand" +-msgstr "la restricció coincident no és vàlida en l'operand de sortida" +- +-#: stmt.c:452 +-#, fuzzy, gcc-internal-format +-msgid "input operand constraint contains %qc" +-msgstr "la restricció d'operand d'entrada conté \"%c\"" +- +-#: stmt.c:494 +-#, gcc-internal-format +-msgid "matching constraint references invalid operand number" +-msgstr "la restricció de coincidència fa referència a un nombre d'operand no vàlid" +- +-#: stmt.c:532 +-#, fuzzy, gcc-internal-format +-msgid "invalid punctuation %qc in constraint" +-msgstr "puntuació no vàlida \"%c\" en la restricció" +- +-#: stmt.c:556 +-#, fuzzy, gcc-internal-format +-msgid "matching constraint does not allow a register" +-msgstr "la restricció coincident no és vàlida en l'operand de sortida" +- +-#: stmt.c:610 +-#, fuzzy, gcc-internal-format +-msgid "asm-specifier for variable %qs conflicts with asm clobber list" +-msgstr "els qualificadors asm per a la variable \"%s\" generen conflicte amb la lista d'agrupació asm" +- +-#: stmt.c:702 +-#, fuzzy, gcc-internal-format +-msgid "unknown register name %qs in %" +-msgstr "nom de registre \"%s\" desconegut en \"asm\"" +- +-#: stmt.c:710 +-#, fuzzy, gcc-internal-format +-msgid "PIC register %qs clobbered in %" +-msgstr "nom de registre desconegut \"%s\" en \"asm\"" +- +-#: stmt.c:757 +-#, fuzzy, gcc-internal-format +-msgid "more than %d operands in %" +-msgstr "no més de %d operands en \"asm\"" +- +-#: stmt.c:820 +-#, gcc-internal-format +-msgid "output number %d not directly addressable" +-msgstr "el nombre de sortida %d no és directament adreçable" +- +-#: stmt.c:903 +-#, fuzzy, gcc-internal-format +-msgid "asm operand %d probably doesn%'t match constraints" +-msgstr "l'operand asm %d probablement no coincideix amb les restriccions" +- +-#: stmt.c:913 +-#, gcc-internal-format +-msgid "use of memory input without lvalue in asm operand %d is deprecated" +-msgstr "" +- +-#: stmt.c:1060 +-#, gcc-internal-format +-msgid "asm clobber conflict with output operand" +-msgstr "l'agrupació asm causa conflictes amb l'operand de sortida" +- +-#: stmt.c:1065 +-#, gcc-internal-format +-msgid "asm clobber conflict with input operand" +-msgstr "l'agrupació asm causa conflictes amb l'operand d'entrada" +- +-#: stmt.c:1143 +-#, fuzzy, gcc-internal-format +-msgid "too many alternatives in %" +-msgstr "massa alternatives en \"asm\"" +- +-#: stmt.c:1155 +-#, fuzzy, gcc-internal-format +-msgid "operand constraints for % differ in number of alternatives" +-msgstr "les restriccions d'operands per a \"asm\" difereixen en el nombre d'alternatives" +- +-#: stmt.c:1208 +-#, fuzzy, gcc-internal-format +-msgid "duplicate asm operand name %qs" +-msgstr "nom d'operand asm \"%s\" duplicat" +- +-#: stmt.c:1306 +-#, gcc-internal-format +-msgid "missing close brace for named operand" +-msgstr "falta la clau final per a l'operand nomenat" +- +-#: stmt.c:1334 +-#, fuzzy, gcc-internal-format +-msgid "undefined named operand %qs" +-msgstr "operand nomenat no definit \"%s\"" +- +-#: stmt.c:1482 +-#, fuzzy, gcc-internal-format +-msgid "%Hvalue computed is not used" +-msgstr "l'autòmat \"%s\" no s'utilitza" +- +-#: stor-layout.c:149 +-#, fuzzy, gcc-internal-format +-msgid "type size can%'t be explicitly evaluated" +-msgstr "la grandària del tipus no pot ser avaluat explícitament" +- +-#: stor-layout.c:151 +-#, gcc-internal-format +-msgid "variable-size type declared outside of any function" +-msgstr "tipus de grandària variable declarat fora de qualsevol funció" +- +-#: stor-layout.c:467 +-#, fuzzy, gcc-internal-format +-msgid "size of %q+D is %d bytes" +-msgstr "la grandària de \"%s\" és de %d octets" +- +-#: stor-layout.c:469 +-#, fuzzy, gcc-internal-format +-msgid "size of %q+D is larger than %wd bytes" +-msgstr "la grandària de \"%s\" és major que %d octets" +- +-#: stor-layout.c:899 +-#, fuzzy, gcc-internal-format +-msgid "packed attribute causes inefficient alignment for %q+D" +-msgstr "l'atribut packed causa una alineació ineficient per a \"%s\"" +- +-#: stor-layout.c:902 +-#, fuzzy, gcc-internal-format +-msgid "packed attribute is unnecessary for %q+D" +-msgstr "no és necessari l'atribut packed per a \"%s\"" +- +-#. No, we need to skip space before this field. +-#. Bump the cumulative size to multiple of field alignment. +-#: stor-layout.c:919 +-#, fuzzy, gcc-internal-format +-msgid "padding struct to align %q+D" +-msgstr "estructura de farcit per a alinear \"%s\"" +- +-#: stor-layout.c:1270 +-#, gcc-internal-format +-msgid "padding struct size to alignment boundary" +-msgstr "grandària de l'estructura de farcit pels límits d'alineació" +- +-#: stor-layout.c:1300 +-#, fuzzy, gcc-internal-format +-msgid "packed attribute causes inefficient alignment for %qs" +-msgstr "l'atribut packed causa una alineació ineficient per a \"%s\"" +- +-#: stor-layout.c:1304 +-#, fuzzy, gcc-internal-format +-msgid "packed attribute is unnecessary for %qs" +-msgstr "no és necessari l'atribut packed per a \"%s\"" +- +-#: stor-layout.c:1310 +-#, gcc-internal-format +-msgid "packed attribute causes inefficient alignment" +-msgstr "l'atribut packed causa una alineació ineficient" +- +-#: stor-layout.c:1312 +-#, gcc-internal-format +-msgid "packed attribute is unnecessary" +-msgstr "no és necessari l'atribut packed" +- +-#: stor-layout.c:1842 +-#, fuzzy, gcc-internal-format +-msgid "alignment of array elements is greater than element size" +-msgstr "l'alineació de \"%s\" és massa granda que l'alineació màxima del fitxer objecte. S'usa %d." +- +-#: targhooks.c:120 +-#, gcc-internal-format +-msgid "__builtin_saveregs not supported by this target" +-msgstr "no es dóna suport a _builtin_saveregs en aquest objectiu" +- +-#: tlink.c:483 +-#, gcc-internal-format +-msgid "repository file '%s' does not contain command-line arguments" +-msgstr "" +- +-#: tlink.c:728 +-#, gcc-internal-format +-msgid "'%s' was assigned to '%s', but was not defined during recompilation, or vice versa" +-msgstr "" +- +-#: tlink.c:798 +-#, gcc-internal-format +-msgid "ld returned %d exit status" +-msgstr "ld va retornar l'estat de sortida %d" +- +-#: toplev.c:528 +-#, fuzzy, gcc-internal-format +-msgid "invalid option argument %qs" +-msgstr "opció \"%s\" no vàlida" +- +-#: toplev.c:626 +-#, gcc-internal-format +-msgid "getting core file size maximum limit: %m" +-msgstr "" +- +-#: toplev.c:629 +-#, gcc-internal-format +-msgid "setting core file size limit to maximum: %m" +-msgstr "" +- +-#: toplev.c:849 +-#, fuzzy, gcc-internal-format +-msgid "%q+F declared % but never defined" +-msgstr "\"%s\" declarat \"static\" però mai definit" +- +-#: toplev.c:877 +-#, fuzzy, gcc-internal-format +-msgid "%q+D defined but not used" +-msgstr "\"%s\" definit però no utilitzat" +- +-#: toplev.c:920 +-#, fuzzy, gcc-internal-format +-msgid "%qD is deprecated (declared at %s:%d)" +-msgstr "\"%s\" és depreciat (declarat a %s:%d)" +- +-#: toplev.c:943 +-#, fuzzy, gcc-internal-format +-msgid "%qs is deprecated (declared at %s:%d)" +-msgstr "\"%s\" és depreciat (declarat a %s:%d)" +- +-#: toplev.c:947 +-#, gcc-internal-format +-msgid "type is deprecated (declared at %s:%d)" +-msgstr "type és depreciat (declarat a %s:%d)" +- +-#: toplev.c:953 +-#, fuzzy, gcc-internal-format +-msgid "%qs is deprecated" +-msgstr "\"%s\" és depreciat" +- +-#: toplev.c:955 +-#, gcc-internal-format +-msgid "type is deprecated" +-msgstr "type és depreciat" +- +-#: toplev.c:975 toplev.c:1002 +-#, gcc-internal-format +-msgid "GCC supports only %d input file changes" +-msgstr "" +- +-#: toplev.c:1160 +-#, gcc-internal-format +-msgid "unrecognized gcc debugging option: %c" +-msgstr "opció de depuració de gcc no reconeguda: %c" +- +-#: toplev.c:1411 +-#, fuzzy, gcc-internal-format +-msgid "can%'t open %s for writing: %m" +-msgstr "no es pot obrir %s per a escriptura" +- +-#: toplev.c:1432 +-#, fuzzy, gcc-internal-format +-msgid "-frecord-gcc-switches is not supported by the current target" +-msgstr "no es dóna suport a -fdata-sections en aquest objectiu" +- +-#: toplev.c:1745 +-#, fuzzy, gcc-internal-format +-msgid "this target does not support %qs" +-msgstr "%s no té suport per a %s" +- +-#: toplev.c:1794 +-#, gcc-internal-format +-msgid "instruction scheduling not supported on this target machine" +-msgstr "no es dóna suport a la planificació d'instruccions en aquest objectiu" +- +-#: toplev.c:1798 +-#, gcc-internal-format +-msgid "this target machine does not have delayed branches" +-msgstr "aquesta màquina objectiu no té ramificacions alentides" +- +-#: toplev.c:1812 +-#, gcc-internal-format +-msgid "-f%sleading-underscore not supported on this target machine" +-msgstr "no es dóna suport a -f%sleading-underscore en aquest objectiu" +- +-#: toplev.c:1885 +-#, fuzzy, gcc-internal-format +-msgid "target system does not support the \"%s\" debug format" +-msgstr "%s no té suport per al format \"%%%s%c\" %s" +- +-#: toplev.c:1898 +-#, gcc-internal-format +-msgid "variable tracking requested, but useless unless producing debug info" +-msgstr "" +- +-#: toplev.c:1901 +-#, fuzzy, gcc-internal-format +-msgid "variable tracking requested, but not supported by this debug format" +-msgstr "%s no té suport per al format \"%%%s%c\" %s" +- +-#: toplev.c:1935 +-#, fuzzy, gcc-internal-format +-msgid "can%'t open %s: %m" +-msgstr "no es pot obrir %s" +- +-#: toplev.c:1942 +-#, gcc-internal-format +-msgid "-ffunction-sections not supported for this target" +-msgstr "no es dóna suport a -ffunction-sections en aquest objectiu" +- +-#: toplev.c:1947 +-#, gcc-internal-format +-msgid "-fdata-sections not supported for this target" +-msgstr "no es dóna suport a -fdata-sections en aquest objectiu" +- +-#: toplev.c:1954 +-#, gcc-internal-format +-msgid "-ffunction-sections disabled; it makes profiling impossible" +-msgstr "-ffunction-sections desactivat; fa impossible l'anàlisi de perfil" +- +-#: toplev.c:1961 +-#, gcc-internal-format +-msgid "-fprefetch-loop-arrays not supported for this target" +-msgstr "no es dóna suport a -fprefetch-loop-arrays en aquest objectiu" +- +-#: toplev.c:1967 +-#, gcc-internal-format +-msgid "-fprefetch-loop-arrays not supported for this target (try -march switches)" +-msgstr "no es dóna suport a -fprefetch-loop-arrays en aquest objectiu (prova opcions -march)" +- +-#: toplev.c:1976 +-#, gcc-internal-format +-msgid "-fprefetch-loop-arrays is not supported with -Os" +-msgstr "no es dóna suport a -fprefetch-loop-arrays amb -Os" +- +-#: toplev.c:1983 +-#, gcc-internal-format +-msgid "-ffunction-sections may affect debugging on some targets" +-msgstr "-ffunction-sections podria afectar la depuració en alguns objectius" +- +-#: toplev.c:1999 +-#, fuzzy, gcc-internal-format +-msgid "-fstack-protector not supported for this target" +-msgstr "no es dóna suport a -fdata-sections en aquest objectiu" +- +-#: toplev.c:2012 +-#, gcc-internal-format +-msgid "unwind tables currently requires a frame pointer for correctness" +-msgstr "" +- +-#: toplev.c:2198 +-#, fuzzy, gcc-internal-format +-msgid "error writing to %s: %m" +-msgstr "error a l'escriure a %s" +- +-#: toplev.c:2200 java/jcf-parse.c:1776 +-#, fuzzy, gcc-internal-format +-msgid "error closing %s: %m" +-msgstr "error al tancar %s" +- +-#: tree-cfg.c:1432 tree-cfg.c:2068 tree-cfg.c:2071 +-#, fuzzy, gcc-internal-format +-msgid "%Hwill never be executed" +-msgstr "la cridada %2d mai s'executa\n" +- +-#: tree-cfg.c:3134 +-#, gcc-internal-format +-msgid "SSA name in freelist but still referenced" +-msgstr "" +- +-#: tree-cfg.c:3143 +-#, gcc-internal-format +-msgid "ASSERT_EXPR with an always-false condition" +-msgstr "" +- +-#: tree-cfg.c:3156 +-#, gcc-internal-format +-msgid "GIMPLE register modified with BIT_FIELD_REF" +-msgstr "" +- +-#: tree-cfg.c:3191 +-#, gcc-internal-format +-msgid "invariant not recomputed when ADDR_EXPR changed" +-msgstr "" +- +-#: tree-cfg.c:3197 +-#, gcc-internal-format +-msgid "constant not recomputed when ADDR_EXPR changed" +-msgstr "" +- +-#: tree-cfg.c:3202 +-#, gcc-internal-format +-msgid "side effects not recomputed when ADDR_EXPR changed" +-msgstr "" +- +-#: tree-cfg.c:3218 +-#, gcc-internal-format +-msgid "address taken, but ADDRESSABLE bit not set" +-msgstr "" +- +-#: tree-cfg.c:3228 +-#, gcc-internal-format +-msgid "non-integral used in condition" +-msgstr "" +- +-#: tree-cfg.c:3233 +-#, fuzzy, gcc-internal-format +-msgid "invalid conditional operand" +-msgstr "restriccions no vàlides per a l'operand" +- +-#: tree-cfg.c:3285 +-#, fuzzy, gcc-internal-format +-msgid "invalid reference prefix" +-msgstr "membre referència \"%D\" sense inicialitzar" +- +-#: tree-cfg.c:3296 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand to plus/minus, type is a pointer" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3307 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand to pointer plus, first operand is not a pointer" +-msgstr "l'operand base de \"->\" no és un punter" +- +-#: tree-cfg.c:3315 +-#, gcc-internal-format +-msgid "invalid operand to pointer plus, second operand is not an integer with type of sizetype." +-msgstr "" +- +-#: tree-cfg.c:3382 tree-cfg.c:3798 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in unary expression" +-msgstr "operadors no vàlids per al binari %s" +- +-#: tree-cfg.c:3392 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in unary expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3413 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in binary expression" +-msgstr "operadors no vàlids per al binari %s" +- +-#: tree-cfg.c:3424 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in binary expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3449 +-#, fuzzy, gcc-internal-format +-msgid "invalid expression for min lvalue" +-msgstr "expressió no vàlida com a operand" +- +-#: tree-cfg.c:3456 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in indirect reference" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3463 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in indirect reference" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3491 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands to array reference" +-msgstr "operadors no vàlids per al binari %s" +- +-#: tree-cfg.c:3502 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in array reference" +-msgstr "falta subindici en la referència de la matriu" +- +-#: tree-cfg.c:3511 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in array range reference" +-msgstr "falta subindici en la referència de la matriu" +- +-#: tree-cfg.c:3522 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in real/imagpart reference" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3532 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in component reference" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3586 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in conversion" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3614 +-#, fuzzy, gcc-internal-format +-msgid "invalid types in nop conversion" +-msgstr "tipus \"void\" no vàlid per a new" +- +-#: tree-cfg.c:3628 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in int to float conversion" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3634 +-#, fuzzy, gcc-internal-format +-msgid "invalid types in conversion to floating point" +-msgstr "sufix \"%.*s\" no vàlid en la constant de coma flotant" +- +-#: tree-cfg.c:3647 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in float to int conversion" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3653 +-#, fuzzy, gcc-internal-format +-msgid "invalid types in conversion to integer" +-msgstr "tipus \"void\" no vàlid per a new" +- +-#: tree-cfg.c:3667 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in complex expression" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3680 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in complex expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3694 +-#, gcc-internal-format +-msgid "constructor not allowed for non-vector types" +-msgstr "" +- +-#: tree-cfg.c:3711 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in shift expression" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3717 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in shift expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3735 +-#, fuzzy, gcc-internal-format +-msgid "invalid (pointer) operands to plus/minus" +-msgstr "operadors no vàlids per al binari %s" +- +-#: tree-cfg.c:3748 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in pointer plus expression" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3755 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in pointer plus expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3774 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in conditional expression" +-msgstr "tipus signed i unsigned en l'expressió condicional" +- +-#: tree-cfg.c:3807 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in address expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3827 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in truth expression" +-msgstr "operand no vàlid en la instrucció" +- +-#: tree-cfg.c:3836 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in binary truth expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3852 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand in unary not" +-msgstr "operadors no vàlids per al binari %s" +- +-#: tree-cfg.c:3861 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in not expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3900 +-#, fuzzy, gcc-internal-format +-msgid "invalid operands in comparison expression" +-msgstr "ús no vàlid de l'expressió void" +- +-#: tree-cfg.c:3917 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch in comparison expression" +-msgstr "els tipus de dades no coincideixen en l'expressió condicional" +- +-#: tree-cfg.c:3947 +-#, fuzzy, gcc-internal-format +-msgid "non-trivial conversion at assignment" +-msgstr "l-value no vàlid en l'assignació" +- +-#: tree-cfg.c:3988 tree-cfg.c:4136 +-#, fuzzy, gcc-internal-format +-msgid "is not a valid GIMPLE statement" +-msgstr "\"%E\" no és un argument de patró vàlid" +- +-#: tree-cfg.c:4015 +-#, fuzzy, gcc-internal-format +-msgid "invalid operand to switch statement" +-msgstr "no vàlid operand per al codi %%s" +- +-#: tree-cfg.c:4026 +-#, fuzzy, gcc-internal-format +-msgid "type error in return expression" +-msgstr " en expressió thrown" +- +-#: tree-cfg.c:4104 +-#, fuzzy, gcc-internal-format +-msgid "verify_gimple failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-cfg.c:4156 +-#, gcc-internal-format +-msgid "statement marked for throw, but doesn%'t" +-msgstr "" +- +-#: tree-cfg.c:4161 +-#, gcc-internal-format +-msgid "statement marked for throw in middle of block" +-msgstr "" +- +-#: tree-cfg.c:4232 +-#, fuzzy, gcc-internal-format +-msgid "unexpected non-tuple" +-msgstr "operand inesperat" +- +-#: tree-cfg.c:4261 +-#, gcc-internal-format +-msgid "Dead STMT in EH table" +-msgstr "" +- +-#: tree-cfg.c:4295 +-#, gcc-internal-format +-msgid "bb_for_stmt (phi) is set to a wrong basic block" +-msgstr "" +- +-#: tree-cfg.c:4306 +-#, fuzzy, gcc-internal-format +-msgid "missing PHI def" +-msgstr "falta valor" +- +-#: tree-cfg.c:4317 +-#, gcc-internal-format +-msgid "PHI def is not a GIMPLE value" +-msgstr "" +- +-#: tree-cfg.c:4333 tree-cfg.c:4359 +-#, gcc-internal-format +-msgid "incorrect sharing of tree nodes" +-msgstr "" +- +-#: tree-cfg.c:4350 +-#, gcc-internal-format +-msgid "bb_for_stmt (stmt) is set to a wrong basic block" +-msgstr "" +- +-#: tree-cfg.c:4373 +-#, fuzzy, gcc-internal-format +-msgid "verify_stmts failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-cfg.c:4396 +-#, gcc-internal-format +-msgid "ENTRY_BLOCK has IL associated with it" +-msgstr "" +- +-#: tree-cfg.c:4402 +-#, gcc-internal-format +-msgid "EXIT_BLOCK has IL associated with it" +-msgstr "" +- +-#: tree-cfg.c:4409 +-#, gcc-internal-format +-msgid "fallthru to exit from bb %d" +-msgstr "" +- +-#: tree-cfg.c:4431 +-#, gcc-internal-format +-msgid "nonlocal label " +-msgstr "" +- +-#: tree-cfg.c:4440 tree-cfg.c:4450 tree-cfg.c:4475 +-#, gcc-internal-format +-msgid "label " +-msgstr "" +- +-#: tree-cfg.c:4465 +-#, fuzzy, gcc-internal-format +-msgid "control flow in the middle of basic block %d" +-msgstr "control de fluix insn dintre el bloc bàsic" +- +-#: tree-cfg.c:4495 +-#, fuzzy, gcc-internal-format +-msgid "fallthru edge after a control statement in bb %d" +-msgstr "Vora de caiguda després del salt incondicional %i" +- +-#: tree-cfg.c:4508 +-#, gcc-internal-format +-msgid "true/false edge after a non-COND_EXPR in bb %d" +-msgstr "" +- +-#: tree-cfg.c:4524 +-#, gcc-internal-format +-msgid "COND_EXPR with code in branches at the end of bb %d" +-msgstr "" +- +-#: tree-cfg.c:4538 tree-cfg.c:4560 tree-cfg.c:4573 tree-cfg.c:4644 +-#, gcc-internal-format +-msgid "wrong outgoing edge flags at end of bb %d" +-msgstr "" +- +-#: tree-cfg.c:4548 +-#, fuzzy, gcc-internal-format +-msgid "explicit goto at end of bb %d" +-msgstr "instanciació explícita de \"%#D\"" +- +-#: tree-cfg.c:4578 +-#, gcc-internal-format +-msgid "return edge does not point to exit in bb %d" +-msgstr "" +- +-#: tree-cfg.c:4611 +-#, gcc-internal-format +-msgid "found default case not at end of case vector" +-msgstr "" +- +-#: tree-cfg.c:4617 +-#, fuzzy, gcc-internal-format +-msgid "case labels not sorted: " +-msgstr "els trampolins no tenen suport" +- +-#: tree-cfg.c:4628 +-#, gcc-internal-format +-msgid "no default case found at end of case vector" +-msgstr "" +- +-#: tree-cfg.c:4636 +-#, gcc-internal-format +-msgid "extra outgoing edge %d->%d" +-msgstr "" +- +-#: tree-cfg.c:4658 +-#, gcc-internal-format +-msgid "missing edge %i->%i" +-msgstr "" +- +-#: tree-cfg.c:6941 tree-cfg.c:6945 +-#, fuzzy, gcc-internal-format +-msgid "%H% function does return" +-msgstr "la funció \"noreturn\" retorna" +- +-#: tree-cfg.c:6967 tree-cfg.c:6972 +-#, fuzzy, gcc-internal-format +-msgid "%Hcontrol reaches end of non-void function" +-msgstr "el control arriba a el final d'una funció que no és void" +- +-#: tree-cfg.c:7033 +-#, fuzzy, gcc-internal-format +-msgid "%Jfunction might be possible candidate for attribute %" +-msgstr "la funció pot ser un candidat possible per a l'atribut \"noreturn\"" +- +-#: tree-dump.c:933 +-#, fuzzy, gcc-internal-format +-msgid "could not open dump file %qs: %s" +-msgstr "no es pot obrir el fitxer de dump \"%s\"" +- +-#: tree-dump.c:1068 +-#, fuzzy, gcc-internal-format +-msgid "ignoring unknown option %q.*s in %<-fdump-%s%>" +-msgstr "ignorant l'opció desconeguda \"%.*s\" dintre \"-f%s\"" +- +-#: tree-eh.c:1788 +-#, fuzzy, gcc-internal-format +-msgid "EH edge %i->%i is missing" +-msgstr "falta l'argument per a \"-%s\"" +- +-#: tree-eh.c:1793 +-#, gcc-internal-format +-msgid "EH edge %i->%i miss EH flag" +-msgstr "" +- +-#. ??? might not be mistake. +-#: tree-eh.c:1799 +-#, gcc-internal-format +-msgid "EH edge %i->%i has duplicated regions" +-msgstr "" +- +-#: tree-eh.c:1833 +-#, gcc-internal-format +-msgid "BB %i can not throw but has EH edges" +-msgstr "" +- +-#: tree-eh.c:1840 +-#, gcc-internal-format +-msgid "BB %i last statement has incorrectly set region" +-msgstr "" +- +-#: tree-eh.c:1851 +-#, gcc-internal-format +-msgid "unnecessary EH edge %i->%i" +-msgstr "" +- +-#: tree-inline.c:1830 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses alloca (override using the always_inline attribute)" +-msgstr "" +- +-#: tree-inline.c:1842 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses setjmp" +-msgstr "" +- +-#: tree-inline.c:1856 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses variable argument lists" +-msgstr "" +- +-#: tree-inline.c:1867 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses setjmp-longjmp exception handling" +-msgstr "" +- +-#: tree-inline.c:1874 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses non-local goto" +-msgstr "" +- +-#: tree-inline.c:1885 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses __builtin_return or __builtin_apply_args" +-msgstr "" +- +-#: tree-inline.c:1904 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it contains a computed goto" +-msgstr "" +- +-#: tree-inline.c:1918 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it receives a non-local goto" +-msgstr "" +- +-#: tree-inline.c:1943 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses variable sized variables" +-msgstr "" +- +-#: tree-inline.c:2005 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it is suppressed using -fno-inline" +-msgstr "" +- +-#: tree-inline.c:2019 +-#, gcc-internal-format +-msgid "function %q+F can never be inlined because it uses attributes conflicting with inlining" +-msgstr "" +- +-#: tree-inline.c:2588 tree-inline.c:2598 +-#, fuzzy, gcc-internal-format +-msgid "inlining failed in call to %q+F: %s" +-msgstr "el \"inlining\" ha fallat en la cridada a \"%s\"" +- +-#: tree-inline.c:2589 tree-inline.c:2600 +-#, gcc-internal-format +-msgid "called from here" +-msgstr "cridat des d'aquí" +- +-#: tree-mudflap.c:860 +-#, gcc-internal-format +-msgid "mudflap checking not yet implemented for ARRAY_RANGE_REF" +-msgstr "" +- +-#: tree-mudflap.c:1044 +-#, gcc-internal-format +-msgid "mudflap cannot track %qs in stub function" +-msgstr "" +- +-#: tree-mudflap.c:1272 +-#, gcc-internal-format +-msgid "mudflap cannot track unknown size extern %qs" +-msgstr "" +- +-#: tree-nomudflap.c:50 +-#, fuzzy, gcc-internal-format +-msgid "mudflap: this language is not supported" +-msgstr "els trampolins no tenen suport" +- +-#: tree-optimize.c:430 +-#, fuzzy, gcc-internal-format +-msgid "size of return value of %q+D is %u bytes" +-msgstr "la grandària del valor de retorn de \"%s\" és de %u octets" +- +-#: tree-optimize.c:433 +-#, fuzzy, gcc-internal-format +-msgid "size of return value of %q+D is larger than %wd bytes" +-msgstr "la grandària del valor de retorn de \"%s\" és més gran que %d octets" +- +-#: tree-outof-ssa.c:637 tree-outof-ssa.c:688 tree-ssa-coalesce.c:936 +-#: tree-ssa-coalesce.c:951 tree-ssa-coalesce.c:1163 tree-ssa-live.c:1043 +-#, gcc-internal-format +-msgid "SSA corruption" +-msgstr "" +- +-#: tree-outof-ssa.c:1105 +-#, gcc-internal-format +-msgid " Pending stmts not issued on PRED edge (%d, %d)\n" +-msgstr "" +- +-#: tree-outof-ssa.c:1111 +-#, gcc-internal-format +-msgid " Pending stmts not issued on SUCC edge (%d, %d)\n" +-msgstr "" +- +-#: tree-outof-ssa.c:1118 +-#, gcc-internal-format +-msgid " Pending stmts not issued on ENTRY edge (%d, %d)\n" +-msgstr "" +- +-#: tree-outof-ssa.c:1124 +-#, gcc-internal-format +-msgid " Pending stmts not issued on EXIT edge (%d, %d)\n" +-msgstr "" +- +-#: tree-profile.c:351 +-#, fuzzy, gcc-internal-format +-msgid "unimplemented functionality" +-msgstr "En la declaració de la funció" +- +-#: tree-ssa-alias-warnings.c:814 +-#, gcc-internal-format +-msgid "%Hlikely type-punning may break strict-aliasing rules: object %<%s%s%> of main type %qT is referenced at or around %s:%d and may be aliased to object %<%s%s%> of main type %qT which is referenced at or around %s:%d." +-msgstr "" +- +-#: tree-ssa.c:110 +-#, gcc-internal-format +-msgid "expected an SSA_NAME object" +-msgstr "" +- +-#: tree-ssa.c:116 +-#, gcc-internal-format +-msgid "type mismatch between an SSA_NAME and its symbol" +-msgstr "" +- +-#: tree-ssa.c:122 +-#, gcc-internal-format +-msgid "found an SSA_NAME that had been released into the free pool" +-msgstr "" +- +-#: tree-ssa.c:128 +-#, gcc-internal-format +-msgid "found a virtual definition for a GIMPLE register" +-msgstr "" +- +-#: tree-ssa.c:134 +-#, fuzzy, gcc-internal-format +-msgid "found a real definition for a non-register" +-msgstr "la definició de la funció ho va declarar com \"register\"" +- +-#: tree-ssa.c:141 +-#, gcc-internal-format +-msgid "found real variable when subvariables should have appeared" +-msgstr "" +- +-#: tree-ssa.c:148 +-#, gcc-internal-format +-msgid "found a default name with a non-empty defining statement" +-msgstr "" +- +-#: tree-ssa.c:176 +-#, gcc-internal-format +-msgid "SSA_NAME created in two different blocks %i and %i" +-msgstr "" +- +-#: tree-ssa.c:185 +-#, gcc-internal-format +-msgid "SSA_NAME_DEF_STMT is wrong" +-msgstr "" +- +-#: tree-ssa.c:237 +-#, fuzzy, gcc-internal-format +-msgid "missing definition" +-msgstr "falta valor inicial" +- +-#: tree-ssa.c:243 +-#, gcc-internal-format +-msgid "definition in block %i does not dominate use in block %i" +-msgstr "" +- +-#: tree-ssa.c:251 +-#, gcc-internal-format +-msgid "definition in block %i follows the use" +-msgstr "" +- +-#: tree-ssa.c:258 +-#, gcc-internal-format +-msgid "SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set" +-msgstr "" +- +-#: tree-ssa.c:266 +-#, gcc-internal-format +-msgid "no immediate_use list" +-msgstr "" +- +-#: tree-ssa.c:278 +-#, gcc-internal-format +-msgid "wrong immediate use list" +-msgstr "" +- +-#: tree-ssa.c:312 +-#, gcc-internal-format +-msgid "incoming edge count does not match number of PHI arguments" +-msgstr "" +- +-#: tree-ssa.c:326 +-#, fuzzy, gcc-internal-format +-msgid "PHI argument is missing for edge %d->%d" +-msgstr "falta l'argument per omissió per al paràmetre %P de \"%+#D\"" +- +-#: tree-ssa.c:335 +-#, fuzzy, gcc-internal-format +-msgid "PHI argument is not SSA_NAME, or invariant" +-msgstr "l'argument \"%d\" no és una constant" +- +-#: tree-ssa.c:348 +-#, gcc-internal-format +-msgid "wrong edge %d->%d for PHI argument" +-msgstr "" +- +-#: tree-ssa.c:398 +-#, gcc-internal-format +-msgid "non-addressable variable inside an alias set" +-msgstr "" +- +-#: tree-ssa.c:409 +-#, fuzzy, gcc-internal-format +-msgid "verify_flow_insensitive_alias_info failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-ssa.c:451 +-#, gcc-internal-format +-msgid "dereferenced pointers should have a name or a symbol tag" +-msgstr "" +- +-#: tree-ssa.c:458 +-#, gcc-internal-format +-msgid "pointers with a memory tag, should have points-to sets" +-msgstr "" +- +-#: tree-ssa.c:470 +-#, gcc-internal-format +-msgid "pointer escapes but its name tag is not call-clobbered" +-msgstr "" +- +-#: tree-ssa.c:480 +-#, fuzzy, gcc-internal-format +-msgid "verify_flow_sensitive_alias_info failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-ssa.c:508 +-#, gcc-internal-format +-msgid "variable in call_clobbered_vars but not marked call_clobbered" +-msgstr "" +- +-#: tree-ssa.c:527 +-#, gcc-internal-format +-msgid "variable marked call_clobbered but not in call_clobbered_vars bitmap." +-msgstr "" +- +-#: tree-ssa.c:537 +-#, fuzzy, gcc-internal-format +-msgid "verify_call_clobbering failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-ssa.c:558 +-#, gcc-internal-format +-msgid "Memory partitions should have at least one symbol" +-msgstr "" +- +-#: tree-ssa.c:568 +-#, gcc-internal-format +-msgid "Partitioned symbols should belong to exactly one partition" +-msgstr "" +- +-#: tree-ssa.c:581 +-#, fuzzy, gcc-internal-format +-msgid "verify_memory_partitions failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-ssa.c:653 +-#, gcc-internal-format +-msgid "AUX pointer initialized for edge %d->%d" +-msgstr "" +- +-#: tree-ssa.c:677 +-#, gcc-internal-format +-msgid "stmt (%p) marked modified after optimization pass: " +-msgstr "" +- +-#: tree-ssa.c:697 +-#, gcc-internal-format +-msgid "statement makes a memory store, but has no VDEFS" +-msgstr "" +- +-#: tree-ssa.c:707 tree-ssa.c:717 +-#, fuzzy, gcc-internal-format +-msgid "in statement" +-msgstr "En la declaració de la funció" +- +-#: tree-ssa.c:756 +-#, fuzzy, gcc-internal-format +-msgid "verify_ssa failed" +-msgstr "verify_flow_info fallat" +- +-#: tree-ssa.c:1284 +-#, fuzzy, gcc-internal-format +-msgid "%J%qD was declared here" +-msgstr "%Jes va declarar \"%D\" prèviament aquí" +- +-#. We only do data flow with SSA_NAMEs, so that's all we +-#. can warn about. +-#: tree-ssa.c:1302 +-#, fuzzy, gcc-internal-format +-msgid "%H%qD is used uninitialized in this function" +-msgstr "%J\"%D\" podria ser usat sense iniciar en aquesta funció" +- +-#: tree-ssa.c:1340 +-#, fuzzy, gcc-internal-format +-msgid "%H%qD may be used uninitialized in this function" +-msgstr "%J\"%D\" podria ser usat sense iniciar en aquesta funció" +- +-#: tree-vrp.c:4374 +-#, fuzzy, gcc-internal-format +-msgid "%Harray subscript is outside array bounds" +-msgstr "el subindici de la matriu no és un enter" +- +-#: tree-vrp.c:4388 +-#, fuzzy, gcc-internal-format +-msgid "%Harray subscript is above array bounds" +-msgstr "el subindici de la matriu no és un enter" +- +-#: tree-vrp.c:4395 +-#, fuzzy, gcc-internal-format +-msgid "%Harray subscript is below array bounds" +-msgstr "el subindici de la matriu no és un enter" +- +-#: tree-vrp.c:5042 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when simplifying conditional to constant" +-msgstr "" +- +-#: tree-vrp.c:5048 +-#, gcc-internal-format +-msgid "assuming signed overflow does not occur when simplifying conditional" +-msgstr "" +- +-#: tree.c:3951 +-#, gcc-internal-format +-msgid "%q+D already declared with dllexport attribute: dllimport ignored" +-msgstr "" +- +-#: tree.c:3963 +-#, gcc-internal-format +-msgid "%q+D redeclared without dllimport attribute after being referenced with dll linkage" +-msgstr "" +- +-#: tree.c:3979 +-#, gcc-internal-format +-msgid "%q+D redeclared without dllimport attribute: previous dllimport ignored" +-msgstr "" +- +-#: tree.c:4038 tree.c:4050 config/darwin.c:1458 config/arm/arm.c:3099 +-#: config/arm/arm.c:3127 config/avr/avr.c:4598 config/h8300/h8300.c:5281 +-#: config/h8300/h8300.c:5305 config/i386/i386.c:3056 config/i386/i386.c:22515 +-#: config/ia64/ia64.c:586 config/m68hc11/m68hc11.c:1118 +-#: config/rs6000/rs6000.c:19657 config/sh/symbian.c:408 +-#: config/sh/symbian.c:415 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute ignored" +-msgstr "s'ignora l'atribut \"%s\"" +- +-#: tree.c:4066 +-#, fuzzy, gcc-internal-format +-msgid "inline function %q+D declared as dllimport: attribute ignored" +-msgstr "la funció «inline» \"%s\" està declarada com dllimport: s'ignora l'atribut." +- +-#: tree.c:4074 +-#, fuzzy, gcc-internal-format +-msgid "function %q+D definition is marked dllimport" +-msgstr "la definició de la funció \"%s\" està marcada com dllimport" +- +-#: tree.c:4082 config/sh/symbian.c:430 +-#, fuzzy, gcc-internal-format +-msgid "variable %q+D definition is marked dllimport" +-msgstr "la variable \"%s\" està marcada com dllimport" +- +-#: tree.c:4105 config/sh/symbian.c:505 +-#, gcc-internal-format +-msgid "external linkage required for symbol %q+D because of %qs attribute" +-msgstr "" +- +-#: tree.c:4119 +-#, gcc-internal-format +-msgid "%qs implies default visibility, but %qD has already been declared with a different visibility" +-msgstr "" +- +-#: tree.c:5632 +-#, gcc-internal-format +-msgid "arrays of functions are not meaningful" +-msgstr "les matrius de funcions no tenen significat" +- +-#: tree.c:5785 +-#, gcc-internal-format +-msgid "function return type cannot be function" +-msgstr "el tipus de retorn d'una funció no pot ser una funció" +- +-#: tree.c:6802 tree.c:6887 tree.c:6948 +-#, fuzzy, gcc-internal-format +-msgid "tree check: %s, have %s in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava %s, es té %s en %s, en %s:%d" +- +-#: tree.c:6839 +-#, fuzzy, gcc-internal-format +-msgid "tree check: expected none of %s, have %s in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava %s, es té %s en %s, en %s:%d" +- +-#: tree.c:6852 +-#, fuzzy, gcc-internal-format +-msgid "tree check: expected class %qs, have %qs (%s) in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava classe \"%c\", es té \"%c\" (%s) en %s, en %s:%d" +- +-#: tree.c:6901 +-#, fuzzy, gcc-internal-format +-msgid "tree check: did not expect class %qs, have %qs (%s) in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava classe \"%c\", es té \"%c\" (%s) en %s, en %s:%d" +- +-#: tree.c:6914 +-#, fuzzy, gcc-internal-format +-msgid "tree check: expected omp_clause %s, have %s in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava %s, es té %s en %s, en %s:%d" +- +-#: tree.c:6974 +-#, fuzzy, gcc-internal-format +-msgid "tree check: expected tree that contains %qs structure, have %qs in %s, at %s:%d" +-msgstr "revisió d'arbre: s'esperava %s, es té %s en %s, en %s:%d" +- +-#: tree.c:6988 +-#, gcc-internal-format +-msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" +-msgstr "revisió d'arbre: accés de *elt %d de tree_vec amb %d elts en %s, en %s:%d" +- +-#: tree.c:7000 +-#, fuzzy, gcc-internal-format +-msgid "tree check: accessed elt %d of phi_node with %d elts in %s, at %s:%d" +-msgstr "revisió d'arbre: accés de *elt %d de tree_vec amb %d elts en %s, en %s:%d" +- +-#: tree.c:7013 +-#, fuzzy, gcc-internal-format +-msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d" +-msgstr "revisió d'arbre: accés de *elt %d de tree_vec amb %d elts en %s, en %s:%d" +- +-#: tree.c:7026 +-#, fuzzy, gcc-internal-format +-msgid "tree check: accessed operand %d of omp_clause %s with %d operands in %s, at %s:%d" +-msgstr "revisió d'arbre: accés de *elt %d de tree_vec amb %d elts en %s, en %s:%d" +- +-#: value-prof.c:351 +-#, gcc-internal-format +-msgid "Dead histogram" +-msgstr "" +- +-#: value-prof.c:380 +-#, gcc-internal-format +-msgid "Histogram value statement does not correspond to statement it is associated with" +-msgstr "" +- +-#: value-prof.c:393 +-#, fuzzy, gcc-internal-format +-msgid "verify_histograms failed" +-msgstr "verify_flow_info fallat" +- +-#: value-prof.c:434 +-#, gcc-internal-format +-msgid "%HCorrupted value profile: %s profiler overall count (%d) does not match BB count (%d)" +-msgstr "" +- +-#: varasm.c:546 +-#, fuzzy, gcc-internal-format +-msgid "%+D causes a section type conflict" +-msgstr "%s causa un conflicte de tipus de secció" +- +-#: varasm.c:1089 +-#, fuzzy, gcc-internal-format +-msgid "alignment of %q+D is greater than maximum object file alignment. Using %d" +-msgstr "l'alineació de \"%s\" és massa granda que l'alineació màxima del fitxer objecte. S'usa %d." +- +-#: varasm.c:1310 varasm.c:1318 +-#, fuzzy, gcc-internal-format +-msgid "register name not specified for %q+D" +-msgstr "no s'especifica nom de registre per a \"%s\"" +- +-#: varasm.c:1320 +-#, fuzzy, gcc-internal-format +-msgid "invalid register name for %q+D" +-msgstr "nom de registre no vàlid per a \"%s\"" +- +-#: varasm.c:1322 +-#, fuzzy, gcc-internal-format +-msgid "data type of %q+D isn%'t suitable for a register" +-msgstr "el tipus de dades de \"%s\" no és adequat per a un registre" +- +-#: varasm.c:1325 +-#, fuzzy, gcc-internal-format +-msgid "register specified for %q+D isn%'t suitable for data type" +-msgstr "el registre especificat per \"%s\" no és adequat per al tipus de dades" +- +-#: varasm.c:1335 +-#, gcc-internal-format +-msgid "global register variable has initial value" +-msgstr "la variable de registre global té valor inicial" +- +-#: varasm.c:1339 +-#, gcc-internal-format +-msgid "optimization may eliminate reads and/or writes to register variables" +-msgstr "" +- +-#: varasm.c:1377 +-#, fuzzy, gcc-internal-format +-msgid "register name given for non-register variable %q+D" +-msgstr "nom de registre donat per a una variable \"%s\" que no és registre" +- +-#: varasm.c:1446 +-#, fuzzy, gcc-internal-format +-msgid "global destructors not supported on this target" +-msgstr "no es dóna suport a límits de pila en aquest objectiu" +- +-#: varasm.c:1512 +-#, fuzzy, gcc-internal-format +-msgid "global constructors not supported on this target" +-msgstr "no es dóna suport a límits de pila en aquest objectiu" +- +-#: varasm.c:1898 +-#, gcc-internal-format +-msgid "thread-local COMMON data not implemented" +-msgstr "" +- +-#: varasm.c:1927 +-#, fuzzy, gcc-internal-format +-msgid "requested alignment for %q+D is greater than implemented alignment of %wu" +-msgstr "l'alineació sol·licitada per a %s és massa granda que l'alineació implementada de %d" +- +-#: varasm.c:4386 +-#, fuzzy, gcc-internal-format +-msgid "initializer for integer/fixed-point value is too complicated" +-msgstr "el assignador per a un valor enter és massa complicat" +- +-#: varasm.c:4391 +-#, gcc-internal-format +-msgid "initializer for floating value is not a floating constant" +-msgstr "el assignador per a un valor de coma flotant no és una constant de coma flotant" +- +-#: varasm.c:4664 +-#, fuzzy, gcc-internal-format +-msgid "invalid initial value for member %qs" +-msgstr "valor inicial no vàlid per al membre \"%s\"" +- +-#: varasm.c:4864 varasm.c:4908 +-#, fuzzy, gcc-internal-format +-msgid "weak declaration of %q+D must precede definition" +-msgstr "la declaració feble de \"%s\" ha de precedir la definició" +- +-#: varasm.c:4872 +-#, fuzzy, gcc-internal-format +-msgid "weak declaration of %q+D after first use results in unspecified behavior" +-msgstr "la declaració feble de \"%s\" després del primer ús resulta en una conducta no especificada" +- +-#: varasm.c:4906 +-#, fuzzy, gcc-internal-format +-msgid "weak declaration of %q+D must be public" +-msgstr "la declaració feble de \"%s\" ha de ser pública" +- +-#: varasm.c:4915 +-#, fuzzy, gcc-internal-format +-msgid "weak declaration of %q+D not supported" +-msgstr "no es dóna suport a la declaració feble de \"%s\"" +- +-#: varasm.c:4941 +-#, gcc-internal-format +-msgid "only weak aliases are supported in this configuration" +-msgstr "només els aliessis febles tenen suport en aquesta configuració" +- +-#: varasm.c:5176 +-#, fuzzy, gcc-internal-format +-msgid "%Jweakref is not supported in this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: varasm.c:5257 +-#, fuzzy, gcc-internal-format +-msgid "%q+D aliased to undefined symbol %qs" +-msgstr "ús no vàlid del tipus indefinit \"%s %s\"" +- +-#: varasm.c:5262 +-#, gcc-internal-format +-msgid "%q+D aliased to external symbol %qs" +-msgstr "" +- +-#: varasm.c:5301 +-#, gcc-internal-format +-msgid "weakref %q+D ultimately targets itself" +-msgstr "" +- +-#: varasm.c:5310 +-#, fuzzy, gcc-internal-format +-msgid "weakref %q+D must have static linkage" +-msgstr "no es pot declarar que la funció membre \"%D\" tingui enllaçat estàtic" +- +-#: varasm.c:5316 +-#, fuzzy, gcc-internal-format +-msgid "%Jalias definitions not supported in this configuration" +-msgstr "les definicions d'alies no tenen suport en aquesta configuració; ignorades" +- +-#: varasm.c:5321 +-#, fuzzy, gcc-internal-format +-msgid "%Jonly weak aliases are supported in this configuration" +-msgstr "només els aliessis febles tenen suport en aquesta configuració" +- +-#: varasm.c:5378 +-#, gcc-internal-format +-msgid "visibility attribute not supported in this configuration; ignored" +-msgstr "els atributs de visibilitat no tenen suport en aquesta configuració; ignorats" +- +-#: varray.c:195 +-#, gcc-internal-format +-msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d" +-msgstr "matriu virtual %s[%lu]: l'element %lu està fora dels límits en %s, en %s:%d" +- +-#: varray.c:205 +-#, gcc-internal-format +-msgid "underflowed virtual array %s in %s, at %s:%d" +-msgstr "" +- +-#: vec.c:233 +-#, gcc-internal-format +-msgid "vector %s %s domain error, in %s at %s:%u" +-msgstr "" +- +-#. Print an error message for unrecognized stab codes. +-#: xcoffout.c:187 +-#, fuzzy, gcc-internal-format +-msgid "no sclass for %s stab (0x%x)" +-msgstr "no hi ha sclass per al stab %s (0x%x)\n" +- +-#: config/darwin-c.c:84 +-#, gcc-internal-format +-msgid "too many #pragma options align=reset" +-msgstr "massa opcions #pragma align=reset" +- +-#: config/darwin-c.c:104 config/darwin-c.c:107 config/darwin-c.c:109 +-#: config/darwin-c.c:111 +-#, gcc-internal-format +-msgid "malformed '#pragma options', ignoring" +-msgstr "\"#pragma opcions\" malformat, ignorant" +- +-#: config/darwin-c.c:114 +-#, gcc-internal-format +-msgid "junk at end of '#pragma options'" +-msgstr "escombraries al final de \"#pragma opcions\"" +- +-#: config/darwin-c.c:124 +-#, gcc-internal-format +-msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring" +-msgstr "\"#pragma opcions align={mac68k|power|reset}\" malformat, ignorant" +- +-#: config/darwin-c.c:136 +-#, gcc-internal-format +-msgid "missing '(' after '#pragma unused', ignoring" +-msgstr "\"(\" faltant després de '#pragma unused', ignorant" +- +-#: config/darwin-c.c:154 +-#, gcc-internal-format +-msgid "missing ')' after '#pragma unused', ignoring" +-msgstr "\")\" faltant després de '#pragma unused', ignorant" +- +-#: config/darwin-c.c:157 +-#, gcc-internal-format +-msgid "junk at end of '#pragma unused'" +-msgstr "escombraries al final de \"#pragma unused\"" +- +-#: config/darwin-c.c:168 +-#, fuzzy, gcc-internal-format +-msgid "malformed '#pragma ms_struct', ignoring" +-msgstr "\"#pragma opcions\" malformat, ignorant" +- +-#: config/darwin-c.c:176 +-#, fuzzy, gcc-internal-format +-msgid "malformed '#pragma ms_struct {on|off|reset}', ignoring" +-msgstr "\"#pragma opcions\" malformat, ignorant" +- +-#: config/darwin-c.c:179 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of '#pragma ms_struct'" +-msgstr "escombraries al final de \"#pragma %s\"" +- +-#: config/darwin-c.c:405 +-#, gcc-internal-format +-msgid "subframework include %s conflicts with framework include" +-msgstr "" +- +-#: config/darwin-c.c:588 +-#, gcc-internal-format +-msgid "Unknown value %qs of -mmacosx-version-min" +-msgstr "" +- +-#: config/darwin.c:1431 +-#, gcc-internal-format +-msgid "%<%s%> 2.95 vtable-compatibility attribute applies only when compiling a kext" +-msgstr "" +- +-#: config/darwin.c:1438 +-#, gcc-internal-format +-msgid "%<%s%> 2.95 vtable-compatibility attribute applies only to C++ classes" +-msgstr "" +- +-#: config/darwin.c:1563 +-#, fuzzy, gcc-internal-format +-msgid "internal and protected visibility attributes not supported in this configuration; ignored" +-msgstr "els atributs de visibilitat no tenen suport en aquesta configuració; ignorats" +- +-#: config/host-darwin.c:62 +-#, gcc-internal-format +-msgid "couldn't unmap pch_address_space: %m" +-msgstr "" +- +-#: config/sol2-c.c:93 config/sol2-c.c:109 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma align%>, ignoring" +-msgstr "#pragma align mal format - ignorat" +- +-#: config/sol2-c.c:102 +-#, fuzzy, gcc-internal-format +-msgid "invalid alignment for %<#pragma align%>, ignoring" +-msgstr "#pragma align mal format - ignorat" +- +-#: config/sol2-c.c:117 +-#, gcc-internal-format +-msgid "%<#pragma align%> must appear before the declaration of %D, ignoring" +-msgstr "" +- +-#: config/sol2-c.c:129 config/sol2-c.c:141 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma align%>" +-msgstr "secció #pragma builtin malformada" +- +-#: config/sol2-c.c:136 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma align%>" +-msgstr "escombraries al final de #pragma %s" +- +-#: config/sol2-c.c:157 config/sol2-c.c:164 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma init%>, ignoring" +-msgstr "\"#pragma opcions\" malformat, ignorant" +- +-#: config/sol2-c.c:187 config/sol2-c.c:199 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma init%>" +-msgstr "secció #pragma builtin malformada" +- +-#: config/sol2-c.c:194 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma init%>" +-msgstr "escombraries al final de #pragma %s" +- +-#: config/sol2-c.c:215 config/sol2-c.c:222 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma fini%>, ignoring" +-msgstr "\"#pragma opcions\" malformat, ignorant" +- +-#: config/sol2-c.c:245 config/sol2-c.c:257 +-#, fuzzy, gcc-internal-format +-msgid "malformed %<#pragma fini%>" +-msgstr "secció #pragma builtin malformada" +- +-#: config/sol2-c.c:252 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of %<#pragma fini%>" +-msgstr "escombraries al final de #pragma %s" +- +-#: config/sol2.c:53 +-#, gcc-internal-format +-msgid "ignoring %<#pragma align%> for explicitly aligned %q+D" +-msgstr "" +- +-#: config/vxworks.c:69 +-#, fuzzy, gcc-internal-format +-msgid "PIC is only supported for RTPs" +-msgstr "-g només té suport quan s'usa GAS en aquest processador," +- +-#. Mach-O supports 'weak imports', and 'weak definitions' in coalesced +-#. sections. machopic_select_section ensures that weak variables go in +-#. coalesced sections. Weak aliases (or any other kind of aliases) are +-#. not supported. Weak symbols that aren't visible outside the .s file +-#. are not supported. +-#: config/darwin.h:451 +-#, fuzzy, gcc-internal-format +-msgid "alias definitions not supported in Mach-O; ignored" +-msgstr "les definicions d'alies no tenen suport en aquesta configuració; ignorades" +- +-#. No profiling. +-#: config/vx-common.h:89 +-#, fuzzy, gcc-internal-format +-msgid "profiler support for VxWorks" +-msgstr "suport per a function_profiler per a MMIX" +- +-#: config/windiss.h:36 +-#, fuzzy, gcc-internal-format +-msgid "profiler support for WindISS" +-msgstr "suport per a function_profiler per a MMIX" +- +-#: config/alpha/alpha.c:232 config/rs6000/rs6000.c:1990 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mtls-size switch" +-msgstr "valor erroni \"%s\" per a l'opció -mtls-size" +- +-#: config/alpha/alpha.c:286 +-#, gcc-internal-format +-msgid "-f%s ignored for Unicos/Mk (not supported)" +-msgstr "s'ignora -f%s per a Unicos/Mk (no es dóna suport)" +- +-#: config/alpha/alpha.c:310 +-#, gcc-internal-format +-msgid "-mieee not supported on Unicos/Mk" +-msgstr "no es dóna suport a -mieee en Unicos/Mk" +- +-#: config/alpha/alpha.c:321 +-#, gcc-internal-format +-msgid "-mieee-with-inexact not supported on Unicos/Mk" +-msgstr "no es dóna suport a -mieee-with-inexact en Unicos/Mk" +- +-#: config/alpha/alpha.c:338 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mtrap-precision switch" +-msgstr "valor erroni \"%s\" per a l'opció -mtrap-precision" +- +-#: config/alpha/alpha.c:352 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mfp-rounding-mode switch" +-msgstr "valor erroni \"%s\" per a l'opció -mfp-rounding-mode" +- +-#: config/alpha/alpha.c:367 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mfp-trap-mode switch" +-msgstr "valor erroni \"%s\" per a l'opció -mfp-trap-mode" +- +-#: config/alpha/alpha.c:381 config/alpha/alpha.c:393 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mcpu switch" +-msgstr "valor erroni \"%s\" per a l'opció -mcpu" +- +-#: config/alpha/alpha.c:400 +-#, gcc-internal-format +-msgid "trap mode not supported on Unicos/Mk" +-msgstr "no es dóna suport al mode trap en Unicos/Mk" +- +-#: config/alpha/alpha.c:407 +-#, gcc-internal-format +-msgid "fp software completion requires -mtrap-precision=i" +-msgstr "el completat per programari de fp requereix una opció -mtrap-precision=i" +- +-#: config/alpha/alpha.c:423 +-#, gcc-internal-format +-msgid "rounding mode not supported for VAX floats" +-msgstr "el mode d'arrodoniment no té suport per a floats de VAX" +- +-#: config/alpha/alpha.c:428 +-#, gcc-internal-format +-msgid "trap mode not supported for VAX floats" +-msgstr "el mode de captura no té suport per a valors de coma flotant VAX" +- +-#: config/alpha/alpha.c:432 +-#, fuzzy, gcc-internal-format +-msgid "128-bit long double not supported for VAX floats" +-msgstr "el mode de captura no té suport per a valors de coma flotant VAX" +- +-#: config/alpha/alpha.c:460 +-#, gcc-internal-format +-msgid "L%d cache latency unknown for %s" +-msgstr "latència de cau L%d desconeguda per a %s" +- +-#: config/alpha/alpha.c:475 +-#, fuzzy, gcc-internal-format +-msgid "bad value %qs for -mmemory-latency" +-msgstr "valor erroni \"%s\" per a -mmemory-latency" +- +-#: config/alpha/alpha.c:6514 config/alpha/alpha.c:6517 config/s390/s390.c:8279 +-#: config/s390/s390.c:8282 +-#, gcc-internal-format +-msgid "bad builtin fcode" +-msgstr "" +- +-#: config/arc/arc.c:388 +-#, fuzzy, gcc-internal-format +-msgid "argument of %qs attribute is not a string constant" +-msgstr "l'argument de l'atribut \"%s\" no es una cadena constant" +- +-#: config/arc/arc.c:396 +-#, fuzzy, gcc-internal-format +-msgid "argument of %qs attribute is not \"ilink1\" or \"ilink2\"" +-msgstr "l'argument de l'atribut \"%s\" no es \"ilink1\" o \"ilink2\"" +- +-#: config/arm/arm.c:1050 +-#, gcc-internal-format +-msgid "switch -mcpu=%s conflicts with -march= switch" +-msgstr "l'opció -mcpu=%s genera conflictes amb l'opció -march=" +- +-#: config/arm/arm.c:1060 config/rs6000/rs6000.c:1504 config/sparc/sparc.c:761 +-#, gcc-internal-format +-msgid "bad value (%s) for %s switch" +-msgstr "valor erroni (%s) per a l'opció %s" +- +-#: config/arm/arm.c:1170 +-#, fuzzy, gcc-internal-format +-msgid "target CPU does not support ARM mode" +-msgstr "el CPU objectiu no té suport per a APCS-32" +- +-#: config/arm/arm.c:1174 +-#, gcc-internal-format +-msgid "target CPU does not support interworking" +-msgstr "el CPU objectiu no té suport per a treball intern" +- +-#: config/arm/arm.c:1180 +-#, gcc-internal-format +-msgid "target CPU does not support THUMB instructions" +-msgstr "el CPU objectiu no té suport les instruccions THUMB" +- +-#: config/arm/arm.c:1198 +-#, gcc-internal-format +-msgid "enabling backtrace support is only meaningful when compiling for the Thumb" +-msgstr "habilitar el suport de rastrejat cap a endarrere només té significat quan es compila per al Thumb" +- +-#: config/arm/arm.c:1201 +-#, gcc-internal-format +-msgid "enabling callee interworking support is only meaningful when compiling for the Thumb" +-msgstr "habilitar el suport de treball intern de crides només té significat quan es compila per al Thumb" +- +-#: config/arm/arm.c:1204 +-#, gcc-internal-format +-msgid "enabling caller interworking support is only meaningful when compiling for the Thumb" +-msgstr "habilitar el suport de treball intern de cridat només té significat quan es compila per al Thumb" +- +-#: config/arm/arm.c:1208 +-#, gcc-internal-format +-msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" +-msgstr "-mapcs-stack-check és incompatible amb -mno-apcs-frame" +- +-#: config/arm/arm.c:1216 +-#, gcc-internal-format +-msgid "-fpic and -mapcs-reent are incompatible" +-msgstr "-fpic i -mapcs-reent són incompatibles" +- +-#: config/arm/arm.c:1219 +-#, gcc-internal-format +-msgid "APCS reentrant code not supported. Ignored" +-msgstr "no se suporta el codi APCS que es torna a introduir.Ignorat" +- +-#: config/arm/arm.c:1227 +-#, gcc-internal-format +-msgid "-g with -mno-apcs-frame may not give sensible debugging" +-msgstr "-g amb -mno-apcs-frame no permet una depuració sensible" +- +-#: config/arm/arm.c:1230 +-#, gcc-internal-format +-msgid "passing floating point arguments in fp regs not yet supported" +-msgstr "encara no se suporta passar arguments de nombre de coma flotant en registres fp" +- +-#: config/arm/arm.c:1275 +-#, fuzzy, gcc-internal-format +-msgid "invalid ABI option: -mabi=%s" +-msgstr "opció \"%s\" no vàlida" +- +-#: config/arm/arm.c:1281 +-#, gcc-internal-format +-msgid "iwmmxt requires an AAPCS compatible ABI for proper operation" +-msgstr "" +- +-#: config/arm/arm.c:1284 +-#, gcc-internal-format +-msgid "iwmmxt abi requires an iwmmxt capable cpu" +-msgstr "" +- +-#: config/arm/arm.c:1294 +-#, fuzzy, gcc-internal-format +-msgid "invalid floating point emulation option: -mfpe=%s" +-msgstr "opció d'emulació de coma flotant no vàlida: -mfpe-%s" +- +-#: config/arm/arm.c:1311 +-#, fuzzy, gcc-internal-format +-msgid "invalid floating point option: -mfpu=%s" +-msgstr "opció d'emulació de coma flotant no vàlida: -mfpe-%s" +- +-#: config/arm/arm.c:1351 +-#, fuzzy, gcc-internal-format +-msgid "invalid floating point abi: -mfloat-abi=%s" +-msgstr "opció d'emulació de coma flotant no vàlida: -mfpe-%s" +- +-#: config/arm/arm.c:1358 +-#, gcc-internal-format +-msgid "-mfloat-abi=hard and VFP" +-msgstr "" +- +-#: config/arm/arm.c:1364 +-#, fuzzy, gcc-internal-format +-msgid "iWMMXt and hardware floating point" +-msgstr "Usar coma flotant de maquinari" +- +-#: config/arm/arm.c:1368 +-#, gcc-internal-format +-msgid "Thumb-2 iWMMXt" +-msgstr "" +- +-#: config/arm/arm.c:1391 +-#, fuzzy, gcc-internal-format +-msgid "invalid thread pointer option: -mtp=%s" +-msgstr "opció d'emulació de coma flotant no vàlida: -mfpe-%s" +- +-#: config/arm/arm.c:1404 +-#, gcc-internal-format +-msgid "can not use -mtp=cp15 with 16-bit Thumb" +-msgstr "" +- +-#: config/arm/arm.c:1418 +-#, fuzzy, gcc-internal-format +-msgid "structure size boundary can only be set to %s" +-msgstr "El límit de la grandària de l'estructura només pot establir-se a 8 o 32" +- +-#: config/arm/arm.c:1424 +-#, gcc-internal-format +-msgid "RTP PIC is incompatible with Thumb" +-msgstr "" +- +-#: config/arm/arm.c:1433 +-#, gcc-internal-format +-msgid "RTP PIC is incompatible with -msingle-pic-base" +-msgstr "" +- +-#: config/arm/arm.c:1445 +-#, gcc-internal-format +-msgid "-mpic-register= is useless without -fpic" +-msgstr "-mpic-register= és inútil sense -fpic" +- +-#: config/arm/arm.c:1454 +-#, gcc-internal-format +-msgid "unable to use '%s' for PIC register" +-msgstr "no es pot usar \"%s\" per a registre PIC" +- +-#: config/arm/arm.c:3067 config/arm/arm.c:3085 config/avr/avr.c:4618 +-#: config/avr/avr.c:4660 config/bfin/bfin.c:4778 config/c4x/c4x.c:4071 +-#: config/h8300/h8300.c:5257 config/i386/i386.c:3009 +-#: config/m68hc11/m68hc11.c:1155 config/m68k/m68k.c:741 +-#: config/mcore/mcore.c:3032 config/mips/mips.c:1151 config/mips/mips.c:1153 +-#: config/mt/mt.c:1275 config/rs6000/rs6000.c:19583 config/sh/sh.c:7984 +-#: config/sh/sh.c:8005 config/sh/sh.c:8028 config/stormy16/stormy16.c:2252 +-#: config/v850/v850.c:2048 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute only applies to functions" +-msgstr "l'atribut \"%s\" nomès s'aplica a funcions" +- +-#: config/arm/arm.c:14012 +-#, gcc-internal-format +-msgid "unable to compute real location of stacked parameter" +-msgstr "no es pot calcular la ubicació real del paràmetre apilat" +- +-#: config/arm/arm.c:15451 +-#, fuzzy, gcc-internal-format +-msgid "argument must be a constant" +-msgstr "l'argument \"%d\" no és una constant" +- +-#. @@@ better error message +-#: config/arm/arm.c:15759 config/arm/arm.c:15796 +-#, gcc-internal-format +-msgid "selector must be an immediate" +-msgstr "el selector ha de ser immediat" +- +-#. @@@ better error message +-#: config/arm/arm.c:15839 config/i386/i386.c:20651 config/i386/i386.c:20685 +-#, gcc-internal-format +-msgid "mask must be an immediate" +-msgstr "la màscara ha de ser immediat" +- +-#: config/arm/arm.c:16498 +-#, gcc-internal-format +-msgid "no low registers available for popping high registers" +-msgstr "no hi ha registres inferiors disponibles per a emmagatzemar registres superiors" +- +-#: config/arm/arm.c:16721 +-#, gcc-internal-format +-msgid "interrupt Service Routines cannot be coded in Thumb mode" +-msgstr "no es poden codificar les Rutines de Serveis d'Interrupció en el mode Thumb" +- +-#: config/arm/pe.c:158 config/mcore/mcore.c:2898 +-#, fuzzy, gcc-internal-format +-msgid "initialized variable %q+D is marked dllimport" +-msgstr "la variable iniciada \"%s\" està marcada com dllimport" +- +-#: config/arm/pe.c:167 +-#, fuzzy, gcc-internal-format +-msgid "static variable %q+D is marked dllimport" +-msgstr "la variable estàtica \"%s\" està marcada com dllimport" +- +-#: config/avr/avr.c:690 +-#, gcc-internal-format +-msgid "large frame pointer change (%d) with -mtiny-stack" +-msgstr "canvi de punter gran de marc (%d) amb -mtiny-stack" +- +-#: config/avr/avr.c:4591 +-#, gcc-internal-format +-msgid "only initialized variables can be placed into program memory area" +-msgstr "Només les variables iniciades es poden ubicar en l'àrea de memòria del programa." +- +-#: config/avr/avr.c:4635 +-#, gcc-internal-format +-msgid "%qs appears to be a misspelled interrupt handler" +-msgstr "" +- +-#: config/avr/avr.c:4643 +-#, gcc-internal-format +-msgid "%qs appears to be a misspelled signal handler" +-msgstr "" +- +-#: config/avr/avr.c:4751 +-#, gcc-internal-format +-msgid "only uninitialized variables can be placed in the .noinit section" +-msgstr "Només les variables sense inicialitzar es poden col·locar en la secció noinit" +- +-#: config/avr/avr.c:4765 +-#, fuzzy, gcc-internal-format +-msgid "MCU %qs supported for assembler only" +-msgstr "MCU \"%s\" només té suport per a ensamblador" +- +-#: config/avr/avr.h:692 +-#, gcc-internal-format +-msgid "trampolines not supported" +-msgstr "els trampolins no tenen suport" +- +-#: config/bfin/bfin.c:2259 config/m68k/m68k.c:488 +-#, fuzzy, gcc-internal-format +-msgid "-mshared-library-id=%s is not between 0 and %d" +-msgstr "-mregparm=%d no està entre 0 i %d" +- +-#: config/bfin/bfin.c:2279 +-#, fuzzy, gcc-internal-format +-msgid "-mcpu=%s is not valid" +-msgstr "\"%s\" no és un nom de fitxer vàlid" +- +-#: config/bfin/bfin.c:2315 +-#, gcc-internal-format +-msgid "-mcpu=%s has invalid silicon revision" +-msgstr "" +- +-#: config/bfin/bfin.c:2332 +-#, fuzzy, gcc-internal-format +-msgid "bf561 support is incomplete yet." +-msgstr "el paràmetre té tipus incomplet" +- +-#: config/bfin/bfin.c:2372 +-#, gcc-internal-format +-msgid "-mshared-library-id= specified without -mid-shared-library" +-msgstr "" +- +-#: config/bfin/bfin.c:2378 +-#, fuzzy, gcc-internal-format +-msgid "Can't use multiple stack checking methods together." +-msgstr "Insereix codi de revisió de la pila en el programa" +- +-#: config/bfin/bfin.c:2381 +-#, gcc-internal-format +-msgid "ID shared libraries and FD-PIC mode can't be used together." +-msgstr "" +- +-#: config/bfin/bfin.c:2386 config/m68k/m68k.c:582 +-#, gcc-internal-format +-msgid "cannot specify both -msep-data and -mid-shared-library" +-msgstr "" +- +-#: config/bfin/bfin.c:4783 +-#, fuzzy, gcc-internal-format +-msgid "multiple function type attributes specified" +-msgstr "%Jha donat un atribut «noinline» a la funció «inline» \"%D\"" +- +-#: config/bfin/bfin.c:4839 config/bfin/bfin.c:4868 config/spu/spu.c:2976 +-#, gcc-internal-format +-msgid "`%s' attribute only applies to functions" +-msgstr "l'atribut \"%s\" nomès s'aplica a funcions" +- +-#: config/bfin/bfin.c:4850 +-#, gcc-internal-format +-msgid "can't apply both longcall and shortcall attributes to the same function" +-msgstr "" +- +-#: config/bfin/bfin.c:4900 +-#, gcc-internal-format +-msgid "`%s' attribute only applies to variables" +-msgstr "l'atribut \"%s\" solament aplica a variables" +- +-#: config/bfin/bfin.c:4907 +-#, fuzzy, gcc-internal-format +-msgid "`%s' attribute cannot be specified for local variables" +-msgstr "%Jl'atribut de secció no pot ser especificat per a les variables locals" +- +-#: config/c4x/c4x-c.c:68 +-#, gcc-internal-format +-msgid "missing '(' after '#pragma %s' - ignored" +-msgstr "\"(\" faltant desprès de \"#pragma %s\" - ignorat" +- +-#: config/c4x/c4x-c.c:71 +-#, gcc-internal-format +-msgid "missing function name in '#pragma %s' - ignored" +-msgstr "nom de funcció faltant en \"#pragma %s\" - ignorat" +- +-#: config/c4x/c4x-c.c:76 +-#, gcc-internal-format +-msgid "malformed '#pragma %s' - ignored" +-msgstr "\"#pragma %s\" malformat - ignorat" +- +-#: config/c4x/c4x-c.c:78 +-#, gcc-internal-format +-msgid "missing section name in '#pragma %s' - ignored" +-msgstr "nom de secció faltant en \"#pragma %s\" - ignorat" +- +-#: config/c4x/c4x-c.c:83 +-#, gcc-internal-format +-msgid "missing ')' for '#pragma %s' - ignored" +-msgstr "\")\" faltant per a \"#pragma %s\" - ignorat" +- +-#: config/c4x/c4x-c.c:86 +-#, gcc-internal-format +-msgid "junk at end of '#pragma %s'" +-msgstr "escombraries al final de \"#pragma %s\"" +- +-#: config/c4x/c4x.c:859 +-#, gcc-internal-format +-msgid "ISR %s requires %d words of local vars, max is 32767" +-msgstr "El ISR %s requereix de %d words de variables locals,el màxim és 32767." +- +-#. This function is for retrieving a part of an instruction name for +-#. an operator, for immediate output. If that ever happens for +-#. MULT, we need to apply TARGET_MUL_BUG in the caller. Make sure +-#. we notice. +-#: config/cris/cris.c:434 +-#, gcc-internal-format +-msgid "MULT case in cris_op_str" +-msgstr "" +- +-#: config/cris/cris.c:811 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of ':' modifier" +-msgstr "operand no vàlid per al modificador \"b\"" +- +-#: config/cris/cris.c:983 +-#, gcc-internal-format +-msgid "internal error: bad register: %d" +-msgstr "error intern: registre erroni: %d" +- +-#: config/cris/cris.c:1524 +-#, gcc-internal-format +-msgid "internal error: sideeffect-insn affecting main effect" +-msgstr "error intern: sideeffect-insn afectant el efecte principal" +- +-#: config/cris/cris.c:1548 +-#, fuzzy, gcc-internal-format +-msgid "unknown cc_attr value" +-msgstr "reubicació unspec desconeguda" +- +-#. If we get here, the caller got its initial tests wrong. +-#: config/cris/cris.c:1901 +-#, gcc-internal-format +-msgid "internal error: cris_side_effect_mode_ok with bad operands" +-msgstr "error intern: cris_side_effect_mode_ok amb operands erronis" +- +-#: config/cris/cris.c:2104 +-#, gcc-internal-format +-msgid "-max-stackframe=%d is not usable, not between 0 and %d" +-msgstr "no es pot usar -max-stackframe=%d, no està entre 0 i %d" +- +-#: config/cris/cris.c:2132 +-#, gcc-internal-format +-msgid "unknown CRIS version specification in -march= or -mcpu= : %s" +-msgstr "especificació de versió CRIS desconeguda en -march= o -mcpu= : %s" +- +-#: config/cris/cris.c:2168 +-#, gcc-internal-format +-msgid "unknown CRIS cpu version specification in -mtune= : %s" +-msgstr "especificació de versió de cpu de CRIS desconeguda en -mtune= : %s" +- +-#: config/cris/cris.c:2186 +-#, gcc-internal-format +-msgid "-fPIC and -fpic are not supported in this configuration" +-msgstr "no es dóna suport a -fPIC i -fpic en aquesta configuració" +- +-#: config/cris/cris.c:2201 +-#, gcc-internal-format +-msgid "that particular -g option is invalid with -maout and -melinux" +-msgstr "aquesta opció particular -g no és vàlid amb -maout i -melinux" +- +-#: config/cris/cris.c:2414 +-#, gcc-internal-format +-msgid "Unknown src" +-msgstr "" +- +-#: config/cris/cris.c:2475 +-#, fuzzy, gcc-internal-format +-msgid "Unknown dest" +-msgstr "mode insn desconegut" +- +-#: config/cris/cris.c:2760 +-#, gcc-internal-format +-msgid "stackframe too big: %d bytes" +-msgstr "marc de pila massa grand: %d bytes" +- +-#: config/cris/cris.c:3213 config/cris/cris.c:3240 +-#, gcc-internal-format +-msgid "expand_binop failed in movsi got" +-msgstr "" +- +-#: config/cris/cris.c:3321 +-#, gcc-internal-format +-msgid "emitting PIC operand, but PIC register isn't set up" +-msgstr "emetent un operand PIC, però el registre PIC no està preparat" +- +-#. Definitions for GCC. Part of the machine description for CRIS. +-#. Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 +-#. Free Software Foundation, Inc. +-#. Contributed by Axis Communications. Written by Hans-Peter Nilsson. +-#. +-#. This file is part of GCC. +-#. +-#. GCC 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 3, or (at your option) +-#. any later version. +-#. +-#. GCC 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 GCC; see the file COPYING3. If not see +-#. . +-#. After the first "Node:" comment comes all preprocessor directives and +-#. attached declarations described in the info files, the "Using and +-#. Porting GCC" manual (uapgcc), in the same order as found in the "Target +-#. macros" section in the gcc-2.9x CVS edition of 2000-03-17. FIXME: Not +-#. really, but needs an update anyway. +-#. +-#. There is no generic copy-of-uapgcc comment, you'll have to see uapgcc +-#. for that. If applicable, there is a CRIS-specific comment. The order +-#. of macro definitions follow the order in the manual. Every section in +-#. the manual (node in the info pages) has an introductory `Node: +-#. ' comment. If no macros are defined for a section, only +-#. the section-comment is present. +-#. Note that other header files (e.g. config/elfos.h, config/linux.h, +-#. config/cris/linux.h and config/cris/aout.h) are responsible for lots of +-#. settings not repeated below. This file contains general CRIS +-#. definitions and definitions for the cris-*-elf subtarget. +-#. We don't want to use gcc_assert for everything, as that can be +-#. compiled out. +-#: config/cris/cris.h:43 +-#, gcc-internal-format +-msgid "CRIS-port assertion failed: " +-msgstr "" +- +-#. Node: Caller Saves +-#. (no definitions) +-#. Node: Function entry +-#. See cris.c for TARGET_ASM_FUNCTION_PROLOGUE and +-#. TARGET_ASM_FUNCTION_EPILOGUE. +-#. Node: Profiling +-#: config/cris/cris.h:868 +-#, gcc-internal-format +-msgid "no FUNCTION_PROFILER for CRIS" +-msgstr "no FUNCTION_PROFILER per a CRIS" +- +-#: config/crx/crx.h:354 +-#, fuzzy, gcc-internal-format +-msgid "Profiler support for CRX" +-msgstr "suport per a function_profiler per a MMIX" +- +-#: config/crx/crx.h:365 +-#, fuzzy, gcc-internal-format +-msgid "Trampoline support for CRX" +-msgstr "els trampolins no tenen suport" +- +-#: config/frv/frv.c:8622 +-#, gcc-internal-format +-msgid "accumulator is not a constant integer" +-msgstr "el acumulador no és una constant entera" +- +-#: config/frv/frv.c:8627 +-#, gcc-internal-format +-msgid "accumulator number is out of bounds" +-msgstr "" +- +-#: config/frv/frv.c:8638 +-#, fuzzy, gcc-internal-format +-msgid "inappropriate accumulator for %qs" +-msgstr "acumulador inadequat per a \"%s\"" +- +-#: config/frv/frv.c:8715 +-#, fuzzy, gcc-internal-format +-msgid "invalid IACC argument" +-msgstr "argument de tipus no vàlid" +- +-#: config/frv/frv.c:8738 +-#, fuzzy, gcc-internal-format +-msgid "%qs expects a constant argument" +-msgstr "l'atribut \"%s\" espera una constant com argument" +- +-#: config/frv/frv.c:8743 +-#, fuzzy, gcc-internal-format +-msgid "constant argument out of range for %qs" +-msgstr "l'argument constant està fora de límits per a \"%s\"" +- +-#: config/frv/frv.c:9224 +-#, gcc-internal-format +-msgid "media functions are not available unless -mmedia is used" +-msgstr "" +- +-#: config/frv/frv.c:9236 +-#, gcc-internal-format +-msgid "this media function is only available on the fr500" +-msgstr "" +- +-#: config/frv/frv.c:9264 +-#, gcc-internal-format +-msgid "this media function is only available on the fr400 and fr550" +-msgstr "" +- +-#: config/frv/frv.c:9283 +-#, gcc-internal-format +-msgid "this builtin function is only available on the fr405 and fr450" +-msgstr "" +- +-#: config/frv/frv.c:9292 +-#, gcc-internal-format +-msgid "this builtin function is only available on the fr500 and fr550" +-msgstr "" +- +-#: config/frv/frv.c:9304 +-#, gcc-internal-format +-msgid "this builtin function is only available on the fr450" +-msgstr "" +- +-#: config/h8300/h8300.c:330 +-#, gcc-internal-format +-msgid "-ms2600 is used without -ms" +-msgstr "es va usar -ms2600 sense -ms" +- +-#: config/h8300/h8300.c:336 +-#, gcc-internal-format +-msgid "-mn is used without -mh or -ms" +-msgstr "es va usar -mn sense -mh o -ms" +- +-#: config/i386/host-cygwin.c:64 +-#, fuzzy, gcc-internal-format +-msgid "can't extend PCH file: %m" +-msgstr "no es pot llegir el fitxer PCH: %m" +- +-#: config/i386/host-cygwin.c:75 +-#, fuzzy, gcc-internal-format +-msgid "can't set position in PCH file: %m" +-msgstr "no es pot crear el fitxer d'informació de \"repository\" \"%s\"" +- +-#: config/i386/i386.c:2133 config/i386/i386.c:2333 +-#, fuzzy, gcc-internal-format +-msgid "bad value (%s) for -mtune= switch" +-msgstr "valor erroni (%s) per a l'opció -mcpu=" +- +-#: config/i386/i386.c:2174 +-#, fuzzy, gcc-internal-format +-msgid "bad value (%s) for -mstringop-strategy= switch" +-msgstr "valor erroni (%s) per a l'opció -mcpu=" +- +-#: config/i386/i386.c:2177 +-#, gcc-internal-format +-msgid "-mtune=x86-64 is deprecated. Use -mtune=k8 or -mtune=generic instead as appropriate." +-msgstr "" +- +-#: config/i386/i386.c:2186 +-#, fuzzy, gcc-internal-format +-msgid "generic CPU can be used only for -mtune= switch" +-msgstr "valor erroni (%s) per a l'opció -mcpu=" +- +-#: config/i386/i386.c:2188 config/i386/i386.c:2297 config/mt/mt.c:804 +-#, gcc-internal-format +-msgid "bad value (%s) for -march= switch" +-msgstr "valor erroni (%s) per a l'opció -march=" +- +-#: config/i386/i386.c:2199 +-#, fuzzy, gcc-internal-format +-msgid "code model %s does not support PIC mode" +-msgstr "el model de codi %s no té suport en el mode PIC" +- +-#: config/i386/i386.c:2205 config/sparc/sparc.c:725 +-#, gcc-internal-format +-msgid "bad value (%s) for -mcmodel= switch" +-msgstr "valor erroni (%s) per a l'opció -mcmodel=" +- +-#: config/i386/i386.c:2228 +-#, gcc-internal-format +-msgid "bad value (%s) for -masm= switch" +-msgstr "valor erroni (%s) per a l'opció -masm=" +- +-#: config/i386/i386.c:2231 +-#, fuzzy, gcc-internal-format +-msgid "code model %qs not supported in the %s bit mode" +-msgstr "el model de codi %s no té suport en el mode %s bit" +- +-#: config/i386/i386.c:2234 +-#, gcc-internal-format +-msgid "%i-bit mode not compiled in" +-msgstr "no està compilat el mode %i-bit" +- +-#: config/i386/i386.c:2245 config/i386/i386.c:2319 +-#, fuzzy, gcc-internal-format +-msgid "CPU you selected does not support x86-64 instruction set" +-msgstr "el CPU objectiu no té suport les instruccions THUMB" +- +-#: config/i386/i386.c:2351 +-#, gcc-internal-format +-msgid "-mregparm is ignored in 64-bit mode" +-msgstr "" +- +-#: config/i386/i386.c:2354 +-#, gcc-internal-format +-msgid "-mregparm=%d is not between 0 and %d" +-msgstr "-mregparm=%d no està entre 0 i %d" +- +-#: config/i386/i386.c:2366 +-#, gcc-internal-format +-msgid "-malign-loops is obsolete, use -falign-loops" +-msgstr "-malign-loops és obsolet, usi -falign-loops" +- +-#: config/i386/i386.c:2371 config/i386/i386.c:2384 config/i386/i386.c:2397 +-#, gcc-internal-format +-msgid "-malign-loops=%d is not between 0 and %d" +-msgstr "-malign-loops=%d no està entre 0 i %d" +- +-#: config/i386/i386.c:2379 +-#, gcc-internal-format +-msgid "-malign-jumps is obsolete, use -falign-jumps" +-msgstr "-malign-jumps és obsolet, usi -falign-jumps" +- +-#: config/i386/i386.c:2392 +-#, gcc-internal-format +-msgid "-malign-functions is obsolete, use -falign-functions" +-msgstr "-malign-functions és obsolet, usi -falign-functions" +- +-#: config/i386/i386.c:2425 +-#, gcc-internal-format +-msgid "-mbranch-cost=%d is not between 0 and 5" +-msgstr "-mbranch-cost=%d no està entre 0 i 5" +- +-#: config/i386/i386.c:2433 +-#, gcc-internal-format +-msgid "-mlarge-data-threshold=%d is negative" +-msgstr "" +- +-#: config/i386/i386.c:2447 +-#, gcc-internal-format +-msgid "bad value (%s) for -mtls-dialect= switch" +-msgstr "valor erroni (%s) per a l'opció -mtls-dialect=" +- +-#: config/i386/i386.c:2455 +-#, gcc-internal-format +-msgid "pc%d is not valid precision setting (32, 64 or 80)" +-msgstr "" +- +-#: config/i386/i386.c:2471 +-#, fuzzy, gcc-internal-format +-msgid "-mrtd is ignored in 64bit mode" +-msgstr "la convenció de crides -mrtd no té suport en el mode 64 bit" +- +-#: config/i386/i386.c:2560 +-#, gcc-internal-format +-msgid "-mpreferred-stack-boundary=%d is not between %d and 12" +-msgstr "-mpreferred-stack-boundary=%d no està entre %d i 12" +- +-#: config/i386/i386.c:2569 +-#, gcc-internal-format +-msgid "-msseregparm used without SSE enabled" +-msgstr "" +- +-#: config/i386/i386.c:2580 config/i386/i386.c:2591 +-#, gcc-internal-format +-msgid "SSE instruction set disabled, using 387 arithmetics" +-msgstr "el conjunt d'instruccions SSE està desactivat, usant l'aritmètica 387" +- +-#: config/i386/i386.c:2596 +-#, gcc-internal-format +-msgid "387 instruction set disabled, using SSE arithmetics" +-msgstr "el conjunt d'instruccions 387 està desactivat, usant l'aritmètica SSE" +- +-#: config/i386/i386.c:2603 +-#, gcc-internal-format +-msgid "bad value (%s) for -mfpmath= switch" +-msgstr "valor erroni (%s) per a l'opció -mfpmath=" +- +-#: config/i386/i386.c:2616 +-#, gcc-internal-format +-msgid "unknown vectorization library ABI type (%s) for -mveclibabi= switch" +-msgstr "" +- +-#: config/i386/i386.c:2635 +-#, gcc-internal-format +-msgid "unwind tables currently require either a frame pointer or -maccumulate-outgoing-args for correctness" +-msgstr "" +- +-#: config/i386/i386.c:3022 config/i386/i386.c:3075 +-#, fuzzy, gcc-internal-format +-msgid "fastcall and regparm attributes are not compatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/i386/i386.c:3029 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute requires an integer constant argument" +-msgstr "l'atribut \"%s\" requereix una constant entera com argument" +- +-#: config/i386/i386.c:3035 +-#, fuzzy, gcc-internal-format +-msgid "argument to %qs attribute larger than %d" +-msgstr "l'argument per a l'atribut \"%s\" és més gran que %d" +- +-#: config/i386/i386.c:3045 +-#, gcc-internal-format +-msgid "%s functions limited to %d register parameters" +-msgstr "" +- +-#: config/i386/i386.c:3067 config/i386/i386.c:3102 +-#, fuzzy, gcc-internal-format +-msgid "fastcall and cdecl attributes are not compatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/i386/i386.c:3071 +-#, fuzzy, gcc-internal-format +-msgid "fastcall and stdcall attributes are not compatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/i386/i386.c:3085 config/i386/i386.c:3098 +-#, fuzzy, gcc-internal-format +-msgid "stdcall and cdecl attributes are not compatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/i386/i386.c:3089 +-#, fuzzy, gcc-internal-format +-msgid "stdcall and fastcall attributes are not compatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/i386/i386.c:3236 +-#, gcc-internal-format +-msgid "Calling %qD with attribute sseregparm without SSE/SSE2 enabled" +-msgstr "" +- +-#: config/i386/i386.c:3239 +-#, gcc-internal-format +-msgid "Calling %qT with attribute sseregparm without SSE/SSE2 enabled" +-msgstr "" +- +-#: config/i386/i386.c:3925 +-#, gcc-internal-format +-msgid "SSE register return with SSE disabled" +-msgstr "" +- +-#: config/i386/i386.c:3931 +-#, gcc-internal-format +-msgid "SSE register argument with SSE disabled" +-msgstr "" +- +-#: config/i386/i386.c:3947 +-#, gcc-internal-format +-msgid "x87 register return with x87 disabled" +-msgstr "" +- +-#: config/i386/i386.c:4265 +-#, gcc-internal-format +-msgid "SSE vector argument without SSE enabled changes the ABI" +-msgstr "" +- +-#: config/i386/i386.c:4283 +-#, gcc-internal-format +-msgid "MMX vector argument without MMX enabled changes the ABI" +-msgstr "" +- +-#: config/i386/i386.c:4810 +-#, gcc-internal-format +-msgid "SSE vector return without SSE enabled changes the ABI" +-msgstr "" +- +-#: config/i386/i386.c:4820 +-#, gcc-internal-format +-msgid "MMX vector return without MMX enabled changes the ABI" +-msgstr "" +- +-#: config/i386/i386.c:6171 +-#, fuzzy, gcc-internal-format +-msgid "-mstackrealign ignored for nested functions" +-msgstr "ISO C prohibeix les funcions niades" +- +-#: config/i386/i386.c:6173 +-#, fuzzy, gcc-internal-format +-msgid "%s not supported for nested functions" +-msgstr "No donar suport per a funcions internes MMX" +- +-#: config/i386/i386.c:8576 +-#, gcc-internal-format +-msgid "extended registers have no high halves" +-msgstr "els registres estesos no tenen meitats superiors" +- +-#: config/i386/i386.c:8591 +-#, gcc-internal-format +-msgid "unsupported operand size for extended register" +-msgstr "mida d'operand sense suport per al registre estès" +- +-#: config/i386/i386.c:19610 +-#, fuzzy, gcc-internal-format +-msgid "the third argument must be a 4-bit immediate" +-msgstr "l'argument 3 ha de ser una literal sense signe de 4-bit" +- +-#: config/i386/i386.c:19614 +-#, fuzzy, gcc-internal-format +-msgid "the third argument must be an 8-bit immediate" +-msgstr "l'argument 1 ha de ser una literal amb signe de 5-bit" +- +-#: config/i386/i386.c:19836 +-#, fuzzy, gcc-internal-format +-msgid "last argument must be an immediate" +-msgstr "la màscara ha de ser immediat" +- +-#: config/i386/i386.c:19963 +-#, fuzzy, gcc-internal-format +-msgid "the second argument must be a 4-bit immediate" +-msgstr "l'argument 3 ha de ser una literal sense signe de 4-bit" +- +-#: config/i386/i386.c:20209 +-#, fuzzy, gcc-internal-format +-msgid "the fifth argument must be a 8-bit immediate" +-msgstr "l'argument 1 ha de ser una literal amb signe de 5-bit" +- +-#: config/i386/i386.c:20304 +-#, fuzzy, gcc-internal-format +-msgid "the third argument must be a 8-bit immediate" +-msgstr "l'argument 1 ha de ser una literal amb signe de 5-bit" +- +-#: config/i386/i386.c:20374 config/rs6000/rs6000.c:8133 +-#, gcc-internal-format +-msgid "selector must be an integer constant in the range 0..%wi" +-msgstr "" +- +-#: config/i386/i386.c:20774 config/i386/i386.c:20970 +-#, gcc-internal-format +-msgid "shift must be an immediate" +-msgstr "el desplaçament ha de ser immediat" +- +-#: config/i386/i386.c:21033 config/i386/i386.c:21075 +-#, fuzzy, gcc-internal-format +-msgid "index mask must be an immediate" +-msgstr "la màscara ha de ser immediat" +- +-#: config/i386/i386.c:21038 config/i386/i386.c:21080 +-#, fuzzy, gcc-internal-format +-msgid "length mask must be an immediate" +-msgstr "la màscara ha de ser immediat" +- +-#: config/i386/i386.c:22525 config/rs6000/rs6000.c:19666 +-#, fuzzy, gcc-internal-format +-msgid "%qs incompatible attribute ignored" +-msgstr "s'ignora l'atribut \"%s\"" +- +-#: config/i386/winnt-cxx.c:71 config/sh/symbian.c:172 +-#, gcc-internal-format +-msgid "definition of static data member %q+D of dllimport'd class" +-msgstr "" +- +-#: config/i386/winnt.c:58 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute only applies to variables" +-msgstr "l'atribut \"%s\" solament aplica a variables" +- +-#: config/i386/winnt.c:80 +-#, gcc-internal-format +-msgid "%qs attribute applies only to initialized variables with external linkage" +-msgstr "" +- +-#: config/i386/winnt.c:297 +-#, fuzzy, gcc-internal-format +-msgid "%q+D:'selectany' attribute applies only to initialized objects" +-msgstr "%Jl'atribut \"%E\" s'aplica solament a funcions" +- +-#: config/i386/winnt.c:445 +-#, fuzzy, gcc-internal-format +-msgid "%q+D causes a section type conflict" +-msgstr "%s causa un conflicte de tipus de secció" +- +-#: config/i386/cygming.h:162 +-#, gcc-internal-format +-msgid "-f%s ignored for target (all code is position independent)" +-msgstr "s'ignora -f%s per a l'objectiu (tot el codi és independent de posició)" +- +-#: config/i386/djgpp.h:180 +-#, gcc-internal-format +-msgid "-mbnu210 is ignored (option is obsolete)" +-msgstr "s'ignora -mbnu210 (l'opció és obsoleta)." +- +-#: config/i386/i386-interix.h:256 +-#, fuzzy, gcc-internal-format +-msgid "ms-bitfields not supported for objc" +-msgstr "-f%s no té suport: ignorat" +- +-#: config/ia64/ia64-c.c:51 +-#, gcc-internal-format +-msgid "malformed #pragma builtin" +-msgstr "secció #pragma builtin malformada" +- +-#: config/ia64/ia64.c:554 config/m32r/m32r.c:373 +-#, fuzzy, gcc-internal-format +-msgid "invalid argument of %qs attribute" +-msgstr "no vàlid argument per a l'atribut \"%s\"" +- +-#: config/ia64/ia64.c:566 +-#, gcc-internal-format +-msgid "%Jan address area attribute cannot be specified for local variables" +-msgstr "%Jno es pot especificar un atribut d'àrea de dades per a variables locals" +- +-#: config/ia64/ia64.c:573 +-#, fuzzy, gcc-internal-format +-msgid "address area of %q+D conflicts with previous declaration" +-msgstr "%Jl'àrea d'adreça de \"%s\" és en conflicte amb una declaració prèvia" +- +-#: config/ia64/ia64.c:580 +-#, gcc-internal-format +-msgid "%Jaddress area attribute cannot be specified for functions" +-msgstr "%Jno es pot especificar un atribut d'àrea d'adreça per a funcions" +- +-#: config/ia64/ia64.c:5126 config/pa/pa.c:347 config/spu/spu.c:3875 +-#, gcc-internal-format +-msgid "value of -mfixed-range must have form REG1-REG2" +-msgstr "el valor de -mfixed-range ha de ser de la forma REG1-REG2" +- +-#: config/ia64/ia64.c:5153 config/pa/pa.c:374 config/spu/spu.c:3901 +-#, gcc-internal-format +-msgid "%s-%s is an empty range" +-msgstr "%s-%s és un rang buit" +- +-#: config/ia64/ia64.c:5181 +-#, fuzzy, gcc-internal-format +-msgid "bad value %<%s%> for -mtls-size= switch" +-msgstr "valor erroni (%s) per a l'opció -mtls-size=" +- +-#: config/ia64/ia64.c:5209 +-#, fuzzy, gcc-internal-format +-msgid "bad value %<%s%> for -mtune= switch" +-msgstr "valor erroni (%s) per a l'opció -mcpu=" +- +-#: config/ia64/ia64.c:5228 +-#, gcc-internal-format +-msgid "not yet implemented: latency-optimized inline square root" +-msgstr "" +- +-#: config/ia64/ia64.c:9950 +-#, fuzzy, gcc-internal-format +-msgid "version attribute is not a string" +-msgstr "l'argument de l'atribut \"%s\" no es una cadena constant" +- +-#: config/iq2000/iq2000.c:1812 +-#, fuzzy, gcc-internal-format +-msgid "gp_offset (%ld) or end_offset (%ld) is less than zero" +-msgstr "gp_offset (%ld) o end_offset (%ld) és menys de zero" +- +-#: config/iq2000/iq2000.c:2583 +-#, fuzzy, gcc-internal-format +-msgid "argument %qd is not a constant" +-msgstr "l'argument \"%d\" no és una constant" +- +-#: config/iq2000/iq2000.c:2885 config/mt/mt.c:349 config/xtensa/xtensa.c:2118 +-#, gcc-internal-format +-msgid "PRINT_OPERAND_ADDRESS, null pointer" +-msgstr "PRINT_OPERAND_ADDRESS, punter nul" +- +-#: config/iq2000/iq2000.c:3040 +-#, fuzzy, gcc-internal-format +-msgid "PRINT_OPERAND: Unknown punctuation '%c'" +-msgstr "PRINT_OPERAND: puntuació desconeguda \"%c\"" +- +-#: config/iq2000/iq2000.c:3049 config/xtensa/xtensa.c:1972 +-#, gcc-internal-format +-msgid "PRINT_OPERAND null pointer" +-msgstr "PRINT_OPERAND punter nul" +- +-#: config/m32c/m32c-pragma.c:63 +-#, fuzzy, gcc-internal-format +-msgid "junk at end of #pragma GCC memregs [0..16]" +-msgstr "escombraries al final de #pragma %s" +- +-#: config/m32c/m32c-pragma.c:70 +-#, gcc-internal-format +-msgid "#pragma GCC memregs must precede any function decls" +-msgstr "" +- +-#: config/m32c/m32c-pragma.c:81 config/m32c/m32c-pragma.c:88 +-#, gcc-internal-format +-msgid "#pragma GCC memregs takes a number [0..16]" +-msgstr "" +- +-#: config/m32c/m32c.c:416 +-#, fuzzy, gcc-internal-format +-msgid "invalid target memregs value '%d'" +-msgstr "valor de --param \"%s\" no vàlid" +- +-#: config/m32c/m32c.c:2759 +-#, fuzzy, gcc-internal-format +-msgid "`%s' attribute is not supported for R8C target" +-msgstr "l'atribut \"%s\" no té suport en aquesta plataforma" +- +-#: config/m32c/m32c.c:2767 +-#, fuzzy, gcc-internal-format +-msgid "`%s' attribute applies only to functions" +-msgstr "%Jl'atribut \"%E\" s'aplica solament a funcions" +- +-#: config/m32c/m32c.c:2775 +-#, gcc-internal-format +-msgid "`%s' attribute argument not an integer constant" +-msgstr "l'argument de l'atribut \"%s\" no és una cadena entera" +- +-#: config/m32c/m32c.c:2784 +-#, fuzzy, gcc-internal-format +-msgid "`%s' attribute argument should be between 18 to 255" +-msgstr "l'argument de l'atribut \"%s\" no és una cadena entera" +- +-#: config/m68hc11/m68hc11.c:279 +-#, gcc-internal-format +-msgid "-f%s ignored for 68HC11/68HC12 (not supported)" +-msgstr "s'ignora -f%s per a 68HC11/68HC12 (sense suport)" +- +-#: config/m68hc11/m68hc11.c:1240 +-#, fuzzy, gcc-internal-format +-msgid "% and % attributes are not compatible, ignoring %" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/m68hc11/m68hc11.c:1247 +-#, fuzzy, gcc-internal-format +-msgid "% attribute is already used" +-msgstr "l'atribut \"trap\" ja està en ús" +- +-#: config/m68k/m68k.c:533 +-#, fuzzy, gcc-internal-format +-msgid "-mcpu=%s conflicts with -march=%s" +-msgstr "l'opció -mcpu=%s genera conflictes amb l'opció -march=" +- +-#: config/m68k/m68k.c:594 +-#, fuzzy, gcc-internal-format +-msgid "-mpcrel -fPIC is not currently supported on selected cpu" +-msgstr " -fPIC actualment no té suport en el 68000 o 68010\n" +- +-#: config/m68k/m68k.c:656 +-#, fuzzy, gcc-internal-format +-msgid "-falign-labels=%d is not supported" +-msgstr "els trampolins no tenen suport" +- +-#: config/m68k/m68k.c:661 +-#, fuzzy, gcc-internal-format +-msgid "-falign-loops=%d is not supported" +-msgstr "-malign-loops=%d no està entre 0 i %d" +- +-#: config/m68k/m68k.c:748 +-#, fuzzy, gcc-internal-format +-msgid "multiple interrupt attributes not allowed" +-msgstr "%Jno es permet un atribut de secció per a \"%D\"" +- +-#: config/m68k/m68k.c:755 +-#, gcc-internal-format +-msgid "interrupt_thread is available only on fido" +-msgstr "" +- +-#: config/m68k/m68k.c:1072 config/rs6000/rs6000.c:15014 +-#, fuzzy, gcc-internal-format +-msgid "stack limit expression is not supported" +-msgstr "no es dóna suport a l'expressió del límit de la pila" +- +-#: config/mips/mips.c:1163 +-#, gcc-internal-format +-msgid "%qs cannot have both % and % attributes" +-msgstr "" +- +-#: config/mips/mips.c:1185 config/mips/mips.c:1188 +-#, gcc-internal-format +-msgid "%qs redeclared with conflicting %qs attributes" +-msgstr "" +- +-#: config/mips/mips.c:2348 +-#, gcc-internal-format +-msgid "MIPS16 TLS" +-msgstr "" +- +-#: config/mips/mips.c:5439 +-#, fuzzy, gcc-internal-format +-msgid "cannot handle inconsistent calls to %qs" +-msgstr "no es poden manejar les crides inconsistents a \"%s\"" +- +-#: config/mips/mips.c:10258 +-#, fuzzy, gcc-internal-format +-msgid "invalid argument to built-in function" +-msgstr "massa arguments per a la funció" +- +-#: config/mips/mips.c:10530 +-#, fuzzy, gcc-internal-format +-msgid "built-in function %qs not supported for MIPS16" +-msgstr "no se suporta actualment la funció interna \"%s\"" +- +-#: config/mips/mips.c:11679 config/mips/mips.c:12065 +-#, gcc-internal-format +-msgid "MIPS16 PIC" +-msgstr "" +- +-#: config/mips/mips.c:11682 +-#, gcc-internal-format +-msgid "hard-float MIPS16 code for ABIs other than o32 and o64" +-msgstr "" +- +-#: config/mips/mips.c:11810 +-#, fuzzy, gcc-internal-format +-msgid "CPU names must be lower case" +-msgstr "el nom de cpu ha de estar en minúscules" +- +-#: config/mips/mips.c:11938 +-#, gcc-internal-format +-msgid "%<-%s%> conflicts with the other architecture options, which specify a %s processor" +-msgstr "" +- +-#: config/mips/mips.c:11954 +-#, gcc-internal-format +-msgid "%<-march=%s%> is not compatible with the selected ABI" +-msgstr "" +- +-#: config/mips/mips.c:11969 +-#, fuzzy, gcc-internal-format +-msgid "%<-mgp64%> used with a 32-bit processor" +-msgstr "s'utilitza -mgp64 amb una ABI de 32-bit" +- +-#: config/mips/mips.c:11971 +-#, fuzzy, gcc-internal-format +-msgid "%<-mgp32%> used with a 64-bit ABI" +-msgstr "s'utilitza -mgp32 amb una ABI de 64-bit" +- +-#: config/mips/mips.c:11973 +-#, fuzzy, gcc-internal-format +-msgid "%<-mgp64%> used with a 32-bit ABI" +-msgstr "s'utilitza -mgp64 amb una ABI de 32-bit" +- +-#: config/mips/mips.c:11989 config/mips/mips.c:11991 config/mips/mips.c:12058 +-#, gcc-internal-format +-msgid "unsupported combination: %s" +-msgstr "combinació sense suport: %s" +- +-#: config/mips/mips.c:11995 +-#, gcc-internal-format +-msgid "%<-mgp32%> and %<-mfp64%> can only be combined if the target supports the mfhc1 and mthc1 instructions" +-msgstr "" +- +-#: config/mips/mips.c:11998 +-#, gcc-internal-format +-msgid "%<-mgp32%> and %<-mfp64%> can only be combined when using the o32 ABI" +-msgstr "" +- +-#: config/mips/mips.c:12052 +-#, fuzzy, gcc-internal-format +-msgid "the %qs architecture does not support branch-likely instructions" +-msgstr "el CPU objectiu no té suport les instruccions THUMB" +- +-#: config/mips/mips.c:12098 +-#, gcc-internal-format +-msgid "%<-mno-gpopt%> needs %<-mexplicit-relocs%>" +-msgstr "" +- +-#: config/mips/mips.c:12106 config/mips/mips.c:12109 +-#, gcc-internal-format +-msgid "cannot use small-data accesses for %qs" +-msgstr "" +- +-#: config/mips/mips.c:12123 +-#, gcc-internal-format +-msgid "%<-mips3d%> requires %<-mpaired-single%>" +-msgstr "" +- +-#: config/mips/mips.c:12132 +-#, fuzzy, gcc-internal-format +-msgid "%qs must be used with %qs" +-msgstr "-frepo ha de ser usat amb -c" +- +-#: config/mips/mips.c:12139 +-#, fuzzy, gcc-internal-format +-msgid "the %qs architecture does not support paired-single instructions" +-msgstr "el CPU objectiu no té suport les instruccions THUMB" +- +-#. Output assembler code to FILE to increment profiler label # LABELNO +-#. for profiling a function entry. +-#: config/mips/mips.h:2110 +-#, gcc-internal-format +-msgid "mips16 function profiling" +-msgstr "anàlisi de perfil de les funcions mips16" +- +-#: config/mmix/mmix.c:226 +-#, gcc-internal-format +-msgid "-f%s not supported: ignored" +-msgstr "-f%s no té suport: ignorat" +- +-#: config/mmix/mmix.c:674 +-#, fuzzy, gcc-internal-format +-msgid "support for mode %qs" +-msgstr "no hi ha tipus de dades pel mode \"%s\"" +- +-#: config/mmix/mmix.c:688 +-#, gcc-internal-format +-msgid "too large function value type, needs %d registers, have only %d registers for this" +-msgstr "el valor del tipus de la funció és massa gran, necessita %d registres, només es tenen %d registres per a això" +- +-#: config/mmix/mmix.c:858 +-#, gcc-internal-format +-msgid "function_profiler support for MMIX" +-msgstr "suport per a function_profiler per a MMIX" +- +-#: config/mmix/mmix.c:880 +-#, gcc-internal-format +-msgid "MMIX Internal: Last named vararg would not fit in a register" +-msgstr "MMIX intern: L'últim vararg nomenat no conté en un registre" +- +-#: config/mmix/mmix.c:1495 config/mmix/mmix.c:1519 config/mmix/mmix.c:1635 +-#, gcc-internal-format +-msgid "MMIX Internal: Bad register: %d" +-msgstr "MMIX intern: registre erroni: %d" +- +-#. Presumably there's a missing case above if we get here. +-#: config/mmix/mmix.c:1627 +-#, fuzzy, gcc-internal-format +-msgid "MMIX Internal: Missing %qc case in mmix_print_operand" +-msgstr "MMIX intern: «case» \"%c\" faltant en mmix_print_operand" +- +-#: config/mmix/mmix.c:1913 +-#, fuzzy, gcc-internal-format +-msgid "stack frame not a multiple of 8 bytes: %wd" +-msgstr "el marc de pila no és un múltiple de 8 octets: %d" +- +-#: config/mmix/mmix.c:2149 +-#, fuzzy, gcc-internal-format +-msgid "stack frame not a multiple of octabyte: %wd" +-msgstr "el marc de pila no és un múltiple de octabyte: %d" +- +-#: config/mmix/mmix.c:2489 config/mmix/mmix.c:2553 +-#, gcc-internal-format +-msgid "MMIX Internal: %s is not a shiftable int" +-msgstr "MMIX intern: %s no és un enter desplaçable" +- +-#: config/mt/mt.c:312 +-#, gcc-internal-format +-msgid "info pointer NULL" +-msgstr "" +- +-#: config/pa/pa.c:479 +-#, fuzzy, gcc-internal-format +-msgid "PIC code generation is not supported in the portable runtime model" +-msgstr "La generació de codi PIC no té suport en el model portable de temps d'execució\n" +- +-#: config/pa/pa.c:484 +-#, fuzzy, gcc-internal-format +-msgid "PIC code generation is not compatible with fast indirect calls" +-msgstr "La generació de codi PIC no és compatible amb les crides ràpides indirectes\n" +- +-#: config/pa/pa.c:489 +-#, gcc-internal-format +-msgid "-g is only supported when using GAS on this processor," +-msgstr "-g només té suport quan s'usa GAS en aquest processador," +- +-#: config/pa/pa.c:490 +-#, gcc-internal-format +-msgid "-g option disabled" +-msgstr "opció -g desactivada" +- +-#: config/pa/pa.c:8285 +-#, gcc-internal-format +-msgid "alignment (%u) for %s exceeds maximum alignment for global common data. Using %u" +-msgstr "" +- +-#: config/pa/pa-hpux11.h:84 +-#, gcc-internal-format +-msgid "-munix=98 option required for C89 Amendment 1 features.\n" +-msgstr "" +- +-#: config/rs6000/host-darwin.c:61 +-#, gcc-internal-format +-msgid "Segmentation Fault (code)" +-msgstr "" +- +-#: config/rs6000/host-darwin.c:131 +-#, gcc-internal-format +-msgid "Segmentation Fault" +-msgstr "" +- +-#: config/rs6000/host-darwin.c:145 +-#, gcc-internal-format +-msgid "While setting up signal stack: %m" +-msgstr "" +- +-#: config/rs6000/host-darwin.c:151 +-#, gcc-internal-format +-msgid "While setting up signal handler: %m" +-msgstr "" +- +-#. Handle the machine specific pragma longcall. Its syntax is +-#. +-#. # pragma longcall ( TOGGLE ) +-#. +-#. where TOGGLE is either 0 or 1. +-#. +-#. rs6000_default_long_calls is set to the value of TOGGLE, changing +-#. whether or not new function declarations receive a longcall +-#. attribute by default. +-#: config/rs6000/rs6000-c.c:52 +-#, gcc-internal-format +-msgid "ignoring malformed #pragma longcall" +-msgstr "ignorant el #pragma longcall malformats" +- +-#: config/rs6000/rs6000-c.c:65 +-#, gcc-internal-format +-msgid "missing open paren" +-msgstr "\"(\" faltant" +- +-#: config/rs6000/rs6000-c.c:67 +-#, gcc-internal-format +-msgid "missing number" +-msgstr "falta valor" +- +-#: config/rs6000/rs6000-c.c:69 +-#, gcc-internal-format +-msgid "missing close paren" +-msgstr "\")\" faltant" +- +-#: config/rs6000/rs6000-c.c:72 +-#, gcc-internal-format +-msgid "number must be 0 or 1" +-msgstr "" +- +-#: config/rs6000/rs6000-c.c:75 +-#, gcc-internal-format +-msgid "junk at end of #pragma longcall" +-msgstr "escombraries al final de #pragma longcall" +- +-#: config/rs6000/rs6000-c.c:2550 +-#, fuzzy, gcc-internal-format +-msgid "passing arg %d of %qE discards qualifiers frompointer target type" +-msgstr "la conversió de \"%T\" a \"%T\" descarta els qualificadors del tipus de la destinació del punter" +- +-#: config/rs6000/rs6000-c.c:2593 +-#, fuzzy, gcc-internal-format +-msgid "invalid parameter combination for AltiVec intrinsic" +-msgstr "registre no vàlid en la instrucció" +- +-#: config/rs6000/rs6000.c:1294 +-#, gcc-internal-format +-msgid "-mdynamic-no-pic overrides -fpic or -fPIC" +-msgstr "" +- +-#: config/rs6000/rs6000.c:1305 +-#, fuzzy, gcc-internal-format +-msgid "-m64 requires PowerPC64 architecture, enabling" +-msgstr "-maix64 requereix que l'arquitectura PowerPC64 romangui activada" +- +-#: config/rs6000/rs6000.c:1528 +-#, gcc-internal-format +-msgid "-mmultiple is not supported on little endian systems" +-msgstr "-mmultiple no té suport en sistemes little endian" +- +-#: config/rs6000/rs6000.c:1535 +-#, gcc-internal-format +-msgid "-mstring is not supported on little endian systems" +-msgstr "-mstringe no té suport en sistemes little endian" +- +-#: config/rs6000/rs6000.c:1549 +-#, gcc-internal-format +-msgid "unknown -mdebug-%s switch" +-msgstr "interruptor -mdebug-%s desconegut" +- +-#: config/rs6000/rs6000.c:1561 +-#, gcc-internal-format +-msgid "unknown -mtraceback arg %qs; expecting %, % or %" +-msgstr "" +- +-#: config/rs6000/rs6000.c:1973 +-#, fuzzy, gcc-internal-format +-msgid "unknown -m%s= option specified: '%s'" +-msgstr "opció -misel= especificada desconeguda: \"%s\"" +- +-#: config/rs6000/rs6000.c:2186 +-#, gcc-internal-format +-msgid "not configured for ABI: '%s'" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2199 +-#, gcc-internal-format +-msgid "Using darwin64 ABI" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2204 +-#, gcc-internal-format +-msgid "Using old darwin ABI" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2211 +-#, gcc-internal-format +-msgid "Using IBM extended precision long double" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2217 +-#, gcc-internal-format +-msgid "Using IEEE extended precision long double" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2222 +-#, gcc-internal-format +-msgid "unknown ABI specified: '%s'" +-msgstr "ABI especificada desconeguda: \"%s\"" +- +-#: config/rs6000/rs6000.c:2249 +-#, fuzzy, gcc-internal-format +-msgid "invalid option for -mfloat-gprs: '%s'" +-msgstr "opció no vàlida \"-mshort-data-%s\"" +- +-#: config/rs6000/rs6000.c:2259 +-#, gcc-internal-format +-msgid "Unknown switch -mlong-double-%s" +-msgstr "Opció -mlong-double-%s desconegut" +- +-#: config/rs6000/rs6000.c:2280 +-#, gcc-internal-format +-msgid "-malign-power is not supported for 64-bit Darwin; it is incompatible with the installed C and C++ libraries" +-msgstr "" +- +-#: config/rs6000/rs6000.c:2288 +-#, fuzzy, gcc-internal-format +-msgid "unknown -malign-XXXXX option specified: '%s'" +-msgstr "opció -misel= especificada desconeguda: \"%s\"" +- +-#: config/rs6000/rs6000.c:4989 +-#, gcc-internal-format +-msgid "GCC vector returned by reference: non-standard ABI extension with no compatibility guarantee" +-msgstr "" +- +-#: config/rs6000/rs6000.c:5062 +-#, gcc-internal-format +-msgid "cannot return value in vector register because altivec instructions are disabled, use -maltivec to enable them" +-msgstr "" +- +-#: config/rs6000/rs6000.c:5320 +-#, gcc-internal-format +-msgid "cannot pass argument in vector register because altivec instructions are disabled, use -maltivec to enable them" +-msgstr "" +- +-#: config/rs6000/rs6000.c:6221 +-#, gcc-internal-format +-msgid "GCC vector passed by reference: non-standard ABI extension with no compatibility guarantee" +-msgstr "" +- +-#: config/rs6000/rs6000.c:7461 +-#, gcc-internal-format +-msgid "argument 1 must be a 5-bit signed literal" +-msgstr "l'argument 1 ha de ser una literal amb signe de 5-bit" +- +-#: config/rs6000/rs6000.c:7564 config/rs6000/rs6000.c:8475 +-#, gcc-internal-format +-msgid "argument 2 must be a 5-bit unsigned literal" +-msgstr "l'argument 2 ha de ser una literal sense signe de 5-bit" +- +-#: config/rs6000/rs6000.c:7604 +-#, gcc-internal-format +-msgid "argument 1 of __builtin_altivec_predicate must be a constant" +-msgstr "l'argument 1 de _builtin_altivec_predicate ha de ser una constant" +- +-#: config/rs6000/rs6000.c:7657 +-#, gcc-internal-format +-msgid "argument 1 of __builtin_altivec_predicate is out of range" +-msgstr "l'argument 1 de _builtin_altivec_predicate es fora de límits" +- +-#: config/rs6000/rs6000.c:7906 +-#, gcc-internal-format +-msgid "argument 3 must be a 4-bit unsigned literal" +-msgstr "l'argument 3 ha de ser una literal sense signe de 4-bit" +- +-#: config/rs6000/rs6000.c:8078 +-#, fuzzy, gcc-internal-format +-msgid "argument to %qs must be a 2-bit unsigned literal" +-msgstr "l'argument per a \"%s\" ha de ser una literal sense signe de 2-bit" +- +-#: config/rs6000/rs6000.c:8220 +-#, gcc-internal-format +-msgid "unresolved overload for Altivec builtin %qF" +-msgstr "" +- +-#: config/rs6000/rs6000.c:8302 +-#, gcc-internal-format +-msgid "argument to dss must be a 2-bit unsigned literal" +-msgstr "l'argument per a dss ha de ser una literal sense signe de 2-bit" +- +-#: config/rs6000/rs6000.c:8595 +-#, fuzzy, gcc-internal-format +-msgid "argument 1 of __builtin_paired_predicate must be a constant" +-msgstr "l'argument 1 de __builtin__spe_predicate ha de ser una constant" +- +-#: config/rs6000/rs6000.c:8642 +-#, fuzzy, gcc-internal-format +-msgid "argument 1 of __builtin_paired_predicate is out of range" +-msgstr "l'argument 1 de __builtin_spe_predicate està fora de límits" +- +-#: config/rs6000/rs6000.c:8667 +-#, gcc-internal-format +-msgid "argument 1 of __builtin_spe_predicate must be a constant" +-msgstr "l'argument 1 de __builtin__spe_predicate ha de ser una constant" +- +-#: config/rs6000/rs6000.c:8739 +-#, gcc-internal-format +-msgid "argument 1 of __builtin_spe_predicate is out of range" +-msgstr "l'argument 1 de __builtin_spe_predicate està fora de límits" +- +-#: config/rs6000/rs6000.c:14977 +-#, fuzzy, gcc-internal-format +-msgid "stack frame too large" +-msgstr "marc de pila massa grand: %d bytes" +- +-#: config/rs6000/rs6000.c:17598 +-#, gcc-internal-format +-msgid "no profiling of 64-bit code for this ABI" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19470 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is invalid for 64-bit code" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19472 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is deprecated; use %" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19476 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19478 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19480 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19482 +-#, gcc-internal-format +-msgid "use of boolean types in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19484 +-#, gcc-internal-format +-msgid "use of % in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/rs6000.c:19486 +-#, gcc-internal-format +-msgid "use of decimal floating point types in AltiVec types is invalid" +-msgstr "" +- +-#: config/rs6000/aix43.h:38 config/rs6000/aix51.h:37 config/rs6000/aix52.h:38 +-#: config/rs6000/aix53.h:38 +-#, gcc-internal-format +-msgid "-maix64 and POWER architecture are incompatible" +-msgstr "-maix64 i l'arquitectura POWER són incompatibles" +- +-#: config/rs6000/aix43.h:43 config/rs6000/aix51.h:42 config/rs6000/aix52.h:43 +-#: config/rs6000/aix53.h:43 +-#, gcc-internal-format +-msgid "-maix64 requires PowerPC64 architecture remain enabled" +-msgstr "-maix64 requereix que l'arquitectura PowerPC64 romangui activada" +- +-#: config/rs6000/aix43.h:49 config/rs6000/aix52.h:49 config/rs6000/aix53.h:49 +-#, fuzzy, gcc-internal-format +-msgid "soft-float and long-double-128 are incompatible" +-msgstr "-mrelocatable i -mcall-%s són incompatibles" +- +-#: config/rs6000/aix43.h:53 config/rs6000/aix51.h:46 config/rs6000/aix52.h:53 +-#: config/rs6000/aix53.h:53 +-#, gcc-internal-format +-msgid "-maix64 required: 64-bit computation with 32-bit addressing not yet supported" +-msgstr "es requereix -maix64: càlcul de 64 bits amb adreçament de 32 bits no té suport encara" +- +-#: config/rs6000/e500.h:41 +-#, gcc-internal-format +-msgid "AltiVec and E500 instructions cannot coexist" +-msgstr "" +- +-#: config/rs6000/e500.h:43 +-#, fuzzy, gcc-internal-format +-msgid "64-bit E500 not supported" +-msgstr "-pipe no té suport" +- +-#: config/rs6000/e500.h:45 +-#, fuzzy, gcc-internal-format +-msgid "E500 and FPRs not supported" +-msgstr "els trampolins no tenen suport" +- +-#: config/rs6000/eabispe.h:43 config/rs6000/linuxspe.h:42 +-#, fuzzy, gcc-internal-format +-msgid "-m64 not supported in this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: config/rs6000/linux64.h:108 +-#, fuzzy, gcc-internal-format +-msgid "-m64 requires a PowerPC64 cpu" +-msgstr "-maix64 requereix que l'arquitectura PowerPC64 romangui activada" +- +-#. Definitions for __builtin_return_address and __builtin_frame_address. +-#. __builtin_return_address (0) should give link register (65), enable +-#. this. +-#. This should be uncommented, so that the link register is used, but +-#. currently this would result in unmatched insns and spilling fixed +-#. registers so we'll leave it for another day. When these problems are +-#. taken care of one additional fetch will be necessary in RETURN_ADDR_RTX. +-#. (mrs) +-#. #define RETURN_ADDR_IN_PREVIOUS_FRAME +-#. Number of bytes into the frame return addresses can be found. See +-#. rs6000_stack_info in rs6000.c for more information on how the different +-#. abi's store the return address. +-#: config/rs6000/rs6000.h:1560 +-#, gcc-internal-format +-msgid "RETURN_ADDRESS_OFFSET not supported" +-msgstr "No es dóna suport a RETURN_ADDRESS_OFFSET" +- +-#. Sometimes certain combinations of command options do not make sense +-#. on a particular target machine. You can define a macro +-#. `OVERRIDE_OPTIONS' to take account of this. This macro, if +-#. defined, is executed once just after all the command options have +-#. been parsed. +-#. +-#. The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to +-#. get control. +-#: config/rs6000/sysv4.h:129 +-#, gcc-internal-format +-msgid "bad value for -mcall-%s" +-msgstr "valor erroni per a -mcall-%s" +- +-#: config/rs6000/sysv4.h:145 +-#, gcc-internal-format +-msgid "bad value for -msdata=%s" +-msgstr "valor erroni per a -msdata=%s" +- +-#: config/rs6000/sysv4.h:162 +-#, gcc-internal-format +-msgid "-mrelocatable and -msdata=%s are incompatible" +-msgstr "-mrelocatable and i -msdata=%s són incompatibles" +- +-#: config/rs6000/sysv4.h:171 +-#, gcc-internal-format +-msgid "-f%s and -msdata=%s are incompatible" +-msgstr "-f%s i -msdata=%s són incompatibles" +- +-#: config/rs6000/sysv4.h:180 +-#, gcc-internal-format +-msgid "-msdata=%s and -mcall-%s are incompatible" +-msgstr "-msdata=%s i -mcall-%s són incompatibles" +- +-#: config/rs6000/sysv4.h:189 +-#, gcc-internal-format +-msgid "-mrelocatable and -mno-minimal-toc are incompatible" +-msgstr "-mrelocatable i -mno-minimal-toc són incompatibles" +- +-#: config/rs6000/sysv4.h:195 +-#, gcc-internal-format +-msgid "-mrelocatable and -mcall-%s are incompatible" +-msgstr "-mrelocatable i -mcall-%s són incompatibles" +- +-#: config/rs6000/sysv4.h:202 +-#, gcc-internal-format +-msgid "-fPIC and -mcall-%s are incompatible" +-msgstr "-fPIC i -mcall-%s són incompatibles" +- +-#: config/rs6000/sysv4.h:209 +-#, gcc-internal-format +-msgid "-mcall-aixdesc must be big endian" +-msgstr "-mcall-aixdesc ha de ser big endian" +- +-#: config/rs6000/sysv4.h:214 +-#, gcc-internal-format +-msgid "-msecure-plt not supported by your assembler" +-msgstr "" +- +-#: config/rs6000/sysv4.h:232 +-#, fuzzy, gcc-internal-format +-msgid "-m%s not supported in this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: config/s390/s390.c:1395 +-#, gcc-internal-format +-msgid "stack guard value must be an exact power of 2" +-msgstr "" +- +-#: config/s390/s390.c:1402 +-#, gcc-internal-format +-msgid "stack size must be an exact power of 2" +-msgstr "" +- +-#: config/s390/s390.c:1447 +-#, fuzzy, gcc-internal-format +-msgid "z/Architecture mode not supported on %s" +-msgstr "no es dóna suport al mode trap en Unicos/Mk" +- +-#: config/s390/s390.c:1449 +-#, fuzzy, gcc-internal-format +-msgid "64-bit ABI not supported in ESA/390 mode" +-msgstr "el model de codi %s no té suport en el mode PIC" +- +-#: config/s390/s390.c:1456 +-#, fuzzy, gcc-internal-format +-msgid "Hardware decimal floating point instructions not available on %s" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/s390/s390.c:1459 +-#, fuzzy, gcc-internal-format +-msgid "Hardware decimal floating point instructions not available in ESA/390 mode" +-msgstr "Usar instruccions de maquinari per a coma flotant" +- +-#: config/s390/s390.c:1469 +-#, gcc-internal-format +-msgid "-mhard-dfp can't be used in conjunction with -msoft-float" +-msgstr "" +- +-#: config/s390/s390.c:1483 +-#, gcc-internal-format +-msgid "-mbackchain -mpacked-stack -mhard-float are not supported in combination" +-msgstr "" +- +-#: config/s390/s390.c:1489 +-#, gcc-internal-format +-msgid "stack size must be greater than the stack guard value" +-msgstr "" +- +-#: config/s390/s390.c:1491 +-#, gcc-internal-format +-msgid "stack size must not be greater than 64k" +-msgstr "" +- +-#: config/s390/s390.c:1494 +-#, gcc-internal-format +-msgid "-mstack-guard implies use of -mstack-size" +-msgstr "" +- +-#: config/s390/s390.c:6640 +-#, fuzzy, gcc-internal-format +-msgid "total size of local variables exceeds architecture limit" +-msgstr "La grandària total de les variables locals excedeix els límits de l'arquitectura." +- +-#: config/s390/s390.c:7298 +-#, gcc-internal-format +-msgid "frame size of function %qs is " +-msgstr "" +- +-#: config/s390/s390.c:7328 +-#, fuzzy, gcc-internal-format +-msgid "frame size of %qs is " +-msgstr "no es coneix la grandària d'emmagatzematge de \"%s\"" +- +-#: config/s390/s390.c:7332 +-#, gcc-internal-format +-msgid "%qs uses dynamic stack allocation" +-msgstr "" +- +-#: config/score/score3.c:654 config/score/score7.c:653 +-#, fuzzy, gcc-internal-format +-msgid "-fPIC and -G are incompatible" +-msgstr "-fPIC i -mcall-%s són incompatibles" +- +-#: config/sh/sh.c:6894 +-#, gcc-internal-format +-msgid "__builtin_saveregs not supported by this subtarget" +-msgstr "no es dóna suport a _builtin_saveregs en aquest subobjectiu" +- +-#: config/sh/sh.c:7904 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute only applies to interrupt functions" +-msgstr "l'atribut \"%s\" aplica solament a funcions d'interrupció" +- +-#: config/sh/sh.c:7990 +-#, gcc-internal-format +-msgid "attribute interrupt_handler is not compatible with -m5-compact" +-msgstr "" +- +-#. The argument must be a constant string. +-#: config/sh/sh.c:8012 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute argument not a string constant" +-msgstr "l'argument de l'atribut \"%s\" no és una cadena constant" +- +-#. The argument must be a constant integer. +-#: config/sh/sh.c:8037 +-#, fuzzy, gcc-internal-format +-msgid "%qs attribute argument not an integer constant" +-msgstr "l'argument de l'atribut \"%s\" no és una cadena entera" +- +-#: config/sh/sh.c:10085 +-#, gcc-internal-format +-msgid "r0 needs to be available as a call-clobbered register" +-msgstr "" +- +-#: config/sh/sh.c:10106 +-#, fuzzy, gcc-internal-format +-msgid "Need a second call-clobbered general purpose register" +-msgstr "Usar el registre BK com un registre de propòsit general" +- +-#: config/sh/sh.c:10114 +-#, gcc-internal-format +-msgid "Need a call-clobbered target register" +-msgstr "" +- +-#: config/sh/symbian.c:146 +-#, fuzzy, gcc-internal-format +-msgid "function %q+D is defined after prior declaration as dllimport: attribute ignored" +-msgstr "la funció inline \"%s\" està declarada com dllimport: s'ignora l'atribut." +- +-#: config/sh/symbian.c:158 +-#, fuzzy, gcc-internal-format +-msgid "inline function %q+D is declared as dllimport: attribute ignored" +-msgstr "la funció «inline» \"%s\" està declarada com dllimport: s'ignora l'atribut." +- +-#: config/sh/symbian.c:272 +-#, fuzzy, gcc-internal-format +-msgid "%qs declared as both exported to and imported from a DLL" +-msgstr "\"%s\" és declarat com exportat a i importat d'una DLL al mateix temps" +- +-#: config/sh/symbian.c:279 +-#, gcc-internal-format +-msgid "failure in redeclaration of %q+D: dllimport'd symbol lacks external linkage" +-msgstr "" +- +-#: config/sh/symbian.c:325 +-#, gcc-internal-format +-msgid "%s %q+D %s after being referenced with dllimport linkage" +-msgstr "" +- +-#: config/sh/symbian.c:891 cp/tree.c:2737 +-#, gcc-internal-format +-msgid "lang_* check: failed in %s, at %s:%d" +-msgstr "revisió lang_*: ha fallat en %s, en %s:%d" +- +-#. FIXME +-#: config/sh/netbsd-elf.h:94 +-#, gcc-internal-format +-msgid "unimplemented-shmedia profiling" +-msgstr "" +- +-#. There are no delay slots on SHmedia. +-#. Relaxation isn't yet supported for SHmedia +-#. After reload, if conversion does little good but can cause ICEs: - find_if_block doesn't do anything for SH because we don't have conditional execution patterns. (We use conditional move patterns, which are handled differently, and only before reload). - find_cond_trap doesn't do anything for the SH because we #. don't have conditional traps. - find_if_case_1 uses redirect_edge_and_branch_force in the only path that does an optimization, and this causes an ICE when branch targets are in registers. - find_if_case_2 doesn't do anything for the SHmedia after reload except when it can redirect a tablejump - and that's rather rare. +-#. -fprofile-arcs needs a working libgcov . In unified tree configurations with newlib, this requires to configure with --with-newlib --with-headers. But there is no way to check here we have a working libgcov, so just assume that we have. +-#: config/sh/sh.h:631 +-#, fuzzy, gcc-internal-format +-msgid "profiling is still experimental for this target" +-msgstr "No es dóna suport a anàlisi de perfil en aquest objectiu." +- +-#. Only the sh64-elf assembler fully supports .quad properly. +-#. Pick one that makes most sense for the target in general. It is not much good to use different functions depending on -Os, since then we'll end up with two different functions when some of the code is compiled for size, and some for speed. +-#. SH4 tends to emphasize speed. +-#. These have their own way of doing things. +-#. ??? Should we use the integer SHmedia function instead? +-#. SH1 .. SH3 cores often go into small-footprint systems, so default to the smallest implementation available. +-#. ??? EXPERIMENTAL +-#. User supplied - leave it alone. +-#. The debugging information is sufficient, but gdb doesn't implement this yet +-#. Never run scheduling before reload, since that can break global alloc, and generates slower code anyway due to the pressure on R0. +-#. Enable sched1 for SH4; ready queue will be reordered by the target hooks when pressure is high. We can not do this for SH3 and lower as they give spill failures for R0. +-#. ??? Current exception handling places basic block boundaries after call_insns. It causes the high pressure on R0 and gives spill failures for R0 in reload. See PR 22553 and the thread on gcc-patches . +-#: config/sh/sh.h:730 +-#, gcc-internal-format +-msgid "ignoring -fschedule-insns because of exception handling bug" +-msgstr "" +- +-#. The kernel loader cannot handle the relaxation relocations, so it cannot load kernel modules (which are ET_REL) or RTP executables (which are linked with --emit-relocs). No relaxation relocations appear in shared libraries, so relaxation is OK for RTP PIC. +-#: config/sh/vxworks.h:43 +-#, fuzzy, gcc-internal-format +-msgid "-mrelax is only supported for RTP PIC" +-msgstr "-g només té suport quan s'usa GAS en aquest processador," +- +-#: config/sparc/sparc.c:698 +-#, gcc-internal-format +-msgid "%s is not supported by this configuration" +-msgstr "%s no té suport en aquesta configuració" +- +-#: config/sparc/sparc.c:705 +-#, gcc-internal-format +-msgid "-mlong-double-64 not allowed with -m64" +-msgstr "no es permet -mlong-double-64 amb -m64" +- +-#: config/sparc/sparc.c:730 +-#, gcc-internal-format +-msgid "-mcmodel= is not supported on 32 bit systems" +-msgstr "-mcmodel= no té suport en sistemes de 32 bit" +- +-#: config/spu/spu-c.c:77 +-#, fuzzy, gcc-internal-format +-msgid "insufficient arguments to overloaded function %s" +-msgstr "massa pocs arguments per a la funció \"%s\"" +- +-#: config/spu/spu-c.c:112 +-#, fuzzy, gcc-internal-format +-msgid "too many arguments to overloaded function %s" +-msgstr "massa arguments per a la funció \"%s\"" +- +-#: config/spu/spu-c.c:124 +-#, gcc-internal-format +-msgid "parameter list does not match a valid signature for %s()" +-msgstr "" +- +-#: config/spu/spu.c:337 config/spu/spu.c:348 +-#, fuzzy, gcc-internal-format +-msgid "Unknown architecture '%s'" +-msgstr "es desconeix el mode de màquina \"%s\"" +- +-#: config/spu/spu.c:3034 +-#, gcc-internal-format +-msgid "`%s' attribute ignored" +-msgstr "s'ignora l'atribut \"%s\"" +- +-#: config/spu/spu.c:5218 +-#, gcc-internal-format +-msgid "%s expects an integer literal in the range [%d, %d]." +-msgstr "" +- +-#: config/spu/spu.c:5238 +-#, gcc-internal-format +-msgid "%s expects an integer literal in the range [%d, %d]. (" +-msgstr "" +- +-#: config/spu/spu.c:5268 +-#, gcc-internal-format +-msgid "%d least significant bits of %s are ignored." +-msgstr "" +- +-#: config/stormy16/stormy16.c:499 +-#, fuzzy, gcc-internal-format +-msgid "constant halfword load operand out of range" +-msgstr "l'argument constant està fora de límits per a \"%s\"" +- +-#: config/stormy16/stormy16.c:509 +-#, fuzzy, gcc-internal-format +-msgid "constant arithmetic operand out of range" +-msgstr "l'argument constant està fora de límits per a \"%s\"" +- +-#: config/stormy16/stormy16.c:1108 +-#, gcc-internal-format +-msgid "local variable memory requirements exceed capacity" +-msgstr "" +- +-#: config/stormy16/stormy16.c:1274 +-#, fuzzy, gcc-internal-format +-msgid "function_profiler support" +-msgstr "suport per a function_profiler per a MMIX" +- +-#: config/stormy16/stormy16.c:1363 +-#, gcc-internal-format +-msgid "cannot use va_start in interrupt function" +-msgstr "no es pot usar va_start en una funció d'interrupció" +- +-#: config/stormy16/stormy16.c:1906 +-#, gcc-internal-format +-msgid "switch statement of size %lu entries too large" +-msgstr "la declaració «switch» de grandària %lu entrades és massa gran" +- +-#: config/stormy16/stormy16.c:2274 +-#, fuzzy, gcc-internal-format +-msgid "%<__BELOW100__%> attribute only applies to variables" +-msgstr "l'atribut \"%s\" solament aplica a variables" +- +-#: config/stormy16/stormy16.c:2281 +-#, gcc-internal-format +-msgid "__BELOW100__ attribute not allowed with auto storage class" +-msgstr "" +- +-#: config/v850/v850-c.c:66 +-#, gcc-internal-format +-msgid "#pragma GHS endXXXX found without previous startXXX" +-msgstr "es va trobar un #pragma GHS endXXXX sense un startXXX previ" +- +-#: config/v850/v850-c.c:69 +-#, gcc-internal-format +-msgid "#pragma GHS endXXX does not match previous startXXX" +-msgstr "el #pragma GHS endXXXX no coincideix amb el startXXX previ" +- +-#: config/v850/v850-c.c:95 +-#, gcc-internal-format +-msgid "cannot set interrupt attribute: no current function" +-msgstr "no es pot establir l'atribut d'interrupció: no hi ha funció actual" +- +-#: config/v850/v850-c.c:103 +-#, gcc-internal-format +-msgid "cannot set interrupt attribute: no such identifier" +-msgstr "no es pot establir l'atribut d'interrupció: no hi ha tal identificador" +- +-#: config/v850/v850-c.c:148 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs section" +-msgstr "escombraries al final de la secció #pragma ghs" +- +-#: config/v850/v850-c.c:165 +-#, gcc-internal-format +-msgid "unrecognized section name \"%s\"" +-msgstr "no es reconeix el nom de secció \"%s\"" +- +-#: config/v850/v850-c.c:180 +-#, gcc-internal-format +-msgid "malformed #pragma ghs section" +-msgstr "secció #pragma ghs malformada" +- +-#: config/v850/v850-c.c:199 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs interrupt" +-msgstr "escombraries al final del #pragma ghs interrupt" +- +-#: config/v850/v850-c.c:210 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs starttda" +-msgstr "escombraries al final del #pragma ghs starttda" +- +-#: config/v850/v850-c.c:221 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs startsda" +-msgstr "escombraries al final del #pragma ghs startsda" +- +-#: config/v850/v850-c.c:232 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs startzda" +-msgstr "escombraries al final del #pragma ghs startzda" +- +-#: config/v850/v850-c.c:243 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs endtda" +-msgstr "escombraries al final del #pragma ghs endtda" +- +-#: config/v850/v850-c.c:254 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs endsda" +-msgstr "escombraries al final del #pragma ghs endsda" +- +-#: config/v850/v850-c.c:265 +-#, gcc-internal-format +-msgid "junk at end of #pragma ghs endzda" +-msgstr "escombraries al final del #pragma ghs endzda" +- +-#: config/v850/v850.c:184 +-#, gcc-internal-format +-msgid "value passed to %<-m%s%> is too large" +-msgstr "" +- +-#: config/v850/v850.c:2084 +-#, fuzzy, gcc-internal-format +-msgid "%Jdata area attributes cannot be specified for local variables" +-msgstr "no es pot especificar un atribut d'àrea de dades per a variables locals" +- +-#: config/v850/v850.c:2095 +-#, fuzzy, gcc-internal-format +-msgid "data area of %q+D conflicts with previous declaration" +-msgstr "l'àrea de dades de \"%s\" en conflicte amb una declaració prèvia" +- +-#: config/v850/v850.c:2225 +-#, fuzzy, gcc-internal-format +-msgid "bogus JR construction: %d" +-msgstr "construcció JR ambigua: %d\n" +- +-#: config/v850/v850.c:2243 config/v850/v850.c:2352 +-#, gcc-internal-format +-msgid "bad amount of stack space removal: %d" +-msgstr "quantitat errònia d'eliminació d'espai de pila: %d" +- +-#: config/v850/v850.c:2332 +-#, gcc-internal-format +-msgid "bogus JARL construction: %d\n" +-msgstr "construcció JARL ambigua: %d\n" +- +-#: config/v850/v850.c:2631 +-#, fuzzy, gcc-internal-format +-msgid "bogus DISPOSE construction: %d" +-msgstr "construcció DISPOSE ambigua: %d\n" +- +-#: config/v850/v850.c:2650 +-#, fuzzy, gcc-internal-format +-msgid "too much stack space to dispose of: %d" +-msgstr "Massa espai de pila per a preparar: %d" +- +-#: config/v850/v850.c:2752 +-#, fuzzy, gcc-internal-format +-msgid "bogus PREPEARE construction: %d" +-msgstr "construcció PREPEARE ambigua: %d\n" +- +-#: config/v850/v850.c:2771 +-#, fuzzy, gcc-internal-format +-msgid "too much stack space to prepare: %d" +-msgstr "Massa espai de pila per a preparar: %d" +- +-#: config/xtensa/xtensa.c:1861 +-#, gcc-internal-format +-msgid "boolean registers required for the floating-point option" +-msgstr "es requereixen registres booleans per a l'opció de coma flotant" +- +-#: config/xtensa/xtensa.c:1896 +-#, fuzzy, gcc-internal-format +-msgid "-f%s is not supported with CONST16 instructions" +-msgstr "%s no té suport en aquesta configuració" +- +-#: config/xtensa/xtensa.c:1901 +-#, gcc-internal-format +-msgid "PIC is required but not supported with CONST16 instructions" +-msgstr "" +- +-#: config/xtensa/xtensa.c:2745 config/xtensa/xtensa.c:2765 +-#, fuzzy, gcc-internal-format +-msgid "bad builtin code" +-msgstr "macro interna \"%s\" no vàlida" +- +-#: config/xtensa/xtensa.c:2873 +-#, gcc-internal-format +-msgid "only uninitialized variables can be placed in a .bss section" +-msgstr "només les variables sense inicialitzar es poden col·locar en una secció .bss" +- +-#: ada/misc.c:261 +-#, gcc-internal-format +-msgid "missing argument to \"-%s\"" +-msgstr "Falten arguments per a \"-%s\"" +- +-#: ada/misc.c:311 +-#, fuzzy, gcc-internal-format +-msgid "%<-gnat%> misspelled as %<-gant%>" +-msgstr "\"-gnat\" mal lletrejat com \"-gant\"" +- +-#: cp/call.c:2462 +-#, gcc-internal-format +-msgid "%s %D(%T, %T, %T) " +-msgstr "%s %D(%T, %T, %T) " +- +-#: cp/call.c:2467 +-#, gcc-internal-format +-msgid "%s %D(%T, %T) " +-msgstr "%s %D(%T, %T) " +- +-#: cp/call.c:2471 +-#, gcc-internal-format +-msgid "%s %D(%T) " +-msgstr "%s %D(%T) " +- +-#: cp/call.c:2475 +-#, gcc-internal-format +-msgid "%s %T " +-msgstr "%s %T " +- +-#: cp/call.c:2477 +-#, gcc-internal-format +-msgid "%s %+#D " +-msgstr "" +- +-#: cp/call.c:2479 cp/pt.c:1397 +-#, gcc-internal-format +-msgid "%s %+#D" +-msgstr "%s %+#D" +- +-#: cp/call.c:2720 +-#, fuzzy, gcc-internal-format +-msgid "conversion from %qT to %qT is ambiguous" +-msgstr "la conversió de \"%T\" a \"%T\" és ambigua" +- +-#: cp/call.c:2873 cp/call.c:2891 cp/call.c:2954 +-#, fuzzy, gcc-internal-format +-msgid "no matching function for call to %<%D(%A)%>" +-msgstr "no hi ha una funció coincident per a la crida a \"%D(%A)\"" +- +-#: cp/call.c:2894 cp/call.c:2957 +-#, fuzzy, gcc-internal-format +-msgid "call of overloaded %<%D(%A)%> is ambiguous" +-msgstr "la crida del \"%D(%A)\" sobrecarregat és ambigua" +- +-#. It's no good looking for an overloaded operator() on a +-#. pointer-to-member-function. +-#: cp/call.c:3029 +-#, gcc-internal-format +-msgid "pointer-to-member function %E cannot be called without an object; consider using .* or ->*" +-msgstr "la funció punter-a-membre %E no es pot cridar dintre d'un objecte; consideri utilitzar .* o ->*" +- +-#: cp/call.c:3103 +-#, fuzzy, gcc-internal-format +-msgid "no match for call to %<(%T) (%A)%>" +-msgstr "no hi ha coincidència per a la crida a \"(%T) (%A)\"" +- +-#: cp/call.c:3112 +-#, fuzzy, gcc-internal-format +-msgid "call of %<(%T) (%A)%> is ambiguous" +-msgstr "la crida de \"(%T) (%A)\" és ambigua" +- +-#: cp/call.c:3150 +-#, gcc-internal-format +-msgid "%s for ternary % in %<%E ? %E : %E%>" +-msgstr "" +- +-#: cp/call.c:3156 +-#, fuzzy, gcc-internal-format +-msgid "%s for % in %<%E%s%>" +-msgstr "%s per a \"operator%s\" en \"%E%s\"" +- +-#: cp/call.c:3160 +-#, fuzzy, gcc-internal-format +-msgid "%s for % in %<%E[%E]%>" +-msgstr "%s per a \"operator%s\" en \"%E%s\"" +- +-#: cp/call.c:3165 +-#, fuzzy, gcc-internal-format +-msgid "%s for %qs in %<%s %E%>" +-msgstr "%s per a \"operador%s\" en \"%s%E\"" +- +-#: cp/call.c:3170 +-#, fuzzy, gcc-internal-format +-msgid "%s for % in %<%E %s %E%>" +-msgstr "%s per a \"operator%s\" en \"%E%s\"" +- +-#: cp/call.c:3173 +-#, fuzzy, gcc-internal-format +-msgid "%s for % in %<%s%E%>" +-msgstr "%s per a \"operador%s\" en \"%s%E\"" +- +-#: cp/call.c:3265 +-#, gcc-internal-format +-msgid "ISO C++ forbids omitting the middle term of a ?: expression" +-msgstr "ISO C++ prohibeix l'omissió del terme mig d'una expressió ?:" +- +-#: cp/call.c:3343 +-#, gcc-internal-format +-msgid "second operand to the conditional operator is of type %, but the third operand is neither a throw-expression nor of type %" +-msgstr "" +- +-#: cp/call.c:3348 +-#, gcc-internal-format +-msgid "third operand to the conditional operator is of type %, but the second operand is neither a throw-expression nor of type %" +-msgstr "" +- +-#: cp/call.c:3389 cp/call.c:3609 +-#, fuzzy, gcc-internal-format +-msgid "operands to ?: have different types %qT and %qT" +-msgstr "els operands de ?: tenen tipus diferents" +- +-#: cp/call.c:3563 +-#, fuzzy, gcc-internal-format +-msgid "enumeral mismatch in conditional expression: %qT vs %qT" +-msgstr "no coincideix el enumeral en l'expressió condicional: \"%T\" vs \"%T\"" +- +-#: cp/call.c:3570 +-#, gcc-internal-format +-msgid "enumeral and non-enumeral type in conditional expression" +-msgstr "tipus enumeral i no enumeral en l'expressió condicional" +- +-#: cp/call.c:3874 +-#, fuzzy, gcc-internal-format +-msgid "no %<%D(int)%> declared for postfix %qs, trying prefix operator instead" +-msgstr "no es va declarar \"%D(int)\" per al \"%s\" postfix, intentant en el seu lloc l'operador prefix" +- +-#: cp/call.c:3947 +-#, fuzzy, gcc-internal-format +-msgid "comparison between %q#T and %q#T" +-msgstr "comparança entre \"%#T\" i \"%#T\"" +- +-#: cp/call.c:4229 +-#, gcc-internal-format +-msgid "no corresponding deallocation function for `%D'" +-msgstr "" +- +-#: cp/call.c:4234 +-#, fuzzy, gcc-internal-format +-msgid "no suitable % for %qT" +-msgstr "no hi ha un operador \"operator delete\" adequat per a \"%T\"" +- +-#: cp/call.c:4252 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D is private" +-msgstr "\"%+#D\" és privat" +- +-#: cp/call.c:4254 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D is protected" +-msgstr "\"%+#D\" està protegit" +- +-#: cp/call.c:4256 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D is inaccessible" +-msgstr "\"%+#D\" és inaccessible" +- +-#: cp/call.c:4257 +-#, gcc-internal-format +-msgid "within this context" +-msgstr "des d'aquest context" +- +-#: cp/call.c:4303 +-#, fuzzy, gcc-internal-format +-msgid "passing NULL to non-pointer argument %P of %qD" +-msgstr "passant NULL usat per al no punter %s %P de \"%D\"" +- +-#: cp/call.c:4306 +-#, fuzzy, gcc-internal-format +-msgid "converting to non-pointer type %qT from NULL" +-msgstr "%s al tipus \"%T\" que no és un punter des de NULL" +- +-#: cp/call.c:4312 +-#, fuzzy, gcc-internal-format +-msgid "converting % to pointer type for argument %P of %qD" +-msgstr "tipus incompatible per a l'argument %d de \"%s\"" +- +-#: cp/call.c:4356 cp/cvt.c:217 +-#, fuzzy, gcc-internal-format +-msgid "invalid conversion from %qT to %qT" +-msgstr "conversió no vàlida de \"%T\" a \"%T\"" +- +-#: cp/call.c:4358 +-#, fuzzy, gcc-internal-format +-msgid " initializing argument %P of %qD" +-msgstr " inicialitzant l'argument %P de \"%D\"" +- +-#: cp/call.c:4491 +-#, fuzzy, gcc-internal-format +-msgid "cannot bind bitfield %qE to %qT" +-msgstr "no es pot inicialitzar \"%T\" des de \"%T\"" +- +-#: cp/call.c:4494 cp/call.c:4510 +-#, fuzzy, gcc-internal-format +-msgid "cannot bind packed field %qE to %qT" +-msgstr "no es pot declarar que el camp \"%D\" sigui de tipus \"%T\"" +- +-#: cp/call.c:4497 +-#, fuzzy, gcc-internal-format +-msgid "cannot bind rvalue %qE to %qT" +-msgstr "no es pot inicialitzar \"%T\" des de \"%T\"" +- +-#: cp/call.c:4611 +-#, fuzzy, gcc-internal-format +-msgid "cannot pass objects of non-POD type %q#T through %<...%>; call will abort at runtime" +-msgstr "no es pot passar objectes de tipus \"%#T\" que no és POD a través de \"...\"; la cridada avortarà en temps d'execució" +- +-#. Undefined behavior [expr.call] 5.2.2/7. +-#: cp/call.c:4639 +-#, fuzzy, gcc-internal-format +-msgid "cannot receive objects of non-POD type %q#T through %<...%>; call will abort at runtime" +-msgstr "no es pot passar objectes de tipus \"%#T\" que no és POD a través de \"...\"; la cridada avortarà en temps d'execució" +- +-#: cp/call.c:4687 +-#, fuzzy, gcc-internal-format +-msgid "the default argument for parameter %d of %qD has not yet been parsed" +-msgstr "l'argument per omissió per al paràmetre del tipus \"%T\" té el tipus \"%T\"" +- +-#: cp/call.c:4697 +-#, fuzzy, gcc-internal-format +-msgid "recursive evaluation of default argument for %q#D" +-msgstr "redefinició de l'argument per omissió per a \"%#D\"" +- +-#: cp/call.c:4802 +-#, fuzzy, gcc-internal-format +-msgid "argument of function call might be a candidate for a format attribute" +-msgstr "Avisar per funcions que podrien ser candidates per a atributs de format" +- +-#: cp/call.c:4950 +-#, fuzzy, gcc-internal-format +-msgid "passing %qT as % argument of %q#D discards qualifiers" +-msgstr "passar \"%T\" com l'argument \"this\" de \"%#D\" descarta als qualificadors" +- +-#: cp/call.c:4969 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not an accessible base of %qT" +-msgstr "\"%T\" no és una base inaccessible de \"%T\"" +- +-#: cp/call.c:5229 +-#, fuzzy, gcc-internal-format +-msgid "could not find class$ field in java interface type %qT" +-msgstr "no es va poder trobar un camp class$ en el tipus d'interfície java \"%T\"" +- +-#: cp/call.c:5470 +-#, fuzzy, gcc-internal-format +-msgid "call to non-function %qD" +-msgstr "cridada a \"%D\" que no és funció" +- +-#: cp/call.c:5595 +-#, fuzzy, gcc-internal-format +-msgid "no matching function for call to %<%T::%s(%A)%#V%>" +-msgstr "no es troba una funció coincident per a la cridada a \"%T::%D(%A)%#V\"" +- +-#: cp/call.c:5613 +-#, fuzzy, gcc-internal-format +-msgid "call of overloaded %<%s(%A)%> is ambiguous" +-msgstr "la cridada del \"%D(%A)\" sobrecarregat és ambigua" +- +-#: cp/call.c:5639 +-#, fuzzy, gcc-internal-format +-msgid "cannot call member function %qD without object" +-msgstr "no es pot cridar a la funció membre \"%D\" sense un objecte" +- +-#: cp/call.c:6283 +-#, fuzzy, gcc-internal-format +-msgid "passing %qT chooses %qT over %qT" +-msgstr "passar \"%T\" escull \"%T\" sobre \"%T\"" +- +-#: cp/call.c:6285 cp/name-lookup.c:4320 cp/name-lookup.c:4753 +-#, fuzzy, gcc-internal-format +-msgid " in call to %qD" +-msgstr " en la crida a \"%D\"" +- +-#: cp/call.c:6342 +-#, fuzzy, gcc-internal-format +-msgid "choosing %qD over %qD" +-msgstr "escollint \"%D\" sobre \"%D\"" +- +-#: cp/call.c:6343 +-#, fuzzy, gcc-internal-format +-msgid " for conversion from %qT to %qT" +-msgstr " per a la conversió de \"%T\" a \"%T\"" +- +-#: cp/call.c:6345 +-#, gcc-internal-format +-msgid " because conversion sequence for the argument is better" +-msgstr " perquè la seqüència de conversió per a l'argument és millor" +- +-#: cp/call.c:6459 +-#, gcc-internal-format +-msgid "ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:" +-msgstr "" +- +-#: cp/call.c:6603 +-#, fuzzy, gcc-internal-format +-msgid "could not convert %qE to %qT" +-msgstr "no es pot convertir \"%E\" a \"%T\"" +- +-#: cp/call.c:6737 +-#, fuzzy, gcc-internal-format +-msgid "invalid initialization of non-const reference of type %qT from a temporary of type %qT" +-msgstr "const_cast no vàlid d'un rvalue de tipus \"%T\" al tipus \"%T\"" +- +-#: cp/call.c:6741 +-#, fuzzy, gcc-internal-format +-msgid "invalid initialization of reference of type %qT from expression of type %qT" +-msgstr "initialització no vàlida de reference de tipus \"%T\" a partir d'una expressió de tipus \"%T\"" +- +-#: cp/class.c:280 +-#, fuzzy, gcc-internal-format +-msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" +-msgstr "no es pot convertir de la base \"%T\" al tipus derivat \"%T\" a través de la base virtual \"%T\"" +- +-#: cp/class.c:961 +-#, fuzzy, gcc-internal-format +-msgid "Java class %qT cannot have a destructor" +-msgstr "la classe base \"%#T\" té un destructor no virtual" +- +-#: cp/class.c:963 +-#, fuzzy, gcc-internal-format +-msgid "Java class %qT cannot have an implicit non-trivial destructor" +-msgstr "la classe base \"%#T\" té un destructor no virtual" +- +-#: cp/class.c:1062 +-#, fuzzy, gcc-internal-format +-msgid "repeated using declaration %q+D" +-msgstr "per a la declaració de patró \"%D\"" +- +-#: cp/class.c:1064 +-#, fuzzy, gcc-internal-format +-msgid "using declaration %q+D conflicts with a previous using declaration" +-msgstr "%Jla secció de \"%D\" causa conflictes amb la declaració prèvia" +- +-#: cp/class.c:1069 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D cannot be overloaded" +-msgstr "no es poden sobrecarregar \"%#D\" i \"%#D\"" +- +-#: cp/class.c:1070 +-#, gcc-internal-format +-msgid "with %q+#D" +-msgstr "" +- +-#: cp/class.c:1137 +-#, fuzzy, gcc-internal-format +-msgid "conflicting access specifications for method %q+D, ignored" +-msgstr "especificacions d'accés en conflicte per al mètode \"%D\", ignorat" +- +-#: cp/class.c:1140 +-#, fuzzy, gcc-internal-format +-msgid "conflicting access specifications for field %qE, ignored" +-msgstr "especificacions d'accés en conflicte per al camp \"%s\", ignorat" +- +-#: cp/class.c:1201 cp/class.c:1209 +-#, fuzzy, gcc-internal-format +-msgid "%q+D invalid in %q#T" +-msgstr "\"%D\" no vàlid en \"%#T\"" +- +-#: cp/class.c:1202 +-#, fuzzy, gcc-internal-format +-msgid " because of local method %q+#D with same name" +-msgstr " a causa del mètode local \"%D\" amb el mateix nom" +- +-#: cp/class.c:1210 +-#, fuzzy, gcc-internal-format +-msgid " because of local member %q+#D with same name" +-msgstr " a causa del membre local \"%D\" amb el mateix nom" +- +-#: cp/class.c:1253 +-#, fuzzy, gcc-internal-format +-msgid "base class %q#T has a non-virtual destructor" +-msgstr "la classe base \"%#T\" té un destructor no virtual" +- +-#: cp/class.c:1570 +-#, fuzzy, gcc-internal-format +-msgid "all member functions in class %qT are private" +-msgstr "tots les funcions membres en la classe \"%#T\" són privades" +- +-#: cp/class.c:1582 +-#, fuzzy, gcc-internal-format +-msgid "%q#T only defines a private destructor and has no friends" +-msgstr "\"%#T\" solament defineix un destructor privat i no té friends" +- +-#: cp/class.c:1626 +-#, fuzzy, gcc-internal-format +-msgid "%q#T only defines private constructors and has no friends" +-msgstr "\"%#T\" solament defineix constructors privats i no té friends" +- +-#: cp/class.c:2019 +-#, fuzzy, gcc-internal-format +-msgid "no unique final overrider for %qD in %qT" +-msgstr "no hi ha un eixafador únic final per a \"%D\" en \"%#T\"" +- +-#. Here we know it is a hider, and no overrider exists. +-#: cp/class.c:2439 +-#, fuzzy, gcc-internal-format +-msgid "%q+D was hidden" +-msgstr "\"%D\" estava amagat" +- +-#: cp/class.c:2440 +-#, fuzzy, gcc-internal-format +-msgid " by %q+D" +-msgstr " per \"%D\"" +- +-#: cp/class.c:2483 cp/decl2.c:1135 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D invalid; an anonymous union can only have non-static data members" +-msgstr "\"%D\" no vàlid; un union anònim només pot tenir membres amb dades no estàtiques" +- +-#: cp/class.c:2486 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D invalid; an anonymous struct can only have non-static data members" +-msgstr "\"%D\" no vàlid; un union anònim només pot tenir membres amb dades no estàtiques" +- +-#: cp/class.c:2494 cp/decl2.c:1141 +-#, fuzzy, gcc-internal-format +-msgid "private member %q+#D in anonymous union" +-msgstr "membre privat \"%D\" en union anònima" +- +-#: cp/class.c:2496 +-#, fuzzy, gcc-internal-format +-msgid "private member %q+#D in anonymous struct" +-msgstr "membre privat \"%D\" en union anònima" +- +-#: cp/class.c:2501 cp/decl2.c:1143 +-#, fuzzy, gcc-internal-format +-msgid "protected member %q+#D in anonymous union" +-msgstr "membre protegit \"%D\" en union anònima" +- +-#: cp/class.c:2503 +-#, fuzzy, gcc-internal-format +-msgid "protected member %q+#D in anonymous struct" +-msgstr "membre protegit \"%D\" en union anònima" +- +-#: cp/class.c:2677 +-#, fuzzy, gcc-internal-format +-msgid "bit-field %q+#D with non-integral type" +-msgstr "camp de bits \"%D\" amb tipus no enter" +- +-#: cp/class.c:2690 +-#, fuzzy, gcc-internal-format +-msgid "bit-field %q+D width not an integer constant" +-msgstr "l'amplària del camp de bits \"%D\" no és una constant entera" +- +-#: cp/class.c:2695 +-#, fuzzy, gcc-internal-format +-msgid "negative width in bit-field %q+D" +-msgstr "amplària negativa en el camp de bit \"%D\"" +- +-#: cp/class.c:2700 +-#, fuzzy, gcc-internal-format +-msgid "zero width for bit-field %q+D" +-msgstr "amplària zero per al camp de bits \"%D\"" +- +-#: cp/class.c:2706 +-#, fuzzy, gcc-internal-format +-msgid "width of %q+D exceeds its type" +-msgstr "l'amplària de \"%D\" excedeix el seu tipus" +- +-#: cp/class.c:2715 +-#, fuzzy, gcc-internal-format +-msgid "%q+D is too small to hold all values of %q#T" +-msgstr "\"%D\" és massa petit per a guardar tots els valors de \"%#T\"" +- +-#: cp/class.c:2772 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with constructor not allowed in union" +-msgstr "no es permet el membre \"%D\" amb constructor en la union" +- +-#: cp/class.c:2775 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with destructor not allowed in union" +-msgstr "no es permet el membre \"%D\" amb destructor en la union" +- +-#: cp/class.c:2777 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with copy assignment operator not allowed in union" +-msgstr "no es permet el membre \"%D\" amb operador d'assignació de còpia en la union" +- +-#: cp/class.c:2801 +-#, fuzzy, gcc-internal-format +-msgid "multiple fields in union %qT initialized" +-msgstr "múltiples camps inicialitzats en la unió \"%#T\"" +- +-#: cp/class.c:2890 +-#, fuzzy, gcc-internal-format +-msgid "%q+D may not be static because it is a member of a union" +-msgstr "\"%D\" ha de ser una funció membre que no sigui static" +- +-#: cp/class.c:2895 +-#, fuzzy, gcc-internal-format +-msgid "%q+D may not have reference type %qT because it is a member of a union" +-msgstr "\"%D\" ha de ser una funció membre que no sigui static" +- +-#: cp/class.c:2906 +-#, fuzzy, gcc-internal-format +-msgid "field %q+D invalidly declared function type" +-msgstr "el camp \"%D\" és declarat no vàlidament com un tipus de funció" +- +-#: cp/class.c:2912 +-#, fuzzy, gcc-internal-format +-msgid "field %q+D invalidly declared method type" +-msgstr "el camp \"%D\" és declarat no vàlidament com un tipus de mètode" +- +-#: cp/class.c:2944 +-#, fuzzy, gcc-internal-format +-msgid "non-static reference %q+#D in class without a constructor" +-msgstr "referència \"%D\" que no és static en una classe sense un constructor" +- +-#: cp/class.c:2955 +-#, gcc-internal-format +-msgid "ignoring packed attribute because of unpacked non-POD field %q+#D" +-msgstr "" +- +-#: cp/class.c:3022 +-#, fuzzy, gcc-internal-format +-msgid "non-static const member %q+#D in class without a constructor" +-msgstr "membre const \"%D\" que no és static en una classe sense un constructor" +- +-#: cp/class.c:3037 +-#, fuzzy, gcc-internal-format +-msgid "field %q+#D with same name as class" +-msgstr "camp \"%D\" amb el mateix nom que la classe" +- +-#: cp/class.c:3068 +-#, fuzzy, gcc-internal-format +-msgid "%q#T has pointer data members" +-msgstr "\"%#T\" té membres punters a dades" +- +-#: cp/class.c:3073 +-#, fuzzy, gcc-internal-format +-msgid " but does not override %<%T(const %T&)%>" +-msgstr " però no s'imposa a \"%T(const %T&)\"" +- +-#: cp/class.c:3075 +-#, fuzzy, gcc-internal-format +-msgid " or %" +-msgstr " o a \"operator=(cont %T&)\"" +- +-#: cp/class.c:3079 +-#, fuzzy, gcc-internal-format +-msgid " but does not override %" +-msgstr " però no s'imposa a \"operator=(const %T&)\"" +- +-#: cp/class.c:3540 +-#, gcc-internal-format +-msgid "offset of empty base %qT may not be ABI-compliant and maychange in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:3665 +-#, gcc-internal-format +-msgid "class %qT will be considered nearly empty in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:3747 +-#, fuzzy, gcc-internal-format +-msgid "initializer specified for non-virtual method %q+D" +-msgstr "es va especificar un inicialitzador per al mètode no virtual \"%D\"" +- +-#: cp/class.c:4412 +-#, gcc-internal-format +-msgid "offset of virtual base %qT is not ABI-compliant and may change in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:4513 +-#, fuzzy, gcc-internal-format +-msgid "direct base %qT inaccessible in %qT due to ambiguity" +-msgstr "base directa \"%T\" inaccessible en \"%T\" a causa d'ambigüitat" +- +-#: cp/class.c:4525 +-#, fuzzy, gcc-internal-format +-msgid "virtual base %qT inaccessible in %qT due to ambiguity" +-msgstr "base virtual \"%T\" inaccessible en \"%T\" a causa d'ambigüitat" +- +-#: cp/class.c:4704 +-#, gcc-internal-format +-msgid "size assigned to %qT may not be ABI-compliant and may change in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:4744 +-#, gcc-internal-format +-msgid "the offset of %qD may not be ABI-compliant and may change in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:4772 +-#, gcc-internal-format +-msgid "offset of %q+D is not ABI-compliant and may change in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:4781 +-#, gcc-internal-format +-msgid "%q+D contains empty classes which may cause base classes to be placed at different locations in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:4864 +-#, gcc-internal-format +-msgid "layout of classes derived from empty class %qT may change in a future version of GCC" +-msgstr "" +- +-#: cp/class.c:5010 cp/parser.c:14608 +-#, fuzzy, gcc-internal-format +-msgid "redefinition of %q#T" +-msgstr "redefinició de \"%#T\"" +- +-#: cp/class.c:5166 +-#, fuzzy, gcc-internal-format +-msgid "%q#T has virtual functions and accessible non-virtual destructor" +-msgstr "\"%#T\" té funcions virtuals però destructors no virtuals" +- +-#: cp/class.c:5268 +-#, gcc-internal-format +-msgid "trying to finish struct, but kicked out due to previous parse errors" +-msgstr "es va tractar d'acabar struct, però va ser tret a causa d'errors previs de decodificació" +- +-#: cp/class.c:5728 +-#, fuzzy, gcc-internal-format +-msgid "language string %<\"%E\"%> not recognized" +-msgstr "cadena de llenguatge \"\"%s\"\" no reconeguda" +- +-#: cp/class.c:5817 +-#, fuzzy, gcc-internal-format +-msgid "cannot resolve overloaded function %qD based on conversion to type %qT" +-msgstr "no es pot resoldre la funció sobrecarregada \"%D\" basant-se en la conversió al tipus \"%T\"" +- +-#: cp/class.c:5946 +-#, fuzzy, gcc-internal-format +-msgid "no matches converting function %qD to type %q#T" +-msgstr "no hi ha coincidències al convertir la funció \"%D\" al tipus \"%#T\"" +- +-#: cp/class.c:5969 +-#, fuzzy, gcc-internal-format +-msgid "converting overloaded function %qD to type %q#T is ambiguous" +-msgstr "la conversió de la funció sobrecarregada \"%D\" al tipus \"%#T\" és ambigua" +- +-#: cp/class.c:5995 +-#, fuzzy, gcc-internal-format +-msgid "assuming pointer to member %qD" +-msgstr "assumint el punter a membre \"%D\"" +- +-#: cp/class.c:5998 +-#, fuzzy, gcc-internal-format +-msgid "(a pointer to member can only be formed with %<&%E%>)" +-msgstr "(un punter a membre solament es pot formar amb \"&%E\")" +- +-#: cp/class.c:6054 cp/class.c:6088 +-#, gcc-internal-format +-msgid "not enough type information" +-msgstr "no hi ha suficient informació de tipus" +- +-#: cp/class.c:6071 +-#, fuzzy, gcc-internal-format +-msgid "argument of type %qT does not match %qT" +-msgstr "l'argument de tipus \"%T\" no coincideix amb \"%T\"" +- +-#. [basic.scope.class] +-#. +-#. A name N used in a class S shall refer to the same declaration +-#. in its context and when re-evaluated in the completed scope of +-#. S. +-#: cp/class.c:6358 cp/decl.c:1199 cp/name-lookup.c:526 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q#D" +-msgstr "la declaració de \"%#D\"" +- +-#: cp/class.c:6359 +-#, fuzzy, gcc-internal-format +-msgid "changes meaning of %qD from %q+#D" +-msgstr "canvia el significat de \"%D\" a partir de \"%+#D\"" +- +-#: cp/cp-gimplify.c:99 +-#, fuzzy, gcc-internal-format +-msgid "continue statement not within loop or switch" +-msgstr "la declaració break no està dintre d'un cicle o «switch»" +- +-#: cp/cp-gimplify.c:371 +-#, fuzzy, gcc-internal-format +-msgid "statement with no effect" +-msgstr "%s no té %s" +- +-#: cp/cvt.c:90 +-#, fuzzy, gcc-internal-format +-msgid "can't convert from incomplete type %qT to %qT" +-msgstr "no es pot convertir des del tipus de dada incompleta \"%T\" a \"%T\"" +- +-#: cp/cvt.c:99 +-#, fuzzy, gcc-internal-format +-msgid "conversion of %qE from %qT to %qT is ambiguous" +-msgstr "la conversió de \"%E\" des de \"%T\" a \"%T\" és ambigua" +- +-#: cp/cvt.c:168 cp/cvt.c:193 cp/cvt.c:238 +-#, fuzzy, gcc-internal-format +-msgid "cannot convert %qE from type %qT to type %qT" +-msgstr "no es pot convertir \"%E\" des del tipus \"%T\" al tipus \"%T\"" +- +-#: cp/cvt.c:452 +-#, fuzzy, gcc-internal-format +-msgid "conversion from %qT to %qT discards qualifiers" +-msgstr "la conversió de \"%T\" a \"%T\" descarta els qualificadors" +- +-#: cp/cvt.c:470 cp/typeck.c:5257 +-#, fuzzy, gcc-internal-format +-msgid "casting %qT to %qT does not dereference pointer" +-msgstr "la conversió de \"%T\" a \"%T\" no dereferencia els punters" +- +-#: cp/cvt.c:497 +-#, fuzzy, gcc-internal-format +-msgid "cannot convert type %qT to type %qT" +-msgstr "no es pot convertir del tipus \"%T\" al tipus \"%T\"" +- +-#: cp/cvt.c:656 +-#, fuzzy, gcc-internal-format +-msgid "conversion from %q#T to %q#T" +-msgstr "conversió de \"%#T\" a \"%#T\"" +- +-#: cp/cvt.c:668 cp/cvt.c:688 +-#, fuzzy, gcc-internal-format +-msgid "%q#T used where a %qT was expected" +-msgstr "es va usar un \"%#T\" on s'esperava un \"%T\"" +- +-#: cp/cvt.c:703 +-#, fuzzy, gcc-internal-format +-msgid "%q#T used where a floating point value was expected" +-msgstr "es va usar un \"%#T\" on s'esperava un valor de coma flotant" +- +-#: cp/cvt.c:750 +-#, fuzzy, gcc-internal-format +-msgid "conversion from %qT to non-scalar type %qT requested" +-msgstr "es va sol·licitar la conversió des de \"%T\" al tipus no escalar \"%T\"" +- +-#: cp/cvt.c:784 +-#, fuzzy, gcc-internal-format +-msgid "pseudo-destructor is not called" +-msgstr "l'argument per a l'atribut \"%s\" és més gran que %d" +- +-#: cp/cvt.c:844 +-#, fuzzy, gcc-internal-format +-msgid "object of incomplete type %qT will not be accessed in %s" +-msgstr "l'objecte de tipus incomplet \"%T\" no es accesará en %s" +- +-#: cp/cvt.c:849 +-#, fuzzy, gcc-internal-format +-msgid "object of type %qT will not be accessed in %s" +-msgstr "l'objecte de tipus \"%T\" no es accesará en %s" +- +-#: cp/cvt.c:865 +-#, fuzzy, gcc-internal-format +-msgid "object %qE of incomplete type %qT will not be accessed in %s" +-msgstr "l'objecte \"%E\" de tipus incomplet \"%T\" no es accesará en %s" +- +-#. [over.over] enumerates the places where we can take the address +-#. of an overloaded function, and this is not one of them. +-#: cp/cvt.c:902 +-#, gcc-internal-format +-msgid "%s cannot resolve address of overloaded function" +-msgstr "%s no es pot resoldre l'adreça de la funció sobrecarregada" +- +-#. Only warn when there is no &. +-#: cp/cvt.c:909 +-#, fuzzy, gcc-internal-format +-msgid "%s is a reference, not call, to function %qE" +-msgstr "%s és una referència, no una cridada, a la funció \"%E\"" +- +-#: cp/cvt.c:926 +-#, fuzzy, gcc-internal-format +-msgid "%s has no effect" +-msgstr "%s no té %s" +- +-#: cp/cvt.c:958 +-#, fuzzy, gcc-internal-format +-msgid "value computed is not used" +-msgstr "l'autòmat \"%s\" no s'utilitza" +- +-#: cp/cvt.c:1068 +-#, gcc-internal-format +-msgid "converting NULL to non-pointer type" +-msgstr "convertint NULL a un tipus que no és punter" +- +-#: cp/cvt.c:1174 +-#, fuzzy, gcc-internal-format +-msgid "ambiguous default type conversion from %qT" +-msgstr "conversió de tipus per omissió ambigua des de \"%T\"" +- +-#: cp/cvt.c:1176 +-#, fuzzy, gcc-internal-format +-msgid " candidate conversions include %qD and %qD" +-msgstr " les conversions candidates inclouen \"%D\" i \"%D\"" +- +-#: cp/decl.c:1062 +-#, fuzzy, gcc-internal-format +-msgid "%qD was declared % and later %" +-msgstr "\"%s\" va ser declarat \"extern\" i després \"static\"" +- +-#: cp/decl.c:1063 cp/decl.c:1618 objc/objc-act.c:2931 objc/objc-act.c:7503 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+D" +-msgstr "declaració prèvia de \"%D\"" +- +-#: cp/decl.c:1096 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qF throws different exceptions" +-msgstr "la declaració de \"%F\" llança excepcions diferents" +- +-#: cp/decl.c:1097 +-#, fuzzy, gcc-internal-format +-msgid "from previous declaration %q+F" +-msgstr "que la declaració prèvia \"%F\"" +- +-#: cp/decl.c:1153 +-#, fuzzy, gcc-internal-format +-msgid "function %q+D redeclared as inline" +-msgstr "funció \"%s\" re declarada com «inline»" +- +-#: cp/decl.c:1155 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+D with attribute noinline" +-msgstr "declaració prèvia de la funció \"%s\" amb l'atribut «noinline»" +- +-#: cp/decl.c:1162 +-#, fuzzy, gcc-internal-format +-msgid "function %q+D redeclared with attribute noinline" +-msgstr "funció \"%s\" re-declarada amb l'atribut «noinline»" +- +-#: cp/decl.c:1164 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+D was inline" +-msgstr "la declaració prèvia de la funció \"%s\" va ser «inline»" +- +-#: cp/decl.c:1186 cp/decl.c:1259 +-#, fuzzy, gcc-internal-format +-msgid "shadowing %s function %q#D" +-msgstr "enfosquint la funció de biblioteca \"%#D\"" +- +-#: cp/decl.c:1195 +-#, fuzzy, gcc-internal-format +-msgid "library function %q#D redeclared as non-function %q#D" +-msgstr "la funció de biblioteca \"%#D\" és redeclarada com \"%#D\" que no és funció" +- +-#: cp/decl.c:1200 +-#, fuzzy, gcc-internal-format +-msgid "conflicts with built-in declaration %q#D" +-msgstr "causa conflicte amb la declaració interna \"%#D\"" +- +-#: cp/decl.c:1254 cp/decl.c:1380 cp/decl.c:1396 +-#, fuzzy, gcc-internal-format +-msgid "new declaration %q#D" +-msgstr "declaració nova \"%#D\"" +- +-#: cp/decl.c:1255 +-#, fuzzy, gcc-internal-format +-msgid "ambiguates built-in declaration %q#D" +-msgstr "fa ambigua la declaració interna \"%#D\"" +- +-#: cp/decl.c:1344 +-#, fuzzy, gcc-internal-format +-msgid "%q#D redeclared as different kind of symbol" +-msgstr "\"%#D\" redeclarat com un tipus diferent de símbol" +- +-#: cp/decl.c:1347 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+#D" +-msgstr "declaració prèvia de \"%#D\"" +- +-#: cp/decl.c:1366 +-#, fuzzy, gcc-internal-format +-msgid "declaration of template %q#D" +-msgstr "declaració del patró \"%#D\"" +- +-#: cp/decl.c:1367 cp/name-lookup.c:527 +-#, fuzzy, gcc-internal-format +-msgid "conflicts with previous declaration %q+#D" +-msgstr "causa conflictes amb la declaració prèvia \"%#D\"" +- +-#: cp/decl.c:1381 cp/decl.c:1397 +-#, fuzzy, gcc-internal-format +-msgid "ambiguates old declaration %q+#D" +-msgstr "fa ambigua la declaració antiga \"%#D\"" +- +-#: cp/decl.c:1389 +-#, fuzzy, gcc-internal-format +-msgid "declaration of C function %q#D conflicts with" +-msgstr "la declaració de la funció C \"%#D\" té conflictes amb" +- +-#: cp/decl.c:1391 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration %q+#D here" +-msgstr "declaració prèvia de \"%#D\" aquí" +- +-#: cp/decl.c:1405 +-#, fuzzy, gcc-internal-format +-msgid "conflicting declaration %q#D" +-msgstr "declaracions de \"%s\" en conflicte" +- +-#: cp/decl.c:1406 +-#, fuzzy, gcc-internal-format +-msgid "%q+D has a previous declaration as %q#D" +-msgstr "declaració prèvia com \"%#D\"" +- +-#. [namespace.alias] +-#. +-#. A namespace-name or namespace-alias shall not be declared as +-#. the name of any other entity in the same declarative region. +-#. A namespace-name defined at global scope shall not be +-#. declared as the name of any other entity in any global scope +-#. of the program. +-#: cp/decl.c:1458 +-#, fuzzy, gcc-internal-format +-msgid "declaration of namespace %qD conflicts with" +-msgstr "la declaració de la funció C \"%#D\" té conflictes amb" +- +-#: cp/decl.c:1459 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of namespace %q+D here" +-msgstr "declaració prèvia de \"%#D\" aquí" +- +-#: cp/decl.c:1470 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D previously defined here" +-msgstr "es va definir \"%#D\" prèviament aquí" +- +-#. Prototype decl follows defn w/o prototype. +-#: cp/decl.c:1480 +-#, fuzzy, gcc-internal-format +-msgid "prototype for %q+#D" +-msgstr "el prototip per a \"%#D\"" +- +-#: cp/decl.c:1481 +-#, fuzzy, gcc-internal-format +-msgid "%Jfollows non-prototype definition here" +-msgstr "a continuació la definició del no prototip aquí" +- +-#: cp/decl.c:1521 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration of %q+#D with %qL linkage" +-msgstr "declaració prèvia de \"%#D\" amb l'enllaç %L" +- +-#: cp/decl.c:1523 +-#, fuzzy, gcc-internal-format +-msgid "conflicts with new declaration with %qL linkage" +-msgstr "té conflictes amb la declaració nova amb l'enllaç %L" +- +-#: cp/decl.c:1546 cp/decl.c:1552 +-#, fuzzy, gcc-internal-format +-msgid "default argument given for parameter %d of %q#D" +-msgstr "argument per omissió donat per al paràmetre %d de \"%#D\"" +- +-#: cp/decl.c:1548 cp/decl.c:1554 +-#, fuzzy, gcc-internal-format +-msgid "after previous specification in %q+#D" +-msgstr "després de l'especificació prèvia en \"%#D\"" +- +-#: cp/decl.c:1563 +-#, fuzzy, gcc-internal-format +-msgid "%q#D was used before it was declared inline" +-msgstr "es va usar \"%#D\" abans que sigui declarat «inline»" +- +-#: cp/decl.c:1564 +-#, fuzzy, gcc-internal-format +-msgid "%Jprevious non-inline declaration here" +-msgstr "declaració prèvia no «inline» aquí" +- +-#: cp/decl.c:1617 +-#, fuzzy, gcc-internal-format +-msgid "redundant redeclaration of %qD in same scope" +-msgstr "declaració redundant de \"%D\" en el mateix àmbit" +- +-#. From [temp.expl.spec]: +-#. +-#. If a template, a member template or the member of a class +-#. template is explicitly specialized then that +-#. specialization shall be declared before the first use of +-#. that specialization that would cause an implicit +-#. instantiation to take place, in every translation unit in +-#. which such a use occurs. +-#: cp/decl.c:1932 +-#, fuzzy, gcc-internal-format +-msgid "explicit specialization of %qD after first use" +-msgstr "especialització explícita de %D després del primer ús" +- +-#: cp/decl.c:2028 +-#, fuzzy, gcc-internal-format +-msgid "%q+D: visibility attribute ignored because it" +-msgstr "s'ignora l'atribut \"%s\"" +- +-#: cp/decl.c:2030 +-#, fuzzy, gcc-internal-format +-msgid "%Jconflicts with previous declaration here" +-msgstr "causa conflictes amb la declaració prèvia \"%#D\"" +- +-#: cp/decl.c:2457 +-#, fuzzy, gcc-internal-format +-msgid "jump to label %qD" +-msgstr "salt a l'etiqueta \"%D\"" +- +-#: cp/decl.c:2459 +-#, gcc-internal-format +-msgid "jump to case label" +-msgstr "salt a l'etiqueta «case»" +- +-#: cp/decl.c:2461 +-#, fuzzy, gcc-internal-format +-msgid "%H from here" +-msgstr " des d'aquí" +- +-#: cp/decl.c:2480 cp/decl.c:2643 +-#, gcc-internal-format +-msgid " exits OpenMP structured block" +-msgstr "" +- +-#: cp/decl.c:2501 +-#, fuzzy, gcc-internal-format +-msgid " crosses initialization of %q+#D" +-msgstr " creua la inicialització de \"%#D\"" +- +-#: cp/decl.c:2503 cp/decl.c:2618 +-#, fuzzy, gcc-internal-format +-msgid " enters scope of non-POD %q+#D" +-msgstr " entra en l'àmbit de \"%#D\" que no és POD" +- +-#: cp/decl.c:2516 cp/decl.c:2622 +-#, gcc-internal-format +-msgid " enters try block" +-msgstr " entra intent de bloc" +- +-#: cp/decl.c:2518 cp/decl.c:2624 +-#, gcc-internal-format +-msgid " enters catch block" +-msgstr " entra captura de bloc" +- +-#: cp/decl.c:2528 cp/decl.c:2627 +-#, fuzzy, gcc-internal-format +-msgid " enters OpenMP structured block" +-msgstr " entra intent de bloc" +- +-#: cp/decl.c:2599 cp/decl.c:2639 +-#, fuzzy, gcc-internal-format +-msgid "jump to label %q+D" +-msgstr "salt a l'etiqueta \"%D\"" +- +-#: cp/decl.c:2600 cp/decl.c:2640 +-#, gcc-internal-format +-msgid " from here" +-msgstr " des d'aquí" +- +-#. Can't skip init of __exception_info. +-#: cp/decl.c:2612 +-#, fuzzy, gcc-internal-format +-msgid "%J enters catch block" +-msgstr " entra captura de bloc" +- +-#: cp/decl.c:2616 +-#, fuzzy, gcc-internal-format +-msgid " skips initialization of %q+#D" +-msgstr " salta la inicialización de \"%#D\"" +- +-#: cp/decl.c:2692 +-#, gcc-internal-format +-msgid "label named wchar_t" +-msgstr "etiqueta nomenada wchar_t" +- +-#: cp/decl.c:2696 +-#, fuzzy, gcc-internal-format +-msgid "duplicate label %qD" +-msgstr "etiqueta duplicada \"%D\"" +- +-#: cp/decl.c:2962 +-#, fuzzy, gcc-internal-format +-msgid "%qD is not a type" +-msgstr "\"%D::%D\" no és un patró" +- +-#: cp/decl.c:2968 cp/parser.c:4033 +-#, fuzzy, gcc-internal-format +-msgid "%qD used without template parameters" +-msgstr "s'usa \"%D\" sense paràmetres de patró" +- +-#: cp/decl.c:2983 +-#, fuzzy, gcc-internal-format +-msgid "%q#T is not a class" +-msgstr "\"%#T\" no és un patró" +- +-#: cp/decl.c:2995 cp/decl.c:3063 +-#, fuzzy, gcc-internal-format +-msgid "no class template named %q#T in %q#T" +-msgstr "no hi ha una patró de classe cridada \"%#T\" en \"%#T\"" +- +-#: cp/decl.c:3003 +-#, gcc-internal-format +-msgid "% names %q#T, which is not a class template" +-msgstr "" +- +-#: cp/decl.c:3010 +-#, gcc-internal-format +-msgid "% names %q#T, which is not a type" +-msgstr "" +- +-#: cp/decl.c:3072 +-#, fuzzy, gcc-internal-format +-msgid "template parameters do not match template" +-msgstr "els paràmetres del patró no poden ser friends" +- +-#: cp/decl.c:3073 cp/friend.c:321 cp/friend.c:329 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared here" +-msgstr " \"%#D\" declarat aquí" +- +-#: cp/decl.c:3711 +-#, fuzzy, gcc-internal-format +-msgid "%Jan anonymous struct cannot have function members" +-msgstr "un union anònim no pot tenir funcions membre" +- +-#: cp/decl.c:3713 +-#, fuzzy, gcc-internal-format +-msgid "%Jan anonymous union cannot have function members" +-msgstr "un union anònim no pot tenir funcions membre" +- +-#: cp/decl.c:3731 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with constructor not allowed in anonymous aggregate" +-msgstr "no es permet el membre \"%#D\" amb constructor en un agregat anònim" +- +-#: cp/decl.c:3734 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with destructor not allowed in anonymous aggregate" +-msgstr "no es permet el membre \"%#D\" amb destructor en un agregat anònim" +- +-#: cp/decl.c:3737 +-#, fuzzy, gcc-internal-format +-msgid "member %q+#D with copy assignment operator not allowed in anonymous aggregate" +-msgstr "no es permet el membre \"%#D\" amb operador d'assignació de còpia en un agregat anònim" +- +-#: cp/decl.c:3762 +-#, gcc-internal-format +-msgid "multiple types in one declaration" +-msgstr "tipus múltiples en una declaració" +- +-#: cp/decl.c:3766 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of C++ built-in type %qT" +-msgstr "redeclaració del tipus intern de C++ \"%T\"" +- +-#: cp/decl.c:3803 +-#, gcc-internal-format +-msgid "missing type-name in typedef-declaration" +-msgstr "falta el nom del tipus en la declaració typedef" +- +-#: cp/decl.c:3811 +-#, gcc-internal-format +-msgid "ISO C++ prohibits anonymous structs" +-msgstr "ISO C++ prohibeix structs anònims" +- +-#: cp/decl.c:3818 +-#, fuzzy, gcc-internal-format +-msgid "%qs can only be specified for functions" +-msgstr "\"%D\" només pot ser especificat per a funcions" +- +-#: cp/decl.c:3824 +-#, fuzzy, gcc-internal-format +-msgid "% can only be specified inside a class" +-msgstr "\"%D\" només pot ser especificat dintre d'una classe" +- +-#: cp/decl.c:3826 +-#, fuzzy, gcc-internal-format +-msgid "% can only be specified for constructors" +-msgstr "\"%D\" només pot ser especificat per a constructors" +- +-#: cp/decl.c:3828 +-#, fuzzy, gcc-internal-format +-msgid "a storage class can only be specified for objects and functions" +-msgstr "\"%D\" només pot ser especificat per a objectes i funcions" +- +-#: cp/decl.c:3834 +-#, fuzzy, gcc-internal-format +-msgid "qualifiers can only be specified for objects and functions" +-msgstr "\"%D\" només pot ser especificat per a objectes i funcions" +- +-#: cp/decl.c:3837 +-#, fuzzy, gcc-internal-format +-msgid "% was ignored in this declaration" +-msgstr "el tipus de dada per omissió és \"int\" en la declaració de \"%s\"" +- +-#: cp/decl.c:3866 +-#, fuzzy, gcc-internal-format +-msgid "attribute ignored in declaration of %q+#T" +-msgstr "declaració friend prèvia de \"%D\"" +- +-#: cp/decl.c:3867 +-#, gcc-internal-format +-msgid "attribute for %q+#T must follow the %qs keyword" +-msgstr "" +- +-#: cp/decl.c:3909 +-#, fuzzy, gcc-internal-format +-msgid "ignoring attributes applied to class type outside of definition" +-msgstr "l'atribut \"%s\" sol es pot aplicar a definicions de classe" +- +-#: cp/decl.c:3987 +-#, fuzzy, gcc-internal-format +-msgid "function %q#D is initialized like a variable" +-msgstr "la funció \"%#D\" està inicialitzada com una variable" +- +-#: cp/decl.c:3998 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q#D has % and is initialized" +-msgstr "la declaració de \"%#D\" té \"extern\" i està inicialitzada" +- +-#: cp/decl.c:4014 +-#, fuzzy, gcc-internal-format +-msgid "definition of %q#D is marked %" +-msgstr "la definició de la funció \"%s\" està marcada com dllimport" +- +-#: cp/decl.c:4033 +-#, fuzzy, gcc-internal-format +-msgid "%q#D is not a static member of %q#T" +-msgstr "\"%#D\" no és un membre static de \"%#T\"" +- +-#: cp/decl.c:4039 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ does not permit %<%T::%D%> to be defined as %<%T::%D%>" +-msgstr "ISO C++ no permet que \"%T::%D\" es defineixi com \"%T::%D\"" +- +-#: cp/decl.c:4048 +-#, gcc-internal-format +-msgid "template header not allowed in member definition of explicitly specialized class" +-msgstr "" +- +-#: cp/decl.c:4056 +-#, fuzzy, gcc-internal-format +-msgid "duplicate initialization of %qD" +-msgstr "inicialització duplicada de %D" +- +-#: cp/decl.c:4095 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q#D outside of class is not definition" +-msgstr "la declaració de \"%#D\" fora de la classe no és una definició" +- +-#: cp/decl.c:4188 +-#, fuzzy, gcc-internal-format +-msgid "variable %q#D has initializer but incomplete type" +-msgstr "la variable \"%#D\" té inicializador però de tipus de dada incompleta" +- +-#: cp/decl.c:4194 cp/decl.c:4906 +-#, fuzzy, gcc-internal-format +-msgid "elements of array %q#D have incomplete type" +-msgstr "alguns elements de la matriu \"%#D\" tenen tipus de dada incompleta" +- +-#: cp/decl.c:4200 +-#, fuzzy, gcc-internal-format +-msgid "aggregate %q#D has incomplete type and cannot be defined" +-msgstr "l'agregat \"%#D\" té un tipus incomplet i no es pot definir" +- +-#: cp/decl.c:4236 +-#, fuzzy, gcc-internal-format +-msgid "%qD declared as reference but not initialized" +-msgstr "\"%D\" declarat com referència però no està inicialitzat" +- +-#: cp/decl.c:4242 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids use of initializer list to initialize reference %qD" +-msgstr "ISO C++ prohibeix l'ús d'una llista de inicialitzadors per a inicialitzar la referència \"%D\"" +- +-#: cp/decl.c:4268 +-#, fuzzy, gcc-internal-format +-msgid "cannot initialize %qT from %qT" +-msgstr "no es pot inicialitzar \"%T\" des de \"%T\"" +- +-#: cp/decl.c:4296 +-#, gcc-internal-format +-msgid "name %qD used in a GNU-style designated initializer for an array" +-msgstr "" +- +-#: cp/decl.c:4345 +-#, fuzzy, gcc-internal-format +-msgid "initializer fails to determine size of %qD" +-msgstr "l'inicializador no pot determinar la grandària de \"%D\"" +- +-#: cp/decl.c:4352 +-#, fuzzy, gcc-internal-format +-msgid "array size missing in %qD" +-msgstr "falta la grandària de la matriu en \"%D\"" +- +-#: cp/decl.c:4364 +-#, fuzzy, gcc-internal-format +-msgid "zero-size array %qD" +-msgstr "matriu \"%D\" de grandària zero" +- +-#. An automatic variable with an incomplete type: that is an error. +-#. Don't talk about array types here, since we took care of that +-#. message in grokdeclarator. +-#: cp/decl.c:4407 +-#, fuzzy, gcc-internal-format +-msgid "storage size of %qD isn't known" +-msgstr "no es coneix la grandària d'emmagatzematge de \"%D\"" +- +-#: cp/decl.c:4429 +-#, fuzzy, gcc-internal-format +-msgid "storage size of %qD isn't constant" +-msgstr "la grandària d'emmagatzematge de \"%D\" no és constant" +- +-#: cp/decl.c:4478 +-#, fuzzy, gcc-internal-format +-msgid "sorry: semantics of inline function static data %q+#D are wrong (you'll wind up with multiple copies)" +-msgstr "perdó: la semàntica de les dades static de la funció «inline» \"%#D\" és errònia (acabarà amb múltiples còpies)" +- +-#: cp/decl.c:4481 +-#, fuzzy, gcc-internal-format +-msgid "%J you can work around this by removing the initializer" +-msgstr " pot evitar això eliminant l'inicializador" +- +-#: cp/decl.c:4508 +-#, fuzzy, gcc-internal-format +-msgid "uninitialized const %qD" +-msgstr "const \"%D\" sense inicialitzar" +- +-#: cp/decl.c:4620 +-#, fuzzy, gcc-internal-format +-msgid "invalid type %qT as initializer for a vector of type %qT" +-msgstr "inicialitzador no vàlid per al mètode virtual \"%D\"" +- +-#: cp/decl.c:4662 +-#, fuzzy, gcc-internal-format +-msgid "initializer for %qT must be brace-enclosed" +-msgstr "l'inicialitzador per a \"%T\" ha d'estar tancat entre parèntesis" +- +-#: cp/decl.c:4680 +-#, fuzzy, gcc-internal-format +-msgid "%qT has no non-static data member named %qD" +-msgstr "\"%T\" té una dada membre que no és non-static cridada \"%D\"" +- +-#: cp/decl.c:4731 +-#, fuzzy, gcc-internal-format +-msgid "braces around scalar initializer for type %qT" +-msgstr "parèntesis al voltant de l'inicialitzador per a \"%T\"" +- +-#: cp/decl.c:4814 +-#, fuzzy, gcc-internal-format +-msgid "missing braces around initializer for %qT" +-msgstr "falten claus al voltant dels valors inicials" +- +-#: cp/decl.c:4871 +-#, fuzzy, gcc-internal-format +-msgid "too many initializers for %qT" +-msgstr "massa inicialitzadors per a \"%T\"" +- +-#: cp/decl.c:4914 +-#, fuzzy, gcc-internal-format +-msgid "variable-sized object %qD may not be initialized" +-msgstr "l'objecte de grandària variable \"%D\" no pot ser inicialitzat" +- +-#: cp/decl.c:4920 +-#, fuzzy, gcc-internal-format +-msgid "%qD has incomplete type" +-msgstr "\"%D\" té un tipus de dada incompleta" +- +-#: cp/decl.c:4935 +-#, fuzzy, gcc-internal-format +-msgid "scalar object %qD requires one element in initializer" +-msgstr "excés d'elements en valors inicials d'union" +- +-#. A non-aggregate that is not a scalar cannot be initialized +-#. via an initializer-list in C++98. +-#: cp/decl.c:4945 +-#, fuzzy, gcc-internal-format +-msgid "braces around initializer for non-aggregate type %qT" +-msgstr "parèntesis al voltant de l'inicialitzador per a \"%T\"" +- +-#: cp/decl.c:4995 +-#, fuzzy, gcc-internal-format +-msgid "%qD must be initialized by constructor, not by %<{...}%>" +-msgstr "\"%D\" ha de ser inicialitzat per un constructor, no per \"{...}\"" +- +-#: cp/decl.c:5031 +-#, fuzzy, gcc-internal-format +-msgid "array %qD initialized by parenthesized string literal %qE" +-msgstr "_Pragma duu una cadena literal entre parèntesis" +- +-#: cp/decl.c:5046 +-#, fuzzy, gcc-internal-format +-msgid "structure %qD with uninitialized const members" +-msgstr "estructura \"%D\" amb membres const sense inicialitzar" +- +-#: cp/decl.c:5048 +-#, fuzzy, gcc-internal-format +-msgid "structure %qD with uninitialized reference members" +-msgstr "estructura \"%D\" amb membres de referència sense inicialitzar" +- +-#: cp/decl.c:5330 +-#, gcc-internal-format +-msgid "assignment (not initialization) in declaration" +-msgstr "assignació (no inicialització) en la declaració" +- +-#: cp/decl.c:5420 +-#, fuzzy, gcc-internal-format +-msgid "shadowing previous type declaration of %q#D" +-msgstr "enfosquint la declaració de tipus prèvia de \"%#D\"" +- +-#: cp/decl.c:5450 +-#, fuzzy, gcc-internal-format +-msgid "%qD cannot be thread-local because it has non-POD type %qT" +-msgstr "\"%D\" no pot ser thread-local perquè és de tipus \"%T\" que no és POD" +- +-#: cp/decl.c:5485 +-#, fuzzy, gcc-internal-format +-msgid "%qD is thread-local and so cannot be dynamically initialized" +-msgstr "\"%D\" és thread-local i per tant no es pot inicialitzar dinàmicament" +- +-#: cp/decl.c:5503 +-#, fuzzy, gcc-internal-format +-msgid "%qD cannot be initialized by a non-constant expression when being declared" +-msgstr "matriu amb valors inicials assignats d'una expressió matricial que no és constant" +- +-#: cp/decl.c:6160 +-#, fuzzy, gcc-internal-format +-msgid "destructor for alien class %qT cannot be a member" +-msgstr "el destructor per a la classe estrangera \"%T\" no pot ser un membre" +- +-#: cp/decl.c:6162 +-#, fuzzy, gcc-internal-format +-msgid "constructor for alien class %qT cannot be a member" +-msgstr "el constructor per a la classe estrangera \"%T\" no pot ser un membre" +- +-#: cp/decl.c:6183 +-#, fuzzy, gcc-internal-format +-msgid "%qD declared as a % %s" +-msgstr "\"%D\" va ser declarat com un %s \"virtual\"" +- +-#: cp/decl.c:6185 +-#, fuzzy, gcc-internal-format +-msgid "%qD declared as an % %s" +-msgstr "\"%D\" va ser declarat com un %s \"inline\"" +- +-#: cp/decl.c:6187 +-#, fuzzy, gcc-internal-format +-msgid "% and % function specifiers on %qD invalid in %s declaration" +-msgstr "especificadors de funció \"const\" i \"volatile\" en \"%D\" no vàlids en la declaració %s" +- +-#: cp/decl.c:6191 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared as a friend" +-msgstr "\"%D\" declarat com un friend" +- +-#: cp/decl.c:6197 +-#, fuzzy, gcc-internal-format +-msgid "%q+D declared with an exception specification" +-msgstr "\"%D\" declarat amb una excepció d'especificació" +- +-#: cp/decl.c:6231 +-#, fuzzy, gcc-internal-format +-msgid "definition of %qD is not in namespace enclosing %qT" +-msgstr "la declaració de \"%D\" no està en un espai de noms al voltant de \"%D\"" +- +-#: cp/decl.c:6342 +-#, fuzzy, gcc-internal-format +-msgid "defining explicit specialization %qD in friend declaration" +-msgstr "definint l'especialització explícita \"%D\" en la declaració friend" +- +-#. Something like `template friend void f()'. +-#: cp/decl.c:6352 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of template-id %qD in declaration of primary template" +-msgstr "ús no vàlid de l'aneu de patró \"%D\" en la declaració del patró primàri" +- +-#: cp/decl.c:6382 +-#, fuzzy, gcc-internal-format +-msgid "default arguments are not allowed in declaration of friend template specialization %qD" +-msgstr "no es permeten els argument per omissió en la declaració de l'especialització friend del patró \"%D\"" +- +-#: cp/decl.c:6390 +-#, fuzzy, gcc-internal-format +-msgid "% is not allowed in declaration of friend template specialization %qD" +-msgstr "no es permet \"inline\" en la declaració de l'especialització friend del patró \"%D\"" +- +-#: cp/decl.c:6433 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare %<::main%> to be a template" +-msgstr "no es pot declarar \"::main\" com template" +- +-#: cp/decl.c:6435 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare %<::main%> to be inline" +-msgstr "no es pot declarar \"::main\" com «inline»" +- +-#: cp/decl.c:6437 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare %<::main%> to be static" +-msgstr "no es pot declarar \"::main\" com static" +- +-#: cp/decl.c:6465 +-#, fuzzy, gcc-internal-format +-msgid "non-local function %q#D uses anonymous type" +-msgstr "la funció \"%#D\" que no és local usa un tipus anònim" +- +-#: cp/decl.c:6468 cp/decl.c:6748 +-#, fuzzy, gcc-internal-format +-msgid "%q+#D does not refer to the unqualified type, so it is not used for linkage" +-msgstr "\"%#D\" no es refereix al tipus sense qualificar, així que no s'usa per a l'enllaçat" +- +-#: cp/decl.c:6474 +-#, fuzzy, gcc-internal-format +-msgid "non-local function %q#D uses local type %qT" +-msgstr "la funció \"%#D\" que no és local utilitza el tipus local \"%T\"" +- +-#: cp/decl.c:6498 +-#, fuzzy, gcc-internal-format +-msgid "static member function %qD cannot have cv-qualifier" +-msgstr "%sfunció membre \"%D\" no pot tenir el qualificador de mètode \"%T\"" +- +-#: cp/decl.c:6499 +-#, fuzzy, gcc-internal-format +-msgid "non-member function %qD cannot have cv-qualifier" +-msgstr "%sfunció membre \"%D\" no pot tenir el qualificador de mètode \"%T\"" +- +-#: cp/decl.c:6547 +-#, fuzzy, gcc-internal-format +-msgid "%<::main%> must return %" +-msgstr "\"main\" ha de retornar \"int\"" +- +-#: cp/decl.c:6586 +-#, fuzzy, gcc-internal-format +-msgid "definition of implicitly-declared %qD" +-msgstr "la definició de \"%D\" declarat implícitament" +- +-#: cp/decl.c:6603 cp/decl2.c:677 +-#, fuzzy, gcc-internal-format +-msgid "no %q#D member function declared in class %qT" +-msgstr "no hi ha una funció membre \"%#D\" declarada en la classe \"%T\"" +- +-#. DRs 132, 319 and 389 seem to indicate types with +-#. no linkage can only be used to declare extern "C" +-#. entities. Since it's not always an error in the +-#. ISO C++ 90 Standard, we only issue a warning. +-#: cp/decl.c:6745 +-#, fuzzy, gcc-internal-format +-msgid "non-local variable %q#D uses anonymous type" +-msgstr "la funció \"%#D\" que no és local usa un tipus anònim" +- +-#: cp/decl.c:6754 +-#, fuzzy, gcc-internal-format +-msgid "non-local variable %q#D uses local type %qT" +-msgstr "la funció \"%#D\" que no és local utilitza el tipus local \"%T\"" +- +-#: cp/decl.c:6876 +-#, fuzzy, gcc-internal-format +-msgid "invalid in-class initialization of static data member of non-integral type %qT" +-msgstr "ISO C++ prohibeix la inicialització del membre constant \"%D\" del tipus \"%T\" que no és enter" +- +-#: cp/decl.c:6886 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids in-class initialization of non-const static member %qD" +-msgstr "ISO C++ prohibeix la inicialización en la classe del membre static \"%D\" que no és constant" +- +-#: cp/decl.c:6890 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids initialization of member constant %qD of non-integral type %qT" +-msgstr "ISO C++ prohibeix la inicialització del membre constant \"%D\" del tipus \"%T\" que no és enter" +- +-#: cp/decl.c:6915 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qD has non-integral type %qT" +-msgstr "la grandària de la matriu \"%D\" té un tipus no enter" +- +-#: cp/decl.c:6917 +-#, fuzzy, gcc-internal-format +-msgid "size of array has non-integral type %qT" +-msgstr "la grandària de la matriu té un tipus no enter" +- +-#: cp/decl.c:6965 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qD is negative" +-msgstr "la grandària de la matriu \"%D\" és negatiu" +- +-#: cp/decl.c:6967 +-#, gcc-internal-format +-msgid "size of array is negative" +-msgstr "la grandària de la matriu és negatiu" +- +-#: cp/decl.c:6975 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids zero-size array %qD" +-msgstr "ISO C++ prohibeix la matriu \"%D\" de grandària zero" +- +-#: cp/decl.c:6977 +-#, gcc-internal-format +-msgid "ISO C++ forbids zero-size array" +-msgstr "ISO C++ prohibeix la matriu de grandària zero" +- +-#: cp/decl.c:6984 +-#, fuzzy, gcc-internal-format +-msgid "size of array %qD is not an integral constant-expression" +-msgstr "la grandària de la matriu \"%D\" no és una expressió constant integral" +- +-#: cp/decl.c:6987 +-#, gcc-internal-format +-msgid "size of array is not an integral constant-expression" +-msgstr "la grandària de la matriu no és una expressió constant integral" +- +-#: cp/decl.c:6993 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids variable length array %qD" +-msgstr "ISO C++ prohibeix la matriu \"%D\" de grandària variable" +- +-#: cp/decl.c:6995 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids variable length array" +-msgstr "ISO C++ prohibeix la matriu de grandària variable" +- +-#: cp/decl.c:7001 +-#, gcc-internal-format +-msgid "variable length array %qD is used" +-msgstr "" +- +-#: cp/decl.c:7035 +-#, gcc-internal-format +-msgid "overflow in array dimension" +-msgstr "desbordament en la dimensió de la matriu" +- +-#: cp/decl.c:7116 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD as %s" +-msgstr "declaración de \"%D\" com %s" +- +-#: cp/decl.c:7118 +-#, gcc-internal-format +-msgid "creating %s" +-msgstr "creant %s" +- +-#: cp/decl.c:7130 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD as multidimensional array must have bounds for all dimensions except the first" +-msgstr "la declaració de \"%D\" com una matriu multidimensional ha de tenir límits per a totes les dimensions excepte la primera" +- +-#: cp/decl.c:7134 +-#, gcc-internal-format +-msgid "multidimensional array must have bounds for all dimensions except the first" +-msgstr "una matriu multidimensional ha de tenir límits per a totes les dimensions excepte per a la primera" +- +-#: cp/decl.c:7169 +-#, gcc-internal-format +-msgid "return type specification for constructor invalid" +-msgstr "l'especificació del tipus de retorn per al constructor no és vàlid" +- +-#: cp/decl.c:7179 +-#, gcc-internal-format +-msgid "return type specification for destructor invalid" +-msgstr "l'especificació del tipus de retorn per al destructor no és vàlid" +- +-#: cp/decl.c:7192 +-#, fuzzy, gcc-internal-format +-msgid "return type specified for %" +-msgstr "es va especificar un tipus de retorn per a \"operator %T\"" +- +-#: cp/decl.c:7214 +-#, gcc-internal-format +-msgid "unnamed variable or field declared void" +-msgstr "variable sense nom o camp declarat void" +- +-#: cp/decl.c:7218 +-#, fuzzy, gcc-internal-format +-msgid "variable or field %qE declared void" +-msgstr "variable o camp \"%s\" declarat void" +- +-#: cp/decl.c:7221 +-#, gcc-internal-format +-msgid "variable or field declared void" +-msgstr "variable o camp declarat void" +- +-#: cp/decl.c:7388 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of qualified-name %<::%D%>" +-msgstr "ús no vàlid del membre \"%D\"" +- +-#: cp/decl.c:7391 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of qualified-name %<%T::%D%>" +-msgstr "definició no vàlida del tipus qualificat \"%T\"" +- +-#: cp/decl.c:7394 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of qualified-name %<%D::%D%>" +-msgstr "ús no vàlid del membre \"%D\"" +- +-#: cp/decl.c:7406 +-#, fuzzy, gcc-internal-format +-msgid "type %qT is not derived from type %qT" +-msgstr "el tipus \"%T\" no és derivat del tipus \"%T\"" +- +-#: cp/decl.c:7422 cp/decl.c:7512 cp/decl.c:8660 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD as non-function" +-msgstr "la declaració de \"%D\" com una no funció" +- +-#: cp/decl.c:7428 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD as non-member" +-msgstr "la declaració de \"%D\" com una no funció" +- +-#: cp/decl.c:7457 +-#, fuzzy, gcc-internal-format +-msgid "declarator-id missing; using reserved word %qD" +-msgstr "falta l'identificador del declarador; utilitzant la paraula reservada \"%D\"" +- +-#: cp/decl.c:7504 +-#, fuzzy, gcc-internal-format +-msgid "function definition does not declare parameters" +-msgstr "la definició de la funció ho va declarar com \"register\"" +- +-#: cp/decl.c:7546 +-#, fuzzy, gcc-internal-format +-msgid "two or more data types in declaration of %qs" +-msgstr "dos o més tipus de dades en la declaració de \"%s\"" +- +-#: cp/decl.c:7552 +-#, fuzzy, gcc-internal-format +-msgid "conflicting specifiers in declaration of %qs" +-msgstr "declaracions de \"%s\" en conflicte" +- +-#: cp/decl.c:7623 cp/decl.c:7626 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids declaration of %qs with no type" +-msgstr "ISO C++ prohibeix la declaració de \"%s\" sense tipus" +- +-#: cp/decl.c:7651 +-#, fuzzy, gcc-internal-format +-msgid "% or % invalid for %qs" +-msgstr "short, signed o unsigned no vàlid per a \"%s\"" +- +-#: cp/decl.c:7653 +-#, fuzzy, gcc-internal-format +-msgid "% and % specified together for %qs" +-msgstr "es van donar junts signed i unsigned per a \"%s\"" +- +-#: cp/decl.c:7655 +-#, fuzzy, gcc-internal-format +-msgid "% invalid for %qs" +-msgstr "complex no vàlid per a \"%s\"" +- +-#: cp/decl.c:7657 +-#, fuzzy, gcc-internal-format +-msgid "% invalid for %qs" +-msgstr "complex no vàlid per a \"%s\"" +- +-#: cp/decl.c:7659 +-#, fuzzy, gcc-internal-format +-msgid "% invalid for %qs" +-msgstr "complex no vàlid per a \"%s\"" +- +-#: cp/decl.c:7661 +-#, fuzzy, gcc-internal-format +-msgid "% or % invalid for %qs" +-msgstr "long, short, signed o unsigned no vàlids per a \"%s\"" +- +-#: cp/decl.c:7663 +-#, fuzzy, gcc-internal-format +-msgid "% or % specified with char for %qs" +-msgstr "s'especifica long o short amb char per a \"%s\"" +- +-#: cp/decl.c:7665 +-#, fuzzy, gcc-internal-format +-msgid "% and % specified together for %qs" +-msgstr "long i short especificats junts per a \"%s\"" +- +-#: cp/decl.c:7671 +-#, fuzzy, gcc-internal-format +-msgid "long, short, signed or unsigned used invalidly for %qs" +-msgstr "ús no vàlid de long, short, signed o unsigned per a \"%s\"" +- +-#: cp/decl.c:7735 +-#, fuzzy, gcc-internal-format +-msgid "complex invalid for %qs" +-msgstr "complex no vàlid per a \"%s\"" +- +-#: cp/decl.c:7764 +-#, fuzzy, gcc-internal-format +-msgid "qualifiers are not allowed on declaration of %" +-msgstr "no es permeten qualificadors en la declaració de \"operator %T\"" +- +-#: cp/decl.c:7776 cp/typeck.c:7011 +-#, fuzzy, gcc-internal-format +-msgid "ignoring %qV qualifiers added to function type %qT" +-msgstr "qualificadors no vàlids en el tipus de funció no membre" +- +-#: cp/decl.c:7799 +-#, fuzzy, gcc-internal-format +-msgid "member %qD cannot be declared both virtual and static" +-msgstr "\"%D\" no es pot declarar virtual, ja que sempre és static" +- +-#: cp/decl.c:7807 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%D%> is not a valid declarator" +-msgstr "\"%T::%D\" no és una declaració vàlida" +- +-#: cp/decl.c:7816 +-#, gcc-internal-format +-msgid "typedef declaration invalid in parameter declaration" +-msgstr "declaració typedef no vàlida en la declaració de paràmetres" +- +-#: cp/decl.c:7822 +-#, gcc-internal-format +-msgid "storage class specifiers invalid in parameter declarations" +-msgstr "especificadors de classe d'emmagatzematge no vàlids en les declaracions de paràmetres" +- +-#: cp/decl.c:7829 +-#, gcc-internal-format +-msgid "virtual outside class declaration" +-msgstr "declaració de virtual fora de class" +- +-#: cp/decl.c:7847 +-#, fuzzy, gcc-internal-format +-msgid "multiple storage classes in declaration of %qs" +-msgstr "múltiples classes d'emmagatzematge en la declaració de \"%s\"" +- +-#: cp/decl.c:7870 +-#, fuzzy, gcc-internal-format +-msgid "storage class specified for %qs" +-msgstr "classe d'emmagatzematge especificada per %s \"%s\"" +- +-#: cp/decl.c:7904 +-#, fuzzy, gcc-internal-format +-msgid "top-level declaration of %qs specifies %" +-msgstr "la declaració del nivell superior de \"%s\" especifica \"auto\"" +- +-#: cp/decl.c:7916 +-#, gcc-internal-format +-msgid "storage class specifiers invalid in friend function declarations" +-msgstr "especificadors de classe d'emmagatzematge no vàlids en les declaracions de funcions friend" +- +-#: cp/decl.c:8043 +-#, gcc-internal-format +-msgid "destructor cannot be static member function" +-msgstr "el destructor no pot ser una funció membre de tipus static" +- +-#: cp/decl.c:8048 +-#, fuzzy, gcc-internal-format +-msgid "destructors may not be cv-qualified" +-msgstr "els destructors no poden ser \"%s\"" +- +-#: cp/decl.c:8066 +-#, gcc-internal-format +-msgid "constructors cannot be declared virtual" +-msgstr "els constructors no poden ser declarats virtual" +- +-#: cp/decl.c:8079 +-#, fuzzy, gcc-internal-format +-msgid "can't initialize friend function %qs" +-msgstr "no es pot inicialitzar la funció friend \"%s\"" +- +-#. Cannot be both friend and virtual. +-#: cp/decl.c:8083 +-#, gcc-internal-format +-msgid "virtual functions cannot be friends" +-msgstr "les funcions virtuals no poden ser friend" +- +-#: cp/decl.c:8087 +-#, gcc-internal-format +-msgid "friend declaration not in class definition" +-msgstr "la declaració friend no està en una definició de classe" +- +-#: cp/decl.c:8089 +-#, fuzzy, gcc-internal-format +-msgid "can't define friend function %qs in a local class definition" +-msgstr "no es pot definir la funció friend \"%s\" en una definició de classe local" +- +-#: cp/decl.c:8102 +-#, gcc-internal-format +-msgid "destructors may not have parameters" +-msgstr "els destructors no poden tenir paràmetres" +- +-#: cp/decl.c:8121 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare pointer to %q#T" +-msgstr "no es pot declarar un punter a \"%#T\"" +- +-#: cp/decl.c:8134 cp/decl.c:8141 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare reference to %q#T" +-msgstr "no es poden declarar referències a \"%#T\"" +- +-#: cp/decl.c:8143 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare pointer to %q#T member" +-msgstr "no es pot declarar un punter al membre \"%#T\"" +- +-#: cp/decl.c:8194 +-#, gcc-internal-format +-msgid "cannot declare reference to %q#T, which is not a typedef or a template type argument" +-msgstr "" +- +-#: cp/decl.c:8238 +-#, fuzzy, gcc-internal-format +-msgid "template-id %qD used as a declarator" +-msgstr "l'identificador de patró \"%D\" s'usa com un declarador" +- +-#: cp/decl.c:8289 +-#, gcc-internal-format +-msgid "member functions are implicitly friends of their class" +-msgstr "les funcions membres són implícitament friends de la seva classe" +- +-#: cp/decl.c:8293 +-#, fuzzy, gcc-internal-format +-msgid "extra qualification %<%T::%> on member %qs" +-msgstr "s'ignora la qualificació extra `%T::' en el membre \"%s\"" +- +-#: cp/decl.c:8325 +-#, fuzzy, gcc-internal-format +-msgid "cannot define member function %<%T::%s%> within %<%T%>" +-msgstr "no es pot declarar la funció membre \"%T::%s\" dintre de \"%T\"" +- +-#: cp/decl.c:8342 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare member %<%T::%s%> within %qT" +-msgstr "no es pot declarar el membre \"%T::%s\" dintre de \"%T\"" +- +-#: cp/decl.c:8365 +-#, fuzzy, gcc-internal-format +-msgid "non-parameter %qs cannot be a parameter pack" +-msgstr "les dades membres \"%D\" no poden ser un patró membre" +- +-#: cp/decl.c:8386 +-#, fuzzy, gcc-internal-format +-msgid "data member may not have variably modified type %qT" +-msgstr "l'argument de patró \"%T\" és un tipus modificat variablement" +- +-#: cp/decl.c:8388 +-#, fuzzy, gcc-internal-format +-msgid "parameter may not have variably modified type %qT" +-msgstr "l'argument de patró \"%T\" és un tipus modificat variablement" +- +-#. [dcl.fct.spec] The explicit specifier shall only be used in +-#. declarations of constructors within a class definition. +-#: cp/decl.c:8396 +-#, fuzzy, gcc-internal-format +-msgid "only declarations of constructors can be %" +-msgstr "solament les declaracions de constructors poden ser \"explicit\"" +- +-#: cp/decl.c:8404 +-#, fuzzy, gcc-internal-format +-msgid "non-member %qs cannot be declared %" +-msgstr "el no-membre \"%s\" no pot ser declarat \"mutable\"" +- +-#: cp/decl.c:8409 +-#, fuzzy, gcc-internal-format +-msgid "non-object member %qs cannot be declared %" +-msgstr "el membre non-objecte \"%s\" no pot ser declarat \"mutable\"" +- +-#: cp/decl.c:8415 +-#, fuzzy, gcc-internal-format +-msgid "function %qs cannot be declared %" +-msgstr "la funció \"%s\" no pot ser declarada \"mutable\"" +- +-#: cp/decl.c:8420 +-#, fuzzy, gcc-internal-format +-msgid "static %qs cannot be declared %" +-msgstr "static \"%s\" no pot ser declarat \"mutable\"" +- +-#: cp/decl.c:8425 +-#, fuzzy, gcc-internal-format +-msgid "const %qs cannot be declared %" +-msgstr "const \"%s\" no pot ser declarat \"mutable\"" +- +-#: cp/decl.c:8462 +-#, fuzzy, gcc-internal-format +-msgid "%Jtypedef name may not be a nested-name-specifier" +-msgstr "el nom de la definició de tipus pot no ser qualificada per a la classe" +- +-#: cp/decl.c:8478 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids nested type %qD with same name as enclosing class" +-msgstr "ISO C++ prohibeix el tipus niat \"%D\" amb el mateix nom que la classe que ho conté" +- +-#: cp/decl.c:8564 +-#, fuzzy, gcc-internal-format +-msgid "qualified function types cannot be used to declare static member functions" +-msgstr "el destructor no pot ser una funció membre de tipus static" +- +-#: cp/decl.c:8566 +-#, fuzzy, gcc-internal-format +-msgid "qualified function types cannot be used to declare free functions" +-msgstr "el tipus de retorn d'una funció no pot ser una funció" +- +-#: cp/decl.c:8592 +-#, gcc-internal-format +-msgid "type qualifiers specified for friend class declaration" +-msgstr "es van especificar qualificadors de tipus en una declaració de classe friend" +- +-#: cp/decl.c:8597 +-#, fuzzy, gcc-internal-format +-msgid "% specified for friend class declaration" +-msgstr "es va especificar \"inline\" per a la declaració de classe friend" +- +-#: cp/decl.c:8605 +-#, gcc-internal-format +-msgid "template parameters cannot be friends" +-msgstr "els paràmetres del patró no poden ser friends" +- +-#: cp/decl.c:8607 +-#, fuzzy, gcc-internal-format +-msgid "friend declaration requires class-key, i.e. %" +-msgstr "la declaració friend requereix una clau de classe, ex. \"friend class %T::%D\"" +- +-#: cp/decl.c:8611 +-#, fuzzy, gcc-internal-format +-msgid "friend declaration requires class-key, i.e. %" +-msgstr "la declaració friend requereix una clau de classe, ex. \"friend %#T\"" +- +-#: cp/decl.c:8624 +-#, fuzzy, gcc-internal-format +-msgid "trying to make class %qT a friend of global scope" +-msgstr "tractant fer que la classe \"%T\" sigui un friend d'àmbit global" +- +-#: cp/decl.c:8635 +-#, gcc-internal-format +-msgid "invalid qualifiers on non-member function type" +-msgstr "qualificadors no vàlids en el tipus de funció no membre" +- +-#: cp/decl.c:8650 +-#, fuzzy, gcc-internal-format +-msgid "abstract declarator %qT used as declaration" +-msgstr "el declarador abstracte \"%T\" es va utilitzar com una declaració" +- +-#: cp/decl.c:8679 +-#, fuzzy, gcc-internal-format +-msgid "cannot use %<::%> in parameter declaration" +-msgstr "no es pot usar \"::\" en la declaració de paràmetres" +- +-#. Something like struct S { int N::j; }; +-#: cp/decl.c:8725 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of %<::%>" +-msgstr "ús no vàlid de \"::\"" +- +-#: cp/decl.c:8740 +-#, fuzzy, gcc-internal-format +-msgid "can't make %qD into a method -- not in a class" +-msgstr "no es pot fer \"%D\" en un mètode -- no està en una classe" +- +-#: cp/decl.c:8749 +-#, fuzzy, gcc-internal-format +-msgid "function %qD declared virtual inside a union" +-msgstr "la funció \"%s\" es va declarar virtual dintre d'un union" +- +-#: cp/decl.c:8758 +-#, fuzzy, gcc-internal-format +-msgid "%qD cannot be declared virtual, since it is always static" +-msgstr "\"%D\" no es pot declarar virtual, ja que sempre és static" +- +-#: cp/decl.c:8774 +-#, fuzzy, gcc-internal-format +-msgid "expected qualified name in friend declaration for destructor %qD" +-msgstr "no es permeten qualificadors en la declaració de \"operator %T\"" +- +-#: cp/decl.c:8784 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD as member of %qT" +-msgstr "la declaració de \"%s\" obscurece a un membre de \"this\"" +- +-#: cp/decl.c:8860 +-#, fuzzy, gcc-internal-format +-msgid "field %qD has incomplete type" +-msgstr "el camp \"%D\" té tipus de dada incompleta" +- +-#: cp/decl.c:8862 +-#, fuzzy, gcc-internal-format +-msgid "name %qT has incomplete type" +-msgstr "el nom \"%T\" té tipus de dada incompleta" +- +-#: cp/decl.c:8871 +-#, fuzzy, gcc-internal-format +-msgid " in instantiation of template %qT" +-msgstr " en la instanciació det patró \"%T\"" +- +-#: cp/decl.c:8880 +-#, fuzzy, gcc-internal-format +-msgid "%qE is neither function nor member function; cannot be declared friend" +-msgstr "\"%s\" no és ni funció ni funció membre; no pot ser declarat friend" +- +-#. An attempt is being made to initialize a non-static +-#. member. But, from [class.mem]: +-#. +-#. 4 A member-declarator can contain a +-#. constant-initializer only if it declares a static +-#. member (_class.static_) of integral or enumeration +-#. type, see _class.static.data_. +-#. +-#. This used to be relatively common practice, but +-#. the rest of the compiler does not correctly +-#. handle the initialization unless the member is +-#. static so we make it static below. +-#: cp/decl.c:8932 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids initialization of member %qD" +-msgstr "ISO C++ prohibeix la inicialización del membre \"%D\"" +- +-#: cp/decl.c:8934 +-#, fuzzy, gcc-internal-format +-msgid "making %qD static" +-msgstr "fent a \"%D\" static" +- +-#: cp/decl.c:8999 +-#, fuzzy, gcc-internal-format +-msgid "storage class % invalid for function %qs" +-msgstr "la classe d'emmagatzematge \"auto\" no és vàlida per a la funció \"%s\"" +- +-#: cp/decl.c:9001 +-#, fuzzy, gcc-internal-format +-msgid "storage class % invalid for function %qs" +-msgstr "la classe d'emmagatzematge \"register\" no és vàlida per a la funció \"%s\"" +- +-#: cp/decl.c:9003 +-#, fuzzy, gcc-internal-format +-msgid "storage class %<__thread%> invalid for function %qs" +-msgstr "la classe d'emmagatzematge \"__thread\" no és vàlida per a la funció \"%s\"" +- +-#: cp/decl.c:9014 +-#, fuzzy, gcc-internal-format +-msgid "% specified invalid for function %qs declared out of global scope" +-msgstr "la classe d'emmagatzematge \"inline\" no és vàlida per a la funció \"%s\" declarada fora de l'àmbit global" +- +-#: cp/decl.c:9017 +-#, fuzzy, gcc-internal-format +-msgid "% specifier invalid for function %qs declared out of global scope" +-msgstr "la classe d'emmagatzematge \"inline\" no és vàlida per a la funció \"%s\" declarada fora de l'àmbit global" +- +-#: cp/decl.c:9025 +-#, fuzzy, gcc-internal-format +-msgid "virtual non-class function %qs" +-msgstr "la funció virtual \"%s\" no és classe" +- +-#: cp/decl.c:9056 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare member function %qD to have static linkage" +-msgstr "no es pot declarar que la funció membre \"%D\" tingui enllaçat estàtic" +- +-#. FIXME need arm citation +-#: cp/decl.c:9063 +-#, gcc-internal-format +-msgid "cannot declare static function inside another function" +-msgstr "no es pot declarar una funció static dintre d'altra funció" +- +-#: cp/decl.c:9093 +-#, fuzzy, gcc-internal-format +-msgid "% may not be used when defining (as opposed to declaring) a static data member" +-msgstr "\"static\" pot no ser utilitzat quan es defineix (oposat a la declaració) una dada membre static" +- +-#: cp/decl.c:9100 +-#, fuzzy, gcc-internal-format +-msgid "static member %qD declared %" +-msgstr "es va declarar el membre static \"%D\" com \"register\"" +- +-#: cp/decl.c:9105 +-#, fuzzy, gcc-internal-format +-msgid "cannot explicitly declare member %q#D to have extern linkage" +-msgstr "no es pot declarar explícitament que el membre \"%#D\" tingui un enllaçat extern" +- +-#: cp/decl.c:9234 +-#, fuzzy, gcc-internal-format +-msgid "default argument for %q#D has type %qT" +-msgstr "l'argument per omissió de \"%#D\" té tipus \"%T\"" +- +-#: cp/decl.c:9237 +-#, fuzzy, gcc-internal-format +-msgid "default argument for parameter of type %qT has type %qT" +-msgstr "l'argument per omissió per al paràmetre del tipus \"%T\" té el tipus \"%T\"" +- +-#: cp/decl.c:9253 +-#, fuzzy, gcc-internal-format +-msgid "default argument %qE uses local variable %qD" +-msgstr "l'argument per omissió \"%E\" usa la variable local \"%D\"" +- +-#: cp/decl.c:9323 +-#, fuzzy, gcc-internal-format +-msgid "parameter %qD invalidly declared method type" +-msgstr "el paràmetre \"%D\" es va declarar no vàlidament com tipus de mètode" +- +-#: cp/decl.c:9347 +-#, fuzzy, gcc-internal-format +-msgid "parameter %qD includes %s to array of unknown bound %qT" +-msgstr "el paràmetre \"%D\" inclou %s per a la matriu \"%T\" de límit desconegut" +- +-#: cp/decl.c:9361 +-#, fuzzy, gcc-internal-format +-msgid "parameter packs must be at the end of the parameter list" +-msgstr "\"void\" en la llista de paràmetres ha de ser la llista completa" +- +-#: cp/decl.c:9366 +-#, fuzzy, gcc-internal-format +-msgid "multiple parameters named %qE" +-msgstr "%Jmúltiples paràmetres nomenats \"%D\"" +- +-#. [class.copy] +-#. +-#. A declaration of a constructor for a class X is ill-formed if +-#. its first parameter is of type (optionally cv-qualified) X +-#. and either there are no other parameters or else all other +-#. parameters have default arguments. +-#. +-#. We *don't* complain about member template instantiations that +-#. have this form, though; they can occur as we try to decide +-#. what constructor to use during overload resolution. Since +-#. overload resolution will never prefer such a constructor to +-#. the non-template copy constructor (which is either explicitly +-#. or implicitly defined), there's no need to worry about their +-#. existence. Theoretically, they should never even be +-#. instantiated, but that's hard to forestall. +-#: cp/decl.c:9581 +-#, fuzzy, gcc-internal-format +-msgid "invalid constructor; you probably meant %<%T (const %T&)%>" +-msgstr "constructor no vàlid; tal vegada va voler dir \"%T (const %T&)\"" +- +-#: cp/decl.c:9703 +-#, fuzzy, gcc-internal-format +-msgid "%qD may not be declared within a namespace" +-msgstr "\"%D\" no es va declarar en aquest àmbit" +- +-#: cp/decl.c:9708 +-#, fuzzy, gcc-internal-format +-msgid "%qD may not be declared as static" +-msgstr "\"%#D\" no pot ser declarat" +- +-#: cp/decl.c:9731 +-#, fuzzy, gcc-internal-format +-msgid "%qD must be a nonstatic member function" +-msgstr "\"%D\" ha de ser una funció membre que no sigui static" +- +-#: cp/decl.c:9740 +-#, fuzzy, gcc-internal-format +-msgid "%qD must be either a non-static member function or a non-member function" +-msgstr "\"%D\" ha de ser una funció membre no estàtic o una funció no membre" +- +-#: cp/decl.c:9761 +-#, fuzzy, gcc-internal-format +-msgid "%qD must have an argument of class or enumerated type" +-msgstr "\"%D\" ha de tenir un argument de tipus classe o enumerat" +- +-#: cp/decl.c:9802 +-#, gcc-internal-format +-msgid "conversion to %s%s will never use a type conversion operator" +-msgstr "la conversió a %s%s mai usarà un operador de conversió de tipus" +- +-#. 13.4.0.3 +-#: cp/decl.c:9810 +-#, gcc-internal-format +-msgid "ISO C++ prohibits overloading operator ?:" +-msgstr "ISO C++ prohibeix la sobrecàrrega de l'operador ?:" +- +-#: cp/decl.c:9815 +-#, fuzzy, gcc-internal-format +-msgid "%qD must not have variable number of arguments" +-msgstr "\"%D\" ha de prendre un o dos arguments" +- +-#: cp/decl.c:9866 +-#, fuzzy, gcc-internal-format +-msgid "postfix %qD must take % as its argument" +-msgstr "el postfix \"%D\" ha de prendre \"int\" com el seu argument" +- +-#: cp/decl.c:9869 +-#, fuzzy, gcc-internal-format +-msgid "postfix %qD must take % as its second argument" +-msgstr "el postfix \"%D\" ha de prendre \"int\" com el seu segon argument" +- +-#: cp/decl.c:9877 +-#, fuzzy, gcc-internal-format +-msgid "%qD must take either zero or one argument" +-msgstr "\"%D\" ha de prendre zero o un argument" +- +-#: cp/decl.c:9879 +-#, fuzzy, gcc-internal-format +-msgid "%qD must take either one or two arguments" +-msgstr "\"%D\" ha de prendre un o dos arguments" +- +-#: cp/decl.c:9901 +-#, fuzzy, gcc-internal-format +-msgid "prefix %qD should return %qT" +-msgstr "el prefix \"%D\" ha de regressar \"%T\"" +- +-#: cp/decl.c:9907 +-#, fuzzy, gcc-internal-format +-msgid "postfix %qD should return %qT" +-msgstr "el postfix \"%D\" ha de regressar \"%T\"" +- +-#: cp/decl.c:9916 +-#, fuzzy, gcc-internal-format +-msgid "%qD must take %" +-msgstr "\"%D\" ha de prendre \"void\"" +- +-#: cp/decl.c:9918 cp/decl.c:9927 +-#, fuzzy, gcc-internal-format +-msgid "%qD must take exactly one argument" +-msgstr "\"%D\" ha de prendre un argument exactament" +- +-#: cp/decl.c:9929 +-#, fuzzy, gcc-internal-format +-msgid "%qD must take exactly two arguments" +-msgstr "\"%D\" ha de prendre dos arguments exactament" +- +-#: cp/decl.c:9938 +-#, fuzzy, gcc-internal-format +-msgid "user-defined %qD always evaluates both arguments" +-msgstr "el \"%D\" definit per l'usuari sempre avalua ambdós arguments" +- +-#: cp/decl.c:9952 +-#, fuzzy, gcc-internal-format +-msgid "%qD should return by value" +-msgstr "\"%D\" ha de regressar per valor" +- +-#: cp/decl.c:9964 cp/decl.c:9968 +-#, fuzzy, gcc-internal-format +-msgid "%qD cannot have default arguments" +-msgstr "\"%D\" no pot tenir arguments per omissió" +- +-#: cp/decl.c:10026 +-#, fuzzy, gcc-internal-format +-msgid "using template type parameter %qT after %qs" +-msgstr "usant el paràmetre de tipus patró \"%T\" després de \"%s\"" +- +-#: cp/decl.c:10041 +-#, fuzzy, gcc-internal-format +-msgid "using typedef-name %qD after %qs" +-msgstr "usant el nom de definició de tipus \"%D\" després de \"%s\"" +- +-#: cp/decl.c:10042 +-#, fuzzy, gcc-internal-format +-msgid "%q+D has a previous declaration here" +-msgstr "declaració prèvia com \"%#D\"" +- +-#: cp/decl.c:10050 +-#, fuzzy, gcc-internal-format +-msgid "%qT referred to as %qs" +-msgstr "\"%#D\" redeclarat com %C" +- +-#: cp/decl.c:10051 cp/decl.c:10058 +-#, fuzzy, gcc-internal-format +-msgid "%q+T has a previous declaration here" +-msgstr "%Jaixò és una declaració prèvia" +- +-#: cp/decl.c:10057 +-#, fuzzy, gcc-internal-format +-msgid "%qT referred to as enum" +-msgstr "\"%#D\" redeclarat com %C" +- +-#. If a class template appears as elaborated type specifier +-#. without a template header such as: +-#. +-#. template class C {}; +-#. void f(class C); // No template header here +-#. +-#. then the required template argument is missing. +-#: cp/decl.c:10072 +-#, fuzzy, gcc-internal-format +-msgid "template argument required for %<%s %T%>" +-msgstr "es requereix un argument de patró per a \"%T\"" +- +-#: cp/decl.c:10120 cp/name-lookup.c:2698 +-#, gcc-internal-format +-msgid "%qD has the same name as the class in which it is declared" +-msgstr "" +- +-#: cp/decl.c:10150 cp/name-lookup.c:2207 cp/parser.c:4036 cp/parser.c:14029 +-#: cp/parser.c:16234 +-#, fuzzy, gcc-internal-format +-msgid "reference to %qD is ambiguous" +-msgstr "l'ús de \"%D\" és ambigu" +- +-#: cp/decl.c:10264 +-#, fuzzy, gcc-internal-format +-msgid "use of enum %q#D without previous declaration" +-msgstr "ús del enum \"%#D\" sense declaració prèvia" +- +-#: cp/decl.c:10285 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of %qT as a non-template" +-msgstr "la declaració de \"%D\" com una no funció" +- +-#: cp/decl.c:10286 cp/pt.c:4154 +-#, fuzzy, gcc-internal-format +-msgid "previous declaration %q+D" +-msgstr "declaració prèvia de \"%D\"" +- +-#: cp/decl.c:10397 +-#, fuzzy, gcc-internal-format +-msgid "derived union %qT invalid" +-msgstr "union derivada \"%T\" no vàlida" +- +-#: cp/decl.c:10406 +-#, fuzzy, gcc-internal-format +-msgid "Java class %qT cannot have multiple bases" +-msgstr "la classe base \"%#T\" té un destructor no virtual" +- +-#: cp/decl.c:10417 +-#, fuzzy, gcc-internal-format +-msgid "Java class %qT cannot have virtual bases" +-msgstr "la classe base \"%#T\" té un destructor no virtual" +- +-#: cp/decl.c:10440 +-#, fuzzy, gcc-internal-format +-msgid "base type %qT fails to be a struct or class type" +-msgstr "el tipus base \"%T\" falla a ser un tipus struct o classe" +- +-#: cp/decl.c:10473 +-#, fuzzy, gcc-internal-format +-msgid "recursive type %qT undefined" +-msgstr "tipus recursivo \"%T\" sense definir" +- +-#: cp/decl.c:10475 +-#, fuzzy, gcc-internal-format +-msgid "duplicate base type %qT invalid" +-msgstr "tipus base duplicat \"%T\" no vàlid" +- +-#: cp/decl.c:10552 +-#, fuzzy, gcc-internal-format +-msgid "multiple definition of %q#T" +-msgstr "definició múltiple de \"%#T\"" +- +-#: cp/decl.c:10553 +-#, fuzzy, gcc-internal-format +-msgid "%Jprevious definition here" +-msgstr "definició prèvia aquí" +- +-#. DR 377 +-#. +-#. IF no integral type can represent all the enumerator values, the +-#. enumeration is ill-formed. +-#: cp/decl.c:10692 +-#, gcc-internal-format +-msgid "no integral type can represent all of the enumerator values for %qT" +-msgstr "" +- +-#: cp/decl.c:10803 +-#, fuzzy, gcc-internal-format +-msgid "enumerator value for %qD is not an integer constant" +-msgstr "el valor de enumerator per a \"%s\" no és una constant entera" +- +-#: cp/decl.c:10831 +-#, fuzzy, gcc-internal-format +-msgid "overflow in enumeration values at %qD" +-msgstr "desbordament en valors d'enumeració en \"%D\"" +- +-#: cp/decl.c:10906 +-#, fuzzy, gcc-internal-format +-msgid "return type %q#T is incomplete" +-msgstr "el tipus de retorn \"%#T\" és un tipus de dada incompleta" +- +-#: cp/decl.c:11031 cp/typeck.c:6711 +-#, fuzzy, gcc-internal-format +-msgid "% should return a reference to %<*this%>" +-msgstr "\"operator=\" ha de retornar una referència a \"*this\"" +- +-#: cp/decl.c:11420 +-#, fuzzy, gcc-internal-format +-msgid "parameter %qD declared void" +-msgstr "el paràmetre \"%D\" es va declarar void" +- +-#: cp/decl.c:11908 +-#, fuzzy, gcc-internal-format +-msgid "invalid member function declaration" +-msgstr "declaració del patró membre \"%D\" no vàlida" +- +-#: cp/decl.c:11923 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already defined in class %qT" +-msgstr "\"%D\" ja es va definir en la classe \"%T\"" +- +-#: cp/decl.c:12170 +-#, fuzzy, gcc-internal-format +-msgid "static member function %q#D declared with type qualifiers" +-msgstr "la funció membre static \"%#D\" és declarada amb qualificadors de tipus" +- +-#: cp/decl2.c:268 +-#, gcc-internal-format +-msgid "name missing for member function" +-msgstr "falta el nom per a la funció membre" +- +-#: cp/decl2.c:339 cp/decl2.c:353 +-#, gcc-internal-format +-msgid "ambiguous conversion for array subscript" +-msgstr "conversió ambigua per a índex de matriu" +- +-#: cp/decl2.c:347 +-#, fuzzy, gcc-internal-format +-msgid "invalid types %<%T[%T]%> for array subscript" +-msgstr "tipus no vàlids \"%T[%T]\" per a índex de matriu" +- +-#: cp/decl2.c:390 +-#, fuzzy, gcc-internal-format +-msgid "deleting array %q#D" +-msgstr "esborrant la matriu \"%#D\"" +- +-#: cp/decl2.c:396 +-#, fuzzy, gcc-internal-format +-msgid "type %q#T argument given to %, expected pointer" +-msgstr "es va donar un argument de tipus \"%#T\" a \"delete\", s'esperava un punter" +- +-#: cp/decl2.c:408 +-#, fuzzy, gcc-internal-format +-msgid "cannot delete a function. Only pointer-to-objects are valid arguments to %" +-msgstr "no es pot esborrar una funció. Solament els punters a objectes són arguments vàlids per a \"delete\"" +- +-#: cp/decl2.c:416 +-#, fuzzy, gcc-internal-format +-msgid "deleting %qT is undefined" +-msgstr "esborrar \"%T\" està indefinit" +- +-#: cp/decl2.c:459 cp/pt.c:3828 +-#, fuzzy, gcc-internal-format +-msgid "template declaration of %q#D" +-msgstr "declaració en patró de \"%#D\"" +- +-#: cp/decl2.c:511 +-#, fuzzy, gcc-internal-format +-msgid "Java method %qD has non-Java return type %qT" +-msgstr "el mètode Java \"%D\" té un tipus de retorn \"%T\" que no és de Java" +- +-#: cp/decl2.c:528 +-#, fuzzy, gcc-internal-format +-msgid "Java method %qD has non-Java parameter type %qT" +-msgstr "el mètode Java \"%D\" té un tipus de paràmetre \"%T\" que no és de Java" +- +-#: cp/decl2.c:639 +-#, fuzzy, gcc-internal-format +-msgid "prototype for %q#D does not match any in class %qT" +-msgstr "el prototip per a \"%#D\" no coincideix amb cap altre en la classe \"%T\"" +- +-#: cp/decl2.c:719 +-#, fuzzy, gcc-internal-format +-msgid "local class %q#T shall not have static data member %q#D" +-msgstr "la classe local \"%#T\" no ha de tenir el membre static \"%#D\"" +- +-#: cp/decl2.c:727 +-#, gcc-internal-format +-msgid "initializer invalid for static member with constructor" +-msgstr "inicializador no vàlid per al membre static amb constructor" +- +-#: cp/decl2.c:730 +-#, gcc-internal-format +-msgid "(an out of class initialization is required)" +-msgstr "(es requereix una inicialització fora de la classe)" +- +-#: cp/decl2.c:790 +-#, fuzzy, gcc-internal-format +-msgid "member %qD conflicts with virtual function table field name" +-msgstr "el membre \"%D\" té conflictes amb el nom de camp de la matriu de funcions virtuals" +- +-#: cp/decl2.c:810 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already defined in %qT" +-msgstr "\"%D\" ja està definit en \"%T\"" +- +-#: cp/decl2.c:831 +-#, fuzzy, gcc-internal-format +-msgid "initializer specified for static member function %qD" +-msgstr "es va especificar un inicialitzador per a la funció no-membre \"%D\"" +- +-#: cp/decl2.c:854 +-#, gcc-internal-format +-msgid "field initializer is not constant" +-msgstr "l'inicializador del camp no és constant" +- +-#: cp/decl2.c:881 +-#, fuzzy, gcc-internal-format +-msgid "% specifiers are not permitted on non-static data members" +-msgstr "no es permeten els especificadores \"asm\" en membres de dades no estàtiques" +- +-#: cp/decl2.c:932 +-#, fuzzy, gcc-internal-format +-msgid "bit-field %qD with non-integral type" +-msgstr "camp de bits \"%D\" amb tipus no enter" +- +-#: cp/decl2.c:938 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare %qD to be a bit-field type" +-msgstr "no es pot declarar \"%D\" que sigui un tipus de camp de bits" +- +-#: cp/decl2.c:948 +-#, fuzzy, gcc-internal-format +-msgid "cannot declare bit-field %qD with function type" +-msgstr "no es pot declarar el camp de bits \"%D\" amb un tipus de funció" +- +-#: cp/decl2.c:955 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already defined in the class %qT" +-msgstr "\"%D\" ja està definit en la classe %T" +- +-#: cp/decl2.c:962 +-#, fuzzy, gcc-internal-format +-msgid "static member %qD cannot be a bit-field" +-msgstr "el membre static \"%D\" no pot ser un camp de bits" +- +-#: cp/decl2.c:1122 +-#, gcc-internal-format +-msgid "anonymous struct not inside named type" +-msgstr "struct anònim no es troba dintre d'un tipus nomenat" +- +-#: cp/decl2.c:1206 +-#, gcc-internal-format +-msgid "namespace-scope anonymous aggregates must be static" +-msgstr "els agregats anònims d'abast de nom d'espai deuen ser static" +- +-#: cp/decl2.c:1215 +-#, fuzzy, gcc-internal-format +-msgid "anonymous union with no members" +-msgstr "agregat anònim sense membres" +- +-#: cp/decl2.c:1251 +-#, fuzzy, gcc-internal-format +-msgid "% must return type %qT" +-msgstr "\"operator new\" ha de retornar el tipus \"%T\"" +- +-#. [basic.stc.dynamic.allocation] +-#. +-#. The first parameter shall not have an associated default +-#. argument. +-#: cp/decl2.c:1262 +-#, gcc-internal-format +-msgid "the first parameter of % cannot have a default argument" +-msgstr "" +- +-#: cp/decl2.c:1278 +-#, fuzzy, gcc-internal-format +-msgid "% takes type % (%qT) as first parameter" +-msgstr "\"operator new\" pren el tipus \"size_t\" (\"%T\") com primer argument" +- +-#: cp/decl2.c:1307 +-#, fuzzy, gcc-internal-format +-msgid "% must return type %qT" +-msgstr "\"operator delete\" ha de retornar el tipus \"%T\"" +- +-#: cp/decl2.c:1316 +-#, fuzzy, gcc-internal-format +-msgid "% takes type %qT as first parameter" +-msgstr "\"operator delete\" pren el tipus \"%T\" com primer argument" +- +-#: cp/decl2.c:1985 +-#, gcc-internal-format +-msgid "%qT has a field %qD whose type uses the anonymous namespace" +-msgstr "" +- +-#: cp/decl2.c:1992 +-#, gcc-internal-format +-msgid "%qT declared with greater visibility than the type of its field %qD" +-msgstr "" +- +-#: cp/decl2.c:2005 +-#, gcc-internal-format +-msgid "%qT has a base %qT whose type uses the anonymous namespace" +-msgstr "" +- +-#: cp/decl2.c:2011 +-#, gcc-internal-format +-msgid "%qT declared with greater visibility than its base %qT" +-msgstr "" +- +-#: cp/decl2.c:3395 +-#, fuzzy, gcc-internal-format +-msgid "inline function %q+D used but never defined" +-msgstr "s'usa la funció «inline» \"%D\" però mai es va definir" +- +-#: cp/decl2.c:3543 +-#, fuzzy, gcc-internal-format +-msgid "default argument missing for parameter %P of %q+#D" +-msgstr "falta l'argument per omissió per al paràmetre %P de \"%+#D\"" +- +-#. We really want to suppress this warning in system headers, +-#. because libstdc++ uses variadic templates even when we aren't +-#. in C++0x mode. +-#: cp/error.c:2669 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ does not include variadic templates" +-msgstr "ISO C no permet macros variadic nomenats" +- +-#. Can't throw a reference. +-#: cp/except.c:269 +-#, fuzzy, gcc-internal-format +-msgid "type %qT is disallowed in Java % or %" +-msgstr "el tipus \"%T\" no està permès en \"throw\" o \"catch\" de Java" +- +-#: cp/except.c:280 +-#, fuzzy, gcc-internal-format +-msgid "call to Java % or % with % undefined" +-msgstr "cridada a \"catch\" o \"throw\" de Java amb \"jthrowable\" sense definir" +- +-#. Thrown object must be a Throwable. +-#: cp/except.c:287 +-#, fuzzy, gcc-internal-format +-msgid "type %qT is not derived from %" +-msgstr "el tipus \"%T\" no és derivat de \"java::lang::Throwable\"" +- +-#: cp/except.c:350 +-#, gcc-internal-format +-msgid "mixing C++ and Java catches in a single translation unit" +-msgstr "barrejant \"catches\" de C++ i Java en una sola unitat de traducció" +- +-#: cp/except.c:620 +-#, gcc-internal-format +-msgid "throwing NULL, which has integral, not pointer type" +-msgstr "llançant NULL, que té un tipus integral, no un tipus punter" +- +-#: cp/except.c:643 cp/init.c:1780 +-#, fuzzy, gcc-internal-format +-msgid "%qD should never be overloaded" +-msgstr "\"%D\" ha de regressar per valor" +- +-#: cp/except.c:739 +-#, gcc-internal-format +-msgid " in thrown expression" +-msgstr " en expressió thrown" +- +-#: cp/except.c:895 +-#, fuzzy, gcc-internal-format +-msgid "expression %qE of abstract class type %qT cannot be used in throw-expression" +-msgstr "no es pot usar l'expressió \"%E\" del tipus de classe abstracta \"%T\" en les expressions thrown" +- +-#: cp/except.c:980 +-#, fuzzy, gcc-internal-format +-msgid "%Hexception of type %qT will be caught" +-msgstr "l'excepció del tipus \"%T\" serà atrapada" +- +-#: cp/except.c:982 +-#, fuzzy, gcc-internal-format +-msgid "%H by earlier handler for %qT" +-msgstr " per un gestor anterior per a \"%T\"" +- +-#: cp/except.c:1012 +-#, fuzzy, gcc-internal-format +-msgid "%H%<...%> handler must be the last handler for its try block" +-msgstr "el gestor \"...\" ha de ser l'últim gestor per al seu bloc try" +- +-#: cp/friend.c:156 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already a friend of class %qT" +-msgstr "\"%D\" ja és un friend de la classe \"%T\"" +- +-#: cp/friend.c:232 +-#, fuzzy, gcc-internal-format +-msgid "invalid type %qT declared %" +-msgstr "el tipus no vàlid \"%T\" va ser declarat \"friend\"" +- +-#. [temp.friend] +-#. Friend declarations shall not declare partial +-#. specializations. +-#. template friend class T::X; +-#. [temp.friend] +-#. Friend declarations shall not declare partial +-#. specializations. +-#: cp/friend.c:248 cp/friend.c:278 +-#, fuzzy, gcc-internal-format +-msgid "partial specialization %qT declared %" +-msgstr "l'especialització parcial \"%T\" es va declarar \"friend\"" +- +-#: cp/friend.c:256 +-#, fuzzy, gcc-internal-format +-msgid "class %qT is implicitly friends with itself" +-msgstr "la classe \"%T\" és implícitament friend amb si mateixa" +- +-#: cp/friend.c:314 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not a member of %qT" +-msgstr "\"%D\" no és un membre de \"%T\"" +- +-#: cp/friend.c:319 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not a member class template of %qT" +-msgstr "\"%D\" no és una funció patró membre" +- +-#: cp/friend.c:327 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not a nested class of %qT" +-msgstr "\"%T\" no és una base de \"%T\"" +- +-#. template friend class T; +-#: cp/friend.c:340 +-#, fuzzy, gcc-internal-format +-msgid "template parameter type %qT declared %" +-msgstr "el tipus de paràmetre de patró \"%T\" es va declarar \"friend\"" +- +-#. template friend class A; where A is not a template +-#: cp/friend.c:346 +-#, fuzzy, gcc-internal-format +-msgid "%q#T is not a template" +-msgstr "\"%#T\" no és un patró" +- +-#: cp/friend.c:368 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already a friend of %qT" +-msgstr "\"%T\" ja és un friend de \"%T\"" +- +-#: cp/friend.c:377 +-#, fuzzy, gcc-internal-format +-msgid "%qT is already a friend of %qT" +-msgstr "\"%T\" ja és un friend de \"%T\"" +- +-#: cp/friend.c:494 +-#, fuzzy, gcc-internal-format +-msgid "member %qD declared as friend before type %qT defined" +-msgstr "el membre \"%D\" és declarat friend abans que es defineixi el tipus \"%T\"" +- +-#: cp/friend.c:550 +-#, fuzzy, gcc-internal-format +-msgid "friend declaration %q#D declares a non-template function" +-msgstr "la declaració friend \"%#D\" declara una funció que no és patró" +- +-#: cp/friend.c:554 +-#, fuzzy, gcc-internal-format +-msgid "(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) " +-msgstr "(si aquesta no és la seva intenció, asseguri's qu'el patró de la funció ja ha estat declarada i agregui <> aquí després del nom de la funció) -Wno-non-template-friend desactiva aquest avís" +- +-#: cp/init.c:334 +-#, fuzzy, gcc-internal-format +-msgid "%J%qD should be initialized in the member initialization list" +-msgstr "inicialització de la dada membre no vàlida" +- +-#: cp/init.c:382 +-#, fuzzy, gcc-internal-format +-msgid "%Jdefault-initialization of %q#D, which has reference type" +-msgstr "l'inicialització per omissió de \"%#D\", el qual té el tipus de referència" +- +-#: cp/init.c:388 +-#, fuzzy, gcc-internal-format +-msgid "%Juninitialized reference member %qD" +-msgstr "membre referència \"%D\" sense inicialitzar" +- +-#: cp/init.c:391 +-#, fuzzy, gcc-internal-format +-msgid "%Juninitialized member %qD with % type %qT" +-msgstr "const \"%D\" sense inicialitzar" +- +-#: cp/init.c:534 +-#, fuzzy, gcc-internal-format +-msgid "%q+D will be initialized after" +-msgstr "\"%D\" s'inicialitzarà després" +- +-#: cp/init.c:537 +-#, fuzzy, gcc-internal-format +-msgid "base %qT will be initialized after" +-msgstr "la base \"%T\" s'inicialitzarà després" +- +-#: cp/init.c:540 +-#, fuzzy, gcc-internal-format +-msgid " %q+#D" +-msgstr " \"#%D\"" +- +-#: cp/init.c:542 +-#, fuzzy, gcc-internal-format +-msgid " base %qT" +-msgstr " base \"%T\"" +- +-#: cp/init.c:543 +-#, fuzzy, gcc-internal-format +-msgid "%J when initialized here" +-msgstr "\"%D\" s'inicialitzarà després" +- +-#: cp/init.c:559 +-#, fuzzy, gcc-internal-format +-msgid "%Jmultiple initializations given for %qD" +-msgstr "es van donar inicialitzacions múltiples per a \"%D\"" +- +-#: cp/init.c:562 +-#, fuzzy, gcc-internal-format +-msgid "%Jmultiple initializations given for base %qT" +-msgstr "es van donar inicialitzacions múltiples per a la base \"%T\"" +- +-#: cp/init.c:629 +-#, fuzzy, gcc-internal-format +-msgid "%Jinitializations for multiple members of %qT" +-msgstr "inicialitzacions per a múltiples membres de \"%T\"" +- +-#: cp/init.c:691 +-#, fuzzy, gcc-internal-format +-msgid "%Jbase class %q#T should be explicitly initialized in the copy constructor" +-msgstr "la classe base \"%#T\" ha de ser inicialitzada explícitament en la còpia del constructor" +- +-#: cp/init.c:915 cp/init.c:934 +-#, fuzzy, gcc-internal-format +-msgid "class %qT does not have any field named %qD" +-msgstr "la classe \"%T\" no té cap camp cridat \"%D\"" +- +-#: cp/init.c:921 +-#, fuzzy, gcc-internal-format +-msgid "%q#D is a static data member; it can only be initialized at its definition" +-msgstr "el camp \"%#D\" és static; l'únic punt d'inicialització és la seva definició" +- +-#: cp/init.c:928 +-#, fuzzy, gcc-internal-format +-msgid "%q#D is not a non-static data member of %qT" +-msgstr "\"%#D\" no és un membre static de \"%#T\"" +- +-#: cp/init.c:967 +-#, fuzzy, gcc-internal-format +-msgid "unnamed initializer for %qT, which has no base classes" +-msgstr "inicialitzador sense nom per a \"%T\", el qual no té una classe base" +- +-#: cp/init.c:975 +-#, fuzzy, gcc-internal-format +-msgid "unnamed initializer for %qT, which uses multiple inheritance" +-msgstr "inicialitzador sense nom per a \"%T\", el qual usa herència múltiple" +- +-#: cp/init.c:1021 +-#, fuzzy, gcc-internal-format +-msgid "%qD is both a direct base and an indirect virtual base" +-msgstr "el tipus \"%D\" no és una base directa o virtual de \"%T\"" +- +-#: cp/init.c:1029 +-#, fuzzy, gcc-internal-format +-msgid "type %qT is not a direct or virtual base of %qT" +-msgstr "el tipus \"%D\" no és una base directa o virtual de \"%T\"" +- +-#: cp/init.c:1032 +-#, fuzzy, gcc-internal-format +-msgid "type %qT is not a direct base of %qT" +-msgstr "el tipus \"%D\" no és una base directa de \"%T\"" +- +-#: cp/init.c:1112 +-#, gcc-internal-format +-msgid "bad array initializer" +-msgstr "inicialitzador de matriu erroni" +- +-#: cp/init.c:1287 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not an aggregate type" +-msgstr "\"%T\" no és un tipus agregat" +- +-#: cp/init.c:1341 +-#, fuzzy, gcc-internal-format +-msgid "incomplete type %qT does not have member %qD" +-msgstr "el tipus incomplet \"%T\" no té al membre \"%D\"" +- +-#: cp/init.c:1354 +-#, fuzzy, gcc-internal-format +-msgid "invalid pointer to bit-field %qD" +-msgstr "punter no vàlid al camp de bit \"%D\"" +- +-#: cp/init.c:1431 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of non-static member function %qD" +-msgstr "ús no vàlid del camp no static \"%D\"" +- +-#: cp/init.c:1437 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of non-static data member %qD" +-msgstr "ús no vàlid del camp no static \"%D\"" +- +-#: cp/init.c:1714 +-#, fuzzy, gcc-internal-format +-msgid "invalid type % for new" +-msgstr "tipus \"void\" no vàlid per a new" +- +-#: cp/init.c:1724 +-#, fuzzy, gcc-internal-format +-msgid "uninitialized const in % of %q#T" +-msgstr "const sense inicialitzar en \"new\" de \"%#T\"" +- +-#: cp/init.c:1775 +-#, fuzzy, gcc-internal-format +-msgid "call to Java constructor with %qs undefined" +-msgstr "cridada a constructor Java amb \"%s\" sense definir" +- +-#: cp/init.c:1815 +-#, gcc-internal-format +-msgid "no suitable %qD found in class %qT" +-msgstr "" +- +-#: cp/init.c:1820 +-#, fuzzy, gcc-internal-format +-msgid "request for member %qD is ambiguous" +-msgstr "a petició per al membre \"%D\" és ambigua" +- +-#: cp/init.c:1972 +-#, gcc-internal-format +-msgid "ISO C++ forbids initialization in array new" +-msgstr "ISO C++ prohibeix la inicialització en la matriu new" +- +-#: cp/init.c:2174 +-#, gcc-internal-format +-msgid "size in array new must have integral type" +-msgstr "la grandària de la matriu nova ha de tenir un tipus integral" +- +-#: cp/init.c:2183 +-#, gcc-internal-format +-msgid "new cannot be applied to a reference type" +-msgstr "new no pot ser aplicat a un tipus de referència" +- +-#: cp/init.c:2189 +-#, gcc-internal-format +-msgid "new cannot be applied to a function type" +-msgstr "new no pot ser aplicat a una funcció de referència" +- +-#: cp/init.c:2228 +-#, fuzzy, gcc-internal-format +-msgid "call to Java constructor, while % undefined" +-msgstr "cridada a constructor Java, mentre \"jclass\" està indefinit" +- +-#: cp/init.c:2246 +-#, fuzzy, gcc-internal-format +-msgid "can't find % in %qT" +-msgstr "no es pot trobar class$" +- +-#: cp/init.c:2607 +-#, gcc-internal-format +-msgid "initializer ends prematurely" +-msgstr "l'inicialitzador acaba prematurament" +- +-#: cp/init.c:2662 +-#, gcc-internal-format +-msgid "cannot initialize multi-dimensional array with initializer" +-msgstr "no es poden inicialitzar matrius multidimensionals amb l'inicialitzador" +- +-#: cp/init.c:2799 +-#, gcc-internal-format +-msgid "possible problem detected in invocation of delete operator:" +-msgstr "" +- +-#: cp/init.c:2802 +-#, gcc-internal-format +-msgid "neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined." +-msgstr "" +- +-#: cp/init.c:2823 +-#, gcc-internal-format +-msgid "unknown array size in delete" +-msgstr "grandària de matriu desconeguda en delete" +- +-#: cp/init.c:3070 +-#, gcc-internal-format +-msgid "type to vector delete is neither pointer or array type" +-msgstr "el tipus de vector delete no és del tipus punter ni matriu" +- +-#: cp/lex.c:489 +-#, gcc-internal-format +-msgid "junk at end of #pragma %s" +-msgstr "escombraries al final de #pragma %s" +- +-#: cp/lex.c:496 +-#, gcc-internal-format +-msgid "invalid #pragma %s" +-msgstr "#pragma %s no vàlid" +- +-#: cp/lex.c:504 +-#, gcc-internal-format +-msgid "#pragma vtable no longer supported" +-msgstr "#pragma vtable ja no té suport" +- +-#: cp/lex.c:583 +-#, fuzzy, gcc-internal-format +-msgid "#pragma implementation for %qs appears after file is included" +-msgstr "implementació de #pragma per a %s apareix després que el fitxer és inclòs" +- +-#: cp/lex.c:608 +-#, gcc-internal-format +-msgid "junk at end of #pragma GCC java_exceptions" +-msgstr "escombraries al final del #pragma GCC java_exceptions" +- +-#: cp/lex.c:622 +-#, fuzzy, gcc-internal-format +-msgid "%qD not defined" +-msgstr "\"%D\" no està definit" +- +-#: cp/lex.c:626 +-#, fuzzy, gcc-internal-format +-msgid "%qD was not declared in this scope" +-msgstr "\"%D\" no es va declarar en aquest àmbit" +- +-#. In a template, it is invalid to write "f()" or "f(3)" if no +-#. declaration of "f" is available. Historically, G++ and most +-#. other compilers accepted that usage since they deferred all name +-#. lookup until instantiation time rather than doing unqualified +-#. name lookup at template definition time; explain to the user what +-#. is going wrong. +-#. +-#. Note that we have the exact wording of the following message in +-#. the manual (trouble.texi, node "Name lookup"), so they need to +-#. be kept in synch. +-#: cp/lex.c:663 +-#, gcc-internal-format +-msgid "there are no arguments to %qD that depend on a template parameter, so a declaration of %qD must be available" +-msgstr "" +- +-#: cp/lex.c:672 +-#, gcc-internal-format +-msgid "(if you use %<-fpermissive%>, G++ will accept your code, but allowing the use of an undeclared name is deprecated)" +-msgstr "" +- +-#: cp/mangle.c:1691 +-#, gcc-internal-format +-msgid "mangling typeof, use decltype instead" +-msgstr "" +- +-#: cp/mangle.c:2208 +-#, gcc-internal-format +-msgid "call_expr cannot be mangled due to a defect in the C++ ABI" +-msgstr "" +- +-#: cp/mangle.c:2216 +-#, gcc-internal-format +-msgid "zero-operand casts cannot be mangled due to a defect in the C++ ABI" +-msgstr "" +- +-#: cp/mangle.c:2266 +-#, gcc-internal-format +-msgid "omitted middle operand to % operand cannot be mangled" +-msgstr "" +- +-#: cp/mangle.c:2584 +-#, gcc-internal-format +-msgid "the mangled name of %qD will change in a future version of GCC" +-msgstr "" +- +-#: cp/method.c:462 +-#, fuzzy, gcc-internal-format +-msgid "generic thunk code fails for method %q#D which uses %<...%>" +-msgstr "el codi de thunk genèric ha fallat per al mètode \"%#D\" que utilitza \"...\"" +- +-#: cp/method.c:697 +-#, fuzzy, gcc-internal-format +-msgid "non-static const member %q#D, can't use default assignment operator" +-msgstr "el membre const \"%#D\" que no és static, no pot usar l'operador d'assignació per omissió" +- +-#: cp/method.c:703 +-#, fuzzy, gcc-internal-format +-msgid "non-static reference member %q#D, can't use default assignment operator" +-msgstr "el membre de referència \"%#D\" que no és static, no pot usar l'operador d'assignació per omissió" +- +-#: cp/method.c:815 +-#, gcc-internal-format +-msgid "%Hsynthesized method %qD first required here " +-msgstr "" +- +-#: cp/method.c:1158 +-#, gcc-internal-format +-msgid "vtable layout for class %qT may not be ABI-compliantand may change in a future version of GCC due to implicit virtual destructor" +-msgstr "" +- +-#: cp/name-lookup.c:728 +-#, fuzzy, gcc-internal-format +-msgid "redeclaration of % as %qT" +-msgstr "redeclaración de \"wchar_t\" com \"%T\"" +- +-#. A redeclaration of main, but not a duplicate of the +-#. previous one. +-#. +-#. [basic.start.main] +-#. +-#. This function shall not be overloaded. +-#: cp/name-lookup.c:758 +-#, fuzzy, gcc-internal-format +-msgid "invalid redeclaration of %q+D" +-msgstr "redeclaración no vàlida de \"%D\"" +- +-#: cp/name-lookup.c:759 +-#, fuzzy, gcc-internal-format +-msgid "as %qD" +-msgstr "com \"%D\"" +- +-#: cp/name-lookup.c:850 +-#, fuzzy, gcc-internal-format +-msgid "type mismatch with previous external decl of %q#D" +-msgstr "no coincideixen els tipus amb la declaració externa prèvia" +- +-#: cp/name-lookup.c:851 +-#, fuzzy, gcc-internal-format +-msgid "previous external decl of %q+#D" +-msgstr "declaració externa prèvia de \"%#D\"" +- +-#: cp/name-lookup.c:942 +-#, fuzzy, gcc-internal-format +-msgid "extern declaration of %q#D doesn't match" +-msgstr "la declaració externa de \"%#D\" no coincideix" +- +-#: cp/name-lookup.c:943 +-#, fuzzy, gcc-internal-format +-msgid "global declaration %q+#D" +-msgstr "amb la declaració global \"%#D\"" +- +-#: cp/name-lookup.c:980 cp/name-lookup.c:987 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %q#D shadows a parameter" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#. Location of previous decl is not useful in this case. +-#: cp/name-lookup.c:1012 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD shadows a member of 'this'" +-msgstr "la declaració de \"%s\" obscurece a un membre de \"this\"" +- +-#: cp/name-lookup.c:1018 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD shadows a previous local" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: cp/name-lookup.c:1025 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD shadows a global declaration" +-msgstr "la declaració de \"%#D\" enfosqueix un paràmetre" +- +-#: cp/name-lookup.c:1148 +-#, fuzzy, gcc-internal-format +-msgid "name lookup of %qD changed" +-msgstr "la recerca de nom de \"%D\" va canviar" +- +-#: cp/name-lookup.c:1149 +-#, gcc-internal-format +-msgid " matches this %q+D under ISO standard rules" +-msgstr "" +- +-#: cp/name-lookup.c:1151 +-#, gcc-internal-format +-msgid " matches this %q+D under old rules" +-msgstr "" +- +-#: cp/name-lookup.c:1169 cp/name-lookup.c:1177 +-#, fuzzy, gcc-internal-format +-msgid "name lookup of %qD changed for new ISO % scoping" +-msgstr "la recerca de nom de \"%D\" va canviar" +- +-#: cp/name-lookup.c:1171 +-#, gcc-internal-format +-msgid " cannot use obsolete binding at %q+D because it has a destructor" +-msgstr "" +- +-#: cp/name-lookup.c:1179 +-#, gcc-internal-format +-msgid " using obsolete binding at %q+D" +-msgstr "" +- +-#: cp/name-lookup.c:1232 +-#, gcc-internal-format +-msgid "%s %s(%E) %p %d\n" +-msgstr "" +- +-#: cp/name-lookup.c:1235 +-#, fuzzy, gcc-internal-format +-msgid "%s %s %p %d\n" +-msgstr "%s: %s: " +- +-#: cp/name-lookup.c:1362 +-#, gcc-internal-format +-msgid "XXX is_class_level != (current_scope == class_scope)\n" +-msgstr "" +- +-#: cp/name-lookup.c:1920 +-#, fuzzy, gcc-internal-format +-msgid "%q#D hides constructor for %q#T" +-msgstr "\"%#D\" amaga el destructor per a \"%#T\"" +- +-#: cp/name-lookup.c:1937 +-#, fuzzy, gcc-internal-format +-msgid "%q#D conflicts with previous using declaration %q#D" +-msgstr "\"%#D\" causa conflicte amb la declaració prèvia en ús \"%#D\"" +- +-#: cp/name-lookup.c:1960 +-#, fuzzy, gcc-internal-format +-msgid "previous non-function declaration %q+#D" +-msgstr "la declaració prèvia \"%#D\" que no és funció" +- +-#: cp/name-lookup.c:1961 +-#, fuzzy, gcc-internal-format +-msgid "conflicts with function declaration %q#D" +-msgstr "causa conflicte amb la declaració de la funció \"%#D\"" +- +-#. It's a nested name with template parameter dependent scope. +-#. This can only be using-declaration for class member. +-#: cp/name-lookup.c:2039 cp/name-lookup.c:2064 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not a namespace" +-msgstr "\"%T\" no és un nom d'espai" +- +-#. 7.3.3/5 +-#. A using-declaration shall not name a template-id. +-#: cp/name-lookup.c:2049 +-#, fuzzy, gcc-internal-format +-msgid "a using-declaration cannot specify a template-id. Try %" +-msgstr "una declaració d'ús no pot especificar un identificador de patró. Intenti \"using %D\"" +- +-#: cp/name-lookup.c:2056 +-#, fuzzy, gcc-internal-format +-msgid "namespace %qD not allowed in using-declaration" +-msgstr "no es permet l'espai de noms \"%D\" en la declaració d'ús" +- +-#: cp/name-lookup.c:2092 +-#, fuzzy, gcc-internal-format +-msgid "%qD not declared" +-msgstr "no es va declarar \"%D\"" +- +-#: cp/name-lookup.c:2128 cp/name-lookup.c:2165 cp/name-lookup.c:2199 +-#: cp/name-lookup.c:2214 +-#, fuzzy, gcc-internal-format +-msgid "%qD is already declared in this scope" +-msgstr "\"%D\" ja es va declarar en aquest àmbit" +- +-#: cp/name-lookup.c:2817 +-#, gcc-internal-format +-msgid "using-declaration for non-member at class scope" +-msgstr "declaració d'ús per a un no membre en l'àmbit de la classe" +- +-#: cp/name-lookup.c:2824 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%D%> names destructor" +-msgstr "\"%D\" nomena al constructor" +- +-#: cp/name-lookup.c:2829 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%D%> names constructor" +-msgstr "\"%D\" nomena al constructor" +- +-#: cp/name-lookup.c:2834 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%D%> names constructor in %qT" +-msgstr "\"%D\" nomena al constructor" +- +-#: cp/name-lookup.c:2884 +-#, fuzzy, gcc-internal-format +-msgid "no members matching %<%T::%D%> in %q#T" +-msgstr "no hi ha membres que coincideixin amb \"%D\" en \"%#T\"" +- +-#: cp/name-lookup.c:2952 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD not in a namespace surrounding %qD" +-msgstr "la declaració de \"%D\" no està en un espai de noms al voltant de \"%D\"" +- +-#: cp/name-lookup.c:2960 +-#, fuzzy, gcc-internal-format +-msgid "explicit qualification in declaration of %qD" +-msgstr "qualificadors de tipus duplicats en la declaració %s" +- +-#: cp/name-lookup.c:3003 +-#, fuzzy, gcc-internal-format +-msgid "%qD should have been declared inside %qD" +-msgstr "\"%D\" deuria ser declarat dintre de \"%D\"" +- +-#: cp/name-lookup.c:3048 +-#, fuzzy, gcc-internal-format +-msgid "%qD attribute requires a single NTBS argument" +-msgstr "l'atribut \"%s\" requereix una constant entera com argument" +- +-#: cp/name-lookup.c:3055 +-#, gcc-internal-format +-msgid "%qD attribute is meaningless since members of the anonymous namespace get local symbols" +-msgstr "" +- +-#: cp/name-lookup.c:3064 cp/name-lookup.c:3433 +-#, fuzzy, gcc-internal-format +-msgid "%qD attribute directive ignored" +-msgstr "s'ignora la directiva d'atribut \"%s\"" +- +-#: cp/name-lookup.c:3109 +-#, fuzzy, gcc-internal-format +-msgid "namespace alias %qD not allowed here, assuming %qD" +-msgstr "no es permet aquí l'alies de l'espai de noms \"%D\", assumint que és \"%D\"" +- +-#: cp/name-lookup.c:3421 +-#, gcc-internal-format +-msgid "strong using only meaningful at namespace scope" +-msgstr "" +- +-#: cp/name-lookup.c:3425 +-#, gcc-internal-format +-msgid "current namespace %qD does not enclose strongly used namespace %qD" +-msgstr "" +- +-#: cp/name-lookup.c:4318 +-#, fuzzy, gcc-internal-format +-msgid "%q+D is not a function," +-msgstr "\"%D\" no és una funció," +- +-#: cp/name-lookup.c:4319 +-#, fuzzy, gcc-internal-format +-msgid " conflict with %q+D" +-msgstr " té conflicte amb \"%D\"" +- +-#: cp/name-lookup.c:4752 +-#, gcc-internal-format +-msgid "argument dependent lookup finds %q+D" +-msgstr "" +- +-#: cp/name-lookup.c:5184 +-#, gcc-internal-format +-msgid "XXX entering pop_everything ()\n" +-msgstr "" +- +-#: cp/name-lookup.c:5193 +-#, gcc-internal-format +-msgid "XXX leaving pop_everything ()\n" +-msgstr "" +- +-#: cp/parser.c:451 +-#, gcc-internal-format +-msgid "identifier %<%s%> will become a keyword in C++0x" +-msgstr "" +- +-#: cp/parser.c:2066 +-#, fuzzy, gcc-internal-format +-msgid "%<#pragma%> is not allowed here" +-msgstr "ja s'ha desat #pragma %s" +- +-#: cp/parser.c:2096 +-#, fuzzy, gcc-internal-format +-msgid "%<%E::%E%> has not been declared" +-msgstr "\"%#D\" no pot ser declarat" +- +-#: cp/parser.c:2099 +-#, fuzzy, gcc-internal-format +-msgid "%<::%E%> has not been declared" +-msgstr "\"%#D\" no pot ser declarat" +- +-#: cp/parser.c:2102 +-#, fuzzy, gcc-internal-format +-msgid "request for member %qE in non-class type %qT" +-msgstr "sol·licitud pel membre \"%D\" en \"%E\", el qual és del tipus no agregat \"%T\"" +- +-#: cp/parser.c:2105 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%E%> has not been declared" +-msgstr "\"%#D\" no pot ser declarat" +- +-#: cp/parser.c:2108 +-#, fuzzy, gcc-internal-format +-msgid "%qE has not been declared" +-msgstr "\"%#D\" no pot ser declarat" +- +-#: cp/parser.c:2111 +-#, gcc-internal-format +-msgid "%<%E::%E%> %s" +-msgstr "" +- +-#: cp/parser.c:2113 +-#, fuzzy, gcc-internal-format +-msgid "%<::%E%> %s" +-msgstr "accés \"%D\"" +- +-#: cp/parser.c:2115 +-#, fuzzy, gcc-internal-format +-msgid "%qE %s" +-msgstr "%s: %s" +- +-#: cp/parser.c:2151 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ does not support %" +-msgstr "ISO C++ no dóna suport a \"long long\"" +- +-#: cp/parser.c:2171 +-#, fuzzy, gcc-internal-format +-msgid "duplicate %qs" +-msgstr "\"%s\" duplicat" +- +-#: cp/parser.c:2214 +-#, fuzzy, gcc-internal-format +-msgid "new types may not be defined in a return type" +-msgstr "new no pot ser aplicat a un tipus de referència" +- +-#: cp/parser.c:2215 +-#, fuzzy, gcc-internal-format +-msgid "(perhaps a semicolon is missing after the definition of %qT)" +-msgstr "manca punt i coma després de la declaració de \"%T\"" +- +-#: cp/parser.c:2234 cp/parser.c:4077 cp/pt.c:5443 +-#, fuzzy, gcc-internal-format +-msgid "%qT is not a template" +-msgstr "\"%T\" no és un patró" +- +-#: cp/parser.c:2236 +-#, fuzzy, gcc-internal-format +-msgid "%qE is not a template" +-msgstr "\"%T\" no és un patró" +- +-#: cp/parser.c:2238 +-#, fuzzy, gcc-internal-format +-msgid "invalid template-id" +-msgstr "rotació de insn no vàlida" +- +-#: cp/parser.c:2267 +-#, fuzzy, gcc-internal-format +-msgid "%s cannot appear in a constant-expression" +-msgstr "desbordament en la constant implícita" +- +-#: cp/parser.c:2292 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of template-name %qE without an argument list" +-msgstr "ús no vàlid del nom de patró \"%E\" en un declarador" +- +-#: cp/parser.c:2294 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of destructor %qD as a type" +-msgstr "ús no vàlid de \"restrict\"" +- +-#. Something like 'unsigned A a;' +-#: cp/parser.c:2297 +-#, fuzzy, gcc-internal-format +-msgid "invalid combination of multiple type-specifiers" +-msgstr "definició no vàlida del tipus qualificat \"%T\"" +- +-#. Issue an error message. +-#: cp/parser.c:2301 +-#, fuzzy, gcc-internal-format +-msgid "%qE does not name a type" +-msgstr "\"%T\" no és un tipus de classe" +- +-#: cp/parser.c:2333 +-#, fuzzy, gcc-internal-format +-msgid "(perhaps % was intended)" +-msgstr " (usi \"typename %T::%D\" si això és el que volia)" +- +-#: cp/parser.c:2348 +-#, fuzzy, gcc-internal-format +-msgid "%qE in namespace %qE does not name a type" +-msgstr "\"%T\" no és un tipus de classe" +- +-#: cp/parser.c:2351 +-#, fuzzy, gcc-internal-format +-msgid "%qE in class %qT does not name a type" +-msgstr "\"%T\" no és un tipus de classe" +- +-#: cp/parser.c:3160 +-#, gcc-internal-format +-msgid "ISO C++ forbids braced-groups within expressions" +-msgstr "ISO C++ prohibeix grups de parèntesis dintre de les expressions" +- +-#: cp/parser.c:3171 +-#, fuzzy, gcc-internal-format +-msgid "statement-expressions are not allowed outside functions nor in template-argument lists" +-msgstr "un grup de claus dintre d'una expressió només es permet dintre d'una funció" +- +-#: cp/parser.c:3229 +-#, fuzzy, gcc-internal-format +-msgid "% may not be used in this context" +-msgstr "\"%D\" no es va declarar en aquest àmbit" +- +-#: cp/parser.c:3412 +-#, fuzzy, gcc-internal-format +-msgid "local variable %qD may not appear in this context" +-msgstr "\"%D\" no es va declarar en aquest àmbit" +- +-#: cp/parser.c:3711 +-#, gcc-internal-format +-msgid "scope %qT before %<~%> is not a class-name" +-msgstr "" +- +-#: cp/parser.c:3812 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %<~%T%> as member of %qT" +-msgstr "la declaració de \"%s\" obscurece a un membre de \"this\"" +- +-#: cp/parser.c:3826 +-#, fuzzy, gcc-internal-format +-msgid "typedef-name %qD used as destructor declarator" +-msgstr "l'identificador de patró \"%D\" s'usa com un declarador" +- +-#: cp/parser.c:4480 +-#, fuzzy, gcc-internal-format +-msgid "ISO C++ forbids compound-literals" +-msgstr "ISO C++ prohibeix literals composats" +- +-#: cp/parser.c:4837 +-#, fuzzy, gcc-internal-format +-msgid "%qE does not have class type" +-msgstr "\"%T\" no és un tipus de classe" +- +-#: cp/parser.c:4920 cp/typeck.c:1978 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of %qD" +-msgstr "ús no vàlid de \"%D\"" +- +-#: cp/parser.c:5480 +-#, gcc-internal-format +-msgid "array bound forbidden after parenthesized type-id" +-msgstr "" +- +-#: cp/parser.c:5481 +-#, gcc-internal-format +-msgid "try removing the parentheses around the type-id" +-msgstr "" +- +-#: cp/parser.c:5671 +-#, fuzzy, gcc-internal-format +-msgid "expression in new-declarator must have integral or enumeration type" +-msgstr "la grandària de la matriu nova ha de tenir un tipus integral" +- +-#: cp/parser.c:5860 +-#, gcc-internal-format +-msgid "use of old-style cast" +-msgstr "ús de la conversió d'estil antic" +- +-#: cp/parser.c:5986 +-#, gcc-internal-format +-msgid "%H%<>>%> operator will be treated as two right angle brackets in C++0x" +-msgstr "" +- +-#: cp/parser.c:5989 +-#, fuzzy, gcc-internal-format +-msgid "suggest parentheses around %<>>%> expression" +-msgstr "es suggereixen parèntesi al voltant de && dintre de ||" +- +-#: cp/parser.c:6793 +-#, fuzzy, gcc-internal-format +-msgid "case label %qE not within a switch statement" +-msgstr "l'etiqueta «case» \"%E\" no es troba dintre d'una declaració «switch»" +- +-#: cp/parser.c:6922 +-#, gcc-internal-format +-msgid "% without a previous %" +-msgstr "" +- +-#: cp/parser.c:7208 +-#, gcc-internal-format +-msgid "suggest a space before %<;%> or explicit braces around empty body in %<%s%> statement" +-msgstr "" +- +-#: cp/parser.c:7468 +-#, gcc-internal-format +-msgid "ISO C++ forbids computed gotos" +-msgstr "ISO C++ prohibeix gotos calculats" +- +-#: cp/parser.c:7608 +-#, gcc-internal-format +-msgid "extra %<;%>" +-msgstr "" +- +-#: cp/parser.c:7825 +-#, gcc-internal-format +-msgid "%<__label__%> not at the beginning of a block" +-msgstr "" +- +-#: cp/parser.c:7958 +-#, gcc-internal-format +-msgid "mixing declarations and function-definitions is forbidden" +-msgstr "" +- +-#: cp/parser.c:8090 +-#, gcc-internal-format +-msgid "% used outside of class" +-msgstr "" +- +-#: cp/parser.c:8244 +-#, fuzzy, gcc-internal-format +-msgid "class definition may not be declared a friend" +-msgstr "la funció \"%D\" no pot ser declarada friend" +- +-#: cp/parser.c:8308 cp/parser.c:15155 +-#, gcc-internal-format +-msgid "templates may not be %" +-msgstr "" +- +-#: cp/parser.c:8775 +-#, gcc-internal-format +-msgid "only constructors take base initializers" +-msgstr "" +- +-#: cp/parser.c:8795 +-#, fuzzy, gcc-internal-format +-msgid "cannot expand initializer for member %<%D%>" +-msgstr "falta e l'inicialitzador pel membre \"%D\"" +- +-#: cp/parser.c:8847 +-#, fuzzy, gcc-internal-format +-msgid "anachronistic old-style base class initializer" +-msgstr "inicialitzador de classe base d'estil antic anacrònic" +- +-#: cp/parser.c:8892 +-#, gcc-internal-format +-msgid "keyword % not allowed in this context (a qualified member initializer is implicitly a type)" +-msgstr "" +- +-#. Warn that we do not support `export'. +-#: cp/parser.c:9237 +-#, fuzzy, gcc-internal-format +-msgid "keyword % not implemented, and will be ignored" +-msgstr "la paraula clau \"export\" no està implementada, i serà ignorada" +- +-#: cp/parser.c:9482 cp/parser.c:9583 +-#, fuzzy, gcc-internal-format +-msgid "template parameter pack %qD cannot have a default argument" +-msgstr "\"%D\" no pot tenir arguments per omissió" +- +-#: cp/parser.c:9485 cp/parser.c:9586 +-#, fuzzy, gcc-internal-format +-msgid "template parameter packs cannot have default arguments" +-msgstr "els paràmetres del patró no poden ser friends" +- +-#. Otherwise, emit an error about the invalid digraph, but continue +-#. parsing because we got our argument list. +-#: cp/parser.c:9723 +-#, fuzzy, gcc-internal-format +-msgid "%<<::%> cannot begin a template-argument list" +-msgstr "l'objecte \"%E\" no es pot usar com un argument de patró" +- +-#: cp/parser.c:9724 +-#, gcc-internal-format +-msgid "%<<:%> is an alternate spelling for %<[%>. Insert whitespace between %<<%> and %<::%>" +-msgstr "" +- +-#: cp/parser.c:9731 +-#, gcc-internal-format +-msgid "(if you use -fpermissive G++ will accept your code)" +-msgstr "" +- +-#: cp/parser.c:9804 +-#, fuzzy, gcc-internal-format +-msgid "parse error in template argument list" +-msgstr "l'objecte \"%E\" no es pot usar com un argument de patró" +- +-#. Explain what went wrong. +-#: cp/parser.c:9917 +-#, fuzzy, gcc-internal-format +-msgid "non-template %qD used as template" +-msgstr "s'usa un no-patró com patró" +- +-#: cp/parser.c:9918 +-#, fuzzy, gcc-internal-format +-msgid "use %<%T::template %D%> to indicate that it is a template" +-msgstr "identificador de patró \"%D\" en la declaració del patró primari" +- +-#: cp/parser.c:10441 +-#, gcc-internal-format +-msgid "template specialization with C linkage" +-msgstr "especialització de patró amb enllaç C" +- +-#: cp/parser.c:11032 +-#, fuzzy, gcc-internal-format +-msgid "using % outside of template" +-msgstr "usant \"typename\" fora de la plantilla" +- +-#: cp/parser.c:11191 +-#, fuzzy, gcc-internal-format +-msgid "declaration %qD does not declare anything" +-msgstr "la declaració no declara res" +- +-#: cp/parser.c:11275 +-#, fuzzy, gcc-internal-format +-msgid "attributes ignored on uninstantiated type" +-msgstr "operació no vàlida en tipus no instanciat" +- +-#: cp/parser.c:11279 +-#, fuzzy, gcc-internal-format +-msgid "attributes ignored on template instantiation" +-msgstr "classe d'emmagatzematge \"%D\" aplicada a la instanciació d'un patró" +- +-#: cp/parser.c:11284 +-#, gcc-internal-format +-msgid "attributes ignored on elaborated-type-specifier that is not a forward declaration" +-msgstr "" +- +-#: cp/parser.c:11406 +-#, gcc-internal-format +-msgid "comma at end of enumerator list" +-msgstr "coma al final de la llista de numeradors" +- +-#: cp/parser.c:11498 +-#, fuzzy, gcc-internal-format +-msgid "%qD is not a namespace-name" +-msgstr "\"%D\" no és un nom d'espai" +- +-#: cp/parser.c:11599 +-#, fuzzy, gcc-internal-format +-msgid "% definition is not allowed here" +-msgstr "no es permet aquí l'alies de l'espai de noms \"%D\", assumint que és \"%D\"" +- +-#. [namespace.udecl] +-#. +-#. A using declaration shall not name a template-id. +-#: cp/parser.c:11738 +-#, fuzzy, gcc-internal-format +-msgid "a template-id may not appear in a using-declaration" +-msgstr "no es permet l'espai de noms \"%D\" en la declaració d'ús" +- +-#: cp/parser.c:12094 +-#, gcc-internal-format +-msgid "an asm-specification is not allowed on a function-definition" +-msgstr "" +- +-#: cp/parser.c:12096 +-#, fuzzy, gcc-internal-format +-msgid "attributes are not allowed on a function-definition" +-msgstr "la variable de registre global segueix a una definició de funció" +- +-#: cp/parser.c:12229 +-#, fuzzy, gcc-internal-format +-msgid "initializer provided for function" +-msgstr "es va especificar un inicialitzador per a la funció no-membre \"%D\"" +- +-#: cp/parser.c:12249 +-#, fuzzy, gcc-internal-format +-msgid "attributes after parenthesized initializer ignored" +-msgstr "atributs en el declarador de paràmetres de matriu ignorats" +- +-#: cp/parser.c:12630 cp/pt.c:8772 +-#, fuzzy, gcc-internal-format +-msgid "array bound is not an integer constant" +-msgstr "el subindici de la matriu no és un enter" +- +-#: cp/parser.c:12739 +-#, fuzzy, gcc-internal-format +-msgid "%<%T::%E%> is not a type" +-msgstr "\"%D::%D\" no és un patró" +- +-#: cp/parser.c:12765 +-#, fuzzy, gcc-internal-format +-msgid "invalid use of constructor as a template" +-msgstr "ús no vàlid del patró \"%D\"" +- +-#: cp/parser.c:12766 +-#, gcc-internal-format +-msgid "use %<%T::%D%> instead of %<%T::%D%> to name the constructor in a qualified name" +-msgstr "" +- +-#: cp/parser.c:12938 +-#, fuzzy, gcc-internal-format +-msgid "%qD is a namespace" +-msgstr "\"%D\" és un nom d'espai" +- +-#: cp/parser.c:13013 +-#, fuzzy, gcc-internal-format +-msgid "duplicate cv-qualifier" +-msgstr "valor d'un «case» duplicat" +- +-#: cp/parser.c:13600 +-#, fuzzy, gcc-internal-format +-msgid "file ends in default argument" +-msgstr "%Hlectura de final de fitxer dintre de l'argument per defecte" +- +-#: cp/parser.c:13673 +-#, fuzzy, gcc-internal-format +-msgid "deprecated use of default argument for parameter of non-function" +-msgstr "argument per omissió donat per al paràmetre %d de \"%#D\"" +- +-#: cp/parser.c:13676 +-#, fuzzy, gcc-internal-format +-msgid "default arguments are only permitted for function parameters" +-msgstr "argument per omissió donat per al paràmetre %d de \"%#D\"" +- +-#: cp/parser.c:13877 +-#, gcc-internal-format +-msgid "ISO C++ does not allow designated initializers" +-msgstr "ISO C++ no permet inicialitzadors designats" +- +-#: cp/parser.c:14477 +-#, fuzzy, gcc-internal-format +-msgid "invalid class name in declaration of %qD" +-msgstr "declaració del patró membre \"%D\" no vàlida" +- +-#: cp/parser.c:14489 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD in namespace %qD which does not enclose %qD" +-msgstr "declaració de \"%D\" en \"%D\" la qual no inclou a \"%D\"" +- +-#: cp/parser.c:14492 +-#, fuzzy, gcc-internal-format +-msgid "declaration of %qD in %qD which does not enclose %qD" +-msgstr "declaració de \"%D\" en \"%D\" la qual no inclou a \"%D\"" +- +-#: cp/parser.c:14505 +-#, fuzzy, gcc-internal-format +-msgid "extra qualification ignored" +-msgstr "s'ignora la qualificació extra \"%T::\" en el membre \"%D\"" +- +-#: cp/parser.c:14516 +-#, fuzzy, gcc-internal-format +-msgid "an explicit specialization must be preceded by %