diff options
455 files changed, 7454 insertions, 3419 deletions
diff --git a/Documentation/arm/Samsung-S3C24XX/GPIO.txt b/Documentation/arm/Samsung-S3C24XX/GPIO.txt index b5d20c0b2ab4..ea7ccfc4b274 100644 --- a/Documentation/arm/Samsung-S3C24XX/GPIO.txt +++ b/Documentation/arm/Samsung-S3C24XX/GPIO.txt | |||
| @@ -13,6 +13,21 @@ Introduction | |||
| 13 | data-sheet/users manual to find out the complete list. | 13 | data-sheet/users manual to find out the complete list. |
| 14 | 14 | ||
| 15 | 15 | ||
| 16 | GPIOLIB | ||
| 17 | ------- | ||
| 18 | |||
| 19 | With the event of the GPIOLIB in drivers/gpio, support for some | ||
| 20 | of the GPIO functions such as reading and writing a pin will | ||
| 21 | be removed in favour of this common access method. | ||
| 22 | |||
| 23 | Once all the extant drivers have been converted, the functions | ||
| 24 | listed below will be removed (they may be marked as __deprecated | ||
| 25 | in the near future). | ||
| 26 | |||
| 27 | - s3c2410_gpio_getpin | ||
| 28 | - s3c2410_gpio_setpin | ||
| 29 | |||
| 30 | |||
| 16 | Headers | 31 | Headers |
| 17 | ------- | 32 | ------- |
| 18 | 33 | ||
diff --git a/Documentation/arm/Samsung-S3C24XX/Overview.txt b/Documentation/arm/Samsung-S3C24XX/Overview.txt index 014a8ec4877d..cff6227b4484 100644 --- a/Documentation/arm/Samsung-S3C24XX/Overview.txt +++ b/Documentation/arm/Samsung-S3C24XX/Overview.txt | |||
| @@ -8,9 +8,10 @@ Introduction | |||
| 8 | 8 | ||
| 9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported | 9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported |
| 10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, | 10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, |
| 11 | S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported. | 11 | S3C2412, S3C2413, S3C2440, S3C2442 and S3C2443 devices are supported. |
| 12 | |||
| 13 | Support for the S3C2400 and S3C24A0 series are in progress. | ||
| 12 | 14 | ||
| 13 | Support for the S3C2400 series is in progress. | ||
| 14 | 15 | ||
| 15 | Configuration | 16 | Configuration |
| 16 | ------------- | 17 | ------------- |
| @@ -38,6 +39,22 @@ Layout | |||
| 38 | Register, kernel and platform data definitions are held in the | 39 | Register, kernel and platform data definitions are held in the |
| 39 | arch/arm/mach-s3c2410 directory./include/mach | 40 | arch/arm/mach-s3c2410 directory./include/mach |
| 40 | 41 | ||
| 42 | arch/arm/plat-s3c24xx: | ||
| 43 | |||
| 44 | Files in here are either common to all the s3c24xx family, | ||
| 45 | or are common to only some of them with names to indicate this | ||
| 46 | status. The files that are not common to all are generally named | ||
| 47 | with the initial cpu they support in the series to ensure a short | ||
| 48 | name without any possibility of confusion with newer devices. | ||
| 49 | |||
| 50 | As an example, initially s3c244x would cover s3c2440 and s3c2442, but | ||
| 51 | with the s3c2443 which does not share many of the same drivers in | ||
| 52 | this directory, the name becomes invalid. We stick to s3c2440-<x> | ||
| 53 | to indicate a driver that is s3c2440 and s3c2442 compatible. | ||
| 54 | |||
| 55 | This does mean that to find the status of any given SoC, a number | ||
| 56 | of directories may need to be searched. | ||
| 57 | |||
| 41 | 58 | ||
| 42 | Machines | 59 | Machines |
| 43 | -------- | 60 | -------- |
| @@ -159,6 +176,17 @@ NAND | |||
| 159 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt | 176 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt |
| 160 | 177 | ||
| 161 | 178 | ||
| 179 | SD/MMC | ||
| 180 | ------ | ||
| 181 | |||
| 182 | The SD/MMC hardware pre S3C2443 is supported in the current | ||
| 183 | kernel, the driver is drivers/mmc/host/s3cmci.c and supports | ||
| 184 | 1 and 4 bit SD or MMC cards. | ||
| 185 | |||
| 186 | The SDIO behaviour of this driver has not been fully tested. There is no | ||
| 187 | current support for hardware SDIO interrupts. | ||
| 188 | |||
| 189 | |||
| 162 | Serial | 190 | Serial |
| 163 | ------ | 191 | ------ |
| 164 | 192 | ||
| @@ -178,6 +206,9 @@ GPIO | |||
| 178 | The core contains support for manipulating the GPIO, see the | 206 | The core contains support for manipulating the GPIO, see the |
| 179 | documentation in GPIO.txt in the same directory as this file. | 207 | documentation in GPIO.txt in the same directory as this file. |
| 180 | 208 | ||
| 209 | Newer kernels carry GPIOLIB, and support is being moved towards | ||
| 210 | this with some of the older support in line to be removed. | ||
| 211 | |||
| 181 | 212 | ||
| 182 | Clock Management | 213 | Clock Management |
| 183 | ---------------- | 214 | ---------------- |
diff --git a/Documentation/filesystems/ubifs.txt b/Documentation/filesystems/ubifs.txt index 540e9e7f59c5..6a0d70a22f05 100644 --- a/Documentation/filesystems/ubifs.txt +++ b/Documentation/filesystems/ubifs.txt | |||
| @@ -57,7 +57,7 @@ Similarly to JFFS2, UBIFS supports on-the-flight compression which makes | |||
| 57 | it possible to fit quite a lot of data to the flash. | 57 | it possible to fit quite a lot of data to the flash. |
| 58 | 58 | ||
| 59 | Similarly to JFFS2, UBIFS is tolerant of unclean reboots and power-cuts. | 59 | Similarly to JFFS2, UBIFS is tolerant of unclean reboots and power-cuts. |
| 60 | It does not need stuff like ckfs.ext2. UBIFS automatically replays its | 60 | It does not need stuff like fsck.ext2. UBIFS automatically replays its |
| 61 | journal and recovers from crashes, ensuring that the on-flash data | 61 | journal and recovers from crashes, ensuring that the on-flash data |
| 62 | structures are consistent. | 62 | structures are consistent. |
| 63 | 63 | ||
diff --git a/Documentation/hwmon/ibmaem b/Documentation/hwmon/ibmaem index 2fefaf582a43..e98bdfea3467 100644 --- a/Documentation/hwmon/ibmaem +++ b/Documentation/hwmon/ibmaem | |||
| @@ -1,8 +1,11 @@ | |||
| 1 | Kernel driver ibmaem | 1 | Kernel driver ibmaem |
| 2 | ====================== | 2 | ====================== |
| 3 | 3 | ||
| 4 | This driver talks to the IBM Systems Director Active Energy Manager, known | ||
| 5 | henceforth as AEM. | ||
| 6 | |||
| 4 | Supported systems: | 7 | Supported systems: |
| 5 | * Any recent IBM System X server with Active Energy Manager support. | 8 | * Any recent IBM System X server with AEM support. |
| 6 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, | 9 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, |
| 7 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface | 10 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface |
| 8 | driver ("ipmi-si") needs to be loaded for this driver to do anything. | 11 | driver ("ipmi-si") needs to be loaded for this driver to do anything. |
| @@ -14,24 +17,22 @@ Author: Darrick J. Wong | |||
| 14 | Description | 17 | Description |
| 15 | ----------- | 18 | ----------- |
| 16 | 19 | ||
| 17 | This driver implements sensor reading support for the energy and power | 20 | This driver implements sensor reading support for the energy and power meters |
| 18 | meters available on various IBM System X hardware through the BMC. All | 21 | available on various IBM System X hardware through the BMC. All sensor banks |
| 19 | sensor banks will be exported as platform devices; this driver can talk | 22 | will be exported as platform devices; this driver can talk to both v1 and v2 |
| 20 | to both v1 and v2 interfaces. This driver is completely separate from the | 23 | interfaces. This driver is completely separate from the older ibmpex driver. |
| 21 | older ibmpex driver. | ||
| 22 | 24 | ||
| 23 | The v1 AEM interface has a simple set of features to monitor energy use. | 25 | The v1 AEM interface has a simple set of features to monitor energy use. There |
| 24 | There is a register that displays an estimate of raw energy consumption | 26 | is a register that displays an estimate of raw energy consumption since the |
| 25 | since the last BMC reset, and a power sensor that returns average power | 27 | last BMC reset, and a power sensor that returns average power use over a |
| 26 | use over a configurable interval. | 28 | configurable interval. |
| 27 | 29 | ||
| 28 | The v2 AEM interface is a bit more sophisticated, being able to present | 30 | The v2 AEM interface is a bit more sophisticated, being able to present a wider |
| 29 | a wider range of energy and power use registers, the power cap as | 31 | range of energy and power use registers, the power cap as set by the AEM |
| 30 | set by the AEM software, and temperature sensors. | 32 | software, and temperature sensors. |
| 31 | 33 | ||
| 32 | Special Features | 34 | Special Features |
| 33 | ---------------- | 35 | ---------------- |
| 34 | 36 | ||
| 35 | The "power_cap" value displays the current system power cap, as set by | 37 | The "power_cap" value displays the current system power cap, as set by the AEM |
| 36 | the Active Energy Manager software. Setting the power cap from the host | 38 | software. Setting the power cap from the host is not currently supported. |
| 37 | is not currently supported. | ||
diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt index 02dc748b76c4..71f0fe1fc1b0 100644 --- a/Documentation/laptops/thinkpad-acpi.txt +++ b/Documentation/laptops/thinkpad-acpi.txt | |||
| @@ -44,7 +44,7 @@ detailed description): | |||
| 44 | - LCD brightness control | 44 | - LCD brightness control |
| 45 | - Volume control | 45 | - Volume control |
| 46 | - Fan control and monitoring: fan speed, fan enable/disable | 46 | - Fan control and monitoring: fan speed, fan enable/disable |
| 47 | - Experimental: WAN enable and disable | 47 | - WAN enable and disable |
| 48 | 48 | ||
| 49 | A compatibility table by model and feature is maintained on the web | 49 | A compatibility table by model and feature is maintained on the web |
| 50 | site, http://ibm-acpi.sf.net/. I appreciate any success or failure | 50 | site, http://ibm-acpi.sf.net/. I appreciate any success or failure |
| @@ -1375,18 +1375,13 @@ with EINVAL, try to set pwm1_enable to 1 and pwm1 to at least 128 (255 | |||
| 1375 | would be the safest choice, though). | 1375 | would be the safest choice, though). |
| 1376 | 1376 | ||
| 1377 | 1377 | ||
| 1378 | EXPERIMENTAL: WAN | 1378 | WAN |
| 1379 | ----------------- | 1379 | --- |
| 1380 | 1380 | ||
| 1381 | procfs: /proc/acpi/ibm/wan | 1381 | procfs: /proc/acpi/ibm/wan |
| 1382 | sysfs device attribute: wwan_enable (deprecated) | 1382 | sysfs device attribute: wwan_enable (deprecated) |
| 1383 | sysfs rfkill class: switch "tpacpi_wwan_sw" | 1383 | sysfs rfkill class: switch "tpacpi_wwan_sw" |
| 1384 | 1384 | ||
| 1385 | This feature is marked EXPERIMENTAL because the implementation | ||
| 1386 | directly accesses hardware registers and may not work as expected. USE | ||
| 1387 | WITH CAUTION! To use this feature, you need to supply the | ||
| 1388 | experimental=1 parameter when loading the module. | ||
| 1389 | |||
| 1390 | This feature shows the presence and current state of a W-WAN (Sierra | 1385 | This feature shows the presence and current state of a W-WAN (Sierra |
| 1391 | Wireless EV-DO) device. | 1386 | Wireless EV-DO) device. |
| 1392 | 1387 | ||
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 6f6d117ac7e2..b117e42a6166 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
| @@ -1144,8 +1144,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 1144 | 1144 | ||
| 1145 | This module supports autoprobe and multiple cards. | 1145 | This module supports autoprobe and multiple cards. |
| 1146 | 1146 | ||
| 1147 | Power management is _not_ supported. | ||
| 1148 | |||
| 1149 | Module snd-ice1712 | 1147 | Module snd-ice1712 |
| 1150 | ------------------ | 1148 | ------------------ |
| 1151 | 1149 | ||
| @@ -1628,8 +1626,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 1628 | 1626 | ||
| 1629 | This module supports autoprobe and multiple cards. | 1627 | This module supports autoprobe and multiple cards. |
| 1630 | 1628 | ||
| 1631 | Power management is _not_ supported. | ||
| 1632 | |||
| 1633 | Module snd-pcsp | 1629 | Module snd-pcsp |
| 1634 | ----------------- | 1630 | ----------------- |
| 1635 | 1631 | ||
| @@ -2081,13 +2077,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 2081 | Module snd-virtuoso | 2077 | Module snd-virtuoso |
| 2082 | ------------------- | 2078 | ------------------- |
| 2083 | 2079 | ||
| 2084 | Module for sound cards based on the Asus AV200 chip, i.e., | 2080 | Module for sound cards based on the Asus AV100/AV200 chips, |
| 2085 | Xonar D2 and Xonar D2X. | 2081 | i.e., Xonar D1, DX, D2 and D2X. |
| 2086 | 2082 | ||
| 2087 | This module supports autoprobe and multiple cards. | 2083 | This module supports autoprobe and multiple cards. |
| 2088 | 2084 | ||
| 2089 | Power management is _not_ supported. | ||
| 2090 | |||
| 2091 | Module snd-vx222 | 2085 | Module snd-vx222 |
| 2092 | ---------------- | 2086 | ---------------- |
| 2093 | 2087 | ||
diff --git a/Documentation/vm/page_migration b/Documentation/vm/page_migration index 99f89aa10169..d5fdfd34bbaf 100644 --- a/Documentation/vm/page_migration +++ b/Documentation/vm/page_migration | |||
| @@ -18,10 +18,11 @@ migrate_pages function call takes two sets of nodes and moves pages of a | |||
| 18 | process that are located on the from nodes to the destination nodes. | 18 | process that are located on the from nodes to the destination nodes. |
| 19 | Page migration functions are provided by the numactl package by Andi Kleen | 19 | Page migration functions are provided by the numactl package by Andi Kleen |
| 20 | (a version later than 0.9.3 is required. Get it from | 20 | (a version later than 0.9.3 is required. Get it from |
| 21 | ftp://ftp.suse.com/pub/people/ak). numactl provided libnuma which | 21 | ftp://oss.sgi.com/www/projects/libnuma/download/). numactl provides libnuma |
| 22 | provides an interface similar to other numa functionality for page migration. | 22 | which provides an interface similar to other numa functionality for page |
| 23 | cat /proc/<pid>/numa_maps allows an easy review of where the pages of | 23 | migration. cat /proc/<pid>/numa_maps allows an easy review of where the |
| 24 | a process are located. See also the numa_maps manpage in the numactl package. | 24 | pages of a process are located. See also the numa_maps documentation in the |
| 25 | proc(5) man page. | ||
| 25 | 26 | ||
| 26 | Manual migration is useful if for example the scheduler has relocated | 27 | Manual migration is useful if for example the scheduler has relocated |
| 27 | a process to a processor on a distant node. A batch scheduler or an | 28 | a process to a processor on a distant node. A batch scheduler or an |
diff --git a/MAINTAINERS b/MAINTAINERS index 4c5e9fe0f7db..9fc7c1c7e1bb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -175,12 +175,18 @@ M: bcrl@kvack.org | |||
| 175 | L: linux-aio@kvack.org | 175 | L: linux-aio@kvack.org |
| 176 | S: Supported | 176 | S: Supported |
| 177 | 177 | ||
| 178 | ABIT UGURU HARDWARE MONITOR DRIVER | 178 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER |
| 179 | P: Hans de Goede | 179 | P: Hans de Goede |
| 180 | M: j.w.r.degoede@hhs.nl | 180 | M: j.w.r.degoede@hhs.nl |
| 181 | L: lm-sensors@lm-sensors.org | 181 | L: lm-sensors@lm-sensors.org |
| 182 | S: Maintained | 182 | S: Maintained |
| 183 | 183 | ||
| 184 | ABIT UGURU 3 HARDWARE MONITOR DRIVER | ||
| 185 | P: Alistair John Strachan | ||
| 186 | M: alistair@devzero.co.uk | ||
| 187 | L: lm-sensors@lm-sensors.org | ||
| 188 | S: Maintained | ||
| 189 | |||
| 184 | ACENIC DRIVER | 190 | ACENIC DRIVER |
| 185 | P: Jes Sorensen | 191 | P: Jes Sorensen |
| 186 | M: jes@trained-monkey.org | 192 | M: jes@trained-monkey.org |
| @@ -216,8 +222,7 @@ W: http://code.google.com/p/aceracpi | |||
| 216 | S: Maintained | 222 | S: Maintained |
| 217 | 223 | ||
| 218 | ACPI | 224 | ACPI |
| 219 | P: Andi Kleen | 225 | P: Len Brown |
| 220 | M: ak@linux.intel.com | ||
| 221 | M: lenb@kernel.org | 226 | M: lenb@kernel.org |
| 222 | L: linux-acpi@vger.kernel.org | 227 | L: linux-acpi@vger.kernel.org |
| 223 | W: http://www.lesswatts.org/projects/acpi/ | 228 | W: http://www.lesswatts.org/projects/acpi/ |
| @@ -3748,6 +3753,16 @@ L: linux-visws-devel@lists.sf.net | |||
| 3748 | W: http://linux-visws.sf.net | 3753 | W: http://linux-visws.sf.net |
| 3749 | S: Maintained for 2.6. | 3754 | S: Maintained for 2.6. |
| 3750 | 3755 | ||
| 3756 | SGI GRU DRIVER | ||
| 3757 | P: Jack Steiner | ||
| 3758 | M: steiner@sgi.com | ||
| 3759 | S: Maintained | ||
| 3760 | |||
| 3761 | SGI XP/XPC/XPNET DRIVER | ||
| 3762 | P: Dean Nelson | ||
| 3763 | M: dcn@sgi.com | ||
| 3764 | S: Maintained | ||
| 3765 | |||
| 3751 | SIMTEC EB110ATX (Chalice CATS) | 3766 | SIMTEC EB110ATX (Chalice CATS) |
| 3752 | P: Ben Dooks | 3767 | P: Ben Dooks |
| 3753 | P: Vincent Sanders | 3768 | P: Vincent Sanders |
diff --git a/include/asm-alpha/8253pit.h b/arch/alpha/include/asm/8253pit.h index fef5c1450e47..fef5c1450e47 100644 --- a/include/asm-alpha/8253pit.h +++ b/arch/alpha/include/asm/8253pit.h | |||
diff --git a/include/asm-alpha/Kbuild b/arch/alpha/include/asm/Kbuild index b7c8f188b313..b7c8f188b313 100644 --- a/include/asm-alpha/Kbuild +++ b/arch/alpha/include/asm/Kbuild | |||
diff --git a/include/asm-alpha/a.out-core.h b/arch/alpha/include/asm/a.out-core.h index 9e33e92e524c..9e33e92e524c 100644 --- a/include/asm-alpha/a.out-core.h +++ b/arch/alpha/include/asm/a.out-core.h | |||
diff --git a/include/asm-alpha/a.out.h b/arch/alpha/include/asm/a.out.h index 02ce8473870a..02ce8473870a 100644 --- a/include/asm-alpha/a.out.h +++ b/arch/alpha/include/asm/a.out.h | |||
diff --git a/include/asm-alpha/agp.h b/arch/alpha/include/asm/agp.h index 26c179135293..26c179135293 100644 --- a/include/asm-alpha/agp.h +++ b/arch/alpha/include/asm/agp.h | |||
diff --git a/include/asm-alpha/agp_backend.h b/arch/alpha/include/asm/agp_backend.h index 55dd44a2cea7..55dd44a2cea7 100644 --- a/include/asm-alpha/agp_backend.h +++ b/arch/alpha/include/asm/agp_backend.h | |||
diff --git a/include/asm-alpha/atomic.h b/arch/alpha/include/asm/atomic.h index ca88e54dec93..ca88e54dec93 100644 --- a/include/asm-alpha/atomic.h +++ b/arch/alpha/include/asm/atomic.h | |||
diff --git a/include/asm-alpha/auxvec.h b/arch/alpha/include/asm/auxvec.h index e96fe880e310..e96fe880e310 100644 --- a/include/asm-alpha/auxvec.h +++ b/arch/alpha/include/asm/auxvec.h | |||
diff --git a/include/asm-alpha/barrier.h b/arch/alpha/include/asm/barrier.h index ac78eba909bc..ac78eba909bc 100644 --- a/include/asm-alpha/barrier.h +++ b/arch/alpha/include/asm/barrier.h | |||
diff --git a/include/asm-alpha/bitops.h b/arch/alpha/include/asm/bitops.h index 15f3ae25c511..15f3ae25c511 100644 --- a/include/asm-alpha/bitops.h +++ b/arch/alpha/include/asm/bitops.h | |||
diff --git a/include/asm-alpha/bug.h b/arch/alpha/include/asm/bug.h index 695a5ee4b5d3..695a5ee4b5d3 100644 --- a/include/asm-alpha/bug.h +++ b/arch/alpha/include/asm/bug.h | |||
diff --git a/include/asm-alpha/bugs.h b/arch/alpha/include/asm/bugs.h index 78030d1c7e7e..78030d1c7e7e 100644 --- a/include/asm-alpha/bugs.h +++ b/arch/alpha/include/asm/bugs.h | |||
diff --git a/include/asm-alpha/byteorder.h b/arch/alpha/include/asm/byteorder.h index 58e958fc7f1b..58e958fc7f1b 100644 --- a/include/asm-alpha/byteorder.h +++ b/arch/alpha/include/asm/byteorder.h | |||
diff --git a/include/asm-alpha/cache.h b/arch/alpha/include/asm/cache.h index f199e69a5d0b..f199e69a5d0b 100644 --- a/include/asm-alpha/cache.h +++ b/arch/alpha/include/asm/cache.h | |||
diff --git a/include/asm-alpha/cacheflush.h b/arch/alpha/include/asm/cacheflush.h index b686cc7fc44e..b686cc7fc44e 100644 --- a/include/asm-alpha/cacheflush.h +++ b/arch/alpha/include/asm/cacheflush.h | |||
diff --git a/include/asm-alpha/checksum.h b/arch/alpha/include/asm/checksum.h index d3854bbf0a9e..d3854bbf0a9e 100644 --- a/include/asm-alpha/checksum.h +++ b/arch/alpha/include/asm/checksum.h | |||
diff --git a/include/asm-alpha/compiler.h b/arch/alpha/include/asm/compiler.h index da6bb199839c..da6bb199839c 100644 --- a/include/asm-alpha/compiler.h +++ b/arch/alpha/include/asm/compiler.h | |||
diff --git a/include/asm-alpha/console.h b/arch/alpha/include/asm/console.h index a3ce4e62249b..a3ce4e62249b 100644 --- a/include/asm-alpha/console.h +++ b/arch/alpha/include/asm/console.h | |||
diff --git a/include/asm-alpha/core_apecs.h b/arch/alpha/include/asm/core_apecs.h index 6785ff7e02bc..6785ff7e02bc 100644 --- a/include/asm-alpha/core_apecs.h +++ b/arch/alpha/include/asm/core_apecs.h | |||
diff --git a/include/asm-alpha/core_cia.h b/arch/alpha/include/asm/core_cia.h index 9e0516c0ca27..9e0516c0ca27 100644 --- a/include/asm-alpha/core_cia.h +++ b/arch/alpha/include/asm/core_cia.h | |||
diff --git a/include/asm-alpha/core_irongate.h b/arch/alpha/include/asm/core_irongate.h index 24b2db541501..24b2db541501 100644 --- a/include/asm-alpha/core_irongate.h +++ b/arch/alpha/include/asm/core_irongate.h | |||
diff --git a/include/asm-alpha/core_lca.h b/arch/alpha/include/asm/core_lca.h index f7cb4b460954..f7cb4b460954 100644 --- a/include/asm-alpha/core_lca.h +++ b/arch/alpha/include/asm/core_lca.h | |||
diff --git a/include/asm-alpha/core_marvel.h b/arch/alpha/include/asm/core_marvel.h index 30d55fe7aaf6..30d55fe7aaf6 100644 --- a/include/asm-alpha/core_marvel.h +++ b/arch/alpha/include/asm/core_marvel.h | |||
diff --git a/include/asm-alpha/core_mcpcia.h b/arch/alpha/include/asm/core_mcpcia.h index acf55b483472..acf55b483472 100644 --- a/include/asm-alpha/core_mcpcia.h +++ b/arch/alpha/include/asm/core_mcpcia.h | |||
diff --git a/include/asm-alpha/core_polaris.h b/arch/alpha/include/asm/core_polaris.h index 2f966b64659d..2f966b64659d 100644 --- a/include/asm-alpha/core_polaris.h +++ b/arch/alpha/include/asm/core_polaris.h | |||
diff --git a/include/asm-alpha/core_t2.h b/arch/alpha/include/asm/core_t2.h index 46bfff58f670..46bfff58f670 100644 --- a/include/asm-alpha/core_t2.h +++ b/arch/alpha/include/asm/core_t2.h | |||
diff --git a/include/asm-alpha/core_titan.h b/arch/alpha/include/asm/core_titan.h index a17f6f33b68e..a17f6f33b68e 100644 --- a/include/asm-alpha/core_titan.h +++ b/arch/alpha/include/asm/core_titan.h | |||
diff --git a/include/asm-alpha/core_tsunami.h b/arch/alpha/include/asm/core_tsunami.h index 58d4fe48742c..58d4fe48742c 100644 --- a/include/asm-alpha/core_tsunami.h +++ b/arch/alpha/include/asm/core_tsunami.h | |||
diff --git a/include/asm-alpha/core_wildfire.h b/arch/alpha/include/asm/core_wildfire.h index cd562f544ba2..cd562f544ba2 100644 --- a/include/asm-alpha/core_wildfire.h +++ b/arch/alpha/include/asm/core_wildfire.h | |||
diff --git a/include/asm-alpha/cputime.h b/arch/alpha/include/asm/cputime.h index 19577fd93230..19577fd93230 100644 --- a/include/asm-alpha/cputime.h +++ b/arch/alpha/include/asm/cputime.h | |||
diff --git a/include/asm-alpha/current.h b/arch/alpha/include/asm/current.h index 094d285a1b34..094d285a1b34 100644 --- a/include/asm-alpha/current.h +++ b/arch/alpha/include/asm/current.h | |||
diff --git a/include/asm-alpha/delay.h b/arch/alpha/include/asm/delay.h index 2aa3f410f7e6..2aa3f410f7e6 100644 --- a/include/asm-alpha/delay.h +++ b/arch/alpha/include/asm/delay.h | |||
diff --git a/include/asm-alpha/device.h b/arch/alpha/include/asm/device.h index d8f9872b0e2d..d8f9872b0e2d 100644 --- a/include/asm-alpha/device.h +++ b/arch/alpha/include/asm/device.h | |||
diff --git a/include/asm-alpha/div64.h b/arch/alpha/include/asm/div64.h index 6cd978cefb28..6cd978cefb28 100644 --- a/include/asm-alpha/div64.h +++ b/arch/alpha/include/asm/div64.h | |||
diff --git a/include/asm-alpha/dma-mapping.h b/arch/alpha/include/asm/dma-mapping.h index a5801ae02e4b..a5801ae02e4b 100644 --- a/include/asm-alpha/dma-mapping.h +++ b/arch/alpha/include/asm/dma-mapping.h | |||
diff --git a/include/asm-alpha/dma.h b/arch/alpha/include/asm/dma.h index 87cfdbdf08fc..87cfdbdf08fc 100644 --- a/include/asm-alpha/dma.h +++ b/arch/alpha/include/asm/dma.h | |||
diff --git a/include/asm-alpha/elf.h b/arch/alpha/include/asm/elf.h index fc1002ea1e0c..fc1002ea1e0c 100644 --- a/include/asm-alpha/elf.h +++ b/arch/alpha/include/asm/elf.h | |||
diff --git a/include/asm-alpha/emergency-restart.h b/arch/alpha/include/asm/emergency-restart.h index 108d8c48e42e..108d8c48e42e 100644 --- a/include/asm-alpha/emergency-restart.h +++ b/arch/alpha/include/asm/emergency-restart.h | |||
diff --git a/include/asm-alpha/err_common.h b/arch/alpha/include/asm/err_common.h index c25095942107..c25095942107 100644 --- a/include/asm-alpha/err_common.h +++ b/arch/alpha/include/asm/err_common.h | |||
diff --git a/include/asm-alpha/err_ev6.h b/arch/alpha/include/asm/err_ev6.h index ea637791e4a9..ea637791e4a9 100644 --- a/include/asm-alpha/err_ev6.h +++ b/arch/alpha/include/asm/err_ev6.h | |||
diff --git a/include/asm-alpha/err_ev7.h b/arch/alpha/include/asm/err_ev7.h index 87f99777c2e4..87f99777c2e4 100644 --- a/include/asm-alpha/err_ev7.h +++ b/arch/alpha/include/asm/err_ev7.h | |||
diff --git a/include/asm-alpha/errno.h b/arch/alpha/include/asm/errno.h index 69e2655249d2..69e2655249d2 100644 --- a/include/asm-alpha/errno.h +++ b/arch/alpha/include/asm/errno.h | |||
diff --git a/include/asm-alpha/fb.h b/arch/alpha/include/asm/fb.h index fa9bbb96b2b3..fa9bbb96b2b3 100644 --- a/include/asm-alpha/fb.h +++ b/arch/alpha/include/asm/fb.h | |||
diff --git a/include/asm-alpha/fcntl.h b/arch/alpha/include/asm/fcntl.h index 25da0017ec87..25da0017ec87 100644 --- a/include/asm-alpha/fcntl.h +++ b/arch/alpha/include/asm/fcntl.h | |||
diff --git a/include/asm-alpha/floppy.h b/arch/alpha/include/asm/floppy.h index 0be50413b2b5..0be50413b2b5 100644 --- a/include/asm-alpha/floppy.h +++ b/arch/alpha/include/asm/floppy.h | |||
diff --git a/include/asm-alpha/fpu.h b/arch/alpha/include/asm/fpu.h index ecb17a72acc3..ecb17a72acc3 100644 --- a/include/asm-alpha/fpu.h +++ b/arch/alpha/include/asm/fpu.h | |||
diff --git a/include/asm-alpha/futex.h b/arch/alpha/include/asm/futex.h index 6a332a9f099c..6a332a9f099c 100644 --- a/include/asm-alpha/futex.h +++ b/arch/alpha/include/asm/futex.h | |||
diff --git a/include/asm-alpha/gct.h b/arch/alpha/include/asm/gct.h index 3504c704927c..3504c704927c 100644 --- a/include/asm-alpha/gct.h +++ b/arch/alpha/include/asm/gct.h | |||
diff --git a/include/asm-alpha/gentrap.h b/arch/alpha/include/asm/gentrap.h index ae50cc3192c7..ae50cc3192c7 100644 --- a/include/asm-alpha/gentrap.h +++ b/arch/alpha/include/asm/gentrap.h | |||
diff --git a/include/asm-alpha/hardirq.h b/arch/alpha/include/asm/hardirq.h index d953e234daa8..d953e234daa8 100644 --- a/include/asm-alpha/hardirq.h +++ b/arch/alpha/include/asm/hardirq.h | |||
diff --git a/include/asm-alpha/hw_irq.h b/arch/alpha/include/asm/hw_irq.h index a37db0f95092..a37db0f95092 100644 --- a/include/asm-alpha/hw_irq.h +++ b/arch/alpha/include/asm/hw_irq.h | |||
diff --git a/include/asm-alpha/hwrpb.h b/arch/alpha/include/asm/hwrpb.h index 8e8f871af7cf..8e8f871af7cf 100644 --- a/include/asm-alpha/hwrpb.h +++ b/arch/alpha/include/asm/hwrpb.h | |||
diff --git a/include/asm-alpha/io.h b/arch/alpha/include/asm/io.h index e971ab000f95..e971ab000f95 100644 --- a/include/asm-alpha/io.h +++ b/arch/alpha/include/asm/io.h | |||
diff --git a/include/asm-alpha/io_trivial.h b/arch/alpha/include/asm/io_trivial.h index 1c77f10b4b36..1c77f10b4b36 100644 --- a/include/asm-alpha/io_trivial.h +++ b/arch/alpha/include/asm/io_trivial.h | |||
diff --git a/include/asm-alpha/ioctl.h b/arch/alpha/include/asm/ioctl.h index fc63727f4178..fc63727f4178 100644 --- a/include/asm-alpha/ioctl.h +++ b/arch/alpha/include/asm/ioctl.h | |||
diff --git a/include/asm-alpha/ioctls.h b/arch/alpha/include/asm/ioctls.h index 67bb9f6fdbe4..67bb9f6fdbe4 100644 --- a/include/asm-alpha/ioctls.h +++ b/arch/alpha/include/asm/ioctls.h | |||
diff --git a/include/asm-alpha/ipcbuf.h b/arch/alpha/include/asm/ipcbuf.h index d9c0e1a50702..d9c0e1a50702 100644 --- a/include/asm-alpha/ipcbuf.h +++ b/arch/alpha/include/asm/ipcbuf.h | |||
diff --git a/include/asm-alpha/irq.h b/arch/alpha/include/asm/irq.h index 06377400dc09..06377400dc09 100644 --- a/include/asm-alpha/irq.h +++ b/arch/alpha/include/asm/irq.h | |||
diff --git a/include/asm-alpha/irq_regs.h b/arch/alpha/include/asm/irq_regs.h index 3dd9c0b70270..3dd9c0b70270 100644 --- a/include/asm-alpha/irq_regs.h +++ b/arch/alpha/include/asm/irq_regs.h | |||
diff --git a/include/asm-alpha/jensen.h b/arch/alpha/include/asm/jensen.h index 964b06ead43b..964b06ead43b 100644 --- a/include/asm-alpha/jensen.h +++ b/arch/alpha/include/asm/jensen.h | |||
diff --git a/include/asm-alpha/kdebug.h b/arch/alpha/include/asm/kdebug.h index 6ece1b037665..6ece1b037665 100644 --- a/include/asm-alpha/kdebug.h +++ b/arch/alpha/include/asm/kdebug.h | |||
diff --git a/include/asm-alpha/kmap_types.h b/arch/alpha/include/asm/kmap_types.h index 3e6735a34c57..3e6735a34c57 100644 --- a/include/asm-alpha/kmap_types.h +++ b/arch/alpha/include/asm/kmap_types.h | |||
diff --git a/include/asm-alpha/linkage.h b/arch/alpha/include/asm/linkage.h index 291c2d01c44f..291c2d01c44f 100644 --- a/include/asm-alpha/linkage.h +++ b/arch/alpha/include/asm/linkage.h | |||
diff --git a/include/asm-alpha/local.h b/arch/alpha/include/asm/local.h index 6ad3ea696421..6ad3ea696421 100644 --- a/include/asm-alpha/local.h +++ b/arch/alpha/include/asm/local.h | |||
diff --git a/include/asm-alpha/machvec.h b/arch/alpha/include/asm/machvec.h index a86c083cdf7f..a86c083cdf7f 100644 --- a/include/asm-alpha/machvec.h +++ b/arch/alpha/include/asm/machvec.h | |||
diff --git a/include/asm-alpha/mc146818rtc.h b/arch/alpha/include/asm/mc146818rtc.h index 097703f1c8cb..097703f1c8cb 100644 --- a/include/asm-alpha/mc146818rtc.h +++ b/arch/alpha/include/asm/mc146818rtc.h | |||
diff --git a/include/asm-alpha/md.h b/arch/alpha/include/asm/md.h index 6c9b8222a4f2..6c9b8222a4f2 100644 --- a/include/asm-alpha/md.h +++ b/arch/alpha/include/asm/md.h | |||
diff --git a/include/asm-alpha/mman.h b/arch/alpha/include/asm/mman.h index 90d7c35d2867..90d7c35d2867 100644 --- a/include/asm-alpha/mman.h +++ b/arch/alpha/include/asm/mman.h | |||
diff --git a/include/asm-alpha/mmu.h b/arch/alpha/include/asm/mmu.h index 3dc127779329..3dc127779329 100644 --- a/include/asm-alpha/mmu.h +++ b/arch/alpha/include/asm/mmu.h | |||
diff --git a/include/asm-alpha/mmu_context.h b/arch/alpha/include/asm/mmu_context.h index 86c08a02d239..86c08a02d239 100644 --- a/include/asm-alpha/mmu_context.h +++ b/arch/alpha/include/asm/mmu_context.h | |||
diff --git a/include/asm-alpha/mmzone.h b/arch/alpha/include/asm/mmzone.h index 8af56ce346ad..8af56ce346ad 100644 --- a/include/asm-alpha/mmzone.h +++ b/arch/alpha/include/asm/mmzone.h | |||
diff --git a/include/asm-alpha/module.h b/arch/alpha/include/asm/module.h index 7b63743c534a..7b63743c534a 100644 --- a/include/asm-alpha/module.h +++ b/arch/alpha/include/asm/module.h | |||
diff --git a/include/asm-alpha/msgbuf.h b/arch/alpha/include/asm/msgbuf.h index 98496501a2bb..98496501a2bb 100644 --- a/include/asm-alpha/msgbuf.h +++ b/arch/alpha/include/asm/msgbuf.h | |||
diff --git a/include/asm-alpha/mutex.h b/arch/alpha/include/asm/mutex.h index 458c1f7fbc18..458c1f7fbc18 100644 --- a/include/asm-alpha/mutex.h +++ b/arch/alpha/include/asm/mutex.h | |||
diff --git a/include/asm-alpha/page.h b/arch/alpha/include/asm/page.h index 0995f9d13417..0995f9d13417 100644 --- a/include/asm-alpha/page.h +++ b/arch/alpha/include/asm/page.h | |||
diff --git a/include/asm-alpha/pal.h b/arch/alpha/include/asm/pal.h index 9b4ba0d6f00b..9b4ba0d6f00b 100644 --- a/include/asm-alpha/pal.h +++ b/arch/alpha/include/asm/pal.h | |||
diff --git a/include/asm-alpha/param.h b/arch/alpha/include/asm/param.h index e691ecfedb2c..e691ecfedb2c 100644 --- a/include/asm-alpha/param.h +++ b/arch/alpha/include/asm/param.h | |||
diff --git a/include/asm-alpha/parport.h b/arch/alpha/include/asm/parport.h index c5ee7cbb2fcd..c5ee7cbb2fcd 100644 --- a/include/asm-alpha/parport.h +++ b/arch/alpha/include/asm/parport.h | |||
diff --git a/include/asm-alpha/pci.h b/arch/alpha/include/asm/pci.h index 2a14302c17a3..2a14302c17a3 100644 --- a/include/asm-alpha/pci.h +++ b/arch/alpha/include/asm/pci.h | |||
diff --git a/include/asm-alpha/percpu.h b/arch/alpha/include/asm/percpu.h index 3495e8e00d70..3495e8e00d70 100644 --- a/include/asm-alpha/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
diff --git a/include/asm-alpha/pgalloc.h b/arch/alpha/include/asm/pgalloc.h index fd090155dccd..fd090155dccd 100644 --- a/include/asm-alpha/pgalloc.h +++ b/arch/alpha/include/asm/pgalloc.h | |||
diff --git a/include/asm-alpha/pgtable.h b/arch/alpha/include/asm/pgtable.h index 3f0c59f6d8aa..3f0c59f6d8aa 100644 --- a/include/asm-alpha/pgtable.h +++ b/arch/alpha/include/asm/pgtable.h | |||
diff --git a/include/asm-alpha/poll.h b/arch/alpha/include/asm/poll.h index c98509d3149e..c98509d3149e 100644 --- a/include/asm-alpha/poll.h +++ b/arch/alpha/include/asm/poll.h | |||
diff --git a/include/asm-alpha/posix_types.h b/arch/alpha/include/asm/posix_types.h index db167413300b..db167413300b 100644 --- a/include/asm-alpha/posix_types.h +++ b/arch/alpha/include/asm/posix_types.h | |||
diff --git a/include/asm-alpha/processor.h b/arch/alpha/include/asm/processor.h index 94afe5859301..94afe5859301 100644 --- a/include/asm-alpha/processor.h +++ b/arch/alpha/include/asm/processor.h | |||
diff --git a/include/asm-alpha/ptrace.h b/arch/alpha/include/asm/ptrace.h index 32c7a5cddd59..32c7a5cddd59 100644 --- a/include/asm-alpha/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h | |||
diff --git a/include/asm-alpha/reg.h b/arch/alpha/include/asm/reg.h index 86ff916fb069..86ff916fb069 100644 --- a/include/asm-alpha/reg.h +++ b/arch/alpha/include/asm/reg.h | |||
diff --git a/include/asm-alpha/regdef.h b/arch/alpha/include/asm/regdef.h index 142df9c4f8b8..142df9c4f8b8 100644 --- a/include/asm-alpha/regdef.h +++ b/arch/alpha/include/asm/regdef.h | |||
diff --git a/include/asm-alpha/resource.h b/arch/alpha/include/asm/resource.h index c10874ff5973..c10874ff5973 100644 --- a/include/asm-alpha/resource.h +++ b/arch/alpha/include/asm/resource.h | |||
diff --git a/include/asm-alpha/rtc.h b/arch/alpha/include/asm/rtc.h index 4e854b1333eb..4e854b1333eb 100644 --- a/include/asm-alpha/rtc.h +++ b/arch/alpha/include/asm/rtc.h | |||
diff --git a/include/asm-alpha/rwsem.h b/arch/alpha/include/asm/rwsem.h index 1570c0b54336..1570c0b54336 100644 --- a/include/asm-alpha/rwsem.h +++ b/arch/alpha/include/asm/rwsem.h | |||
diff --git a/include/asm-alpha/scatterlist.h b/arch/alpha/include/asm/scatterlist.h index 440747ca6349..440747ca6349 100644 --- a/include/asm-alpha/scatterlist.h +++ b/arch/alpha/include/asm/scatterlist.h | |||
diff --git a/include/asm-alpha/sections.h b/arch/alpha/include/asm/sections.h index 43b40edd6e44..43b40edd6e44 100644 --- a/include/asm-alpha/sections.h +++ b/arch/alpha/include/asm/sections.h | |||
diff --git a/include/asm-alpha/segment.h b/arch/alpha/include/asm/segment.h index 0453d97daae7..0453d97daae7 100644 --- a/include/asm-alpha/segment.h +++ b/arch/alpha/include/asm/segment.h | |||
diff --git a/include/asm-alpha/sembuf.h b/arch/alpha/include/asm/sembuf.h index 7b38b1534784..7b38b1534784 100644 --- a/include/asm-alpha/sembuf.h +++ b/arch/alpha/include/asm/sembuf.h | |||
diff --git a/include/asm-alpha/serial.h b/arch/alpha/include/asm/serial.h index 9d263e8d8ccc..9d263e8d8ccc 100644 --- a/include/asm-alpha/serial.h +++ b/arch/alpha/include/asm/serial.h | |||
diff --git a/include/asm-alpha/setup.h b/arch/alpha/include/asm/setup.h index 2e023a4aa317..2e023a4aa317 100644 --- a/include/asm-alpha/setup.h +++ b/arch/alpha/include/asm/setup.h | |||
diff --git a/include/asm-alpha/sfp-machine.h b/arch/alpha/include/asm/sfp-machine.h index 5fe63afbd474..5fe63afbd474 100644 --- a/include/asm-alpha/sfp-machine.h +++ b/arch/alpha/include/asm/sfp-machine.h | |||
diff --git a/include/asm-alpha/shmbuf.h b/arch/alpha/include/asm/shmbuf.h index 37ee84f05085..37ee84f05085 100644 --- a/include/asm-alpha/shmbuf.h +++ b/arch/alpha/include/asm/shmbuf.h | |||
diff --git a/include/asm-alpha/shmparam.h b/arch/alpha/include/asm/shmparam.h index cc901d58aebb..cc901d58aebb 100644 --- a/include/asm-alpha/shmparam.h +++ b/arch/alpha/include/asm/shmparam.h | |||
diff --git a/include/asm-alpha/sigcontext.h b/arch/alpha/include/asm/sigcontext.h index 323cdb026198..323cdb026198 100644 --- a/include/asm-alpha/sigcontext.h +++ b/arch/alpha/include/asm/sigcontext.h | |||
diff --git a/include/asm-alpha/siginfo.h b/arch/alpha/include/asm/siginfo.h index 9822362a8424..9822362a8424 100644 --- a/include/asm-alpha/siginfo.h +++ b/arch/alpha/include/asm/siginfo.h | |||
diff --git a/include/asm-alpha/signal.h b/arch/alpha/include/asm/signal.h index 13c2305d35ef..13c2305d35ef 100644 --- a/include/asm-alpha/signal.h +++ b/arch/alpha/include/asm/signal.h | |||
diff --git a/include/asm-alpha/smp.h b/arch/alpha/include/asm/smp.h index 544c69af8168..544c69af8168 100644 --- a/include/asm-alpha/smp.h +++ b/arch/alpha/include/asm/smp.h | |||
diff --git a/include/asm-alpha/socket.h b/arch/alpha/include/asm/socket.h index a1057c2d95e7..a1057c2d95e7 100644 --- a/include/asm-alpha/socket.h +++ b/arch/alpha/include/asm/socket.h | |||
diff --git a/include/asm-alpha/sockios.h b/arch/alpha/include/asm/sockios.h index 7932c7ab4a4d..7932c7ab4a4d 100644 --- a/include/asm-alpha/sockios.h +++ b/arch/alpha/include/asm/sockios.h | |||
diff --git a/include/asm-alpha/spinlock.h b/arch/alpha/include/asm/spinlock.h index aeeb125f6851..aeeb125f6851 100644 --- a/include/asm-alpha/spinlock.h +++ b/arch/alpha/include/asm/spinlock.h | |||
diff --git a/include/asm-alpha/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h index 8141eb5ebf0d..8141eb5ebf0d 100644 --- a/include/asm-alpha/spinlock_types.h +++ b/arch/alpha/include/asm/spinlock_types.h | |||
diff --git a/include/asm-alpha/stat.h b/arch/alpha/include/asm/stat.h index 07ad3e6b3f3e..07ad3e6b3f3e 100644 --- a/include/asm-alpha/stat.h +++ b/arch/alpha/include/asm/stat.h | |||
diff --git a/include/asm-alpha/statfs.h b/arch/alpha/include/asm/statfs.h index ad15830baefe..ad15830baefe 100644 --- a/include/asm-alpha/statfs.h +++ b/arch/alpha/include/asm/statfs.h | |||
diff --git a/include/asm-alpha/string.h b/arch/alpha/include/asm/string.h index b02b8a282940..b02b8a282940 100644 --- a/include/asm-alpha/string.h +++ b/arch/alpha/include/asm/string.h | |||
diff --git a/include/asm-alpha/suspend.h b/arch/alpha/include/asm/suspend.h index c7042d575851..c7042d575851 100644 --- a/include/asm-alpha/suspend.h +++ b/arch/alpha/include/asm/suspend.h | |||
diff --git a/include/asm-alpha/sysinfo.h b/arch/alpha/include/asm/sysinfo.h index 086aba284df2..086aba284df2 100644 --- a/include/asm-alpha/sysinfo.h +++ b/arch/alpha/include/asm/sysinfo.h | |||
diff --git a/include/asm-alpha/system.h b/arch/alpha/include/asm/system.h index afe20fa58c99..afe20fa58c99 100644 --- a/include/asm-alpha/system.h +++ b/arch/alpha/include/asm/system.h | |||
diff --git a/include/asm-alpha/termbits.h b/arch/alpha/include/asm/termbits.h index ad854a4a3af6..ad854a4a3af6 100644 --- a/include/asm-alpha/termbits.h +++ b/arch/alpha/include/asm/termbits.h | |||
diff --git a/include/asm-alpha/termios.h b/arch/alpha/include/asm/termios.h index fa13716a11c3..fa13716a11c3 100644 --- a/include/asm-alpha/termios.h +++ b/arch/alpha/include/asm/termios.h | |||
diff --git a/include/asm-alpha/thread_info.h b/arch/alpha/include/asm/thread_info.h index 15fda4344424..15fda4344424 100644 --- a/include/asm-alpha/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
diff --git a/include/asm-alpha/timex.h b/arch/alpha/include/asm/timex.h index afa0c45e3e98..afa0c45e3e98 100644 --- a/include/asm-alpha/timex.h +++ b/arch/alpha/include/asm/timex.h | |||
diff --git a/include/asm-alpha/tlb.h b/arch/alpha/include/asm/tlb.h index c13636575fba..c13636575fba 100644 --- a/include/asm-alpha/tlb.h +++ b/arch/alpha/include/asm/tlb.h | |||
diff --git a/include/asm-alpha/tlbflush.h b/arch/alpha/include/asm/tlbflush.h index 9d87aaa08c0d..9d87aaa08c0d 100644 --- a/include/asm-alpha/tlbflush.h +++ b/arch/alpha/include/asm/tlbflush.h | |||
diff --git a/include/asm-alpha/topology.h b/arch/alpha/include/asm/topology.h index 149532e162c4..149532e162c4 100644 --- a/include/asm-alpha/topology.h +++ b/arch/alpha/include/asm/topology.h | |||
diff --git a/include/asm-alpha/types.h b/arch/alpha/include/asm/types.h index c1541353ccef..c1541353ccef 100644 --- a/include/asm-alpha/types.h +++ b/arch/alpha/include/asm/types.h | |||
diff --git a/include/asm-alpha/uaccess.h b/arch/alpha/include/asm/uaccess.h index 22de3b434a22..22de3b434a22 100644 --- a/include/asm-alpha/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h | |||
diff --git a/include/asm-alpha/ucontext.h b/arch/alpha/include/asm/ucontext.h index 47578ab42152..47578ab42152 100644 --- a/include/asm-alpha/ucontext.h +++ b/arch/alpha/include/asm/ucontext.h | |||
diff --git a/include/asm-alpha/unaligned.h b/arch/alpha/include/asm/unaligned.h index 3787c60aed3f..3787c60aed3f 100644 --- a/include/asm-alpha/unaligned.h +++ b/arch/alpha/include/asm/unaligned.h | |||
diff --git a/include/asm-alpha/unistd.h b/arch/alpha/include/asm/unistd.h index 5b5c17485942..5b5c17485942 100644 --- a/include/asm-alpha/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
diff --git a/include/asm-alpha/user.h b/arch/alpha/include/asm/user.h index a4eb6a4ca8d1..a4eb6a4ca8d1 100644 --- a/include/asm-alpha/user.h +++ b/arch/alpha/include/asm/user.h | |||
diff --git a/include/asm-alpha/vga.h b/arch/alpha/include/asm/vga.h index c00106bac521..c00106bac521 100644 --- a/include/asm-alpha/vga.h +++ b/arch/alpha/include/asm/vga.h | |||
diff --git a/include/asm-alpha/xor.h b/arch/alpha/include/asm/xor.h index 5ee1c2bc0499..5ee1c2bc0499 100644 --- a/include/asm-alpha/xor.h +++ b/arch/alpha/include/asm/xor.h | |||
diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore index b15f927a5926..ab204db594d3 100644 --- a/arch/arm/boot/compressed/.gitignore +++ b/arch/arm/boot/compressed/.gitignore | |||
| @@ -1,2 +1,3 @@ | |||
| 1 | piggy.gz | ||
| 2 | font.c | 1 | font.c |
| 2 | piggy.gz | ||
| 3 | vmlinux.lds | ||
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 69130f365904..aecc6c3f908f 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
| @@ -246,9 +246,9 @@ map_single(struct device *dev, void *ptr, size_t size, | |||
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | dev_dbg(dev, | 248 | dev_dbg(dev, |
| 249 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 249 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 250 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 250 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 251 | buf->safe, (void *) buf->safe_dma_addr); | 251 | buf->safe, buf->safe_dma_addr); |
| 252 | 252 | ||
| 253 | if ((dir == DMA_TO_DEVICE) || | 253 | if ((dir == DMA_TO_DEVICE) || |
| 254 | (dir == DMA_BIDIRECTIONAL)) { | 254 | (dir == DMA_BIDIRECTIONAL)) { |
| @@ -292,9 +292,9 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 292 | BUG_ON(buf->size != size); | 292 | BUG_ON(buf->size != size); |
| 293 | 293 | ||
| 294 | dev_dbg(dev, | 294 | dev_dbg(dev, |
| 295 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 295 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 296 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 296 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 297 | buf->safe, (void *) buf->safe_dma_addr); | 297 | buf->safe, buf->safe_dma_addr); |
| 298 | 298 | ||
| 299 | DO_STATS ( device_info->bounce_count++ ); | 299 | DO_STATS ( device_info->bounce_count++ ); |
| 300 | 300 | ||
| @@ -321,9 +321,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 321 | } | 321 | } |
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | static inline void | 324 | static int sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, |
| 325 | sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | 325 | enum dma_data_direction dir) |
| 326 | enum dma_data_direction dir) | ||
| 327 | { | 326 | { |
| 328 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; | 327 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; |
| 329 | struct safe_buffer *buf = NULL; | 328 | struct safe_buffer *buf = NULL; |
| @@ -355,9 +354,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 355 | */ | 354 | */ |
| 356 | 355 | ||
| 357 | dev_dbg(dev, | 356 | dev_dbg(dev, |
| 358 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 357 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 359 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 358 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 360 | buf->safe, (void *) buf->safe_dma_addr); | 359 | buf->safe, buf->safe_dma_addr); |
| 361 | 360 | ||
| 362 | DO_STATS ( device_info->bounce_count++ ); | 361 | DO_STATS ( device_info->bounce_count++ ); |
| 363 | 362 | ||
| @@ -383,8 +382,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 383 | * No need to sync the safe buffer - it was allocated | 382 | * No need to sync the safe buffer - it was allocated |
| 384 | * via the coherent allocators. | 383 | * via the coherent allocators. |
| 385 | */ | 384 | */ |
| 385 | return 0; | ||
| 386 | } else { | 386 | } else { |
| 387 | dma_cache_maint(dma_to_virt(dev, dma_addr), size, dir); | 387 | return 1; |
| 388 | } | 388 | } |
| 389 | } | 389 | } |
| 390 | 390 | ||
| @@ -474,25 +474,29 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 474 | } | 474 | } |
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | void | 477 | void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_addr, |
| 478 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size, | 478 | unsigned long offset, size_t size, |
| 479 | enum dma_data_direction dir) | 479 | enum dma_data_direction dir) |
| 480 | { | 480 | { |
| 481 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 481 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
| 482 | __func__, (void *) dma_addr, size, dir); | 482 | __func__, dma_addr, offset, size, dir); |
| 483 | 483 | ||
| 484 | sync_single(dev, dma_addr, size, dir); | 484 | if (sync_single(dev, dma_addr, offset + size, dir)) |
| 485 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
| 485 | } | 486 | } |
| 487 | EXPORT_SYMBOL(dma_sync_single_range_for_cpu); | ||
| 486 | 488 | ||
| 487 | void | 489 | void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_addr, |
| 488 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size, | 490 | unsigned long offset, size_t size, |
| 489 | enum dma_data_direction dir) | 491 | enum dma_data_direction dir) |
| 490 | { | 492 | { |
| 491 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 493 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
| 492 | __func__, (void *) dma_addr, size, dir); | 494 | __func__, dma_addr, offset, size, dir); |
| 493 | 495 | ||
| 494 | sync_single(dev, dma_addr, size, dir); | 496 | if (sync_single(dev, dma_addr, offset + size, dir)) |
| 497 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
| 495 | } | 498 | } |
| 499 | EXPORT_SYMBOL(dma_sync_single_range_for_device); | ||
| 496 | 500 | ||
| 497 | void | 501 | void |
| 498 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, | 502 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, |
| @@ -644,8 +648,6 @@ EXPORT_SYMBOL(dma_map_single); | |||
| 644 | EXPORT_SYMBOL(dma_unmap_single); | 648 | EXPORT_SYMBOL(dma_unmap_single); |
| 645 | EXPORT_SYMBOL(dma_map_sg); | 649 | EXPORT_SYMBOL(dma_map_sg); |
| 646 | EXPORT_SYMBOL(dma_unmap_sg); | 650 | EXPORT_SYMBOL(dma_unmap_sg); |
| 647 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | ||
| 648 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
| 649 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); | 651 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); |
| 650 | EXPORT_SYMBOL(dma_sync_sg_for_device); | 652 | EXPORT_SYMBOL(dma_sync_sg_for_device); |
| 651 | EXPORT_SYMBOL(dmabounce_register_dev); | 653 | EXPORT_SYMBOL(dmabounce_register_dev); |
diff --git a/arch/arm/configs/orion5x_defconfig b/arch/arm/configs/orion5x_defconfig index 9578b5d9f9c7..1464ffe71717 100644 --- a/arch/arm/configs/orion5x_defconfig +++ b/arch/arm/configs/orion5x_defconfig | |||
| @@ -757,7 +757,14 @@ CONFIG_INPUT_EVDEV=y | |||
| 757 | # | 757 | # |
| 758 | # Input Device Drivers | 758 | # Input Device Drivers |
| 759 | # | 759 | # |
| 760 | # CONFIG_INPUT_KEYBOARD is not set | 760 | CONFIG_INPUT_KEYBOARD=y |
| 761 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 762 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 763 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 764 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 765 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 766 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 767 | CONFIG_KEYBOARD_GPIO=y | ||
| 761 | # CONFIG_INPUT_MOUSE is not set | 768 | # CONFIG_INPUT_MOUSE is not set |
| 762 | # CONFIG_INPUT_JOYSTICK is not set | 769 | # CONFIG_INPUT_JOYSTICK is not set |
| 763 | # CONFIG_INPUT_TABLET is not set | 770 | # CONFIG_INPUT_TABLET is not set |
| @@ -1111,11 +1118,11 @@ CONFIG_RTC_DRV_DS1307=y | |||
| 1111 | CONFIG_RTC_DRV_RS5C372=y | 1118 | CONFIG_RTC_DRV_RS5C372=y |
| 1112 | # CONFIG_RTC_DRV_ISL1208 is not set | 1119 | # CONFIG_RTC_DRV_ISL1208 is not set |
| 1113 | # CONFIG_RTC_DRV_X1205 is not set | 1120 | # CONFIG_RTC_DRV_X1205 is not set |
| 1114 | # CONFIG_RTC_DRV_PCF8563 is not set | 1121 | CONFIG_RTC_DRV_PCF8563=y |
| 1115 | # CONFIG_RTC_DRV_PCF8583 is not set | 1122 | # CONFIG_RTC_DRV_PCF8583 is not set |
| 1116 | CONFIG_RTC_DRV_M41T80=y | 1123 | CONFIG_RTC_DRV_M41T80=y |
| 1117 | # CONFIG_RTC_DRV_M41T80_WDT is not set | 1124 | # CONFIG_RTC_DRV_M41T80_WDT is not set |
| 1118 | # CONFIG_RTC_DRV_S35390A is not set | 1125 | CONFIG_RTC_DRV_S35390A=y |
| 1119 | 1126 | ||
| 1120 | # | 1127 | # |
| 1121 | # SPI RTC drivers | 1128 | # SPI RTC drivers |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 45329fca1b64..7b95d2058395 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -3,11 +3,48 @@ | |||
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 5 | 5 | ||
| 6 | #include <linux/mm.h> /* need struct page */ | 6 | #include <linux/mm_types.h> |
| 7 | |||
| 8 | #include <linux/scatterlist.h> | 7 | #include <linux/scatterlist.h> |
| 9 | 8 | ||
| 10 | #include <asm-generic/dma-coherent.h> | 9 | #include <asm-generic/dma-coherent.h> |
| 10 | #include <asm/memory.h> | ||
| 11 | |||
| 12 | /* | ||
| 13 | * page_to_dma/dma_to_virt/virt_to_dma are architecture private functions | ||
| 14 | * used internally by the DMA-mapping API to provide DMA addresses. They | ||
| 15 | * must not be used by drivers. | ||
| 16 | */ | ||
| 17 | #ifndef __arch_page_to_dma | ||
| 18 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
| 19 | { | ||
| 20 | return (dma_addr_t)__virt_to_bus((unsigned long)page_address(page)); | ||
| 21 | } | ||
| 22 | |||
| 23 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
| 24 | { | ||
| 25 | return (void *)__bus_to_virt(addr); | ||
| 26 | } | ||
| 27 | |||
| 28 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
| 29 | { | ||
| 30 | return (dma_addr_t)__virt_to_bus((unsigned long)(addr)); | ||
| 31 | } | ||
| 32 | #else | ||
| 33 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
| 34 | { | ||
| 35 | return __arch_page_to_dma(dev, page); | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
| 39 | { | ||
| 40 | return __arch_dma_to_virt(dev, addr); | ||
| 41 | } | ||
| 42 | |||
| 43 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
| 44 | { | ||
| 45 | return __arch_virt_to_dma(dev, addr); | ||
| 46 | } | ||
| 47 | #endif | ||
| 11 | 48 | ||
| 12 | /* | 49 | /* |
| 13 | * DMA-consistent mapping functions. These allocate/free a region of | 50 | * DMA-consistent mapping functions. These allocate/free a region of |
| @@ -169,7 +206,7 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size, | |||
| 169 | if (!arch_is_coherent()) | 206 | if (!arch_is_coherent()) |
| 170 | dma_cache_maint(cpu_addr, size, dir); | 207 | dma_cache_maint(cpu_addr, size, dir); |
| 171 | 208 | ||
| 172 | return virt_to_dma(dev, (unsigned long)cpu_addr); | 209 | return virt_to_dma(dev, cpu_addr); |
| 173 | } | 210 | } |
| 174 | #else | 211 | #else |
| 175 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); | 212 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); |
| @@ -195,7 +232,7 @@ dma_map_page(struct device *dev, struct page *page, | |||
| 195 | unsigned long offset, size_t size, | 232 | unsigned long offset, size_t size, |
| 196 | enum dma_data_direction dir) | 233 | enum dma_data_direction dir) |
| 197 | { | 234 | { |
| 198 | return dma_map_single(dev, page_address(page) + offset, size, (int)dir); | 235 | return dma_map_single(dev, page_address(page) + offset, size, dir); |
| 199 | } | 236 | } |
| 200 | 237 | ||
| 201 | /** | 238 | /** |
| @@ -241,7 +278,7 @@ static inline void | |||
| 241 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, | 278 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, |
| 242 | enum dma_data_direction dir) | 279 | enum dma_data_direction dir) |
| 243 | { | 280 | { |
| 244 | dma_unmap_single(dev, handle, size, (int)dir); | 281 | dma_unmap_single(dev, handle, size, dir); |
| 245 | } | 282 | } |
| 246 | 283 | ||
| 247 | /** | 284 | /** |
| @@ -314,11 +351,12 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
| 314 | 351 | ||
| 315 | 352 | ||
| 316 | /** | 353 | /** |
| 317 | * dma_sync_single_for_cpu | 354 | * dma_sync_single_range_for_cpu |
| 318 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 355 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
| 319 | * @handle: DMA address of buffer | 356 | * @handle: DMA address of buffer |
| 320 | * @size: size of buffer to map | 357 | * @offset: offset of region to start sync |
| 321 | * @dir: DMA transfer direction | 358 | * @size: size of region to sync |
| 359 | * @dir: DMA transfer direction (same as passed to dma_map_single) | ||
| 322 | * | 360 | * |
| 323 | * Make physical memory consistent for a single streaming mode DMA | 361 | * Make physical memory consistent for a single streaming mode DMA |
| 324 | * translation after a transfer. | 362 | * translation after a transfer. |
| @@ -332,25 +370,41 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
| 332 | */ | 370 | */ |
| 333 | #ifndef CONFIG_DMABOUNCE | 371 | #ifndef CONFIG_DMABOUNCE |
| 334 | static inline void | 372 | static inline void |
| 335 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | 373 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t handle, |
| 336 | enum dma_data_direction dir) | 374 | unsigned long offset, size_t size, |
| 375 | enum dma_data_direction dir) | ||
| 337 | { | 376 | { |
| 338 | if (!arch_is_coherent()) | 377 | if (!arch_is_coherent()) |
| 339 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 378 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
| 340 | } | 379 | } |
| 341 | 380 | ||
| 342 | static inline void | 381 | static inline void |
| 343 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | 382 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t handle, |
| 344 | enum dma_data_direction dir) | 383 | unsigned long offset, size_t size, |
| 384 | enum dma_data_direction dir) | ||
| 345 | { | 385 | { |
| 346 | if (!arch_is_coherent()) | 386 | if (!arch_is_coherent()) |
| 347 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 387 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
| 348 | } | 388 | } |
| 349 | #else | 389 | #else |
| 350 | extern void dma_sync_single_for_cpu(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 390 | extern void dma_sync_single_range_for_cpu(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
| 351 | extern void dma_sync_single_for_device(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 391 | extern void dma_sync_single_range_for_device(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
| 352 | #endif | 392 | #endif |
| 353 | 393 | ||
| 394 | static inline void | ||
| 395 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | ||
| 396 | enum dma_data_direction dir) | ||
| 397 | { | ||
| 398 | dma_sync_single_range_for_cpu(dev, handle, 0, size, dir); | ||
| 399 | } | ||
| 400 | |||
| 401 | static inline void | ||
| 402 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | ||
| 403 | enum dma_data_direction dir) | ||
| 404 | { | ||
| 405 | dma_sync_single_range_for_device(dev, handle, 0, size, dir); | ||
| 406 | } | ||
| 407 | |||
| 354 | 408 | ||
| 355 | /** | 409 | /** |
| 356 | * dma_sync_sg_for_cpu | 410 | * dma_sync_sg_for_cpu |
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index c8986bb99ed5..df15a0dc228e 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | /* Maximum address we can use for the control code buffer */ | 10 | /* Maximum address we can use for the control code buffer */ |
| 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) | 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) |
| 12 | 12 | ||
| 13 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 13 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 14 | 14 | ||
| 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM | 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM |
| 16 | 16 | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 1e070a2b561a..bf7c737c9226 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -150,6 +150,14 @@ | |||
| 150 | #endif | 150 | #endif |
| 151 | 151 | ||
| 152 | /* | 152 | /* |
| 153 | * Amount of memory reserved for the vmalloc() area, and minimum | ||
| 154 | * address for vmalloc mappings. | ||
| 155 | */ | ||
| 156 | extern unsigned long vmalloc_reserve; | ||
| 157 | |||
| 158 | #define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve) | ||
| 159 | |||
| 160 | /* | ||
| 153 | * PFNs are used to describe any physical page; this means | 161 | * PFNs are used to describe any physical page; this means |
| 154 | * PFN 0 == physical address 0. | 162 | * PFN 0 == physical address 0. |
| 155 | * | 163 | * |
| @@ -306,20 +314,6 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
| 306 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 314 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
| 307 | 315 | ||
| 308 | /* | 316 | /* |
| 309 | * Optional device DMA address remapping. Do _not_ use directly! | ||
| 310 | * We should really eliminate virt_to_bus() here - it's deprecated. | ||
| 311 | */ | ||
| 312 | #ifndef __arch_page_to_dma | ||
| 313 | #define page_to_dma(dev, page) ((dma_addr_t)__virt_to_bus((unsigned long)page_address(page))) | ||
| 314 | #define dma_to_virt(dev, addr) ((void *)__bus_to_virt(addr)) | ||
| 315 | #define virt_to_dma(dev, addr) ((dma_addr_t)__virt_to_bus((unsigned long)(addr))) | ||
| 316 | #else | ||
| 317 | #define page_to_dma(dev, page) (__arch_page_to_dma(dev, page)) | ||
| 318 | #define dma_to_virt(dev, addr) (__arch_dma_to_virt(dev, addr)) | ||
| 319 | #define virt_to_dma(dev, addr) (__arch_virt_to_dma(dev, addr)) | ||
| 320 | #endif | ||
| 321 | |||
| 322 | /* | ||
| 323 | * Optional coherency support. Currently used only by selected | 317 | * Optional coherency support. Currently used only by selected |
| 324 | * Intel XSC3-based systems. | 318 | * Intel XSC3-based systems. |
| 325 | */ | 319 | */ |
diff --git a/arch/arm/include/asm/mtd-xip.h b/arch/arm/include/asm/mtd-xip.h index 4225372a26f3..d8fbe2d9b8b9 100644 --- a/arch/arm/include/asm/mtd-xip.h +++ b/arch/arm/include/asm/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARM_MTD_XIP_H__ | 15 | #ifndef __ARM_MTD_XIP_H__ |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index b01d5e7e3d5a..517a4d6ffc74 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -112,9 +112,9 @@ extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | |||
| 112 | static inline void prefetch(const void *ptr) | 112 | static inline void prefetch(const void *ptr) |
| 113 | { | 113 | { |
| 114 | __asm__ __volatile__( | 114 | __asm__ __volatile__( |
| 115 | "pld\t%0" | 115 | "pld\t%a0" |
| 116 | : | 116 | : |
| 117 | : "o" (*(char *)ptr) | 117 | : "p" (ptr) |
| 118 | : "cc"); | 118 | : "cc"); |
| 119 | } | 119 | } |
| 120 | 120 | ||
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 0d0d40f1b599..b543a054a17e 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction | 54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction |
| 55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) | 55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) |
| 56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction | 56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction |
| 57 | * v7wbi - identical to v6wbi | ||
| 57 | */ | 58 | */ |
| 58 | #undef _TLB | 59 | #undef _TLB |
| 59 | #undef MULTI_TLB | 60 | #undef MULTI_TLB |
| @@ -266,14 +267,16 @@ extern struct cpu_tlb_fns cpu_tlb; | |||
| 266 | v4wbi_possible_flags | \ | 267 | v4wbi_possible_flags | \ |
| 267 | fr_possible_flags | \ | 268 | fr_possible_flags | \ |
| 268 | v4wb_possible_flags | \ | 269 | v4wb_possible_flags | \ |
| 269 | v6wbi_possible_flags) | 270 | v6wbi_possible_flags | \ |
| 271 | v7wbi_possible_flags) | ||
| 270 | 272 | ||
| 271 | #define always_tlb_flags (v3_always_flags & \ | 273 | #define always_tlb_flags (v3_always_flags & \ |
| 272 | v4_always_flags & \ | 274 | v4_always_flags & \ |
| 273 | v4wbi_always_flags & \ | 275 | v4wbi_always_flags & \ |
| 274 | fr_always_flags & \ | 276 | fr_always_flags & \ |
| 275 | v4wb_always_flags & \ | 277 | v4wb_always_flags & \ |
| 276 | v6wbi_always_flags) | 278 | v6wbi_always_flags & \ |
| 279 | v7wbi_always_flags) | ||
| 277 | 280 | ||
| 278 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) | 281 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) |
| 279 | 282 | ||
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index f95fbb2fcb5f..010618487cf1 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -381,6 +381,12 @@ | |||
| 381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) | 381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) |
| 382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) | 382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) |
| 383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) | 383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) |
| 384 | #define __NR_signalfd4 (__NR_SYSCALL_BASE+355) | ||
| 385 | #define __NR_eventfd2 (__NR_SYSCALL_BASE+356) | ||
| 386 | #define __NR_epoll_create1 (__NR_SYSCALL_BASE+357) | ||
| 387 | #define __NR_dup3 (__NR_SYSCALL_BASE+358) | ||
| 388 | #define __NR_pipe2 (__NR_SYSCALL_BASE+359) | ||
| 389 | #define __NR_inotify_init1 (__NR_SYSCALL_BASE+360) | ||
| 384 | 390 | ||
| 385 | /* | 391 | /* |
| 386 | * The following SWIs are ARM private. | 392 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/.gitignore b/arch/arm/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/arm/kernel/.gitignore | |||
| @@ -0,0 +1 @@ | |||
| vmlinux.lds | |||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 30a67a5a40a8..09a061cb7838 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -262,10 +262,10 @@ | |||
| 262 | /* 250 */ CALL(sys_epoll_create) | 262 | /* 250 */ CALL(sys_epoll_create) |
| 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) | 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) |
| 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) | 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) |
| 265 | CALL(sys_remap_file_pages) | 265 | CALL(sys_remap_file_pages) |
| 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ | 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ |
| 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ | 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ |
| 268 | CALL(sys_set_tid_address) | 268 | CALL(sys_set_tid_address) |
| 269 | CALL(sys_timer_create) | 269 | CALL(sys_timer_create) |
| 270 | CALL(sys_timer_settime) | 270 | CALL(sys_timer_settime) |
| 271 | CALL(sys_timer_gettime) | 271 | CALL(sys_timer_gettime) |
| @@ -364,6 +364,12 @@ | |||
| 364 | CALL(sys_fallocate) | 364 | CALL(sys_fallocate) |
| 365 | CALL(sys_timerfd_settime) | 365 | CALL(sys_timerfd_settime) |
| 366 | CALL(sys_timerfd_gettime) | 366 | CALL(sys_timerfd_gettime) |
| 367 | /* 355 */ CALL(sys_signalfd4) | ||
| 368 | CALL(sys_eventfd2) | ||
| 369 | CALL(sys_epoll_create1) | ||
| 370 | CALL(sys_dup3) | ||
| 371 | CALL(sys_pipe2) | ||
| 372 | /* 360 */ CALL(sys_inotify_init1) | ||
| 367 | #ifndef syscalls_counted | 373 | #ifndef syscalls_counted |
| 368 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 374 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
| 369 | #define syscalls_counted | 375 | #define syscalls_counted |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index db8f54a3451f..fae5beb3c3d6 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
| @@ -71,7 +71,7 @@ void machine_kexec(struct kimage *image) | |||
| 71 | 71 | ||
| 72 | 72 | ||
| 73 | flush_icache_range((unsigned long) reboot_code_buffer, | 73 | flush_icache_range((unsigned long) reboot_code_buffer, |
| 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
| 75 | printk(KERN_INFO "Bye!\n"); | 75 | printk(KERN_INFO "Bye!\n"); |
| 76 | 76 | ||
| 77 | cpu_proc_fin(); | 77 | cpu_proc_fin(); |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 38f0e7940a13..2ca7038b67a7 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -81,6 +81,8 @@ EXPORT_SYMBOL(system_serial_high); | |||
| 81 | unsigned int elf_hwcap; | 81 | unsigned int elf_hwcap; |
| 82 | EXPORT_SYMBOL(elf_hwcap); | 82 | EXPORT_SYMBOL(elf_hwcap); |
| 83 | 83 | ||
| 84 | unsigned long __initdata vmalloc_reserve = 128 << 20; | ||
| 85 | |||
| 84 | 86 | ||
| 85 | #ifdef MULTI_CPU | 87 | #ifdef MULTI_CPU |
| 86 | struct processor processor; | 88 | struct processor processor; |
| @@ -501,6 +503,17 @@ static void __init early_mem(char **p) | |||
| 501 | __early_param("mem=", early_mem); | 503 | __early_param("mem=", early_mem); |
| 502 | 504 | ||
| 503 | /* | 505 | /* |
| 506 | * vmalloc=size forces the vmalloc area to be exactly 'size' | ||
| 507 | * bytes. This can be used to increase (or decrease) the vmalloc | ||
| 508 | * area - the default is 128m. | ||
| 509 | */ | ||
| 510 | static void __init early_vmalloc(char **arg) | ||
| 511 | { | ||
| 512 | vmalloc_reserve = memparse(*arg, arg); | ||
| 513 | } | ||
| 514 | __early_param("vmalloc=", early_vmalloc); | ||
| 515 | |||
| 516 | /* | ||
| 504 | * Initial parsing of the command line. | 517 | * Initial parsing of the command line. |
| 505 | */ | 518 | */ |
| 506 | static void __init parse_cmdline(char **cmdline_p, char *from) | 519 | static void __init parse_cmdline(char **cmdline_p, char *from) |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 7277aef83098..872f1f8fbb57 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -288,14 +288,28 @@ void unregister_undef_hook(struct undef_hook *hook) | |||
| 288 | spin_unlock_irqrestore(&undef_lock, flags); | 288 | spin_unlock_irqrestore(&undef_lock, flags); |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static int call_undef_hook(struct pt_regs *regs, unsigned int instr) | ||
| 292 | { | ||
| 293 | struct undef_hook *hook; | ||
| 294 | unsigned long flags; | ||
| 295 | int (*fn)(struct pt_regs *regs, unsigned int instr) = NULL; | ||
| 296 | |||
| 297 | spin_lock_irqsave(&undef_lock, flags); | ||
| 298 | list_for_each_entry(hook, &undef_hook, node) | ||
| 299 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
| 300 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) | ||
| 301 | fn = hook->fn; | ||
| 302 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 303 | |||
| 304 | return fn ? fn(regs, instr) : 1; | ||
| 305 | } | ||
| 306 | |||
| 291 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | 307 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |
| 292 | { | 308 | { |
| 293 | unsigned int correction = thumb_mode(regs) ? 2 : 4; | 309 | unsigned int correction = thumb_mode(regs) ? 2 : 4; |
| 294 | unsigned int instr; | 310 | unsigned int instr; |
| 295 | struct undef_hook *hook; | ||
| 296 | siginfo_t info; | 311 | siginfo_t info; |
| 297 | void __user *pc; | 312 | void __user *pc; |
| 298 | unsigned long flags; | ||
| 299 | 313 | ||
| 300 | /* | 314 | /* |
| 301 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, | 315 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, |
| @@ -325,17 +339,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
| 325 | } | 339 | } |
| 326 | #endif | 340 | #endif |
| 327 | 341 | ||
| 328 | spin_lock_irqsave(&undef_lock, flags); | 342 | if (call_undef_hook(regs, instr) == 0) |
| 329 | list_for_each_entry(hook, &undef_hook, node) { | 343 | return; |
| 330 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
| 331 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { | ||
| 332 | if (hook->fn(regs, instr) == 0) { | ||
| 333 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 334 | return; | ||
| 335 | } | ||
| 336 | } | ||
| 337 | } | ||
| 338 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 339 | 344 | ||
| 340 | #ifdef CONFIG_DEBUG_USER | 345 | #ifdef CONFIG_DEBUG_USER |
| 341 | if (user_debug & UDBG_UNDEFINED) { | 346 | if (user_debug & UDBG_UNDEFINED) { |
diff --git a/arch/arm/mach-footbridge/cats-pci.c b/arch/arm/mach-footbridge/cats-pci.c index 35eb232a649a..ae3e1c8c7583 100644 --- a/arch/arm/mach-footbridge/cats-pci.c +++ b/arch/arm/mach-footbridge/cats-pci.c | |||
| @@ -18,6 +18,9 @@ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; | |||
| 18 | 18 | ||
| 19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
| 20 | { | 20 | { |
| 21 | if (dev->irq >= 255) | ||
| 22 | return -1; /* not a valid interrupt. */ | ||
| 23 | |||
| 21 | if (dev->irq >= 128) | 24 | if (dev->irq >= 128) |
| 22 | return dev->irq & 0x1f; | 25 | return dev->irq & 0x1f; |
| 23 | 26 | ||
diff --git a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c index ce5ea7c26675..7c49d55e6b27 100644 --- a/arch/arm/mach-integrator/cpu.c +++ b/arch/arm/mach-integrator/cpu.c | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. |
| 5 | * | 5 | * |
| 6 | * $Id: cpu.c,v 1.6 2002/07/18 13:58:51 rmk Exp $ | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-integrator/include/mach/platform.h b/arch/arm/mach-integrator/include/mach/platform.h index 83c4c1ceb411..028b87839c0f 100644 --- a/arch/arm/mach-integrator/include/mach/platform.h +++ b/arch/arm/mach-integrator/include/mach/platform.h | |||
| @@ -26,8 +26,6 @@ | |||
| 26 | * NOTE: This is a multi-hosted header file for use with uHAL and | 26 | * NOTE: This is a multi-hosted header file for use with uHAL and |
| 27 | * supported debuggers. | 27 | * supported debuggers. |
| 28 | * | 28 | * |
| 29 | * $Id: platform.s,v 1.32 2000/02/18 10:51:39 asims Exp $ | ||
| 30 | * | ||
| 31 | * ***********************************************************************/ | 29 | * ***********************************************************************/ |
| 32 | 30 | ||
| 33 | #ifndef __address_h | 31 | #ifndef __address_h |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 0e509b8ad56e..189f16f3619d 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -15,15 +15,17 @@ | |||
| 15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
| 16 | #include <linux/mv643xx_eth.h> | 16 | #include <linux/mv643xx_eth.h> |
| 17 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
| 18 | #include <linux/spi/orion_spi.h> | ||
| 18 | #include <asm/page.h> | 19 | #include <asm/page.h> |
| 19 | #include <asm/timex.h> | 20 | #include <asm/timex.h> |
| 20 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
| 21 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
| 22 | #include <mach/kirkwood.h> | 23 | #include <mach/kirkwood.h> |
| 23 | #include <asm/plat-orion/cache-feroceon-l2.h> | 24 | #include <plat/cache-feroceon-l2.h> |
| 24 | #include <asm/plat-orion/ehci-orion.h> | 25 | #include <plat/ehci-orion.h> |
| 25 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/mv_xor.h> |
| 26 | #include <asm/plat-orion/time.h> | 27 | #include <plat/orion_nand.h> |
| 28 | #include <plat/time.h> | ||
| 27 | #include "common.h" | 29 | #include "common.h" |
| 28 | 30 | ||
| 29 | /***************************************************************************** | 31 | /***************************************************************************** |
| @@ -196,6 +198,37 @@ void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) | |||
| 196 | 198 | ||
| 197 | 199 | ||
| 198 | /***************************************************************************** | 200 | /***************************************************************************** |
| 201 | * SPI | ||
| 202 | ****************************************************************************/ | ||
| 203 | static struct orion_spi_info kirkwood_spi_plat_data = { | ||
| 204 | .tclk = KIRKWOOD_TCLK, | ||
| 205 | }; | ||
| 206 | |||
| 207 | static struct resource kirkwood_spi_resources[] = { | ||
| 208 | { | ||
| 209 | .start = SPI_PHYS_BASE, | ||
| 210 | .end = SPI_PHYS_BASE + SZ_512 - 1, | ||
| 211 | .flags = IORESOURCE_MEM, | ||
| 212 | }, | ||
| 213 | }; | ||
| 214 | |||
| 215 | static struct platform_device kirkwood_spi = { | ||
| 216 | .name = "orion_spi", | ||
| 217 | .id = 0, | ||
| 218 | .resource = kirkwood_spi_resources, | ||
| 219 | .dev = { | ||
| 220 | .platform_data = &kirkwood_spi_plat_data, | ||
| 221 | }, | ||
| 222 | .num_resources = ARRAY_SIZE(kirkwood_spi_resources), | ||
| 223 | }; | ||
| 224 | |||
| 225 | void __init kirkwood_spi_init() | ||
| 226 | { | ||
| 227 | platform_device_register(&kirkwood_spi); | ||
| 228 | } | ||
| 229 | |||
| 230 | |||
| 231 | /***************************************************************************** | ||
| 199 | * UART0 | 232 | * UART0 |
| 200 | ****************************************************************************/ | 233 | ****************************************************************************/ |
| 201 | static struct plat_serial8250_port kirkwood_uart0_data[] = { | 234 | static struct plat_serial8250_port kirkwood_uart0_data[] = { |
| @@ -284,6 +317,212 @@ void __init kirkwood_uart1_init(void) | |||
| 284 | 317 | ||
| 285 | 318 | ||
| 286 | /***************************************************************************** | 319 | /***************************************************************************** |
| 320 | * XOR | ||
| 321 | ****************************************************************************/ | ||
| 322 | static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = { | ||
| 323 | .dram = &kirkwood_mbus_dram_info, | ||
| 324 | }; | ||
| 325 | |||
| 326 | static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK; | ||
| 327 | |||
| 328 | |||
| 329 | /***************************************************************************** | ||
| 330 | * XOR0 | ||
| 331 | ****************************************************************************/ | ||
| 332 | static struct resource kirkwood_xor0_shared_resources[] = { | ||
| 333 | { | ||
| 334 | .name = "xor 0 low", | ||
| 335 | .start = XOR0_PHYS_BASE, | ||
| 336 | .end = XOR0_PHYS_BASE + 0xff, | ||
| 337 | .flags = IORESOURCE_MEM, | ||
| 338 | }, { | ||
| 339 | .name = "xor 0 high", | ||
| 340 | .start = XOR0_HIGH_PHYS_BASE, | ||
| 341 | .end = XOR0_HIGH_PHYS_BASE + 0xff, | ||
| 342 | .flags = IORESOURCE_MEM, | ||
| 343 | }, | ||
| 344 | }; | ||
| 345 | |||
| 346 | static struct platform_device kirkwood_xor0_shared = { | ||
| 347 | .name = MV_XOR_SHARED_NAME, | ||
| 348 | .id = 0, | ||
| 349 | .dev = { | ||
| 350 | .platform_data = &kirkwood_xor_shared_data, | ||
| 351 | }, | ||
| 352 | .num_resources = ARRAY_SIZE(kirkwood_xor0_shared_resources), | ||
| 353 | .resource = kirkwood_xor0_shared_resources, | ||
| 354 | }; | ||
| 355 | |||
| 356 | static struct resource kirkwood_xor00_resources[] = { | ||
| 357 | [0] = { | ||
| 358 | .start = IRQ_KIRKWOOD_XOR_00, | ||
| 359 | .end = IRQ_KIRKWOOD_XOR_00, | ||
| 360 | .flags = IORESOURCE_IRQ, | ||
| 361 | }, | ||
| 362 | }; | ||
| 363 | |||
| 364 | static struct mv_xor_platform_data kirkwood_xor00_data = { | ||
| 365 | .shared = &kirkwood_xor0_shared, | ||
| 366 | .hw_id = 0, | ||
| 367 | .pool_size = PAGE_SIZE, | ||
| 368 | }; | ||
| 369 | |||
| 370 | static struct platform_device kirkwood_xor00_channel = { | ||
| 371 | .name = MV_XOR_NAME, | ||
| 372 | .id = 0, | ||
| 373 | .num_resources = ARRAY_SIZE(kirkwood_xor00_resources), | ||
| 374 | .resource = kirkwood_xor00_resources, | ||
| 375 | .dev = { | ||
| 376 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 377 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 378 | .platform_data = (void *)&kirkwood_xor00_data, | ||
| 379 | }, | ||
| 380 | }; | ||
| 381 | |||
| 382 | static struct resource kirkwood_xor01_resources[] = { | ||
| 383 | [0] = { | ||
| 384 | .start = IRQ_KIRKWOOD_XOR_01, | ||
| 385 | .end = IRQ_KIRKWOOD_XOR_01, | ||
| 386 | .flags = IORESOURCE_IRQ, | ||
| 387 | }, | ||
| 388 | }; | ||
| 389 | |||
| 390 | static struct mv_xor_platform_data kirkwood_xor01_data = { | ||
| 391 | .shared = &kirkwood_xor0_shared, | ||
| 392 | .hw_id = 1, | ||
| 393 | .pool_size = PAGE_SIZE, | ||
| 394 | }; | ||
| 395 | |||
| 396 | static struct platform_device kirkwood_xor01_channel = { | ||
| 397 | .name = MV_XOR_NAME, | ||
| 398 | .id = 1, | ||
| 399 | .num_resources = ARRAY_SIZE(kirkwood_xor01_resources), | ||
| 400 | .resource = kirkwood_xor01_resources, | ||
| 401 | .dev = { | ||
| 402 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 403 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 404 | .platform_data = (void *)&kirkwood_xor01_data, | ||
| 405 | }, | ||
| 406 | }; | ||
| 407 | |||
| 408 | void __init kirkwood_xor0_init(void) | ||
| 409 | { | ||
| 410 | platform_device_register(&kirkwood_xor0_shared); | ||
| 411 | |||
| 412 | /* | ||
| 413 | * two engines can't do memset simultaneously, this limitation | ||
| 414 | * satisfied by removing memset support from one of the engines. | ||
| 415 | */ | ||
| 416 | dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask); | ||
| 417 | dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask); | ||
| 418 | platform_device_register(&kirkwood_xor00_channel); | ||
| 419 | |||
| 420 | dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask); | ||
| 421 | dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask); | ||
| 422 | dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask); | ||
| 423 | platform_device_register(&kirkwood_xor01_channel); | ||
| 424 | } | ||
| 425 | |||
| 426 | |||
| 427 | /***************************************************************************** | ||
| 428 | * XOR1 | ||
| 429 | ****************************************************************************/ | ||
| 430 | static struct resource kirkwood_xor1_shared_resources[] = { | ||
| 431 | { | ||
| 432 | .name = "xor 1 low", | ||
| 433 | .start = XOR1_PHYS_BASE, | ||
| 434 | .end = XOR1_PHYS_BASE + 0xff, | ||
| 435 | .flags = IORESOURCE_MEM, | ||
| 436 | }, { | ||
| 437 | .name = "xor 1 high", | ||
| 438 | .start = XOR1_HIGH_PHYS_BASE, | ||
| 439 | .end = XOR1_HIGH_PHYS_BASE + 0xff, | ||
| 440 | .flags = IORESOURCE_MEM, | ||
| 441 | }, | ||
| 442 | }; | ||
| 443 | |||
| 444 | static struct platform_device kirkwood_xor1_shared = { | ||
| 445 | .name = MV_XOR_SHARED_NAME, | ||
| 446 | .id = 1, | ||
| 447 | .dev = { | ||
| 448 | .platform_data = &kirkwood_xor_shared_data, | ||
| 449 | }, | ||
| 450 | .num_resources = ARRAY_SIZE(kirkwood_xor1_shared_resources), | ||
| 451 | .resource = kirkwood_xor1_shared_resources, | ||
| 452 | }; | ||
| 453 | |||
| 454 | static struct resource kirkwood_xor10_resources[] = { | ||
| 455 | [0] = { | ||
| 456 | .start = IRQ_KIRKWOOD_XOR_10, | ||
| 457 | .end = IRQ_KIRKWOOD_XOR_10, | ||
| 458 | .flags = IORESOURCE_IRQ, | ||
| 459 | }, | ||
| 460 | }; | ||
| 461 | |||
| 462 | static struct mv_xor_platform_data kirkwood_xor10_data = { | ||
| 463 | .shared = &kirkwood_xor1_shared, | ||
| 464 | .hw_id = 0, | ||
| 465 | .pool_size = PAGE_SIZE, | ||
| 466 | }; | ||
| 467 | |||
| 468 | static struct platform_device kirkwood_xor10_channel = { | ||
| 469 | .name = MV_XOR_NAME, | ||
| 470 | .id = 2, | ||
| 471 | .num_resources = ARRAY_SIZE(kirkwood_xor10_resources), | ||
| 472 | .resource = kirkwood_xor10_resources, | ||
| 473 | .dev = { | ||
| 474 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 475 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 476 | .platform_data = (void *)&kirkwood_xor10_data, | ||
| 477 | }, | ||
| 478 | }; | ||
| 479 | |||
| 480 | static struct resource kirkwood_xor11_resources[] = { | ||
| 481 | [0] = { | ||
| 482 | .start = IRQ_KIRKWOOD_XOR_11, | ||
| 483 | .end = IRQ_KIRKWOOD_XOR_11, | ||
| 484 | .flags = IORESOURCE_IRQ, | ||
| 485 | }, | ||
| 486 | }; | ||
| 487 | |||
| 488 | static struct mv_xor_platform_data kirkwood_xor11_data = { | ||
| 489 | .shared = &kirkwood_xor1_shared, | ||
| 490 | .hw_id = 1, | ||
| 491 | .pool_size = PAGE_SIZE, | ||
| 492 | }; | ||
| 493 | |||
| 494 | static struct platform_device kirkwood_xor11_channel = { | ||
| 495 | .name = MV_XOR_NAME, | ||
| 496 | .id = 3, | ||
| 497 | .num_resources = ARRAY_SIZE(kirkwood_xor11_resources), | ||
| 498 | .resource = kirkwood_xor11_resources, | ||
| 499 | .dev = { | ||
| 500 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 501 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 502 | .platform_data = (void *)&kirkwood_xor11_data, | ||
| 503 | }, | ||
| 504 | }; | ||
| 505 | |||
| 506 | void __init kirkwood_xor1_init(void) | ||
| 507 | { | ||
| 508 | platform_device_register(&kirkwood_xor1_shared); | ||
| 509 | |||
| 510 | /* | ||
| 511 | * two engines can't do memset simultaneously, this limitation | ||
| 512 | * satisfied by removing memset support from one of the engines. | ||
| 513 | */ | ||
| 514 | dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask); | ||
| 515 | dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask); | ||
| 516 | platform_device_register(&kirkwood_xor10_channel); | ||
| 517 | |||
| 518 | dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask); | ||
| 519 | dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask); | ||
| 520 | dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask); | ||
| 521 | platform_device_register(&kirkwood_xor11_channel); | ||
| 522 | } | ||
| 523 | |||
| 524 | |||
| 525 | /***************************************************************************** | ||
| 287 | * Time handling | 526 | * Time handling |
| 288 | ****************************************************************************/ | 527 | ****************************************************************************/ |
| 289 | static void kirkwood_timer_init(void) | 528 | static void kirkwood_timer_init(void) |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 5dee2f6b40a5..69cd113af03a 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
| @@ -33,8 +33,11 @@ void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data); | |||
| 33 | void kirkwood_pcie_init(void); | 33 | void kirkwood_pcie_init(void); |
| 34 | void kirkwood_rtc_init(void); | 34 | void kirkwood_rtc_init(void); |
| 35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); | 35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); |
| 36 | void kirkwood_spi_init(void); | ||
| 36 | void kirkwood_uart0_init(void); | 37 | void kirkwood_uart0_init(void); |
| 37 | void kirkwood_uart1_init(void); | 38 | void kirkwood_uart1_init(void); |
| 39 | void kirkwood_xor0_init(void); | ||
| 40 | void kirkwood_xor1_init(void); | ||
| 38 | 41 | ||
| 39 | extern struct sys_timer kirkwood_timer; | 42 | extern struct sys_timer kirkwood_timer; |
| 40 | 43 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index d1336b41f0fb..5c69992295e8 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h | |||
| @@ -88,6 +88,15 @@ | |||
| 88 | 88 | ||
| 89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) | 89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) |
| 90 | 90 | ||
| 91 | #define XOR0_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60800) | ||
| 92 | #define XOR0_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60800) | ||
| 93 | #define XOR1_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60900) | ||
| 94 | #define XOR1_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60900) | ||
| 95 | #define XOR0_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60A00) | ||
| 96 | #define XOR0_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60A00) | ||
| 97 | #define XOR1_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60B00) | ||
| 98 | #define XOR1_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60B00) | ||
| 99 | |||
| 91 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) | 100 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) |
| 92 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) | 101 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) |
| 93 | 102 | ||
diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c index 302bb2cf6669..5790643ffe07 100644 --- a/arch/arm/mach-kirkwood/irq.c +++ b/arch/arm/mach-kirkwood/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init kirkwood_init_irq(void) | 18 | void __init kirkwood_init_irq(void) |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index 8282d0ff84bf..2195fa31f6b7 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | 18 | ||
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index 182230a5d198..a3012d445971 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c | |||
| @@ -18,6 +18,9 @@ | |||
| 18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
| 19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
| 20 | #include <linux/mv643xx_eth.h> | 20 | #include <linux/mv643xx_eth.h> |
| 21 | #include <linux/spi/flash.h> | ||
| 22 | #include <linux/spi/spi.h> | ||
| 23 | #include <linux/spi/orion_spi.h> | ||
| 21 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 22 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 23 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| @@ -34,6 +37,21 @@ static struct mv_sata_platform_data rd88f6192_sata_data = { | |||
| 34 | .n_ports = 2, | 37 | .n_ports = 2, |
| 35 | }; | 38 | }; |
| 36 | 39 | ||
| 40 | static const struct flash_platform_data rd88F6192_spi_slave_data = { | ||
| 41 | .type = "m25p128", | ||
| 42 | }; | ||
| 43 | |||
| 44 | static struct spi_board_info __initdata rd88F6192_spi_slave_info[] = { | ||
| 45 | { | ||
| 46 | .modalias = "m25p80", | ||
| 47 | .platform_data = &rd88F6192_spi_slave_data, | ||
| 48 | .irq = -1, | ||
| 49 | .max_speed_hz = 20000000, | ||
| 50 | .bus_num = 0, | ||
| 51 | .chip_select = 0, | ||
| 52 | }, | ||
| 53 | }; | ||
| 54 | |||
| 37 | static void __init rd88f6192_init(void) | 55 | static void __init rd88f6192_init(void) |
| 38 | { | 56 | { |
| 39 | /* | 57 | /* |
| @@ -45,7 +63,12 @@ static void __init rd88f6192_init(void) | |||
| 45 | kirkwood_ge00_init(&rd88f6192_ge00_data); | 63 | kirkwood_ge00_init(&rd88f6192_ge00_data); |
| 46 | kirkwood_rtc_init(); | 64 | kirkwood_rtc_init(); |
| 47 | kirkwood_sata_init(&rd88f6192_sata_data); | 65 | kirkwood_sata_init(&rd88f6192_sata_data); |
| 66 | spi_register_board_info(rd88F6192_spi_slave_info, | ||
| 67 | ARRAY_SIZE(rd88F6192_spi_slave_info)); | ||
| 68 | kirkwood_spi_init(); | ||
| 48 | kirkwood_uart0_init(); | 69 | kirkwood_uart0_init(); |
| 70 | kirkwood_xor0_init(); | ||
| 71 | kirkwood_xor1_init(); | ||
| 49 | } | 72 | } |
| 50 | 73 | ||
| 51 | static int __init rd88f6192_pci_init(void) | 74 | static int __init rd88f6192_pci_init(void) |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index d8a43018c7d3..d96487a0f18b 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
| 24 | #include <asm/mach/pci.h> | 24 | #include <asm/mach/pci.h> |
| 25 | #include <mach/kirkwood.h> | 25 | #include <mach/kirkwood.h> |
| 26 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/orion_nand.h> |
| 27 | #include "common.h" | 27 | #include "common.h" |
| 28 | 28 | ||
| 29 | static struct mtd_partition rd88f6281_nand_parts[] = { | 29 | static struct mtd_partition rd88f6281_nand_parts[] = { |
diff --git a/arch/arm/mach-lh7a40x/include/mach/ssp.h b/arch/arm/mach-lh7a40x/include/mach/ssp.h index 132b1c4d5ce6..509916182e34 100644 --- a/arch/arm/mach-lh7a40x/include/mach/ssp.h +++ b/arch/arm/mach-lh7a40x/include/mach/ssp.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* ssp.h | 1 | /* ssp.h |
| 2 | $Id$ | ||
| 3 | 2 | ||
| 4 | written by Marc Singer | 3 | written by Marc Singer |
| 5 | 6 Dec 2004 | 4 | 6 Dec 2004 |
diff --git a/arch/arm/mach-lh7a40x/lcd-panel.h b/arch/arm/mach-lh7a40x/lcd-panel.h index df6e38ed425b..a7f5027b2f78 100644 --- a/arch/arm/mach-lh7a40x/lcd-panel.h +++ b/arch/arm/mach-lh7a40x/lcd-panel.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* lcd-panel.h | 1 | /* lcd-panel.h |
| 2 | $Id$ | ||
| 3 | 2 | ||
| 4 | written by Marc Singer | 3 | written by Marc Singer |
| 5 | 18 Jul 2005 | 4 | 18 Jul 2005 |
diff --git a/arch/arm/mach-loki/common.c b/arch/arm/mach-loki/common.c index e20cdbca1ebe..c0d2d9d12e74 100644 --- a/arch/arm/mach-loki/common.c +++ b/arch/arm/mach-loki/common.c | |||
| @@ -19,8 +19,8 @@ | |||
| 19 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
| 20 | #include <asm/mach/time.h> | 20 | #include <asm/mach/time.h> |
| 21 | #include <mach/loki.h> | 21 | #include <mach/loki.h> |
| 22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
| 23 | #include <asm/plat-orion/time.h> | 23 | #include <plat/time.h> |
| 24 | #include "common.h" | 24 | #include "common.h" |
| 25 | 25 | ||
| 26 | /***************************************************************************** | 26 | /***************************************************************************** |
diff --git a/arch/arm/mach-loki/irq.c b/arch/arm/mach-loki/irq.c index d839af91fe03..5a487930cb2f 100644 --- a/arch/arm/mach-loki/irq.c +++ b/arch/arm/mach-loki/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init loki_init_irq(void) | 18 | void __init loki_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index e633f9cb239f..953a26c469cb 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
| @@ -18,10 +18,10 @@ | |||
| 18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
| 19 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
| 20 | #include <mach/mv78xx0.h> | 20 | #include <mach/mv78xx0.h> |
| 21 | #include <asm/plat-orion/cache-feroceon-l2.h> | 21 | #include <plat/cache-feroceon-l2.h> |
| 22 | #include <asm/plat-orion/ehci-orion.h> | 22 | #include <plat/ehci-orion.h> |
| 23 | #include <asm/plat-orion/orion_nand.h> | 23 | #include <plat/orion_nand.h> |
| 24 | #include <asm/plat-orion/time.h> | 24 | #include <plat/time.h> |
| 25 | #include "common.h" | 25 | #include "common.h" |
| 26 | 26 | ||
| 27 | 27 | ||
diff --git a/arch/arm/mach-mv78xx0/irq.c b/arch/arm/mach-mv78xx0/irq.c index 3198abf54c90..28248d37b999 100644 --- a/arch/arm/mach-mv78xx0/irq.c +++ b/arch/arm/mach-mv78xx0/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
| 14 | #include <mach/mv78xx0.h> | 14 | #include <mach/mv78xx0.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init mv78xx0_init_irq(void) | 18 | void __init mv78xx0_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index b78e1443159f..430ea84d587d 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | struct pcie_port { | 18 | struct pcie_port { |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 168eeacaa4c0..7b11e552bc5a 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
| @@ -26,9 +26,10 @@ | |||
| 26 | #include <asm/mach/time.h> | 26 | #include <asm/mach/time.h> |
| 27 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
| 28 | #include <mach/orion5x.h> | 28 | #include <mach/orion5x.h> |
| 29 | #include <asm/plat-orion/ehci-orion.h> | 29 | #include <plat/ehci-orion.h> |
| 30 | #include <asm/plat-orion/orion_nand.h> | 30 | #include <plat/mv_xor.h> |
| 31 | #include <asm/plat-orion/time.h> | 31 | #include <plat/orion_nand.h> |
| 32 | #include <plat/time.h> | ||
| 32 | #include "common.h" | 33 | #include "common.h" |
| 33 | 34 | ||
| 34 | /***************************************************************************** | 35 | /***************************************************************************** |
| @@ -355,6 +356,103 @@ void __init orion5x_uart1_init(void) | |||
| 355 | 356 | ||
| 356 | 357 | ||
| 357 | /***************************************************************************** | 358 | /***************************************************************************** |
| 359 | * XOR engine | ||
| 360 | ****************************************************************************/ | ||
| 361 | static struct resource orion5x_xor_shared_resources[] = { | ||
| 362 | { | ||
| 363 | .name = "xor low", | ||
| 364 | .start = ORION5X_XOR_PHYS_BASE, | ||
| 365 | .end = ORION5X_XOR_PHYS_BASE + 0xff, | ||
| 366 | .flags = IORESOURCE_MEM, | ||
| 367 | }, { | ||
| 368 | .name = "xor high", | ||
| 369 | .start = ORION5X_XOR_PHYS_BASE + 0x200, | ||
| 370 | .end = ORION5X_XOR_PHYS_BASE + 0x2ff, | ||
| 371 | .flags = IORESOURCE_MEM, | ||
| 372 | }, | ||
| 373 | }; | ||
| 374 | |||
| 375 | static struct platform_device orion5x_xor_shared = { | ||
| 376 | .name = MV_XOR_SHARED_NAME, | ||
| 377 | .id = 0, | ||
| 378 | .num_resources = ARRAY_SIZE(orion5x_xor_shared_resources), | ||
| 379 | .resource = orion5x_xor_shared_resources, | ||
| 380 | }; | ||
| 381 | |||
| 382 | static u64 orion5x_xor_dmamask = DMA_32BIT_MASK; | ||
| 383 | |||
| 384 | static struct resource orion5x_xor0_resources[] = { | ||
| 385 | [0] = { | ||
| 386 | .start = IRQ_ORION5X_XOR0, | ||
| 387 | .end = IRQ_ORION5X_XOR0, | ||
| 388 | .flags = IORESOURCE_IRQ, | ||
| 389 | }, | ||
| 390 | }; | ||
| 391 | |||
| 392 | static struct mv_xor_platform_data orion5x_xor0_data = { | ||
| 393 | .shared = &orion5x_xor_shared, | ||
| 394 | .hw_id = 0, | ||
| 395 | .pool_size = PAGE_SIZE, | ||
| 396 | }; | ||
| 397 | |||
| 398 | static struct platform_device orion5x_xor0_channel = { | ||
| 399 | .name = MV_XOR_NAME, | ||
| 400 | .id = 0, | ||
| 401 | .num_resources = ARRAY_SIZE(orion5x_xor0_resources), | ||
| 402 | .resource = orion5x_xor0_resources, | ||
| 403 | .dev = { | ||
| 404 | .dma_mask = &orion5x_xor_dmamask, | ||
| 405 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 406 | .platform_data = (void *)&orion5x_xor0_data, | ||
| 407 | }, | ||
| 408 | }; | ||
| 409 | |||
| 410 | static struct resource orion5x_xor1_resources[] = { | ||
| 411 | [0] = { | ||
| 412 | .start = IRQ_ORION5X_XOR1, | ||
| 413 | .end = IRQ_ORION5X_XOR1, | ||
| 414 | .flags = IORESOURCE_IRQ, | ||
| 415 | }, | ||
| 416 | }; | ||
| 417 | |||
| 418 | static struct mv_xor_platform_data orion5x_xor1_data = { | ||
| 419 | .shared = &orion5x_xor_shared, | ||
| 420 | .hw_id = 1, | ||
| 421 | .pool_size = PAGE_SIZE, | ||
| 422 | }; | ||
| 423 | |||
| 424 | static struct platform_device orion5x_xor1_channel = { | ||
| 425 | .name = MV_XOR_NAME, | ||
| 426 | .id = 1, | ||
| 427 | .num_resources = ARRAY_SIZE(orion5x_xor1_resources), | ||
| 428 | .resource = orion5x_xor1_resources, | ||
| 429 | .dev = { | ||
| 430 | .dma_mask = &orion5x_xor_dmamask, | ||
| 431 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 432 | .platform_data = (void *)&orion5x_xor1_data, | ||
| 433 | }, | ||
| 434 | }; | ||
| 435 | |||
| 436 | void __init orion5x_xor_init(void) | ||
| 437 | { | ||
| 438 | platform_device_register(&orion5x_xor_shared); | ||
| 439 | |||
| 440 | /* | ||
| 441 | * two engines can't do memset simultaneously, this limitation | ||
| 442 | * satisfied by removing memset support from one of the engines. | ||
| 443 | */ | ||
| 444 | dma_cap_set(DMA_MEMCPY, orion5x_xor0_data.cap_mask); | ||
| 445 | dma_cap_set(DMA_XOR, orion5x_xor0_data.cap_mask); | ||
| 446 | platform_device_register(&orion5x_xor0_channel); | ||
| 447 | |||
| 448 | dma_cap_set(DMA_MEMCPY, orion5x_xor1_data.cap_mask); | ||
| 449 | dma_cap_set(DMA_MEMSET, orion5x_xor1_data.cap_mask); | ||
| 450 | dma_cap_set(DMA_XOR, orion5x_xor1_data.cap_mask); | ||
| 451 | platform_device_register(&orion5x_xor1_channel); | ||
| 452 | } | ||
| 453 | |||
| 454 | |||
| 455 | /***************************************************************************** | ||
| 358 | * Time handling | 456 | * Time handling |
| 359 | ****************************************************************************/ | 457 | ****************************************************************************/ |
| 360 | static void orion5x_timer_init(void) | 458 | static void orion5x_timer_init(void) |
| @@ -382,6 +480,8 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
| 382 | *dev_name = "MV88F5281-D2"; | 480 | *dev_name = "MV88F5281-D2"; |
| 383 | } else if (*rev == MV88F5281_REV_D1) { | 481 | } else if (*rev == MV88F5281_REV_D1) { |
| 384 | *dev_name = "MV88F5281-D1"; | 482 | *dev_name = "MV88F5281-D1"; |
| 483 | } else if (*rev == MV88F5281_REV_D0) { | ||
| 484 | *dev_name = "MV88F5281-D0"; | ||
| 385 | } else { | 485 | } else { |
| 386 | *dev_name = "MV88F5281-Rev-Unsupported"; | 486 | *dev_name = "MV88F5281-Rev-Unsupported"; |
| 387 | } | 487 | } |
| @@ -416,6 +516,15 @@ void __init orion5x_init(void) | |||
| 416 | * Setup Orion address map | 516 | * Setup Orion address map |
| 417 | */ | 517 | */ |
| 418 | orion5x_setup_cpu_mbus_bridge(); | 518 | orion5x_setup_cpu_mbus_bridge(); |
| 519 | |||
| 520 | /* | ||
| 521 | * Don't issue "Wait for Interrupt" instruction if we are | ||
| 522 | * running on D0 5281 silicon. | ||
| 523 | */ | ||
| 524 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | ||
| 525 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | ||
| 526 | disable_hlt(); | ||
| 527 | } | ||
| 419 | } | 528 | } |
| 420 | 529 | ||
| 421 | /* | 530 | /* |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index f72cf0e77544..e75bd7004b94 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
| @@ -32,6 +32,7 @@ void orion5x_i2c_init(void); | |||
| 32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); | 32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); |
| 33 | void orion5x_uart0_init(void); | 33 | void orion5x_uart0_init(void); |
| 34 | void orion5x_uart1_init(void); | 34 | void orion5x_uart1_init(void); |
| 35 | void orion5x_xor_init(void); | ||
| 35 | 36 | ||
| 36 | /* | 37 | /* |
| 37 | * PCIe/PCI functions. | 38 | * PCIe/PCI functions. |
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 48ce6d0e0020..ff13e9060b18 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| 27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
| 28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
| 29 | #include "common.h" | 29 | #include "common.h" |
| 30 | #include "mpp.h" | 30 | #include "mpp.h" |
| 31 | 31 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/orion5x.h b/arch/arm/mach-orion5x/include/mach/orion5x.h index f52a7d65bec2..61eb74a88862 100644 --- a/arch/arm/mach-orion5x/include/mach/orion5x.h +++ b/arch/arm/mach-orion5x/include/mach/orion5x.h | |||
| @@ -73,6 +73,7 @@ | |||
| 73 | #define MV88F5182_REV_A2 2 | 73 | #define MV88F5182_REV_A2 2 |
| 74 | /* Orion-2 (88F5281) */ | 74 | /* Orion-2 (88F5281) */ |
| 75 | #define MV88F5281_DEV_ID 0x5281 | 75 | #define MV88F5281_DEV_ID 0x5281 |
| 76 | #define MV88F5281_REV_D0 4 | ||
| 76 | #define MV88F5281_REV_D1 5 | 77 | #define MV88F5281_REV_D1 5 |
| 77 | #define MV88F5281_REV_D2 6 | 78 | #define MV88F5281_REV_D2 6 |
| 78 | 79 | ||
| @@ -105,6 +106,10 @@ | |||
| 105 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) | 106 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) |
| 106 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) | 107 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) |
| 107 | 108 | ||
| 109 | #define ORION5X_XOR_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x60900) | ||
| 110 | #define ORION5X_XOR_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x60900) | ||
| 111 | #define ORION5X_XOR_REG(x) (ORION5X_XOR_VIRT_BASE | (x)) | ||
| 112 | |||
| 108 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) | 113 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) |
| 109 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) | 114 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) |
| 110 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) | 115 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) |
diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index cc2a017fd2a9..2545ff9e5830 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <asm/gpio.h> | 16 | #include <asm/gpio.h> |
| 17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
| 18 | #include <mach/orion5x.h> | 18 | #include <mach/orion5x.h> |
| 19 | #include <asm/plat-orion/irq.h> | 19 | #include <plat/irq.h> |
| 20 | #include "common.h" | 20 | #include "common.h" |
| 21 | 21 | ||
| 22 | /***************************************************************************** | 22 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 0caaaac74bc1..cb72f1bb9cb7 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| 27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
| 28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
| 29 | #include "common.h" | 29 | #include "common.h" |
| 30 | #include "mpp.h" | 30 | #include "mpp.h" |
| 31 | 31 | ||
| @@ -356,6 +356,7 @@ static void __init kurobox_pro_init(void) | |||
| 356 | orion5x_sata_init(&kurobox_pro_sata_data); | 356 | orion5x_sata_init(&kurobox_pro_sata_data); |
| 357 | orion5x_uart0_init(); | 357 | orion5x_uart0_init(); |
| 358 | orion5x_uart1_init(); | 358 | orion5x_uart1_init(); |
| 359 | orion5x_xor_init(); | ||
| 359 | 360 | ||
| 360 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, | 361 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, |
| 361 | KUROBOX_PRO_NOR_BOOT_SIZE); | 362 | KUROBOX_PRO_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c index 4403cc963d66..53ff1893b883 100644 --- a/arch/arm/mach-orion5x/mss2-setup.c +++ b/arch/arm/mach-orion5x/mss2-setup.c | |||
| @@ -239,6 +239,7 @@ static void __init mss2_init(void) | |||
| 239 | orion5x_i2c_init(); | 239 | orion5x_i2c_init(); |
| 240 | orion5x_sata_init(&mss2_sata_data); | 240 | orion5x_sata_init(&mss2_sata_data); |
| 241 | orion5x_uart0_init(); | 241 | orion5x_uart0_init(); |
| 242 | orion5x_xor_init(); | ||
| 242 | 243 | ||
| 243 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); | 244 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); |
| 244 | platform_device_register(&mss2_nor_flash); | 245 | platform_device_register(&mss2_nor_flash); |
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index 67b2c0df615f..978d4d599396 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
| @@ -203,6 +203,7 @@ static void __init mv2120_init(void) | |||
| 203 | orion5x_i2c_init(); | 203 | orion5x_i2c_init(); |
| 204 | orion5x_sata_init(&mv2120_sata_data); | 204 | orion5x_sata_init(&mv2120_sata_data); |
| 205 | orion5x_uart0_init(); | 205 | orion5x_uart0_init(); |
| 206 | orion5x_xor_init(); | ||
| 206 | 207 | ||
| 207 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); | 208 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); |
| 208 | platform_device_register(&mv2120_nor_flash); | 209 | platform_device_register(&mv2120_nor_flash); |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 256a4f680935..fbceecc4b7ec 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
| 15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
| 16 | #include <asm/mach/pci.h> | 16 | #include <asm/mach/pci.h> |
| 17 | #include <asm/plat-orion/pcie.h> | 17 | #include <plat/pcie.h> |
| 18 | #include "common.h" | 18 | #include "common.h" |
| 19 | 19 | ||
| 20 | /***************************************************************************** | 20 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 8771cb76f0dc..4c3bcd76ac85 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
| @@ -292,6 +292,7 @@ static void __init rd88f5182_init(void) | |||
| 292 | orion5x_i2c_init(); | 292 | orion5x_i2c_init(); |
| 293 | orion5x_sata_init(&rd88f5182_sata_data); | 293 | orion5x_sata_init(&rd88f5182_sata_data); |
| 294 | orion5x_uart0_init(); | 294 | orion5x_uart0_init(); |
| 295 | orion5x_xor_init(); | ||
| 295 | 296 | ||
| 296 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, | 297 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, |
| 297 | RD88F5182_NOR_BOOT_SIZE); | 298 | RD88F5182_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 809132de31d2..dd657163cd8d 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
| @@ -207,12 +207,12 @@ static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = { | |||
| 207 | 207 | ||
| 208 | static struct gpio_keys_button qnap_ts209_buttons[] = { | 208 | static struct gpio_keys_button qnap_ts209_buttons[] = { |
| 209 | { | 209 | { |
| 210 | .code = KEY_RESTART, | 210 | .code = KEY_COPY, |
| 211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, | 211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, |
| 212 | .desc = "USB Copy Button", | 212 | .desc = "USB Copy Button", |
| 213 | .active_low = 1, | 213 | .active_low = 1, |
| 214 | }, { | 214 | }, { |
| 215 | .code = KEY_POWER, | 215 | .code = KEY_RESTART, |
| 216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, | 216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, |
| 217 | .desc = "Reset Button", | 217 | .desc = "Reset Button", |
| 218 | .active_low = 1, | 218 | .active_low = 1, |
| @@ -296,6 +296,7 @@ static void __init qnap_ts209_init(void) | |||
| 296 | orion5x_i2c_init(); | 296 | orion5x_i2c_init(); |
| 297 | orion5x_sata_init(&qnap_ts209_sata_data); | 297 | orion5x_sata_init(&qnap_ts209_sata_data); |
| 298 | orion5x_uart0_init(); | 298 | orion5x_uart0_init(); |
| 299 | orion5x_xor_init(); | ||
| 299 | 300 | ||
| 300 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, | 301 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, |
| 301 | QNAP_TS209_NOR_BOOT_SIZE); | 302 | QNAP_TS209_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 6053e76ac967..b27d2b762081 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c | |||
| @@ -3,6 +3,9 @@ | |||
| 3 | * | 3 | * |
| 4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> | 4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2008 Sylver Bruneau <sylver.bruneau@gmail.com> | ||
| 7 | * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com> | ||
| 8 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
| 8 | * as published by the Free Software Foundation; either version | 11 | * as published by the Free Software Foundation; either version |
| @@ -16,6 +19,7 @@ | |||
| 16 | #include <linux/irq.h> | 19 | #include <linux/irq.h> |
| 17 | #include <linux/mtd/physmap.h> | 20 | #include <linux/mtd/physmap.h> |
| 18 | #include <linux/mv643xx_eth.h> | 21 | #include <linux/mv643xx_eth.h> |
| 22 | #include <linux/leds.h> | ||
| 19 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
| 20 | #include <linux/input.h> | 24 | #include <linux/input.h> |
| 21 | #include <linux/i2c.h> | 25 | #include <linux/i2c.h> |
| @@ -162,16 +166,59 @@ static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = { | |||
| 162 | I2C_BOARD_INFO("s35390a", 0x30), | 166 | I2C_BOARD_INFO("s35390a", 0x30), |
| 163 | }; | 167 | }; |
| 164 | 168 | ||
| 169 | /***************************************************************************** | ||
| 170 | * LEDs attached to GPIO | ||
| 171 | ****************************************************************************/ | ||
| 172 | |||
| 173 | static struct gpio_led ts409_led_pins[] = { | ||
| 174 | { | ||
| 175 | .name = "ts409:red:sata1", | ||
| 176 | .gpio = 4, | ||
| 177 | .active_low = 1, | ||
| 178 | }, { | ||
| 179 | .name = "ts409:red:sata2", | ||
| 180 | .gpio = 5, | ||
| 181 | .active_low = 1, | ||
| 182 | }, { | ||
| 183 | .name = "ts409:red:sata3", | ||
| 184 | .gpio = 6, | ||
| 185 | .active_low = 1, | ||
| 186 | }, { | ||
| 187 | .name = "ts409:red:sata4", | ||
| 188 | .gpio = 7, | ||
| 189 | .active_low = 1, | ||
| 190 | }, | ||
| 191 | }; | ||
| 192 | |||
| 193 | static struct gpio_led_platform_data ts409_led_data = { | ||
| 194 | .leds = ts409_led_pins, | ||
| 195 | .num_leds = ARRAY_SIZE(ts409_led_pins), | ||
| 196 | }; | ||
| 197 | |||
| 198 | static struct platform_device ts409_leds = { | ||
| 199 | .name = "leds-gpio", | ||
| 200 | .id = -1, | ||
| 201 | .dev = { | ||
| 202 | .platform_data = &ts409_led_data, | ||
| 203 | }, | ||
| 204 | }; | ||
| 205 | |||
| 165 | /**************************************************************************** | 206 | /**************************************************************************** |
| 166 | * GPIO Attached Keys | 207 | * GPIO Attached Keys |
| 167 | * Power button is attached to the PIC microcontroller | 208 | * Power button is attached to the PIC microcontroller |
| 168 | ****************************************************************************/ | 209 | ****************************************************************************/ |
| 169 | 210 | ||
| 211 | #define QNAP_TS409_GPIO_KEY_RESET 14 | ||
| 170 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 | 212 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 |
| 171 | 213 | ||
| 172 | static struct gpio_keys_button qnap_ts409_buttons[] = { | 214 | static struct gpio_keys_button qnap_ts409_buttons[] = { |
| 173 | { | 215 | { |
| 174 | .code = KEY_RESTART, | 216 | .code = KEY_RESTART, |
| 217 | .gpio = QNAP_TS409_GPIO_KEY_RESET, | ||
| 218 | .desc = "Reset Button", | ||
| 219 | .active_low = 1, | ||
| 220 | }, { | ||
| 221 | .code = KEY_COPY, | ||
| 175 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, | 222 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, |
| 176 | .desc = "USB Copy Button", | 223 | .desc = "USB Copy Button", |
| 177 | .active_low = 1, | 224 | .active_low = 1, |
| @@ -255,6 +302,7 @@ static void __init qnap_ts409_init(void) | |||
| 255 | if (qnap_ts409_i2c_rtc.irq == 0) | 302 | if (qnap_ts409_i2c_rtc.irq == 0) |
| 256 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); | 303 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); |
| 257 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); | 304 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); |
| 305 | platform_device_register(&ts409_leds); | ||
| 258 | 306 | ||
| 259 | /* register tsx09 specific power-off method */ | 307 | /* register tsx09 specific power-off method */ |
| 260 | pm_power_off = qnap_tsx09_power_off; | 308 | pm_power_off = qnap_tsx09_power_off; |
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index 014916a28fdc..ae0a5dccd2a1 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c | |||
| @@ -256,6 +256,7 @@ static void __init ts78xx_init(void) | |||
| 256 | orion5x_sata_init(&ts78xx_sata_data); | 256 | orion5x_sata_init(&ts78xx_sata_data); |
| 257 | orion5x_uart0_init(); | 257 | orion5x_uart0_init(); |
| 258 | orion5x_uart1_init(); | 258 | orion5x_uart1_init(); |
| 259 | orion5x_xor_init(); | ||
| 259 | 260 | ||
| 260 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, | 261 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, |
| 261 | TS78XX_NOR_BOOT_SIZE); | 262 | TS78XX_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-pxa/include/mach/mtd-xip.h b/arch/arm/mach-pxa/include/mach/mtd-xip.h index 351f32f13ce4..4d452fcb1508 100644 --- a/arch/arm/mach-pxa/include/mach/mtd-xip.h +++ b/arch/arm/mach-pxa/include/mach/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARCH_PXA_MTD_XIP_H__ | 15 | #ifndef __ARCH_PXA_MTD_XIP_H__ |
diff --git a/arch/arm/mach-pxa/include/mach/poodle.h b/arch/arm/mach-pxa/include/mach/poodle.h index 8956afe8195e..67debc47e8c6 100644 --- a/arch/arm/mach-pxa/include/mach/poodle.h +++ b/arch/arm/mach-pxa/include/mach/poodle.h | |||
| @@ -70,6 +70,12 @@ | |||
| 70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) | 70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) |
| 71 | #define POODLE_SCOOP_IO_OUT ( 0 ) | 71 | #define POODLE_SCOOP_IO_OUT ( 0 ) |
| 72 | 72 | ||
| 73 | #define POODLE_LOCOMO_GPIO_AMP_ON LOCOMO_GPIO(8) | ||
| 74 | #define POODLE_LOCOMO_GPIO_MUTE_L LOCOMO_GPIO(10) | ||
| 75 | #define POODLE_LOCOMO_GPIO_MUTE_R LOCOMO_GPIO(11) | ||
| 76 | #define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12) | ||
| 77 | #define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13) | ||
| 78 | |||
| 73 | extern struct platform_device poodle_locomo_device; | 79 | extern struct platform_device poodle_locomo_device; |
| 74 | 80 | ||
| 75 | #endif /* __ASM_ARCH_POODLE_H */ | 81 | #endif /* __ASM_ARCH_POODLE_H */ |
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h index 65447549616f..8e591118371e 100644 --- a/arch/arm/mach-pxa/include/mach/pxafb.h +++ b/arch/arm/mach-pxa/include/mach/pxafb.h | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | * bits 10-17 : for AC Bias Pin Frequency | 28 | * bits 10-17 : for AC Bias Pin Frequency |
| 29 | * bit 18 : for output enable polarity | 29 | * bit 18 : for output enable polarity |
| 30 | * bit 19 : for pixel clock edge | 30 | * bit 19 : for pixel clock edge |
| 31 | * bit 20 : for output pixel format when base is RGBT16 | ||
| 31 | */ | 32 | */ |
| 32 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) | 33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) |
| 33 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) | 34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) |
| @@ -53,10 +54,11 @@ | |||
| 53 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) | 54 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) |
| 54 | 55 | ||
| 55 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) | 56 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) |
| 56 | #define LCD_BIAS_ACTIVE_HIGH (0 << 17) | 57 | #define LCD_BIAS_ACTIVE_HIGH (0 << 18) |
| 57 | #define LCD_BIAS_ACTIVE_LOW (1 << 17) | 58 | #define LCD_BIAS_ACTIVE_LOW (1 << 18) |
| 58 | #define LCD_PCLK_EDGE_RISE (0 << 18) | 59 | #define LCD_PCLK_EDGE_RISE (0 << 19) |
| 59 | #define LCD_PCLK_EDGE_FALL (1 << 18) | 60 | #define LCD_PCLK_EDGE_FALL (1 << 19) |
| 61 | #define LCD_ALTERNATE_MAPPING (1 << 20) | ||
| 60 | 62 | ||
| 61 | /* | 63 | /* |
| 62 | * This structure describes the machine which we are running on. | 64 | * This structure describes the machine which we are running on. |
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-clock.h b/arch/arm/mach-s3c2410/include/mach/regs-clock.h index d583688458a4..b3f90aa78076 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-clock.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-clock.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_REGS_CLOCK | 13 | #ifndef __ASM_ARM_REGS_CLOCK |
| 14 | #define __ASM_ARM_REGS_CLOCK "$Id: clock.h,v 1.4 2003/04/30 14:50:51 ben Exp $" | 14 | #define __ASM_ARM_REGS_CLOCK |
| 15 | 15 | ||
| 16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) | 16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) |
| 17 | 17 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h index 30bec027f5fa..528080ceac44 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_GPIO_H | 14 | #ifndef __ASM_ARCH_REGS_GPIO_H |
| 15 | #define __ASM_ARCH_REGS_GPIO_H "$Id: gpio.h,v 1.5 2003/05/19 12:51:08 ben Exp $" | 15 | #define __ASM_ARCH_REGS_GPIO_H |
| 16 | 16 | ||
| 17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) | 17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) |
| 18 | 18 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-irq.h b/arch/arm/mach-s3c2410/include/mach/regs-irq.h index b057c06d167a..de86ee8812bd 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-irq.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-irq.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | #ifndef ___ASM_ARCH_REGS_IRQ_H | 12 | #ifndef ___ASM_ARCH_REGS_IRQ_H |
| 13 | #define ___ASM_ARCH_REGS_IRQ_H "$Id: irq.h,v 1.3 2003/03/25 21:29:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_IRQ_H |
| 14 | 14 | ||
| 15 | /* interrupt controller */ | 15 | /* interrupt controller */ |
| 16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h index 893b8742f954..ee8f040aff5f 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | #ifndef ___ASM_ARCH_REGS_LCD_H | 12 | #ifndef ___ASM_ARCH_REGS_LCD_H |
| 13 | #define ___ASM_ARCH_REGS_LCD_H "$Id: lcd.h,v 1.3 2003/06/26 13:25:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_LCD_H |
| 14 | 14 | ||
| 15 | #define S3C2410_LCDREG(x) (x) | 15 | #define S3C2410_LCDREG(x) (x) |
| 16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-mem.h b/arch/arm/mach-s3c2410/include/mach/regs-mem.h index f9926abd5cde..57759804e2fa 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-mem.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-mem.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_MEMREGS_H | 13 | #ifndef __ASM_ARM_MEMREGS_H |
| 14 | #define __ASM_ARM_MEMREGS_H "$Id: regs.h,v 1.8 2003/05/01 15:55:41 ben Exp $" | 14 | #define __ASM_ARM_MEMREGS_H |
| 15 | 15 | ||
| 16 | #ifndef S3C2410_MEMREG | 16 | #ifndef S3C2410_MEMREG |
| 17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) | 17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index fb1e78e28e50..24c6334fac89 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
| @@ -562,7 +562,7 @@ static struct platform_device *bast_devices[] __initdata = { | |||
| 562 | &bast_sio, | 562 | &bast_sio, |
| 563 | }; | 563 | }; |
| 564 | 564 | ||
| 565 | static struct clk *bast_clocks[] = { | 565 | static struct clk *bast_clocks[] __initdata = { |
| 566 | &s3c24xx_dclk0, | 566 | &s3c24xx_dclk0, |
| 567 | &s3c24xx_dclk1, | 567 | &s3c24xx_dclk1, |
| 568 | &s3c24xx_clkout0, | 568 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index c9040080727e..b88939d72282 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH | 5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH |
| 6 | * All rights reserved. | 6 | * All rights reserved. |
| 7 | * | 7 | * |
| 8 | * $Id: mach-smdk2410.c,v 1.1 2004/05/11 14:15:38 mpietrek Exp $ | ||
| 9 | * @Author: Jonas Dietsche | 8 | * @Author: Jonas Dietsche |
| 10 | * | 9 | * |
| 11 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index 12cbca68f57d..fbc0213d5485 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c | |||
| @@ -344,7 +344,7 @@ static struct platform_device *vr1000_devices[] __initdata = { | |||
| 344 | &vr1000_led3, | 344 | &vr1000_led3, |
| 345 | }; | 345 | }; |
| 346 | 346 | ||
| 347 | static struct clk *vr1000_clocks[] = { | 347 | static struct clk *vr1000_clocks[] __initdata = { |
| 348 | &s3c24xx_dclk0, | 348 | &s3c24xx_dclk0, |
| 349 | &s3c24xx_dclk1, | 349 | &s3c24xx_dclk1, |
| 350 | &s3c24xx_clkout0, | 350 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 30f613a79bfe..4c061d29463c 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c | |||
| @@ -26,9 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/spi/spi.h> | 27 | #include <linux/spi/spi.h> |
| 28 | 28 | ||
| 29 | #include <linux/mtd/mtd.h> | ||
| 30 | #include <linux/mtd/partitions.h> | ||
| 31 | |||
| 32 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
| 33 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
| 34 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 265c77dec9d7..441f4bc09472 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
| @@ -414,7 +414,7 @@ static struct platform_device *anubis_devices[] __initdata = { | |||
| 414 | &anubis_device_sm501, | 414 | &anubis_device_sm501, |
| 415 | }; | 415 | }; |
| 416 | 416 | ||
| 417 | static struct clk *anubis_clocks[] = { | 417 | static struct clk *anubis_clocks[] __initdata = { |
| 418 | &s3c24xx_dclk0, | 418 | &s3c24xx_dclk0, |
| 419 | &s3c24xx_dclk1, | 419 | &s3c24xx_dclk1, |
| 420 | &s3c24xx_clkout0, | 420 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index d2ee0cd148c6..8b83f93b6102 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
| @@ -341,7 +341,7 @@ static struct platform_device *osiris_devices[] __initdata = { | |||
| 341 | &osiris_pcmcia, | 341 | &osiris_pcmcia, |
| 342 | }; | 342 | }; |
| 343 | 343 | ||
| 344 | static struct clk *osiris_clocks[] = { | 344 | static struct clk *osiris_clocks[] __initdata = { |
| 345 | &s3c24xx_dclk0, | 345 | &s3c24xx_dclk0, |
| 346 | &s3c24xx_dclk1, | 346 | &s3c24xx_dclk1, |
| 347 | &s3c24xx_clkout0, | 347 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 39d38c801736..029dbfbbafcf 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001 Russell King | 4 | * Copyright (C) 2001 Russell King |
| 5 | * | 5 | * |
| 6 | * $Id: cpu-sa1110.c,v 1.9 2002/07/06 16:53:18 rmk Exp $ | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-sa1100/include/mach/mtd-xip.h b/arch/arm/mach-sa1100/include/mach/mtd-xip.h index 80cfdac2b944..eaa09e86ad16 100644 --- a/arch/arm/mach-sa1100/include/mach/mtd-xip.h +++ b/arch/arm/mach-sa1100/include/mach/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARCH_SA1100_MTD_XIP_H__ | 15 | #ifndef __ARCH_SA1100_MTD_XIP_H__ |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index 20eec4ba173f..7b5a25d81576 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
| 17 | #include <asm/plat-orion/cache-feroceon-l2.h> | 17 | #include <plat/cache-feroceon-l2.h> |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | /* | 20 | /* |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 2d6d682c206a..25d9a11eb617 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -568,6 +568,55 @@ void __init iotable_init(struct map_desc *io_desc, int nr) | |||
| 568 | create_mapping(io_desc + i); | 568 | create_mapping(io_desc + i); |
| 569 | } | 569 | } |
| 570 | 570 | ||
| 571 | static int __init check_membank_valid(struct membank *mb) | ||
| 572 | { | ||
| 573 | /* | ||
| 574 | * Check whether this memory region has non-zero size. | ||
| 575 | */ | ||
| 576 | if (mb->size == 0) | ||
| 577 | return 0; | ||
| 578 | |||
| 579 | /* | ||
| 580 | * Check whether this memory region would entirely overlap | ||
| 581 | * the vmalloc area. | ||
| 582 | */ | ||
| 583 | if (phys_to_virt(mb->start) >= VMALLOC_MIN) { | ||
| 584 | printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx " | ||
| 585 | "(vmalloc region overlap).\n", | ||
| 586 | mb->start, mb->start + mb->size - 1); | ||
| 587 | return 0; | ||
| 588 | } | ||
| 589 | |||
| 590 | /* | ||
| 591 | * Check whether this memory region would partially overlap | ||
| 592 | * the vmalloc area. | ||
| 593 | */ | ||
| 594 | if (phys_to_virt(mb->start + mb->size) < phys_to_virt(mb->start) || | ||
| 595 | phys_to_virt(mb->start + mb->size) > VMALLOC_MIN) { | ||
| 596 | unsigned long newsize = VMALLOC_MIN - phys_to_virt(mb->start); | ||
| 597 | |||
| 598 | printk(KERN_NOTICE "Truncating RAM at %.8lx-%.8lx " | ||
| 599 | "to -%.8lx (vmalloc region overlap).\n", | ||
| 600 | mb->start, mb->start + mb->size - 1, | ||
| 601 | mb->start + newsize - 1); | ||
| 602 | mb->size = newsize; | ||
| 603 | } | ||
| 604 | |||
| 605 | return 1; | ||
| 606 | } | ||
| 607 | |||
| 608 | static void __init sanity_check_meminfo(struct meminfo *mi) | ||
| 609 | { | ||
| 610 | int i; | ||
| 611 | int j; | ||
| 612 | |||
| 613 | for (i = 0, j = 0; i < mi->nr_banks; i++) { | ||
| 614 | if (check_membank_valid(&mi->bank[i])) | ||
| 615 | mi->bank[j++] = mi->bank[i]; | ||
| 616 | } | ||
| 617 | mi->nr_banks = j; | ||
| 618 | } | ||
| 619 | |||
| 571 | static inline void prepare_page_table(struct meminfo *mi) | 620 | static inline void prepare_page_table(struct meminfo *mi) |
| 572 | { | 621 | { |
| 573 | unsigned long addr; | 622 | unsigned long addr; |
| @@ -753,6 +802,7 @@ void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
| 753 | void *zero_page; | 802 | void *zero_page; |
| 754 | 803 | ||
| 755 | build_mem_type_table(); | 804 | build_mem_type_table(); |
| 805 | sanity_check_meminfo(mi); | ||
| 756 | prepare_page_table(mi); | 806 | prepare_page_table(mi); |
| 757 | bootmem_init(mi); | 807 | bootmem_init(mi); |
| 758 | devicemaps_init(mdesc); | 808 | devicemaps_init(mdesc); |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index 1a3d63df8e90..551244d5ca19 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <asm/pgtable-hwdef.h> | 15 | #include <asm/pgtable-hwdef.h> |
| 16 | #include <asm/pgtable.h> | 16 | #include <asm/pgtable.h> |
| 17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
| 18 | #include "proc-macros.S" | ||
| 18 | 19 | ||
| 19 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ | 20 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ |
| 20 | #define CACHE_DLINESIZE 16 | 21 | #define CACHE_DLINESIZE 16 |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 82d579ac9b98..6168c6160dee 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <asm/pgtable-hwdef.h> | 17 | #include <asm/pgtable-hwdef.h> |
| 18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
| 19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
| 20 | #include "proc-macros.S" | ||
| 20 | 21 | ||
| 21 | /* | 22 | /* |
| 22 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, | 23 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, |
diff --git a/arch/arm/plat-omap/include/mach/memory.h b/arch/arm/plat-omap/include/mach/memory.h index 037486c5f4a4..a325caf80d04 100644 --- a/arch/arm/plat-omap/include/mach/memory.h +++ b/arch/arm/plat-omap/include/mach/memory.h | |||
| @@ -76,13 +76,14 @@ | |||
| 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ | 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ |
| 77 | (dma_addr_t)__virt_to_bus(page_address(page));}) | 77 | (dma_addr_t)__virt_to_bus(page_address(page));}) |
| 78 | 78 | ||
| 79 | #define __arch_dma_to_virt(dev, addr) ({is_lbus_device(dev) ? \ | 79 | #define __arch_dma_to_virt(dev, addr) ({ (void *) (is_lbus_device(dev) ? \ |
| 80 | lbus_to_virt(addr) : \ | 80 | lbus_to_virt(addr) : \ |
| 81 | __bus_to_virt(addr);}) | 81 | __bus_to_virt(addr)); }) |
| 82 | 82 | ||
| 83 | #define __arch_virt_to_dma(dev, addr) ({is_lbus_device(dev) ? \ | 83 | #define __arch_virt_to_dma(dev, addr) ({ unsigned long __addr = (unsigned long)(addr); \ |
| 84 | virt_to_lbus(addr) : \ | 84 | (dma_addr_t) (is_lbus_device(dev) ? \ |
| 85 | __virt_to_bus(addr);}) | 85 | virt_to_lbus(__addr) : \ |
| 86 | __virt_to_bus(__addr)); }) | ||
| 86 | 87 | ||
| 87 | #endif /* CONFIG_ARCH_OMAP15XX */ | 88 | #endif /* CONFIG_ARCH_OMAP15XX */ |
| 88 | 89 | ||
diff --git a/include/asm-arm/plat-orion/cache-feroceon-l2.h b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h index ba4e016d3ec0..06f982d55697 100644 --- a/include/asm-arm/plat-orion/cache-feroceon-l2.h +++ b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/cache-feroceon-l2.h | 2 | * arch/arm/plat-orion/include/plat/cache-feroceon-l2.h |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Marvell Semiconductor | 4 | * Copyright (C) 2008 Marvell Semiconductor |
| 5 | * | 5 | * |
diff --git a/include/asm-arm/plat-orion/ehci-orion.h b/arch/arm/plat-orion/include/plat/ehci-orion.h index 785705651e24..64343051095a 100644 --- a/include/asm-arm/plat-orion/ehci-orion.h +++ b/arch/arm/plat-orion/include/plat/ehci-orion.h | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/ehci-orion.h | 2 | * arch/arm/plat-orion/include/plat/ehci-orion.h |
| 3 | * | 3 | * |
| 4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
| 5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
| 6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #ifndef __ASM_PLAT_ORION_EHCI_ORION_H | 9 | #ifndef __PLAT_EHCI_ORION_H |
| 10 | #define __ASM_PLAT_ORION_EHCI_ORION_H | 10 | #define __PLAT_EHCI_ORION_H |
| 11 | 11 | ||
| 12 | #include <linux/mbus.h> | 12 | #include <linux/mbus.h> |
| 13 | 13 | ||
diff --git a/include/asm-arm/plat-orion/irq.h b/arch/arm/plat-orion/include/plat/irq.h index 94aeed919d5b..f05eeab94968 100644 --- a/include/asm-arm/plat-orion/irq.h +++ b/arch/arm/plat-orion/include/plat/irq.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/irq.h | 2 | * arch/arm/plat-orion/include/plat/irq.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC IRQ handling. | 4 | * Marvell Orion SoC IRQ handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_IRQ_H | 11 | #ifndef __PLAT_IRQ_H |
| 12 | #define __ASM_PLAT_ORION_IRQ_H | 12 | #define __PLAT_IRQ_H |
| 13 | 13 | ||
| 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); | 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); |
| 15 | 15 | ||
diff --git a/include/asm-arm/plat-orion/mv_xor.h b/arch/arm/plat-orion/include/plat/mv_xor.h index c349e8ff5cc0..bd5f3bdb4ae3 100644 --- a/include/asm-arm/plat-orion/mv_xor.h +++ b/arch/arm/plat-orion/include/plat/mv_xor.h | |||
| @@ -1,9 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/arm/plat-orion/include/plat/mv_xor.h | ||
| 3 | * | ||
| 2 | * Marvell XOR platform device data definition file. | 4 | * Marvell XOR platform device data definition file. |
| 3 | */ | 5 | */ |
| 4 | 6 | ||
| 5 | #ifndef __ASM_PLAT_ORION_MV_XOR_H | 7 | #ifndef __PLAT_MV_XOR_H |
| 6 | #define __ASM_PLAT_ORION_MV_XOR_H | 8 | #define __PLAT_MV_XOR_H |
| 7 | 9 | ||
| 8 | #include <linux/dmaengine.h> | 10 | #include <linux/dmaengine.h> |
| 9 | #include <linux/mbus.h> | 11 | #include <linux/mbus.h> |
diff --git a/include/asm-arm/plat-orion/orion_nand.h b/arch/arm/plat-orion/include/plat/orion_nand.h index ad4ce94c1998..d6a4cfa37785 100644 --- a/include/asm-arm/plat-orion/orion_nand.h +++ b/arch/arm/plat-orion/include/plat/orion_nand.h | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/orion_nand.h | 2 | * arch/arm/plat-orion/include/plat/orion_nand.h |
| 3 | * | 3 | * |
| 4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
| 5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
| 6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #ifndef __ASM_PLAT_ORION_ORION_NAND_H | 9 | #ifndef __PLAT_ORION_NAND_H |
| 10 | #define __ASM_PLAT_ORION_ORION_NAND_H | 10 | #define __PLAT_ORION_NAND_H |
| 11 | 11 | ||
| 12 | /* | 12 | /* |
| 13 | * Device bus NAND private data | 13 | * Device bus NAND private data |
diff --git a/include/asm-arm/plat-orion/pcie.h b/arch/arm/plat-orion/include/plat/pcie.h index e61b7bd97af5..3ebfef72b4e7 100644 --- a/include/asm-arm/plat-orion/pcie.h +++ b/arch/arm/plat-orion/include/plat/pcie.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/pcie.h | 2 | * arch/arm/plat-orion/include/plat/pcie.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC PCIe handling. | 4 | * Marvell Orion SoC PCIe handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_PCIE_H | 11 | #ifndef __PLAT_PCIE_H |
| 12 | #define __ASM_PLAT_ORION_PCIE_H | 12 | #define __PLAT_PCIE_H |
| 13 | 13 | ||
| 14 | u32 orion_pcie_dev_id(void __iomem *base); | 14 | u32 orion_pcie_dev_id(void __iomem *base); |
| 15 | u32 orion_pcie_rev(void __iomem *base); | 15 | u32 orion_pcie_rev(void __iomem *base); |
diff --git a/include/asm-arm/plat-orion/time.h b/arch/arm/plat-orion/include/plat/time.h index 0e85cc8f44d9..c06ca35f3613 100644 --- a/include/asm-arm/plat-orion/time.h +++ b/arch/arm/plat-orion/include/plat/time.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/time.h | 2 | * arch/arm/plat-orion/include/plat/time.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC time handling. | 4 | * Marvell Orion SoC time handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_TIME_H | 11 | #ifndef __PLAT_TIME_H |
| 12 | #define __ASM_PLAT_ORION_TIME_H | 12 | #define __PLAT_TIME_H |
| 13 | 13 | ||
| 14 | void orion_time_init(unsigned int irq, unsigned int tclk); | 14 | void orion_time_init(unsigned int irq, unsigned int tclk); |
| 15 | 15 | ||
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c index fe66a1835169..3f9d34fc738c 100644 --- a/arch/arm/plat-orion/irq.c +++ b/arch/arm/plat-orion/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | 16 | ||
| 17 | static void orion_irq_mask(u32 irq) | 17 | static void orion_irq_mask(u32 irq) |
| 18 | { | 18 | { |
diff --git a/arch/arm/plat-orion/pcie.c b/arch/arm/plat-orion/pcie.c index ca32c60e14d7..883902fead89 100644 --- a/arch/arm/plat-orion/pcie.c +++ b/arch/arm/plat-orion/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | * PCIe unit register offsets. | 18 | * PCIe unit register offsets. |
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c index 6d60f0476bb8..89ce60eabd5b 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/plat-s3c24xx/cpu.c | |||
| @@ -169,9 +169,7 @@ static struct map_desc s3c_iodesc[] __initdata = { | |||
| 169 | IODESC_ENT(UART) | 169 | IODESC_ENT(UART) |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | 172 | static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode) | |
| 173 | static struct cpu_table * | ||
| 174 | s3c_lookup_cpu(unsigned long idcode) | ||
| 175 | { | 173 | { |
| 176 | struct cpu_table *tab; | 174 | struct cpu_table *tab; |
| 177 | int count; | 175 | int count; |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 8b8f564c3aa2..56281c030a7b 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | # | 12 | # |
| 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
| 14 | # | 14 | # |
| 15 | # Last update: Sun Jul 13 12:04:05 2008 | 15 | # Last update: Wed Aug 13 21:56:02 2008 |
| 16 | # | 16 | # |
| 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
| 18 | # | 18 | # |
| @@ -843,7 +843,7 @@ borzoi MACH_BORZOI BORZOI 831 | |||
| 843 | gecko MACH_GECKO GECKO 832 | 843 | gecko MACH_GECKO GECKO 832 |
| 844 | ds101 MACH_DS101 DS101 833 | 844 | ds101 MACH_DS101 DS101 833 |
| 845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 | 845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 |
| 846 | xscale_palmld MACH_XSCALE_PALMLD XSCALE_PALMLD 835 | 846 | palmld MACH_PALMLD PALMLD 835 |
| 847 | cc9c MACH_CC9C CC9C 836 | 847 | cc9c MACH_CC9C CC9C 836 |
| 848 | sbc1670 MACH_SBC1670 SBC1670 837 | 848 | sbc1670 MACH_SBC1670 SBC1670 837 |
| 849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 | 849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 |
| @@ -852,7 +852,7 @@ ml696k MACH_ML696K ML696K 840 | |||
| 852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 | 852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 |
| 853 | osiris MACH_OSIRIS OSIRIS 842 | 853 | osiris MACH_OSIRIS OSIRIS 842 |
| 854 | maestro MACH_MAESTRO MAESTRO 843 | 854 | maestro MACH_MAESTRO MAESTRO 843 |
| 855 | tunge2 MACH_TUNGE2 TUNGE2 844 | 855 | palmte2 MACH_PALMTE2 PALMTE2 844 |
| 856 | ixbbm MACH_IXBBM IXBBM 845 | 856 | ixbbm MACH_IXBBM IXBBM 845 |
| 857 | mx27ads MACH_MX27ADS MX27ADS 846 | 857 | mx27ads MACH_MX27ADS MX27ADS 846 |
| 858 | ax8004 MACH_AX8004 AX8004 847 | 858 | ax8004 MACH_AX8004 AX8004 847 |
| @@ -916,7 +916,7 @@ nxdb500 MACH_NXDB500 NXDB500 905 | |||
| 916 | apf9328 MACH_APF9328 APF9328 906 | 916 | apf9328 MACH_APF9328 APF9328 906 |
| 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 | 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 |
| 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 | 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 |
| 919 | palmtreo650 MACH_PALMTREO650 PALMTREO650 909 | 919 | palmt650 MACH_PALMT650 PALMT650 909 |
| 920 | acumen MACH_ACUMEN ACUMEN 910 | 920 | acumen MACH_ACUMEN ACUMEN 910 |
| 921 | xp100 MACH_XP100 XP100 911 | 921 | xp100 MACH_XP100 XP100 911 |
| 922 | fs2410 MACH_FS2410 FS2410 912 | 922 | fs2410 MACH_FS2410 FS2410 912 |
| @@ -1096,7 +1096,7 @@ atc6 MACH_ATC6 ATC6 1086 | |||
| 1096 | multmdw MACH_MULTMDW MULTMDW 1087 | 1096 | multmdw MACH_MULTMDW MULTMDW 1087 |
| 1097 | mba2440 MACH_MBA2440 MBA2440 1088 | 1097 | mba2440 MACH_MBA2440 MBA2440 1088 |
| 1098 | ecsd MACH_ECSD ECSD 1089 | 1098 | ecsd MACH_ECSD ECSD 1089 |
| 1099 | zire31 MACH_ZIRE31 ZIRE31 1090 | 1099 | palmz31 MACH_PALMZ31 PALMZ31 1090 |
| 1100 | fsg MACH_FSG FSG 1091 | 1100 | fsg MACH_FSG FSG 1091 |
| 1101 | razor101 MACH_RAZOR101 RAZOR101 1092 | 1101 | razor101 MACH_RAZOR101 RAZOR101 1092 |
| 1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 | 1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 |
| @@ -1810,7 +1810,7 @@ kriss_sensor MACH_KRISS_SENSOR KRISS_SENSOR 1819 | |||
| 1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 | 1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 |
| 1811 | jade MACH_JADE JADE 1821 | 1811 | jade MACH_JADE JADE 1821 |
| 1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 | 1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 |
| 1813 | gprisc4 MACH_GPRISC4 GPRISC4 1823 | 1813 | gprisc3 MACH_GPRISC4 GPRISC4 1823 |
| 1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 | 1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 |
| 1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 | 1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 |
| 1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 | 1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 |
| @@ -1820,3 +1820,44 @@ deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 | |||
| 1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 | 1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 |
| 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 | 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 |
| 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 | 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 |
| 1823 | adx_rmu MACH_ADX_RMU ADX_RMU 1833 | ||
| 1824 | xg_cpe_main MACH_XG_CPE_MAIN XG_CPE_MAIN 1834 | ||
| 1825 | edb9407a MACH_EDB9407A EDB9407A 1835 | ||
| 1826 | dtb9608 MACH_DTB9608 DTB9608 1836 | ||
| 1827 | em104v1 MACH_EM104V1 EM104V1 1837 | ||
| 1828 | demo MACH_DEMO DEMO 1838 | ||
| 1829 | logi9260 MACH_LOGI9260 LOGI9260 1839 | ||
| 1830 | mx31_exm32 MACH_MX31_EXM32 MX31_EXM32 1840 | ||
| 1831 | usb_a9g20 MACH_USB_A9G20 USB_A9G20 1841 | ||
| 1832 | picproje2008 MACH_PICPROJE2008 PICPROJE2008 1842 | ||
| 1833 | cs_e9315 MACH_CS_E9315 CS_E9315 1843 | ||
| 1834 | qil_a9g20 MACH_QIL_A9G20 QIL_A9G20 1844 | ||
| 1835 | sha_pon020 MACH_SHA_PON020 SHA_PON020 1845 | ||
| 1836 | nad MACH_NAD NAD 1846 | ||
| 1837 | sbc35_a9260 MACH_SBC35_A9260 SBC35_A9260 1847 | ||
| 1838 | sbc35_a9g20 MACH_SBC35_A9G20 SBC35_A9G20 1848 | ||
| 1839 | davinci_beginning MACH_DAVINCI_BEGINNING DAVINCI_BEGINNING 1849 | ||
| 1840 | uwc MACH_UWC UWC 1850 | ||
| 1841 | mxlads MACH_MXLADS MXLADS 1851 | ||
| 1842 | htcnike MACH_HTCNIKE HTCNIKE 1852 | ||
| 1843 | deister_pxa270 MACH_DEISTER_PXA270 DEISTER_PXA270 1853 | ||
| 1844 | cme9210js MACH_CME9210JS CME9210JS 1854 | ||
| 1845 | cc9p9360 MACH_CC9P9360 CC9P9360 1855 | ||
| 1846 | mocha MACH_MOCHA MOCHA 1856 | ||
| 1847 | wapd170ag MACH_WAPD170AG WAPD170AG 1857 | ||
| 1848 | linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858 | ||
| 1849 | afeb9260 MACH_AFEB9260 AFEB9260 1859 | ||
| 1850 | w90x900 MACH_W90X900 W90X900 1860 | ||
| 1851 | w90x700 MACH_W90X700 W90X700 1861 | ||
| 1852 | kt300ip MACH_KT300IP KT300IP 1862 | ||
| 1853 | kt300ip_g20 MACH_KT300IP_G20 KT300IP_G20 1863 | ||
| 1854 | srcm MACH_SRCM SRCM 1864 | ||
| 1855 | wlnx_9260 MACH_WLNX_9260 WLNX_9260 1865 | ||
| 1856 | openmoko_gta03 MACH_OPENMOKO_GTA03 OPENMOKO_GTA03 1866 | ||
| 1857 | osprey2 MACH_OSPREY2 OSPREY2 1867 | ||
| 1858 | kbio9260 MACH_KBIO9260 KBIO9260 1868 | ||
| 1859 | ginza MACH_GINZA GINZA 1869 | ||
| 1860 | a636n MACH_A636N A636N 1870 | ||
| 1861 | imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871 | ||
| 1862 | nenoc MACH_NEMOC NEMOC 1872 | ||
| 1863 | geneva MACH_GENEVA GENEVA 1873 | ||
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 5a097c46bc46..f64d25973a37 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
| @@ -249,7 +249,7 @@ config MEM_MT48LC8M32B2B5_7 | |||
| 249 | 249 | ||
| 250 | config MEM_MT48LC32M16A2TG_75 | 250 | config MEM_MT48LC32M16A2TG_75 |
| 251 | bool | 251 | bool |
| 252 | depends on (BFIN527_EZKIT || BFIN532_IP0X) | 252 | depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP) |
| 253 | default y | 253 | default y |
| 254 | 254 | ||
| 255 | source "arch/blackfin/mach-bf527/Kconfig" | 255 | source "arch/blackfin/mach-bf527/Kconfig" |
| @@ -292,7 +292,7 @@ config CLKIN_HZ | |||
| 292 | int "Frequency of the crystal on the board in Hz" | 292 | int "Frequency of the crystal on the board in Hz" |
| 293 | default "11059200" if BFIN533_STAMP | 293 | default "11059200" if BFIN533_STAMP |
| 294 | default "27000000" if BFIN533_EZKIT | 294 | default "27000000" if BFIN533_EZKIT |
| 295 | default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS) | 295 | default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP) |
| 296 | default "30000000" if BFIN561_EZKIT | 296 | default "30000000" if BFIN561_EZKIT |
| 297 | default "24576000" if PNAV10 | 297 | default "24576000" if PNAV10 |
| 298 | default "10000000" if BFIN532_IP0X | 298 | default "10000000" if BFIN532_IP0X |
| @@ -332,7 +332,7 @@ config VCO_MULT | |||
| 332 | default "22" if BFIN533_BLUETECHNIX_CM | 332 | default "22" if BFIN533_BLUETECHNIX_CM |
| 333 | default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) | 333 | default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) |
| 334 | default "20" if BFIN561_EZKIT | 334 | default "20" if BFIN561_EZKIT |
| 335 | default "16" if H8606_HVSISTEMAS | 335 | default "16" if (H8606_HVSISTEMAS || BLACKSTAMP) |
| 336 | help | 336 | help |
| 337 | This controls the frequency of the on-chip PLL. This can be between 1 and 64. | 337 | This controls the frequency of the on-chip PLL. This can be between 1 and 64. |
| 338 | PLL Frequency = (Crystal Frequency) * (this setting) | 338 | PLL Frequency = (Crystal Frequency) * (this setting) |
| @@ -622,6 +622,33 @@ config CPLB_SWITCH_TAB_L1 | |||
| 622 | If enabled, the CPLB Switch Tables are linked | 622 | If enabled, the CPLB Switch Tables are linked |
| 623 | into L1 data memory. (less latency) | 623 | into L1 data memory. (less latency) |
| 624 | 624 | ||
| 625 | comment "Speed Optimizations" | ||
| 626 | config BFIN_INS_LOWOVERHEAD | ||
| 627 | bool "ins[bwl] low overhead, higher interrupt latency" | ||
| 628 | default y | ||
| 629 | help | ||
| 630 | Reads on the Blackfin are speculative. In Blackfin terms, this means | ||
| 631 | they can be interrupted at any time (even after they have been issued | ||
| 632 | on to the external bus), and re-issued after the interrupt occurs. | ||
| 633 | For memory - this is not a big deal, since memory does not change if | ||
| 634 | it sees a read. | ||
| 635 | |||
| 636 | If a FIFO is sitting on the end of the read, it will see two reads, | ||
| 637 | when the core only sees one since the FIFO receives both the read | ||
| 638 | which is cancelled (and not delivered to the core) and the one which | ||
| 639 | is re-issued (which is delivered to the core). | ||
| 640 | |||
| 641 | To solve this, interrupts are turned off before reads occur to | ||
| 642 | I/O space. This option controls which the overhead/latency of | ||
| 643 | controlling interrupts during this time | ||
| 644 | "n" turns interrupts off every read | ||
| 645 | (higher overhead, but lower interrupt latency) | ||
| 646 | "y" turns interrupts off every loop | ||
| 647 | (low overhead, but longer interrupt latency) | ||
| 648 | |||
| 649 | default behavior is to leave this set to on (type "Y"). If you are experiencing | ||
| 650 | interrupt latency issues, it is safe and OK to turn this off. | ||
| 651 | |||
| 625 | endmenu | 652 | endmenu |
| 626 | 653 | ||
| 627 | 654 | ||
| @@ -933,13 +960,6 @@ endchoice | |||
| 933 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" | 960 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" |
| 934 | depends on PM | 961 | depends on PM |
| 935 | 962 | ||
| 936 | config PM_BFIN_WAKE_RTC | ||
| 937 | bool "Allow Wake-Up from RESET and on-chip RTC" | ||
| 938 | depends on PM | ||
| 939 | default n | ||
| 940 | help | ||
| 941 | Enable RTC Wake-Up (Voltage Regulator Power-Up) | ||
| 942 | |||
| 943 | config PM_BFIN_WAKE_PH6 | 963 | config PM_BFIN_WAKE_PH6 |
| 944 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" | 964 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" |
| 945 | depends on PM && (BF52x || BF534 || BF536 || BF537) | 965 | depends on PM && (BF52x || BF534 || BF536 || BF537) |
| @@ -947,41 +967,12 @@ config PM_BFIN_WAKE_PH6 | |||
| 947 | help | 967 | help |
| 948 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) | 968 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) |
| 949 | 969 | ||
| 950 | config PM_BFIN_WAKE_CAN | ||
| 951 | bool "Allow Wake-Up from on-chip CAN0/1" | ||
| 952 | depends on PM && (BF54x || BF534 || BF536 || BF537) | ||
| 953 | default n | ||
| 954 | help | ||
| 955 | Enable CAN0/1 Wake-Up (Voltage Regulator Power-Up) | ||
| 956 | |||
| 957 | config PM_BFIN_WAKE_GP | 970 | config PM_BFIN_WAKE_GP |
| 958 | bool "Allow Wake-Up from GPIOs" | 971 | bool "Allow Wake-Up from GPIOs" |
| 959 | depends on PM && BF54x | 972 | depends on PM && BF54x |
| 960 | default n | 973 | default n |
| 961 | help | 974 | help |
| 962 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) | 975 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) |
| 963 | |||
| 964 | config PM_BFIN_WAKE_USB | ||
| 965 | bool "Allow Wake-Up from on-chip USB" | ||
| 966 | depends on PM && (BF54x || BF52x) | ||
| 967 | default n | ||
| 968 | help | ||
| 969 | Enable USB Wake-Up (Voltage Regulator Power-Up) | ||
| 970 | |||
| 971 | config PM_BFIN_WAKE_KEYPAD | ||
| 972 | bool "Allow Wake-Up from on-chip Keypad" | ||
| 973 | depends on PM && BF54x | ||
| 974 | default n | ||
| 975 | help | ||
| 976 | Enable Keypad Wake-Up (Voltage Regulator Power-Up) | ||
| 977 | |||
| 978 | config PM_BFIN_WAKE_ROTARY | ||
| 979 | bool "Allow Wake-Up from on-chip Rotary" | ||
| 980 | depends on PM && BF54x | ||
| 981 | default n | ||
| 982 | help | ||
| 983 | Enable Rotary Wake-Up (Voltage Regulator Power-Up) | ||
| 984 | |||
| 985 | endmenu | 976 | endmenu |
| 986 | 977 | ||
| 987 | menu "CPU Frequency scaling" | 978 | menu "CPU Frequency scaling" |
diff --git a/arch/blackfin/configs/BlackStamp_defconfig b/arch/blackfin/configs/BlackStamp_defconfig new file mode 100644 index 000000000000..2921f9952d5f --- /dev/null +++ b/arch/blackfin/configs/BlackStamp_defconfig | |||
| @@ -0,0 +1,1195 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.26.2 | ||
| 4 | # | ||
| 5 | # CONFIG_MMU is not set | ||
| 6 | # CONFIG_FPU is not set | ||
| 7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 8 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
| 9 | CONFIG_BLACKFIN=y | ||
| 10 | CONFIG_ZONE_DMA=y | ||
| 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 12 | CONFIG_GENERIC_HWEIGHT=y | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 15 | CONFIG_GENERIC_GPIO=y | ||
| 16 | CONFIG_FORCE_MAX_ZONEORDER=14 | ||
| 17 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 18 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 19 | |||
| 20 | # | ||
| 21 | # General setup | ||
| 22 | # | ||
| 23 | CONFIG_EXPERIMENTAL=y | ||
| 24 | CONFIG_BROKEN_ON_SMP=y | ||
| 25 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 26 | CONFIG_LOCALVERSION="" | ||
| 27 | CONFIG_LOCALVERSION_AUTO=y | ||
| 28 | CONFIG_SYSVIPC=y | ||
| 29 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 30 | # CONFIG_POSIX_MQUEUE is not set | ||
| 31 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 32 | # CONFIG_TASKSTATS is not set | ||
| 33 | # CONFIG_AUDIT is not set | ||
| 34 | CONFIG_IKCONFIG=y | ||
| 35 | CONFIG_IKCONFIG_PROC=y | ||
| 36 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 37 | # CONFIG_CGROUPS is not set | ||
| 38 | # CONFIG_GROUP_SCHED is not set | ||
| 39 | CONFIG_SYSFS_DEPRECATED=y | ||
| 40 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 41 | # CONFIG_RELAY is not set | ||
| 42 | # CONFIG_NAMESPACES is not set | ||
| 43 | CONFIG_BLK_DEV_INITRD=y | ||
| 44 | CONFIG_INITRAMFS_SOURCE="" | ||
| 45 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 46 | CONFIG_SYSCTL=y | ||
| 47 | CONFIG_EMBEDDED=y | ||
| 48 | CONFIG_UID16=y | ||
| 49 | CONFIG_SYSCTL_SYSCALL=y | ||
| 50 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 51 | CONFIG_KALLSYMS=y | ||
| 52 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 53 | CONFIG_HOTPLUG=y | ||
| 54 | CONFIG_PRINTK=y | ||
| 55 | CONFIG_BUG=y | ||
| 56 | CONFIG_ELF_CORE=y | ||
| 57 | CONFIG_COMPAT_BRK=y | ||
| 58 | CONFIG_BASE_FULL=y | ||
| 59 | CONFIG_FUTEX=y | ||
| 60 | CONFIG_ANON_INODES=y | ||
| 61 | CONFIG_EPOLL=y | ||
| 62 | CONFIG_SIGNALFD=y | ||
| 63 | CONFIG_TIMERFD=y | ||
| 64 | CONFIG_EVENTFD=y | ||
| 65 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 66 | CONFIG_SLAB=y | ||
| 67 | # CONFIG_SLUB is not set | ||
| 68 | # CONFIG_SLOB is not set | ||
| 69 | # CONFIG_PROFILING is not set | ||
| 70 | # CONFIG_MARKERS is not set | ||
| 71 | CONFIG_HAVE_OPROFILE=y | ||
| 72 | # CONFIG_HAVE_KPROBES is not set | ||
| 73 | # CONFIG_HAVE_KRETPROBES is not set | ||
| 74 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 75 | CONFIG_SLABINFO=y | ||
| 76 | CONFIG_RT_MUTEXES=y | ||
| 77 | CONFIG_TINY_SHMEM=y | ||
| 78 | CONFIG_BASE_SMALL=0 | ||
| 79 | CONFIG_MODULES=y | ||
| 80 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 81 | CONFIG_MODULE_UNLOAD=y | ||
| 82 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 83 | # CONFIG_MODVERSIONS is not set | ||
| 84 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 85 | CONFIG_KMOD=y | ||
| 86 | CONFIG_BLOCK=y | ||
| 87 | # CONFIG_LBD is not set | ||
| 88 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 89 | # CONFIG_LSF is not set | ||
| 90 | # CONFIG_BLK_DEV_BSG is not set | ||
| 91 | |||
| 92 | # | ||
| 93 | # IO Schedulers | ||
| 94 | # | ||
| 95 | CONFIG_IOSCHED_NOOP=y | ||
| 96 | CONFIG_IOSCHED_AS=y | ||
| 97 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 98 | CONFIG_IOSCHED_CFQ=y | ||
| 99 | CONFIG_DEFAULT_AS=y | ||
| 100 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 101 | # CONFIG_DEFAULT_CFQ is not set | ||
| 102 | # CONFIG_DEFAULT_NOOP is not set | ||
| 103 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 104 | CONFIG_CLASSIC_RCU=y | ||
| 105 | # CONFIG_PREEMPT_NONE is not set | ||
| 106 | CONFIG_PREEMPT_VOLUNTARY=y | ||
| 107 | # CONFIG_PREEMPT is not set | ||
| 108 | |||
| 109 | # | ||
| 110 | # Blackfin Processor Options | ||
| 111 | # | ||
| 112 | |||
| 113 | # | ||
| 114 | # Processor and Board Settings | ||
| 115 | # | ||
| 116 | # CONFIG_BF522 is not set | ||
| 117 | # CONFIG_BF523 is not set | ||
| 118 | # CONFIG_BF524 is not set | ||
| 119 | # CONFIG_BF525 is not set | ||
| 120 | # CONFIG_BF526 is not set | ||
| 121 | # CONFIG_BF527 is not set | ||
| 122 | # CONFIG_BF531 is not set | ||
| 123 | CONFIG_BF532=y | ||
| 124 | # CONFIG_BF533 is not set | ||
| 125 | # CONFIG_BF534 is not set | ||
| 126 | # CONFIG_BF536 is not set | ||
| 127 | # CONFIG_BF537 is not set | ||
| 128 | # CONFIG_BF542 is not set | ||
| 129 | # CONFIG_BF544 is not set | ||
| 130 | # CONFIG_BF547 is not set | ||
| 131 | # CONFIG_BF548 is not set | ||
| 132 | # CONFIG_BF549 is not set | ||
| 133 | # CONFIG_BF561 is not set | ||
| 134 | # CONFIG_BF_REV_0_0 is not set | ||
| 135 | # CONFIG_BF_REV_0_1 is not set | ||
| 136 | # CONFIG_BF_REV_0_2 is not set | ||
| 137 | # CONFIG_BF_REV_0_3 is not set | ||
| 138 | # CONFIG_BF_REV_0_4 is not set | ||
| 139 | CONFIG_BF_REV_0_5=y | ||
| 140 | # CONFIG_BF_REV_ANY is not set | ||
| 141 | # CONFIG_BF_REV_NONE is not set | ||
| 142 | CONFIG_BF53x=y | ||
| 143 | CONFIG_MEM_MT48LC32M16A2TG_75=y | ||
| 144 | # CONFIG_BFIN533_EZKIT is not set | ||
| 145 | # CONFIG_BFIN533_STAMP is not set | ||
| 146 | # CONFIG_BFIN533_BLUETECHNIX_CM is not set | ||
| 147 | # CONFIG_H8606_HVSISTEMAS is not set | ||
| 148 | # CONFIG_BFIN532_IP0X is not set | ||
| 149 | CONFIG_BLACKSTAMP=y | ||
| 150 | # CONFIG_GENERIC_BF533_BOARD is not set | ||
| 151 | |||
| 152 | # | ||
| 153 | # BF533/2/1 Specific Configuration | ||
| 154 | # | ||
| 155 | |||
| 156 | # | ||
| 157 | # Interrupt Priority Assignment | ||
| 158 | # | ||
| 159 | |||
| 160 | # | ||
| 161 | # Priority | ||
| 162 | # | ||
| 163 | CONFIG_UART_ERROR=7 | ||
| 164 | CONFIG_SPORT0_ERROR=7 | ||
| 165 | CONFIG_SPI_ERROR=7 | ||
| 166 | CONFIG_SPORT1_ERROR=7 | ||
| 167 | CONFIG_PPI_ERROR=7 | ||
| 168 | CONFIG_DMA_ERROR=7 | ||
| 169 | CONFIG_PLLWAKE_ERROR=7 | ||
| 170 | CONFIG_RTC_ERROR=8 | ||
| 171 | CONFIG_DMA0_PPI=8 | ||
| 172 | CONFIG_DMA1_SPORT0RX=9 | ||
| 173 | CONFIG_DMA2_SPORT0TX=9 | ||
| 174 | CONFIG_DMA3_SPORT1RX=9 | ||
| 175 | CONFIG_DMA4_SPORT1TX=9 | ||
| 176 | CONFIG_DMA5_SPI=10 | ||
| 177 | CONFIG_DMA6_UARTRX=10 | ||
| 178 | CONFIG_DMA7_UARTTX=10 | ||
| 179 | CONFIG_TIMER0=11 | ||
| 180 | CONFIG_TIMER1=11 | ||
| 181 | CONFIG_TIMER2=11 | ||
| 182 | CONFIG_PFA=12 | ||
| 183 | CONFIG_PFB=12 | ||
| 184 | CONFIG_MEMDMA0=13 | ||
| 185 | CONFIG_MEMDMA1=13 | ||
| 186 | CONFIG_WDTIMER=13 | ||
| 187 | |||
| 188 | # | ||
| 189 | # Board customizations | ||
| 190 | # | ||
| 191 | # CONFIG_CMDLINE_BOOL is not set | ||
| 192 | CONFIG_BOOT_LOAD=0x1000 | ||
| 193 | |||
| 194 | # | ||
| 195 | # Clock/PLL Setup | ||
| 196 | # | ||
| 197 | CONFIG_CLKIN_HZ=25000000 | ||
| 198 | # CONFIG_BFIN_KERNEL_CLOCK is not set | ||
| 199 | # CONFIG_PLL_BYPASS is not set | ||
| 200 | # CONFIG_CLKIN_HALF is not set | ||
| 201 | CONFIG_VCO_MULT=16 | ||
| 202 | CONFIG_CCLK_DIV_1=y | ||
| 203 | # CONFIG_CCLK_DIV_2 is not set | ||
| 204 | # CONFIG_CCLK_DIV_4 is not set | ||
| 205 | # CONFIG_CCLK_DIV_8 is not set | ||
| 206 | CONFIG_SCLK_DIV=3 | ||
| 207 | CONFIG_MAX_MEM_SIZE=64 | ||
| 208 | CONFIG_MAX_VCO_HZ=400000000 | ||
| 209 | CONFIG_MIN_VCO_HZ=50000000 | ||
| 210 | CONFIG_MAX_SCLK_HZ=133333333 | ||
| 211 | CONFIG_MIN_SCLK_HZ=27000000 | ||
| 212 | |||
| 213 | # | ||
| 214 | # Kernel Timer/Scheduler | ||
| 215 | # | ||
| 216 | # CONFIG_HZ_100 is not set | ||
| 217 | CONFIG_HZ_250=y | ||
| 218 | # CONFIG_HZ_300 is not set | ||
| 219 | # CONFIG_HZ_1000 is not set | ||
| 220 | CONFIG_HZ=250 | ||
| 221 | # CONFIG_SCHED_HRTICK is not set | ||
| 222 | CONFIG_GENERIC_TIME=y | ||
| 223 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 224 | # CONFIG_CYCLES_CLOCKSOURCE is not set | ||
| 225 | CONFIG_TICK_ONESHOT=y | ||
| 226 | # CONFIG_NO_HZ is not set | ||
| 227 | CONFIG_HIGH_RES_TIMERS=y | ||
| 228 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 229 | |||
| 230 | # | ||
| 231 | # Memory Setup | ||
| 232 | # | ||
| 233 | |||
| 234 | # | ||
| 235 | # Misc | ||
| 236 | # | ||
| 237 | CONFIG_BFIN_SCRATCH_REG_RETN=y | ||
| 238 | # CONFIG_BFIN_SCRATCH_REG_RETE is not set | ||
| 239 | # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set | ||
| 240 | |||
| 241 | # | ||
| 242 | # Blackfin Kernel Optimizations | ||
| 243 | # | ||
| 244 | |||
| 245 | # | ||
| 246 | # Memory Optimizations | ||
| 247 | # | ||
| 248 | CONFIG_I_ENTRY_L1=y | ||
| 249 | CONFIG_EXCPT_IRQ_SYSC_L1=y | ||
| 250 | CONFIG_DO_IRQ_L1=y | ||
| 251 | CONFIG_CORE_TIMER_IRQ_L1=y | ||
| 252 | CONFIG_IDLE_L1=y | ||
| 253 | CONFIG_SCHEDULE_L1=y | ||
| 254 | CONFIG_ARITHMETIC_OPS_L1=y | ||
| 255 | CONFIG_ACCESS_OK_L1=y | ||
| 256 | CONFIG_MEMSET_L1=y | ||
| 257 | CONFIG_MEMCPY_L1=y | ||
| 258 | CONFIG_SYS_BFIN_SPINLOCK_L1=y | ||
| 259 | # CONFIG_IP_CHECKSUM_L1 is not set | ||
| 260 | CONFIG_CACHELINE_ALIGNED_L1=y | ||
| 261 | # CONFIG_SYSCALL_TAB_L1 is not set | ||
| 262 | # CONFIG_CPLB_SWITCH_TAB_L1 is not set | ||
| 263 | # CONFIG_RAMKERNEL is not set | ||
| 264 | CONFIG_ROMKERNEL=y | ||
| 265 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 266 | CONFIG_FLATMEM_MANUAL=y | ||
| 267 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 268 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 269 | CONFIG_FLATMEM=y | ||
| 270 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 271 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 272 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 273 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 274 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 275 | # CONFIG_RESOURCES_64BIT is not set | ||
| 276 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 277 | CONFIG_VIRT_TO_BUS=y | ||
| 278 | CONFIG_BFIN_GPTIMERS=y | ||
| 279 | CONFIG_BFIN_DMA_5XX=y | ||
| 280 | # CONFIG_DMA_UNCACHED_4M is not set | ||
| 281 | # CONFIG_DMA_UNCACHED_2M is not set | ||
| 282 | CONFIG_DMA_UNCACHED_1M=y | ||
| 283 | # CONFIG_DMA_UNCACHED_NONE is not set | ||
| 284 | |||
| 285 | # | ||
| 286 | # Cache Support | ||
| 287 | # | ||
| 288 | CONFIG_BFIN_ICACHE=y | ||
| 289 | CONFIG_BFIN_DCACHE=y | ||
| 290 | # CONFIG_BFIN_DCACHE_BANKA is not set | ||
| 291 | # CONFIG_BFIN_ICACHE_LOCK is not set | ||
| 292 | # CONFIG_BFIN_WB is not set | ||
| 293 | CONFIG_BFIN_WT=y | ||
| 294 | # CONFIG_MPU is not set | ||
| 295 | |||
| 296 | # | ||
| 297 | # Asynchonous Memory Configuration | ||
| 298 | # | ||
| 299 | |||
| 300 | # | ||
| 301 | # EBIU_AMGCTL Global Control | ||
| 302 | # | ||
| 303 | CONFIG_C_AMCKEN=y | ||
| 304 | CONFIG_C_CDPRIO=y | ||
| 305 | # CONFIG_C_AMBEN is not set | ||
| 306 | # CONFIG_C_AMBEN_B0 is not set | ||
| 307 | # CONFIG_C_AMBEN_B0_B1 is not set | ||
| 308 | # CONFIG_C_AMBEN_B0_B1_B2 is not set | ||
| 309 | CONFIG_C_AMBEN_ALL=y | ||
| 310 | |||
| 311 | # | ||
| 312 | # EBIU_AMBCTL Control | ||
| 313 | # | ||
| 314 | CONFIG_BANK_0=0x7BB0 | ||
| 315 | CONFIG_BANK_1=0x7BB0 | ||
| 316 | CONFIG_BANK_2=0x7BB0 | ||
| 317 | CONFIG_BANK_3=0xAAC2 | ||
| 318 | |||
| 319 | # | ||
| 320 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
| 321 | # | ||
| 322 | # CONFIG_PCI is not set | ||
| 323 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 324 | # CONFIG_PCCARD is not set | ||
| 325 | |||
| 326 | # | ||
| 327 | # Executable file formats | ||
| 328 | # | ||
| 329 | CONFIG_BINFMT_ELF_FDPIC=y | ||
| 330 | CONFIG_BINFMT_FLAT=y | ||
| 331 | CONFIG_BINFMT_ZFLAT=y | ||
| 332 | CONFIG_BINFMT_SHARED_FLAT=y | ||
| 333 | # CONFIG_BINFMT_MISC is not set | ||
| 334 | |||
| 335 | # | ||
| 336 | # Power management options | ||
| 337 | # | ||
| 338 | CONFIG_PM=y | ||
| 339 | # CONFIG_PM_DEBUG is not set | ||
| 340 | CONFIG_PM_SLEEP=y | ||
| 341 | CONFIG_SUSPEND=y | ||
| 342 | CONFIG_SUSPEND_FREEZER=y | ||
| 343 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
| 344 | CONFIG_PM_BFIN_SLEEP_DEEPER=y | ||
| 345 | # CONFIG_PM_BFIN_SLEEP is not set | ||
| 346 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
| 347 | |||
| 348 | # | ||
| 349 | # Possible Suspend Mem / Hibernate Wake-Up Sources | ||
| 350 | # | ||
| 351 | |||
| 352 | # | ||
| 353 | # CPU Frequency scaling | ||
| 354 | # | ||
| 355 | # CONFIG_CPU_FREQ is not set | ||
| 356 | |||
| 357 | # | ||
| 358 | # Networking | ||
| 359 | # | ||
| 360 | CONFIG_NET=y | ||
| 361 | |||
| 362 | # | ||
| 363 | # Networking options | ||
| 364 | # | ||
| 365 | CONFIG_PACKET=y | ||
| 366 | # CONFIG_PACKET_MMAP is not set | ||
| 367 | CONFIG_UNIX=y | ||
| 368 | CONFIG_XFRM=y | ||
| 369 | # CONFIG_XFRM_USER is not set | ||
| 370 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 371 | # CONFIG_XFRM_MIGRATE is not set | ||
| 372 | # CONFIG_XFRM_STATISTICS is not set | ||
| 373 | # CONFIG_NET_KEY is not set | ||
| 374 | CONFIG_INET=y | ||
| 375 | # CONFIG_IP_MULTICAST is not set | ||
| 376 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 377 | CONFIG_IP_FIB_HASH=y | ||
| 378 | CONFIG_IP_PNP=y | ||
| 379 | # CONFIG_IP_PNP_DHCP is not set | ||
| 380 | # CONFIG_IP_PNP_BOOTP is not set | ||
| 381 | # CONFIG_IP_PNP_RARP is not set | ||
| 382 | # CONFIG_NET_IPIP is not set | ||
| 383 | # CONFIG_NET_IPGRE is not set | ||
| 384 | # CONFIG_ARPD is not set | ||
| 385 | CONFIG_SYN_COOKIES=y | ||
| 386 | # CONFIG_INET_AH is not set | ||
| 387 | # CONFIG_INET_ESP is not set | ||
| 388 | # CONFIG_INET_IPCOMP is not set | ||
| 389 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 390 | # CONFIG_INET_TUNNEL is not set | ||
| 391 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
| 392 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
| 393 | CONFIG_INET_XFRM_MODE_BEET=y | ||
| 394 | # CONFIG_INET_LRO is not set | ||
| 395 | CONFIG_INET_DIAG=y | ||
| 396 | CONFIG_INET_TCP_DIAG=y | ||
| 397 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 398 | CONFIG_TCP_CONG_CUBIC=y | ||
| 399 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 400 | # CONFIG_TCP_MD5SIG is not set | ||
| 401 | # CONFIG_IPV6 is not set | ||
| 402 | # CONFIG_NETLABEL is not set | ||
| 403 | # CONFIG_NETWORK_SECMARK is not set | ||
| 404 | # CONFIG_NETFILTER is not set | ||
| 405 | # CONFIG_IP_DCCP is not set | ||
| 406 | # CONFIG_IP_SCTP is not set | ||
| 407 | # CONFIG_TIPC is not set | ||
| 408 | # CONFIG_ATM is not set | ||
| 409 | # CONFIG_BRIDGE is not set | ||
| 410 | # CONFIG_VLAN_8021Q is not set | ||
| 411 | # CONFIG_DECNET is not set | ||
| 412 | # CONFIG_LLC2 is not set | ||
| 413 | # CONFIG_IPX is not set | ||
| 414 | # CONFIG_ATALK is not set | ||
| 415 | # CONFIG_X25 is not set | ||
| 416 | # CONFIG_LAPB is not set | ||
| 417 | # CONFIG_ECONET is not set | ||
| 418 | # CONFIG_WAN_ROUTER is not set | ||
| 419 | # CONFIG_NET_SCHED is not set | ||
| 420 | |||
| 421 | # | ||
| 422 | # Network testing | ||
| 423 | # | ||
| 424 | # CONFIG_NET_PKTGEN is not set | ||
| 425 | # CONFIG_HAMRADIO is not set | ||
| 426 | # CONFIG_CAN is not set | ||
| 427 | # CONFIG_IRDA is not set | ||
| 428 | # CONFIG_BT is not set | ||
| 429 | # CONFIG_AF_RXRPC is not set | ||
| 430 | |||
| 431 | # | ||
| 432 | # Wireless | ||
| 433 | # | ||
| 434 | # CONFIG_CFG80211 is not set | ||
| 435 | # CONFIG_WIRELESS_EXT is not set | ||
| 436 | # CONFIG_MAC80211 is not set | ||
| 437 | # CONFIG_IEEE80211 is not set | ||
| 438 | # CONFIG_RFKILL is not set | ||
| 439 | # CONFIG_NET_9P is not set | ||
| 440 | |||
| 441 | # | ||
| 442 | # Device Drivers | ||
| 443 | # | ||
| 444 | |||
| 445 | # | ||
| 446 | # Generic Driver Options | ||
| 447 | # | ||
| 448 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 449 | CONFIG_STANDALONE=y | ||
| 450 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 451 | # CONFIG_FW_LOADER is not set | ||
| 452 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 453 | # CONFIG_CONNECTOR is not set | ||
| 454 | CONFIG_MTD=y | ||
| 455 | # CONFIG_MTD_DEBUG is not set | ||
| 456 | # CONFIG_MTD_CONCAT is not set | ||
| 457 | CONFIG_MTD_PARTITIONS=y | ||
| 458 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 459 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 460 | # CONFIG_MTD_AR7_PARTS is not set | ||
| 461 | |||
| 462 | # | ||
| 463 | # User Modules And Translation Layers | ||
| 464 | # | ||
| 465 | CONFIG_MTD_CHAR=m | ||
| 466 | CONFIG_MTD_BLKDEVS=y | ||
| 467 | CONFIG_MTD_BLOCK=y | ||
| 468 | # CONFIG_FTL is not set | ||
| 469 | # CONFIG_NFTL is not set | ||
| 470 | # CONFIG_INFTL is not set | ||
| 471 | # CONFIG_RFD_FTL is not set | ||
| 472 | # CONFIG_SSFDC is not set | ||
| 473 | # CONFIG_MTD_OOPS is not set | ||
| 474 | |||
| 475 | # | ||
| 476 | # RAM/ROM/Flash chip drivers | ||
| 477 | # | ||
| 478 | CONFIG_MTD_CFI=m | ||
| 479 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 480 | CONFIG_MTD_GEN_PROBE=m | ||
| 481 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
| 482 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 483 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 484 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 485 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 486 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 487 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 488 | CONFIG_MTD_CFI_I1=y | ||
| 489 | CONFIG_MTD_CFI_I2=y | ||
| 490 | # CONFIG_MTD_CFI_I4 is not set | ||
| 491 | # CONFIG_MTD_CFI_I8 is not set | ||
| 492 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
| 493 | CONFIG_MTD_CFI_AMDSTD=m | ||
| 494 | # CONFIG_MTD_CFI_STAA is not set | ||
| 495 | CONFIG_MTD_CFI_UTIL=m | ||
| 496 | CONFIG_MTD_RAM=y | ||
| 497 | CONFIG_MTD_ROM=m | ||
| 498 | # CONFIG_MTD_ABSENT is not set | ||
| 499 | |||
| 500 | # | ||
| 501 | # Mapping drivers for chip access | ||
| 502 | # | ||
| 503 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 504 | # CONFIG_MTD_PHYSMAP is not set | ||
| 505 | # CONFIG_MTD_GPIO_ADDR is not set | ||
| 506 | # CONFIG_MTD_UCLINUX is not set | ||
| 507 | # CONFIG_MTD_PLATRAM is not set | ||
| 508 | |||
| 509 | # | ||
| 510 | # Self-contained MTD device drivers | ||
| 511 | # | ||
| 512 | # CONFIG_MTD_DATAFLASH is not set | ||
| 513 | CONFIG_MTD_M25P80=y | ||
| 514 | # CONFIG_M25PXX_USE_FAST_READ is not set | ||
| 515 | # CONFIG_MTD_SLRAM is not set | ||
| 516 | # CONFIG_MTD_PHRAM is not set | ||
| 517 | # CONFIG_MTD_MTDRAM is not set | ||
| 518 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 519 | |||
| 520 | # | ||
| 521 | # Disk-On-Chip Device Drivers | ||
| 522 | # | ||
| 523 | # CONFIG_MTD_DOC2000 is not set | ||
| 524 | # CONFIG_MTD_DOC2001 is not set | ||
| 525 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 526 | # CONFIG_MTD_NAND is not set | ||
| 527 | # CONFIG_MTD_ONENAND is not set | ||
| 528 | |||
| 529 | # | ||
| 530 | # UBI - Unsorted block images | ||
| 531 | # | ||
| 532 | # CONFIG_MTD_UBI is not set | ||
| 533 | # CONFIG_PARPORT is not set | ||
| 534 | CONFIG_BLK_DEV=y | ||
| 535 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 536 | CONFIG_BLK_DEV_LOOP=y | ||
| 537 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 538 | CONFIG_BLK_DEV_NBD=y | ||
| 539 | CONFIG_BLK_DEV_RAM=y | ||
| 540 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 541 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
| 542 | # CONFIG_BLK_DEV_XIP is not set | ||
| 543 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 544 | # CONFIG_ATA_OVER_ETH is not set | ||
| 545 | CONFIG_MISC_DEVICES=y | ||
| 546 | # CONFIG_EEPROM_93CX6 is not set | ||
| 547 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 548 | CONFIG_HAVE_IDE=y | ||
| 549 | # CONFIG_IDE is not set | ||
| 550 | |||
| 551 | # | ||
| 552 | # SCSI device support | ||
| 553 | # | ||
| 554 | # CONFIG_RAID_ATTRS is not set | ||
| 555 | # CONFIG_SCSI is not set | ||
| 556 | # CONFIG_SCSI_DMA is not set | ||
| 557 | # CONFIG_SCSI_NETLINK is not set | ||
| 558 | # CONFIG_ATA is not set | ||
| 559 | # CONFIG_MD is not set | ||
| 560 | CONFIG_NETDEVICES=y | ||
| 561 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 562 | # CONFIG_DUMMY is not set | ||
| 563 | # CONFIG_BONDING is not set | ||
| 564 | # CONFIG_MACVLAN is not set | ||
| 565 | # CONFIG_EQUALIZER is not set | ||
| 566 | # CONFIG_TUN is not set | ||
| 567 | # CONFIG_VETH is not set | ||
| 568 | # CONFIG_PHYLIB is not set | ||
| 569 | CONFIG_NET_ETHERNET=y | ||
| 570 | CONFIG_MII=y | ||
| 571 | CONFIG_SMC91X=y | ||
| 572 | # CONFIG_SMSC911X is not set | ||
| 573 | # CONFIG_DM9000 is not set | ||
| 574 | # CONFIG_ENC28J60 is not set | ||
| 575 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 576 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 577 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 578 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 579 | # CONFIG_B44 is not set | ||
| 580 | # CONFIG_NETDEV_1000 is not set | ||
| 581 | # CONFIG_NETDEV_10000 is not set | ||
| 582 | |||
| 583 | # | ||
| 584 | # Wireless LAN | ||
| 585 | # | ||
| 586 | # CONFIG_WLAN_PRE80211 is not set | ||
| 587 | # CONFIG_WLAN_80211 is not set | ||
| 588 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 589 | # CONFIG_WAN is not set | ||
| 590 | # CONFIG_PPP is not set | ||
| 591 | # CONFIG_SLIP is not set | ||
| 592 | # CONFIG_NETCONSOLE is not set | ||
| 593 | # CONFIG_NETPOLL is not set | ||
| 594 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 595 | # CONFIG_ISDN is not set | ||
| 596 | # CONFIG_PHONE is not set | ||
| 597 | |||
| 598 | # | ||
| 599 | # Input device support | ||
| 600 | # | ||
| 601 | CONFIG_INPUT=y | ||
| 602 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 603 | # CONFIG_INPUT_POLLDEV is not set | ||
| 604 | |||
| 605 | # | ||
| 606 | # Userland interfaces | ||
| 607 | # | ||
| 608 | # CONFIG_INPUT_MOUSEDEV is not set | ||
| 609 | # CONFIG_INPUT_JOYDEV is not set | ||
| 610 | CONFIG_INPUT_EVDEV=m | ||
| 611 | # CONFIG_INPUT_EVBUG is not set | ||
| 612 | |||
| 613 | # | ||
| 614 | # Input Device Drivers | ||
| 615 | # | ||
| 616 | # CONFIG_INPUT_KEYBOARD is not set | ||
| 617 | # CONFIG_INPUT_MOUSE is not set | ||
| 618 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 619 | # CONFIG_INPUT_TABLET is not set | ||
| 620 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 621 | # CONFIG_INPUT_MISC is not set | ||
| 622 | |||
| 623 | # | ||
| 624 | # Hardware I/O ports | ||
| 625 | # | ||
| 626 | # CONFIG_SERIO is not set | ||
| 627 | # CONFIG_GAMEPORT is not set | ||
| 628 | |||
| 629 | # | ||
| 630 | # Character devices | ||
| 631 | # | ||
| 632 | # CONFIG_AD9960 is not set | ||
| 633 | # CONFIG_SPI_ADC_BF533 is not set | ||
| 634 | # CONFIG_BF5xx_PPIFCD is not set | ||
| 635 | # CONFIG_BFIN_SIMPLE_TIMER is not set | ||
| 636 | CONFIG_BF5xx_PPI=y | ||
| 637 | CONFIG_BFIN_SPORT=y | ||
| 638 | # CONFIG_BFIN_TIMER_LATENCY is not set | ||
| 639 | # CONFIG_TWI_LCD is not set | ||
| 640 | CONFIG_SIMPLE_GPIO=m | ||
| 641 | # CONFIG_VT is not set | ||
| 642 | CONFIG_DEVKMEM=y | ||
| 643 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 644 | |||
| 645 | # | ||
| 646 | # Serial drivers | ||
| 647 | # | ||
| 648 | # CONFIG_SERIAL_8250 is not set | ||
| 649 | |||
| 650 | # | ||
| 651 | # Non-8250 serial port support | ||
| 652 | # | ||
| 653 | CONFIG_SERIAL_BFIN=y | ||
| 654 | CONFIG_SERIAL_BFIN_CONSOLE=y | ||
| 655 | CONFIG_SERIAL_BFIN_DMA=y | ||
| 656 | # CONFIG_SERIAL_BFIN_PIO is not set | ||
| 657 | CONFIG_SERIAL_BFIN_UART0=y | ||
| 658 | # CONFIG_BFIN_UART0_CTSRTS is not set | ||
| 659 | CONFIG_SERIAL_CORE=y | ||
| 660 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 661 | # CONFIG_SERIAL_BFIN_SPORT is not set | ||
| 662 | CONFIG_UNIX98_PTYS=y | ||
| 663 | # CONFIG_LEGACY_PTYS is not set | ||
| 664 | |||
| 665 | # | ||
| 666 | # CAN, the car bus and industrial fieldbus | ||
| 667 | # | ||
| 668 | # CONFIG_CAN4LINUX is not set | ||
| 669 | # CONFIG_IPMI_HANDLER is not set | ||
| 670 | CONFIG_HW_RANDOM=y | ||
| 671 | # CONFIG_R3964 is not set | ||
| 672 | # CONFIG_RAW_DRIVER is not set | ||
| 673 | # CONFIG_TCG_TPM is not set | ||
| 674 | CONFIG_I2C=m | ||
| 675 | CONFIG_I2C_BOARDINFO=y | ||
| 676 | CONFIG_I2C_CHARDEV=m | ||
| 677 | CONFIG_I2C_ALGOBIT=m | ||
| 678 | |||
| 679 | # | ||
| 680 | # I2C Hardware Bus support | ||
| 681 | # | ||
| 682 | CONFIG_I2C_GPIO=m | ||
| 683 | # CONFIG_I2C_OCORES is not set | ||
| 684 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 685 | # CONFIG_I2C_SIMTEC is not set | ||
| 686 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 687 | # CONFIG_I2C_STUB is not set | ||
| 688 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 689 | |||
| 690 | # | ||
| 691 | # Miscellaneous I2C Chip support | ||
| 692 | # | ||
| 693 | # CONFIG_DS1682 is not set | ||
| 694 | # CONFIG_SENSORS_AD5252 is not set | ||
| 695 | # CONFIG_SENSORS_EEPROM is not set | ||
| 696 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 697 | # CONFIG_PCF8575 is not set | ||
| 698 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 699 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 700 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 701 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 702 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 703 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 704 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 705 | CONFIG_SPI=y | ||
| 706 | CONFIG_SPI_MASTER=y | ||
| 707 | |||
| 708 | # | ||
| 709 | # SPI Master Controller Drivers | ||
| 710 | # | ||
| 711 | CONFIG_SPI_BFIN=y | ||
| 712 | # CONFIG_SPI_BITBANG is not set | ||
| 713 | |||
| 714 | # | ||
| 715 | # SPI Protocol Masters | ||
| 716 | # | ||
| 717 | CONFIG_SPI_AT25=y | ||
| 718 | CONFIG_SPI_SPIDEV=m | ||
| 719 | # CONFIG_SPI_TLE62X0 is not set | ||
| 720 | # CONFIG_W1 is not set | ||
| 721 | # CONFIG_POWER_SUPPLY is not set | ||
| 722 | # CONFIG_HWMON is not set | ||
| 723 | # CONFIG_HWMON_VID is not set | ||
| 724 | # CONFIG_SENSORS_AD7418 is not set | ||
| 725 | # CONFIG_SENSORS_ADM1021 is not set | ||
| 726 | # CONFIG_SENSORS_ADM1025 is not set | ||
| 727 | # CONFIG_SENSORS_ADM1026 is not set | ||
| 728 | # CONFIG_SENSORS_ADM1029 is not set | ||
| 729 | # CONFIG_SENSORS_ADM1031 is not set | ||
| 730 | # CONFIG_SENSORS_ADM9240 is not set | ||
| 731 | # CONFIG_SENSORS_ADT7470 is not set | ||
| 732 | # CONFIG_SENSORS_ADT7473 is not set | ||
| 733 | # CONFIG_SENSORS_ATXP1 is not set | ||
| 734 | # CONFIG_SENSORS_DS1621 is not set | ||
| 735 | # CONFIG_SENSORS_F71805F is not set | ||
| 736 | # CONFIG_SENSORS_F71882FG is not set | ||
| 737 | # CONFIG_SENSORS_F75375S is not set | ||
| 738 | # CONFIG_SENSORS_GL518SM is not set | ||
| 739 | # CONFIG_SENSORS_GL520SM is not set | ||
| 740 | # CONFIG_SENSORS_IT87 is not set | ||
| 741 | # CONFIG_SENSORS_LM63 is not set | ||
| 742 | # CONFIG_SENSORS_LM70 is not set | ||
| 743 | # CONFIG_SENSORS_LM75 is not set | ||
| 744 | # CONFIG_SENSORS_LM77 is not set | ||
| 745 | # CONFIG_SENSORS_LM78 is not set | ||
| 746 | # CONFIG_SENSORS_LM80 is not set | ||
| 747 | # CONFIG_SENSORS_LM83 is not set | ||
| 748 | # CONFIG_SENSORS_LM85 is not set | ||
| 749 | # CONFIG_SENSORS_LM87 is not set | ||
| 750 | # CONFIG_SENSORS_LM90 is not set | ||
| 751 | # CONFIG_SENSORS_LM92 is not set | ||
| 752 | # CONFIG_SENSORS_LM93 is not set | ||
| 753 | # CONFIG_SENSORS_MAX1619 is not set | ||
| 754 | # CONFIG_SENSORS_MAX6650 is not set | ||
| 755 | # CONFIG_SENSORS_PC87360 is not set | ||
| 756 | # CONFIG_SENSORS_PC87427 is not set | ||
| 757 | # CONFIG_SENSORS_DME1737 is not set | ||
| 758 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
| 759 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
| 760 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
| 761 | # CONFIG_SENSORS_ADS7828 is not set | ||
| 762 | # CONFIG_SENSORS_THMC50 is not set | ||
| 763 | # CONFIG_SENSORS_VT1211 is not set | ||
| 764 | # CONFIG_SENSORS_W83781D is not set | ||
| 765 | # CONFIG_SENSORS_W83791D is not set | ||
| 766 | # CONFIG_SENSORS_W83792D is not set | ||
| 767 | # CONFIG_SENSORS_W83793 is not set | ||
| 768 | # CONFIG_SENSORS_W83L785TS is not set | ||
| 769 | # CONFIG_SENSORS_W83L786NG is not set | ||
| 770 | # CONFIG_SENSORS_W83627HF is not set | ||
| 771 | # CONFIG_SENSORS_W83627EHF is not set | ||
| 772 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
| 773 | # CONFIG_THERMAL is not set | ||
| 774 | # CONFIG_THERMAL_HWMON is not set | ||
| 775 | CONFIG_WATCHDOG=y | ||
| 776 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
| 777 | |||
| 778 | # | ||
| 779 | # Watchdog Device Drivers | ||
| 780 | # | ||
| 781 | # CONFIG_SOFT_WATCHDOG is not set | ||
| 782 | CONFIG_BFIN_WDT=y | ||
| 783 | |||
| 784 | # | ||
| 785 | # Sonics Silicon Backplane | ||
| 786 | # | ||
| 787 | CONFIG_SSB_POSSIBLE=y | ||
| 788 | # CONFIG_SSB is not set | ||
| 789 | |||
| 790 | # | ||
| 791 | # Multifunction device drivers | ||
| 792 | # | ||
| 793 | # CONFIG_MFD_SM501 is not set | ||
| 794 | # CONFIG_HTC_PASIC3 is not set | ||
| 795 | |||
| 796 | # | ||
| 797 | # Multimedia devices | ||
| 798 | # | ||
| 799 | |||
| 800 | # | ||
| 801 | # Multimedia core support | ||
| 802 | # | ||
| 803 | # CONFIG_VIDEO_DEV is not set | ||
| 804 | # CONFIG_DVB_CORE is not set | ||
| 805 | # CONFIG_VIDEO_MEDIA is not set | ||
| 806 | |||
| 807 | # | ||
| 808 | # Multimedia drivers | ||
| 809 | # | ||
| 810 | # CONFIG_DAB is not set | ||
| 811 | |||
| 812 | # | ||
| 813 | # Graphics support | ||
| 814 | # | ||
| 815 | # CONFIG_VGASTATE is not set | ||
| 816 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 817 | # CONFIG_FB is not set | ||
| 818 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 819 | |||
| 820 | # | ||
| 821 | # Display device support | ||
| 822 | # | ||
| 823 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 824 | |||
| 825 | # | ||
| 826 | # Sound | ||
| 827 | # | ||
| 828 | # CONFIG_SOUND is not set | ||
| 829 | CONFIG_HID_SUPPORT=y | ||
| 830 | CONFIG_HID=y | ||
| 831 | # CONFIG_HID_DEBUG is not set | ||
| 832 | # CONFIG_HIDRAW is not set | ||
| 833 | # CONFIG_USB_SUPPORT is not set | ||
| 834 | CONFIG_MMC=y | ||
| 835 | # CONFIG_MMC_DEBUG is not set | ||
| 836 | # CONFIG_MMC_UNSAFE_RESUME is not set | ||
| 837 | |||
| 838 | # | ||
| 839 | # MMC/SD Card Drivers | ||
| 840 | # | ||
| 841 | CONFIG_MMC_BLOCK=y | ||
| 842 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 843 | # CONFIG_SDIO_UART is not set | ||
| 844 | # CONFIG_MMC_TEST is not set | ||
| 845 | |||
| 846 | # | ||
| 847 | # MMC/SD Host Controller Drivers | ||
| 848 | # | ||
| 849 | CONFIG_MMC_SPI=y | ||
| 850 | # CONFIG_SPI_MMC is not set | ||
| 851 | # CONFIG_MEMSTICK is not set | ||
| 852 | # CONFIG_NEW_LEDS is not set | ||
| 853 | # CONFIG_ACCESSIBILITY is not set | ||
| 854 | CONFIG_RTC_LIB=y | ||
| 855 | CONFIG_RTC_CLASS=y | ||
| 856 | CONFIG_RTC_HCTOSYS=y | ||
| 857 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 858 | # CONFIG_RTC_DEBUG is not set | ||
| 859 | |||
| 860 | # | ||
| 861 | # RTC interfaces | ||
| 862 | # | ||
| 863 | CONFIG_RTC_INTF_SYSFS=y | ||
| 864 | CONFIG_RTC_INTF_PROC=y | ||
| 865 | CONFIG_RTC_INTF_DEV=y | ||
| 866 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 867 | # CONFIG_RTC_DRV_TEST is not set | ||
| 868 | |||
| 869 | # | ||
| 870 | # I2C RTC drivers | ||
| 871 | # | ||
| 872 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 873 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 874 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 875 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 876 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 877 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 878 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 879 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 880 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 881 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 882 | # CONFIG_RTC_DRV_S35390A is not set | ||
| 883 | # CONFIG_RTC_DRV_FM3130 is not set | ||
| 884 | |||
| 885 | # | ||
| 886 | # SPI RTC drivers | ||
| 887 | # | ||
| 888 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
| 889 | # CONFIG_RTC_DRV_R9701 is not set | ||
| 890 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
| 891 | |||
| 892 | # | ||
| 893 | # Platform RTC drivers | ||
| 894 | # | ||
| 895 | # CONFIG_RTC_DRV_DS1511 is not set | ||
| 896 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 897 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 898 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 899 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 900 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 901 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 902 | |||
| 903 | # | ||
| 904 | # on-CPU RTC drivers | ||
| 905 | # | ||
| 906 | CONFIG_RTC_DRV_BFIN=y | ||
| 907 | # CONFIG_UIO is not set | ||
| 908 | |||
| 909 | # | ||
| 910 | # File systems | ||
| 911 | # | ||
| 912 | # CONFIG_EXT2_FS is not set | ||
| 913 | # CONFIG_EXT3_FS is not set | ||
| 914 | # CONFIG_EXT4DEV_FS is not set | ||
| 915 | # CONFIG_REISERFS_FS is not set | ||
| 916 | # CONFIG_JFS_FS is not set | ||
| 917 | # CONFIG_FS_POSIX_ACL is not set | ||
| 918 | # CONFIG_XFS_FS is not set | ||
| 919 | # CONFIG_OCFS2_FS is not set | ||
| 920 | # CONFIG_DNOTIFY is not set | ||
| 921 | CONFIG_INOTIFY=y | ||
| 922 | CONFIG_INOTIFY_USER=y | ||
| 923 | # CONFIG_QUOTA is not set | ||
| 924 | # CONFIG_AUTOFS_FS is not set | ||
| 925 | # CONFIG_AUTOFS4_FS is not set | ||
| 926 | # CONFIG_FUSE_FS is not set | ||
| 927 | |||
| 928 | # | ||
| 929 | # CD-ROM/DVD Filesystems | ||
| 930 | # | ||
| 931 | # CONFIG_ISO9660_FS is not set | ||
| 932 | # CONFIG_UDF_FS is not set | ||
| 933 | |||
| 934 | # | ||
| 935 | # DOS/FAT/NT Filesystems | ||
| 936 | # | ||
| 937 | CONFIG_FAT_FS=y | ||
| 938 | CONFIG_MSDOS_FS=y | ||
| 939 | CONFIG_VFAT_FS=y | ||
| 940 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 941 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 942 | # CONFIG_NTFS_FS is not set | ||
| 943 | |||
| 944 | # | ||
| 945 | # Pseudo filesystems | ||
| 946 | # | ||
| 947 | CONFIG_PROC_FS=y | ||
| 948 | CONFIG_PROC_SYSCTL=y | ||
| 949 | CONFIG_SYSFS=y | ||
| 950 | # CONFIG_TMPFS is not set | ||
| 951 | # CONFIG_HUGETLB_PAGE is not set | ||
| 952 | # CONFIG_CONFIGFS_FS is not set | ||
| 953 | |||
| 954 | # | ||
| 955 | # Miscellaneous filesystems | ||
| 956 | # | ||
| 957 | # CONFIG_ADFS_FS is not set | ||
| 958 | # CONFIG_AFFS_FS is not set | ||
| 959 | # CONFIG_HFS_FS is not set | ||
| 960 | # CONFIG_HFSPLUS_FS is not set | ||
| 961 | # CONFIG_BEFS_FS is not set | ||
| 962 | # CONFIG_BFS_FS is not set | ||
| 963 | # CONFIG_EFS_FS is not set | ||
| 964 | CONFIG_YAFFS_FS=m | ||
| 965 | CONFIG_YAFFS_YAFFS1=y | ||
| 966 | # CONFIG_YAFFS_9BYTE_TAGS is not set | ||
| 967 | # CONFIG_YAFFS_DOES_ECC is not set | ||
| 968 | CONFIG_YAFFS_YAFFS2=y | ||
| 969 | CONFIG_YAFFS_AUTO_YAFFS2=y | ||
| 970 | # CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set | ||
| 971 | # CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set | ||
| 972 | # CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set | ||
| 973 | CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y | ||
| 974 | CONFIG_JFFS2_FS=y | ||
| 975 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 976 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 977 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 978 | # CONFIG_JFFS2_SUMMARY is not set | ||
| 979 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 980 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
| 981 | CONFIG_JFFS2_ZLIB=y | ||
| 982 | # CONFIG_JFFS2_LZO is not set | ||
| 983 | CONFIG_JFFS2_RTIME=y | ||
| 984 | # CONFIG_JFFS2_RUBIN is not set | ||
| 985 | # CONFIG_CRAMFS is not set | ||
| 986 | # CONFIG_VXFS_FS is not set | ||
| 987 | # CONFIG_MINIX_FS is not set | ||
| 988 | # CONFIG_HPFS_FS is not set | ||
| 989 | # CONFIG_QNX4FS_FS is not set | ||
| 990 | # CONFIG_ROMFS_FS is not set | ||
| 991 | # CONFIG_SYSV_FS is not set | ||
| 992 | # CONFIG_UFS_FS is not set | ||
| 993 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 994 | CONFIG_NFS_FS=y | ||
| 995 | CONFIG_NFS_V3=y | ||
| 996 | # CONFIG_NFS_V3_ACL is not set | ||
| 997 | CONFIG_NFS_V4=y | ||
| 998 | # CONFIG_NFSD is not set | ||
| 999 | # CONFIG_ROOT_NFS is not set | ||
| 1000 | CONFIG_LOCKD=y | ||
| 1001 | CONFIG_LOCKD_V4=y | ||
| 1002 | CONFIG_NFS_COMMON=y | ||
| 1003 | CONFIG_SUNRPC=y | ||
| 1004 | CONFIG_SUNRPC_GSS=y | ||
| 1005 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1006 | CONFIG_RPCSEC_GSS_KRB5=y | ||
| 1007 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1008 | CONFIG_SMB_FS=y | ||
| 1009 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
| 1010 | CONFIG_CIFS=y | ||
| 1011 | # CONFIG_CIFS_STATS is not set | ||
| 1012 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1013 | # CONFIG_CIFS_XATTR is not set | ||
| 1014 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1015 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1016 | # CONFIG_NCP_FS is not set | ||
| 1017 | # CONFIG_CODA_FS is not set | ||
| 1018 | # CONFIG_AFS_FS is not set | ||
| 1019 | |||
| 1020 | # | ||
| 1021 | # Partition Types | ||
| 1022 | # | ||
| 1023 | # CONFIG_PARTITION_ADVANCED is not set | ||
| 1024 | CONFIG_MSDOS_PARTITION=y | ||
| 1025 | CONFIG_NLS=y | ||
| 1026 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
| 1027 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1028 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
| 1029 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
| 1030 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
| 1031 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
| 1032 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
| 1033 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
| 1034 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
| 1035 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
| 1036 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
| 1037 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
| 1038 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
| 1039 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
| 1040 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
| 1041 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
| 1042 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
| 1043 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
| 1044 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
| 1045 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
| 1046 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
| 1047 | # CONFIG_NLS_ISO8859_8 is not set | ||
| 1048 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
| 1049 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
| 1050 | CONFIG_NLS_ASCII=y | ||
| 1051 | # CONFIG_NLS_ISO8859_1 is not set | ||
| 1052 | # CONFIG_NLS_ISO8859_2 is not set | ||
| 1053 | # CONFIG_NLS_ISO8859_3 is not set | ||
| 1054 | # CONFIG_NLS_ISO8859_4 is not set | ||
| 1055 | # CONFIG_NLS_ISO8859_5 is not set | ||
| 1056 | # CONFIG_NLS_ISO8859_6 is not set | ||
| 1057 | # CONFIG_NLS_ISO8859_7 is not set | ||
| 1058 | # CONFIG_NLS_ISO8859_9 is not set | ||
| 1059 | # CONFIG_NLS_ISO8859_13 is not set | ||
| 1060 | # CONFIG_NLS_ISO8859_14 is not set | ||
| 1061 | # CONFIG_NLS_ISO8859_15 is not set | ||
| 1062 | # CONFIG_NLS_KOI8_R is not set | ||
| 1063 | # CONFIG_NLS_KOI8_U is not set | ||
| 1064 | CONFIG_NLS_UTF8=y | ||
| 1065 | # CONFIG_DLM is not set | ||
| 1066 | |||
| 1067 | # | ||
| 1068 | # Kernel hacking | ||
| 1069 | # | ||
| 1070 | # CONFIG_PRINTK_TIME is not set | ||
| 1071 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1072 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1073 | CONFIG_FRAME_WARN=1024 | ||
| 1074 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1075 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1076 | CONFIG_DEBUG_FS=y | ||
| 1077 | # CONFIG_HEADERS_CHECK is not set | ||
| 1078 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1079 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 1080 | # CONFIG_SAMPLES is not set | ||
| 1081 | CONFIG_DEBUG_MMRS=y | ||
| 1082 | CONFIG_DEBUG_HUNT_FOR_ZERO=y | ||
| 1083 | CONFIG_DEBUG_BFIN_HWTRACE_ON=y | ||
| 1084 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y | ||
| 1085 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set | ||
| 1086 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set | ||
| 1087 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0 | ||
| 1088 | # CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set | ||
| 1089 | # CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set | ||
| 1090 | CONFIG_EARLY_PRINTK=y | ||
| 1091 | CONFIG_CPLB_INFO=y | ||
| 1092 | CONFIG_ACCESS_CHECK=y | ||
| 1093 | |||
| 1094 | # | ||
| 1095 | # Security options | ||
| 1096 | # | ||
| 1097 | # CONFIG_KEYS is not set | ||
| 1098 | CONFIG_SECURITY=y | ||
| 1099 | # CONFIG_SECURITY_NETWORK is not set | ||
| 1100 | # CONFIG_SECURITY_CAPABILITIES is not set | ||
| 1101 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0 | ||
| 1102 | CONFIG_CRYPTO=y | ||
| 1103 | |||
| 1104 | # | ||
| 1105 | # Crypto core or helper | ||
| 1106 | # | ||
| 1107 | CONFIG_CRYPTO_ALGAPI=y | ||
| 1108 | CONFIG_CRYPTO_BLKCIPHER=y | ||
| 1109 | CONFIG_CRYPTO_MANAGER=y | ||
| 1110 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1111 | # CONFIG_CRYPTO_NULL is not set | ||
| 1112 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1113 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1114 | # CONFIG_CRYPTO_TEST is not set | ||
| 1115 | |||
| 1116 | # | ||
| 1117 | # Authenticated Encryption with Associated Data | ||
| 1118 | # | ||
| 1119 | # CONFIG_CRYPTO_CCM is not set | ||
| 1120 | # CONFIG_CRYPTO_GCM is not set | ||
| 1121 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1122 | |||
| 1123 | # | ||
| 1124 | # Block modes | ||
| 1125 | # | ||
| 1126 | CONFIG_CRYPTO_CBC=y | ||
| 1127 | # CONFIG_CRYPTO_CTR is not set | ||
| 1128 | # CONFIG_CRYPTO_CTS is not set | ||
| 1129 | # CONFIG_CRYPTO_ECB is not set | ||
| 1130 | # CONFIG_CRYPTO_LRW is not set | ||
| 1131 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1132 | # CONFIG_CRYPTO_XTS is not set | ||
| 1133 | |||
| 1134 | # | ||
| 1135 | # Hash modes | ||
| 1136 | # | ||
| 1137 | # CONFIG_CRYPTO_HMAC is not set | ||
| 1138 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1139 | |||
| 1140 | # | ||
| 1141 | # Digest | ||
| 1142 | # | ||
| 1143 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1144 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1145 | CONFIG_CRYPTO_MD5=y | ||
| 1146 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1147 | # CONFIG_CRYPTO_SHA1 is not set | ||
| 1148 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1149 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1150 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1151 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1152 | |||
| 1153 | # | ||
| 1154 | # Ciphers | ||
| 1155 | # | ||
| 1156 | # CONFIG_CRYPTO_AES is not set | ||
| 1157 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1158 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 1159 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1160 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1161 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1162 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1163 | CONFIG_CRYPTO_DES=y | ||
| 1164 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1165 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1166 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1167 | # CONFIG_CRYPTO_SEED is not set | ||
| 1168 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1169 | # CONFIG_CRYPTO_TEA is not set | ||
| 1170 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1171 | |||
| 1172 | # | ||
| 1173 | # Compression | ||
| 1174 | # | ||
| 1175 | # CONFIG_CRYPTO_DEFLATE is not set | ||
| 1176 | # CONFIG_CRYPTO_LZO is not set | ||
| 1177 | CONFIG_CRYPTO_HW=y | ||
| 1178 | |||
| 1179 | # | ||
| 1180 | # Library routines | ||
| 1181 | # | ||
| 1182 | CONFIG_BITREVERSE=y | ||
| 1183 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 1184 | CONFIG_CRC_CCITT=m | ||
| 1185 | # CONFIG_CRC16 is not set | ||
| 1186 | CONFIG_CRC_ITU_T=y | ||
| 1187 | CONFIG_CRC32=y | ||
| 1188 | CONFIG_CRC7=y | ||
| 1189 | # CONFIG_LIBCRC32C is not set | ||
| 1190 | CONFIG_ZLIB_INFLATE=y | ||
| 1191 | CONFIG_ZLIB_DEFLATE=y | ||
| 1192 | CONFIG_PLIST=y | ||
| 1193 | CONFIG_HAS_IOMEM=y | ||
| 1194 | CONFIG_HAS_IOPORT=y | ||
| 1195 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/blackfin/configs/TCM-BF537_defconfig b/arch/blackfin/configs/TCM-BF537_defconfig new file mode 100644 index 000000000000..c482ee171f9e --- /dev/null +++ b/arch/blackfin/configs/TCM-BF537_defconfig | |||
| @@ -0,0 +1,693 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24.7 | ||
| 4 | # Thu Jul 31 00:53:15 2008 | ||
| 5 | # | ||
| 6 | # CONFIG_MMU is not set | ||
| 7 | # CONFIG_FPU is not set | ||
| 8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 9 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
| 10 | CONFIG_BLACKFIN=y | ||
| 11 | CONFIG_ZONE_DMA=y | ||
| 12 | CONFIG_SEMAPHORE_SLEEPERS=y | ||
| 13 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 14 | CONFIG_GENERIC_HWEIGHT=y | ||
| 15 | CONFIG_GENERIC_HARDIRQS=y | ||
| 16 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 17 | CONFIG_GENERIC_GPIO=y | ||
| 18 | CONFIG_FORCE_MAX_ZONEORDER=14 | ||
| 19 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 20 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 21 | |||
| 22 | # | ||
| 23 | # General setup | ||
| 24 | # | ||
| 25 | CONFIG_EXPERIMENTAL=y | ||
| 26 | CONFIG_BROKEN_ON_SMP=y | ||
| 27 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 28 | CONFIG_LOCALVERSION="" | ||
| 29 | CONFIG_LOCALVERSION_AUTO=y | ||
| 30 | CONFIG_SYSVIPC=y | ||
| 31 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 32 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 33 | # CONFIG_USER_NS is not set | ||
| 34 | # CONFIG_PID_NS is not set | ||
| 35 | CONFIG_IKCONFIG=y | ||
| 36 | CONFIG_IKCONFIG_PROC=y | ||
| 37 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 38 | # CONFIG_CGROUPS is not set | ||
| 39 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 40 | CONFIG_FAIR_USER_SCHED=y | ||
| 41 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 42 | CONFIG_SYSFS_DEPRECATED=y | ||
| 43 | # CONFIG_RELAY is not set | ||
| 44 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 45 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 46 | CONFIG_SYSCTL=y | ||
| 47 | CONFIG_EMBEDDED=y | ||
| 48 | # CONFIG_UID16 is not set | ||
| 49 | CONFIG_SYSCTL_SYSCALL=y | ||
| 50 | CONFIG_KALLSYMS=y | ||
| 51 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 52 | # CONFIG_HOTPLUG is not set | ||
| 53 | CONFIG_PRINTK=y | ||
| 54 | CONFIG_BUG=y | ||
| 55 | CONFIG_ELF_CORE=y | ||
| 56 | CONFIG_BASE_FULL=y | ||
| 57 | CONFIG_FUTEX=y | ||
| 58 | CONFIG_ANON_INODES=y | ||
| 59 | CONFIG_EPOLL=y | ||
| 60 | CONFIG_SIGNALFD=y | ||
| 61 | CONFIG_EVENTFD=y | ||
| 62 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 63 | CONFIG_SLAB=y | ||
| 64 | # CONFIG_SLUB is not set | ||
| 65 | # CONFIG_SLOB is not set | ||
| 66 | CONFIG_SLABINFO=y | ||
| 67 | CONFIG_RT_MUTEXES=y | ||
| 68 | CONFIG_TINY_SHMEM=y | ||
| 69 | CONFIG_BASE_SMALL=0 | ||
| 70 | CONFIG_MODULES=y | ||
| 71 | CONFIG_MODULE_UNLOAD=y | ||
| 72 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
| 73 | # CONFIG_MODVERSIONS is not set | ||
| 74 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 75 | CONFIG_KMOD=y | ||
| 76 | CONFIG_BLOCK=y | ||
| 77 | # CONFIG_LBD is not set | ||
| 78 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 79 | # CONFIG_LSF is not set | ||
| 80 | # CONFIG_BLK_DEV_BSG is not set | ||
| 81 | |||
| 82 | # | ||
| 83 | # IO Schedulers | ||
| 84 | # | ||
| 85 | CONFIG_IOSCHED_NOOP=y | ||
| 86 | # CONFIG_IOSCHED_AS is not set | ||
| 87 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 88 | CONFIG_IOSCHED_CFQ=y | ||
| 89 | # CONFIG_DEFAULT_AS is not set | ||
| 90 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 91 | # CONFIG_DEFAULT_CFQ is not set | ||
| 92 | CONFIG_DEFAULT_NOOP=y | ||
| 93 | CONFIG_DEFAULT_IOSCHED="noop" | ||
| 94 | CONFIG_PREEMPT_NONE=y | ||
| 95 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 96 | # CONFIG_PREEMPT is not set | ||
| 97 | |||
| 98 | # | ||
| 99 | # Blackfin Processor Options | ||
| 100 | # | ||
| 101 | |||
| 102 | # | ||
| 103 | # Processor and Board Settings | ||
| 104 | # | ||
| 105 | # CONFIG_BF522 is not set | ||
| 106 | # CONFIG_BF523 is not set | ||
| 107 | # CONFIG_BF524 is not set | ||
| 108 | # CONFIG_BF525 is not set | ||
| 109 | # CONFIG_BF526 is not set | ||
| 110 | # CONFIG_BF527 is not set | ||
| 111 | # CONFIG_BF531 is not set | ||
| 112 | # CONFIG_BF532 is not set | ||
| 113 | # CONFIG_BF533 is not set | ||
| 114 | # CONFIG_BF534 is not set | ||
| 115 | # CONFIG_BF536 is not set | ||
| 116 | CONFIG_BF537=y | ||
| 117 | # CONFIG_BF542 is not set | ||
| 118 | # CONFIG_BF544 is not set | ||
| 119 | # CONFIG_BF547 is not set | ||
| 120 | # CONFIG_BF548 is not set | ||
| 121 | # CONFIG_BF549 is not set | ||
| 122 | # CONFIG_BF561 is not set | ||
| 123 | # CONFIG_BF_REV_0_0 is not set | ||
| 124 | # CONFIG_BF_REV_0_1 is not set | ||
| 125 | CONFIG_BF_REV_0_2=y | ||
| 126 | # CONFIG_BF_REV_0_3 is not set | ||
| 127 | # CONFIG_BF_REV_0_4 is not set | ||
| 128 | # CONFIG_BF_REV_0_5 is not set | ||
| 129 | # CONFIG_BF_REV_ANY is not set | ||
| 130 | # CONFIG_BF_REV_NONE is not set | ||
| 131 | CONFIG_BF53x=y | ||
| 132 | CONFIG_IRQ_PLL_WAKEUP=7 | ||
| 133 | CONFIG_IRQ_RTC=8 | ||
| 134 | CONFIG_IRQ_PPI=8 | ||
| 135 | CONFIG_IRQ_SPORT0_RX=9 | ||
| 136 | CONFIG_IRQ_SPORT0_TX=9 | ||
| 137 | CONFIG_IRQ_SPORT1_RX=9 | ||
| 138 | CONFIG_IRQ_SPORT1_TX=9 | ||
| 139 | CONFIG_IRQ_TWI=10 | ||
| 140 | CONFIG_IRQ_SPI=10 | ||
| 141 | CONFIG_IRQ_UART0_RX=10 | ||
| 142 | CONFIG_IRQ_UART0_TX=10 | ||
| 143 | CONFIG_IRQ_UART1_RX=10 | ||
| 144 | CONFIG_IRQ_UART1_TX=10 | ||
| 145 | CONFIG_IRQ_MAC_RX=11 | ||
| 146 | CONFIG_IRQ_MAC_TX=11 | ||
| 147 | CONFIG_IRQ_TMR0=12 | ||
| 148 | CONFIG_IRQ_TMR1=12 | ||
| 149 | CONFIG_IRQ_TMR2=12 | ||
| 150 | CONFIG_IRQ_TMR3=12 | ||
| 151 | CONFIG_IRQ_TMR4=12 | ||
| 152 | CONFIG_IRQ_TMR5=12 | ||
| 153 | CONFIG_IRQ_TMR6=12 | ||
| 154 | CONFIG_IRQ_TMR7=12 | ||
| 155 | CONFIG_IRQ_PORTG_INTB=12 | ||
| 156 | CONFIG_IRQ_MEM_DMA0=13 | ||
| 157 | CONFIG_IRQ_MEM_DMA1=13 | ||
| 158 | CONFIG_IRQ_WATCH=13 | ||
| 159 | # CONFIG_BFIN537_STAMP is not set | ||
| 160 | # CONFIG_BFIN537_BLUETECHNIX_CM is not set | ||
| 161 | CONFIG_BFIN537_BLUETECHNIX_TCM=y | ||
| 162 | # CONFIG_PNAV10 is not set | ||
| 163 | # CONFIG_CAMSIG_MINOTAUR is not set | ||
| 164 | # CONFIG_GENERIC_BF537_BOARD is not set | ||
| 165 | |||
| 166 | # | ||
| 167 | # BF537 Specific Configuration | ||
| 168 | # | ||
| 169 | |||
| 170 | # | ||
| 171 | # Interrupt Priority Assignment | ||
| 172 | # | ||
| 173 | |||
| 174 | # | ||
| 175 | # Priority | ||
| 176 | # | ||
| 177 | CONFIG_IRQ_DMA_ERROR=7 | ||
| 178 | CONFIG_IRQ_ERROR=7 | ||
| 179 | CONFIG_IRQ_CAN_RX=11 | ||
| 180 | CONFIG_IRQ_CAN_TX=11 | ||
| 181 | CONFIG_IRQ_PROG_INTA=12 | ||
| 182 | |||
| 183 | # | ||
| 184 | # Board customizations | ||
| 185 | # | ||
| 186 | # CONFIG_CMDLINE_BOOL is not set | ||
| 187 | CONFIG_BOOT_LOAD=0x1000 | ||
| 188 | |||
| 189 | # | ||
| 190 | # Clock/PLL Setup | ||
| 191 | # | ||
| 192 | CONFIG_CLKIN_HZ=25000000 | ||
| 193 | # CONFIG_BFIN_KERNEL_CLOCK is not set | ||
| 194 | CONFIG_MAX_MEM_SIZE=32 | ||
| 195 | CONFIG_MAX_VCO_HZ=600000000 | ||
| 196 | CONFIG_MIN_VCO_HZ=50000000 | ||
| 197 | CONFIG_MAX_SCLK_HZ=133333333 | ||
| 198 | CONFIG_MIN_SCLK_HZ=27000000 | ||
| 199 | |||
| 200 | # | ||
| 201 | # Kernel Timer/Scheduler | ||
| 202 | # | ||
| 203 | # CONFIG_HZ_100 is not set | ||
| 204 | CONFIG_HZ_250=y | ||
| 205 | # CONFIG_HZ_300 is not set | ||
| 206 | # CONFIG_HZ_1000 is not set | ||
| 207 | CONFIG_HZ=250 | ||
| 208 | CONFIG_GENERIC_TIME=y | ||
| 209 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 210 | # CONFIG_CYCLES_CLOCKSOURCE is not set | ||
| 211 | # CONFIG_TICK_ONESHOT is not set | ||
| 212 | # CONFIG_NO_HZ is not set | ||
| 213 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 214 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 215 | |||
| 216 | # | ||
| 217 | # Misc | ||
| 218 | # | ||
| 219 | CONFIG_BFIN_SCRATCH_REG_RETN=y | ||
| 220 | # CONFIG_BFIN_SCRATCH_REG_RETE is not set | ||
| 221 | # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set | ||
| 222 | |||
| 223 | # | ||
| 224 | # Blackfin Kernel Optimizations | ||
| 225 | # | ||
| 226 | |||
| 227 | # | ||
| 228 | # Memory Optimizations | ||
| 229 | # | ||
| 230 | CONFIG_I_ENTRY_L1=y | ||
| 231 | CONFIG_EXCPT_IRQ_SYSC_L1=y | ||
| 232 | CONFIG_DO_IRQ_L1=y | ||
| 233 | CONFIG_CORE_TIMER_IRQ_L1=y | ||
| 234 | CONFIG_IDLE_L1=y | ||
| 235 | CONFIG_SCHEDULE_L1=y | ||
| 236 | CONFIG_ARITHMETIC_OPS_L1=y | ||
| 237 | CONFIG_ACCESS_OK_L1=y | ||
| 238 | CONFIG_MEMSET_L1=y | ||
| 239 | CONFIG_MEMCPY_L1=y | ||
| 240 | CONFIG_SYS_BFIN_SPINLOCK_L1=y | ||
| 241 | CONFIG_IP_CHECKSUM_L1=y | ||
| 242 | CONFIG_CACHELINE_ALIGNED_L1=y | ||
| 243 | CONFIG_SYSCALL_TAB_L1=y | ||
| 244 | CONFIG_CPLB_SWITCH_TAB_L1=y | ||
| 245 | CONFIG_RAMKERNEL=y | ||
| 246 | # CONFIG_ROMKERNEL is not set | ||
| 247 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 248 | CONFIG_FLATMEM_MANUAL=y | ||
| 249 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 250 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 251 | CONFIG_FLATMEM=y | ||
| 252 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 253 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 254 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 255 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 256 | # CONFIG_RESOURCES_64BIT is not set | ||
| 257 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 258 | CONFIG_VIRT_TO_BUS=y | ||
| 259 | # CONFIG_BFIN_GPTIMERS is not set | ||
| 260 | CONFIG_BFIN_DMA_5XX=y | ||
| 261 | # CONFIG_DMA_UNCACHED_4M is not set | ||
| 262 | # CONFIG_DMA_UNCACHED_2M is not set | ||
| 263 | CONFIG_DMA_UNCACHED_1M=y | ||
| 264 | # CONFIG_DMA_UNCACHED_NONE is not set | ||
| 265 | |||
| 266 | # | ||
| 267 | # Cache Support | ||
| 268 | # | ||
| 269 | CONFIG_BFIN_ICACHE=y | ||
| 270 | CONFIG_BFIN_DCACHE=y | ||
| 271 | # CONFIG_BFIN_DCACHE_BANKA is not set | ||
| 272 | # CONFIG_BFIN_ICACHE_LOCK is not set | ||
| 273 | CONFIG_BFIN_WB=y | ||
| 274 | # CONFIG_BFIN_WT is not set | ||
| 275 | # CONFIG_MPU is not set | ||
| 276 | |||
| 277 | # | ||
| 278 | # Asynchonous Memory Configuration | ||
| 279 | # | ||
| 280 | |||
| 281 | # | ||
| 282 | # EBIU_AMGCTL Global Control | ||
| 283 | # | ||
| 284 | CONFIG_C_AMCKEN=y | ||
| 285 | CONFIG_C_CDPRIO=y | ||
| 286 | # CONFIG_C_AMBEN is not set | ||
| 287 | # CONFIG_C_AMBEN_B0 is not set | ||
| 288 | # CONFIG_C_AMBEN_B0_B1 is not set | ||
| 289 | # CONFIG_C_AMBEN_B0_B1_B2 is not set | ||
| 290 | CONFIG_C_AMBEN_ALL=y | ||
| 291 | |||
| 292 | # | ||
| 293 | # EBIU_AMBCTL Control | ||
| 294 | # | ||
| 295 | CONFIG_BANK_0=0x7BB0 | ||
| 296 | CONFIG_BANK_1=0x7BB0 | ||
| 297 | CONFIG_BANK_2=0x7BB0 | ||
| 298 | CONFIG_BANK_3=0xFFC2 | ||
| 299 | |||
| 300 | # | ||
| 301 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
| 302 | # | ||
| 303 | # CONFIG_PCI is not set | ||
| 304 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 305 | |||
| 306 | # | ||
| 307 | # Executable file formats | ||
| 308 | # | ||
| 309 | CONFIG_BINFMT_ELF_FDPIC=y | ||
| 310 | CONFIG_BINFMT_FLAT=y | ||
| 311 | CONFIG_BINFMT_ZFLAT=y | ||
| 312 | CONFIG_BINFMT_SHARED_FLAT=y | ||
| 313 | # CONFIG_BINFMT_MISC is not set | ||
| 314 | |||
| 315 | # | ||
| 316 | # Power management options | ||
| 317 | # | ||
| 318 | # CONFIG_PM is not set | ||
| 319 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 320 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
| 321 | |||
| 322 | # | ||
| 323 | # CPU Frequency scaling | ||
| 324 | # | ||
| 325 | # CONFIG_CPU_FREQ is not set | ||
| 326 | |||
| 327 | # | ||
| 328 | # Networking | ||
| 329 | # | ||
| 330 | # CONFIG_NET is not set | ||
| 331 | |||
| 332 | # | ||
| 333 | # Device Drivers | ||
| 334 | # | ||
| 335 | |||
| 336 | # | ||
| 337 | # Generic Driver Options | ||
| 338 | # | ||
| 339 | CONFIG_STANDALONE=y | ||
| 340 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 341 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 342 | CONFIG_MTD=y | ||
| 343 | # CONFIG_MTD_DEBUG is not set | ||
| 344 | # CONFIG_MTD_CONCAT is not set | ||
| 345 | CONFIG_MTD_PARTITIONS=y | ||
| 346 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 347 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
| 348 | |||
| 349 | # | ||
| 350 | # User Modules And Translation Layers | ||
| 351 | # | ||
| 352 | CONFIG_MTD_CHAR=y | ||
| 353 | CONFIG_MTD_BLKDEVS=y | ||
| 354 | CONFIG_MTD_BLOCK=y | ||
| 355 | # CONFIG_FTL is not set | ||
| 356 | # CONFIG_NFTL is not set | ||
| 357 | # CONFIG_INFTL is not set | ||
| 358 | # CONFIG_RFD_FTL is not set | ||
| 359 | # CONFIG_SSFDC is not set | ||
| 360 | # CONFIG_MTD_OOPS is not set | ||
| 361 | |||
| 362 | # | ||
| 363 | # RAM/ROM/Flash chip drivers | ||
| 364 | # | ||
| 365 | # CONFIG_MTD_CFI is not set | ||
| 366 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 367 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 368 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 369 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 370 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 371 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 372 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 373 | CONFIG_MTD_CFI_I1=y | ||
| 374 | CONFIG_MTD_CFI_I2=y | ||
| 375 | # CONFIG_MTD_CFI_I4 is not set | ||
| 376 | # CONFIG_MTD_CFI_I8 is not set | ||
| 377 | CONFIG_MTD_RAM=y | ||
| 378 | # CONFIG_MTD_ROM is not set | ||
| 379 | # CONFIG_MTD_ABSENT is not set | ||
| 380 | |||
| 381 | # | ||
| 382 | # Mapping drivers for chip access | ||
| 383 | # | ||
| 384 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 385 | # CONFIG_MTD_GPIO_ADDR is not set | ||
| 386 | CONFIG_MTD_UCLINUX=y | ||
| 387 | # CONFIG_MTD_PLATRAM is not set | ||
| 388 | |||
| 389 | # | ||
| 390 | # Self-contained MTD device drivers | ||
| 391 | # | ||
| 392 | # CONFIG_MTD_DATAFLASH is not set | ||
| 393 | # CONFIG_MTD_M25P80 is not set | ||
| 394 | # CONFIG_MTD_SLRAM is not set | ||
| 395 | # CONFIG_MTD_PHRAM is not set | ||
| 396 | # CONFIG_MTD_MTDRAM is not set | ||
| 397 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 398 | |||
| 399 | # | ||
| 400 | # Disk-On-Chip Device Drivers | ||
| 401 | # | ||
| 402 | # CONFIG_MTD_DOC2000 is not set | ||
| 403 | # CONFIG_MTD_DOC2001 is not set | ||
| 404 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 405 | # CONFIG_MTD_NAND is not set | ||
| 406 | # CONFIG_MTD_ONENAND is not set | ||
| 407 | |||
| 408 | # | ||
| 409 | # UBI - Unsorted block images | ||
| 410 | # | ||
| 411 | # CONFIG_MTD_UBI is not set | ||
| 412 | # CONFIG_PARPORT is not set | ||
| 413 | CONFIG_BLK_DEV=y | ||
| 414 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 415 | # CONFIG_BLK_DEV_LOOP is not set | ||
| 416 | CONFIG_BLK_DEV_RAM=y | ||
| 417 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 418 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
| 419 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 420 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 421 | CONFIG_MISC_DEVICES=y | ||
| 422 | # CONFIG_EEPROM_93CX6 is not set | ||
| 423 | # CONFIG_IDE is not set | ||
| 424 | |||
| 425 | # | ||
| 426 | # SCSI device support | ||
| 427 | # | ||
| 428 | # CONFIG_RAID_ATTRS is not set | ||
| 429 | # CONFIG_SCSI is not set | ||
| 430 | # CONFIG_SCSI_DMA is not set | ||
| 431 | # CONFIG_SCSI_NETLINK is not set | ||
| 432 | # CONFIG_ATA is not set | ||
| 433 | # CONFIG_MD is not set | ||
| 434 | # CONFIG_PHONE is not set | ||
| 435 | |||
| 436 | # | ||
| 437 | # Input device support | ||
| 438 | # | ||
| 439 | # CONFIG_INPUT is not set | ||
| 440 | |||
| 441 | # | ||
| 442 | # Hardware I/O ports | ||
| 443 | # | ||
| 444 | # CONFIG_SERIO is not set | ||
| 445 | # CONFIG_GAMEPORT is not set | ||
| 446 | |||
| 447 | # | ||
| 448 | # Character devices | ||
| 449 | # | ||
| 450 | # CONFIG_AD9960 is not set | ||
| 451 | # CONFIG_SPI_ADC_BF533 is not set | ||
| 452 | # CONFIG_BF5xx_PPIFCD is not set | ||
| 453 | # CONFIG_BFIN_SIMPLE_TIMER is not set | ||
| 454 | # CONFIG_BF5xx_PPI is not set | ||
| 455 | CONFIG_BFIN_SPORT=y | ||
| 456 | # CONFIG_BFIN_TIMER_LATENCY is not set | ||
| 457 | # CONFIG_SIMPLE_GPIO is not set | ||
| 458 | # CONFIG_VT is not set | ||
| 459 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 460 | |||
| 461 | # | ||
| 462 | # Serial drivers | ||
| 463 | # | ||
| 464 | # CONFIG_SERIAL_8250 is not set | ||
| 465 | |||
| 466 | # | ||
| 467 | # Non-8250 serial port support | ||
| 468 | # | ||
| 469 | CONFIG_SERIAL_BFIN=y | ||
| 470 | CONFIG_SERIAL_BFIN_CONSOLE=y | ||
| 471 | CONFIG_SERIAL_BFIN_DMA=y | ||
| 472 | # CONFIG_SERIAL_BFIN_PIO is not set | ||
| 473 | CONFIG_SERIAL_BFIN_UART0=y | ||
| 474 | # CONFIG_BFIN_UART0_CTSRTS is not set | ||
| 475 | CONFIG_SERIAL_BFIN_UART1=y | ||
| 476 | # CONFIG_BFIN_UART1_CTSRTS is not set | ||
| 477 | CONFIG_SERIAL_CORE=y | ||
| 478 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 479 | # CONFIG_SERIAL_BFIN_SPORT is not set | ||
| 480 | CONFIG_UNIX98_PTYS=y | ||
| 481 | # CONFIG_LEGACY_PTYS is not set | ||
| 482 | |||
| 483 | # | ||
| 484 | # CAN, the car bus and industrial fieldbus | ||
| 485 | # | ||
| 486 | # CONFIG_CAN4LINUX is not set | ||
| 487 | # CONFIG_IPMI_HANDLER is not set | ||
| 488 | # CONFIG_HW_RANDOM is not set | ||
| 489 | # CONFIG_GEN_RTC is not set | ||
| 490 | # CONFIG_R3964 is not set | ||
| 491 | # CONFIG_RAW_DRIVER is not set | ||
| 492 | # CONFIG_TCG_TPM is not set | ||
| 493 | # CONFIG_I2C is not set | ||
| 494 | |||
| 495 | # | ||
| 496 | # SPI support | ||
| 497 | # | ||
| 498 | CONFIG_SPI=y | ||
| 499 | CONFIG_SPI_MASTER=y | ||
| 500 | |||
| 501 | # | ||
| 502 | # SPI Master Controller Drivers | ||
| 503 | # | ||
| 504 | CONFIG_SPI_BFIN=y | ||
| 505 | # CONFIG_SPI_BITBANG is not set | ||
| 506 | |||
| 507 | # | ||
| 508 | # SPI Protocol Masters | ||
| 509 | # | ||
| 510 | # CONFIG_SPI_AT25 is not set | ||
| 511 | # CONFIG_SPI_SPIDEV is not set | ||
| 512 | # CONFIG_SPI_TLE62X0 is not set | ||
| 513 | # CONFIG_W1 is not set | ||
| 514 | # CONFIG_POWER_SUPPLY is not set | ||
| 515 | # CONFIG_HWMON is not set | ||
| 516 | CONFIG_WATCHDOG=y | ||
| 517 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
| 518 | |||
| 519 | # | ||
| 520 | # Watchdog Device Drivers | ||
| 521 | # | ||
| 522 | # CONFIG_SOFT_WATCHDOG is not set | ||
| 523 | CONFIG_BFIN_WDT=y | ||
| 524 | |||
| 525 | # | ||
| 526 | # Sonics Silicon Backplane | ||
| 527 | # | ||
| 528 | CONFIG_SSB_POSSIBLE=y | ||
| 529 | # CONFIG_SSB is not set | ||
| 530 | |||
| 531 | # | ||
| 532 | # Multifunction device drivers | ||
| 533 | # | ||
| 534 | # CONFIG_MFD_SM501 is not set | ||
| 535 | |||
| 536 | # | ||
| 537 | # Multimedia devices | ||
| 538 | # | ||
| 539 | # CONFIG_VIDEO_DEV is not set | ||
| 540 | # CONFIG_DAB is not set | ||
| 541 | |||
| 542 | # | ||
| 543 | # Graphics support | ||
| 544 | # | ||
| 545 | # CONFIG_VGASTATE is not set | ||
| 546 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 547 | # CONFIG_FB is not set | ||
| 548 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 549 | |||
| 550 | # | ||
| 551 | # Display device support | ||
| 552 | # | ||
| 553 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 554 | |||
| 555 | # | ||
| 556 | # Sound | ||
| 557 | # | ||
| 558 | # CONFIG_SOUND is not set | ||
| 559 | # CONFIG_USB_SUPPORT is not set | ||
| 560 | # CONFIG_MMC is not set | ||
| 561 | # CONFIG_NEW_LEDS is not set | ||
| 562 | # CONFIG_RTC_CLASS is not set | ||
| 563 | |||
| 564 | # | ||
| 565 | # Userspace I/O | ||
| 566 | # | ||
| 567 | # CONFIG_UIO is not set | ||
| 568 | |||
| 569 | # | ||
| 570 | # File systems | ||
| 571 | # | ||
| 572 | CONFIG_EXT2_FS=y | ||
| 573 | CONFIG_EXT2_FS_XATTR=y | ||
| 574 | # CONFIG_EXT2_FS_POSIX_ACL is not set | ||
| 575 | # CONFIG_EXT2_FS_SECURITY is not set | ||
| 576 | # CONFIG_EXT3_FS is not set | ||
| 577 | # CONFIG_EXT4DEV_FS is not set | ||
| 578 | CONFIG_FS_MBCACHE=y | ||
| 579 | # CONFIG_REISERFS_FS is not set | ||
| 580 | # CONFIG_JFS_FS is not set | ||
| 581 | # CONFIG_FS_POSIX_ACL is not set | ||
| 582 | # CONFIG_XFS_FS is not set | ||
| 583 | # CONFIG_GFS2_FS is not set | ||
| 584 | # CONFIG_MINIX_FS is not set | ||
| 585 | # CONFIG_ROMFS_FS is not set | ||
| 586 | CONFIG_INOTIFY=y | ||
| 587 | CONFIG_INOTIFY_USER=y | ||
| 588 | # CONFIG_QUOTA is not set | ||
| 589 | # CONFIG_DNOTIFY is not set | ||
| 590 | # CONFIG_AUTOFS_FS is not set | ||
| 591 | # CONFIG_AUTOFS4_FS is not set | ||
| 592 | # CONFIG_FUSE_FS is not set | ||
| 593 | |||
| 594 | # | ||
| 595 | # CD-ROM/DVD Filesystems | ||
| 596 | # | ||
| 597 | # CONFIG_ISO9660_FS is not set | ||
| 598 | # CONFIG_UDF_FS is not set | ||
| 599 | |||
| 600 | # | ||
| 601 | # DOS/FAT/NT Filesystems | ||
| 602 | # | ||
| 603 | # CONFIG_MSDOS_FS is not set | ||
| 604 | # CONFIG_VFAT_FS is not set | ||
| 605 | # CONFIG_NTFS_FS is not set | ||
| 606 | |||
| 607 | # | ||
| 608 | # Pseudo filesystems | ||
| 609 | # | ||
| 610 | CONFIG_PROC_FS=y | ||
| 611 | CONFIG_PROC_SYSCTL=y | ||
| 612 | CONFIG_SYSFS=y | ||
| 613 | # CONFIG_TMPFS is not set | ||
| 614 | # CONFIG_HUGETLB_PAGE is not set | ||
| 615 | # CONFIG_CONFIGFS_FS is not set | ||
| 616 | |||
| 617 | # | ||
| 618 | # Miscellaneous filesystems | ||
| 619 | # | ||
| 620 | # CONFIG_ADFS_FS is not set | ||
| 621 | # CONFIG_AFFS_FS is not set | ||
| 622 | # CONFIG_HFS_FS is not set | ||
| 623 | # CONFIG_HFSPLUS_FS is not set | ||
| 624 | # CONFIG_BEFS_FS is not set | ||
| 625 | # CONFIG_BFS_FS is not set | ||
| 626 | # CONFIG_EFS_FS is not set | ||
| 627 | # CONFIG_YAFFS_FS is not set | ||
| 628 | # CONFIG_JFFS2_FS is not set | ||
| 629 | # CONFIG_CRAMFS is not set | ||
| 630 | # CONFIG_VXFS_FS is not set | ||
| 631 | # CONFIG_HPFS_FS is not set | ||
| 632 | # CONFIG_QNX4FS_FS is not set | ||
| 633 | # CONFIG_SYSV_FS is not set | ||
| 634 | # CONFIG_UFS_FS is not set | ||
| 635 | |||
| 636 | # | ||
| 637 | # Partition Types | ||
| 638 | # | ||
| 639 | # CONFIG_PARTITION_ADVANCED is not set | ||
| 640 | CONFIG_MSDOS_PARTITION=y | ||
| 641 | # CONFIG_NLS is not set | ||
| 642 | # CONFIG_INSTRUMENTATION is not set | ||
| 643 | |||
| 644 | # | ||
| 645 | # Kernel hacking | ||
| 646 | # | ||
| 647 | # CONFIG_PRINTK_TIME is not set | ||
| 648 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 649 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 650 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 651 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 652 | CONFIG_DEBUG_FS=y | ||
| 653 | # CONFIG_HEADERS_CHECK is not set | ||
| 654 | # CONFIG_DEBUG_KERNEL is not set | ||
| 655 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 656 | # CONFIG_SAMPLES is not set | ||
| 657 | CONFIG_DEBUG_MMRS=y | ||
| 658 | CONFIG_DEBUG_HUNT_FOR_ZERO=y | ||
| 659 | CONFIG_DEBUG_BFIN_HWTRACE_ON=y | ||
| 660 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y | ||
| 661 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set | ||
| 662 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set | ||
| 663 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0 | ||
| 664 | # CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set | ||
| 665 | # CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set | ||
| 666 | # CONFIG_EARLY_PRINTK is not set | ||
| 667 | CONFIG_CPLB_INFO=y | ||
| 668 | CONFIG_ACCESS_CHECK=y | ||
| 669 | |||
| 670 | # | ||
| 671 | # Security options | ||
| 672 | # | ||
| 673 | # CONFIG_KEYS is not set | ||
| 674 | CONFIG_SECURITY=y | ||
| 675 | # CONFIG_SECURITY_NETWORK is not set | ||
| 676 | CONFIG_SECURITY_CAPABILITIES=y | ||
| 677 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 678 | # CONFIG_CRYPTO is not set | ||
| 679 | |||
| 680 | # | ||
| 681 | # Library routines | ||
| 682 | # | ||
| 683 | # CONFIG_CRC_CCITT is not set | ||
| 684 | # CONFIG_CRC16 is not set | ||
| 685 | # CONFIG_CRC_ITU_T is not set | ||
| 686 | # CONFIG_CRC32 is not set | ||
| 687 | # CONFIG_CRC7 is not set | ||
| 688 | # CONFIG_LIBCRC32C is not set | ||
| 689 | CONFIG_ZLIB_INFLATE=y | ||
| 690 | CONFIG_PLIST=y | ||
| 691 | CONFIG_HAS_IOMEM=y | ||
| 692 | CONFIG_HAS_IOPORT=y | ||
| 693 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/blackfin/kernel/cplb-mpu/cacheinit.c b/arch/blackfin/kernel/cplb-mpu/cacheinit.c index 9eecfa403187..a8b712a24c59 100644 --- a/arch/blackfin/kernel/cplb-mpu/cacheinit.c +++ b/arch/blackfin/kernel/cplb-mpu/cacheinit.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/cplbinit.h> | 25 | #include <asm/cplbinit.h> |
| 26 | 26 | ||
| 27 | #if defined(CONFIG_BFIN_ICACHE) | 27 | #if defined(CONFIG_BFIN_ICACHE) |
| 28 | void bfin_icache_init(void) | 28 | void __init bfin_icache_init(void) |
| 29 | { | 29 | { |
| 30 | unsigned long ctrl; | 30 | unsigned long ctrl; |
| 31 | int i; | 31 | int i; |
| @@ -43,7 +43,7 @@ void bfin_icache_init(void) | |||
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | #if defined(CONFIG_BFIN_DCACHE) | 45 | #if defined(CONFIG_BFIN_DCACHE) |
| 46 | void bfin_dcache_init(void) | 46 | void __init bfin_dcache_init(void) |
| 47 | { | 47 | { |
| 48 | unsigned long ctrl; | 48 | unsigned long ctrl; |
| 49 | int i; | 49 | int i; |
diff --git a/arch/blackfin/kernel/cplb-nompu/cacheinit.c b/arch/blackfin/kernel/cplb-nompu/cacheinit.c index 8a18399f6072..bd0831592c2c 100644 --- a/arch/blackfin/kernel/cplb-nompu/cacheinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cacheinit.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/cplbinit.h> | 25 | #include <asm/cplbinit.h> |
| 26 | 26 | ||
| 27 | #if defined(CONFIG_BFIN_ICACHE) | 27 | #if defined(CONFIG_BFIN_ICACHE) |
| 28 | void bfin_icache_init(void) | 28 | void __init bfin_icache_init(void) |
| 29 | { | 29 | { |
| 30 | unsigned long *table = icplb_table; | 30 | unsigned long *table = icplb_table; |
| 31 | unsigned long ctrl; | 31 | unsigned long ctrl; |
| @@ -47,7 +47,7 @@ void bfin_icache_init(void) | |||
| 47 | #endif | 47 | #endif |
| 48 | 48 | ||
| 49 | #if defined(CONFIG_BFIN_DCACHE) | 49 | #if defined(CONFIG_BFIN_DCACHE) |
| 50 | void bfin_dcache_init(void) | 50 | void __init bfin_dcache_init(void) |
| 51 | { | 51 | { |
| 52 | unsigned long *table = dcplb_table; | 52 | unsigned long *table = dcplb_table; |
| 53 | unsigned long ctrl; | 53 | unsigned long ctrl; |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 224e7cc30bc5..728f708d3981 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
| @@ -164,17 +164,13 @@ static struct cplb_desc cplb_data[] = { | |||
| 164 | .name = "Asynchronous Memory Banks", | 164 | .name = "Asynchronous Memory Banks", |
| 165 | }, | 165 | }, |
| 166 | { | 166 | { |
| 167 | #ifdef L2_START | ||
| 168 | .start = L2_START, | 167 | .start = L2_START, |
| 169 | .end = L2_START + L2_LENGTH, | 168 | .end = L2_START + L2_LENGTH, |
| 170 | .psize = SIZE_1M, | 169 | .psize = SIZE_1M, |
| 171 | .attr = SWITCH_T | I_CPLB | D_CPLB, | 170 | .attr = SWITCH_T | I_CPLB | D_CPLB, |
| 172 | .i_conf = L2_MEMORY, | 171 | .i_conf = L2_MEMORY, |
| 173 | .d_conf = L2_MEMORY, | 172 | .d_conf = L2_MEMORY, |
| 174 | .valid = 1, | 173 | .valid = (L2_LENGTH > 0), |
| 175 | #else | ||
| 176 | .valid = 0, | ||
| 177 | #endif | ||
| 178 | .name = "L2 Memory", | 174 | .name = "L2 Memory", |
| 179 | }, | 175 | }, |
| 180 | { | 176 | { |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 23e637eb78da..7a82d10b4ebf 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
| @@ -52,6 +52,7 @@ EXPORT_SYMBOL(mtd_size); | |||
| 52 | #endif | 52 | #endif |
| 53 | 53 | ||
| 54 | char __initdata command_line[COMMAND_LINE_SIZE]; | 54 | char __initdata command_line[COMMAND_LINE_SIZE]; |
| 55 | unsigned int __initdata *__retx; | ||
| 55 | 56 | ||
| 56 | /* boot memmap, for parsing "memmap=" */ | 57 | /* boot memmap, for parsing "memmap=" */ |
| 57 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ | 58 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ |
| @@ -131,14 +132,14 @@ void __init bf53x_relocate_l1_mem(void) | |||
| 131 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + | 132 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + |
| 132 | l1_data_a_length, l1_data_b_length); | 133 | l1_data_a_length, l1_data_b_length); |
| 133 | 134 | ||
| 134 | #ifdef L2_LENGTH | 135 | if (L2_LENGTH != 0) { |
| 135 | l2_length = _ebss_l2 - _stext_l2; | 136 | l2_length = _ebss_l2 - _stext_l2; |
| 136 | if (l2_length > L2_LENGTH) | 137 | if (l2_length > L2_LENGTH) |
| 137 | panic("L2 SRAM Overflow\n"); | 138 | panic("L2 SRAM Overflow\n"); |
| 138 | 139 | ||
| 139 | /* Copy _stext_l2 to _edata_l2 to L2 SRAM */ | 140 | /* Copy _stext_l2 to _edata_l2 to L2 SRAM */ |
| 140 | dma_memcpy(_stext_l2, _l2_lma_start, l2_length); | 141 | dma_memcpy(_stext_l2, _l2_lma_start, l2_length); |
| 141 | #endif | 142 | } |
| 142 | } | 143 | } |
| 143 | 144 | ||
| 144 | /* add_memory_region to memmap */ | 145 | /* add_memory_region to memmap */ |
| @@ -738,6 +739,16 @@ void __init setup_arch(char **cmdline_p) | |||
| 738 | 739 | ||
| 739 | memory_setup(); | 740 | memory_setup(); |
| 740 | 741 | ||
| 742 | /* Initialize Async memory banks */ | ||
| 743 | bfin_write_EBIU_AMBCTL0(AMBCTL0VAL); | ||
| 744 | bfin_write_EBIU_AMBCTL1(AMBCTL1VAL); | ||
| 745 | bfin_write_EBIU_AMGCTL(AMGCTLVAL); | ||
| 746 | #ifdef CONFIG_EBIU_MBSCTLVAL | ||
| 747 | bfin_write_EBIU_MBSCTL(CONFIG_EBIU_MBSCTLVAL); | ||
| 748 | bfin_write_EBIU_MODE(CONFIG_EBIU_MODEVAL); | ||
| 749 | bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL); | ||
| 750 | #endif | ||
| 751 | |||
| 741 | cclk = get_cclk(); | 752 | cclk = get_cclk(); |
| 742 | sclk = get_sclk(); | 753 | sclk = get_sclk(); |
| 743 | 754 | ||
| @@ -775,7 +786,11 @@ void __init setup_arch(char **cmdline_p) | |||
| 775 | bfin_write_SWRST(DOUBLE_FAULT); | 786 | bfin_write_SWRST(DOUBLE_FAULT); |
| 776 | 787 | ||
| 777 | if (_bfin_swrst & RESET_DOUBLE) | 788 | if (_bfin_swrst & RESET_DOUBLE) |
| 778 | printk(KERN_INFO "Recovering from Double Fault event\n"); | 789 | /* |
| 790 | * don't decode the address, since you don't know if this | ||
| 791 | * kernel's symbol map is the same as the crashing kernel | ||
| 792 | */ | ||
| 793 | printk(KERN_INFO "Recovering from Double Fault event at %pF\n", __retx); | ||
| 779 | else if (_bfin_swrst & RESET_WDOG) | 794 | else if (_bfin_swrst & RESET_WDOG) |
| 780 | printk(KERN_INFO "Recovering from Watchdog event\n"); | 795 | printk(KERN_INFO "Recovering from Watchdog event\n"); |
| 781 | else if (_bfin_swrst & RESET_SOFTWARE) | 796 | else if (_bfin_swrst & RESET_SOFTWARE) |
| @@ -1049,7 +1064,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 1049 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, | 1064 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, |
| 1050 | BFIN_DLINES); | 1065 | BFIN_DLINES); |
| 1051 | #ifdef CONFIG_BFIN_ICACHE_LOCK | 1066 | #ifdef CONFIG_BFIN_ICACHE_LOCK |
| 1052 | switch (read_iloc()) { | 1067 | switch ((bfin_read_IMEM_CONTROL() >> 3) & WAYALL_L) { |
| 1053 | case WAY0_L: | 1068 | case WAY0_L: |
| 1054 | seq_printf(m, "Way0 Locked-Down\n"); | 1069 | seq_printf(m, "Way0 Locked-Down\n"); |
| 1055 | break; | 1070 | break; |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index ad922ab91543..9a9d5083acfd 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
| @@ -567,7 +567,7 @@ bool get_instruction(unsigned short *val, unsigned short *address) | |||
| 567 | * we don't read something in the async space that can hang forever | 567 | * we don't read something in the async space that can hang forever |
| 568 | */ | 568 | */ |
| 569 | if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) || | 569 | if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) || |
| 570 | #ifdef L2_START | 570 | #if L2_LENGTH != 0 |
| 571 | (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) || | 571 | (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) || |
| 572 | #endif | 572 | #endif |
| 573 | (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) || | 573 | (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) || |
| @@ -601,12 +601,55 @@ bool get_instruction(unsigned short *val, unsigned short *address) | |||
| 601 | return false; | 601 | return false; |
| 602 | } | 602 | } |
| 603 | 603 | ||
| 604 | /* | ||
| 605 | * decode the instruction if we are printing out the trace, as it | ||
| 606 | * makes things easier to follow, without running it through objdump | ||
| 607 | * These are the normal instructions which cause change of flow, which | ||
| 608 | * would be at the source of the trace buffer | ||
| 609 | */ | ||
| 610 | void decode_instruction(unsigned short *address) | ||
| 611 | { | ||
| 612 | unsigned short opcode; | ||
| 613 | |||
| 614 | if (get_instruction(&opcode, address)) { | ||
| 615 | if (opcode == 0x0010) | ||
| 616 | printk("RTS"); | ||
| 617 | else if (opcode == 0x0011) | ||
| 618 | printk("RTI"); | ||
| 619 | else if (opcode == 0x0012) | ||
| 620 | printk("RTX"); | ||
| 621 | else if (opcode >= 0x0050 && opcode <= 0x0057) | ||
| 622 | printk("JUMP (P%i)", opcode & 7); | ||
| 623 | else if (opcode >= 0x0060 && opcode <= 0x0067) | ||
| 624 | printk("CALL (P%i)", opcode & 7); | ||
| 625 | else if (opcode >= 0x0070 && opcode <= 0x0077) | ||
| 626 | printk("CALL (PC+P%i)", opcode & 7); | ||
| 627 | else if (opcode >= 0x0080 && opcode <= 0x0087) | ||
| 628 | printk("JUMP (PC+P%i)", opcode & 7); | ||
| 629 | else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF)) | ||
| 630 | printk("IF !CC JUMP"); | ||
| 631 | else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) | ||
| 632 | printk("IF CC JUMP"); | ||
| 633 | else if (opcode >= 0x2000 && opcode <= 0x2fff) | ||
| 634 | printk("JUMP.S"); | ||
| 635 | else if (opcode >= 0xe080 && opcode <= 0xe0ff) | ||
| 636 | printk("LSETUP"); | ||
| 637 | else if (opcode >= 0xe200 && opcode <= 0xe2ff) | ||
| 638 | printk("JUMP.L"); | ||
| 639 | else if (opcode >= 0xe300 && opcode <= 0xe3ff) | ||
| 640 | printk("CALL pcrel"); | ||
| 641 | else | ||
| 642 | printk("0x%04x", opcode); | ||
| 643 | } | ||
| 644 | |||
| 645 | } | ||
| 646 | |||
| 604 | void dump_bfin_trace_buffer(void) | 647 | void dump_bfin_trace_buffer(void) |
| 605 | { | 648 | { |
| 606 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON | 649 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON |
| 607 | int tflags, i = 0; | 650 | int tflags, i = 0; |
| 608 | char buf[150]; | 651 | char buf[150]; |
| 609 | unsigned short val = 0, *addr; | 652 | unsigned short *addr; |
| 610 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | 653 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND |
| 611 | int j, index; | 654 | int j, index; |
| 612 | #endif | 655 | #endif |
| @@ -615,6 +658,10 @@ void dump_bfin_trace_buffer(void) | |||
| 615 | 658 | ||
| 616 | printk(KERN_NOTICE "Hardware Trace:\n"); | 659 | printk(KERN_NOTICE "Hardware Trace:\n"); |
| 617 | 660 | ||
| 661 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | ||
| 662 | printk(KERN_NOTICE "WARNING: Expanded trace turned on - can not trace exceptions\n"); | ||
| 663 | #endif | ||
| 664 | |||
| 618 | if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) { | 665 | if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) { |
| 619 | for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) { | 666 | for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) { |
| 620 | decode_address(buf, (unsigned long)bfin_read_TBUF()); | 667 | decode_address(buf, (unsigned long)bfin_read_TBUF()); |
| @@ -622,45 +669,14 @@ void dump_bfin_trace_buffer(void) | |||
| 622 | addr = (unsigned short *)bfin_read_TBUF(); | 669 | addr = (unsigned short *)bfin_read_TBUF(); |
| 623 | decode_address(buf, (unsigned long)addr); | 670 | decode_address(buf, (unsigned long)addr); |
| 624 | printk(KERN_NOTICE " Source : %s ", buf); | 671 | printk(KERN_NOTICE " Source : %s ", buf); |
| 625 | if (get_instruction(&val, addr)) { | 672 | decode_instruction(addr); |
| 626 | if (val == 0x0010) | ||
| 627 | printk("RTS"); | ||
| 628 | else if (val == 0x0011) | ||
| 629 | printk("RTI"); | ||
| 630 | else if (val == 0x0012) | ||
| 631 | printk("RTX"); | ||
| 632 | else if (val >= 0x0050 && val <= 0x0057) | ||
| 633 | printk("JUMP (P%i)", val & 7); | ||
| 634 | else if (val >= 0x0060 && val <= 0x0067) | ||
| 635 | printk("CALL (P%i)", val & 7); | ||
| 636 | else if (val >= 0x0070 && val <= 0x0077) | ||
| 637 | printk("CALL (PC+P%i)", val & 7); | ||
| 638 | else if (val >= 0x0080 && val <= 0x0087) | ||
| 639 | printk("JUMP (PC+P%i)", val & 7); | ||
| 640 | else if ((val >= 0x1000 && val <= 0x13FF) || | ||
| 641 | (val >= 0x1800 && val <= 0x1BFF)) | ||
| 642 | printk("IF !CC JUMP"); | ||
| 643 | else if ((val >= 0x1400 && val <= 0x17ff) || | ||
| 644 | (val >= 0x1c00 && val <= 0x1fff)) | ||
| 645 | printk("IF CC JUMP"); | ||
| 646 | else if (val >= 0x2000 && val <= 0x2fff) | ||
| 647 | printk("JUMP.S"); | ||
| 648 | else if (val >= 0xe080 && val <= 0xe0ff) | ||
| 649 | printk("LSETUP"); | ||
| 650 | else if (val >= 0xe200 && val <= 0xe2ff) | ||
| 651 | printk("JUMP.L"); | ||
| 652 | else if (val >= 0xe300 && val <= 0xe3ff) | ||
| 653 | printk("CALL pcrel"); | ||
| 654 | else | ||
| 655 | printk("0x%04x", val); | ||
| 656 | } | ||
| 657 | printk("\n"); | 673 | printk("\n"); |
| 658 | } | 674 | } |
| 659 | } | 675 | } |
| 660 | 676 | ||
| 661 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | 677 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND |
| 662 | if (trace_buff_offset) | 678 | if (trace_buff_offset) |
| 663 | index = trace_buff_offset/4 - 1; | 679 | index = trace_buff_offset / 4; |
| 664 | else | 680 | else |
| 665 | index = EXPAND_LEN; | 681 | index = EXPAND_LEN; |
| 666 | 682 | ||
| @@ -672,7 +688,9 @@ void dump_bfin_trace_buffer(void) | |||
| 672 | if (index < 0 ) | 688 | if (index < 0 ) |
| 673 | index = EXPAND_LEN; | 689 | index = EXPAND_LEN; |
| 674 | decode_address(buf, software_trace_buff[index]); | 690 | decode_address(buf, software_trace_buff[index]); |
| 675 | printk(KERN_NOTICE " Source : %s\n", buf); | 691 | printk(KERN_NOTICE " Source : %s ", buf); |
| 692 | decode_instruction((unsigned short *)software_trace_buff[index]); | ||
| 693 | printk("\n"); | ||
| 676 | index -= 1; | 694 | index -= 1; |
| 677 | if (index < 0) | 695 | if (index < 0) |
| 678 | index = EXPAND_LEN; | 696 | index = EXPAND_LEN; |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index 0896e38d6108..7d12c6692a65 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
| @@ -83,6 +83,7 @@ SECTIONS | |||
| 83 | #if !L1_DATA_B_LENGTH | 83 | #if !L1_DATA_B_LENGTH |
| 84 | *(.l1.bss.B) | 84 | *(.l1.bss.B) |
| 85 | #endif | 85 | #endif |
| 86 | . = ALIGN(4); | ||
| 86 | ___bss_stop = .; | 87 | ___bss_stop = .; |
| 87 | } | 88 | } |
| 88 | 89 | ||
| @@ -101,7 +102,7 @@ SECTIONS | |||
| 101 | #if !L1_DATA_B_LENGTH | 102 | #if !L1_DATA_B_LENGTH |
| 102 | *(.l1.data.B) | 103 | *(.l1.data.B) |
| 103 | #endif | 104 | #endif |
| 104 | #ifndef L2_LENGTH | 105 | #if !L2_LENGTH |
| 105 | . = ALIGN(32); | 106 | . = ALIGN(32); |
| 106 | *(.data_l2.cacheline_aligned) | 107 | *(.data_l2.cacheline_aligned) |
| 107 | *(.l2.data) | 108 | *(.l2.data) |
| @@ -211,20 +212,19 @@ SECTIONS | |||
| 211 | __ebss_b_l1 = .; | 212 | __ebss_b_l1 = .; |
| 212 | } | 213 | } |
| 213 | 214 | ||
| 214 | #ifdef L2_LENGTH | ||
| 215 | __l2_lma_start = .; | 215 | __l2_lma_start = .; |
| 216 | 216 | ||
| 217 | .text_data_l2 L2_START : AT(LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1)) | 217 | .text_data_l2 L2_START : AT(LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1)) |
| 218 | { | 218 | { |
| 219 | . = ALIGN(4); | 219 | . = ALIGN(4); |
| 220 | __stext_l2 = .; | 220 | __stext_l2 = .; |
| 221 | *(.l1.text) | 221 | *(.l2.text) |
| 222 | . = ALIGN(4); | 222 | . = ALIGN(4); |
| 223 | __etext_l2 = .; | 223 | __etext_l2 = .; |
| 224 | 224 | ||
| 225 | . = ALIGN(4); | 225 | . = ALIGN(4); |
| 226 | __sdata_l2 = .; | 226 | __sdata_l2 = .; |
| 227 | *(.l1.data) | 227 | *(.l2.data) |
| 228 | __edata_l2 = .; | 228 | __edata_l2 = .; |
| 229 | 229 | ||
| 230 | . = ALIGN(32); | 230 | . = ALIGN(32); |
| @@ -232,11 +232,10 @@ SECTIONS | |||
| 232 | 232 | ||
| 233 | . = ALIGN(4); | 233 | . = ALIGN(4); |
| 234 | __sbss_l2 = .; | 234 | __sbss_l2 = .; |
| 235 | *(.l1.bss) | 235 | *(.l2.bss) |
| 236 | . = ALIGN(4); | 236 | . = ALIGN(4); |
| 237 | __ebss_l2 = .; | 237 | __ebss_l2 = .; |
| 238 | } | 238 | } |
| 239 | #endif | ||
| 240 | 239 | ||
| 241 | /* Force trailing alignment of our init section so that when we | 240 | /* Force trailing alignment of our init section so that when we |
| 242 | * free our init memory, we don't leave behind a partial page. | 241 | * free our init memory, we don't leave behind a partial page. |
diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S index eba2343b1b59..d60554dce87b 100644 --- a/arch/blackfin/lib/ins.S +++ b/arch/blackfin/lib/ins.S | |||
| @@ -33,7 +33,28 @@ | |||
| 33 | 33 | ||
| 34 | .align 2 | 34 | .align 2 |
| 35 | 35 | ||
| 36 | /* | ||
| 37 | * Reads on the Blackfin are speculative. In Blackfin terms, this means they | ||
| 38 | * can be interrupted at any time (even after they have been issued on to the | ||
| 39 | * external bus), and re-issued after the interrupt occurs. | ||
| 40 | * | ||
| 41 | * If a FIFO is sitting on the end of the read, it will see two reads, | ||
| 42 | * when the core only sees one. The FIFO receives the read which is cancelled, | ||
| 43 | * and not delivered to the core. | ||
| 44 | * | ||
| 45 | * To solve this, interrupts are turned off before reads occur to I/O space. | ||
| 46 | * There are 3 versions of all these functions | ||
| 47 | * - turns interrupts off every read (higher overhead, but lower latency) | ||
| 48 | * - turns interrupts off every loop (low overhead, but longer latency) | ||
| 49 | * - DMA version, which do not suffer from this issue. DMA versions have | ||
| 50 | * different name (prefixed by dma_ ), and are located in | ||
| 51 | * ../kernel/bfin_dma_5xx.c | ||
| 52 | * Using the dma related functions are recommended for transfering large | ||
| 53 | * buffers in/out of FIFOs. | ||
| 54 | */ | ||
| 55 | |||
| 36 | ENTRY(_insl) | 56 | ENTRY(_insl) |
| 57 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
| 37 | P0 = R0; /* P0 = port */ | 58 | P0 = R0; /* P0 = port */ |
| 38 | cli R3; | 59 | cli R3; |
| 39 | P1 = R1; /* P1 = address */ | 60 | P1 = R1; /* P1 = address */ |
| @@ -46,9 +67,26 @@ ENTRY(_insl) | |||
| 46 | .Llong_loop_e: NOP; | 67 | .Llong_loop_e: NOP; |
| 47 | sti R3; | 68 | sti R3; |
| 48 | RTS; | 69 | RTS; |
| 70 | #else | ||
| 71 | P0 = R0; /* P0 = port */ | ||
| 72 | P1 = R1; /* P1 = address */ | ||
| 73 | P2 = R2; /* P2 = count */ | ||
| 74 | SSYNC; | ||
| 75 | LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; | ||
| 76 | .Llong_loop_s: | ||
| 77 | CLI R3; | ||
| 78 | NOP; NOP; NOP; | ||
| 79 | R0 = [P0]; | ||
| 80 | [P1++] = R0; | ||
| 81 | .Llong_loop_e: | ||
| 82 | STI R3; | ||
| 83 | |||
| 84 | RTS; | ||
| 85 | #endif | ||
| 49 | ENDPROC(_insl) | 86 | ENDPROC(_insl) |
| 50 | 87 | ||
| 51 | ENTRY(_insw) | 88 | ENTRY(_insw) |
| 89 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
| 52 | P0 = R0; /* P0 = port */ | 90 | P0 = R0; /* P0 = port */ |
| 53 | cli R3; | 91 | cli R3; |
| 54 | P1 = R1; /* P1 = address */ | 92 | P1 = R1; /* P1 = address */ |
| @@ -61,9 +99,26 @@ ENTRY(_insw) | |||
| 61 | .Lword_loop_e: NOP; | 99 | .Lword_loop_e: NOP; |
| 62 | sti R3; | 100 | sti R3; |
| 63 | RTS; | 101 | RTS; |
| 102 | #else | ||
| 103 | P0 = R0; /* P0 = port */ | ||
| 104 | P1 = R1; /* P1 = address */ | ||
| 105 | P2 = R2; /* P2 = count */ | ||
| 106 | SSYNC; | ||
| 107 | LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; | ||
| 108 | .Lword_loop_s: | ||
| 109 | CLI R3; | ||
| 110 | NOP; NOP; NOP; | ||
| 111 | R0 = W[P0]; | ||
| 112 | W[P1++] = R0; | ||
| 113 | .Lword_loop_e: | ||
| 114 | STI R3; | ||
| 115 | RTS; | ||
| 116 | |||
| 117 | #endif | ||
| 64 | ENDPROC(_insw) | 118 | ENDPROC(_insw) |
| 65 | 119 | ||
| 66 | ENTRY(_insw_8) | 120 | ENTRY(_insw_8) |
| 121 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
| 67 | P0 = R0; /* P0 = port */ | 122 | P0 = R0; /* P0 = port */ |
| 68 | cli R3; | 123 | cli R3; |
| 69 | P1 = R1; /* P1 = address */ | 124 | P1 = R1; /* P1 = address */ |
| @@ -78,9 +133,29 @@ ENTRY(_insw_8) | |||
| 78 | .Lword8_loop_e: NOP; | 133 | .Lword8_loop_e: NOP; |
| 79 | sti R3; | 134 | sti R3; |
| 80 | RTS; | 135 | RTS; |
| 136 | #else | ||
| 137 | P0 = R0; /* P0 = port */ | ||
| 138 | P1 = R1; /* P1 = address */ | ||
| 139 | P2 = R2; /* P2 = count */ | ||
| 140 | SSYNC; | ||
| 141 | LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2; | ||
| 142 | .Lword8_loop_s: | ||
| 143 | CLI R3; | ||
| 144 | NOP; NOP; NOP; | ||
| 145 | R0 = W[P0]; | ||
| 146 | B[P1++] = R0; | ||
| 147 | R0 = R0 >> 8; | ||
| 148 | B[P1++] = R0; | ||
| 149 | NOP; | ||
| 150 | .Lword8_loop_e: | ||
| 151 | STI R3; | ||
| 152 | |||
| 153 | RTS; | ||
| 154 | #endif | ||
| 81 | ENDPROC(_insw_8) | 155 | ENDPROC(_insw_8) |
| 82 | 156 | ||
| 83 | ENTRY(_insb) | 157 | ENTRY(_insb) |
| 158 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
| 84 | P0 = R0; /* P0 = port */ | 159 | P0 = R0; /* P0 = port */ |
| 85 | cli R3; | 160 | cli R3; |
| 86 | P1 = R1; /* P1 = address */ | 161 | P1 = R1; /* P1 = address */ |
| @@ -93,9 +168,26 @@ ENTRY(_insb) | |||
| 93 | .Lbyte_loop_e: NOP; | 168 | .Lbyte_loop_e: NOP; |
| 94 | sti R3; | 169 | sti R3; |
| 95 | RTS; | 170 | RTS; |
| 171 | #else | ||
| 172 | P0 = R0; /* P0 = port */ | ||
| 173 | P1 = R1; /* P1 = address */ | ||
| 174 | P2 = R2; /* P2 = count */ | ||
| 175 | SSYNC; | ||
| 176 | LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; | ||
| 177 | .Lbyte_loop_s: | ||
| 178 | CLI R3; | ||
| 179 | NOP; NOP; NOP; | ||
| 180 | R0 = B[P0]; | ||
| 181 | B[P1++] = R0; | ||
| 182 | .Lbyte_loop_e: | ||
| 183 | STI R3; | ||
| 184 | |||
| 185 | RTS; | ||
| 186 | #endif | ||
| 96 | ENDPROC(_insb) | 187 | ENDPROC(_insb) |
| 97 | 188 | ||
| 98 | ENTRY(_insl_16) | 189 | ENTRY(_insl_16) |
| 190 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
| 99 | P0 = R0; /* P0 = port */ | 191 | P0 = R0; /* P0 = port */ |
| 100 | cli R3; | 192 | cli R3; |
| 101 | P1 = R1; /* P1 = address */ | 193 | P1 = R1; /* P1 = address */ |
| @@ -110,4 +202,21 @@ ENTRY(_insl_16) | |||
| 110 | .Llong16_loop_e: NOP; | 202 | .Llong16_loop_e: NOP; |
| 111 | sti R3; | 203 | sti R3; |
| 112 | RTS; | 204 | RTS; |
| 205 | #else | ||
| 206 | P0 = R0; /* P0 = port */ | ||
| 207 | P1 = R1; /* P1 = address */ | ||
| 208 | P2 = R2; /* P2 = count */ | ||
| 209 | SSYNC; | ||
| 210 | LSETUP( .Llong16_loop_s, .Llong16_loop_e) LC0 = P2; | ||
| 211 | .Llong16_loop_s: | ||
| 212 | CLI R3; | ||
| 213 | NOP; NOP; NOP; | ||
| 214 | R0 = [P0]; | ||
| 215 | W[P1++] = R0; | ||
| 216 | R0 = R0 >> 16; | ||
| 217 | W[P1++] = R0; | ||
| 218 | .Llong16_loop_e: | ||
| 219 | STI R3; | ||
| 220 | RTS; | ||
| 221 | #endif | ||
| 113 | ENDPROC(_insl_16) | 222 | ENDPROC(_insl_16) |
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 0b26ae2de5ee..d22bc7773717 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c | |||
| @@ -39,7 +39,6 @@ | |||
| 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 40 | #include <linux/usb/isp1362.h> | 40 | #include <linux/usb/isp1362.h> |
| 41 | #endif | 41 | #endif |
| 42 | #include <linux/pata_platform.h> | ||
| 43 | #include <linux/i2c.h> | 42 | #include <linux/i2c.h> |
| 44 | #include <linux/irq.h> | 43 | #include <linux/irq.h> |
| 45 | #include <linux/interrupt.h> | 44 | #include <linux/interrupt.h> |
| @@ -160,15 +159,15 @@ static struct platform_device musb_device = { | |||
| 160 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 159 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 161 | static struct mtd_partition ezkit_partitions[] = { | 160 | static struct mtd_partition ezkit_partitions[] = { |
| 162 | { | 161 | { |
| 163 | .name = "Bootloader", | 162 | .name = "bootloader(nor)", |
| 164 | .size = 0x40000, | 163 | .size = 0x40000, |
| 165 | .offset = 0, | 164 | .offset = 0, |
| 166 | }, { | 165 | }, { |
| 167 | .name = "Kernel", | 166 | .name = "linux kernel(nor)", |
| 168 | .size = 0x1C0000, | 167 | .size = 0x1C0000, |
| 169 | .offset = MTDPART_OFS_APPEND, | 168 | .offset = MTDPART_OFS_APPEND, |
| 170 | }, { | 169 | }, { |
| 171 | .name = "RootFS", | 170 | .name = "file system(nor)", |
| 172 | .size = MTDPART_SIZ_FULL, | 171 | .size = MTDPART_SIZ_FULL, |
| 173 | .offset = MTDPART_OFS_APPEND, | 172 | .offset = MTDPART_OFS_APPEND, |
| 174 | } | 173 | } |
| @@ -200,12 +199,12 @@ static struct platform_device ezkit_flash_device = { | |||
| 200 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 199 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
| 201 | static struct mtd_partition partition_info[] = { | 200 | static struct mtd_partition partition_info[] = { |
| 202 | { | 201 | { |
| 203 | .name = "Linux Kernel", | 202 | .name = "linux kernel(nand)", |
| 204 | .offset = 0, | 203 | .offset = 0, |
| 205 | .size = 4 * SIZE_1M, | 204 | .size = 4 * SIZE_1M, |
| 206 | }, | 205 | }, |
| 207 | { | 206 | { |
| 208 | .name = "File System", | 207 | .name = "file system(nand)", |
| 209 | .offset = MTDPART_OFS_APPEND, | 208 | .offset = MTDPART_OFS_APPEND, |
| 210 | .size = MTDPART_SIZ_FULL, | 209 | .size = MTDPART_SIZ_FULL, |
| 211 | }, | 210 | }, |
| @@ -438,12 +437,12 @@ static struct platform_device net2272_bfin_device = { | |||
| 438 | || defined(CONFIG_MTD_M25P80_MODULE) | 437 | || defined(CONFIG_MTD_M25P80_MODULE) |
| 439 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 438 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 440 | { | 439 | { |
| 441 | .name = "bootloader", | 440 | .name = "bootloader(spi)", |
| 442 | .size = 0x00040000, | 441 | .size = 0x00040000, |
| 443 | .offset = 0, | 442 | .offset = 0, |
| 444 | .mask_flags = MTD_CAP_ROM | 443 | .mask_flags = MTD_CAP_ROM |
| 445 | }, { | 444 | }, { |
| 446 | .name = "linux kernel", | 445 | .name = "linux kernel(spi)", |
| 447 | .size = MTDPART_SIZ_FULL, | 446 | .size = MTDPART_SIZ_FULL, |
| 448 | .offset = MTDPART_OFS_APPEND, | 447 | .offset = MTDPART_OFS_APPEND, |
| 449 | } | 448 | } |
| @@ -799,43 +798,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 799 | }; | 798 | }; |
| 800 | #endif | 799 | #endif |
| 801 | 800 | ||
| 802 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 803 | #define PATA_INT 55 | ||
| 804 | |||
| 805 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 806 | .ioport_shift = 1, | ||
| 807 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 808 | }; | ||
| 809 | |||
| 810 | static struct resource bfin_pata_resources[] = { | ||
| 811 | { | ||
| 812 | .start = 0x20314020, | ||
| 813 | .end = 0x2031403F, | ||
| 814 | .flags = IORESOURCE_MEM, | ||
| 815 | }, | ||
| 816 | { | ||
| 817 | .start = 0x2031401C, | ||
| 818 | .end = 0x2031401F, | ||
| 819 | .flags = IORESOURCE_MEM, | ||
| 820 | }, | ||
| 821 | { | ||
| 822 | .start = PATA_INT, | ||
| 823 | .end = PATA_INT, | ||
| 824 | .flags = IORESOURCE_IRQ, | ||
| 825 | }, | ||
| 826 | }; | ||
| 827 | |||
| 828 | static struct platform_device bfin_pata_device = { | ||
| 829 | .name = "pata_platform", | ||
| 830 | .id = -1, | ||
| 831 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 832 | .resource = bfin_pata_resources, | ||
| 833 | .dev = { | ||
| 834 | .platform_data = &bfin_pata_platform_data, | ||
| 835 | } | ||
| 836 | }; | ||
| 837 | #endif | ||
| 838 | |||
| 839 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 801 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 840 | #include <linux/input.h> | 802 | #include <linux/input.h> |
| 841 | #include <linux/gpio_keys.h> | 803 | #include <linux/gpio_keys.h> |
| @@ -961,10 +923,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 961 | &bfin_sport1_uart_device, | 923 | &bfin_sport1_uart_device, |
| 962 | #endif | 924 | #endif |
| 963 | 925 | ||
| 964 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 965 | &bfin_pata_device, | ||
| 966 | #endif | ||
| 967 | |||
| 968 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 926 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 969 | &bfin_device_gpiokeys, | 927 | &bfin_device_gpiokeys, |
| 970 | #endif | 928 | #endif |
| @@ -987,10 +945,6 @@ static int __init stamp_init(void) | |||
| 987 | 945 | ||
| 988 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | 946 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); |
| 989 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 947 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 990 | |||
| 991 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 992 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 993 | #endif | ||
| 994 | return 0; | 948 | return 0; |
| 995 | } | 949 | } |
| 996 | 950 | ||
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index 689b69c98ee4..762f754c06cc 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
| 40 | #endif | 40 | #endif |
| 41 | #include <linux/ata_platform.h> | ||
| 42 | #include <linux/i2c.h> | 41 | #include <linux/i2c.h> |
| 43 | #include <linux/irq.h> | 42 | #include <linux/irq.h> |
| 44 | #include <linux/interrupt.h> | 43 | #include <linux/interrupt.h> |
| @@ -177,15 +176,15 @@ static struct platform_device bf52x_t350mcqb_device = { | |||
| 177 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 176 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 178 | static struct mtd_partition ezkit_partitions[] = { | 177 | static struct mtd_partition ezkit_partitions[] = { |
| 179 | { | 178 | { |
| 180 | .name = "Bootloader", | 179 | .name = "bootloader(nor)", |
| 181 | .size = 0x40000, | 180 | .size = 0x40000, |
| 182 | .offset = 0, | 181 | .offset = 0, |
| 183 | }, { | 182 | }, { |
| 184 | .name = "Kernel", | 183 | .name = "linux kernel(nor)", |
| 185 | .size = 0x1C0000, | 184 | .size = 0x1C0000, |
| 186 | .offset = MTDPART_OFS_APPEND, | 185 | .offset = MTDPART_OFS_APPEND, |
| 187 | }, { | 186 | }, { |
| 188 | .name = "RootFS", | 187 | .name = "file system(nor)", |
| 189 | .size = MTDPART_SIZ_FULL, | 188 | .size = MTDPART_SIZ_FULL, |
| 190 | .offset = MTDPART_OFS_APPEND, | 189 | .offset = MTDPART_OFS_APPEND, |
| 191 | } | 190 | } |
| @@ -217,12 +216,12 @@ static struct platform_device ezkit_flash_device = { | |||
| 217 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 216 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
| 218 | static struct mtd_partition partition_info[] = { | 217 | static struct mtd_partition partition_info[] = { |
| 219 | { | 218 | { |
| 220 | .name = "Linux Kernel", | 219 | .name = "linux kernel(nand)", |
| 221 | .offset = 0, | 220 | .offset = 0, |
| 222 | .size = 4 * SIZE_1M, | 221 | .size = 4 * SIZE_1M, |
| 223 | }, | 222 | }, |
| 224 | { | 223 | { |
| 225 | .name = "File System", | 224 | .name = "file system(nand)", |
| 226 | .offset = MTDPART_OFS_APPEND, | 225 | .offset = MTDPART_OFS_APPEND, |
| 227 | .size = MTDPART_SIZ_FULL, | 226 | .size = MTDPART_SIZ_FULL, |
| 228 | }, | 227 | }, |
| @@ -460,12 +459,12 @@ static struct platform_device net2272_bfin_device = { | |||
| 460 | || defined(CONFIG_MTD_M25P80_MODULE) | 459 | || defined(CONFIG_MTD_M25P80_MODULE) |
| 461 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 460 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 462 | { | 461 | { |
| 463 | .name = "bootloader", | 462 | .name = "bootloader(spi)", |
| 464 | .size = 0x00040000, | 463 | .size = 0x00040000, |
| 465 | .offset = 0, | 464 | .offset = 0, |
| 466 | .mask_flags = MTD_CAP_ROM | 465 | .mask_flags = MTD_CAP_ROM |
| 467 | }, { | 466 | }, { |
| 468 | .name = "linux kernel", | 467 | .name = "linux kernel(spi)", |
| 469 | .size = MTDPART_SIZ_FULL, | 468 | .size = MTDPART_SIZ_FULL, |
| 470 | .offset = MTDPART_OFS_APPEND, | 469 | .offset = MTDPART_OFS_APPEND, |
| 471 | } | 470 | } |
| @@ -825,43 +824,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 825 | }; | 824 | }; |
| 826 | #endif | 825 | #endif |
| 827 | 826 | ||
| 828 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 829 | #define PATA_INT 55 | ||
| 830 | |||
| 831 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 832 | .ioport_shift = 1, | ||
| 833 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 834 | }; | ||
| 835 | |||
| 836 | static struct resource bfin_pata_resources[] = { | ||
| 837 | { | ||
| 838 | .start = 0x20314020, | ||
| 839 | .end = 0x2031403F, | ||
| 840 | .flags = IORESOURCE_MEM, | ||
| 841 | }, | ||
| 842 | { | ||
| 843 | .start = 0x2031401C, | ||
| 844 | .end = 0x2031401F, | ||
| 845 | .flags = IORESOURCE_MEM, | ||
| 846 | }, | ||
| 847 | { | ||
| 848 | .start = PATA_INT, | ||
| 849 | .end = PATA_INT, | ||
| 850 | .flags = IORESOURCE_IRQ, | ||
| 851 | }, | ||
| 852 | }; | ||
| 853 | |||
| 854 | static struct platform_device bfin_pata_device = { | ||
| 855 | .name = "pata_platform", | ||
| 856 | .id = -1, | ||
| 857 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 858 | .resource = bfin_pata_resources, | ||
| 859 | .dev = { | ||
| 860 | .platform_data = &bfin_pata_platform_data, | ||
| 861 | } | ||
| 862 | }; | ||
| 863 | #endif | ||
| 864 | |||
| 865 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 827 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 866 | #include <linux/input.h> | 828 | #include <linux/input.h> |
| 867 | #include <linux/gpio_keys.h> | 829 | #include <linux/gpio_keys.h> |
| @@ -996,10 +958,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 996 | &bfin_sport1_uart_device, | 958 | &bfin_sport1_uart_device, |
| 997 | #endif | 959 | #endif |
| 998 | 960 | ||
| 999 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 1000 | &bfin_pata_device, | ||
| 1001 | #endif | ||
| 1002 | |||
| 1003 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 961 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 1004 | &bfin_device_gpiokeys, | 962 | &bfin_device_gpiokeys, |
| 1005 | #endif | 963 | #endif |
| @@ -1022,10 +980,6 @@ static int __init stamp_init(void) | |||
| 1022 | 980 | ||
| 1023 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | 981 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); |
| 1024 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 982 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 1025 | |||
| 1026 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 1027 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 1028 | #endif | ||
| 1029 | return 0; | 983 | return 0; |
| 1030 | } | 984 | } |
| 1031 | 985 | ||
diff --git a/arch/blackfin/mach-bf527/head.S b/arch/blackfin/mach-bf527/head.S index fe05cc1ef174..c3334cc5bcb7 100644 --- a/arch/blackfin/mach-bf527/head.S +++ b/arch/blackfin/mach-bf527/head.S | |||
| @@ -30,293 +30,11 @@ | |||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | #include <asm/trace.h> | ||
| 34 | |||
| 35 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
| 37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
| 38 | #endif | 36 | #endif |
| 39 | 37 | ||
| 40 | .extern ___bss_stop | ||
| 41 | .extern ___bss_start | ||
| 42 | .extern _bf53x_relocate_l1_mem | ||
| 43 | |||
| 44 | #define INITIAL_STACK 0xFFB01000 | ||
| 45 | |||
| 46 | __INIT | ||
| 47 | |||
| 48 | ENTRY(__start) | ||
| 49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 50 | R7 = R0; | ||
| 51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 53 | R0 = SYSCFG_SNEN; | ||
| 54 | #else | ||
| 55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 56 | #endif | ||
| 57 | SYSCFG = R0; | ||
| 58 | R0 = 0; | ||
| 59 | |||
| 60 | /* Clear Out All the data and pointer Registers */ | ||
| 61 | R1 = R0; | ||
| 62 | R2 = R0; | ||
| 63 | R3 = R0; | ||
| 64 | R4 = R0; | ||
| 65 | R5 = R0; | ||
| 66 | R6 = R0; | ||
| 67 | |||
| 68 | P0 = R0; | ||
| 69 | P1 = R0; | ||
| 70 | P2 = R0; | ||
| 71 | P3 = R0; | ||
| 72 | P4 = R0; | ||
| 73 | P5 = R0; | ||
| 74 | |||
| 75 | LC0 = r0; | ||
| 76 | LC1 = r0; | ||
| 77 | L0 = r0; | ||
| 78 | L1 = r0; | ||
| 79 | L2 = r0; | ||
| 80 | L3 = r0; | ||
| 81 | |||
| 82 | /* Clear Out All the DAG Registers */ | ||
| 83 | B0 = r0; | ||
| 84 | B1 = r0; | ||
| 85 | B2 = r0; | ||
| 86 | B3 = r0; | ||
| 87 | |||
| 88 | I0 = r0; | ||
| 89 | I1 = r0; | ||
| 90 | I2 = r0; | ||
| 91 | I3 = r0; | ||
| 92 | |||
| 93 | M0 = r0; | ||
| 94 | M1 = r0; | ||
| 95 | M2 = r0; | ||
| 96 | M3 = r0; | ||
| 97 | |||
| 98 | trace_buffer_init(p0,r0); | ||
| 99 | P0 = R1; | ||
| 100 | R0 = R1; | ||
| 101 | |||
| 102 | /* Turn off the icache */ | ||
| 103 | p0.l = LO(IMEM_CONTROL); | ||
| 104 | p0.h = HI(IMEM_CONTROL); | ||
| 105 | R1 = [p0]; | ||
| 106 | R0 = ~ENICPLB; | ||
| 107 | R0 = R0 & R1; | ||
| 108 | |||
| 109 | /* Anomaly 05000125 */ | ||
| 110 | #if ANOMALY_05000125 | ||
| 111 | CLI R2; | ||
| 112 | SSYNC; | ||
| 113 | #endif | ||
| 114 | [p0] = R0; | ||
| 115 | SSYNC; | ||
| 116 | #if ANOMALY_05000125 | ||
| 117 | STI R2; | ||
| 118 | #endif | ||
| 119 | |||
| 120 | /* Turn off the dcache */ | ||
| 121 | p0.l = LO(DMEM_CONTROL); | ||
| 122 | p0.h = HI(DMEM_CONTROL); | ||
| 123 | R1 = [p0]; | ||
| 124 | R0 = ~ENDCPLB; | ||
| 125 | R0 = R0 & R1; | ||
| 126 | |||
| 127 | /* Anomaly 05000125 */ | ||
| 128 | #if ANOMALY_05000125 | ||
| 129 | CLI R2; | ||
| 130 | SSYNC; | ||
| 131 | #endif | ||
| 132 | [p0] = R0; | ||
| 133 | SSYNC; | ||
| 134 | #if ANOMALY_05000125 | ||
| 135 | STI R2; | ||
| 136 | #endif | ||
| 137 | |||
| 138 | |||
| 139 | #if defined(CONFIG_BF527) | ||
| 140 | p0.h = hi(EMAC_SYSTAT); | ||
| 141 | p0.l = lo(EMAC_SYSTAT); | ||
| 142 | R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */ | ||
| 143 | R0.l = 0xFFFF; | ||
| 144 | [P0] = R0; | ||
| 145 | SSYNC; | ||
| 146 | #endif | ||
| 147 | |||
| 148 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
| 149 | * so if we dont initalize here, our serial console gets hosed */ | ||
| 150 | p0.h = hi(UART1_LCR); | ||
| 151 | p0.l = lo(UART1_LCR); | ||
| 152 | r0 = 0x0(Z); | ||
| 153 | w[p0] = r0.L; /* To enable DLL writes */ | ||
| 154 | ssync; | ||
| 155 | |||
| 156 | p0.h = hi(UART1_DLL); | ||
| 157 | p0.l = lo(UART1_DLL); | ||
| 158 | r0 = 0x0(Z); | ||
| 159 | w[p0] = r0.L; | ||
| 160 | ssync; | ||
| 161 | |||
| 162 | p0.h = hi(UART1_DLH); | ||
| 163 | p0.l = lo(UART1_DLH); | ||
| 164 | r0 = 0x00(Z); | ||
| 165 | w[p0] = r0.L; | ||
| 166 | ssync; | ||
| 167 | |||
| 168 | p0.h = hi(UART1_GCTL); | ||
| 169 | p0.l = lo(UART1_GCTL); | ||
| 170 | r0 = 0x0(Z); | ||
| 171 | w[p0] = r0.L; /* To enable UART clock */ | ||
| 172 | ssync; | ||
| 173 | |||
| 174 | /* Initialize stack pointer */ | ||
| 175 | sp.l = lo(INITIAL_STACK); | ||
| 176 | sp.h = hi(INITIAL_STACK); | ||
| 177 | fp = sp; | ||
| 178 | usp = sp; | ||
| 179 | |||
| 180 | #ifdef CONFIG_EARLY_PRINTK | ||
| 181 | SP += -12; | ||
| 182 | call _init_early_exception_vectors; | ||
| 183 | SP += 12; | ||
| 184 | #endif | ||
| 185 | |||
| 186 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 187 | call _bf53x_relocate_l1_mem; | ||
| 188 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
| 189 | call _start_dma_code; | ||
| 190 | #endif | ||
| 191 | |||
| 192 | /* Code for initializing Async memory banks */ | ||
| 193 | |||
| 194 | p2.h = hi(EBIU_AMBCTL1); | ||
| 195 | p2.l = lo(EBIU_AMBCTL1); | ||
| 196 | r0.h = hi(AMBCTL1VAL); | ||
| 197 | r0.l = lo(AMBCTL1VAL); | ||
| 198 | [p2] = r0; | ||
| 199 | ssync; | ||
| 200 | |||
| 201 | p2.h = hi(EBIU_AMBCTL0); | ||
| 202 | p2.l = lo(EBIU_AMBCTL0); | ||
| 203 | r0.h = hi(AMBCTL0VAL); | ||
| 204 | r0.l = lo(AMBCTL0VAL); | ||
| 205 | [p2] = r0; | ||
| 206 | ssync; | ||
| 207 | |||
| 208 | p2.h = hi(EBIU_AMGCTL); | ||
| 209 | p2.l = lo(EBIU_AMGCTL); | ||
| 210 | r0 = AMGCTLVAL; | ||
| 211 | w[p2] = r0; | ||
| 212 | ssync; | ||
| 213 | |||
| 214 | /* This section keeps the processor in supervisor mode | ||
| 215 | * during kernel boot. Switches to user mode at end of boot. | ||
| 216 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 217 | */ | ||
| 218 | |||
| 219 | /* EVT15 = _real_start */ | ||
| 220 | |||
| 221 | p0.l = lo(EVT15); | ||
| 222 | p0.h = hi(EVT15); | ||
| 223 | p1.l = _real_start; | ||
| 224 | p1.h = _real_start; | ||
| 225 | [p0] = p1; | ||
| 226 | csync; | ||
| 227 | |||
| 228 | p0.l = lo(IMASK); | ||
| 229 | p0.h = hi(IMASK); | ||
| 230 | p1.l = IMASK_IVG15; | ||
| 231 | p1.h = 0x0; | ||
| 232 | [p0] = p1; | ||
| 233 | csync; | ||
| 234 | |||
| 235 | raise 15; | ||
| 236 | p0.l = .LWAIT_HERE; | ||
| 237 | p0.h = .LWAIT_HERE; | ||
| 238 | reti = p0; | ||
| 239 | #if ANOMALY_05000281 | ||
| 240 | nop; nop; nop; | ||
| 241 | #endif | ||
| 242 | rti; | ||
| 243 | |||
| 244 | .LWAIT_HERE: | ||
| 245 | jump .LWAIT_HERE; | ||
| 246 | ENDPROC(__start) | ||
| 247 | |||
| 248 | ENTRY(_real_start) | ||
| 249 | [ -- sp ] = reti; | ||
| 250 | p0.l = lo(WDOG_CTL); | ||
| 251 | p0.h = hi(WDOG_CTL); | ||
| 252 | r0 = 0xAD6(z); | ||
| 253 | w[p0] = r0; /* watchdog off for now */ | ||
| 254 | ssync; | ||
| 255 | |||
| 256 | /* Code update for BSS size == 0 | ||
| 257 | * Zero out the bss region. | ||
| 258 | */ | ||
| 259 | |||
| 260 | p1.l = ___bss_start; | ||
| 261 | p1.h = ___bss_start; | ||
| 262 | p2.l = ___bss_stop; | ||
| 263 | p2.h = ___bss_stop; | ||
| 264 | r0 = 0; | ||
| 265 | p2 -= p1; | ||
| 266 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
| 267 | .L_clear_bss: | ||
| 268 | B[p1++] = r0; | ||
| 269 | |||
| 270 | /* In case there is a NULL pointer reference | ||
| 271 | * Zero out region before stext | ||
| 272 | */ | ||
| 273 | |||
| 274 | p1.l = 0x0; | ||
| 275 | p1.h = 0x0; | ||
| 276 | r0.l = __stext; | ||
| 277 | r0.h = __stext; | ||
| 278 | r0 = r0 >> 1; | ||
| 279 | p2 = r0; | ||
| 280 | r0 = 0; | ||
| 281 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
| 282 | .L_clear_zero: | ||
| 283 | W[p1++] = r0; | ||
| 284 | |||
| 285 | /* pass the uboot arguments to the global value command line */ | ||
| 286 | R0 = R7; | ||
| 287 | call _cmdline_init; | ||
| 288 | |||
| 289 | p1.l = __rambase; | ||
| 290 | p1.h = __rambase; | ||
| 291 | r0.l = __sdata; | ||
| 292 | r0.h = __sdata; | ||
| 293 | [p1] = r0; | ||
| 294 | |||
| 295 | p1.l = __ramstart; | ||
| 296 | p1.h = __ramstart; | ||
| 297 | p3.l = ___bss_stop; | ||
| 298 | p3.h = ___bss_stop; | ||
| 299 | |||
| 300 | r1 = p3; | ||
| 301 | [p1] = r1; | ||
| 302 | |||
| 303 | /* | ||
| 304 | * load the current thread pointer and stack | ||
| 305 | */ | ||
| 306 | r1.l = _init_thread_union; | ||
| 307 | r1.h = _init_thread_union; | ||
| 308 | |||
| 309 | r2.l = 0x2000; | ||
| 310 | r2.h = 0x0000; | ||
| 311 | r1 = r1 + r2; | ||
| 312 | sp = r1; | ||
| 313 | usp = sp; | ||
| 314 | fp = sp; | ||
| 315 | jump.l _start_kernel; | ||
| 316 | ENDPROC(_real_start) | ||
| 317 | |||
| 318 | __FINIT | ||
| 319 | |||
| 320 | .section .l1.text | 38 | .section .l1.text |
| 321 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 322 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
| @@ -420,13 +138,6 @@ ENTRY(_start_dma_code) | |||
| 420 | [P2] = R1; | 138 | [P2] = R1; |
| 421 | SSYNC; | 139 | SSYNC; |
| 422 | 140 | ||
| 423 | p0.h = hi(SIC_IWR0); | ||
| 424 | p0.l = lo(SIC_IWR0); | ||
| 425 | r0.l = lo(IWR_ENABLE_ALL); | ||
| 426 | r0.h = hi(IWR_ENABLE_ALL); | ||
| 427 | [p0] = r0; | ||
| 428 | SSYNC; | ||
| 429 | |||
| 430 | RTS; | 141 | RTS; |
| 431 | ENDPROC(_start_dma_code) | 142 | ENDPROC(_start_dma_code) |
| 432 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 143 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf527/ints-priority.c b/arch/blackfin/mach-bf527/ints-priority.c index 1fa389793968..8a2367403d2b 100644 --- a/arch/blackfin/mach-bf527/ints-priority.c +++ b/arch/blackfin/mach-bf527/ints-priority.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | 33 | ||
| 34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
| 35 | { | 35 | { |
| 36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
| 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf533/boards/H8606.c b/arch/blackfin/mach-bf533/boards/H8606.c index 4103a97c1a70..c66a68f30239 100644 --- a/arch/blackfin/mach-bf533/boards/H8606.c +++ b/arch/blackfin/mach-bf533/boards/H8606.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
| 40 | #endif | 40 | #endif |
| 41 | #include <linux/ata_platform.h> | ||
| 42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
| 43 | 42 | ||
| 44 | #include <asm/dma.h> | 43 | #include <asm/dma.h> |
| @@ -141,16 +140,16 @@ static struct platform_device net2272_bfin_device = { | |||
| 141 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 140 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 142 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 141 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 143 | { | 142 | { |
| 144 | .name = "bootloader", | 143 | .name = "bootloader(spi)", |
| 145 | .size = 0x00060000, | 144 | .size = 0x00060000, |
| 146 | .offset = 0, | 145 | .offset = 0, |
| 147 | .mask_flags = MTD_CAP_ROM | 146 | .mask_flags = MTD_CAP_ROM |
| 148 | }, { | 147 | }, { |
| 149 | .name = "kernel", | 148 | .name = "linux kernel(spi)", |
| 150 | .size = 0x100000, | 149 | .size = 0x100000, |
| 151 | .offset = 0x60000 | 150 | .offset = 0x60000 |
| 152 | }, { | 151 | }, { |
| 153 | .name = "file system", | 152 | .name = "file system(spi)", |
| 154 | .size = 0x6a0000, | 153 | .size = 0x6a0000, |
| 155 | .offset = 0x00160000, | 154 | .offset = 0x00160000, |
| 156 | } | 155 | } |
diff --git a/arch/blackfin/mach-bf533/boards/Kconfig b/arch/blackfin/mach-bf533/boards/Kconfig index 840059241fbe..308c98dc5aba 100644 --- a/arch/blackfin/mach-bf533/boards/Kconfig +++ b/arch/blackfin/mach-bf533/boards/Kconfig | |||
| @@ -14,6 +14,12 @@ config BFIN533_STAMP | |||
| 14 | help | 14 | help |
| 15 | BF533-STAMP board support. | 15 | BF533-STAMP board support. |
| 16 | 16 | ||
| 17 | config BLACKSTAMP | ||
| 18 | bool "BlackStamp" | ||
| 19 | help | ||
| 20 | Support for the BlackStamp board. Hardware info available at | ||
| 21 | http://blackfin.uclinux.org/gf/project/blackstamp/ | ||
| 22 | |||
| 17 | config BFIN533_BLUETECHNIX_CM | 23 | config BFIN533_BLUETECHNIX_CM |
| 18 | bool "Bluetechnix CM-BF533" | 24 | bool "Bluetechnix CM-BF533" |
| 19 | depends on (BF533) | 25 | depends on (BF533) |
diff --git a/arch/blackfin/mach-bf533/boards/Makefile b/arch/blackfin/mach-bf533/boards/Makefile index b7a1a1d79bda..9afbe72b484f 100644 --- a/arch/blackfin/mach-bf533/boards/Makefile +++ b/arch/blackfin/mach-bf533/boards/Makefile | |||
| @@ -7,4 +7,5 @@ obj-$(CONFIG_BFIN533_STAMP) += stamp.o | |||
| 7 | obj-$(CONFIG_BFIN532_IP0X) += ip0x.o | 7 | obj-$(CONFIG_BFIN532_IP0X) += ip0x.o |
| 8 | obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o | 8 | obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o |
| 9 | obj-$(CONFIG_BFIN533_BLUETECHNIX_CM) += cm_bf533.o | 9 | obj-$(CONFIG_BFIN533_BLUETECHNIX_CM) += cm_bf533.o |
| 10 | obj-$(CONFIG_BLACKSTAMP) += blackstamp.o | ||
| 10 | obj-$(CONFIG_H8606_HVSISTEMAS) += H8606.o | 11 | obj-$(CONFIG_H8606_HVSISTEMAS) += H8606.o |
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c new file mode 100644 index 000000000000..d064ded87719 --- /dev/null +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c | |||
| @@ -0,0 +1,401 @@ | |||
| 1 | /* | ||
| 2 | * File: arch/blackfin/mach-bf533/blackstamp.c | ||
| 3 | * Based on: arch/blackfin/mach-bf533/stamp.c | ||
| 4 | * Author: Benjamin Matthews <bmat@lle.rochester.edu> | ||
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 6 | * | ||
| 7 | * Created: 2008 | ||
| 8 | * Description: Board Info File for the BlackStamp | ||
| 9 | * | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * More info about the BlackStamp at: | ||
| 16 | * http://blackfin.uclinux.org/gf/project/blackstamp/ | ||
| 17 | * | ||
| 18 | * Licensed under the GPL-2 or later. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include <linux/device.h> | ||
| 22 | #include <linux/platform_device.h> | ||
| 23 | #include <linux/mtd/mtd.h> | ||
| 24 | #include <linux/mtd/partitions.h> | ||
| 25 | #include <linux/mtd/physmap.h> | ||
| 26 | #include <linux/spi/spi.h> | ||
| 27 | #include <linux/spi/flash.h> | ||
| 28 | #include <linux/irq.h> | ||
| 29 | #include <linux/i2c.h> | ||
| 30 | #include <asm/dma.h> | ||
| 31 | #include <asm/bfin5xx_spi.h> | ||
| 32 | #include <asm/portmux.h> | ||
| 33 | #include <asm/dpmc.h> | ||
| 34 | |||
| 35 | /* | ||
| 36 | * Name the Board for the /proc/cpuinfo | ||
| 37 | */ | ||
| 38 | const char bfin_board_name[] = "BlackStamp"; | ||
| 39 | |||
| 40 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
| 41 | static struct platform_device rtc_device = { | ||
| 42 | .name = "rtc-bfin", | ||
| 43 | .id = -1, | ||
| 44 | }; | ||
| 45 | #endif | ||
| 46 | |||
| 47 | /* | ||
| 48 | * Driver needs to know address, irq and flag pin. | ||
| 49 | */ | ||
| 50 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
| 51 | static struct resource smc91x_resources[] = { | ||
| 52 | { | ||
| 53 | .name = "smc91x-regs", | ||
| 54 | .start = 0x20300300, | ||
| 55 | .end = 0x20300300 + 16, | ||
| 56 | .flags = IORESOURCE_MEM, | ||
| 57 | }, { | ||
| 58 | .start = IRQ_PF3, | ||
| 59 | .end = IRQ_PF3, | ||
| 60 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
| 61 | }, | ||
| 62 | }; | ||
| 63 | |||
| 64 | static struct platform_device smc91x_device = { | ||
| 65 | .name = "smc91x", | ||
| 66 | .id = 0, | ||
| 67 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
| 68 | .resource = smc91x_resources, | ||
| 69 | }; | ||
| 70 | #endif | ||
| 71 | |||
| 72 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
| 73 | static struct mtd_partition bfin_spi_flash_partitions[] = { | ||
| 74 | { | ||
| 75 | .name = "bootloader(spi)", | ||
| 76 | .size = 0x00040000, | ||
| 77 | .offset = 0, | ||
| 78 | .mask_flags = MTD_CAP_ROM | ||
| 79 | }, { | ||
| 80 | .name = "linux kernel(spi)", | ||
| 81 | .size = 0x180000, | ||
| 82 | .offset = MTDPART_OFS_APPEND, | ||
| 83 | }, { | ||
| 84 | .name = "file system(spi)", | ||
| 85 | .size = MTDPART_SIZ_FULL, | ||
| 86 | .offset = MTDPART_OFS_APPEND, | ||
| 87 | } | ||
| 88 | }; | ||
| 89 | |||
| 90 | static struct flash_platform_data bfin_spi_flash_data = { | ||
| 91 | .name = "m25p80", | ||
| 92 | .parts = bfin_spi_flash_partitions, | ||
| 93 | .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), | ||
| 94 | .type = "m25p64", | ||
| 95 | }; | ||
| 96 | |||
| 97 | /* SPI flash chip (m25p64) */ | ||
| 98 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | ||
| 99 | .enable_dma = 0, /* use dma transfer with this chip*/ | ||
| 100 | .bits_per_word = 8, | ||
| 101 | }; | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
| 105 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { | ||
| 106 | .enable_dma = 1, | ||
| 107 | .bits_per_word = 8, | ||
| 108 | }; | ||
| 109 | #endif | ||
| 110 | |||
| 111 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) | ||
| 112 | static struct bfin5xx_spi_chip spidev_chip_info = { | ||
| 113 | .enable_dma = 0, | ||
| 114 | .bits_per_word = 8, | ||
| 115 | }; | ||
| 116 | #endif | ||
| 117 | |||
| 118 | static struct spi_board_info bfin_spi_board_info[] __initdata = { | ||
| 119 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
| 120 | { | ||
| 121 | /* the modalias must be the same as spi device driver name */ | ||
| 122 | .modalias = "m25p80", /* Name of spi_driver for this device */ | ||
| 123 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
| 124 | .bus_num = 0, /* Framework bus number */ | ||
| 125 | .chip_select = 2, /* Framework chip select. */ | ||
| 126 | .platform_data = &bfin_spi_flash_data, | ||
| 127 | .controller_data = &spi_flash_chip_info, | ||
| 128 | .mode = SPI_MODE_3, | ||
| 129 | }, | ||
| 130 | #endif | ||
| 131 | |||
| 132 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
| 133 | { | ||
| 134 | .modalias = "spi_mmc_dummy", | ||
| 135 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
| 136 | .bus_num = 0, | ||
| 137 | .chip_select = 0, | ||
| 138 | .platform_data = NULL, | ||
| 139 | .controller_data = &spi_mmc_chip_info, | ||
| 140 | .mode = SPI_MODE_3, | ||
| 141 | }, | ||
| 142 | { | ||
| 143 | .modalias = "spi_mmc", | ||
| 144 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
| 145 | .bus_num = 0, | ||
| 146 | .chip_select = CONFIG_SPI_MMC_CS_CHAN, | ||
| 147 | .platform_data = NULL, | ||
| 148 | .controller_data = &spi_mmc_chip_info, | ||
| 149 | .mode = SPI_MODE_3, | ||
| 150 | }, | ||
| 151 | #endif | ||
| 152 | |||
| 153 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) | ||
| 154 | { | ||
| 155 | .modalias = "spidev", | ||
| 156 | .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ | ||
| 157 | .bus_num = 0, | ||
| 158 | .chip_select = 7, | ||
| 159 | .controller_data = &spidev_chip_info, | ||
| 160 | }, | ||
| 161 | #endif | ||
| 162 | }; | ||
| 163 | |||
| 164 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
| 165 | /* SPI (0) */ | ||
| 166 | static struct resource bfin_spi0_resource[] = { | ||
| 167 | [0] = { | ||
| 168 | .start = SPI0_REGBASE, | ||
| 169 | .end = SPI0_REGBASE + 0xFF, | ||
| 170 | .flags = IORESOURCE_MEM, | ||
| 171 | }, | ||
| 172 | [1] = { | ||
| 173 | .start = CH_SPI, | ||
| 174 | .end = CH_SPI, | ||
| 175 | .flags = IORESOURCE_IRQ, | ||
| 176 | } | ||
| 177 | }; | ||
| 178 | |||
| 179 | /* SPI controller data */ | ||
| 180 | static struct bfin5xx_spi_master bfin_spi0_info = { | ||
| 181 | .num_chipselect = 8, | ||
| 182 | .enable_dma = 1, /* master has the ability to do dma transfer */ | ||
| 183 | .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, | ||
| 184 | }; | ||
| 185 | |||
| 186 | static struct platform_device bfin_spi0_device = { | ||
| 187 | .name = "bfin-spi", | ||
| 188 | .id = 0, /* Bus number */ | ||
| 189 | .num_resources = ARRAY_SIZE(bfin_spi0_resource), | ||
| 190 | .resource = bfin_spi0_resource, | ||
| 191 | .dev = { | ||
| 192 | .platform_data = &bfin_spi0_info, /* Passed to driver */ | ||
| 193 | }, | ||
| 194 | }; | ||
| 195 | #endif /* spi master and devices */ | ||
| 196 | |||
| 197 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
| 198 | static struct resource bfin_uart_resources[] = { | ||
| 199 | { | ||
| 200 | .start = 0xFFC00400, | ||
| 201 | .end = 0xFFC004FF, | ||
| 202 | .flags = IORESOURCE_MEM, | ||
| 203 | }, | ||
| 204 | }; | ||
| 205 | |||
| 206 | static struct platform_device bfin_uart_device = { | ||
| 207 | .name = "bfin-uart", | ||
| 208 | .id = 1, | ||
| 209 | .num_resources = ARRAY_SIZE(bfin_uart_resources), | ||
| 210 | .resource = bfin_uart_resources, | ||
| 211 | }; | ||
| 212 | #endif | ||
| 213 | |||
| 214 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
| 215 | static struct resource bfin_sir_resources[] = { | ||
| 216 | #ifdef CONFIG_BFIN_SIR0 | ||
| 217 | { | ||
| 218 | .start = 0xFFC00400, | ||
| 219 | .end = 0xFFC004FF, | ||
| 220 | .flags = IORESOURCE_MEM, | ||
| 221 | }, | ||
| 222 | #endif | ||
| 223 | }; | ||
| 224 | |||
| 225 | static struct platform_device bfin_sir_device = { | ||
| 226 | .name = "bfin_sir", | ||
| 227 | .id = 0, | ||
| 228 | .num_resources = ARRAY_SIZE(bfin_sir_resources), | ||
| 229 | .resource = bfin_sir_resources, | ||
| 230 | }; | ||
| 231 | #endif | ||
| 232 | |||
| 233 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
| 234 | static struct platform_device bfin_sport0_uart_device = { | ||
| 235 | .name = "bfin-sport-uart", | ||
| 236 | .id = 0, | ||
| 237 | }; | ||
| 238 | |||
| 239 | static struct platform_device bfin_sport1_uart_device = { | ||
| 240 | .name = "bfin-sport-uart", | ||
| 241 | .id = 1, | ||
| 242 | }; | ||
| 243 | #endif | ||
| 244 | |||
| 245 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
| 246 | #include <linux/input.h> | ||
| 247 | #include <linux/gpio_keys.h> | ||
| 248 | |||
| 249 | static struct gpio_keys_button bfin_gpio_keys_table[] = { | ||
| 250 | {BTN_0, GPIO_PF4, 0, "gpio-keys: BTN0"}, | ||
| 251 | {BTN_1, GPIO_PF5, 0, "gpio-keys: BTN1"}, | ||
| 252 | {BTN_2, GPIO_PF6, 0, "gpio-keys: BTN2"}, | ||
| 253 | }; /* Mapped to the first three PF Test Points */ | ||
| 254 | |||
| 255 | static struct gpio_keys_platform_data bfin_gpio_keys_data = { | ||
| 256 | .buttons = bfin_gpio_keys_table, | ||
| 257 | .nbuttons = ARRAY_SIZE(bfin_gpio_keys_table), | ||
| 258 | }; | ||
| 259 | |||
| 260 | static struct platform_device bfin_device_gpiokeys = { | ||
| 261 | .name = "gpio-keys", | ||
| 262 | .dev = { | ||
| 263 | .platform_data = &bfin_gpio_keys_data, | ||
| 264 | }, | ||
| 265 | }; | ||
| 266 | #endif | ||
| 267 | |||
| 268 | static struct resource bfin_gpios_resources = { | ||
| 269 | .start = 0, | ||
| 270 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 271 | .flags = IORESOURCE_IRQ, | ||
| 272 | }; | ||
| 273 | |||
| 274 | static struct platform_device bfin_gpios_device = { | ||
| 275 | .name = "simple-gpio", | ||
| 276 | .id = -1, | ||
| 277 | .num_resources = 1, | ||
| 278 | .resource = &bfin_gpios_resources, | ||
| 279 | }; | ||
| 280 | |||
| 281 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
| 282 | #include <linux/i2c-gpio.h> | ||
| 283 | |||
| 284 | static struct i2c_gpio_platform_data i2c_gpio_data = { | ||
| 285 | .sda_pin = 8, | ||
| 286 | .scl_pin = 9, | ||
| 287 | .sda_is_open_drain = 0, | ||
| 288 | .scl_is_open_drain = 0, | ||
| 289 | .udelay = 40, | ||
| 290 | }; /* This hasn't actually been used these pins | ||
| 291 | * are (currently) free pins on the expansion connector */ | ||
| 292 | |||
| 293 | static struct platform_device i2c_gpio_device = { | ||
| 294 | .name = "i2c-gpio", | ||
| 295 | .id = 0, | ||
| 296 | .dev = { | ||
| 297 | .platform_data = &i2c_gpio_data, | ||
| 298 | }, | ||
| 299 | }; | ||
| 300 | #endif | ||
| 301 | |||
| 302 | #ifdef CONFIG_I2C_BOARDINFO | ||
| 303 | static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | ||
| 304 | }; | ||
| 305 | #endif | ||
| 306 | |||
| 307 | static const unsigned int cclk_vlev_datasheet[] = | ||
| 308 | { | ||
| 309 | VRPAIR(VLEV_085, 250000000), | ||
| 310 | VRPAIR(VLEV_090, 376000000), | ||
| 311 | VRPAIR(VLEV_095, 426000000), | ||
| 312 | VRPAIR(VLEV_100, 426000000), | ||
| 313 | VRPAIR(VLEV_105, 476000000), | ||
| 314 | VRPAIR(VLEV_110, 476000000), | ||
| 315 | VRPAIR(VLEV_115, 476000000), | ||
| 316 | VRPAIR(VLEV_120, 600000000), | ||
| 317 | VRPAIR(VLEV_125, 600000000), | ||
| 318 | VRPAIR(VLEV_130, 600000000), | ||
| 319 | }; | ||
| 320 | |||
| 321 | static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { | ||
| 322 | .tuple_tab = cclk_vlev_datasheet, | ||
| 323 | .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), | ||
| 324 | .vr_settling_time = 25 /* us */, | ||
| 325 | }; | ||
| 326 | |||
| 327 | static struct platform_device bfin_dpmc = { | ||
| 328 | .name = "bfin dpmc", | ||
| 329 | .dev = { | ||
| 330 | .platform_data = &bfin_dmpc_vreg_data, | ||
| 331 | }, | ||
| 332 | }; | ||
| 333 | |||
| 334 | static struct platform_device *stamp_devices[] __initdata = { | ||
| 335 | |||
| 336 | &bfin_dpmc, | ||
| 337 | |||
| 338 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
| 339 | &rtc_device, | ||
| 340 | #endif | ||
| 341 | |||
| 342 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
| 343 | &smc91x_device, | ||
| 344 | #endif | ||
| 345 | |||
| 346 | |||
| 347 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
| 348 | &bfin_spi0_device, | ||
| 349 | #endif | ||
| 350 | |||
| 351 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
| 352 | &bfin_uart_device, | ||
| 353 | #endif | ||
| 354 | |||
| 355 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
| 356 | &bfin_sir_device, | ||
| 357 | #endif | ||
| 358 | |||
| 359 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
| 360 | &bfin_sport0_uart_device, | ||
| 361 | &bfin_sport1_uart_device, | ||
| 362 | #endif | ||
| 363 | |||
| 364 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
| 365 | &bfin_device_gpiokeys, | ||
| 366 | #endif | ||
| 367 | |||
| 368 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
| 369 | &i2c_gpio_device, | ||
| 370 | #endif | ||
| 371 | |||
| 372 | &bfin_gpios_device, | ||
| 373 | }; | ||
| 374 | |||
| 375 | static int __init blackstamp_init(void) | ||
| 376 | { | ||
| 377 | int ret; | ||
| 378 | |||
| 379 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | ||
| 380 | |||
| 381 | #ifdef CONFIG_I2C_BOARDINFO | ||
| 382 | i2c_register_board_info(0, bfin_i2c_board_info, | ||
| 383 | ARRAY_SIZE(bfin_i2c_board_info)); | ||
| 384 | #endif | ||
| 385 | |||
| 386 | ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | ||
| 387 | if (ret < 0) | ||
| 388 | return ret; | ||
| 389 | |||
| 390 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
| 391 | /* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */ | ||
| 392 | bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0); | ||
| 393 | bfin_write_FIO_FLAG_S(PF0); | ||
| 394 | SSYNC(); | ||
| 395 | #endif | ||
| 396 | |||
| 397 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | ||
| 398 | return 0; | ||
| 399 | } | ||
| 400 | |||
| 401 | arch_initcall(blackstamp_init); | ||
diff --git a/arch/blackfin/mach-bf533/boards/cm_bf533.c b/arch/blackfin/mach-bf533/boards/cm_bf533.c index ed2b0b8f5dc9..575843f6d9ef 100644 --- a/arch/blackfin/mach-bf533/boards/cm_bf533.c +++ b/arch/blackfin/mach-bf533/boards/cm_bf533.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 36 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 37 | #include <linux/usb/isp1362.h> | 37 | #include <linux/usb/isp1362.h> |
| 38 | #endif | 38 | #endif |
| 39 | #include <linux/ata_platform.h> | ||
| 40 | #include <linux/irq.h> | 39 | #include <linux/irq.h> |
| 41 | #include <asm/dma.h> | 40 | #include <asm/dma.h> |
| 42 | #include <asm/bfin5xx_spi.h> | 41 | #include <asm/bfin5xx_spi.h> |
| @@ -53,16 +52,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF533"; | |||
| 53 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 52 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 54 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 53 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 55 | { | 54 | { |
| 56 | .name = "bootloader", | 55 | .name = "bootloader(spi)", |
| 57 | .size = 0x00020000, | 56 | .size = 0x00020000, |
| 58 | .offset = 0, | 57 | .offset = 0, |
| 59 | .mask_flags = MTD_CAP_ROM | 58 | .mask_flags = MTD_CAP_ROM |
| 60 | }, { | 59 | }, { |
| 61 | .name = "kernel", | 60 | .name = "linux kernel(spi)", |
| 62 | .size = 0xe0000, | 61 | .size = 0xe0000, |
| 63 | .offset = 0x20000 | 62 | .offset = 0x20000 |
| 64 | }, { | 63 | }, { |
| 65 | .name = "file system", | 64 | .name = "file system(spi)", |
| 66 | .size = 0x700000, | 65 | .size = 0x700000, |
| 67 | .offset = 0x00100000, | 66 | .offset = 0x00100000, |
| 68 | } | 67 | } |
| @@ -307,43 +306,6 @@ static struct platform_device isp1362_hcd_device = { | |||
| 307 | }; | 306 | }; |
| 308 | #endif | 307 | #endif |
| 309 | 308 | ||
| 310 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 311 | #define PATA_INT 38 | ||
| 312 | |||
| 313 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 314 | .ioport_shift = 2, | ||
| 315 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 316 | }; | ||
| 317 | |||
| 318 | static struct resource bfin_pata_resources[] = { | ||
| 319 | { | ||
| 320 | .start = 0x2030C000, | ||
| 321 | .end = 0x2030C01F, | ||
| 322 | .flags = IORESOURCE_MEM, | ||
| 323 | }, | ||
| 324 | { | ||
| 325 | .start = 0x2030D018, | ||
| 326 | .end = 0x2030D01B, | ||
| 327 | .flags = IORESOURCE_MEM, | ||
| 328 | }, | ||
| 329 | { | ||
| 330 | .start = PATA_INT, | ||
| 331 | .end = PATA_INT, | ||
| 332 | .flags = IORESOURCE_IRQ, | ||
| 333 | }, | ||
| 334 | }; | ||
| 335 | |||
| 336 | static struct platform_device bfin_pata_device = { | ||
| 337 | .name = "pata_platform", | ||
| 338 | .id = -1, | ||
| 339 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 340 | .resource = bfin_pata_resources, | ||
| 341 | .dev = { | ||
| 342 | .platform_data = &bfin_pata_platform_data, | ||
| 343 | } | ||
| 344 | }; | ||
| 345 | #endif | ||
| 346 | |||
| 347 | static const unsigned int cclk_vlev_datasheet[] = | 309 | static const unsigned int cclk_vlev_datasheet[] = |
| 348 | { | 310 | { |
| 349 | VRPAIR(VLEV_085, 250000000), | 311 | VRPAIR(VLEV_085, 250000000), |
| @@ -403,10 +365,6 @@ static struct platform_device *cm_bf533_devices[] __initdata = { | |||
| 403 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | 365 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) |
| 404 | &bfin_spi0_device, | 366 | &bfin_spi0_device, |
| 405 | #endif | 367 | #endif |
| 406 | |||
| 407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 408 | &bfin_pata_device, | ||
| 409 | #endif | ||
| 410 | }; | 368 | }; |
| 411 | 369 | ||
| 412 | static int __init cm_bf533_init(void) | 370 | static int __init cm_bf533_init(void) |
| @@ -416,10 +374,6 @@ static int __init cm_bf533_init(void) | |||
| 416 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | 374 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) |
| 417 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 375 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 418 | #endif | 376 | #endif |
| 419 | |||
| 420 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 421 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 422 | #endif | ||
| 423 | return 0; | 377 | return 0; |
| 424 | } | 378 | } |
| 425 | 379 | ||
diff --git a/arch/blackfin/mach-bf533/boards/ezkit.c b/arch/blackfin/mach-bf533/boards/ezkit.c index 079389cbd859..cc2e7eeb1d5a 100644 --- a/arch/blackfin/mach-bf533/boards/ezkit.c +++ b/arch/blackfin/mach-bf533/boards/ezkit.c | |||
| @@ -37,7 +37,6 @@ | |||
| 37 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 37 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 38 | #include <linux/usb/isp1362.h> | 38 | #include <linux/usb/isp1362.h> |
| 39 | #endif | 39 | #endif |
| 40 | #include <linux/ata_platform.h> | ||
| 41 | #include <linux/irq.h> | 40 | #include <linux/irq.h> |
| 42 | #include <asm/dma.h> | 41 | #include <asm/dma.h> |
| 43 | #include <asm/bfin5xx_spi.h> | 42 | #include <asm/bfin5xx_spi.h> |
| @@ -90,16 +89,16 @@ static struct platform_device smc91x_device = { | |||
| 90 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 89 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 91 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 90 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 92 | { | 91 | { |
| 93 | .name = "bootloader", | 92 | .name = "bootloader(spi)", |
| 94 | .size = 0x00020000, | 93 | .size = 0x00020000, |
| 95 | .offset = 0, | 94 | .offset = 0, |
| 96 | .mask_flags = MTD_CAP_ROM | 95 | .mask_flags = MTD_CAP_ROM |
| 97 | }, { | 96 | }, { |
| 98 | .name = "kernel", | 97 | .name = "linux kernel(spi)", |
| 99 | .size = 0xe0000, | 98 | .size = 0xe0000, |
| 100 | .offset = MTDPART_OFS_APPEND, | 99 | .offset = MTDPART_OFS_APPEND, |
| 101 | }, { | 100 | }, { |
| 102 | .name = "file system", | 101 | .name = "file system(spi)", |
| 103 | .size = MTDPART_SIZ_FULL, | 102 | .size = MTDPART_SIZ_FULL, |
| 104 | .offset = MTDPART_OFS_APPEND, | 103 | .offset = MTDPART_OFS_APPEND, |
| 105 | } | 104 | } |
| @@ -255,43 +254,6 @@ static struct platform_device bfin_sir_device = { | |||
| 255 | }; | 254 | }; |
| 256 | #endif | 255 | #endif |
| 257 | 256 | ||
| 258 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 259 | #define PATA_INT 55 | ||
| 260 | |||
| 261 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 262 | .ioport_shift = 1, | ||
| 263 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 264 | }; | ||
| 265 | |||
| 266 | static struct resource bfin_pata_resources[] = { | ||
| 267 | { | ||
| 268 | .start = 0x20314020, | ||
| 269 | .end = 0x2031403F, | ||
| 270 | .flags = IORESOURCE_MEM, | ||
| 271 | }, | ||
| 272 | { | ||
| 273 | .start = 0x2031401C, | ||
| 274 | .end = 0x2031401F, | ||
| 275 | .flags = IORESOURCE_MEM, | ||
| 276 | }, | ||
| 277 | { | ||
| 278 | .start = PATA_INT, | ||
| 279 | .end = PATA_INT, | ||
| 280 | .flags = IORESOURCE_IRQ, | ||
| 281 | }, | ||
| 282 | }; | ||
| 283 | |||
| 284 | static struct platform_device bfin_pata_device = { | ||
| 285 | .name = "pata_platform", | ||
| 286 | .id = -1, | ||
| 287 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 288 | .resource = bfin_pata_resources, | ||
| 289 | .dev = { | ||
| 290 | .platform_data = &bfin_pata_platform_data, | ||
| 291 | } | ||
| 292 | }; | ||
| 293 | #endif | ||
| 294 | |||
| 295 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 257 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 296 | #include <linux/input.h> | 258 | #include <linux/input.h> |
| 297 | #include <linux/gpio_keys.h> | 259 | #include <linux/gpio_keys.h> |
| @@ -404,10 +366,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 404 | &bfin_sir_device, | 366 | &bfin_sir_device, |
| 405 | #endif | 367 | #endif |
| 406 | 368 | ||
| 407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 408 | &bfin_pata_device, | ||
| 409 | #endif | ||
| 410 | |||
| 411 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 369 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 412 | &bfin_device_gpiokeys, | 370 | &bfin_device_gpiokeys, |
| 413 | #endif | 371 | #endif |
| @@ -424,10 +382,6 @@ static int __init ezkit_init(void) | |||
| 424 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | 382 | printk(KERN_INFO "%s(): registering device resources\n", __func__); |
| 425 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); | 383 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); |
| 426 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 384 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 427 | |||
| 428 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 429 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 430 | #endif | ||
| 431 | return 0; | 385 | return 0; |
| 432 | } | 386 | } |
| 433 | 387 | ||
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index 13ae49515f73..050ffca53530 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
| 40 | #endif | 40 | #endif |
| 41 | #include <linux/ata_platform.h> | ||
| 42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
| 43 | #include <linux/i2c.h> | 42 | #include <linux/i2c.h> |
| 44 | #include <asm/dma.h> | 43 | #include <asm/dma.h> |
| @@ -114,15 +113,15 @@ static struct platform_device net2272_bfin_device = { | |||
| 114 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) | 113 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) |
| 115 | static struct mtd_partition stamp_partitions[] = { | 114 | static struct mtd_partition stamp_partitions[] = { |
| 116 | { | 115 | { |
| 117 | .name = "Bootloader", | 116 | .name = "bootloader(nor)", |
| 118 | .size = 0x40000, | 117 | .size = 0x40000, |
| 119 | .offset = 0, | 118 | .offset = 0, |
| 120 | }, { | 119 | }, { |
| 121 | .name = "Kernel", | 120 | .name = "linux kernel(nor)", |
| 122 | .size = 0xE0000, | 121 | .size = 0xE0000, |
| 123 | .offset = MTDPART_OFS_APPEND, | 122 | .offset = MTDPART_OFS_APPEND, |
| 124 | }, { | 123 | }, { |
| 125 | .name = "RootFS", | 124 | .name = "file system(nor)", |
| 126 | .size = MTDPART_SIZ_FULL, | 125 | .size = MTDPART_SIZ_FULL, |
| 127 | .offset = MTDPART_OFS_APPEND, | 126 | .offset = MTDPART_OFS_APPEND, |
| 128 | } | 127 | } |
| @@ -164,16 +163,16 @@ static struct platform_device stamp_flash_device = { | |||
| 164 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 163 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 165 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 164 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 166 | { | 165 | { |
| 167 | .name = "bootloader", | 166 | .name = "bootloader(spi)", |
| 168 | .size = 0x00040000, | 167 | .size = 0x00040000, |
| 169 | .offset = 0, | 168 | .offset = 0, |
| 170 | .mask_flags = MTD_CAP_ROM | 169 | .mask_flags = MTD_CAP_ROM |
| 171 | }, { | 170 | }, { |
| 172 | .name = "kernel", | 171 | .name = "linux kernel(spi)", |
| 173 | .size = 0xe0000, | 172 | .size = 0xe0000, |
| 174 | .offset = MTDPART_OFS_APPEND, | 173 | .offset = MTDPART_OFS_APPEND, |
| 175 | }, { | 174 | }, { |
| 176 | .name = "file system", | 175 | .name = "file system(spi)", |
| 177 | .size = MTDPART_SIZ_FULL, | 176 | .size = MTDPART_SIZ_FULL, |
| 178 | .offset = MTDPART_OFS_APPEND, | 177 | .offset = MTDPART_OFS_APPEND, |
| 179 | } | 178 | } |
| @@ -404,43 +403,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 404 | }; | 403 | }; |
| 405 | #endif | 404 | #endif |
| 406 | 405 | ||
| 407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 408 | #define PATA_INT 55 | ||
| 409 | |||
| 410 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 411 | .ioport_shift = 1, | ||
| 412 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 413 | }; | ||
| 414 | |||
| 415 | static struct resource bfin_pata_resources[] = { | ||
| 416 | { | ||
| 417 | .start = 0x20314020, | ||
| 418 | .end = 0x2031403F, | ||
| 419 | .flags = IORESOURCE_MEM, | ||
| 420 | }, | ||
| 421 | { | ||
| 422 | .start = 0x2031401C, | ||
| 423 | .end = 0x2031401F, | ||
| 424 | .flags = IORESOURCE_MEM, | ||
| 425 | }, | ||
| 426 | { | ||
| 427 | .start = PATA_INT, | ||
| 428 | .end = PATA_INT, | ||
| 429 | .flags = IORESOURCE_IRQ, | ||
| 430 | }, | ||
| 431 | }; | ||
| 432 | |||
| 433 | static struct platform_device bfin_pata_device = { | ||
| 434 | .name = "pata_platform", | ||
| 435 | .id = -1, | ||
| 436 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 437 | .resource = bfin_pata_resources, | ||
| 438 | .dev = { | ||
| 439 | .platform_data = &bfin_pata_platform_data, | ||
| 440 | } | ||
| 441 | }; | ||
| 442 | #endif | ||
| 443 | |||
| 444 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 406 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 445 | #include <linux/input.h> | 407 | #include <linux/input.h> |
| 446 | #include <linux/gpio_keys.h> | 408 | #include <linux/gpio_keys.h> |
| @@ -583,10 +545,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 583 | &bfin_sport1_uart_device, | 545 | &bfin_sport1_uart_device, |
| 584 | #endif | 546 | #endif |
| 585 | 547 | ||
| 586 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 587 | &bfin_pata_device, | ||
| 588 | #endif | ||
| 589 | |||
| 590 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 548 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 591 | &bfin_device_gpiokeys, | 549 | &bfin_device_gpiokeys, |
| 592 | #endif | 550 | #endif |
| @@ -625,10 +583,6 @@ static int __init stamp_init(void) | |||
| 625 | #endif | 583 | #endif |
| 626 | 584 | ||
| 627 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 585 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 628 | |||
| 629 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 630 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 631 | #endif | ||
| 632 | return 0; | 586 | return 0; |
| 633 | } | 587 | } |
| 634 | 588 | ||
diff --git a/arch/blackfin/mach-bf533/head.S b/arch/blackfin/mach-bf533/head.S index c671e8549b17..d59db86195b6 100644 --- a/arch/blackfin/mach-bf533/head.S +++ b/arch/blackfin/mach-bf533/head.S | |||
| @@ -30,294 +30,11 @@ | |||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | #include <asm/trace.h> | ||
| 34 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 35 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
| 36 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
| 37 | #endif | 36 | #endif |
| 38 | 37 | ||
| 39 | .extern ___bss_stop | ||
| 40 | .extern ___bss_start | ||
| 41 | .extern _bf53x_relocate_l1_mem | ||
| 42 | |||
| 43 | #define INITIAL_STACK 0xFFB01000 | ||
| 44 | |||
| 45 | __INIT | ||
| 46 | |||
| 47 | ENTRY(__start) | ||
| 48 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 49 | R7 = R0; | ||
| 50 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 51 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 52 | R0 = SYSCFG_SNEN; | ||
| 53 | #else | ||
| 54 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 55 | #endif | ||
| 56 | SYSCFG = R0; | ||
| 57 | R0 = 0; | ||
| 58 | |||
| 59 | /* Clear Out All the data and pointer Registers */ | ||
| 60 | R1 = R0; | ||
| 61 | R2 = R0; | ||
| 62 | R3 = R0; | ||
| 63 | R4 = R0; | ||
| 64 | R5 = R0; | ||
| 65 | R6 = R0; | ||
| 66 | |||
| 67 | P0 = R0; | ||
| 68 | P1 = R0; | ||
| 69 | P2 = R0; | ||
| 70 | P3 = R0; | ||
| 71 | P4 = R0; | ||
| 72 | P5 = R0; | ||
| 73 | |||
| 74 | LC0 = r0; | ||
| 75 | LC1 = r0; | ||
| 76 | L0 = r0; | ||
| 77 | L1 = r0; | ||
| 78 | L2 = r0; | ||
| 79 | L3 = r0; | ||
| 80 | |||
| 81 | /* Clear Out All the DAG Registers */ | ||
| 82 | B0 = r0; | ||
| 83 | B1 = r0; | ||
| 84 | B2 = r0; | ||
| 85 | B3 = r0; | ||
| 86 | |||
| 87 | I0 = r0; | ||
| 88 | I1 = r0; | ||
| 89 | I2 = r0; | ||
| 90 | I3 = r0; | ||
| 91 | |||
| 92 | M0 = r0; | ||
| 93 | M1 = r0; | ||
| 94 | M2 = r0; | ||
| 95 | M3 = r0; | ||
| 96 | |||
| 97 | trace_buffer_init(p0,r0); | ||
| 98 | P0 = R1; | ||
| 99 | R0 = R1; | ||
| 100 | |||
| 101 | p0.h = hi(FIO_MASKA_C); | ||
| 102 | p0.l = lo(FIO_MASKA_C); | ||
| 103 | r0 = 0xFFFF(Z); | ||
| 104 | w[p0] = r0.L; /* Disable all interrupts */ | ||
| 105 | ssync; | ||
| 106 | |||
| 107 | p0.h = hi(FIO_MASKB_C); | ||
| 108 | p0.l = lo(FIO_MASKB_C); | ||
| 109 | r0 = 0xFFFF(Z); | ||
| 110 | w[p0] = r0.L; /* Disable all interrupts */ | ||
| 111 | ssync; | ||
| 112 | |||
| 113 | /* Turn off the icache */ | ||
| 114 | p0.l = LO(IMEM_CONTROL); | ||
| 115 | p0.h = HI(IMEM_CONTROL); | ||
| 116 | R1 = [p0]; | ||
| 117 | R0 = ~ENICPLB; | ||
| 118 | R0 = R0 & R1; | ||
| 119 | |||
| 120 | /* Anomaly 05000125 */ | ||
| 121 | #if ANOMALY_05000125 | ||
| 122 | CLI R2; | ||
| 123 | SSYNC; | ||
| 124 | #endif | ||
| 125 | [p0] = R0; | ||
| 126 | SSYNC; | ||
| 127 | #if ANOMALY_05000125 | ||
| 128 | STI R2; | ||
| 129 | #endif | ||
| 130 | |||
| 131 | /* Turn off the dcache */ | ||
| 132 | p0.l = LO(DMEM_CONTROL); | ||
| 133 | p0.h = HI(DMEM_CONTROL); | ||
| 134 | R1 = [p0]; | ||
| 135 | R0 = ~ENDCPLB; | ||
| 136 | R0 = R0 & R1; | ||
| 137 | |||
| 138 | /* Anomaly 05000125 */ | ||
| 139 | #if ANOMALY_05000125 | ||
| 140 | CLI R2; | ||
| 141 | SSYNC; | ||
| 142 | #endif | ||
| 143 | [p0] = R0; | ||
| 144 | SSYNC; | ||
| 145 | #if ANOMALY_05000125 | ||
| 146 | STI R2; | ||
| 147 | #endif | ||
| 148 | |||
| 149 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
| 150 | * so if we dont initalize here, our serial console gets hosed */ | ||
| 151 | p0.h = hi(BFIN_UART_LCR); | ||
| 152 | p0.l = lo(BFIN_UART_LCR); | ||
| 153 | r0 = 0x0(Z); | ||
| 154 | w[p0] = r0.L; /* To enable DLL writes */ | ||
| 155 | ssync; | ||
| 156 | |||
| 157 | p0.h = hi(BFIN_UART_DLL); | ||
| 158 | p0.l = lo(BFIN_UART_DLL); | ||
| 159 | r0 = 0x0(Z); | ||
| 160 | w[p0] = r0.L; | ||
| 161 | ssync; | ||
| 162 | |||
| 163 | p0.h = hi(BFIN_UART_DLH); | ||
| 164 | p0.l = lo(BFIN_UART_DLH); | ||
| 165 | r0 = 0x00(Z); | ||
| 166 | w[p0] = r0.L; | ||
| 167 | ssync; | ||
| 168 | |||
| 169 | p0.h = hi(BFIN_UART_GCTL); | ||
| 170 | p0.l = lo(BFIN_UART_GCTL); | ||
| 171 | r0 = 0x0(Z); | ||
| 172 | w[p0] = r0.L; /* To enable UART clock */ | ||
| 173 | ssync; | ||
| 174 | |||
| 175 | /* Initialize stack pointer */ | ||
| 176 | sp.l = lo(INITIAL_STACK); | ||
| 177 | sp.h = hi(INITIAL_STACK); | ||
| 178 | fp = sp; | ||
| 179 | usp = sp; | ||
| 180 | |||
| 181 | #ifdef CONFIG_EARLY_PRINTK | ||
| 182 | SP += -12; | ||
| 183 | call _init_early_exception_vectors; | ||
| 184 | SP += 12; | ||
| 185 | #endif | ||
| 186 | |||
| 187 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 188 | call _bf53x_relocate_l1_mem; | ||
| 189 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
| 190 | call _start_dma_code; | ||
| 191 | #endif | ||
| 192 | |||
| 193 | /* Code for initializing Async memory banks */ | ||
| 194 | |||
| 195 | p2.h = hi(EBIU_AMBCTL1); | ||
| 196 | p2.l = lo(EBIU_AMBCTL1); | ||
| 197 | r0.h = hi(AMBCTL1VAL); | ||
| 198 | r0.l = lo(AMBCTL1VAL); | ||
| 199 | [p2] = r0; | ||
| 200 | ssync; | ||
| 201 | |||
| 202 | p2.h = hi(EBIU_AMBCTL0); | ||
| 203 | p2.l = lo(EBIU_AMBCTL0); | ||
| 204 | r0.h = hi(AMBCTL0VAL); | ||
| 205 | r0.l = lo(AMBCTL0VAL); | ||
| 206 | [p2] = r0; | ||
| 207 | ssync; | ||
| 208 | |||
| 209 | p2.h = hi(EBIU_AMGCTL); | ||
| 210 | p2.l = lo(EBIU_AMGCTL); | ||
| 211 | r0 = AMGCTLVAL; | ||
| 212 | w[p2] = r0; | ||
| 213 | ssync; | ||
| 214 | |||
| 215 | /* This section keeps the processor in supervisor mode | ||
| 216 | * during kernel boot. Switches to user mode at end of boot. | ||
| 217 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 218 | */ | ||
| 219 | |||
| 220 | /* EVT15 = _real_start */ | ||
| 221 | |||
| 222 | p0.l = lo(EVT15); | ||
| 223 | p0.h = hi(EVT15); | ||
| 224 | p1.l = _real_start; | ||
| 225 | p1.h = _real_start; | ||
| 226 | [p0] = p1; | ||
| 227 | csync; | ||
| 228 | |||
| 229 | p0.l = lo(IMASK); | ||
| 230 | p0.h = hi(IMASK); | ||
| 231 | p1.l = IMASK_IVG15; | ||
| 232 | p1.h = 0x0; | ||
| 233 | [p0] = p1; | ||
| 234 | csync; | ||
| 235 | |||
| 236 | raise 15; | ||
| 237 | p0.l = .LWAIT_HERE; | ||
| 238 | p0.h = .LWAIT_HERE; | ||
| 239 | reti = p0; | ||
| 240 | #if ANOMALY_05000281 | ||
| 241 | nop; nop; nop; | ||
| 242 | #endif | ||
| 243 | rti; | ||
| 244 | |||
| 245 | .LWAIT_HERE: | ||
| 246 | jump .LWAIT_HERE; | ||
| 247 | ENDPROC(__start) | ||
| 248 | |||
| 249 | ENTRY(_real_start) | ||
| 250 | [ -- sp ] = reti; | ||
| 251 | p0.l = lo(WDOG_CTL); | ||
| 252 | p0.h = hi(WDOG_CTL); | ||
| 253 | r0 = 0xAD6(z); | ||
| 254 | w[p0] = r0; /* watchdog off for now */ | ||
| 255 | ssync; | ||
| 256 | |||
| 257 | /* Code update for BSS size == 0 | ||
| 258 | * Zero out the bss region. | ||
| 259 | */ | ||
| 260 | |||
| 261 | p1.l = ___bss_start; | ||
| 262 | p1.h = ___bss_start; | ||
| 263 | p2.l = ___bss_stop; | ||
| 264 | p2.h = ___bss_stop; | ||
| 265 | r0 = 0; | ||
| 266 | p2 -= p1; | ||
| 267 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
| 268 | .L_clear_bss: | ||
| 269 | B[p1++] = r0; | ||
| 270 | |||
| 271 | /* In case there is a NULL pointer reference | ||
| 272 | * Zero out region before stext | ||
| 273 | */ | ||
| 274 | |||
| 275 | p1.l = 0x0; | ||
| 276 | p1.h = 0x0; | ||
| 277 | r0.l = __stext; | ||
| 278 | r0.h = __stext; | ||
| 279 | r0 = r0 >> 1; | ||
| 280 | p2 = r0; | ||
| 281 | r0 = 0; | ||
| 282 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
| 283 | .L_clear_zero: | ||
| 284 | W[p1++] = r0; | ||
| 285 | |||
| 286 | /* pass the uboot arguments to the global value command line */ | ||
| 287 | R0 = R7; | ||
| 288 | call _cmdline_init; | ||
| 289 | |||
| 290 | p1.l = __rambase; | ||
| 291 | p1.h = __rambase; | ||
| 292 | r0.l = __sdata; | ||
| 293 | r0.h = __sdata; | ||
| 294 | [p1] = r0; | ||
| 295 | |||
| 296 | p1.l = __ramstart; | ||
| 297 | p1.h = __ramstart; | ||
| 298 | p3.l = ___bss_stop; | ||
| 299 | p3.h = ___bss_stop; | ||
| 300 | |||
| 301 | r1 = p3; | ||
| 302 | [p1] = r1; | ||
| 303 | |||
| 304 | /* | ||
| 305 | * load the current thread pointer and stack | ||
| 306 | */ | ||
| 307 | r1.l = _init_thread_union; | ||
| 308 | r1.h = _init_thread_union; | ||
| 309 | |||
| 310 | r2.l = 0x2000; | ||
| 311 | r2.h = 0x0000; | ||
| 312 | r1 = r1 + r2; | ||
| 313 | sp = r1; | ||
| 314 | usp = sp; | ||
| 315 | fp = sp; | ||
| 316 | jump.l _start_kernel; | ||
| 317 | ENDPROC(_real_start) | ||
| 318 | |||
| 319 | __FINIT | ||
| 320 | |||
| 321 | .section .l1.text | 38 | .section .l1.text |
| 322 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 323 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
| @@ -412,13 +129,6 @@ ENTRY(_start_dma_code) | |||
| 412 | [P2] = R1; | 129 | [P2] = R1; |
| 413 | SSYNC; | 130 | SSYNC; |
| 414 | 131 | ||
| 415 | p0.h = hi(SIC_IWR); | ||
| 416 | p0.l = lo(SIC_IWR); | ||
| 417 | r0.l = lo(IWR_ENABLE_ALL); | ||
| 418 | r0.h = hi(IWR_ENABLE_ALL); | ||
| 419 | [p0] = r0; | ||
| 420 | SSYNC; | ||
| 421 | |||
| 422 | RTS; | 132 | RTS; |
| 423 | ENDPROC(_start_dma_code) | 133 | ENDPROC(_start_dma_code) |
| 424 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 134 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf533/ints-priority.c b/arch/blackfin/mach-bf533/ints-priority.c index 7d79e0f9503d..f51994b7a2b9 100644 --- a/arch/blackfin/mach-bf533/ints-priority.c +++ b/arch/blackfin/mach-bf533/ints-priority.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | 33 | ||
| 34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
| 35 | { | 35 | { |
| 36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
| 37 | bfin_write_SIC_IAR0(((CONFIG_PLLWAKE_ERROR - 7) << PLLWAKE_ERROR_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_PLLWAKE_ERROR - 7) << PLLWAKE_ERROR_POS) | |
diff --git a/arch/blackfin/mach-bf537/boards/Kconfig b/arch/blackfin/mach-bf537/boards/Kconfig index 7e789dbef036..42a57b0acb29 100644 --- a/arch/blackfin/mach-bf537/boards/Kconfig +++ b/arch/blackfin/mach-bf537/boards/Kconfig | |||
| @@ -15,6 +15,12 @@ config BFIN537_BLUETECHNIX_CM | |||
| 15 | help | 15 | help |
| 16 | CM-BF537 support for EVAL- and DEV-Board. | 16 | CM-BF537 support for EVAL- and DEV-Board. |
| 17 | 17 | ||
| 18 | config BFIN537_BLUETECHNIX_TCM | ||
| 19 | bool "Bluetechnix TCM-BF537" | ||
| 20 | depends on (BF537) | ||
| 21 | help | ||
| 22 | TCM-BF537 support for EVAL- and DEV-Board. | ||
| 23 | |||
| 18 | config PNAV10 | 24 | config PNAV10 |
| 19 | bool "PNAV board" | 25 | bool "PNAV board" |
| 20 | depends on (BF537) | 26 | depends on (BF537) |
diff --git a/arch/blackfin/mach-bf537/boards/Makefile b/arch/blackfin/mach-bf537/boards/Makefile index c94f7a5b8211..7168cc14afd8 100644 --- a/arch/blackfin/mach-bf537/boards/Makefile +++ b/arch/blackfin/mach-bf537/boards/Makefile | |||
| @@ -5,5 +5,6 @@ | |||
| 5 | obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o | 5 | obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o |
| 6 | obj-$(CONFIG_BFIN537_STAMP) += stamp.o | 6 | obj-$(CONFIG_BFIN537_STAMP) += stamp.o |
| 7 | obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o | 7 | obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o |
| 8 | obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o | ||
| 8 | obj-$(CONFIG_PNAV10) += pnav10.o | 9 | obj-$(CONFIG_PNAV10) += pnav10.o |
| 9 | obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o | 10 | obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537.c b/arch/blackfin/mach-bf537/boards/cm_bf537.c index 73f2142875e2..dde14720b0ea 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
| 34 | #include <linux/mtd/mtd.h> | 34 | #include <linux/mtd/mtd.h> |
| 35 | #include <linux/mtd/partitions.h> | 35 | #include <linux/mtd/partitions.h> |
| 36 | #include <linux/mtd/physmap.h> | ||
| 36 | #include <linux/spi/spi.h> | 37 | #include <linux/spi/spi.h> |
| 37 | #include <linux/spi/flash.h> | 38 | #include <linux/spi/flash.h> |
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| @@ -56,16 +57,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF537"; | |||
| 56 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 57 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 57 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 58 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 58 | { | 59 | { |
| 59 | .name = "bootloader", | 60 | .name = "bootloader(spi)", |
| 60 | .size = 0x00020000, | 61 | .size = 0x00020000, |
| 61 | .offset = 0, | 62 | .offset = 0, |
| 62 | .mask_flags = MTD_CAP_ROM | 63 | .mask_flags = MTD_CAP_ROM |
| 63 | }, { | 64 | }, { |
| 64 | .name = "kernel", | 65 | .name = "linux kernel(spi)", |
| 65 | .size = 0xe0000, | 66 | .size = 0xe0000, |
| 66 | .offset = 0x20000 | 67 | .offset = 0x20000 |
| 67 | }, { | 68 | }, { |
| 68 | .name = "file system", | 69 | .name = "file system(spi)", |
| 69 | .size = 0x700000, | 70 | .size = 0x700000, |
| 70 | .offset = 0x00100000, | 71 | .offset = 0x00100000, |
| 71 | } | 72 | } |
| @@ -307,6 +308,55 @@ static struct platform_device net2272_bfin_device = { | |||
| 307 | }; | 308 | }; |
| 308 | #endif | 309 | #endif |
| 309 | 310 | ||
| 311 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
| 312 | static struct mtd_partition cm_partitions[] = { | ||
| 313 | { | ||
| 314 | .name = "bootloader(nor)", | ||
| 315 | .size = 0x40000, | ||
| 316 | .offset = 0, | ||
| 317 | }, { | ||
| 318 | .name = "linux kernel(nor)", | ||
| 319 | .size = 0xE0000, | ||
| 320 | .offset = MTDPART_OFS_APPEND, | ||
| 321 | }, { | ||
| 322 | .name = "file system(nor)", | ||
| 323 | .size = MTDPART_SIZ_FULL, | ||
| 324 | .offset = MTDPART_OFS_APPEND, | ||
| 325 | } | ||
| 326 | }; | ||
| 327 | |||
| 328 | static struct physmap_flash_data cm_flash_data = { | ||
| 329 | .width = 2, | ||
| 330 | .parts = cm_partitions, | ||
| 331 | .nr_parts = ARRAY_SIZE(cm_partitions), | ||
| 332 | }; | ||
| 333 | |||
| 334 | static unsigned cm_flash_gpios[] = { GPIO_PF4 }; | ||
| 335 | |||
| 336 | static struct resource cm_flash_resource[] = { | ||
| 337 | { | ||
| 338 | .name = "cfi_probe", | ||
| 339 | .start = 0x20000000, | ||
| 340 | .end = 0x201fffff, | ||
| 341 | .flags = IORESOURCE_MEM, | ||
| 342 | }, { | ||
| 343 | .start = (unsigned long)cm_flash_gpios, | ||
| 344 | .end = ARRAY_SIZE(cm_flash_gpios), | ||
| 345 | .flags = IORESOURCE_IRQ, | ||
| 346 | } | ||
| 347 | }; | ||
| 348 | |||
| 349 | static struct platform_device cm_flash_device = { | ||
| 350 | .name = "gpio-addr-flash", | ||
| 351 | .id = 0, | ||
| 352 | .dev = { | ||
| 353 | .platform_data = &cm_flash_data, | ||
| 354 | }, | ||
| 355 | .num_resources = ARRAY_SIZE(cm_flash_resource), | ||
| 356 | .resource = cm_flash_resource, | ||
| 357 | }; | ||
| 358 | #endif | ||
| 359 | |||
| 310 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 360 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 311 | static struct resource bfin_uart_resources[] = { | 361 | static struct resource bfin_uart_resources[] = { |
| 312 | { | 362 | { |
| @@ -395,7 +445,7 @@ static struct platform_device bfin_mac_device = { | |||
| 395 | #endif | 445 | #endif |
| 396 | 446 | ||
| 397 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 447 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
| 398 | #define PATA_INT 64 | 448 | #define PATA_INT IRQ_PF14 |
| 399 | 449 | ||
| 400 | static struct pata_platform_info bfin_pata_platform_data = { | 450 | static struct pata_platform_info bfin_pata_platform_data = { |
| 401 | .ioport_shift = 2, | 451 | .ioport_shift = 2, |
| @@ -510,6 +560,10 @@ static struct platform_device *cm_bf537_devices[] __initdata = { | |||
| 510 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 560 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
| 511 | &bfin_pata_device, | 561 | &bfin_pata_device, |
| 512 | #endif | 562 | #endif |
| 563 | |||
| 564 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
| 565 | &cm_flash_device, | ||
| 566 | #endif | ||
| 513 | }; | 567 | }; |
| 514 | 568 | ||
| 515 | static int __init cm_bf537_init(void) | 569 | static int __init cm_bf537_init(void) |
diff --git a/arch/blackfin/mach-bf537/boards/generic_board.c b/arch/blackfin/mach-bf537/boards/generic_board.c index 01b63e2ec18f..78a13d5bfd55 100644 --- a/arch/blackfin/mach-bf537/boards/generic_board.c +++ b/arch/blackfin/mach-bf537/boards/generic_board.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
| 40 | #endif | 40 | #endif |
| 41 | #include <linux/ata_platform.h> | ||
| 42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
| 43 | #include <linux/interrupt.h> | 42 | #include <linux/interrupt.h> |
| 44 | #include <linux/usb/sl811.h> | 43 | #include <linux/usb/sl811.h> |
| @@ -307,16 +306,16 @@ static struct platform_device net2272_bfin_device = { | |||
| 307 | || defined(CONFIG_MTD_M25P80_MODULE) | 306 | || defined(CONFIG_MTD_M25P80_MODULE) |
| 308 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 307 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 309 | { | 308 | { |
| 310 | .name = "bootloader", | 309 | .name = "bootloader(spi)", |
| 311 | .size = 0x00020000, | 310 | .size = 0x00020000, |
| 312 | .offset = 0, | 311 | .offset = 0, |
| 313 | .mask_flags = MTD_CAP_ROM | 312 | .mask_flags = MTD_CAP_ROM |
| 314 | }, { | 313 | }, { |
| 315 | .name = "kernel", | 314 | .name = "linux kernel(spi)", |
| 316 | .size = 0xe0000, | 315 | .size = 0xe0000, |
| 317 | .offset = 0x20000 | 316 | .offset = 0x20000 |
| 318 | }, { | 317 | }, { |
| 319 | .name = "file system", | 318 | .name = "file system(spi)", |
| 320 | .size = 0x700000, | 319 | .size = 0x700000, |
| 321 | .offset = 0x00100000, | 320 | .offset = 0x00100000, |
| 322 | } | 321 | } |
| @@ -619,43 +618,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 619 | }; | 618 | }; |
| 620 | #endif | 619 | #endif |
| 621 | 620 | ||
| 622 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 623 | #define PATA_INT 55 | ||
| 624 | |||
| 625 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 626 | .ioport_shift = 1, | ||
| 627 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 628 | }; | ||
| 629 | |||
| 630 | static struct resource bfin_pata_resources[] = { | ||
| 631 | { | ||
| 632 | .start = 0x20314020, | ||
| 633 | .end = 0x2031403F, | ||
| 634 | .flags = IORESOURCE_MEM, | ||
| 635 | }, | ||
| 636 | { | ||
| 637 | .start = 0x2031401C, | ||
| 638 | .end = 0x2031401F, | ||
| 639 | .flags = IORESOURCE_MEM, | ||
| 640 | }, | ||
| 641 | { | ||
| 642 | .start = PATA_INT, | ||
| 643 | .end = PATA_INT, | ||
| 644 | .flags = IORESOURCE_IRQ, | ||
| 645 | }, | ||
| 646 | }; | ||
| 647 | |||
| 648 | static struct platform_device bfin_pata_device = { | ||
| 649 | .name = "pata_platform", | ||
| 650 | .id = -1, | ||
| 651 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 652 | .resource = bfin_pata_resources, | ||
| 653 | .dev = { | ||
| 654 | .platform_data = &bfin_pata_platform_data, | ||
| 655 | } | ||
| 656 | }; | ||
| 657 | #endif | ||
| 658 | |||
| 659 | static struct platform_device *stamp_devices[] __initdata = { | 621 | static struct platform_device *stamp_devices[] __initdata = { |
| 660 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) | 622 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) |
| 661 | &bfin_pcmcia_cf_device, | 623 | &bfin_pcmcia_cf_device, |
| @@ -717,10 +679,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 717 | &bfin_sport0_uart_device, | 679 | &bfin_sport0_uart_device, |
| 718 | &bfin_sport1_uart_device, | 680 | &bfin_sport1_uart_device, |
| 719 | #endif | 681 | #endif |
| 720 | |||
| 721 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 722 | &bfin_pata_device, | ||
| 723 | #endif | ||
| 724 | }; | 682 | }; |
| 725 | 683 | ||
| 726 | static int __init stamp_init(void) | 684 | static int __init stamp_init(void) |
| @@ -732,9 +690,6 @@ static int __init stamp_init(void) | |||
| 732 | ARRAY_SIZE(bfin_spi_board_info)); | 690 | ARRAY_SIZE(bfin_spi_board_info)); |
| 733 | #endif | 691 | #endif |
| 734 | 692 | ||
| 735 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 736 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 737 | #endif | ||
| 738 | return 0; | 693 | return 0; |
| 739 | } | 694 | } |
| 740 | 695 | ||
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index 18ddf7a52005..48c4cd2d1be6 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c | |||
| @@ -100,16 +100,16 @@ static struct platform_device net2272_bfin_device = { | |||
| 100 | 100 | ||
| 101 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 101 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 102 | { | 102 | { |
| 103 | .name = "uboot", | 103 | .name = "bootloader(spi)", |
| 104 | .size = PSIZE_UBOOT, | 104 | .size = PSIZE_UBOOT, |
| 105 | .offset = 0x000000, | 105 | .offset = 0x000000, |
| 106 | .mask_flags = MTD_CAP_ROM | 106 | .mask_flags = MTD_CAP_ROM |
| 107 | }, { | 107 | }, { |
| 108 | .name = "initramfs", | 108 | .name = "initramfs(spi)", |
| 109 | .size = PSIZE_INITRAMFS, | 109 | .size = PSIZE_INITRAMFS, |
| 110 | .offset = PSIZE_UBOOT | 110 | .offset = PSIZE_UBOOT |
| 111 | }, { | 111 | }, { |
| 112 | .name = "opt", | 112 | .name = "opt(spi)", |
| 113 | .size = FLASH_SIZE - (PSIZE_UBOOT + PSIZE_INITRAMFS), | 113 | .size = FLASH_SIZE - (PSIZE_UBOOT + PSIZE_INITRAMFS), |
| 114 | .offset = PSIZE_UBOOT + PSIZE_INITRAMFS, | 114 | .offset = PSIZE_UBOOT + PSIZE_INITRAMFS, |
| 115 | } | 115 | } |
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 51c3bab14a69..f9174c11cbd4 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c | |||
| @@ -231,16 +231,16 @@ static struct platform_device net2272_bfin_device = { | |||
| 231 | || defined(CONFIG_MTD_M25P80_MODULE) | 231 | || defined(CONFIG_MTD_M25P80_MODULE) |
| 232 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 232 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 233 | { | 233 | { |
| 234 | .name = "bootloader", | 234 | .name = "bootloader(spi)", |
| 235 | .size = 0x00020000, | 235 | .size = 0x00020000, |
| 236 | .offset = 0, | 236 | .offset = 0, |
| 237 | .mask_flags = MTD_CAP_ROM | 237 | .mask_flags = MTD_CAP_ROM |
| 238 | }, { | 238 | }, { |
| 239 | .name = "kernel", | 239 | .name = "linux kernel(spi)", |
| 240 | .size = 0xe0000, | 240 | .size = 0xe0000, |
| 241 | .offset = 0x20000 | 241 | .offset = 0x20000 |
| 242 | }, { | 242 | }, { |
| 243 | .name = "file system", | 243 | .name = "file system(spi)", |
| 244 | .size = 0x700000, | 244 | .size = 0x700000, |
| 245 | .offset = 0x00100000, | 245 | .offset = 0x00100000, |
| 246 | } | 246 | } |
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index 6dbc76fb080b..e93964fdb432 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
| @@ -364,11 +364,11 @@ const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; | |||
| 364 | 364 | ||
| 365 | static struct mtd_partition bfin_plat_nand_partitions[] = { | 365 | static struct mtd_partition bfin_plat_nand_partitions[] = { |
| 366 | { | 366 | { |
| 367 | .name = "linux kernel", | 367 | .name = "linux kernel(nand)", |
| 368 | .size = 0x400000, | 368 | .size = 0x400000, |
| 369 | .offset = 0, | 369 | .offset = 0, |
| 370 | }, { | 370 | }, { |
| 371 | .name = "file system", | 371 | .name = "file system(nand)", |
| 372 | .size = MTDPART_SIZ_FULL, | 372 | .size = MTDPART_SIZ_FULL, |
| 373 | .offset = MTDPART_OFS_APPEND, | 373 | .offset = MTDPART_OFS_APPEND, |
| 374 | }, | 374 | }, |
| @@ -439,19 +439,19 @@ static void bfin_plat_nand_init(void) {} | |||
| 439 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 439 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 440 | static struct mtd_partition stamp_partitions[] = { | 440 | static struct mtd_partition stamp_partitions[] = { |
| 441 | { | 441 | { |
| 442 | .name = "Bootloader", | 442 | .name = "bootloader(nor)", |
| 443 | .size = 0x40000, | 443 | .size = 0x40000, |
| 444 | .offset = 0, | 444 | .offset = 0, |
| 445 | }, { | 445 | }, { |
| 446 | .name = "Kernel", | 446 | .name = "linux kernel(nor)", |
| 447 | .size = 0xE0000, | 447 | .size = 0xE0000, |
| 448 | .offset = MTDPART_OFS_APPEND, | 448 | .offset = MTDPART_OFS_APPEND, |
| 449 | }, { | 449 | }, { |
| 450 | .name = "RootFS", | 450 | .name = "file system(nor)", |
| 451 | .size = 0x400000 - 0x40000 - 0xE0000 - 0x10000, | 451 | .size = 0x400000 - 0x40000 - 0xE0000 - 0x10000, |
| 452 | .offset = MTDPART_OFS_APPEND, | 452 | .offset = MTDPART_OFS_APPEND, |
| 453 | }, { | 453 | }, { |
| 454 | .name = "MAC Address", | 454 | .name = "MAC Address(nor)", |
| 455 | .size = MTDPART_SIZ_FULL, | 455 | .size = MTDPART_SIZ_FULL, |
| 456 | .offset = 0x3F0000, | 456 | .offset = 0x3F0000, |
| 457 | .mask_flags = MTD_WRITEABLE, | 457 | .mask_flags = MTD_WRITEABLE, |
| @@ -485,16 +485,16 @@ static struct platform_device stamp_flash_device = { | |||
| 485 | || defined(CONFIG_MTD_M25P80_MODULE) | 485 | || defined(CONFIG_MTD_M25P80_MODULE) |
| 486 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 486 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 487 | { | 487 | { |
| 488 | .name = "bootloader", | 488 | .name = "bootloader(spi)", |
| 489 | .size = 0x00040000, | 489 | .size = 0x00040000, |
| 490 | .offset = 0, | 490 | .offset = 0, |
| 491 | .mask_flags = MTD_CAP_ROM | 491 | .mask_flags = MTD_CAP_ROM |
| 492 | }, { | 492 | }, { |
| 493 | .name = "kernel", | 493 | .name = "linux kernel(spi)", |
| 494 | .size = 0xe0000, | 494 | .size = 0xe0000, |
| 495 | .offset = MTDPART_OFS_APPEND, | 495 | .offset = MTDPART_OFS_APPEND, |
| 496 | }, { | 496 | }, { |
| 497 | .name = "file system", | 497 | .name = "file system(spi)", |
| 498 | .size = MTDPART_SIZ_FULL, | 498 | .size = MTDPART_SIZ_FULL, |
| 499 | .offset = MTDPART_OFS_APPEND, | 499 | .offset = MTDPART_OFS_APPEND, |
| 500 | } | 500 | } |
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c new file mode 100644 index 000000000000..d5ff705a5129 --- /dev/null +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
| @@ -0,0 +1,590 @@ | |||
| 1 | /* | ||
| 2 | * File: arch/blackfin/mach-bf537/boards/tcm_bf537.c | ||
| 3 | * Based on: arch/blackfin/mach-bf533/boards/cm_bf537.c | ||
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | ||
| 6 | * Created: 2005 | ||
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | ||
| 30 | |||
| 31 | #include <linux/device.h> | ||
| 32 | #include <linux/etherdevice.h> | ||
| 33 | #include <linux/platform_device.h> | ||
| 34 | #include <linux/mtd/mtd.h> | ||
| 35 | #include <linux/mtd/partitions.h> | ||
| 36 | #include <linux/mtd/physmap.h> | ||
| 37 | #include <linux/spi/spi.h> | ||
| 38 | #include <linux/spi/flash.h> | ||
| 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
| 40 | #include <linux/usb/isp1362.h> | ||
| 41 | #endif | ||
| 42 | #include <linux/ata_platform.h> | ||
| 43 | #include <linux/irq.h> | ||
| 44 | #include <asm/dma.h> | ||
| 45 | #include <asm/bfin5xx_spi.h> | ||
| 46 | #include <asm/portmux.h> | ||
| 47 | #include <asm/dpmc.h> | ||
| 48 | |||
| 49 | /* | ||
| 50 | * Name the Board for the /proc/cpuinfo | ||
| 51 | */ | ||
| 52 | const char bfin_board_name[] = "Bluetechnix TCM BF537"; | ||
| 53 | |||
| 54 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
| 55 | /* all SPI peripherals info goes here */ | ||
| 56 | |||
| 57 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
| 58 | static struct mtd_partition bfin_spi_flash_partitions[] = { | ||
| 59 | { | ||
| 60 | .name = "bootloader(spi)", | ||
| 61 | .size = 0x00020000, | ||
| 62 | .offset = 0, | ||
| 63 | .mask_flags = MTD_CAP_ROM | ||
| 64 | }, { | ||
| 65 | .name = "linux kernel(spi)", | ||
| 66 | .size = 0xe0000, | ||
| 67 | .offset = 0x20000 | ||
| 68 | }, { | ||
| 69 | .name = "file system(spi)", | ||
| 70 | .size = 0x700000, | ||
| 71 | .offset = 0x00100000, | ||
| 72 | } | ||
| 73 | }; | ||
| 74 | |||
| 75 | static struct flash_platform_data bfin_spi_flash_data = { | ||
| 76 | .name = "m25p80", | ||
| 77 | .parts = bfin_spi_flash_partitions, | ||
| 78 | .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), | ||
| 79 | .type = "m25p64", | ||
| 80 | }; | ||
| 81 | |||
| 82 | /* SPI flash chip (m25p64) */ | ||
| 83 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | ||
| 84 | .enable_dma = 0, /* use dma transfer with this chip*/ | ||
| 85 | .bits_per_word = 8, | ||
| 86 | }; | ||
| 87 | #endif | ||
| 88 | |||
| 89 | #if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE) | ||
| 90 | /* SPI ADC chip */ | ||
| 91 | static struct bfin5xx_spi_chip spi_adc_chip_info = { | ||
| 92 | .enable_dma = 1, /* use dma transfer with this chip*/ | ||
| 93 | .bits_per_word = 16, | ||
| 94 | }; | ||
| 95 | #endif | ||
| 96 | |||
| 97 | #if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) | ||
| 98 | static struct bfin5xx_spi_chip ad1836_spi_chip_info = { | ||
| 99 | .enable_dma = 0, | ||
| 100 | .bits_per_word = 16, | ||
| 101 | }; | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) | ||
| 105 | static struct bfin5xx_spi_chip ad9960_spi_chip_info = { | ||
| 106 | .enable_dma = 0, | ||
| 107 | .bits_per_word = 16, | ||
| 108 | }; | ||
| 109 | #endif | ||
| 110 | |||
| 111 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
| 112 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { | ||
| 113 | .enable_dma = 1, | ||
| 114 | .bits_per_word = 8, | ||
| 115 | }; | ||
| 116 | #endif | ||
| 117 | |||
| 118 | static struct spi_board_info bfin_spi_board_info[] __initdata = { | ||
| 119 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
| 120 | { | ||
| 121 | /* the modalias must be the same as spi device driver name */ | ||
| 122 | .modalias = "m25p80", /* Name of spi_driver for this device */ | ||
| 123 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
| 124 | .bus_num = 0, /* Framework bus number */ | ||
| 125 | .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/ | ||
| 126 | .platform_data = &bfin_spi_flash_data, | ||
| 127 | .controller_data = &spi_flash_chip_info, | ||
| 128 | .mode = SPI_MODE_3, | ||
| 129 | }, | ||
| 130 | #endif | ||
| 131 | |||
| 132 | #if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE) | ||
| 133 | { | ||
| 134 | .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */ | ||
| 135 | .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */ | ||
| 136 | .bus_num = 0, /* Framework bus number */ | ||
| 137 | .chip_select = 1, /* Framework chip select. */ | ||
| 138 | .platform_data = NULL, /* No spi_driver specific config */ | ||
| 139 | .controller_data = &spi_adc_chip_info, | ||
| 140 | }, | ||
| 141 | #endif | ||
| 142 | |||
| 143 | #if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) | ||
| 144 | { | ||
| 145 | .modalias = "ad1836-spi", | ||
| 146 | .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ | ||
| 147 | .bus_num = 0, | ||
| 148 | .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT, | ||
| 149 | .controller_data = &ad1836_spi_chip_info, | ||
| 150 | }, | ||
| 151 | #endif | ||
| 152 | |||
| 153 | #if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) | ||
| 154 | { | ||
| 155 | .modalias = "ad9960-spi", | ||
| 156 | .max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */ | ||
| 157 | .bus_num = 0, | ||
| 158 | .chip_select = 1, | ||
| 159 | .controller_data = &ad9960_spi_chip_info, | ||
| 160 | }, | ||
| 161 | #endif | ||
| 162 | |||
| 163 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
| 164 | { | ||
| 165 | .modalias = "spi_mmc_dummy", | ||
| 166 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
| 167 | .bus_num = 0, | ||
| 168 | .chip_select = 7, | ||
| 169 | .platform_data = NULL, | ||
| 170 | .controller_data = &spi_mmc_chip_info, | ||
| 171 | .mode = SPI_MODE_3, | ||
| 172 | }, | ||
| 173 | { | ||
| 174 | .modalias = "spi_mmc", | ||
| 175 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
| 176 | .bus_num = 0, | ||
| 177 | .chip_select = CONFIG_SPI_MMC_CS_CHAN, | ||
| 178 | .platform_data = NULL, | ||
| 179 | .controller_data = &spi_mmc_chip_info, | ||
| 180 | .mode = SPI_MODE_3, | ||
| 181 | }, | ||
| 182 | #endif | ||
| 183 | }; | ||
| 184 | |||
| 185 | /* SPI (0) */ | ||
| 186 | static struct resource bfin_spi0_resource[] = { | ||
| 187 | [0] = { | ||
| 188 | .start = SPI0_REGBASE, | ||
| 189 | .end = SPI0_REGBASE + 0xFF, | ||
| 190 | .flags = IORESOURCE_MEM, | ||
| 191 | }, | ||
| 192 | [1] = { | ||
| 193 | .start = CH_SPI, | ||
| 194 | .end = CH_SPI, | ||
| 195 | .flags = IORESOURCE_IRQ, | ||
| 196 | } | ||
| 197 | }; | ||
| 198 | |||
| 199 | /* SPI controller data */ | ||
| 200 | static struct bfin5xx_spi_master bfin_spi0_info = { | ||
| 201 | .num_chipselect = 8, | ||
| 202 | .enable_dma = 1, /* master has the ability to do dma transfer */ | ||
| 203 | .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, | ||
| 204 | }; | ||
| 205 | |||
| 206 | static struct platform_device bfin_spi0_device = { | ||
| 207 | .name = "bfin-spi", | ||
| 208 | .id = 0, /* Bus number */ | ||
| 209 | .num_resources = ARRAY_SIZE(bfin_spi0_resource), | ||
| 210 | .resource = bfin_spi0_resource, | ||
| 211 | .dev = { | ||
| 212 | .platform_data = &bfin_spi0_info, /* Passed to driver */ | ||
| 213 | }, | ||
| 214 | }; | ||
| 215 | #endif /* spi master and devices */ | ||
| 216 | |||
| 217 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
| 218 | static struct platform_device rtc_device = { | ||
| 219 | .name = "rtc-bfin", | ||
| 220 | .id = -1, | ||
| 221 | }; | ||
| 222 | #endif | ||
| 223 | |||
| 224 | #if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE) | ||
| 225 | static struct platform_device hitachi_fb_device = { | ||
| 226 | .name = "hitachi-tx09", | ||
| 227 | }; | ||
| 228 | #endif | ||
| 229 | |||
| 230 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
| 231 | static struct resource smc91x_resources[] = { | ||
| 232 | { | ||
| 233 | .start = 0x20200300, | ||
| 234 | .end = 0x20200300 + 16, | ||
| 235 | .flags = IORESOURCE_MEM, | ||
| 236 | }, { | ||
| 237 | .start = IRQ_PF14, | ||
| 238 | .end = IRQ_PF14, | ||
| 239 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
| 240 | }, | ||
| 241 | }; | ||
| 242 | |||
| 243 | static struct platform_device smc91x_device = { | ||
| 244 | .name = "smc91x", | ||
| 245 | .id = 0, | ||
| 246 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
| 247 | .resource = smc91x_resources, | ||
| 248 | }; | ||
| 249 | #endif | ||
| 250 | |||
| 251 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
| 252 | static struct resource isp1362_hcd_resources[] = { | ||
| 253 | { | ||
| 254 | .start = 0x20308000, | ||
| 255 | .end = 0x20308000, | ||
| 256 | .flags = IORESOURCE_MEM, | ||
| 257 | }, { | ||
| 258 | .start = 0x20308004, | ||
| 259 | .end = 0x20308004, | ||
| 260 | .flags = IORESOURCE_MEM, | ||
| 261 | }, { | ||
| 262 | .start = IRQ_PG15, | ||
| 263 | .end = IRQ_PG15, | ||
| 264 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
| 265 | }, | ||
| 266 | }; | ||
| 267 | |||
| 268 | static struct isp1362_platform_data isp1362_priv = { | ||
| 269 | .sel15Kres = 1, | ||
| 270 | .clknotstop = 0, | ||
| 271 | .oc_enable = 0, | ||
| 272 | .int_act_high = 0, | ||
| 273 | .int_edge_triggered = 0, | ||
| 274 | .remote_wakeup_connected = 0, | ||
| 275 | .no_power_switching = 1, | ||
| 276 | .power_switching_mode = 0, | ||
| 277 | }; | ||
| 278 | |||
| 279 | static struct platform_device isp1362_hcd_device = { | ||
| 280 | .name = "isp1362-hcd", | ||
| 281 | .id = 0, | ||
| 282 | .dev = { | ||
| 283 | .platform_data = &isp1362_priv, | ||
| 284 | }, | ||
| 285 | .num_resources = ARRAY_SIZE(isp1362_hcd_resources), | ||
| 286 | .resource = isp1362_hcd_resources, | ||
| 287 | }; | ||
| 288 | #endif | ||
| 289 | |||
| 290 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | ||
| 291 | static struct resource net2272_bfin_resources[] = { | ||
| 292 | { | ||
| 293 | .start = 0x20200000, | ||
| 294 | .end = 0x20200000 + 0x100, | ||
| 295 | .flags = IORESOURCE_MEM, | ||
| 296 | }, { | ||
| 297 | .start = IRQ_PH14, | ||
| 298 | .end = IRQ_PH14, | ||
| 299 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
| 300 | }, | ||
| 301 | }; | ||
| 302 | |||
| 303 | static struct platform_device net2272_bfin_device = { | ||
| 304 | .name = "net2272", | ||
| 305 | .id = -1, | ||
| 306 | .num_resources = ARRAY_SIZE(net2272_bfin_resources), | ||
| 307 | .resource = net2272_bfin_resources, | ||
| 308 | }; | ||
| 309 | #endif | ||
| 310 | |||
| 311 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
| 312 | static struct mtd_partition cm_partitions[] = { | ||
| 313 | { | ||
| 314 | .name = "bootloader(nor)", | ||
| 315 | .size = 0x40000, | ||
| 316 | .offset = 0, | ||
| 317 | }, { | ||
| 318 | .name = "linux kernel(nor)", | ||
| 319 | .size = 0xE0000, | ||
| 320 | .offset = MTDPART_OFS_APPEND, | ||
| 321 | }, { | ||
| 322 | .name = "file system(nor)", | ||
| 323 | .size = MTDPART_SIZ_FULL, | ||
| 324 | .offset = MTDPART_OFS_APPEND, | ||
| 325 | } | ||
| 326 | }; | ||
| 327 | |||
| 328 | static struct physmap_flash_data cm_flash_data = { | ||
| 329 | .width = 2, | ||
| 330 | .parts = cm_partitions, | ||
| 331 | .nr_parts = ARRAY_SIZE(cm_partitions), | ||
| 332 | }; | ||
| 333 | |||
| 334 | static unsigned cm_flash_gpios[] = { GPIO_PF4, GPIO_PF5 }; | ||
| 335 | |||
| 336 | static struct resource cm_flash_resource[] = { | ||
| 337 | { | ||
| 338 | .name = "cfi_probe", | ||
| 339 | .start = 0x20000000, | ||
| 340 | .end = 0x201fffff, | ||
| 341 | .flags = IORESOURCE_MEM, | ||
| 342 | }, { | ||
| 343 | .start = (unsigned long)cm_flash_gpios, | ||
| 344 | .end = ARRAY_SIZE(cm_flash_gpios), | ||
| 345 | .flags = IORESOURCE_IRQ, | ||
| 346 | } | ||
| 347 | }; | ||
| 348 | |||
| 349 | static struct platform_device cm_flash_device = { | ||
| 350 | .name = "gpio-addr-flash", | ||
| 351 | .id = 0, | ||
| 352 | .dev = { | ||
| 353 | .platform_data = &cm_flash_data, | ||
| 354 | }, | ||
| 355 | .num_resources = ARRAY_SIZE(cm_flash_resource), | ||
| 356 | .resource = cm_flash_resource, | ||
| 357 | }; | ||
| 358 | #endif | ||
| 359 | |||
| 360 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
| 361 | static struct resource bfin_uart_resources[] = { | ||
| 362 | { | ||
| 363 | .start = 0xFFC00400, | ||
| 364 | .end = 0xFFC004FF, | ||
| 365 | .flags = IORESOURCE_MEM, | ||
| 366 | }, { | ||
| 367 | .start = 0xFFC02000, | ||
| 368 | .end = 0xFFC020FF, | ||
| 369 | .flags = IORESOURCE_MEM, | ||
| 370 | }, | ||
| 371 | }; | ||
| 372 | |||
| 373 | static struct platform_device bfin_uart_device = { | ||
| 374 | .name = "bfin-uart", | ||
| 375 | .id = 1, | ||
| 376 | .num_resources = ARRAY_SIZE(bfin_uart_resources), | ||
| 377 | .resource = bfin_uart_resources, | ||
| 378 | }; | ||
| 379 | #endif | ||
| 380 | |||
| 381 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
| 382 | static struct resource bfin_sir_resources[] = { | ||
| 383 | #ifdef CONFIG_BFIN_SIR0 | ||
| 384 | { | ||
| 385 | .start = 0xFFC00400, | ||
| 386 | .end = 0xFFC004FF, | ||
| 387 | .flags = IORESOURCE_MEM, | ||
| 388 | }, | ||
| 389 | #endif | ||
| 390 | #ifdef CONFIG_BFIN_SIR1 | ||
| 391 | { | ||
| 392 | .start = 0xFFC02000, | ||
| 393 | .end = 0xFFC020FF, | ||
| 394 | .flags = IORESOURCE_MEM, | ||
| 395 | }, | ||
| 396 | #endif | ||
| 397 | }; | ||
| 398 | |||
| 399 | static struct platform_device bfin_sir_device = { | ||
| 400 | .name = "bfin_sir", | ||
| 401 | .id = 0, | ||
| 402 | .num_resources = ARRAY_SIZE(bfin_sir_resources), | ||
| 403 | .resource = bfin_sir_resources, | ||
| 404 | }; | ||
| 405 | #endif | ||
| 406 | |||
| 407 | #if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) | ||
| 408 | static struct resource bfin_twi0_resource[] = { | ||
| 409 | [0] = { | ||
| 410 | .start = TWI0_REGBASE, | ||
| 411 | .end = TWI0_REGBASE, | ||
| 412 | .flags = IORESOURCE_MEM, | ||
| 413 | }, | ||
| 414 | [1] = { | ||
| 415 | .start = IRQ_TWI, | ||
| 416 | .end = IRQ_TWI, | ||
| 417 | .flags = IORESOURCE_IRQ, | ||
| 418 | }, | ||
| 419 | }; | ||
| 420 | |||
| 421 | static struct platform_device i2c_bfin_twi_device = { | ||
| 422 | .name = "i2c-bfin-twi", | ||
| 423 | .id = 0, | ||
| 424 | .num_resources = ARRAY_SIZE(bfin_twi0_resource), | ||
| 425 | .resource = bfin_twi0_resource, | ||
| 426 | }; | ||
| 427 | #endif | ||
| 428 | |||
| 429 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
| 430 | static struct platform_device bfin_sport0_uart_device = { | ||
| 431 | .name = "bfin-sport-uart", | ||
| 432 | .id = 0, | ||
| 433 | }; | ||
| 434 | |||
| 435 | static struct platform_device bfin_sport1_uart_device = { | ||
| 436 | .name = "bfin-sport-uart", | ||
| 437 | .id = 1, | ||
| 438 | }; | ||
| 439 | #endif | ||
| 440 | |||
| 441 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | ||
| 442 | static struct platform_device bfin_mac_device = { | ||
| 443 | .name = "bfin_mac", | ||
| 444 | }; | ||
| 445 | #endif | ||
| 446 | |||
| 447 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 448 | #define PATA_INT IRQ_PF14 | ||
| 449 | |||
| 450 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 451 | .ioport_shift = 2, | ||
| 452 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 453 | }; | ||
| 454 | |||
| 455 | static struct resource bfin_pata_resources[] = { | ||
| 456 | { | ||
| 457 | .start = 0x2030C000, | ||
| 458 | .end = 0x2030C01F, | ||
| 459 | .flags = IORESOURCE_MEM, | ||
| 460 | }, | ||
| 461 | { | ||
| 462 | .start = 0x2030D018, | ||
| 463 | .end = 0x2030D01B, | ||
| 464 | .flags = IORESOURCE_MEM, | ||
| 465 | }, | ||
| 466 | { | ||
| 467 | .start = PATA_INT, | ||
| 468 | .end = PATA_INT, | ||
| 469 | .flags = IORESOURCE_IRQ, | ||
| 470 | }, | ||
| 471 | }; | ||
| 472 | |||
| 473 | static struct platform_device bfin_pata_device = { | ||
| 474 | .name = "pata_platform", | ||
| 475 | .id = -1, | ||
| 476 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 477 | .resource = bfin_pata_resources, | ||
| 478 | .dev = { | ||
| 479 | .platform_data = &bfin_pata_platform_data, | ||
| 480 | } | ||
| 481 | }; | ||
| 482 | #endif | ||
| 483 | |||
| 484 | static const unsigned int cclk_vlev_datasheet[] = | ||
| 485 | { | ||
| 486 | VRPAIR(VLEV_085, 250000000), | ||
| 487 | VRPAIR(VLEV_090, 376000000), | ||
| 488 | VRPAIR(VLEV_095, 426000000), | ||
| 489 | VRPAIR(VLEV_100, 426000000), | ||
| 490 | VRPAIR(VLEV_105, 476000000), | ||
| 491 | VRPAIR(VLEV_110, 476000000), | ||
| 492 | VRPAIR(VLEV_115, 476000000), | ||
| 493 | VRPAIR(VLEV_120, 500000000), | ||
| 494 | VRPAIR(VLEV_125, 533000000), | ||
| 495 | VRPAIR(VLEV_130, 600000000), | ||
| 496 | }; | ||
| 497 | |||
| 498 | static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { | ||
| 499 | .tuple_tab = cclk_vlev_datasheet, | ||
| 500 | .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), | ||
| 501 | .vr_settling_time = 25 /* us */, | ||
| 502 | }; | ||
| 503 | |||
| 504 | static struct platform_device bfin_dpmc = { | ||
| 505 | .name = "bfin dpmc", | ||
| 506 | .dev = { | ||
| 507 | .platform_data = &bfin_dmpc_vreg_data, | ||
| 508 | }, | ||
| 509 | }; | ||
| 510 | |||
| 511 | static struct platform_device *cm_bf537_devices[] __initdata = { | ||
| 512 | |||
| 513 | &bfin_dpmc, | ||
| 514 | |||
| 515 | #if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE) | ||
| 516 | &hitachi_fb_device, | ||
| 517 | #endif | ||
| 518 | |||
| 519 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
| 520 | &rtc_device, | ||
| 521 | #endif | ||
| 522 | |||
| 523 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
| 524 | &bfin_uart_device, | ||
| 525 | #endif | ||
| 526 | |||
| 527 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
| 528 | &bfin_sir_device, | ||
| 529 | #endif | ||
| 530 | |||
| 531 | #if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) | ||
| 532 | &i2c_bfin_twi_device, | ||
| 533 | #endif | ||
| 534 | |||
| 535 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
| 536 | &bfin_sport0_uart_device, | ||
| 537 | &bfin_sport1_uart_device, | ||
| 538 | #endif | ||
| 539 | |||
| 540 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
| 541 | &isp1362_hcd_device, | ||
| 542 | #endif | ||
| 543 | |||
| 544 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
| 545 | &smc91x_device, | ||
| 546 | #endif | ||
| 547 | |||
| 548 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | ||
| 549 | &bfin_mac_device, | ||
| 550 | #endif | ||
| 551 | |||
| 552 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | ||
| 553 | &net2272_bfin_device, | ||
| 554 | #endif | ||
| 555 | |||
| 556 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
| 557 | &bfin_spi0_device, | ||
| 558 | #endif | ||
| 559 | |||
| 560 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 561 | &bfin_pata_device, | ||
| 562 | #endif | ||
| 563 | |||
| 564 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
| 565 | &cm_flash_device, | ||
| 566 | #endif | ||
| 567 | }; | ||
| 568 | |||
| 569 | static int __init cm_bf537_init(void) | ||
| 570 | { | ||
| 571 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | ||
| 572 | platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices)); | ||
| 573 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
| 574 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | ||
| 575 | #endif | ||
| 576 | |||
| 577 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 578 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 579 | #endif | ||
| 580 | return 0; | ||
| 581 | } | ||
| 582 | |||
| 583 | arch_initcall(cm_bf537_init); | ||
| 584 | |||
| 585 | void bfin_get_ether_addr(char *addr) | ||
| 586 | { | ||
| 587 | random_ether_addr(addr); | ||
| 588 | printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__); | ||
| 589 | } | ||
| 590 | EXPORT_SYMBOL(bfin_get_ether_addr); | ||
diff --git a/arch/blackfin/mach-bf537/head.S b/arch/blackfin/mach-bf537/head.S index 6b019eaee0b6..64e0287ab266 100644 --- a/arch/blackfin/mach-bf537/head.S +++ b/arch/blackfin/mach-bf537/head.S | |||
| @@ -30,325 +30,11 @@ | |||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | #include <asm/trace.h> | ||
| 34 | |||
| 35 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
| 37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
| 38 | #endif | 36 | #endif |
| 39 | 37 | ||
| 40 | .extern ___bss_stop | ||
| 41 | .extern ___bss_start | ||
| 42 | .extern _bf53x_relocate_l1_mem | ||
| 43 | |||
| 44 | #define INITIAL_STACK 0xFFB01000 | ||
| 45 | |||
| 46 | __INIT | ||
| 47 | |||
| 48 | ENTRY(__start) | ||
| 49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 50 | R7 = R0; | ||
| 51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 53 | R0 = SYSCFG_SNEN; | ||
| 54 | #else | ||
| 55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 56 | #endif | ||
| 57 | SYSCFG = R0; | ||
| 58 | R0 = 0; | ||
| 59 | |||
| 60 | /* Clear Out All the data and pointer Registers */ | ||
| 61 | R1 = R0; | ||
| 62 | R2 = R0; | ||
| 63 | R3 = R0; | ||
| 64 | R4 = R0; | ||
| 65 | R5 = R0; | ||
| 66 | R6 = R0; | ||
| 67 | |||
| 68 | P0 = R0; | ||
| 69 | P1 = R0; | ||
| 70 | P2 = R0; | ||
| 71 | P3 = R0; | ||
| 72 | P4 = R0; | ||
| 73 | P5 = R0; | ||
| 74 | |||
| 75 | LC0 = r0; | ||
| 76 | LC1 = r0; | ||
| 77 | L0 = r0; | ||
| 78 | L1 = r0; | ||
| 79 | L2 = r0; | ||
| 80 | L3 = r0; | ||
| 81 | |||
| 82 | /* Clear Out All the DAG Registers */ | ||
| 83 | B0 = r0; | ||
| 84 | B1 = r0; | ||
| 85 | B2 = r0; | ||
| 86 | B3 = r0; | ||
| 87 | |||
| 88 | I0 = r0; | ||
| 89 | I1 = r0; | ||
| 90 | I2 = r0; | ||
| 91 | I3 = r0; | ||
| 92 | |||
| 93 | M0 = r0; | ||
| 94 | M1 = r0; | ||
| 95 | M2 = r0; | ||
| 96 | M3 = r0; | ||
| 97 | |||
| 98 | trace_buffer_init(p0,r0); | ||
| 99 | P0 = R1; | ||
| 100 | R0 = R1; | ||
| 101 | |||
| 102 | /* Turn off the icache */ | ||
| 103 | p0.l = LO(IMEM_CONTROL); | ||
| 104 | p0.h = HI(IMEM_CONTROL); | ||
| 105 | R1 = [p0]; | ||
| 106 | R0 = ~ENICPLB; | ||
| 107 | R0 = R0 & R1; | ||
| 108 | |||
| 109 | /* Anomaly 05000125 */ | ||
| 110 | #if ANOMALY_05000125 | ||
| 111 | CLI R2; | ||
| 112 | SSYNC; | ||
| 113 | #endif | ||
| 114 | [p0] = R0; | ||
| 115 | SSYNC; | ||
| 116 | #if ANOMALY_05000125 | ||
| 117 | STI R2; | ||
| 118 | #endif | ||
| 119 | |||
| 120 | /* Turn off the dcache */ | ||
| 121 | p0.l = LO(DMEM_CONTROL); | ||
| 122 | p0.h = HI(DMEM_CONTROL); | ||
| 123 | R1 = [p0]; | ||
| 124 | R0 = ~ENDCPLB; | ||
| 125 | R0 = R0 & R1; | ||
| 126 | |||
| 127 | /* Anomaly 05000125 */ | ||
| 128 | #if ANOMALY_05000125 | ||
| 129 | CLI R2; | ||
| 130 | SSYNC; | ||
| 131 | #endif | ||
| 132 | [p0] = R0; | ||
| 133 | SSYNC; | ||
| 134 | #if ANOMALY_05000125 | ||
| 135 | STI R2; | ||
| 136 | #endif | ||
| 137 | |||
| 138 | /* Initialise General-Purpose I/O Modules on BF537 */ | ||
| 139 | /* Rev 0.0 Anomaly 05000212 - PORTx_FER, | ||
| 140 | * PORT_MUX Registers Do Not accept "writes" correctly: | ||
| 141 | */ | ||
| 142 | p0.h = hi(BFIN_PORT_MUX); | ||
| 143 | p0.l = lo(BFIN_PORT_MUX); | ||
| 144 | #if ANOMALY_05000212 | ||
| 145 | R0.L = W[P0]; /* Read */ | ||
| 146 | SSYNC; | ||
| 147 | #endif | ||
| 148 | R0 = (PGDE_UART | PFTE_UART)(Z); | ||
| 149 | #if ANOMALY_05000212 | ||
| 150 | W[P0] = R0.L; /* Write */ | ||
| 151 | SSYNC; | ||
| 152 | #endif | ||
| 153 | W[P0] = R0.L; /* Enable both UARTS */ | ||
| 154 | SSYNC; | ||
| 155 | |||
| 156 | p0.h = hi(PORTF_FER); | ||
| 157 | p0.l = lo(PORTF_FER); | ||
| 158 | #if ANOMALY_05000212 | ||
| 159 | R0.L = W[P0]; /* Read */ | ||
| 160 | SSYNC; | ||
| 161 | #endif | ||
| 162 | R0 = 0x000F(Z); | ||
| 163 | #if ANOMALY_05000212 | ||
| 164 | W[P0] = R0.L; /* Write */ | ||
| 165 | SSYNC; | ||
| 166 | #endif | ||
| 167 | /* Enable peripheral function of PORTF for UART0 and UART1 */ | ||
| 168 | W[P0] = R0.L; | ||
| 169 | SSYNC; | ||
| 170 | |||
| 171 | #if !defined(CONFIG_BF534) | ||
| 172 | p0.h = hi(EMAC_SYSTAT); | ||
| 173 | p0.l = lo(EMAC_SYSTAT); | ||
| 174 | R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */ | ||
| 175 | R0.l = 0xFFFF; | ||
| 176 | [P0] = R0; | ||
| 177 | SSYNC; | ||
| 178 | #endif | ||
| 179 | |||
| 180 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
| 181 | * so if we dont initalize here, our serial console gets hosed */ | ||
| 182 | p0.h = hi(BFIN_UART_LCR); | ||
| 183 | p0.l = lo(BFIN_UART_LCR); | ||
| 184 | r0 = 0x0(Z); | ||
| 185 | w[p0] = r0.L; /* To enable DLL writes */ | ||
| 186 | ssync; | ||
| 187 | |||
| 188 | p0.h = hi(BFIN_UART_DLL); | ||
| 189 | p0.l = lo(BFIN_UART_DLL); | ||
| 190 | r0 = 0x0(Z); | ||
| 191 | w[p0] = r0.L; | ||
| 192 | ssync; | ||
| 193 | |||
| 194 | p0.h = hi(BFIN_UART_DLH); | ||
| 195 | p0.l = lo(BFIN_UART_DLH); | ||
| 196 | r0 = 0x00(Z); | ||
| 197 | w[p0] = r0.L; | ||
| 198 | ssync; | ||
| 199 | |||
| 200 | p0.h = hi(BFIN_UART_GCTL); | ||
| 201 | p0.l = lo(BFIN_UART_GCTL); | ||
| 202 | r0 = 0x0(Z); | ||
| 203 | w[p0] = r0.L; /* To enable UART clock */ | ||
| 204 | ssync; | ||
| 205 | |||
| 206 | /* Initialize stack pointer */ | ||
| 207 | sp.l = lo(INITIAL_STACK); | ||
| 208 | sp.h = hi(INITIAL_STACK); | ||
| 209 | fp = sp; | ||
| 210 | usp = sp; | ||
| 211 | |||
| 212 | #ifdef CONFIG_EARLY_PRINTK | ||
| 213 | SP += -12; | ||
| 214 | call _init_early_exception_vectors; | ||
| 215 | SP += 12; | ||
| 216 | #endif | ||
| 217 | |||
| 218 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 219 | call _bf53x_relocate_l1_mem; | ||
| 220 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
| 221 | call _start_dma_code; | ||
| 222 | #endif | ||
| 223 | |||
| 224 | /* Code for initializing Async memory banks */ | ||
| 225 | |||
| 226 | p2.h = hi(EBIU_AMBCTL1); | ||
| 227 | p2.l = lo(EBIU_AMBCTL1); | ||
| 228 | r0.h = hi(AMBCTL1VAL); | ||
| 229 | r0.l = lo(AMBCTL1VAL); | ||
| 230 | [p2] = r0; | ||
| 231 | ssync; | ||
| 232 | |||
| 233 | p2.h = hi(EBIU_AMBCTL0); | ||
| 234 | p2.l = lo(EBIU_AMBCTL0); | ||
| 235 | r0.h = hi(AMBCTL0VAL); | ||
| 236 | r0.l = lo(AMBCTL0VAL); | ||
| 237 | [p2] = r0; | ||
| 238 | ssync; | ||
| 239 | |||
| 240 | p2.h = hi(EBIU_AMGCTL); | ||
| 241 | p2.l = lo(EBIU_AMGCTL); | ||
| 242 | r0 = AMGCTLVAL; | ||
| 243 | w[p2] = r0; | ||
| 244 | ssync; | ||
| 245 | |||
| 246 | /* This section keeps the processor in supervisor mode | ||
| 247 | * during kernel boot. Switches to user mode at end of boot. | ||
| 248 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 249 | */ | ||
| 250 | |||
| 251 | /* EVT15 = _real_start */ | ||
| 252 | |||
| 253 | p0.l = lo(EVT15); | ||
| 254 | p0.h = hi(EVT15); | ||
| 255 | p1.l = _real_start; | ||
| 256 | p1.h = _real_start; | ||
| 257 | [p0] = p1; | ||
| 258 | csync; | ||
| 259 | |||
| 260 | p0.l = lo(IMASK); | ||
| 261 | p0.h = hi(IMASK); | ||
| 262 | p1.l = IMASK_IVG15; | ||
| 263 | p1.h = 0x0; | ||
| 264 | [p0] = p1; | ||
| 265 | csync; | ||
| 266 | |||
| 267 | raise 15; | ||
| 268 | p0.l = .LWAIT_HERE; | ||
| 269 | p0.h = .LWAIT_HERE; | ||
| 270 | reti = p0; | ||
| 271 | #if ANOMALY_05000281 | ||
| 272 | nop; nop; nop; | ||
| 273 | #endif | ||
| 274 | rti; | ||
| 275 | |||
| 276 | .LWAIT_HERE: | ||
| 277 | jump .LWAIT_HERE; | ||
| 278 | ENDPROC(__start) | ||
| 279 | |||
| 280 | ENTRY(_real_start) | ||
| 281 | [ -- sp ] = reti; | ||
| 282 | p0.l = lo(WDOG_CTL); | ||
| 283 | p0.h = hi(WDOG_CTL); | ||
| 284 | r0 = 0xAD6(z); | ||
| 285 | w[p0] = r0; /* watchdog off for now */ | ||
| 286 | ssync; | ||
| 287 | |||
| 288 | /* Code update for BSS size == 0 | ||
| 289 | * Zero out the bss region. | ||
| 290 | */ | ||
| 291 | |||
| 292 | p1.l = ___bss_start; | ||
| 293 | p1.h = ___bss_start; | ||
| 294 | p2.l = ___bss_stop; | ||
| 295 | p2.h = ___bss_stop; | ||
| 296 | r0 = 0; | ||
| 297 | p2 -= p1; | ||
| 298 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
| 299 | .L_clear_bss: | ||
| 300 | B[p1++] = r0; | ||
| 301 | |||
| 302 | /* In case there is a NULL pointer reference | ||
| 303 | * Zero out region before stext | ||
| 304 | */ | ||
| 305 | |||
| 306 | p1.l = 0x0; | ||
| 307 | p1.h = 0x0; | ||
| 308 | r0.l = __stext; | ||
| 309 | r0.h = __stext; | ||
| 310 | r0 = r0 >> 1; | ||
| 311 | p2 = r0; | ||
| 312 | r0 = 0; | ||
| 313 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
| 314 | .L_clear_zero: | ||
| 315 | W[p1++] = r0; | ||
| 316 | |||
| 317 | /* pass the uboot arguments to the global value command line */ | ||
| 318 | R0 = R7; | ||
| 319 | call _cmdline_init; | ||
| 320 | |||
| 321 | p1.l = __rambase; | ||
| 322 | p1.h = __rambase; | ||
| 323 | r0.l = __sdata; | ||
| 324 | r0.h = __sdata; | ||
| 325 | [p1] = r0; | ||
| 326 | |||
| 327 | p1.l = __ramstart; | ||
| 328 | p1.h = __ramstart; | ||
| 329 | p3.l = ___bss_stop; | ||
| 330 | p3.h = ___bss_stop; | ||
| 331 | |||
| 332 | r1 = p3; | ||
| 333 | [p1] = r1; | ||
| 334 | |||
| 335 | /* | ||
| 336 | * load the current thread pointer and stack | ||
| 337 | */ | ||
| 338 | r1.l = _init_thread_union; | ||
| 339 | r1.h = _init_thread_union; | ||
| 340 | |||
| 341 | r2.l = 0x2000; | ||
| 342 | r2.h = 0x0000; | ||
| 343 | r1 = r1 + r2; | ||
| 344 | sp = r1; | ||
| 345 | usp = sp; | ||
| 346 | fp = sp; | ||
| 347 | jump.l _start_kernel; | ||
| 348 | ENDPROC(_real_start) | ||
| 349 | |||
| 350 | __FINIT | ||
| 351 | |||
| 352 | .section .l1.text | 38 | .section .l1.text |
| 353 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 354 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
| @@ -452,13 +138,6 @@ ENTRY(_start_dma_code) | |||
| 452 | [P2] = R1; | 138 | [P2] = R1; |
| 453 | SSYNC; | 139 | SSYNC; |
| 454 | 140 | ||
| 455 | p0.h = hi(SIC_IWR); | ||
| 456 | p0.l = lo(SIC_IWR); | ||
| 457 | r0.l = lo(IWR_ENABLE_ALL); | ||
| 458 | r0.h = hi(IWR_ENABLE_ALL); | ||
| 459 | [p0] = r0; | ||
| 460 | SSYNC; | ||
| 461 | |||
| 462 | RTS; | 141 | RTS; |
| 463 | ENDPROC(_start_dma_code) | 142 | ENDPROC(_start_dma_code) |
| 464 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 143 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf537/ints-priority.c b/arch/blackfin/mach-bf537/ints-priority.c index a8b915f202ec..b1300b3f1812 100644 --- a/arch/blackfin/mach-bf537/ints-priority.c +++ b/arch/blackfin/mach-bf537/ints-priority.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | 33 | ||
| 34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
| 35 | { | 35 | { |
| 36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
| 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf548/boards/cm_bf548.c b/arch/blackfin/mach-bf548/boards/cm_bf548.c index 4f4ae8787edf..58abbed0a225 100644 --- a/arch/blackfin/mach-bf548/boards/cm_bf548.c +++ b/arch/blackfin/mach-bf548/boards/cm_bf548.c | |||
| @@ -319,12 +319,12 @@ static struct platform_device bfin_atapi_device = { | |||
| 319 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 319 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
| 320 | static struct mtd_partition partition_info[] = { | 320 | static struct mtd_partition partition_info[] = { |
| 321 | { | 321 | { |
| 322 | .name = "Linux Kernel", | 322 | .name = "linux kernel(nand)", |
| 323 | .offset = 0, | 323 | .offset = 0, |
| 324 | .size = 4 * SIZE_1M, | 324 | .size = 4 * SIZE_1M, |
| 325 | }, | 325 | }, |
| 326 | { | 326 | { |
| 327 | .name = "File System", | 327 | .name = "file system(nand)", |
| 328 | .offset = 4 * SIZE_1M, | 328 | .offset = 4 * SIZE_1M, |
| 329 | .size = (256 - 4) * SIZE_1M, | 329 | .size = (256 - 4) * SIZE_1M, |
| 330 | }, | 330 | }, |
| @@ -377,12 +377,12 @@ static struct platform_device bf54x_sdh_device = { | |||
| 377 | /* SPI flash chip (m25p16) */ | 377 | /* SPI flash chip (m25p16) */ |
| 378 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 378 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 379 | { | 379 | { |
| 380 | .name = "bootloader", | 380 | .name = "bootloader(spi)", |
| 381 | .size = 0x00040000, | 381 | .size = 0x00040000, |
| 382 | .offset = 0, | 382 | .offset = 0, |
| 383 | .mask_flags = MTD_CAP_ROM | 383 | .mask_flags = MTD_CAP_ROM |
| 384 | }, { | 384 | }, { |
| 385 | .name = "linux kernel", | 385 | .name = "linux kernel(spi)", |
| 386 | .size = 0x1c0000, | 386 | .size = 0x1c0000, |
| 387 | .offset = 0x40000 | 387 | .offset = 0x40000 |
| 388 | } | 388 | } |
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index 166fa2201ee7..0d6333ada1d9 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
| @@ -365,12 +365,12 @@ static struct platform_device bfin_atapi_device = { | |||
| 365 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 365 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
| 366 | static struct mtd_partition partition_info[] = { | 366 | static struct mtd_partition partition_info[] = { |
| 367 | { | 367 | { |
| 368 | .name = "Linux Kernel", | 368 | .name = "linux kernel(nand)", |
| 369 | .offset = 0, | 369 | .offset = 0, |
| 370 | .size = 4 * SIZE_1M, | 370 | .size = 4 * SIZE_1M, |
| 371 | }, | 371 | }, |
| 372 | { | 372 | { |
| 373 | .name = "File System", | 373 | .name = "file system(nand)", |
| 374 | .offset = MTDPART_OFS_APPEND, | 374 | .offset = MTDPART_OFS_APPEND, |
| 375 | .size = MTDPART_SIZ_FULL, | 375 | .size = MTDPART_SIZ_FULL, |
| 376 | }, | 376 | }, |
| @@ -419,15 +419,15 @@ static struct platform_device bf54x_sdh_device = { | |||
| 419 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 419 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 420 | static struct mtd_partition ezkit_partitions[] = { | 420 | static struct mtd_partition ezkit_partitions[] = { |
| 421 | { | 421 | { |
| 422 | .name = "Bootloader", | 422 | .name = "bootloader(nor)", |
| 423 | .size = 0x40000, | 423 | .size = 0x40000, |
| 424 | .offset = 0, | 424 | .offset = 0, |
| 425 | }, { | 425 | }, { |
| 426 | .name = "Kernel", | 426 | .name = "linux kernel(nor)", |
| 427 | .size = 0x1C0000, | 427 | .size = 0x1C0000, |
| 428 | .offset = MTDPART_OFS_APPEND, | 428 | .offset = MTDPART_OFS_APPEND, |
| 429 | }, { | 429 | }, { |
| 430 | .name = "RootFS", | 430 | .name = "file system(nor)", |
| 431 | .size = MTDPART_SIZ_FULL, | 431 | .size = MTDPART_SIZ_FULL, |
| 432 | .offset = MTDPART_OFS_APPEND, | 432 | .offset = MTDPART_OFS_APPEND, |
| 433 | } | 433 | } |
| @@ -461,12 +461,12 @@ static struct platform_device ezkit_flash_device = { | |||
| 461 | /* SPI flash chip (m25p16) */ | 461 | /* SPI flash chip (m25p16) */ |
| 462 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 462 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 463 | { | 463 | { |
| 464 | .name = "bootloader", | 464 | .name = "bootloader(spi)", |
| 465 | .size = 0x00040000, | 465 | .size = 0x00040000, |
| 466 | .offset = 0, | 466 | .offset = 0, |
| 467 | .mask_flags = MTD_CAP_ROM | 467 | .mask_flags = MTD_CAP_ROM |
| 468 | }, { | 468 | }, { |
| 469 | .name = "linux kernel", | 469 | .name = "linux kernel(spi)", |
| 470 | .size = MTDPART_SIZ_FULL, | 470 | .size = MTDPART_SIZ_FULL, |
| 471 | .offset = MTDPART_OFS_APPEND, | 471 | .offset = MTDPART_OFS_APPEND, |
| 472 | } | 472 | } |
diff --git a/arch/blackfin/mach-bf548/head.S b/arch/blackfin/mach-bf548/head.S index 06b9178cfcfe..e3000f70a26e 100644 --- a/arch/blackfin/mach-bf548/head.S +++ b/arch/blackfin/mach-bf548/head.S | |||
| @@ -30,263 +30,11 @@ | |||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | #include <asm/trace.h> | ||
| 34 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 35 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
| 36 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
| 37 | #endif | 36 | #endif |
| 38 | 37 | ||
| 39 | .extern ___bss_stop | ||
| 40 | .extern ___bss_start | ||
| 41 | .extern _bf53x_relocate_l1_mem | ||
| 42 | |||
| 43 | #define INITIAL_STACK 0xFFB01000 | ||
| 44 | |||
| 45 | __INIT | ||
| 46 | |||
| 47 | ENTRY(__start) | ||
| 48 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 49 | R7 = R0; | ||
| 50 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 51 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 52 | R0 = SYSCFG_SNEN; | ||
| 53 | #else | ||
| 54 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 55 | #endif | ||
| 56 | SYSCFG = R0; | ||
| 57 | R0 = 0; | ||
| 58 | |||
| 59 | /* Clear Out All the data and pointer Registers*/ | ||
| 60 | R1 = R0; | ||
| 61 | R2 = R0; | ||
| 62 | R3 = R0; | ||
| 63 | R4 = R0; | ||
| 64 | R5 = R0; | ||
| 65 | R6 = R0; | ||
| 66 | |||
| 67 | P0 = R0; | ||
| 68 | P1 = R0; | ||
| 69 | P2 = R0; | ||
| 70 | P3 = R0; | ||
| 71 | P4 = R0; | ||
| 72 | P5 = R0; | ||
| 73 | |||
| 74 | LC0 = r0; | ||
| 75 | LC1 = r0; | ||
| 76 | L0 = r0; | ||
| 77 | L1 = r0; | ||
| 78 | L2 = r0; | ||
| 79 | L3 = r0; | ||
| 80 | |||
| 81 | /* Clear Out All the DAG Registers*/ | ||
| 82 | B0 = r0; | ||
| 83 | B1 = r0; | ||
| 84 | B2 = r0; | ||
| 85 | B3 = r0; | ||
| 86 | |||
| 87 | I0 = r0; | ||
| 88 | I1 = r0; | ||
| 89 | I2 = r0; | ||
| 90 | I3 = r0; | ||
| 91 | |||
| 92 | M0 = r0; | ||
| 93 | M1 = r0; | ||
| 94 | M2 = r0; | ||
| 95 | M3 = r0; | ||
| 96 | |||
| 97 | trace_buffer_init(p0,r0); | ||
| 98 | P0 = R1; | ||
| 99 | R0 = R1; | ||
| 100 | |||
| 101 | /* Turn off the icache */ | ||
| 102 | p0.l = LO(IMEM_CONTROL); | ||
| 103 | p0.h = HI(IMEM_CONTROL); | ||
| 104 | R1 = [p0]; | ||
| 105 | R0 = ~ENICPLB; | ||
| 106 | R0 = R0 & R1; | ||
| 107 | [p0] = R0; | ||
| 108 | SSYNC; | ||
| 109 | |||
| 110 | /* Turn off the dcache */ | ||
| 111 | p0.l = LO(DMEM_CONTROL); | ||
| 112 | p0.h = HI(DMEM_CONTROL); | ||
| 113 | R1 = [p0]; | ||
| 114 | R0 = ~ENDCPLB; | ||
| 115 | R0 = R0 & R1; | ||
| 116 | [p0] = R0; | ||
| 117 | SSYNC; | ||
| 118 | |||
| 119 | /* Initialize stack pointer */ | ||
| 120 | SP.L = LO(INITIAL_STACK); | ||
| 121 | SP.H = HI(INITIAL_STACK); | ||
| 122 | FP = SP; | ||
| 123 | USP = SP; | ||
| 124 | |||
| 125 | #ifdef CONFIG_EARLY_PRINTK | ||
| 126 | SP += -12; | ||
| 127 | call _init_early_exception_vectors; | ||
| 128 | SP += 12; | ||
| 129 | #endif | ||
| 130 | |||
| 131 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 132 | call _bf53x_relocate_l1_mem; | ||
| 133 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
| 134 | call _start_dma_code; | ||
| 135 | #endif | ||
| 136 | /* Code for initializing Async memory banks */ | ||
| 137 | |||
| 138 | p2.h = hi(EBIU_AMBCTL1); | ||
| 139 | p2.l = lo(EBIU_AMBCTL1); | ||
| 140 | r0.h = hi(AMBCTL1VAL); | ||
| 141 | r0.l = lo(AMBCTL1VAL); | ||
| 142 | [p2] = r0; | ||
| 143 | ssync; | ||
| 144 | |||
| 145 | p2.h = hi(EBIU_AMBCTL0); | ||
| 146 | p2.l = lo(EBIU_AMBCTL0); | ||
| 147 | r0.h = hi(AMBCTL0VAL); | ||
| 148 | r0.l = lo(AMBCTL0VAL); | ||
| 149 | [p2] = r0; | ||
| 150 | ssync; | ||
| 151 | |||
| 152 | p2.h = hi(EBIU_AMGCTL); | ||
| 153 | p2.l = lo(EBIU_AMGCTL); | ||
| 154 | r0 = AMGCTLVAL; | ||
| 155 | w[p2] = r0; | ||
| 156 | ssync; | ||
| 157 | |||
| 158 | p2.h = hi(EBIU_MBSCTL); | ||
| 159 | p2.l = lo(EBIU_MBSCTL); | ||
| 160 | r0.h = hi(CONFIG_EBIU_MBSCTLVAL); | ||
| 161 | r0.l = lo(CONFIG_EBIU_MBSCTLVAL); | ||
| 162 | [p2] = r0; | ||
| 163 | ssync; | ||
| 164 | |||
| 165 | p2.h = hi(EBIU_MODE); | ||
| 166 | p2.l = lo(EBIU_MODE); | ||
| 167 | r0.h = hi(CONFIG_EBIU_MODEVAL); | ||
| 168 | r0.l = lo(CONFIG_EBIU_MODEVAL); | ||
| 169 | [p2] = r0; | ||
| 170 | ssync; | ||
| 171 | |||
| 172 | p2.h = hi(EBIU_FCTL); | ||
| 173 | p2.l = lo(EBIU_FCTL); | ||
| 174 | r0.h = hi(CONFIG_EBIU_FCTLVAL); | ||
| 175 | r0.l = lo(CONFIG_EBIU_FCTLVAL); | ||
| 176 | [p2] = r0; | ||
| 177 | ssync; | ||
| 178 | |||
| 179 | /* This section keeps the processor in supervisor mode | ||
| 180 | * during kernel boot. Switches to user mode at end of boot. | ||
| 181 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 182 | */ | ||
| 183 | |||
| 184 | /* EVT15 = _real_start */ | ||
| 185 | |||
| 186 | p0.l = lo(EVT15); | ||
| 187 | p0.h = hi(EVT15); | ||
| 188 | p1.l = _real_start; | ||
| 189 | p1.h = _real_start; | ||
| 190 | [p0] = p1; | ||
| 191 | csync; | ||
| 192 | |||
| 193 | p0.l = lo(IMASK); | ||
| 194 | p0.h = hi(IMASK); | ||
| 195 | p1.l = IMASK_IVG15; | ||
| 196 | p1.h = 0x0; | ||
| 197 | [p0] = p1; | ||
| 198 | csync; | ||
| 199 | |||
| 200 | raise 15; | ||
| 201 | p0.l = .LWAIT_HERE; | ||
| 202 | p0.h = .LWAIT_HERE; | ||
| 203 | reti = p0; | ||
| 204 | #if ANOMALY_05000281 | ||
| 205 | nop; | ||
| 206 | nop; | ||
| 207 | nop; | ||
| 208 | #endif | ||
| 209 | rti; | ||
| 210 | |||
| 211 | .LWAIT_HERE: | ||
| 212 | jump .LWAIT_HERE; | ||
| 213 | ENDPROC(__start) | ||
| 214 | |||
| 215 | ENTRY(_real_start) | ||
| 216 | [ -- sp ] = reti; | ||
| 217 | p0.l = lo(WDOG_CTL); | ||
| 218 | p0.h = hi(WDOG_CTL); | ||
| 219 | r0 = 0xAD6(z); | ||
| 220 | w[p0] = r0; /* watchdog off for now */ | ||
| 221 | ssync; | ||
| 222 | |||
| 223 | /* Code update for BSS size == 0 | ||
| 224 | * Zero out the bss region. | ||
| 225 | */ | ||
| 226 | |||
| 227 | p1.l = ___bss_start; | ||
| 228 | p1.h = ___bss_start; | ||
| 229 | p2.l = ___bss_stop; | ||
| 230 | p2.h = ___bss_stop; | ||
| 231 | r0 = 0; | ||
| 232 | p2 -= p1; | ||
| 233 | lsetup (.L_clear_bss, .L_clear_bss ) lc0 = p2; | ||
| 234 | .L_clear_bss: | ||
| 235 | B[p1++] = r0; | ||
| 236 | |||
| 237 | /* In case there is a NULL pointer reference | ||
| 238 | * Zero out region before stext | ||
| 239 | */ | ||
| 240 | |||
| 241 | p1.l = 0x0; | ||
| 242 | p1.h = 0x0; | ||
| 243 | r0.l = __stext; | ||
| 244 | r0.h = __stext; | ||
| 245 | r0 = r0 >> 1; | ||
| 246 | p2 = r0; | ||
| 247 | r0 = 0; | ||
| 248 | lsetup (.L_clear_zero, .L_clear_zero ) lc0 = p2; | ||
| 249 | .L_clear_zero: | ||
| 250 | W[p1++] = r0; | ||
| 251 | |||
| 252 | /* pass the uboot arguments to the global value command line */ | ||
| 253 | R0 = R7; | ||
| 254 | call _cmdline_init; | ||
| 255 | |||
| 256 | p1.l = __rambase; | ||
| 257 | p1.h = __rambase; | ||
| 258 | r0.l = __sdata; | ||
| 259 | r0.h = __sdata; | ||
| 260 | [p1] = r0; | ||
| 261 | |||
| 262 | p1.l = __ramstart; | ||
| 263 | p1.h = __ramstart; | ||
| 264 | p3.l = ___bss_stop; | ||
| 265 | p3.h = ___bss_stop; | ||
| 266 | |||
| 267 | r1 = p3; | ||
| 268 | [p1] = r1; | ||
| 269 | |||
| 270 | |||
| 271 | /* | ||
| 272 | * load the current thread pointer and stack | ||
| 273 | */ | ||
| 274 | r1.l = _init_thread_union; | ||
| 275 | r1.h = _init_thread_union; | ||
| 276 | |||
| 277 | r2.l = 0x2000; | ||
| 278 | r2.h = 0x0000; | ||
| 279 | r1 = r1 + r2; | ||
| 280 | sp = r1; | ||
| 281 | usp = sp; | ||
| 282 | fp = sp; | ||
| 283 | call _start_kernel; | ||
| 284 | .L_exit: | ||
| 285 | jump.s .L_exit; | ||
| 286 | ENDPROC(_real_start) | ||
| 287 | |||
| 288 | __FINIT | ||
| 289 | |||
| 290 | .section .l1.text | 38 | .section .l1.text |
| 291 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 292 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
| @@ -443,13 +191,6 @@ ENTRY(_start_dma_code) | |||
| 443 | SSYNC; | 191 | SSYNC; |
| 444 | #endif | 192 | #endif |
| 445 | 193 | ||
| 446 | p0.h = hi(SIC_IWR0); | ||
| 447 | p0.l = lo(SIC_IWR0); | ||
| 448 | r0.l = lo(IWR_ENABLE_ALL); | ||
| 449 | r0.h = hi(IWR_ENABLE_ALL); | ||
| 450 | [p0] = r0; | ||
| 451 | SSYNC; | ||
| 452 | |||
| 453 | RTS; | 194 | RTS; |
| 454 | ENDPROC(_start_dma_code) | 195 | ENDPROC(_start_dma_code) |
| 455 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 196 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf548/ints-priority.c b/arch/blackfin/mach-bf548/ints-priority.c index 2665653cee37..9dd0fa3ac4de 100644 --- a/arch/blackfin/mach-bf548/ints-priority.c +++ b/arch/blackfin/mach-bf548/ints-priority.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | 33 | ||
| 34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
| 35 | { | 35 | { |
| 36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
| 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 466ef5929a25..8f40990eea2f 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
| @@ -54,16 +54,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF561"; | |||
| 54 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 54 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
| 55 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 55 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
| 56 | { | 56 | { |
| 57 | .name = "bootloader", | 57 | .name = "bootloader(spi)", |
| 58 | .size = 0x00020000, | 58 | .size = 0x00020000, |
| 59 | .offset = 0, | 59 | .offset = 0, |
| 60 | .mask_flags = MTD_CAP_ROM | 60 | .mask_flags = MTD_CAP_ROM |
| 61 | }, { | 61 | }, { |
| 62 | .name = "kernel", | 62 | .name = "linux kernel(spi)", |
| 63 | .size = 0xe0000, | 63 | .size = 0xe0000, |
| 64 | .offset = 0x20000 | 64 | .offset = 0x20000 |
| 65 | }, { | 65 | }, { |
| 66 | .name = "file system", | 66 | .name = "file system(spi)", |
| 67 | .size = 0x700000, | 67 | .size = 0x700000, |
| 68 | .offset = 0x00100000, | 68 | .offset = 0x00100000, |
| 69 | } | 69 | } |
| @@ -306,7 +306,7 @@ static struct platform_device bfin_sir_device = { | |||
| 306 | #endif | 306 | #endif |
| 307 | 307 | ||
| 308 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 308 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
| 309 | #define PATA_INT 119 | 309 | #define PATA_INT IRQ_PF46 |
| 310 | 310 | ||
| 311 | static struct pata_platform_info bfin_pata_platform_data = { | 311 | static struct pata_platform_info bfin_pata_platform_data = { |
| 312 | .ioport_shift = 2, | 312 | .ioport_shift = 2, |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index bc6feded8569..50b4cdceccfe 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <linux/spi/spi.h> | 35 | #include <linux/spi/spi.h> |
| 36 | #include <linux/irq.h> | 36 | #include <linux/irq.h> |
| 37 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
| 38 | #include <linux/ata_platform.h> | ||
| 39 | #include <asm/dma.h> | 38 | #include <asm/dma.h> |
| 40 | #include <asm/bfin5xx_spi.h> | 39 | #include <asm/bfin5xx_spi.h> |
| 41 | #include <asm/portmux.h> | 40 | #include <asm/portmux.h> |
| @@ -243,15 +242,15 @@ static struct platform_device bfin_sir_device = { | |||
| 243 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 242 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 244 | static struct mtd_partition ezkit_partitions[] = { | 243 | static struct mtd_partition ezkit_partitions[] = { |
| 245 | { | 244 | { |
| 246 | .name = "Bootloader", | 245 | .name = "bootloader(nor)", |
| 247 | .size = 0x40000, | 246 | .size = 0x40000, |
| 248 | .offset = 0, | 247 | .offset = 0, |
| 249 | }, { | 248 | }, { |
| 250 | .name = "Kernel", | 249 | .name = "linux kernel(nor)", |
| 251 | .size = 0x1C0000, | 250 | .size = 0x1C0000, |
| 252 | .offset = MTDPART_OFS_APPEND, | 251 | .offset = MTDPART_OFS_APPEND, |
| 253 | }, { | 252 | }, { |
| 254 | .name = "RootFS", | 253 | .name = "file system(nor)", |
| 255 | .size = MTDPART_SIZ_FULL, | 254 | .size = MTDPART_SIZ_FULL, |
| 256 | .offset = MTDPART_OFS_APPEND, | 255 | .offset = MTDPART_OFS_APPEND, |
| 257 | } | 256 | } |
| @@ -350,43 +349,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
| 350 | #endif | 349 | #endif |
| 351 | }; | 350 | }; |
| 352 | 351 | ||
| 353 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 354 | #define PATA_INT 55 | ||
| 355 | |||
| 356 | static struct pata_platform_info bfin_pata_platform_data = { | ||
| 357 | .ioport_shift = 1, | ||
| 358 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
| 359 | }; | ||
| 360 | |||
| 361 | static struct resource bfin_pata_resources[] = { | ||
| 362 | { | ||
| 363 | .start = 0x20314020, | ||
| 364 | .end = 0x2031403F, | ||
| 365 | .flags = IORESOURCE_MEM, | ||
| 366 | }, | ||
| 367 | { | ||
| 368 | .start = 0x2031401C, | ||
| 369 | .end = 0x2031401F, | ||
| 370 | .flags = IORESOURCE_MEM, | ||
| 371 | }, | ||
| 372 | { | ||
| 373 | .start = PATA_INT, | ||
| 374 | .end = PATA_INT, | ||
| 375 | .flags = IORESOURCE_IRQ, | ||
| 376 | }, | ||
| 377 | }; | ||
| 378 | |||
| 379 | static struct platform_device bfin_pata_device = { | ||
| 380 | .name = "pata_platform", | ||
| 381 | .id = -1, | ||
| 382 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
| 383 | .resource = bfin_pata_resources, | ||
| 384 | .dev = { | ||
| 385 | .platform_data = &bfin_pata_platform_data, | ||
| 386 | } | ||
| 387 | }; | ||
| 388 | #endif | ||
| 389 | |||
| 390 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 352 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 391 | #include <linux/input.h> | 353 | #include <linux/input.h> |
| 392 | #include <linux/gpio_keys.h> | 354 | #include <linux/gpio_keys.h> |
| @@ -499,10 +461,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 499 | &bfin_sir_device, | 461 | &bfin_sir_device, |
| 500 | #endif | 462 | #endif |
| 501 | 463 | ||
| 502 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 503 | &bfin_pata_device, | ||
| 504 | #endif | ||
| 505 | |||
| 506 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 464 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 507 | &bfin_device_gpiokeys, | 465 | &bfin_device_gpiokeys, |
| 508 | #endif | 466 | #endif |
| @@ -538,10 +496,6 @@ static int __init ezkit_init(void) | |||
| 538 | #endif | 496 | #endif |
| 539 | 497 | ||
| 540 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 498 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 541 | |||
| 542 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
| 543 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
| 544 | #endif | ||
| 545 | return 0; | 499 | return 0; |
| 546 | } | 500 | } |
| 547 | 501 | ||
diff --git a/arch/blackfin/mach-bf561/head.S b/arch/blackfin/mach-bf561/head.S index cf1a2dff01e7..c7a81e34703d 100644 --- a/arch/blackfin/mach-bf561/head.S +++ b/arch/blackfin/mach-bf561/head.S | |||
| @@ -30,284 +30,13 @@ | |||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | #include <asm/trace.h> | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 34 | |||
| 35 | #if CONFIG_BFIN_KERNEL_CLOCK | ||
| 36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
| 37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
| 38 | #endif | 36 | #endif |
| 39 | 37 | ||
| 40 | .extern ___bss_stop | ||
| 41 | .extern ___bss_start | ||
| 42 | .extern _bf53x_relocate_l1_mem | ||
| 43 | |||
| 44 | #define INITIAL_STACK 0xFFB01000 | ||
| 45 | |||
| 46 | __INIT | ||
| 47 | |||
| 48 | ENTRY(__start) | ||
| 49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 50 | R7 = R0; | ||
| 51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 53 | R0 = SYSCFG_SNEN; | ||
| 54 | #else | ||
| 55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 56 | #endif | ||
| 57 | SYSCFG = R0; | ||
| 58 | R0 = 0; | ||
| 59 | |||
| 60 | /* Clear Out All the data and pointer Registers */ | ||
| 61 | R1 = R0; | ||
| 62 | R2 = R0; | ||
| 63 | R3 = R0; | ||
| 64 | R4 = R0; | ||
| 65 | R5 = R0; | ||
| 66 | R6 = R0; | ||
| 67 | |||
| 68 | P0 = R0; | ||
| 69 | P1 = R0; | ||
| 70 | P2 = R0; | ||
| 71 | P3 = R0; | ||
| 72 | P4 = R0; | ||
| 73 | P5 = R0; | ||
| 74 | |||
| 75 | LC0 = r0; | ||
| 76 | LC1 = r0; | ||
| 77 | L0 = r0; | ||
| 78 | L1 = r0; | ||
| 79 | L2 = r0; | ||
| 80 | L3 = r0; | ||
| 81 | |||
| 82 | /* Clear Out All the DAG Registers */ | ||
| 83 | B0 = r0; | ||
| 84 | B1 = r0; | ||
| 85 | B2 = r0; | ||
| 86 | B3 = r0; | ||
| 87 | |||
| 88 | I0 = r0; | ||
| 89 | I1 = r0; | ||
| 90 | I2 = r0; | ||
| 91 | I3 = r0; | ||
| 92 | |||
| 93 | M0 = r0; | ||
| 94 | M1 = r0; | ||
| 95 | M2 = r0; | ||
| 96 | M3 = r0; | ||
| 97 | |||
| 98 | trace_buffer_init(p0,r0); | ||
| 99 | P0 = R1; | ||
| 100 | R0 = R1; | ||
| 101 | |||
| 102 | /* Turn off the icache */ | ||
| 103 | p0.l = LO(IMEM_CONTROL); | ||
| 104 | p0.h = HI(IMEM_CONTROL); | ||
| 105 | R1 = [p0]; | ||
| 106 | R0 = ~ENICPLB; | ||
| 107 | R0 = R0 & R1; | ||
| 108 | |||
| 109 | #if ANOMALY_05000125 | ||
| 110 | CLI R2; | ||
| 111 | SSYNC; | ||
| 112 | #endif | ||
| 113 | [p0] = R0; | ||
| 114 | SSYNC; | ||
| 115 | #if ANOMALY_05000125 | ||
| 116 | STI R2; | ||
| 117 | #endif | ||
| 118 | |||
| 119 | /* Turn off the dcache */ | ||
| 120 | p0.l = LO(DMEM_CONTROL); | ||
| 121 | p0.h = HI(DMEM_CONTROL); | ||
| 122 | R1 = [p0]; | ||
| 123 | R0 = ~ENDCPLB; | ||
| 124 | R0 = R0 & R1; | ||
| 125 | |||
| 126 | /* Anomaly 05000125 */ | ||
| 127 | #if ANOMALY_05000125 | ||
| 128 | CLI R2; | ||
| 129 | SSYNC; | ||
| 130 | #endif | ||
| 131 | [p0] = R0; | ||
| 132 | SSYNC; | ||
| 133 | #if ANOMALY_05000125 | ||
| 134 | STI R2; | ||
| 135 | #endif | ||
| 136 | |||
| 137 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
| 138 | * so if we dont initalize here, our serial console gets hosed */ | ||
| 139 | p0.h = hi(BFIN_UART_LCR); | ||
| 140 | p0.l = lo(BFIN_UART_LCR); | ||
| 141 | r0 = 0x0(Z); | ||
| 142 | w[p0] = r0.L; /* To enable DLL writes */ | ||
| 143 | ssync; | ||
| 144 | |||
| 145 | p0.h = hi(BFIN_UART_DLL); | ||
| 146 | p0.l = lo(BFIN_UART_DLL); | ||
| 147 | r0 = 0x0(Z); | ||
| 148 | w[p0] = r0.L; | ||
| 149 | ssync; | ||
| 150 | |||
| 151 | p0.h = hi(BFIN_UART_DLH); | ||
| 152 | p0.l = lo(BFIN_UART_DLH); | ||
| 153 | r0 = 0x00(Z); | ||
| 154 | w[p0] = r0.L; | ||
| 155 | ssync; | ||
| 156 | |||
| 157 | p0.h = hi(BFIN_UART_GCTL); | ||
| 158 | p0.l = lo(BFIN_UART_GCTL); | ||
| 159 | r0 = 0x0(Z); | ||
| 160 | w[p0] = r0.L; /* To enable UART clock */ | ||
| 161 | ssync; | ||
| 162 | |||
| 163 | /* Initialize stack pointer */ | ||
| 164 | sp.l = lo(INITIAL_STACK); | ||
| 165 | sp.h = hi(INITIAL_STACK); | ||
| 166 | fp = sp; | ||
| 167 | usp = sp; | ||
| 168 | |||
| 169 | #ifdef CONFIG_EARLY_PRINTK | ||
| 170 | SP += -12; | ||
| 171 | call _init_early_exception_vectors; | ||
| 172 | SP += 12; | ||
| 173 | #endif | ||
| 174 | |||
| 175 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 176 | call _bf53x_relocate_l1_mem; | ||
| 177 | #if CONFIG_BFIN_KERNEL_CLOCK | ||
| 178 | call _start_dma_code; | ||
| 179 | #endif | ||
| 180 | |||
| 181 | /* Code for initializing Async memory banks */ | ||
| 182 | |||
| 183 | p2.h = hi(EBIU_AMBCTL1); | ||
| 184 | p2.l = lo(EBIU_AMBCTL1); | ||
| 185 | r0.h = hi(AMBCTL1VAL); | ||
| 186 | r0.l = lo(AMBCTL1VAL); | ||
| 187 | [p2] = r0; | ||
| 188 | ssync; | ||
| 189 | |||
| 190 | p2.h = hi(EBIU_AMBCTL0); | ||
| 191 | p2.l = lo(EBIU_AMBCTL0); | ||
| 192 | r0.h = hi(AMBCTL0VAL); | ||
| 193 | r0.l = lo(AMBCTL0VAL); | ||
| 194 | [p2] = r0; | ||
| 195 | ssync; | ||
| 196 | |||
| 197 | p2.h = hi(EBIU_AMGCTL); | ||
| 198 | p2.l = lo(EBIU_AMGCTL); | ||
| 199 | r0 = AMGCTLVAL; | ||
| 200 | w[p2] = r0; | ||
| 201 | ssync; | ||
| 202 | |||
| 203 | /* This section keeps the processor in supervisor mode | ||
| 204 | * during kernel boot. Switches to user mode at end of boot. | ||
| 205 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 206 | */ | ||
| 207 | |||
| 208 | /* EVT15 = _real_start */ | ||
| 209 | |||
| 210 | p0.l = lo(EVT15); | ||
| 211 | p0.h = hi(EVT15); | ||
| 212 | p1.l = _real_start; | ||
| 213 | p1.h = _real_start; | ||
| 214 | [p0] = p1; | ||
| 215 | csync; | ||
| 216 | |||
| 217 | p0.l = lo(IMASK); | ||
| 218 | p0.h = hi(IMASK); | ||
| 219 | p1.l = IMASK_IVG15; | ||
| 220 | p1.h = 0x0; | ||
| 221 | [p0] = p1; | ||
| 222 | csync; | ||
| 223 | |||
| 224 | raise 15; | ||
| 225 | p0.l = .LWAIT_HERE; | ||
| 226 | p0.h = .LWAIT_HERE; | ||
| 227 | reti = p0; | ||
| 228 | #if ANOMALY_05000281 | ||
| 229 | nop; nop; nop; | ||
| 230 | #endif | ||
| 231 | rti; | ||
| 232 | |||
| 233 | .LWAIT_HERE: | ||
| 234 | jump .LWAIT_HERE; | ||
| 235 | ENDPROC(__start) | ||
| 236 | |||
| 237 | ENTRY(_real_start) | ||
| 238 | [ -- sp ] = reti; | ||
| 239 | p0.l = lo(WDOGA_CTL); | ||
| 240 | p0.h = hi(WDOGA_CTL); | ||
| 241 | r0 = 0xAD6(z); | ||
| 242 | w[p0] = r0; /* watchdog off for now */ | ||
| 243 | ssync; | ||
| 244 | |||
| 245 | /* Code update for BSS size == 0 | ||
| 246 | * Zero out the bss region. | ||
| 247 | */ | ||
| 248 | |||
| 249 | p1.l = ___bss_start; | ||
| 250 | p1.h = ___bss_start; | ||
| 251 | p2.l = ___bss_stop; | ||
| 252 | p2.h = ___bss_stop; | ||
| 253 | r0 = 0; | ||
| 254 | p2 -= p1; | ||
| 255 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
| 256 | .L_clear_bss: | ||
| 257 | B[p1++] = r0; | ||
| 258 | |||
| 259 | /* In case there is a NULL pointer reference | ||
| 260 | * Zero out region before stext | ||
| 261 | */ | ||
| 262 | |||
| 263 | p1.l = 0x0; | ||
| 264 | p1.h = 0x0; | ||
| 265 | r0.l = __stext; | ||
| 266 | r0.h = __stext; | ||
| 267 | r0 = r0 >> 1; | ||
| 268 | p2 = r0; | ||
| 269 | r0 = 0; | ||
| 270 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
| 271 | .L_clear_zero: | ||
| 272 | W[p1++] = r0; | ||
| 273 | |||
| 274 | /* pass the uboot arguments to the global value command line */ | ||
| 275 | R0 = R7; | ||
| 276 | call _cmdline_init; | ||
| 277 | |||
| 278 | p1.l = __rambase; | ||
| 279 | p1.h = __rambase; | ||
| 280 | r0.l = __sdata; | ||
| 281 | r0.h = __sdata; | ||
| 282 | [p1] = r0; | ||
| 283 | |||
| 284 | p1.l = __ramstart; | ||
| 285 | p1.h = __ramstart; | ||
| 286 | p3.l = ___bss_stop; | ||
| 287 | p3.h = ___bss_stop; | ||
| 288 | |||
| 289 | r1 = p3; | ||
| 290 | [p1] = r1; | ||
| 291 | |||
| 292 | /* | ||
| 293 | * load the current thread pointer and stack | ||
| 294 | */ | ||
| 295 | r1.l = _init_thread_union; | ||
| 296 | r1.h = _init_thread_union; | ||
| 297 | |||
| 298 | r2.l = 0x2000; | ||
| 299 | r2.h = 0x0000; | ||
| 300 | r1 = r1 + r2; | ||
| 301 | sp = r1; | ||
| 302 | usp = sp; | ||
| 303 | fp = sp; | ||
| 304 | jump.l _start_kernel; | ||
| 305 | ENDPROC(_real_start) | ||
| 306 | |||
| 307 | __FINIT | ||
| 308 | |||
| 309 | .section .l1.text | 38 | .section .l1.text |
| 310 | #if CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
| 311 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
| 312 | p0.h = hi(SICA_IWR0); | 41 | p0.h = hi(SICA_IWR0); |
| 313 | p0.l = lo(SICA_IWR0); | 42 | p0.l = lo(SICA_IWR0); |
diff --git a/arch/blackfin/mach-bf561/ints-priority.c b/arch/blackfin/mach-bf561/ints-priority.c index 09b541b0f7c2..9d2f23344720 100644 --- a/arch/blackfin/mach-bf561/ints-priority.c +++ b/arch/blackfin/mach-bf561/ints-priority.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
| 32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
| 33 | 33 | ||
| 34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
| 35 | { | 35 | { |
| 36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
| 37 | bfin_write_SICA_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SICA_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-common/Makefile b/arch/blackfin/mach-common/Makefile index 422bfee34adc..e6ed57c56d4b 100644 --- a/arch/blackfin/mach-common/Makefile +++ b/arch/blackfin/mach-common/Makefile | |||
| @@ -3,9 +3,10 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := \ | 5 | obj-y := \ |
| 6 | cache.o cacheinit.o entry.o \ | 6 | cache.o entry.o head.o \ |
| 7 | interrupt.o lock.o irqpanic.o arch_checks.o ints-priority.o | 7 | interrupt.o irqpanic.o arch_checks.o ints-priority.o |
| 8 | 8 | ||
| 9 | obj-$(CONFIG_BFIN_ICACHE_LOCK) += lock.o | ||
| 9 | obj-$(CONFIG_PM) += pm.o dpmc_modes.o | 10 | obj-$(CONFIG_PM) += pm.o dpmc_modes.o |
| 10 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | 11 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o |
| 11 | obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o | 12 | obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o |
diff --git a/arch/blackfin/mach-common/arch_checks.c b/arch/blackfin/mach-common/arch_checks.c index f9160d83b91f..5986758b2752 100644 --- a/arch/blackfin/mach-common/arch_checks.c +++ b/arch/blackfin/mach-common/arch_checks.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #include <asm/fixed_code.h> | ||
| 30 | #include <asm/mach/anomaly.h> | 31 | #include <asm/mach/anomaly.h> |
| 31 | #include <asm/mach-common/clocks.h> | 32 | #include <asm/mach-common/clocks.h> |
| 32 | 33 | ||
| @@ -53,3 +54,11 @@ | |||
| 53 | # endif | 54 | # endif |
| 54 | 55 | ||
| 55 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 56 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
| 57 | |||
| 58 | #if CONFIG_BOOT_LOAD < FIXED_CODE_END | ||
| 59 | # error "The kernel load address must be after the fixed code section" | ||
| 60 | #endif | ||
| 61 | |||
| 62 | #if (CONFIG_BOOT_LOAD & 0x3) | ||
| 63 | # error "The kernel load address must be 4 byte aligned" | ||
| 64 | #endif | ||
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 0521b1588204..85f8c79b3c37 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
| @@ -34,81 +34,6 @@ | |||
| 34 | #include <asm/cache.h> | 34 | #include <asm/cache.h> |
| 35 | 35 | ||
| 36 | .text | 36 | .text |
| 37 | .align 2 | ||
| 38 | ENTRY(_cache_invalidate) | ||
| 39 | |||
| 40 | /* | ||
| 41 | * Icache or DcacheA or DcacheB Invalidation | ||
| 42 | * or any combination thereof | ||
| 43 | * R0 has bits | ||
| 44 | * CPLB_ENABLE_ICACHE_P,CPLB_ENABLE_DCACHE_P,CPLB_ENABLE_DCACHE2_P | ||
| 45 | * set as required | ||
| 46 | */ | ||
| 47 | [--SP] = R7; | ||
| 48 | |||
| 49 | R7 = R0; | ||
| 50 | CC = BITTST(R7,CPLB_ENABLE_ICACHE_P); | ||
| 51 | IF !CC JUMP .Lno_icache; | ||
| 52 | [--SP] = RETS; | ||
| 53 | CALL _icache_invalidate; | ||
| 54 | RETS = [SP++]; | ||
| 55 | .Lno_icache: | ||
| 56 | CC = BITTST(R7,CPLB_ENABLE_DCACHE_P); | ||
| 57 | IF !CC JUMP .Lno_dcache_a; | ||
| 58 | R0 = 0; /* specifies bank A */ | ||
| 59 | [--SP] = RETS; | ||
| 60 | CALL _dcache_invalidate; | ||
| 61 | RETS = [SP++]; | ||
| 62 | .Lno_dcache_a: | ||
| 63 | CC = BITTST(R7,CPLB_ENABLE_DCACHE2_P); | ||
| 64 | IF !CC JUMP .Lno_dcache_b; | ||
| 65 | R0 = 0; | ||
| 66 | BITSET(R0, 23); /* specifies bank B */ | ||
| 67 | [--SP] = RETS; | ||
| 68 | CALL _dcache_invalidate; | ||
| 69 | RETS = [SP++]; | ||
| 70 | .Lno_dcache_b: | ||
| 71 | R7 = [SP++]; | ||
| 72 | RTS; | ||
| 73 | ENDPROC(_cache_invalidate) | ||
| 74 | |||
| 75 | /* Invalidate the Entire Instruction cache by | ||
| 76 | * disabling IMC bit | ||
| 77 | */ | ||
| 78 | ENTRY(_icache_invalidate) | ||
| 79 | ENTRY(_invalidate_entire_icache) | ||
| 80 | [--SP] = ( R7:5); | ||
| 81 | |||
| 82 | P0.L = LO(IMEM_CONTROL); | ||
| 83 | P0.H = HI(IMEM_CONTROL); | ||
| 84 | R7 = [P0]; | ||
| 85 | |||
| 86 | /* Clear the IMC bit , All valid bits in the instruction | ||
| 87 | * cache are set to the invalid state | ||
| 88 | */ | ||
| 89 | BITCLR(R7,IMC_P); | ||
| 90 | CLI R6; | ||
| 91 | SSYNC; /* SSYNC required before invalidating cache. */ | ||
| 92 | .align 8; | ||
| 93 | [P0] = R7; | ||
| 94 | SSYNC; | ||
| 95 | STI R6; | ||
| 96 | |||
| 97 | /* Configures the instruction cache agian */ | ||
| 98 | R6 = (IMC | ENICPLB); | ||
| 99 | R7 = R7 | R6; | ||
| 100 | |||
| 101 | CLI R6; | ||
| 102 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
| 103 | .align 8; | ||
| 104 | [P0] = R7; | ||
| 105 | SSYNC; | ||
| 106 | STI R6; | ||
| 107 | |||
| 108 | ( R7:5) = [SP++]; | ||
| 109 | RTS; | ||
| 110 | ENDPROC(_invalidate_entire_icache) | ||
| 111 | ENDPROC(_icache_invalidate) | ||
| 112 | 37 | ||
| 113 | /* | 38 | /* |
| 114 | * blackfin_cache_flush_range(start, end) | 39 | * blackfin_cache_flush_range(start, end) |
| @@ -190,46 +115,6 @@ ENTRY(_blackfin_dcache_invalidate_range) | |||
| 190 | RTS; | 115 | RTS; |
| 191 | ENDPROC(_blackfin_dcache_invalidate_range) | 116 | ENDPROC(_blackfin_dcache_invalidate_range) |
| 192 | 117 | ||
| 193 | /* Invalidate the Entire Data cache by | ||
| 194 | * clearing DMC[1:0] bits | ||
| 195 | */ | ||
| 196 | ENTRY(_invalidate_entire_dcache) | ||
| 197 | ENTRY(_dcache_invalidate) | ||
| 198 | [--SP] = ( R7:6); | ||
| 199 | |||
| 200 | P0.L = LO(DMEM_CONTROL); | ||
| 201 | P0.H = HI(DMEM_CONTROL); | ||
| 202 | R7 = [P0]; | ||
| 203 | |||
| 204 | /* Clear the DMC[1:0] bits, All valid bits in the data | ||
| 205 | * cache are set to the invalid state | ||
| 206 | */ | ||
| 207 | BITCLR(R7,DMC0_P); | ||
| 208 | BITCLR(R7,DMC1_P); | ||
| 209 | CLI R6; | ||
| 210 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
| 211 | .align 8; | ||
| 212 | [P0] = R7; | ||
| 213 | SSYNC; | ||
| 214 | STI R6; | ||
| 215 | |||
| 216 | /* Configures the data cache again */ | ||
| 217 | |||
| 218 | R6 = DMEM_CNTR; | ||
| 219 | R7 = R7 | R6; | ||
| 220 | |||
| 221 | CLI R6; | ||
| 222 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
| 223 | .align 8; | ||
| 224 | [P0] = R7; | ||
| 225 | SSYNC; | ||
| 226 | STI R6; | ||
| 227 | |||
| 228 | ( R7:6) = [SP++]; | ||
| 229 | RTS; | ||
| 230 | ENDPROC(_dcache_invalidate) | ||
| 231 | ENDPROC(_invalidate_entire_dcache) | ||
| 232 | |||
| 233 | ENTRY(_blackfin_dcache_flush_range) | 118 | ENTRY(_blackfin_dcache_flush_range) |
| 234 | R2 = -L1_CACHE_BYTES; | 119 | R2 = -L1_CACHE_BYTES; |
| 235 | R2 = R0 & R2; | 120 | R2 = R0 & R2; |
diff --git a/arch/blackfin/mach-common/cacheinit.S b/arch/blackfin/mach-common/cacheinit.S deleted file mode 100644 index 22fada0c1cb3..000000000000 --- a/arch/blackfin/mach-common/cacheinit.S +++ /dev/null | |||
| @@ -1,77 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * File: arch/blackfin/mach-common/cacheinit.S | ||
| 3 | * Based on: | ||
| 4 | * Author: LG Soft India | ||
| 5 | * | ||
| 6 | * Created: ? | ||
| 7 | * Description: cache initialization | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | ||
| 29 | |||
| 30 | /* This function sets up the data and instruction cache. The | ||
| 31 | * tables like icplb table, dcplb table and Page Descriptor table | ||
| 32 | * are defined in cplbtab.h. You can configure those tables for | ||
| 33 | * your suitable requirements | ||
| 34 | */ | ||
| 35 | |||
| 36 | #include <linux/linkage.h> | ||
| 37 | #include <asm/blackfin.h> | ||
| 38 | |||
| 39 | .text | ||
| 40 | |||
| 41 | #if ANOMALY_05000125 | ||
| 42 | #if defined(CONFIG_BFIN_ICACHE) | ||
| 43 | ENTRY(_bfin_write_IMEM_CONTROL) | ||
| 44 | |||
| 45 | /* Enable Instruction Cache */ | ||
| 46 | P0.l = LO(IMEM_CONTROL); | ||
| 47 | P0.h = HI(IMEM_CONTROL); | ||
| 48 | |||
| 49 | /* Anomaly 05000125 */ | ||
| 50 | CLI R1; | ||
| 51 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
| 52 | .align 8; | ||
| 53 | [P0] = R0; | ||
| 54 | SSYNC; | ||
| 55 | STI R1; | ||
| 56 | RTS; | ||
| 57 | |||
| 58 | ENDPROC(_bfin_write_IMEM_CONTROL) | ||
| 59 | #endif | ||
| 60 | |||
| 61 | #if defined(CONFIG_BFIN_DCACHE) | ||
| 62 | ENTRY(_bfin_write_DMEM_CONTROL) | ||
| 63 | P0.l = LO(DMEM_CONTROL); | ||
| 64 | P0.h = HI(DMEM_CONTROL); | ||
| 65 | |||
| 66 | CLI R1; | ||
| 67 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
| 68 | .align 8; | ||
| 69 | [P0] = R0; | ||
| 70 | SSYNC; | ||
| 71 | STI R1; | ||
| 72 | RTS; | ||
| 73 | |||
| 74 | ENDPROC(_bfin_write_DMEM_CONTROL) | ||
| 75 | #endif | ||
| 76 | |||
| 77 | #endif | ||
diff --git a/arch/blackfin/mach-common/dpmc_modes.S b/arch/blackfin/mach-common/dpmc_modes.S index 5e3f1d8a4fb8..838b0b2ce9a5 100644 --- a/arch/blackfin/mach-common/dpmc_modes.S +++ b/arch/blackfin/mach-common/dpmc_modes.S | |||
| @@ -78,62 +78,6 @@ ENTRY(_hibernate_mode) | |||
| 78 | jump .Lforever; | 78 | jump .Lforever; |
| 79 | ENDPROC(_hibernate_mode) | 79 | ENDPROC(_hibernate_mode) |
| 80 | 80 | ||
| 81 | ENTRY(_deep_sleep) | ||
| 82 | [--SP] = ( R7:0, P5:0 ); | ||
| 83 | [--SP] = RETS; | ||
| 84 | |||
| 85 | CLI R4; | ||
| 86 | |||
| 87 | R0 = IWR_ENABLE(0); | ||
| 88 | R1 = IWR_DISABLE_ALL; | ||
| 89 | R2 = IWR_DISABLE_ALL; | ||
| 90 | |||
| 91 | call _set_sic_iwr; | ||
| 92 | |||
| 93 | call _set_dram_srfs; | ||
| 94 | |||
| 95 | /* Clear all the interrupts,bits sticky */ | ||
| 96 | R0 = 0xFFFF (Z); | ||
| 97 | call _set_rtc_istat | ||
| 98 | |||
| 99 | P0.H = hi(PLL_CTL); | ||
| 100 | P0.L = lo(PLL_CTL); | ||
| 101 | R0 = W[P0](z); | ||
| 102 | BITSET (R0, 5); | ||
| 103 | W[P0] = R0.L; | ||
| 104 | |||
| 105 | call _test_pll_locked; | ||
| 106 | |||
| 107 | SSYNC; | ||
| 108 | IDLE; | ||
| 109 | |||
| 110 | call _unset_dram_srfs; | ||
| 111 | |||
| 112 | call _test_pll_locked; | ||
| 113 | |||
| 114 | R0 = IWR_ENABLE(0); | ||
| 115 | R1 = IWR_DISABLE_ALL; | ||
| 116 | R2 = IWR_DISABLE_ALL; | ||
| 117 | |||
| 118 | call _set_sic_iwr; | ||
| 119 | |||
| 120 | P0.H = hi(PLL_CTL); | ||
| 121 | P0.L = lo(PLL_CTL); | ||
| 122 | R0 = w[p0](z); | ||
| 123 | BITCLR (R0, 3); | ||
| 124 | BITCLR (R0, 5); | ||
| 125 | BITCLR (R0, 8); | ||
| 126 | w[p0] = R0; | ||
| 127 | IDLE; | ||
| 128 | call _test_pll_locked; | ||
| 129 | |||
| 130 | STI R4; | ||
| 131 | |||
| 132 | RETS = [SP++]; | ||
| 133 | ( R7:0, P5:0 ) = [SP++]; | ||
| 134 | RTS; | ||
| 135 | ENDPROC(_deep_sleep) | ||
| 136 | |||
| 137 | ENTRY(_sleep_deeper) | 81 | ENTRY(_sleep_deeper) |
| 138 | [--SP] = ( R7:0, P5:0 ); | 82 | [--SP] = ( R7:0, P5:0 ); |
| 139 | [--SP] = RETS; | 83 | [--SP] = RETS; |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index eceb484d90f9..117c01c2c6b0 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
| @@ -158,14 +158,16 @@ ENTRY(_ex_single_step) | |||
| 158 | cc = r7 == r6; | 158 | cc = r7 == r6; |
| 159 | if cc jump _bfin_return_from_exception; | 159 | if cc jump _bfin_return_from_exception; |
| 160 | 160 | ||
| 161 | #ifdef CONFIG_KGDB | ||
| 161 | /* Don't do single step in hardware exception handler */ | 162 | /* Don't do single step in hardware exception handler */ |
| 162 | p5.l = lo(IPEND); | 163 | p5.l = lo(IPEND); |
| 163 | p5.h = hi(IPEND); | 164 | p5.h = hi(IPEND); |
| 164 | r6 = [p5]; | 165 | r6 = [p5]; |
| 166 | cc = bittst(r6, 4); | ||
| 167 | if cc jump _bfin_return_from_exception; | ||
| 165 | cc = bittst(r6, 5); | 168 | cc = bittst(r6, 5); |
| 166 | if cc jump _bfin_return_from_exception; | 169 | if cc jump _bfin_return_from_exception; |
| 167 | 170 | ||
| 168 | #ifdef CONFIG_KGDB | ||
| 169 | /* skip single step if current interrupt priority is higher than | 171 | /* skip single step if current interrupt priority is higher than |
| 170 | * that of the first instruction, from which gdb starts single step */ | 172 | * that of the first instruction, from which gdb starts single step */ |
| 171 | r6 >>= 6; | 173 | r6 >>= 6; |
| @@ -186,17 +188,27 @@ ENTRY(_ex_single_step) | |||
| 186 | if cc jump .Ldo_single_step; | 188 | if cc jump .Ldo_single_step; |
| 187 | r6 += -1; | 189 | r6 += -1; |
| 188 | cc = r6 < r7; | 190 | cc = r6 < r7; |
| 189 | if cc jump _bfin_return_from_exception; | 191 | if cc jump 1f; |
| 190 | .Ldo_single_step: | 192 | .Ldo_single_step: |
| 191 | #endif | 193 | #else |
| 192 | |||
| 193 | /* If we were in user mode, do the single step normally. */ | 194 | /* If we were in user mode, do the single step normally. */ |
| 195 | p5.l = lo(IPEND); | ||
| 196 | p5.h = hi(IPEND); | ||
| 194 | r6 = [p5]; | 197 | r6 = [p5]; |
| 195 | r7 = 0xffe0 (z); | 198 | r7 = 0xffe0 (z); |
| 196 | r7 = r7 & r6; | 199 | r7 = r7 & r6; |
| 197 | cc = r7 == 0; | 200 | cc = r7 == 0; |
| 198 | if cc jump 1f; | 201 | if !cc jump 1f; |
| 202 | #endif | ||
| 199 | 203 | ||
| 204 | /* Single stepping only a single instruction, so clear the trace | ||
| 205 | * bit here. */ | ||
| 206 | r7 = syscfg; | ||
| 207 | bitclr (r7, 0); | ||
| 208 | syscfg = R7; | ||
| 209 | jump _ex_trap_c; | ||
| 210 | |||
| 211 | 1: | ||
| 200 | /* | 212 | /* |
| 201 | * We were in an interrupt handler. By convention, all of them save | 213 | * We were in an interrupt handler. By convention, all of them save |
| 202 | * SYSCFG with their first instruction, so by checking whether our | 214 | * SYSCFG with their first instruction, so by checking whether our |
| @@ -224,15 +236,11 @@ ENTRY(_ex_single_step) | |||
| 224 | cc = R7 == R6; | 236 | cc = R7 == R6; |
| 225 | if !cc jump _bfin_return_from_exception; | 237 | if !cc jump _bfin_return_from_exception; |
| 226 | 238 | ||
| 227 | 1: | ||
| 228 | /* Single stepping only a single instruction, so clear the trace | ||
| 229 | * bit here. */ | ||
| 230 | r7 = syscfg; | 239 | r7 = syscfg; |
| 231 | bitclr (r7, 0); | 240 | bitclr (r7, 0); |
| 232 | syscfg = R7; | 241 | syscfg = R7; |
| 233 | 242 | ||
| 234 | jump _ex_trap_c; | 243 | /* Fall through to _bfin_return_from_exception. */ |
| 235 | |||
| 236 | ENDPROC(_ex_single_step) | 244 | ENDPROC(_ex_single_step) |
| 237 | 245 | ||
| 238 | ENTRY(_bfin_return_from_exception) | 246 | ENTRY(_bfin_return_from_exception) |
| @@ -1414,6 +1422,12 @@ ENTRY(_sys_call_table) | |||
| 1414 | .long _sys_semtimedop | 1422 | .long _sys_semtimedop |
| 1415 | .long _sys_timerfd_settime | 1423 | .long _sys_timerfd_settime |
| 1416 | .long _sys_timerfd_gettime | 1424 | .long _sys_timerfd_gettime |
| 1425 | .long _sys_signalfd4 /* 360 */ | ||
| 1426 | .long _sys_eventfd2 | ||
| 1427 | .long _sys_epoll_create1 | ||
| 1428 | .long _sys_dup3 | ||
| 1429 | .long _sys_pipe2 | ||
| 1430 | .long _sys_inotify_init1 /* 365 */ | ||
| 1417 | 1431 | ||
| 1418 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1432 | .rept NR_syscalls-(.-_sys_call_table)/4 |
| 1419 | .long _sys_ni_syscall | 1433 | .long _sys_ni_syscall |
diff --git a/arch/blackfin/mach-common/head.S b/arch/blackfin/mach-common/head.S new file mode 100644 index 000000000000..191b4e974c4b --- /dev/null +++ b/arch/blackfin/mach-common/head.S | |||
| @@ -0,0 +1,207 @@ | |||
| 1 | /* | ||
| 2 | * Common Blackfin startup code | ||
| 3 | * | ||
| 4 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/linkage.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <asm/blackfin.h> | ||
| 14 | #include <asm/thread_info.h> | ||
| 15 | #include <asm/trace.h> | ||
| 16 | |||
| 17 | __INIT | ||
| 18 | |||
| 19 | #define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) | ||
| 20 | |||
| 21 | ENTRY(__start) | ||
| 22 | /* R0: argument of command line string, passed from uboot, save it */ | ||
| 23 | R7 = R0; | ||
| 24 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
| 25 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
| 26 | R0 = SYSCFG_SNEN; | ||
| 27 | #else | ||
| 28 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
| 29 | #endif | ||
| 30 | SYSCFG = R0; | ||
| 31 | R0 = 0; | ||
| 32 | |||
| 33 | /* Clear Out All the data and pointer Registers */ | ||
| 34 | R1 = R0; | ||
| 35 | R2 = R0; | ||
| 36 | R3 = R0; | ||
| 37 | R4 = R0; | ||
| 38 | R5 = R0; | ||
| 39 | R6 = R0; | ||
| 40 | |||
| 41 | P0 = R0; | ||
| 42 | P1 = R0; | ||
| 43 | P2 = R0; | ||
| 44 | P3 = R0; | ||
| 45 | P4 = R0; | ||
| 46 | P5 = R0; | ||
| 47 | |||
| 48 | LC0 = r0; | ||
| 49 | LC1 = r0; | ||
| 50 | L0 = r0; | ||
| 51 | L1 = r0; | ||
| 52 | L2 = r0; | ||
| 53 | L3 = r0; | ||
| 54 | |||
| 55 | /* Clear Out All the DAG Registers */ | ||
| 56 | B0 = r0; | ||
| 57 | B1 = r0; | ||
| 58 | B2 = r0; | ||
| 59 | B3 = r0; | ||
| 60 | |||
| 61 | I0 = r0; | ||
| 62 | I1 = r0; | ||
| 63 | I2 = r0; | ||
| 64 | I3 = r0; | ||
| 65 | |||
| 66 | M0 = r0; | ||
| 67 | M1 = r0; | ||
| 68 | M2 = r0; | ||
| 69 | M3 = r0; | ||
| 70 | |||
| 71 | trace_buffer_init(p0,r0); | ||
| 72 | P0 = R1; | ||
| 73 | R0 = R1; | ||
| 74 | |||
| 75 | /* Turn off the icache */ | ||
| 76 | p0.l = LO(IMEM_CONTROL); | ||
| 77 | p0.h = HI(IMEM_CONTROL); | ||
| 78 | R1 = [p0]; | ||
| 79 | R0 = ~ENICPLB; | ||
| 80 | R0 = R0 & R1; | ||
| 81 | [p0] = R0; | ||
| 82 | SSYNC; | ||
| 83 | |||
| 84 | /* Turn off the dcache */ | ||
| 85 | p0.l = LO(DMEM_CONTROL); | ||
| 86 | p0.h = HI(DMEM_CONTROL); | ||
| 87 | R1 = [p0]; | ||
| 88 | R0 = ~ENDCPLB; | ||
| 89 | R0 = R0 & R1; | ||
| 90 | [p0] = R0; | ||
| 91 | SSYNC; | ||
| 92 | |||
| 93 | /* Save RETX, in case of doublefault */ | ||
| 94 | p0.l = ___retx; | ||
| 95 | p0.h = ___retx; | ||
| 96 | R0 = RETX; | ||
| 97 | [P0] = R0; | ||
| 98 | |||
| 99 | /* Initialize stack pointer */ | ||
| 100 | sp.l = lo(INITIAL_STACK); | ||
| 101 | sp.h = hi(INITIAL_STACK); | ||
| 102 | fp = sp; | ||
| 103 | usp = sp; | ||
| 104 | |||
| 105 | #ifdef CONFIG_EARLY_PRINTK | ||
| 106 | call _init_early_exception_vectors; | ||
| 107 | #endif | ||
| 108 | |||
| 109 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
| 110 | call _bf53x_relocate_l1_mem; | ||
| 111 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
| 112 | call _start_dma_code; | ||
| 113 | #endif | ||
| 114 | |||
| 115 | /* This section keeps the processor in supervisor mode | ||
| 116 | * during kernel boot. Switches to user mode at end of boot. | ||
| 117 | * See page 3-9 of Hardware Reference manual for documentation. | ||
| 118 | */ | ||
| 119 | |||
| 120 | /* EVT15 = _real_start */ | ||
| 121 | |||
| 122 | p0.l = lo(EVT15); | ||
| 123 | p0.h = hi(EVT15); | ||
| 124 | p1.l = _real_start; | ||
| 125 | p1.h = _real_start; | ||
| 126 | [p0] = p1; | ||
| 127 | csync; | ||
| 128 | |||
| 129 | p0.l = lo(IMASK); | ||
| 130 | p0.h = hi(IMASK); | ||
| 131 | p1.l = IMASK_IVG15; | ||
| 132 | p1.h = 0x0; | ||
| 133 | [p0] = p1; | ||
| 134 | csync; | ||
| 135 | |||
| 136 | raise 15; | ||
| 137 | p0.l = .LWAIT_HERE; | ||
| 138 | p0.h = .LWAIT_HERE; | ||
| 139 | reti = p0; | ||
| 140 | #if ANOMALY_05000281 | ||
| 141 | nop; nop; nop; | ||
| 142 | #endif | ||
| 143 | rti; | ||
| 144 | |||
| 145 | .LWAIT_HERE: | ||
| 146 | jump .LWAIT_HERE; | ||
| 147 | ENDPROC(__start) | ||
| 148 | |||
| 149 | /* A little BF561 glue ... */ | ||
| 150 | #ifndef WDOG_CTL | ||
| 151 | # define WDOG_CTL WDOGA_CTL | ||
| 152 | #endif | ||
| 153 | |||
| 154 | ENTRY(_real_start) | ||
| 155 | /* Enable nested interrupts */ | ||
| 156 | [--sp] = reti; | ||
| 157 | |||
| 158 | /* watchdog off for now */ | ||
| 159 | p0.l = lo(WDOG_CTL); | ||
| 160 | p0.h = hi(WDOG_CTL); | ||
| 161 | r0 = 0xAD6(z); | ||
| 162 | w[p0] = r0; | ||
| 163 | ssync; | ||
| 164 | |||
| 165 | /* Zero out the bss region | ||
| 166 | * Note: this will fail if bss is 0 bytes ... | ||
| 167 | */ | ||
| 168 | r0 = 0 (z); | ||
| 169 | r1.l = ___bss_start; | ||
| 170 | r1.h = ___bss_start; | ||
| 171 | r2.l = ___bss_stop; | ||
| 172 | r2.h = ___bss_stop; | ||
| 173 | r2 = r2 - r1; | ||
| 174 | r2 >>= 2; | ||
| 175 | p1 = r1; | ||
| 176 | p2 = r2; | ||
| 177 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
| 178 | .L_clear_bss: | ||
| 179 | [p1++] = r0; | ||
| 180 | |||
| 181 | /* In case there is a NULL pointer reference, | ||
| 182 | * zero out region before stext | ||
| 183 | */ | ||
| 184 | p1 = r0; | ||
| 185 | r2.l = __stext; | ||
| 186 | r2.h = __stext; | ||
| 187 | r2 >>= 2; | ||
| 188 | p2 = r2; | ||
| 189 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
| 190 | .L_clear_zero: | ||
| 191 | [p1++] = r0; | ||
| 192 | |||
| 193 | /* Pass the u-boot arguments to the global value command line */ | ||
| 194 | R0 = R7; | ||
| 195 | call _cmdline_init; | ||
| 196 | |||
| 197 | /* Load the current thread pointer and stack */ | ||
| 198 | sp.l = _init_thread_union; | ||
| 199 | sp.h = _init_thread_union; | ||
| 200 | p1 = THREAD_SIZE (z); | ||
| 201 | sp = sp + p1; | ||
| 202 | usp = sp; | ||
| 203 | fp = sp; | ||
| 204 | jump.l _start_kernel; | ||
| 205 | ENDPROC(_real_start) | ||
| 206 | |||
| 207 | __FINIT | ||
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 64d746114e4b..62f8883a5c27 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
| @@ -71,6 +71,7 @@ atomic_t num_spurious; | |||
| 71 | 71 | ||
| 72 | #ifdef CONFIG_PM | 72 | #ifdef CONFIG_PM |
| 73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ | 73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ |
| 74 | unsigned vr_wakeup; | ||
| 74 | #endif | 75 | #endif |
| 75 | 76 | ||
| 76 | struct ivgx { | 77 | struct ivgx { |
| @@ -184,17 +185,56 @@ static void bfin_internal_unmask_irq(unsigned int irq) | |||
| 184 | #ifdef CONFIG_PM | 185 | #ifdef CONFIG_PM |
| 185 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) | 186 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) |
| 186 | { | 187 | { |
| 187 | unsigned bank, bit; | 188 | unsigned bank, bit, wakeup = 0; |
| 188 | unsigned long flags; | 189 | unsigned long flags; |
| 189 | bank = SIC_SYSIRQ(irq) / 32; | 190 | bank = SIC_SYSIRQ(irq) / 32; |
| 190 | bit = SIC_SYSIRQ(irq) % 32; | 191 | bit = SIC_SYSIRQ(irq) % 32; |
| 191 | 192 | ||
| 193 | switch (irq) { | ||
| 194 | #ifdef IRQ_RTC | ||
| 195 | case IRQ_RTC: | ||
| 196 | wakeup |= WAKE; | ||
| 197 | break; | ||
| 198 | #endif | ||
| 199 | #ifdef IRQ_CAN0_RX | ||
| 200 | case IRQ_CAN0_RX: | ||
| 201 | wakeup |= CANWE; | ||
| 202 | break; | ||
| 203 | #endif | ||
| 204 | #ifdef IRQ_CAN1_RX | ||
| 205 | case IRQ_CAN1_RX: | ||
| 206 | wakeup |= CANWE; | ||
| 207 | break; | ||
| 208 | #endif | ||
| 209 | #ifdef IRQ_USB_INT0 | ||
| 210 | case IRQ_USB_INT0: | ||
| 211 | wakeup |= USBWE; | ||
| 212 | break; | ||
| 213 | #endif | ||
| 214 | #ifdef IRQ_KEY | ||
| 215 | case IRQ_KEY: | ||
| 216 | wakeup |= KPADWE; | ||
| 217 | break; | ||
| 218 | #endif | ||
| 219 | #ifdef IRQ_CNT | ||
| 220 | case IRQ_CNT: | ||
| 221 | wakeup |= ROTWE; | ||
| 222 | break; | ||
| 223 | #endif | ||
| 224 | default: | ||
| 225 | break; | ||
| 226 | } | ||
| 227 | |||
| 192 | local_irq_save(flags); | 228 | local_irq_save(flags); |
| 193 | 229 | ||
| 194 | if (state) | 230 | if (state) { |
| 195 | bfin_sic_iwr[bank] |= (1 << bit); | 231 | bfin_sic_iwr[bank] |= (1 << bit); |
| 196 | else | 232 | vr_wakeup |= wakeup; |
| 233 | |||
| 234 | } else { | ||
| 197 | bfin_sic_iwr[bank] &= ~(1 << bit); | 235 | bfin_sic_iwr[bank] &= ~(1 << bit); |
| 236 | vr_wakeup &= ~wakeup; | ||
| 237 | } | ||
| 198 | 238 | ||
| 199 | local_irq_restore(flags); | 239 | local_irq_restore(flags); |
| 200 | 240 | ||
| @@ -943,6 +983,11 @@ int __init init_arch_irq(void) | |||
| 943 | 983 | ||
| 944 | local_irq_disable(); | 984 | local_irq_disable(); |
| 945 | 985 | ||
| 986 | #if defined(CONFIG_BF527) || defined(CONFIG_BF536) || defined(CONFIG_BF537) | ||
| 987 | /* Clear EMAC Interrupt Status bits so we can demux it later */ | ||
| 988 | bfin_write_EMAC_SYSTAT(-1); | ||
| 989 | #endif | ||
| 990 | |||
| 946 | #ifdef CONFIG_BF54x | 991 | #ifdef CONFIG_BF54x |
| 947 | # ifdef CONFIG_PINTx_REASSIGN | 992 | # ifdef CONFIG_PINTx_REASSIGN |
| 948 | pint[0]->assign = CONFIG_PINT0_ASSIGN; | 993 | pint[0]->assign = CONFIG_PINT0_ASSIGN; |
| @@ -1028,13 +1073,22 @@ int __init init_arch_irq(void) | |||
| 1028 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; | 1073 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; |
| 1029 | 1074 | ||
| 1030 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 1075 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
| 1031 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | 1076 | bfin_write_SIC_IWR0(IWR_DISABLE_ALL); |
| 1032 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | 1077 | #if defined(CONFIG_BF52x) |
| 1078 | /* BF52x system reset does not properly reset SIC_IWR1 which | ||
| 1079 | * will screw up the bootrom as it relies on MDMA0/1 waking it | ||
| 1080 | * up from IDLE instructions. See this report for more info: | ||
| 1081 | * http://blackfin.uclinux.org/gf/tracker/4323 | ||
| 1082 | */ | ||
| 1083 | bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11)); | ||
| 1084 | #else | ||
| 1085 | bfin_write_SIC_IWR1(IWR_DISABLE_ALL); | ||
| 1086 | #endif | ||
| 1033 | # ifdef CONFIG_BF54x | 1087 | # ifdef CONFIG_BF54x |
| 1034 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | 1088 | bfin_write_SIC_IWR2(IWR_DISABLE_ALL); |
| 1035 | # endif | 1089 | # endif |
| 1036 | #else | 1090 | #else |
| 1037 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | 1091 | bfin_write_SIC_IWR(IWR_DISABLE_ALL); |
| 1038 | #endif | 1092 | #endif |
| 1039 | 1093 | ||
| 1040 | return 0; | 1094 | return 0; |
diff --git a/arch/blackfin/mach-common/lock.S b/arch/blackfin/mach-common/lock.S index 30b887e67dd6..9daf01201e9f 100644 --- a/arch/blackfin/mach-common/lock.S +++ b/arch/blackfin/mach-common/lock.S | |||
| @@ -28,13 +28,10 @@ | |||
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <asm/cplb.h> | ||
| 32 | #include <asm/blackfin.h> | 31 | #include <asm/blackfin.h> |
| 33 | 32 | ||
| 34 | .text | 33 | .text |
| 35 | 34 | ||
| 36 | #ifdef CONFIG_BFIN_ICACHE_LOCK | ||
| 37 | |||
| 38 | /* When you come here, it is assumed that | 35 | /* When you come here, it is assumed that |
| 39 | * R0 - Which way to be locked | 36 | * R0 - Which way to be locked |
| 40 | */ | 37 | */ |
| @@ -189,18 +186,38 @@ ENTRY(_cache_lock) | |||
| 189 | RTS; | 186 | RTS; |
| 190 | ENDPROC(_cache_lock) | 187 | ENDPROC(_cache_lock) |
| 191 | 188 | ||
| 192 | #endif /* BFIN_ICACHE_LOCK */ | 189 | /* Invalidate the Entire Instruction cache by |
| 193 | 190 | * disabling IMC bit | |
| 194 | /* Return the ILOC bits of IMEM_CONTROL | ||
| 195 | */ | 191 | */ |
| 192 | ENTRY(_invalidate_entire_icache) | ||
| 193 | [--SP] = ( R7:5); | ||
| 196 | 194 | ||
| 197 | ENTRY(_read_iloc) | 195 | P0.L = LO(IMEM_CONTROL); |
| 198 | P1.H = HI(IMEM_CONTROL); | 196 | P0.H = HI(IMEM_CONTROL); |
| 199 | P1.L = LO(IMEM_CONTROL); | 197 | R7 = [P0]; |
| 200 | R1 = 0xF; | 198 | |
| 201 | R0 = [P1]; | 199 | /* Clear the IMC bit , All valid bits in the instruction |
| 202 | R0 = R0 >> 3; | 200 | * cache are set to the invalid state |
| 203 | R0 = R0 & R1; | 201 | */ |
| 202 | BITCLR(R7,IMC_P); | ||
| 203 | CLI R6; | ||
| 204 | SSYNC; /* SSYNC required before invalidating cache. */ | ||
| 205 | .align 8; | ||
| 206 | [P0] = R7; | ||
| 207 | SSYNC; | ||
| 208 | STI R6; | ||
| 209 | |||
| 210 | /* Configures the instruction cache agian */ | ||
| 211 | R6 = (IMC | ENICPLB); | ||
| 212 | R7 = R7 | R6; | ||
| 213 | |||
| 214 | CLI R6; | ||
| 215 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
| 216 | .align 8; | ||
| 217 | [P0] = R7; | ||
| 218 | SSYNC; | ||
| 219 | STI R6; | ||
| 204 | 220 | ||
| 221 | ( R7:5) = [SP++]; | ||
| 205 | RTS; | 222 | RTS; |
| 206 | ENDPROC(_read_iloc) | 223 | ENDPROC(_invalidate_entire_icache) |
diff --git a/arch/blackfin/mach-common/pm.c b/arch/blackfin/mach-common/pm.c index 4fe6a2366b13..e28c6af1f415 100644 --- a/arch/blackfin/mach-common/pm.c +++ b/arch/blackfin/mach-common/pm.c | |||
| @@ -83,13 +83,22 @@ void bfin_pm_suspend_standby_enter(void) | |||
| 83 | bfin_pm_standby_restore(); | 83 | bfin_pm_standby_restore(); |
| 84 | 84 | ||
| 85 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 85 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
| 86 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | 86 | bfin_write_SIC_IWR0(IWR_DISABLE_ALL); |
| 87 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | 87 | #if defined(CONFIG_BF52x) |
| 88 | /* BF52x system reset does not properly reset SIC_IWR1 which | ||
| 89 | * will screw up the bootrom as it relies on MDMA0/1 waking it | ||
| 90 | * up from IDLE instructions. See this report for more info: | ||
| 91 | * http://blackfin.uclinux.org/gf/tracker/4323 | ||
| 92 | */ | ||
| 93 | bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11)); | ||
| 94 | #else | ||
| 95 | bfin_write_SIC_IWR1(IWR_DISABLE_ALL); | ||
| 96 | #endif | ||
| 88 | # ifdef CONFIG_BF54x | 97 | # ifdef CONFIG_BF54x |
| 89 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | 98 | bfin_write_SIC_IWR2(IWR_DISABLE_ALL); |
| 90 | # endif | 99 | # endif |
| 91 | #else | 100 | #else |
| 92 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | 101 | bfin_write_SIC_IWR(IWR_DISABLE_ALL); |
| 93 | #endif | 102 | #endif |
| 94 | 103 | ||
| 95 | local_irq_restore(flags); | 104 | local_irq_restore(flags); |
| @@ -229,28 +238,12 @@ int bfin_pm_suspend_mem_enter(void) | |||
| 229 | wakeup = bfin_read_VR_CTL() & ~FREQ; | 238 | wakeup = bfin_read_VR_CTL() & ~FREQ; |
| 230 | wakeup |= SCKELOW; | 239 | wakeup |= SCKELOW; |
| 231 | 240 | ||
| 232 | /* FIXME: merge this somehow with set_irq_wake */ | ||
| 233 | #ifdef CONFIG_PM_BFIN_WAKE_RTC | ||
| 234 | wakeup |= WAKE; | ||
| 235 | #endif | ||
| 236 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 | 241 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 |
| 237 | wakeup |= PHYWE; | 242 | wakeup |= PHYWE; |
| 238 | #endif | 243 | #endif |
| 239 | #ifdef CONFIG_PM_BFIN_WAKE_CAN | ||
| 240 | wakeup |= CANWE; | ||
| 241 | #endif | ||
| 242 | #ifdef CONFIG_PM_BFIN_WAKE_GP | 244 | #ifdef CONFIG_PM_BFIN_WAKE_GP |
| 243 | wakeup |= GPWE; | 245 | wakeup |= GPWE; |
| 244 | #endif | 246 | #endif |
| 245 | #ifdef CONFIG_PM_BFIN_WAKE_USB | ||
| 246 | wakeup |= USBWE; | ||
| 247 | #endif | ||
| 248 | #ifdef CONFIG_PM_BFIN_WAKE_KEYPAD | ||
| 249 | wakeup |= KPADWE; | ||
| 250 | #endif | ||
| 251 | #ifdef CONFIG_PM_BFIN_WAKE_ROTARY | ||
| 252 | wakeup |= ROTWE; | ||
| 253 | #endif | ||
| 254 | 247 | ||
| 255 | local_irq_save(flags); | 248 | local_irq_save(flags); |
| 256 | 249 | ||
| @@ -268,7 +261,7 @@ int bfin_pm_suspend_mem_enter(void) | |||
| 268 | icache_disable(); | 261 | icache_disable(); |
| 269 | bf53x_suspend_l1_mem(memptr); | 262 | bf53x_suspend_l1_mem(memptr); |
| 270 | 263 | ||
| 271 | do_hibernate(wakeup); /* Goodbye */ | 264 | do_hibernate(wakeup | vr_wakeup); /* Goodbye */ |
| 272 | 265 | ||
| 273 | bf53x_resume_l1_mem(memptr); | 266 | bf53x_resume_l1_mem(memptr); |
| 274 | 267 | ||
diff --git a/arch/blackfin/mm/blackfin_sram.c b/arch/blackfin/mm/blackfin_sram.c index 5af3c31c9365..9d2be43ac3da 100644 --- a/arch/blackfin/mm/blackfin_sram.c +++ b/arch/blackfin/mm/blackfin_sram.c | |||
| @@ -66,7 +66,7 @@ static struct sram_piece free_l1_data_B_sram_head, used_l1_data_B_sram_head; | |||
| 66 | static struct sram_piece free_l1_inst_sram_head, used_l1_inst_sram_head; | 66 | static struct sram_piece free_l1_inst_sram_head, used_l1_inst_sram_head; |
| 67 | #endif | 67 | #endif |
| 68 | 68 | ||
| 69 | #ifdef L2_LENGTH | 69 | #if L2_LENGTH != 0 |
| 70 | static struct sram_piece free_l2_sram_head, used_l2_sram_head; | 70 | static struct sram_piece free_l2_sram_head, used_l2_sram_head; |
| 71 | #endif | 71 | #endif |
| 72 | 72 | ||
| @@ -175,7 +175,7 @@ static void __init l1_inst_sram_init(void) | |||
| 175 | 175 | ||
| 176 | static void __init l2_sram_init(void) | 176 | static void __init l2_sram_init(void) |
| 177 | { | 177 | { |
| 178 | #ifdef L2_LENGTH | 178 | #if L2_LENGTH != 0 |
| 179 | free_l2_sram_head.next = | 179 | free_l2_sram_head.next = |
| 180 | kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); | 180 | kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); |
| 181 | if (!free_l2_sram_head.next) { | 181 | if (!free_l2_sram_head.next) { |
| @@ -367,7 +367,7 @@ int sram_free(const void *addr) | |||
| 367 | && addr < (void *)(L1_DATA_B_START + L1_DATA_B_LENGTH)) | 367 | && addr < (void *)(L1_DATA_B_START + L1_DATA_B_LENGTH)) |
| 368 | return l1_data_B_sram_free(addr); | 368 | return l1_data_B_sram_free(addr); |
| 369 | #endif | 369 | #endif |
| 370 | #ifdef L2_LENGTH | 370 | #if L2_LENGTH != 0 |
| 371 | else if (addr >= (void *)L2_START | 371 | else if (addr >= (void *)L2_START |
| 372 | && addr < (void *)(L2_START + L2_LENGTH)) | 372 | && addr < (void *)(L2_START + L2_LENGTH)) |
| 373 | return l2_sram_free(addr); | 373 | return l2_sram_free(addr); |
| @@ -604,7 +604,7 @@ int l1sram_free(const void *addr) | |||
| 604 | 604 | ||
| 605 | void *l2_sram_alloc(size_t size) | 605 | void *l2_sram_alloc(size_t size) |
| 606 | { | 606 | { |
| 607 | #ifdef L2_LENGTH | 607 | #if L2_LENGTH != 0 |
| 608 | unsigned flags; | 608 | unsigned flags; |
| 609 | void *addr; | 609 | void *addr; |
| 610 | 610 | ||
| @@ -640,7 +640,7 @@ EXPORT_SYMBOL(l2_sram_zalloc); | |||
| 640 | 640 | ||
| 641 | int l2_sram_free(const void *addr) | 641 | int l2_sram_free(const void *addr) |
| 642 | { | 642 | { |
| 643 | #ifdef L2_LENGTH | 643 | #if L2_LENGTH != 0 |
| 644 | unsigned flags; | 644 | unsigned flags; |
| 645 | int ret; | 645 | int ret; |
| 646 | 646 | ||
| @@ -779,7 +779,7 @@ static int sram_proc_read(char *buf, char **start, off_t offset, int count, | |||
| 779 | &free_l1_inst_sram_head, &used_l1_inst_sram_head)) | 779 | &free_l1_inst_sram_head, &used_l1_inst_sram_head)) |
| 780 | goto not_done; | 780 | goto not_done; |
| 781 | #endif | 781 | #endif |
| 782 | #ifdef L2_LENGTH | 782 | #if L2_LENGTH != 0 |
| 783 | if (_sram_proc_read(buf, &len, count, "L2", | 783 | if (_sram_proc_read(buf, &len, count, "L2", |
| 784 | &free_l2_sram_head, &used_l2_sram_head)) | 784 | &free_l2_sram_head, &used_l2_sram_head)) |
| 785 | goto not_done; | 785 | goto not_done; |
diff --git a/arch/ia64/include/asm/kexec.h b/arch/ia64/include/asm/kexec.h index 541be835fc5a..e1d58f819d78 100644 --- a/arch/ia64/include/asm/kexec.h +++ b/arch/ia64/include/asm/kexec.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | /* Maximum address we can use for the control code buffer */ | 9 | /* Maximum address we can use for the control code buffer */ |
| 10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 11 | 11 | ||
| 12 | #define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096) | 12 | #define KEXEC_CONTROL_PAGE_SIZE (8192 + 8192 + 4096) |
| 13 | 13 | ||
| 14 | /* The native architecture */ | 14 | /* The native architecture */ |
| 15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 | 15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 |
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h index acdcdc66f1b6..3736d9b33289 100644 --- a/arch/powerpc/include/asm/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 23 | #endif | 23 | #endif |
| 24 | 24 | ||
| 25 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 25 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 26 | 26 | ||
| 27 | /* The native architecture */ | 27 | /* The native architecture */ |
| 28 | #ifdef __powerpc64__ | 28 | #ifdef __powerpc64__ |
diff --git a/arch/powerpc/kernel/machine_kexec_32.c b/arch/powerpc/kernel/machine_kexec_32.c index cbaa34196797..ae63a964b858 100644 --- a/arch/powerpc/kernel/machine_kexec_32.c +++ b/arch/powerpc/kernel/machine_kexec_32.c | |||
| @@ -51,7 +51,7 @@ void default_machine_kexec(struct kimage *image) | |||
| 51 | relocate_new_kernel_size); | 51 | relocate_new_kernel_size); |
| 52 | 52 | ||
| 53 | flush_icache_range(reboot_code_buffer, | 53 | flush_icache_range(reboot_code_buffer, |
| 54 | reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 54 | reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
| 55 | printk(KERN_INFO "Bye!\n"); | 55 | printk(KERN_INFO "Bye!\n"); |
| 56 | 56 | ||
| 57 | /* now call it */ | 57 | /* now call it */ |
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index f219c6411e0b..bb729b84a21e 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) | 31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) |
| 32 | 32 | ||
| 33 | /* Allocate one page for the pdp and the second for the code */ | 33 | /* Allocate one page for the pdp and the second for the code */ |
| 34 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 34 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 35 | 35 | ||
| 36 | /* The native architecture */ | 36 | /* The native architecture */ |
| 37 | #define KEXEC_ARCH KEXEC_ARCH_S390 | 37 | #define KEXEC_ARCH KEXEC_ARCH_S390 |
diff --git a/arch/sh/include/asm/kexec.h b/arch/sh/include/asm/kexec.h index 00f4260ef09b..765a5e1660fc 100644 --- a/arch/sh/include/asm/kexec.h +++ b/arch/sh/include/asm/kexec.h | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | /* Maximum address we can use for the control code buffer */ | 21 | /* Maximum address we can use for the control code buffer */ |
| 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 23 | 23 | ||
| 24 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 24 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 25 | 25 | ||
| 26 | /* The native architecture */ | 26 | /* The native architecture */ |
| 27 | #define KEXEC_ARCH KEXEC_ARCH_SH | 27 | #define KEXEC_ARCH KEXEC_ARCH_SH |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ac2fb0641a04..68d91c8233f4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -951,9 +951,9 @@ config NUMA | |||
| 951 | local memory controller of the CPU and add some more | 951 | local memory controller of the CPU and add some more |
| 952 | NUMA awareness to the kernel. | 952 | NUMA awareness to the kernel. |
| 953 | 953 | ||
| 954 | For i386 this is currently highly experimental and should be only | 954 | For 32-bit this is currently highly experimental and should be only |
| 955 | used for kernel development. It might also cause boot failures. | 955 | used for kernel development. It might also cause boot failures. |
| 956 | For x86_64 this is recommended on all multiprocessor Opteron systems. | 956 | For 64-bit this is recommended on all multiprocessor Opteron systems. |
| 957 | If the system is EM64T, you should say N unless your system is | 957 | If the system is EM64T, you should say N unless your system is |
| 958 | EM64T NUMA. | 958 | EM64T NUMA. |
| 959 | 959 | ||
| @@ -1263,7 +1263,7 @@ config KEXEC | |||
| 1263 | strongly in flux, so no good recommendation can be made. | 1263 | strongly in flux, so no good recommendation can be made. |
| 1264 | 1264 | ||
| 1265 | config CRASH_DUMP | 1265 | config CRASH_DUMP |
| 1266 | bool "kernel crash dumps (EXPERIMENTAL)" | 1266 | bool "kernel crash dumps" |
| 1267 | depends on X86_64 || (X86_32 && HIGHMEM) | 1267 | depends on X86_64 || (X86_32 && HIGHMEM) |
| 1268 | help | 1268 | help |
| 1269 | Generate crash dump after being started by kexec. | 1269 | Generate crash dump after being started by kexec. |
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index a34b9982c7cb..616b804a2295 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/edd.h> | 24 | #include <linux/edd.h> |
| 25 | #include <asm/boot.h> | 25 | #include <asm/boot.h> |
| 26 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
| 27 | #include "bitops.h" | ||
| 28 | #include <asm/cpufeature.h> | ||
| 27 | 29 | ||
| 28 | /* Useful macros */ | 30 | /* Useful macros */ |
| 29 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 31 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
| @@ -242,6 +244,12 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize); | |||
| 242 | int cmdline_find_option_bool(const char *option); | 244 | int cmdline_find_option_bool(const char *option); |
| 243 | 245 | ||
| 244 | /* cpu.c, cpucheck.c */ | 246 | /* cpu.c, cpucheck.c */ |
| 247 | struct cpu_features { | ||
| 248 | int level; /* Family, or 64 for x86-64 */ | ||
| 249 | int model; | ||
| 250 | u32 flags[NCAPINTS]; | ||
| 251 | }; | ||
| 252 | extern struct cpu_features cpu; | ||
| 245 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); | 253 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); |
| 246 | int validate_cpu(void); | 254 | int validate_cpu(void); |
| 247 | 255 | ||
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c index 92d6fd73dc7d..75298fe2edca 100644 --- a/arch/x86/boot/cpu.c +++ b/arch/x86/boot/cpu.c | |||
| @@ -16,9 +16,6 @@ | |||
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | #include "boot.h" | 18 | #include "boot.h" |
| 19 | #include "bitops.h" | ||
| 20 | #include <asm/cpufeature.h> | ||
| 21 | |||
| 22 | #include "cpustr.h" | 19 | #include "cpustr.h" |
| 23 | 20 | ||
| 24 | static char *cpu_name(int level) | 21 | static char *cpu_name(int level) |
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c index 7804389ee005..4b9ae7c56748 100644 --- a/arch/x86/boot/cpucheck.c +++ b/arch/x86/boot/cpucheck.c | |||
| @@ -22,21 +22,13 @@ | |||
| 22 | 22 | ||
| 23 | #ifdef _SETUP | 23 | #ifdef _SETUP |
| 24 | # include "boot.h" | 24 | # include "boot.h" |
| 25 | # include "bitops.h" | ||
| 26 | #endif | 25 | #endif |
| 27 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 28 | #include <asm/cpufeature.h> | ||
| 29 | #include <asm/processor-flags.h> | 27 | #include <asm/processor-flags.h> |
| 30 | #include <asm/required-features.h> | 28 | #include <asm/required-features.h> |
| 31 | #include <asm/msr-index.h> | 29 | #include <asm/msr-index.h> |
| 32 | 30 | ||
| 33 | struct cpu_features { | 31 | struct cpu_features cpu; |
| 34 | int level; /* Family, or 64 for x86-64 */ | ||
| 35 | int model; | ||
| 36 | u32 flags[NCAPINTS]; | ||
| 37 | }; | ||
| 38 | |||
| 39 | static struct cpu_features cpu; | ||
| 40 | static u32 cpu_vendor[3]; | 32 | static u32 cpu_vendor[3]; |
| 41 | static u32 err_flags[NCAPINTS]; | 33 | static u32 err_flags[NCAPINTS]; |
| 42 | 34 | ||
diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c index 2296164b54d2..197421db1af1 100644 --- a/arch/x86/boot/main.c +++ b/arch/x86/boot/main.c | |||
| @@ -73,6 +73,11 @@ static void keyboard_set_repeat(void) | |||
| 73 | */ | 73 | */ |
| 74 | static void query_ist(void) | 74 | static void query_ist(void) |
| 75 | { | 75 | { |
| 76 | /* Some older BIOSes apparently crash on this call, so filter | ||
| 77 | it from machines too old to have SpeedStep at all. */ | ||
| 78 | if (cpu.level < 6) | ||
| 79 | return; | ||
| 80 | |||
| 76 | asm("int $0x15" | 81 | asm("int $0x15" |
| 77 | : "=a" (boot_params.ist_info.signature), | 82 | : "=a" (boot_params.ist_info.signature), |
| 78 | "=b" (boot_params.ist_info.command), | 83 | "=b" (boot_params.ist_info.command), |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index fa88a1d71290..bfd10fd211cd 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -97,6 +97,8 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | |||
| 97 | #warning ACPI uses CMPXCHG, i486 and later hardware | 97 | #warning ACPI uses CMPXCHG, i486 and later hardware |
| 98 | #endif | 98 | #endif |
| 99 | 99 | ||
| 100 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
| 101 | |||
| 100 | /* -------------------------------------------------------------------------- | 102 | /* -------------------------------------------------------------------------- |
| 101 | Boot-time Configuration | 103 | Boot-time Configuration |
| 102 | -------------------------------------------------------------------------- */ | 104 | -------------------------------------------------------------------------- */ |
| @@ -158,6 +160,14 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
| 158 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 160 | struct acpi_mcfg_allocation *pci_mmcfg_config; |
| 159 | int pci_mmcfg_config_num; | 161 | int pci_mmcfg_config_num; |
| 160 | 162 | ||
| 163 | static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) | ||
| 164 | { | ||
| 165 | if (!strcmp(mcfg->header.oem_id, "SGI")) | ||
| 166 | acpi_mcfg_64bit_base_addr = TRUE; | ||
| 167 | |||
| 168 | return 0; | ||
| 169 | } | ||
| 170 | |||
| 161 | int __init acpi_parse_mcfg(struct acpi_table_header *header) | 171 | int __init acpi_parse_mcfg(struct acpi_table_header *header) |
| 162 | { | 172 | { |
| 163 | struct acpi_table_mcfg *mcfg; | 173 | struct acpi_table_mcfg *mcfg; |
| @@ -190,8 +200,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) | |||
| 190 | } | 200 | } |
| 191 | 201 | ||
| 192 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); | 202 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); |
| 203 | |||
| 204 | acpi_mcfg_oem_check(mcfg); | ||
| 205 | |||
| 193 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 206 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
| 194 | if (pci_mmcfg_config[i].address > 0xFFFFFFFF) { | 207 | if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) && |
| 208 | !acpi_mcfg_64bit_base_addr) { | ||
| 195 | printk(KERN_ERR PREFIX | 209 | printk(KERN_ERR PREFIX |
| 196 | "MMCONFIG not in low 4GB of memory\n"); | 210 | "MMCONFIG not in low 4GB of memory\n"); |
| 197 | kfree(pci_mmcfg_config); | 211 | kfree(pci_mmcfg_config); |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index fa2161d5003b..81e5ab6542d8 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -20,7 +20,7 @@ unsigned long acpi_realmode_flags; | |||
| 20 | /* address in low memory of the wakeup routine. */ | 20 | /* address in low memory of the wakeup routine. */ |
| 21 | static unsigned long acpi_realmode; | 21 | static unsigned long acpi_realmode; |
| 22 | 22 | ||
| 23 | #ifdef CONFIG_64BIT | 23 | #if defined(CONFIG_SMP) && defined(CONFIG_64BIT) |
| 24 | static char temp_stack[10240]; | 24 | static char temp_stack[10240]; |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 22d7d050905d..de39e1f2ede5 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -101,16 +101,13 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
| 101 | */ | 101 | */ |
| 102 | static int iommu_completion_wait(struct amd_iommu *iommu) | 102 | static int iommu_completion_wait(struct amd_iommu *iommu) |
| 103 | { | 103 | { |
| 104 | int ret; | 104 | int ret, ready = 0; |
| 105 | unsigned status = 0; | ||
| 105 | struct iommu_cmd cmd; | 106 | struct iommu_cmd cmd; |
| 106 | volatile u64 ready = 0; | ||
| 107 | unsigned long ready_phys = virt_to_phys(&ready); | ||
| 108 | unsigned long i = 0; | 107 | unsigned long i = 0; |
| 109 | 108 | ||
| 110 | memset(&cmd, 0, sizeof(cmd)); | 109 | memset(&cmd, 0, sizeof(cmd)); |
| 111 | cmd.data[0] = LOW_U32(ready_phys) | CMD_COMPL_WAIT_STORE_MASK; | 110 | cmd.data[0] = CMD_COMPL_WAIT_INT_MASK; |
| 112 | cmd.data[1] = upper_32_bits(ready_phys); | ||
| 113 | cmd.data[2] = 1; /* value written to 'ready' */ | ||
| 114 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); | 111 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); |
| 115 | 112 | ||
| 116 | iommu->need_sync = 0; | 113 | iommu->need_sync = 0; |
| @@ -122,9 +119,15 @@ static int iommu_completion_wait(struct amd_iommu *iommu) | |||
| 122 | 119 | ||
| 123 | while (!ready && (i < EXIT_LOOP_COUNT)) { | 120 | while (!ready && (i < EXIT_LOOP_COUNT)) { |
| 124 | ++i; | 121 | ++i; |
| 125 | cpu_relax(); | 122 | /* wait for the bit to become one */ |
| 123 | status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
| 124 | ready = status & MMIO_STATUS_COM_WAIT_INT_MASK; | ||
| 126 | } | 125 | } |
| 127 | 126 | ||
| 127 | /* set bit back to zero */ | ||
| 128 | status &= ~MMIO_STATUS_COM_WAIT_INT_MASK; | ||
| 129 | writel(status, iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
| 130 | |||
| 128 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) | 131 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) |
| 129 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); | 132 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); |
| 130 | 133 | ||
| @@ -161,7 +164,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu, | |||
| 161 | address &= PAGE_MASK; | 164 | address &= PAGE_MASK; |
| 162 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); | 165 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); |
| 163 | cmd.data[1] |= domid; | 166 | cmd.data[1] |= domid; |
| 164 | cmd.data[2] = LOW_U32(address); | 167 | cmd.data[2] = lower_32_bits(address); |
| 165 | cmd.data[3] = upper_32_bits(address); | 168 | cmd.data[3] = upper_32_bits(address); |
| 166 | if (s) /* size bit - we flush more than one 4kb page */ | 169 | if (s) /* size bit - we flush more than one 4kb page */ |
| 167 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; | 170 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index d9a9da597e79..a69cc0f52042 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -801,6 +801,21 @@ static int __init init_memory_definitions(struct acpi_table_header *table) | |||
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | /* | 803 | /* |
| 804 | * Init the device table to not allow DMA access for devices and | ||
| 805 | * suppress all page faults | ||
| 806 | */ | ||
| 807 | static void init_device_table(void) | ||
| 808 | { | ||
| 809 | u16 devid; | ||
| 810 | |||
| 811 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { | ||
| 812 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); | ||
| 813 | set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); | ||
| 814 | set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT); | ||
| 815 | } | ||
| 816 | } | ||
| 817 | |||
| 818 | /* | ||
| 804 | * This function finally enables all IOMMUs found in the system after | 819 | * This function finally enables all IOMMUs found in the system after |
| 805 | * they have been initialized | 820 | * they have been initialized |
| 806 | */ | 821 | */ |
| @@ -931,6 +946,9 @@ int __init amd_iommu_init(void) | |||
| 931 | if (amd_iommu_pd_alloc_bitmap == NULL) | 946 | if (amd_iommu_pd_alloc_bitmap == NULL) |
| 932 | goto free; | 947 | goto free; |
| 933 | 948 | ||
| 949 | /* init the device table */ | ||
| 950 | init_device_table(); | ||
| 951 | |||
| 934 | /* | 952 | /* |
| 935 | * let all alias entries point to itself | 953 | * let all alias entries point to itself |
| 936 | */ | 954 | */ |
| @@ -954,15 +972,15 @@ int __init amd_iommu_init(void) | |||
| 954 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) | 972 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) |
| 955 | goto free; | 973 | goto free; |
| 956 | 974 | ||
| 957 | ret = amd_iommu_init_dma_ops(); | 975 | ret = sysdev_class_register(&amd_iommu_sysdev_class); |
| 958 | if (ret) | 976 | if (ret) |
| 959 | goto free; | 977 | goto free; |
| 960 | 978 | ||
| 961 | ret = sysdev_class_register(&amd_iommu_sysdev_class); | 979 | ret = sysdev_register(&device_amd_iommu); |
| 962 | if (ret) | 980 | if (ret) |
| 963 | goto free; | 981 | goto free; |
| 964 | 982 | ||
| 965 | ret = sysdev_register(&device_amd_iommu); | 983 | ret = amd_iommu_init_dma_ops(); |
| 966 | if (ret) | 984 | if (ret) |
| 967 | goto free; | 985 | goto free; |
| 968 | 986 | ||
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c index 039a8d4aaf62..f88bd0d982b0 100644 --- a/arch/x86/kernel/apic_32.c +++ b/arch/x86/kernel/apic_32.c | |||
| @@ -1454,8 +1454,6 @@ void disconnect_bsp_APIC(int virt_wire_setup) | |||
| 1454 | } | 1454 | } |
| 1455 | } | 1455 | } |
| 1456 | 1456 | ||
| 1457 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
| 1458 | |||
| 1459 | void __cpuinit generic_processor_info(int apicid, int version) | 1457 | void __cpuinit generic_processor_info(int apicid, int version) |
| 1460 | { | 1458 | { |
| 1461 | int cpu; | 1459 | int cpu; |
| @@ -1482,12 +1480,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1482 | return; | 1480 | return; |
| 1483 | } | 1481 | } |
| 1484 | 1482 | ||
| 1485 | if (num_processors >= maxcpus) { | ||
| 1486 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
| 1487 | " Processor ignored.\n", maxcpus); | ||
| 1488 | return; | ||
| 1489 | } | ||
| 1490 | |||
| 1491 | num_processors++; | 1483 | num_processors++; |
| 1492 | cpus_complement(tmp_map, cpu_present_map); | 1484 | cpus_complement(tmp_map, cpu_present_map); |
| 1493 | cpu = first_cpu(tmp_map); | 1485 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 7f1f030da7ee..446c062e831c 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
| @@ -90,7 +90,6 @@ static unsigned long apic_phys; | |||
| 90 | 90 | ||
| 91 | unsigned long mp_lapic_addr; | 91 | unsigned long mp_lapic_addr; |
| 92 | 92 | ||
| 93 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
| 94 | /* | 93 | /* |
| 95 | * Get the LAPIC version | 94 | * Get the LAPIC version |
| 96 | */ | 95 | */ |
| @@ -1062,12 +1061,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1062 | return; | 1061 | return; |
| 1063 | } | 1062 | } |
| 1064 | 1063 | ||
| 1065 | if (num_processors >= maxcpus) { | ||
| 1066 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
| 1067 | " Processor ignored.\n", maxcpus); | ||
| 1068 | return; | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | num_processors++; | 1064 | num_processors++; |
| 1072 | cpus_complement(tmp_map, cpu_present_map); | 1065 | cpus_complement(tmp_map, cpu_present_map); |
| 1073 | cpu = first_cpu(tmp_map); | 1066 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index de7439f82b92..05cc22dbd4ff 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -478,7 +478,13 @@ static int setup_p4_watchdog(unsigned nmi_hz) | |||
| 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; | 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; |
| 479 | evntsel_msr = MSR_P4_CRU_ESCR0; | 479 | evntsel_msr = MSR_P4_CRU_ESCR0; |
| 480 | cccr_msr = MSR_P4_IQ_CCCR1; | 480 | cccr_msr = MSR_P4_IQ_CCCR1; |
| 481 | cccr_val = P4_CCCR_OVF_PMI1 | P4_CCCR_ESCR_SELECT(4); | 481 | |
| 482 | /* Pentium 4 D processors don't support P4_CCCR_OVF_PMI1 */ | ||
| 483 | if (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask == 4) | ||
| 484 | cccr_val = P4_CCCR_OVF_PMI0; | ||
| 485 | else | ||
| 486 | cccr_val = P4_CCCR_OVF_PMI1; | ||
| 487 | cccr_val |= P4_CCCR_ESCR_SELECT(4); | ||
| 482 | } | 488 | } |
| 483 | 489 | ||
| 484 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) | 490 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 2cfcbded888a..2d7e307c7779 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
| @@ -222,7 +222,7 @@ static __init void map_low_mmrs(void) | |||
| 222 | 222 | ||
| 223 | enum map_type {map_wb, map_uc}; | 223 | enum map_type {map_wb, map_uc}; |
| 224 | 224 | ||
| 225 | static void map_high(char *id, unsigned long base, int shift, enum map_type map_type) | 225 | static __init void map_high(char *id, unsigned long base, int shift, enum map_type map_type) |
| 226 | { | 226 | { |
| 227 | unsigned long bytes, paddr; | 227 | unsigned long bytes, paddr; |
| 228 | 228 | ||
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 1b318e903bf6..9bfc4d72fb2e 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
| @@ -88,6 +88,7 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
| 88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); | 88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); |
| 89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == | 89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == |
| 90 | (__START_KERNEL & PGDIR_MASK))); | 90 | (__START_KERNEL & PGDIR_MASK))); |
| 91 | BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END); | ||
| 91 | 92 | ||
| 92 | /* clear bss before set_intr_gate with early_idt_handler */ | 93 | /* clear bss before set_intr_gate with early_idt_handler */ |
| 93 | clear_bss(); | 94 | clear_bss(); |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index ad2b15a1334d..59fd3b6b1303 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -359,6 +359,7 @@ static int hpet_clocksource_register(void) | |||
| 359 | int __init hpet_enable(void) | 359 | int __init hpet_enable(void) |
| 360 | { | 360 | { |
| 361 | unsigned long id; | 361 | unsigned long id; |
| 362 | int i; | ||
| 362 | 363 | ||
| 363 | if (!is_hpet_capable()) | 364 | if (!is_hpet_capable()) |
| 364 | return 0; | 365 | return 0; |
| @@ -369,6 +370,29 @@ int __init hpet_enable(void) | |||
| 369 | * Read the period and check for a sane value: | 370 | * Read the period and check for a sane value: |
| 370 | */ | 371 | */ |
| 371 | hpet_period = hpet_readl(HPET_PERIOD); | 372 | hpet_period = hpet_readl(HPET_PERIOD); |
| 373 | |||
| 374 | /* | ||
| 375 | * AMD SB700 based systems with spread spectrum enabled use a | ||
| 376 | * SMM based HPET emulation to provide proper frequency | ||
| 377 | * setting. The SMM code is initialized with the first HPET | ||
| 378 | * register access and takes some time to complete. During | ||
| 379 | * this time the config register reads 0xffffffff. We check | ||
| 380 | * for max. 1000 loops whether the config register reads a non | ||
| 381 | * 0xffffffff value to make sure that HPET is up and running | ||
| 382 | * before we go further. A counting loop is safe, as the HPET | ||
| 383 | * access takes thousands of CPU cycles. On non SB700 based | ||
| 384 | * machines this check is only done once and has no side | ||
| 385 | * effects. | ||
| 386 | */ | ||
| 387 | for (i = 0; hpet_readl(HPET_CFG) == 0xFFFFFFFF; i++) { | ||
| 388 | if (i == 1000) { | ||
| 389 | printk(KERN_WARNING | ||
| 390 | "HPET config register value = 0xFFFFFFFF. " | ||
| 391 | "Disabling HPET\n"); | ||
| 392 | goto out_nohpet; | ||
| 393 | } | ||
| 394 | } | ||
| 395 | |||
| 372 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) | 396 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) |
| 373 | goto out_nohpet; | 397 | goto out_nohpet; |
| 374 | 398 | ||
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 9fe478d98406..0732adba05ca 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/numa.h> | 13 | #include <linux/numa.h> |
| 14 | #include <linux/ftrace.h> | 14 | #include <linux/ftrace.h> |
| 15 | #include <linux/suspend.h> | ||
| 15 | 16 | ||
| 16 | #include <asm/pgtable.h> | 17 | #include <asm/pgtable.h> |
| 17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
| @@ -78,7 +79,7 @@ static void load_segments(void) | |||
| 78 | /* | 79 | /* |
| 79 | * A architecture hook called to validate the | 80 | * A architecture hook called to validate the |
| 80 | * proposed image and prepare the control pages | 81 | * proposed image and prepare the control pages |
| 81 | * as needed. The pages for KEXEC_CONTROL_CODE_SIZE | 82 | * as needed. The pages for KEXEC_CONTROL_PAGE_SIZE |
| 82 | * have been allocated, but the segments have yet | 83 | * have been allocated, but the segments have yet |
| 83 | * been copied into the kernel. | 84 | * been copied into the kernel. |
| 84 | * | 85 | * |
| @@ -113,6 +114,7 @@ void machine_kexec(struct kimage *image) | |||
| 113 | { | 114 | { |
| 114 | unsigned long page_list[PAGES_NR]; | 115 | unsigned long page_list[PAGES_NR]; |
| 115 | void *control_page; | 116 | void *control_page; |
| 117 | int save_ftrace_enabled; | ||
| 116 | asmlinkage unsigned long | 118 | asmlinkage unsigned long |
| 117 | (*relocate_kernel_ptr)(unsigned long indirection_page, | 119 | (*relocate_kernel_ptr)(unsigned long indirection_page, |
| 118 | unsigned long control_page, | 120 | unsigned long control_page, |
| @@ -120,7 +122,12 @@ void machine_kexec(struct kimage *image) | |||
| 120 | unsigned int has_pae, | 122 | unsigned int has_pae, |
| 121 | unsigned int preserve_context); | 123 | unsigned int preserve_context); |
| 122 | 124 | ||
| 123 | tracer_disable(); | 125 | #ifdef CONFIG_KEXEC_JUMP |
| 126 | if (kexec_image->preserve_context) | ||
| 127 | save_processor_state(); | ||
| 128 | #endif | ||
| 129 | |||
| 130 | save_ftrace_enabled = __ftrace_enabled_save(); | ||
| 124 | 131 | ||
| 125 | /* Interrupts aren't acceptable while we reboot */ | 132 | /* Interrupts aren't acceptable while we reboot */ |
| 126 | local_irq_disable(); | 133 | local_irq_disable(); |
| @@ -138,7 +145,7 @@ void machine_kexec(struct kimage *image) | |||
| 138 | } | 145 | } |
| 139 | 146 | ||
| 140 | control_page = page_address(image->control_code_page); | 147 | control_page = page_address(image->control_code_page); |
| 141 | memcpy(control_page, relocate_kernel, PAGE_SIZE/2); | 148 | memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE); |
| 142 | 149 | ||
| 143 | relocate_kernel_ptr = control_page; | 150 | relocate_kernel_ptr = control_page; |
| 144 | page_list[PA_CONTROL_PAGE] = __pa(control_page); | 151 | page_list[PA_CONTROL_PAGE] = __pa(control_page); |
| @@ -178,6 +185,13 @@ void machine_kexec(struct kimage *image) | |||
| 178 | (unsigned long)page_list, | 185 | (unsigned long)page_list, |
| 179 | image->start, cpu_has_pae, | 186 | image->start, cpu_has_pae, |
| 180 | image->preserve_context); | 187 | image->preserve_context); |
| 188 | |||
| 189 | #ifdef CONFIG_KEXEC_JUMP | ||
| 190 | if (kexec_image->preserve_context) | ||
| 191 | restore_processor_state(); | ||
| 192 | #endif | ||
| 193 | |||
| 194 | __ftrace_enabled_restore(save_ftrace_enabled); | ||
| 181 | } | 195 | } |
| 182 | 196 | ||
| 183 | void arch_crash_save_vmcoreinfo(void) | 197 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c index 07c0f828f488..3b599518c322 100644 --- a/arch/x86/kernel/mfgpt_32.c +++ b/arch/x86/kernel/mfgpt_32.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
| 34 | #include <asm/geode.h> | 34 | #include <asm/geode.h> |
| 35 | 35 | ||
| 36 | #define MFGPT_DEFAULT_IRQ 7 | ||
| 37 | |||
| 36 | static struct mfgpt_timer_t { | 38 | static struct mfgpt_timer_t { |
| 37 | unsigned int avail:1; | 39 | unsigned int avail:1; |
| 38 | } mfgpt_timers[MFGPT_MAX_TIMERS]; | 40 | } mfgpt_timers[MFGPT_MAX_TIMERS]; |
| @@ -157,29 +159,48 @@ int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable) | |||
| 157 | } | 159 | } |
| 158 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); | 160 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); |
| 159 | 161 | ||
| 160 | int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable) | 162 | int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable) |
| 161 | { | 163 | { |
| 162 | u32 val, dummy; | 164 | u32 zsel, lpc, dummy; |
| 163 | int offset; | 165 | int shift; |
| 164 | 166 | ||
| 165 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) | 167 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) |
| 166 | return -EIO; | 168 | return -EIO; |
| 167 | 169 | ||
| 168 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | 170 | /* |
| 171 | * Unfortunately, MFGPTs come in pairs sharing their IRQ lines. If VSA | ||
| 172 | * is using the same CMP of the timer's Siamese twin, the IRQ is set to | ||
| 173 | * 2, and we mustn't use nor change it. | ||
| 174 | * XXX: Likewise, 2 Linux drivers might clash if the 2nd overwrites the | ||
| 175 | * IRQ of the 1st. This can only happen if forcing an IRQ, calling this | ||
| 176 | * with *irq==0 is safe. Currently there _are_ no 2 drivers. | ||
| 177 | */ | ||
| 178 | rdmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); | ||
| 179 | shift = ((cmp == MFGPT_CMP1 ? 0 : 4) + timer % 4) * 4; | ||
| 180 | if (((zsel >> shift) & 0xF) == 2) | ||
| 169 | return -EIO; | 181 | return -EIO; |
| 170 | 182 | ||
| 171 | rdmsr(MSR_PIC_ZSEL_LOW, val, dummy); | 183 | /* Choose IRQ: if none supplied, keep IRQ already set or use default */ |
| 184 | if (!*irq) | ||
| 185 | *irq = (zsel >> shift) & 0xF; | ||
| 186 | if (!*irq) | ||
| 187 | *irq = MFGPT_DEFAULT_IRQ; | ||
| 172 | 188 | ||
| 173 | offset = (timer % 4) * 4; | 189 | /* Can't use IRQ if it's 0 (=disabled), 2, or routed to LPC */ |
| 174 | 190 | if (*irq < 1 || *irq == 2 || *irq > 15) | |
| 175 | val &= ~((0xF << offset) | (0xF << (offset + 16))); | 191 | return -EIO; |
| 192 | rdmsr(MSR_PIC_IRQM_LPC, lpc, dummy); | ||
| 193 | if (lpc & (1 << *irq)) | ||
| 194 | return -EIO; | ||
| 176 | 195 | ||
| 196 | /* All chosen and checked - go for it */ | ||
| 197 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | ||
| 198 | return -EIO; | ||
| 177 | if (enable) { | 199 | if (enable) { |
| 178 | val |= (irq & 0x0F) << (offset); | 200 | zsel = (zsel & ~(0xF << shift)) | (*irq << shift); |
| 179 | val |= (irq & 0x0F) << (offset + 16); | 201 | wrmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); |
| 180 | } | 202 | } |
| 181 | 203 | ||
| 182 | wrmsr(MSR_PIC_ZSEL_LOW, val, dummy); | ||
| 183 | return 0; | 204 | return 0; |
| 184 | } | 205 | } |
| 185 | 206 | ||
| @@ -242,7 +263,7 @@ EXPORT_SYMBOL_GPL(geode_mfgpt_alloc_timer); | |||
| 242 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; | 263 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; |
| 243 | static u16 mfgpt_event_clock; | 264 | static u16 mfgpt_event_clock; |
| 244 | 265 | ||
| 245 | static int irq = 7; | 266 | static int irq; |
| 246 | static int __init mfgpt_setup(char *str) | 267 | static int __init mfgpt_setup(char *str) |
| 247 | { | 268 | { |
| 248 | get_option(&str, &irq); | 269 | get_option(&str, &irq); |
| @@ -346,7 +367,7 @@ int __init mfgpt_timer_setup(void) | |||
| 346 | mfgpt_event_clock = timer; | 367 | mfgpt_event_clock = timer; |
| 347 | 368 | ||
| 348 | /* Set up the IRQ on the MFGPT side */ | 369 | /* Set up the IRQ on the MFGPT side */ |
| 349 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) { | 370 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, &irq)) { |
| 350 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); | 371 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); |
| 351 | return -EIO; | 372 | return -EIO; |
| 352 | } | 373 | } |
| @@ -374,13 +395,14 @@ int __init mfgpt_timer_setup(void) | |||
| 374 | &mfgpt_clockevent); | 395 | &mfgpt_clockevent); |
| 375 | 396 | ||
| 376 | printk(KERN_INFO | 397 | printk(KERN_INFO |
| 377 | "mfgpt-timer: registering the MFGPT timer as a clock event.\n"); | 398 | "mfgpt-timer: Registering MFGPT timer %d as a clock event, using IRQ %d\n", |
| 399 | timer, irq); | ||
| 378 | clockevents_register_device(&mfgpt_clockevent); | 400 | clockevents_register_device(&mfgpt_clockevent); |
| 379 | 401 | ||
| 380 | return 0; | 402 | return 0; |
| 381 | 403 | ||
| 382 | err: | 404 | err: |
| 383 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, irq); | 405 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, &irq); |
| 384 | printk(KERN_ERR | 406 | printk(KERN_ERR |
| 385 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); | 407 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); |
| 386 | return -EIO; | 408 | return -EIO; |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 9fd809552447..e43938086885 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
| @@ -131,7 +131,7 @@ static int msr_open(struct inode *inode, struct file *file) | |||
| 131 | ret = -EIO; /* MSR not supported */ | 131 | ret = -EIO; /* MSR not supported */ |
| 132 | out: | 132 | out: |
| 133 | unlock_kernel(); | 133 | unlock_kernel(); |
| 134 | return 0; | 134 | return ret; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | /* | 137 | /* |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ac6d51222e7d..abb78a2cc4ad 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data) | |||
| 114 | } | 114 | } |
| 115 | #endif | 115 | #endif |
| 116 | 116 | ||
| 117 | static void report_broken_nmi(int cpu, int *prev_nmi_count) | ||
| 118 | { | ||
| 119 | printk(KERN_CONT "\n"); | ||
| 120 | |||
| 121 | printk(KERN_WARNING | ||
| 122 | "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n", | ||
| 123 | cpu, prev_nmi_count[cpu], get_nmi_count(cpu)); | ||
| 124 | |||
| 125 | printk(KERN_WARNING | ||
| 126 | "Please report this to bugzilla.kernel.org,\n"); | ||
| 127 | printk(KERN_WARNING | ||
| 128 | "and attach the output of the 'dmesg' command.\n"); | ||
| 129 | |||
| 130 | per_cpu(wd_enabled, cpu) = 0; | ||
| 131 | atomic_dec(&nmi_active); | ||
| 132 | } | ||
| 133 | |||
| 117 | int __init check_nmi_watchdog(void) | 134 | int __init check_nmi_watchdog(void) |
| 118 | { | 135 | { |
| 119 | unsigned int *prev_nmi_count; | 136 | unsigned int *prev_nmi_count; |
| @@ -141,15 +158,8 @@ int __init check_nmi_watchdog(void) | |||
| 141 | for_each_online_cpu(cpu) { | 158 | for_each_online_cpu(cpu) { |
| 142 | if (!per_cpu(wd_enabled, cpu)) | 159 | if (!per_cpu(wd_enabled, cpu)) |
| 143 | continue; | 160 | continue; |
| 144 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) { | 161 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) |
| 145 | printk(KERN_WARNING "WARNING: CPU#%d: NMI " | 162 | report_broken_nmi(cpu, prev_nmi_count); |
| 146 | "appears to be stuck (%d->%d)!\n", | ||
| 147 | cpu, | ||
| 148 | prev_nmi_count[cpu], | ||
| 149 | get_nmi_count(cpu)); | ||
| 150 | per_cpu(wd_enabled, cpu) = 0; | ||
| 151 | atomic_dec(&nmi_active); | ||
| 152 | } | ||
| 153 | } | 163 | } |
| 154 | endflag = 1; | 164 | endflag = 1; |
| 155 | if (!atomic_read(&nmi_active)) { | 165 | if (!atomic_read(&nmi_active)) { |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 53bc653ed5ca..3b7a1ddcc0bc 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -95,7 +95,6 @@ static inline void play_dead(void) | |||
| 95 | { | 95 | { |
| 96 | /* This must be done before dead CPU ack */ | 96 | /* This must be done before dead CPU ack */ |
| 97 | cpu_exit_clear(); | 97 | cpu_exit_clear(); |
| 98 | wbinvd(); | ||
| 99 | mb(); | 98 | mb(); |
| 100 | /* Ack it */ | 99 | /* Ack it */ |
| 101 | __get_cpu_var(cpu_state) = CPU_DEAD; | 100 | __get_cpu_var(cpu_state) = CPU_DEAD; |
| @@ -104,8 +103,8 @@ static inline void play_dead(void) | |||
| 104 | * With physical CPU hotplug, we should halt the cpu | 103 | * With physical CPU hotplug, we should halt the cpu |
| 105 | */ | 104 | */ |
| 106 | local_irq_disable(); | 105 | local_irq_disable(); |
| 107 | while (1) | 106 | /* mask all interrupts, flush any and all caches, and halt */ |
| 108 | halt(); | 107 | wbinvd_halt(); |
| 109 | } | 108 | } |
| 110 | #else | 109 | #else |
| 111 | static inline void play_dead(void) | 110 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 3fb62a7d9a16..71553b664e2a 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -93,14 +93,13 @@ DECLARE_PER_CPU(int, cpu_state); | |||
| 93 | static inline void play_dead(void) | 93 | static inline void play_dead(void) |
| 94 | { | 94 | { |
| 95 | idle_task_exit(); | 95 | idle_task_exit(); |
| 96 | wbinvd(); | ||
| 97 | mb(); | 96 | mb(); |
| 98 | /* Ack it */ | 97 | /* Ack it */ |
| 99 | __get_cpu_var(cpu_state) = CPU_DEAD; | 98 | __get_cpu_var(cpu_state) = CPU_DEAD; |
| 100 | 99 | ||
| 101 | local_irq_disable(); | 100 | local_irq_disable(); |
| 102 | while (1) | 101 | /* mask all interrupts, flush any and all caches, and halt */ |
| 103 | halt(); | 102 | wbinvd_halt(); |
| 104 | } | 103 | } |
| 105 | #else | 104 | #else |
| 106 | static inline void play_dead(void) | 105 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S index 703310a99023..6f50664b2ba5 100644 --- a/arch/x86/kernel/relocate_kernel_32.S +++ b/arch/x86/kernel/relocate_kernel_32.S | |||
| @@ -20,10 +20,11 @@ | |||
| 20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | 20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) |
| 21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) | 21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) |
| 22 | 22 | ||
| 23 | /* control_page + PAGE_SIZE/2 ~ control_page + PAGE_SIZE * 3/4 are | 23 | /* control_page + KEXEC_CONTROL_CODE_MAX_SIZE |
| 24 | * used to save some data for jumping back | 24 | * ~ control_page + PAGE_SIZE are used as data storage and stack for |
| 25 | * jumping back | ||
| 25 | */ | 26 | */ |
| 26 | #define DATA(offset) (PAGE_SIZE/2+(offset)) | 27 | #define DATA(offset) (KEXEC_CONTROL_CODE_MAX_SIZE+(offset)) |
| 27 | 28 | ||
| 28 | /* Minimal CPU state */ | 29 | /* Minimal CPU state */ |
| 29 | #define ESP DATA(0x0) | 30 | #define ESP DATA(0x0) |
| @@ -376,3 +377,6 @@ swap_pages: | |||
| 376 | popl %ebx | 377 | popl %ebx |
| 377 | popl %ebp | 378 | popl %ebp |
| 378 | ret | 379 | ret |
| 380 | |||
| 381 | .globl kexec_control_code_size | ||
| 382 | .set kexec_control_code_size, . - relocate_kernel | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 68b48e3fbcbd..a4656adab53b 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -445,7 +445,7 @@ static void __init reserve_early_setup_data(void) | |||
| 445 | * @size: Size of the crashkernel memory to reserve. | 445 | * @size: Size of the crashkernel memory to reserve. |
| 446 | * Returns the base address on success, and -1ULL on failure. | 446 | * Returns the base address on success, and -1ULL on failure. |
| 447 | */ | 447 | */ |
| 448 | unsigned long long find_and_reserve_crashkernel(unsigned long long size) | 448 | unsigned long long __init find_and_reserve_crashkernel(unsigned long long size) |
| 449 | { | 449 | { |
| 450 | const unsigned long long alignment = 16<<20; /* 16M */ | 450 | const unsigned long long alignment = 16<<20; /* 16M */ |
| 451 | unsigned long long start = 0LL; | 451 | unsigned long long start = 0LL; |
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index b45ef8ddd651..ca316b5b742c 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
| @@ -104,7 +104,16 @@ static inline int restore_i387(struct _fpstate __user *buf) | |||
| 104 | clts(); | 104 | clts(); |
| 105 | task_thread_info(current)->status |= TS_USEDFPU; | 105 | task_thread_info(current)->status |= TS_USEDFPU; |
| 106 | } | 106 | } |
| 107 | return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); | 107 | err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf); |
| 108 | if (unlikely(err)) { | ||
| 109 | /* | ||
| 110 | * Encountered an error while doing the restore from the | ||
| 111 | * user buffer, clear the fpu state. | ||
| 112 | */ | ||
| 113 | clear_fpu(tsk); | ||
| 114 | clear_used_math(); | ||
| 115 | } | ||
| 116 | return err; | ||
| 108 | } | 117 | } |
| 109 | 118 | ||
| 110 | /* | 119 | /* |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 91055d7fc1b0..a8fb8a980fae 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -994,17 +994,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
| 994 | flush_tlb_all(); | 994 | flush_tlb_all(); |
| 995 | low_mappings = 1; | 995 | low_mappings = 1; |
| 996 | 996 | ||
| 997 | #ifdef CONFIG_X86_PC | ||
| 998 | if (def_to_bigsmp && apicid > 8) { | ||
| 999 | printk(KERN_WARNING | ||
| 1000 | "More than 8 CPUs detected - skipping them.\n" | ||
| 1001 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
| 1002 | err = -1; | ||
| 1003 | } else | ||
| 1004 | err = do_boot_cpu(apicid, cpu); | ||
| 1005 | #else | ||
| 1006 | err = do_boot_cpu(apicid, cpu); | 997 | err = do_boot_cpu(apicid, cpu); |
| 1007 | #endif | ||
| 1008 | 998 | ||
| 1009 | zap_low_mappings(); | 999 | zap_low_mappings(); |
| 1010 | low_mappings = 0; | 1000 | low_mappings = 0; |
| @@ -1058,6 +1048,34 @@ static __init void disable_smp(void) | |||
| 1058 | static int __init smp_sanity_check(unsigned max_cpus) | 1048 | static int __init smp_sanity_check(unsigned max_cpus) |
| 1059 | { | 1049 | { |
| 1060 | preempt_disable(); | 1050 | preempt_disable(); |
| 1051 | |||
| 1052 | #if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) | ||
| 1053 | if (def_to_bigsmp && nr_cpu_ids > 8) { | ||
| 1054 | unsigned int cpu; | ||
| 1055 | unsigned nr; | ||
| 1056 | |||
| 1057 | printk(KERN_WARNING | ||
| 1058 | "More than 8 CPUs detected - skipping them.\n" | ||
| 1059 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
| 1060 | |||
| 1061 | nr = 0; | ||
| 1062 | for_each_present_cpu(cpu) { | ||
| 1063 | if (nr >= 8) | ||
| 1064 | cpu_clear(cpu, cpu_present_map); | ||
| 1065 | nr++; | ||
| 1066 | } | ||
| 1067 | |||
| 1068 | nr = 0; | ||
| 1069 | for_each_possible_cpu(cpu) { | ||
| 1070 | if (nr >= 8) | ||
| 1071 | cpu_clear(cpu, cpu_possible_map); | ||
| 1072 | nr++; | ||
| 1073 | } | ||
| 1074 | |||
| 1075 | nr_cpu_ids = 8; | ||
| 1076 | } | ||
| 1077 | #endif | ||
| 1078 | |||
| 1061 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { | 1079 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { |
| 1062 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" | 1080 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" |
| 1063 | "by the BIOS.\n", hard_smp_processor_id()); | 1081 | "by the BIOS.\n", hard_smp_processor_id()); |
| @@ -1386,17 +1404,3 @@ void __cpu_die(unsigned int cpu) | |||
| 1386 | BUG(); | 1404 | BUG(); |
| 1387 | } | 1405 | } |
| 1388 | #endif | 1406 | #endif |
| 1389 | |||
| 1390 | /* | ||
| 1391 | * If the BIOS enumerates physical processors before logical, | ||
| 1392 | * maxcpus=N at enumeration-time can be used to disable HT. | ||
| 1393 | */ | ||
| 1394 | static int __init parse_maxcpus(char *arg) | ||
| 1395 | { | ||
| 1396 | extern unsigned int maxcpus; | ||
| 1397 | |||
| 1398 | if (arg) | ||
| 1399 | maxcpus = simple_strtoul(arg, NULL, 0); | ||
| 1400 | return 0; | ||
| 1401 | } | ||
| 1402 | early_param("maxcpus", parse_maxcpus); | ||
diff --git a/arch/x86/kernel/smpcommon.c b/arch/x86/kernel/smpcommon.c index 99941b37eca0..397e309839dd 100644 --- a/arch/x86/kernel/smpcommon.c +++ b/arch/x86/kernel/smpcommon.c | |||
| @@ -8,18 +8,21 @@ | |||
| 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); | 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); |
| 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); | 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); |
| 10 | 10 | ||
| 11 | /* Initialize the CPU's GDT. This is either the boot CPU doing itself | 11 | /* |
| 12 | (still using the master per-cpu area), or a CPU doing it for a | 12 | * Initialize the CPU's GDT. This is either the boot CPU doing itself |
| 13 | secondary which will soon come up. */ | 13 | * (still using the master per-cpu area), or a CPU doing it for a |
| 14 | * secondary which will soon come up. | ||
| 15 | */ | ||
| 14 | __cpuinit void init_gdt(int cpu) | 16 | __cpuinit void init_gdt(int cpu) |
| 15 | { | 17 | { |
| 16 | struct desc_struct *gdt = get_cpu_gdt_table(cpu); | 18 | struct desc_struct gdt; |
| 17 | 19 | ||
| 18 | pack_descriptor(&gdt[GDT_ENTRY_PERCPU], | 20 | pack_descriptor(&gdt, __per_cpu_offset[cpu], 0xFFFFF, |
| 19 | __per_cpu_offset[cpu], 0xFFFFF, | ||
| 20 | 0x2 | DESCTYPE_S, 0x8); | 21 | 0x2 | DESCTYPE_S, 0x8); |
| 22 | gdt.s = 1; | ||
| 21 | 23 | ||
| 22 | gdt[GDT_ENTRY_PERCPU].s = 1; | 24 | write_gdt_entry(get_cpu_gdt_table(cpu), |
| 25 | GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); | ||
| 23 | 26 | ||
| 24 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | 27 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; |
| 25 | per_cpu(cpu_number, cpu) = cpu; | 28 | per_cpu(cpu_number, cpu) = cpu; |
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 3f18d73f420c..513caaca7115 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
| @@ -1131,7 +1131,14 @@ asmlinkage void math_state_restore(void) | |||
| 1131 | } | 1131 | } |
| 1132 | 1132 | ||
| 1133 | clts(); /* Allow maths ops (or we recurse) */ | 1133 | clts(); /* Allow maths ops (or we recurse) */ |
| 1134 | restore_fpu_checking(&me->thread.xstate->fxsave); | 1134 | /* |
| 1135 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 1136 | */ | ||
| 1137 | if (unlikely(restore_fpu_checking(&me->thread.xstate->fxsave))) { | ||
| 1138 | stts(); | ||
| 1139 | force_sig(SIGSEGV, me); | ||
| 1140 | return; | ||
| 1141 | } | ||
| 1135 | task_thread_info(me)->status |= TS_USEDFPU; | 1142 | task_thread_info(me)->status |= TS_USEDFPU; |
| 1136 | me->fpu_counter++; | 1143 | me->fpu_counter++; |
| 1137 | } | 1144 | } |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 41e01b145c48..594ef47f0a63 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
| @@ -184,8 +184,6 @@ static int __init visws_get_smp_config(unsigned int early) | |||
| 184 | return 1; | 184 | return 1; |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | extern unsigned int __cpuinitdata maxcpus; | ||
| 188 | |||
| 189 | /* | 187 | /* |
| 190 | * The Visual Workstation is Intel MP compliant in the hardware | 188 | * The Visual Workstation is Intel MP compliant in the hardware |
| 191 | * sense, but it doesn't have a BIOS(-configuration table). | 189 | * sense, but it doesn't have a BIOS(-configuration table). |
| @@ -244,8 +242,8 @@ static int __init visws_find_smp_config(unsigned int reserve) | |||
| 244 | ncpus = CO_CPU_MAX; | 242 | ncpus = CO_CPU_MAX; |
| 245 | } | 243 | } |
| 246 | 244 | ||
| 247 | if (ncpus > maxcpus) | 245 | if (ncpus > setup_max_cpus) |
| 248 | ncpus = maxcpus; | 246 | ncpus = setup_max_cpus; |
| 249 | 247 | ||
| 250 | #ifdef CONFIG_X86_LOCAL_APIC | 248 | #ifdef CONFIG_X86_LOCAL_APIC |
| 251 | smp_found_config = 1; | 249 | smp_found_config = 1; |
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index cdb2363697d2..af5bdad84604 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S | |||
| @@ -209,3 +209,11 @@ SECTIONS | |||
| 209 | 209 | ||
| 210 | DWARF_DEBUG | 210 | DWARF_DEBUG |
| 211 | } | 211 | } |
| 212 | |||
| 213 | #ifdef CONFIG_KEXEC | ||
| 214 | /* Link time checks */ | ||
| 215 | #include <asm/kexec.h> | ||
| 216 | |||
| 217 | ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE, | ||
| 218 | "kexec control code size is too big") | ||
| 219 | #endif | ||
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 129618ca0ea2..a87ea0e4b3dc 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -60,7 +60,7 @@ static unsigned long dma_reserve __initdata; | |||
| 60 | 60 | ||
| 61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 62 | 62 | ||
| 63 | int direct_gbpages __meminitdata | 63 | int direct_gbpages |
| 64 | #ifdef CONFIG_DIRECT_GBPAGES | 64 | #ifdef CONFIG_DIRECT_GBPAGES |
| 65 | = 1 | 65 | = 1 |
| 66 | #endif | 66 | #endif |
| @@ -88,7 +88,11 @@ early_param("gbpages", parse_direct_gbpages_on); | |||
| 88 | 88 | ||
| 89 | int after_bootmem; | 89 | int after_bootmem; |
| 90 | 90 | ||
| 91 | static __init void *spp_getpage(void) | 91 | /* |
| 92 | * NOTE: This function is marked __ref because it calls __init function | ||
| 93 | * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0. | ||
| 94 | */ | ||
| 95 | static __ref void *spp_getpage(void) | ||
| 92 | { | 96 | { |
| 93 | void *ptr; | 97 | void *ptr; |
| 94 | 98 | ||
| @@ -314,6 +318,7 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 314 | { | 318 | { |
| 315 | unsigned long pages = 0; | 319 | unsigned long pages = 0; |
| 316 | unsigned long last_map_addr = end; | 320 | unsigned long last_map_addr = end; |
| 321 | unsigned long start = address; | ||
| 317 | 322 | ||
| 318 | int i = pmd_index(address); | 323 | int i = pmd_index(address); |
| 319 | 324 | ||
| @@ -334,6 +339,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 334 | if (!pmd_large(*pmd)) | 339 | if (!pmd_large(*pmd)) |
| 335 | last_map_addr = phys_pte_update(pmd, address, | 340 | last_map_addr = phys_pte_update(pmd, address, |
| 336 | end); | 341 | end); |
| 342 | /* Count entries we're using from level2_ident_pgt */ | ||
| 343 | if (start == 0) | ||
| 344 | pages++; | ||
| 337 | continue; | 345 | continue; |
| 338 | } | 346 | } |
| 339 | 347 | ||
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 016f335bbeea..6ba6f889c79d 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -170,7 +170,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 170 | phys_addr &= PAGE_MASK; | 170 | phys_addr &= PAGE_MASK; |
| 171 | size = PAGE_ALIGN(last_addr+1) - phys_addr; | 171 | size = PAGE_ALIGN(last_addr+1) - phys_addr; |
| 172 | 172 | ||
| 173 | retval = reserve_memtype(phys_addr, phys_addr + size, | 173 | retval = reserve_memtype(phys_addr, (u64)phys_addr + size, |
| 174 | prot_val, &new_prot_val); | 174 | prot_val, &new_prot_val); |
| 175 | if (retval) { | 175 | if (retval) { |
| 176 | pr_debug("Warning: reserve_memtype returned %d\n", retval); | 176 | pr_debug("Warning: reserve_memtype returned %d\n", retval); |
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index 0dcd42eb94e6..d4aa503caaa2 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
| @@ -221,8 +221,7 @@ static int pageattr_test(void) | |||
| 221 | failed += print_split(&sc); | 221 | failed += print_split(&sc); |
| 222 | 222 | ||
| 223 | if (failed) { | 223 | if (failed) { |
| 224 | printk(KERN_ERR "NOT PASSED. Please report.\n"); | 224 | WARN(1, KERN_ERR "NOT PASSED. Please report.\n"); |
| 225 | WARN_ON(1); | ||
| 226 | return -EINVAL; | 225 | return -EINVAL; |
| 227 | } else { | 226 | } else { |
| 228 | if (print) | 227 | if (print) |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 65c6e46bf059..f5f5154ea11e 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -55,13 +55,19 @@ static void split_page_count(int level) | |||
| 55 | 55 | ||
| 56 | int arch_report_meminfo(char *page) | 56 | int arch_report_meminfo(char *page) |
| 57 | { | 57 | { |
| 58 | int n = sprintf(page, "DirectMap4k: %8lu\n" | 58 | int n = sprintf(page, "DirectMap4k: %8lu kB\n", |
| 59 | "DirectMap2M: %8lu\n", | 59 | direct_pages_count[PG_LEVEL_4K] << 2); |
| 60 | direct_pages_count[PG_LEVEL_4K], | 60 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
| 61 | direct_pages_count[PG_LEVEL_2M]); | 61 | n += sprintf(page + n, "DirectMap2M: %8lu kB\n", |
| 62 | direct_pages_count[PG_LEVEL_2M] << 11); | ||
| 63 | #else | ||
| 64 | n += sprintf(page + n, "DirectMap4M: %8lu kB\n", | ||
| 65 | direct_pages_count[PG_LEVEL_2M] << 12); | ||
| 66 | #endif | ||
| 62 | #ifdef CONFIG_X86_64 | 67 | #ifdef CONFIG_X86_64 |
| 63 | n += sprintf(page + n, "DirectMap1G: %8lu\n", | 68 | if (direct_gbpages) |
| 64 | direct_pages_count[PG_LEVEL_1G]); | 69 | n += sprintf(page + n, "DirectMap1G: %8lu kB\n", |
| 70 | direct_pages_count[PG_LEVEL_1G] << 20); | ||
| 65 | #endif | 71 | #endif |
| 66 | return n; | 72 | return n; |
| 67 | } | 73 | } |
| @@ -592,10 +598,9 @@ repeat: | |||
| 592 | if (!pte_val(old_pte)) { | 598 | if (!pte_val(old_pte)) { |
| 593 | if (!primary) | 599 | if (!primary) |
| 594 | return 0; | 600 | return 0; |
| 595 | printk(KERN_WARNING "CPA: called for zero pte. " | 601 | WARN(1, KERN_WARNING "CPA: called for zero pte. " |
| 596 | "vaddr = %lx cpa->vaddr = %lx\n", address, | 602 | "vaddr = %lx cpa->vaddr = %lx\n", address, |
| 597 | cpa->vaddr); | 603 | cpa->vaddr); |
| 598 | WARN_ON(1); | ||
| 599 | return -EINVAL; | 604 | return -EINVAL; |
| 600 | } | 605 | } |
| 601 | 606 | ||
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index 1eb2973a301c..16ae70fc57e7 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
| @@ -178,7 +178,7 @@ void acpi_numa_arch_fixup(void) | |||
| 178 | * start of the node, and that the current "end" address is after | 178 | * start of the node, and that the current "end" address is after |
| 179 | * the previous one. | 179 | * the previous one. |
| 180 | */ | 180 | */ |
| 181 | static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) | 181 | static __init int node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) |
| 182 | { | 182 | { |
| 183 | /* | 183 | /* |
| 184 | * Only add present memory as told by the e820. | 184 | * Only add present memory as told by the e820. |
| @@ -189,10 +189,10 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
| 189 | if (memory_chunk->start_pfn >= max_pfn) { | 189 | if (memory_chunk->start_pfn >= max_pfn) { |
| 190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", | 190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", |
| 191 | memory_chunk->start_pfn, memory_chunk->end_pfn); | 191 | memory_chunk->start_pfn, memory_chunk->end_pfn); |
| 192 | return; | 192 | return -1; |
| 193 | } | 193 | } |
| 194 | if (memory_chunk->nid != nid) | 194 | if (memory_chunk->nid != nid) |
| 195 | return; | 195 | return -1; |
| 196 | 196 | ||
| 197 | if (!node_has_online_mem(nid)) | 197 | if (!node_has_online_mem(nid)) |
| 198 | node_start_pfn[nid] = memory_chunk->start_pfn; | 198 | node_start_pfn[nid] = memory_chunk->start_pfn; |
| @@ -202,6 +202,8 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
| 202 | 202 | ||
| 203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) | 203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) |
| 204 | node_end_pfn[nid] = memory_chunk->end_pfn; | 204 | node_end_pfn[nid] = memory_chunk->end_pfn; |
| 205 | |||
| 206 | return 0; | ||
| 205 | } | 207 | } |
| 206 | 208 | ||
| 207 | int __init get_memcfg_from_srat(void) | 209 | int __init get_memcfg_from_srat(void) |
| @@ -259,7 +261,9 @@ int __init get_memcfg_from_srat(void) | |||
| 259 | printk(KERN_DEBUG | 261 | printk(KERN_DEBUG |
| 260 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", | 262 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", |
| 261 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); | 263 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); |
| 262 | node_read_chunk(chunk->nid, chunk); | 264 | if (node_read_chunk(chunk->nid, chunk)) |
| 265 | continue; | ||
| 266 | |||
| 263 | e820_register_active_regions(chunk->nid, chunk->start_pfn, | 267 | e820_register_active_regions(chunk->nid, chunk->start_pfn, |
| 264 | min(chunk->end_pfn, max_pfn)); | 268 | min(chunk->end_pfn, max_pfn)); |
| 265 | } | 269 | } |
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 23faaa890ffc..2bd5c53f6386 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
| @@ -365,7 +365,7 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
| 365 | return; | 365 | return; |
| 366 | 366 | ||
| 367 | reject: | 367 | reject: |
| 368 | printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | 368 | printk(KERN_INFO "PCI: Not using MMCONFIG.\n"); |
| 369 | pci_mmcfg_arch_free(); | 369 | pci_mmcfg_arch_free(); |
| 370 | kfree(pci_mmcfg_config); | 370 | kfree(pci_mmcfg_config); |
| 371 | pci_mmcfg_config = NULL; | 371 | pci_mmcfg_config = NULL; |
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c index 1022e38994c2..0f2805899210 100644 --- a/drivers/acpi/dispatcher/dsobject.c +++ b/drivers/acpi/dispatcher/dsobject.c | |||
| @@ -496,7 +496,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
| 496 | arg = arg->common.next; | 496 | arg = arg->common.next; |
| 497 | } | 497 | } |
| 498 | 498 | ||
| 499 | ACPI_ERROR((AE_INFO, | 499 | ACPI_WARNING((AE_INFO, |
| 500 | "Package List length (%X) larger than NumElements count (%X), truncated\n", | 500 | "Package List length (%X) larger than NumElements count (%X), truncated\n", |
| 501 | i, element_count)); | 501 | i, element_count)); |
| 502 | } else if (i < element_count) { | 502 | } else if (i < element_count) { |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index bb7c51f712bd..7d2edf143f16 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -563,9 +563,6 @@ EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); | |||
| 563 | */ | 563 | */ |
| 564 | static int handle_eject_request(struct dock_station *ds, u32 event) | 564 | static int handle_eject_request(struct dock_station *ds, u32 event) |
| 565 | { | 565 | { |
| 566 | if (!dock_present(ds)) | ||
| 567 | return -ENODEV; | ||
| 568 | |||
| 569 | if (dock_in_progress(ds)) | 566 | if (dock_in_progress(ds)) |
| 570 | return -EBUSY; | 567 | return -EBUSY; |
| 571 | 568 | ||
| @@ -573,8 +570,16 @@ static int handle_eject_request(struct dock_station *ds, u32 event) | |||
| 573 | * here we need to generate the undock | 570 | * here we need to generate the undock |
| 574 | * event prior to actually doing the undock | 571 | * event prior to actually doing the undock |
| 575 | * so that the device struct still exists. | 572 | * so that the device struct still exists. |
| 573 | * Also, even send the dock event if the | ||
| 574 | * device is not present anymore | ||
| 576 | */ | 575 | */ |
| 577 | dock_event(ds, event, UNDOCK_EVENT); | 576 | dock_event(ds, event, UNDOCK_EVENT); |
| 577 | |||
| 578 | if (!dock_present(ds)) { | ||
| 579 | complete_undock(ds); | ||
| 580 | return -ENODEV; | ||
| 581 | } | ||
| 582 | |||
| 578 | hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); | 583 | hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); |
| 579 | undock(ds); | 584 | undock(ds); |
| 580 | eject_dock(ds); | 585 | eject_dock(ds); |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 5622aee996b2..13593f9f2197 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -110,6 +110,31 @@ static struct acpi_ec { | |||
| 110 | u8 handlers_installed; | 110 | u8 handlers_installed; |
| 111 | } *boot_ec, *first_ec; | 111 | } *boot_ec, *first_ec; |
| 112 | 112 | ||
| 113 | /* | ||
| 114 | * Some Asus system have exchanged ECDT data/command IO addresses. | ||
| 115 | */ | ||
| 116 | static int print_ecdt_error(const struct dmi_system_id *id) | ||
| 117 | { | ||
| 118 | printk(KERN_NOTICE PREFIX "%s detected - " | ||
| 119 | "ECDT has exchanged control/data I/O address\n", | ||
| 120 | id->ident); | ||
| 121 | return 0; | ||
| 122 | } | ||
| 123 | |||
| 124 | static struct dmi_system_id __cpuinitdata ec_dmi_table[] = { | ||
| 125 | { | ||
| 126 | print_ecdt_error, "Asus L4R", { | ||
| 127 | DMI_MATCH(DMI_BIOS_VERSION, "1008.006"), | ||
| 128 | DMI_MATCH(DMI_PRODUCT_NAME, "L4R"), | ||
| 129 | DMI_MATCH(DMI_BOARD_NAME, "L4R") }, NULL}, | ||
| 130 | { | ||
| 131 | print_ecdt_error, "Asus M6R", { | ||
| 132 | DMI_MATCH(DMI_BIOS_VERSION, "0207"), | ||
| 133 | DMI_MATCH(DMI_PRODUCT_NAME, "M6R"), | ||
| 134 | DMI_MATCH(DMI_BOARD_NAME, "M6R") }, NULL}, | ||
| 135 | {}, | ||
| 136 | }; | ||
| 137 | |||
| 113 | /* -------------------------------------------------------------------------- | 138 | /* -------------------------------------------------------------------------- |
| 114 | Transaction Management | 139 | Transaction Management |
| 115 | -------------------------------------------------------------------------- */ | 140 | -------------------------------------------------------------------------- */ |
| @@ -196,6 +221,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
| 196 | return 0; | 221 | return 0; |
| 197 | msleep(1); | 222 | msleep(1); |
| 198 | } | 223 | } |
| 224 | if (acpi_ec_check_status(ec,event)) | ||
| 225 | return 0; | ||
| 199 | } | 226 | } |
| 200 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", | 227 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", |
| 201 | acpi_ec_read_status(ec), | 228 | acpi_ec_read_status(ec), |
| @@ -911,6 +938,15 @@ int __init acpi_ec_ecdt_probe(void) | |||
| 911 | pr_info(PREFIX "EC description table is found, configuring boot EC\n"); | 938 | pr_info(PREFIX "EC description table is found, configuring boot EC\n"); |
| 912 | boot_ec->command_addr = ecdt_ptr->control.address; | 939 | boot_ec->command_addr = ecdt_ptr->control.address; |
| 913 | boot_ec->data_addr = ecdt_ptr->data.address; | 940 | boot_ec->data_addr = ecdt_ptr->data.address; |
| 941 | if (dmi_check_system(ec_dmi_table)) { | ||
| 942 | /* | ||
| 943 | * If the board falls into ec_dmi_table, it means | ||
| 944 | * that ECDT table gives the incorrect command/status | ||
| 945 | * & data I/O address. Just fix it. | ||
| 946 | */ | ||
| 947 | boot_ec->data_addr = ecdt_ptr->control.address; | ||
| 948 | boot_ec->command_addr = ecdt_ptr->data.address; | ||
| 949 | } | ||
| 914 | boot_ec->gpe = ecdt_ptr->gpe; | 950 | boot_ec->gpe = ecdt_ptr->gpe; |
| 915 | boot_ec->handle = ACPI_ROOT_OBJECT; | 951 | boot_ec->handle = ACPI_ROOT_OBJECT; |
| 916 | acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); | 952 | acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); |
diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c index 2a32c843cb4a..8892b9824fae 100644 --- a/drivers/acpi/executer/exconfig.c +++ b/drivers/acpi/executer/exconfig.c | |||
| @@ -479,5 +479,8 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle) | |||
| 479 | 479 | ||
| 480 | acpi_tb_set_table_loaded_flag(table_index, FALSE); | 480 | acpi_tb_set_table_loaded_flag(table_index, FALSE); |
| 481 | 481 | ||
| 482 | /* Table unloaded, remove a reference to the ddb_handle object */ | ||
| 483 | |||
| 484 | acpi_ut_remove_reference(ddb_handle); | ||
| 482 | return_ACPI_STATUS(AE_OK); | 485 | return_ACPI_STATUS(AE_OK); |
| 483 | } | 486 | } |
diff --git a/drivers/acpi/namespace/nsnames.c b/drivers/acpi/namespace/nsnames.c index 549db42f16cf..bd5773878009 100644 --- a/drivers/acpi/namespace/nsnames.c +++ b/drivers/acpi/namespace/nsnames.c | |||
| @@ -56,13 +56,14 @@ ACPI_MODULE_NAME("nsnames") | |||
| 56 | * Size - Size of the pathname | 56 | * Size - Size of the pathname |
| 57 | * *name_buffer - Where to return the pathname | 57 | * *name_buffer - Where to return the pathname |
| 58 | * | 58 | * |
| 59 | * RETURN: Places the pathname into the name_buffer, in external format | 59 | * RETURN: Status |
| 60 | * Places the pathname into the name_buffer, in external format | ||
| 60 | * (name segments separated by path separators) | 61 | * (name segments separated by path separators) |
| 61 | * | 62 | * |
| 62 | * DESCRIPTION: Generate a full pathaname | 63 | * DESCRIPTION: Generate a full pathaname |
| 63 | * | 64 | * |
| 64 | ******************************************************************************/ | 65 | ******************************************************************************/ |
| 65 | void | 66 | acpi_status |
| 66 | acpi_ns_build_external_path(struct acpi_namespace_node *node, | 67 | acpi_ns_build_external_path(struct acpi_namespace_node *node, |
| 67 | acpi_size size, char *name_buffer) | 68 | acpi_size size, char *name_buffer) |
| 68 | { | 69 | { |
| @@ -77,7 +78,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
| 77 | if (index < ACPI_NAME_SIZE) { | 78 | if (index < ACPI_NAME_SIZE) { |
| 78 | name_buffer[0] = AML_ROOT_PREFIX; | 79 | name_buffer[0] = AML_ROOT_PREFIX; |
| 79 | name_buffer[1] = 0; | 80 | name_buffer[1] = 0; |
| 80 | return; | 81 | return (AE_OK); |
| 81 | } | 82 | } |
| 82 | 83 | ||
| 83 | /* Store terminator byte, then build name backwards */ | 84 | /* Store terminator byte, then build name backwards */ |
| @@ -105,11 +106,13 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
| 105 | 106 | ||
| 106 | if (index != 0) { | 107 | if (index != 0) { |
| 107 | ACPI_ERROR((AE_INFO, | 108 | ACPI_ERROR((AE_INFO, |
| 108 | "Could not construct pathname; index=%X, size=%X, Path=%s", | 109 | "Could not construct external pathname; index=%X, size=%X, Path=%s", |
| 109 | (u32) index, (u32) size, &name_buffer[size])); | 110 | (u32) index, (u32) size, &name_buffer[size])); |
| 111 | |||
| 112 | return (AE_BAD_PARAMETER); | ||
| 110 | } | 113 | } |
| 111 | 114 | ||
| 112 | return; | 115 | return (AE_OK); |
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | #ifdef ACPI_DEBUG_OUTPUT | 118 | #ifdef ACPI_DEBUG_OUTPUT |
| @@ -129,6 +132,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
| 129 | 132 | ||
| 130 | char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | 133 | char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) |
| 131 | { | 134 | { |
| 135 | acpi_status status; | ||
| 132 | char *name_buffer; | 136 | char *name_buffer; |
| 133 | acpi_size size; | 137 | acpi_size size; |
| 134 | 138 | ||
| @@ -138,8 +142,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | |||
| 138 | 142 | ||
| 139 | size = acpi_ns_get_pathname_length(node); | 143 | size = acpi_ns_get_pathname_length(node); |
| 140 | if (!size) { | 144 | if (!size) { |
| 141 | ACPI_ERROR((AE_INFO, "Invalid node failure")); | 145 | return (NULL); |
| 142 | return_PTR(NULL); | ||
| 143 | } | 146 | } |
| 144 | 147 | ||
| 145 | /* Allocate a buffer to be returned to caller */ | 148 | /* Allocate a buffer to be returned to caller */ |
| @@ -152,7 +155,11 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | |||
| 152 | 155 | ||
| 153 | /* Build the path in the allocated buffer */ | 156 | /* Build the path in the allocated buffer */ |
| 154 | 157 | ||
| 155 | acpi_ns_build_external_path(node, size, name_buffer); | 158 | status = acpi_ns_build_external_path(node, size, name_buffer); |
| 159 | if (ACPI_FAILURE(status)) { | ||
| 160 | return (NULL); | ||
| 161 | } | ||
| 162 | |||
| 156 | return_PTR(name_buffer); | 163 | return_PTR(name_buffer); |
| 157 | } | 164 | } |
| 158 | #endif | 165 | #endif |
| @@ -186,7 +193,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node) | |||
| 186 | while (next_node && (next_node != acpi_gbl_root_node)) { | 193 | while (next_node && (next_node != acpi_gbl_root_node)) { |
| 187 | if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) { | 194 | if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) { |
| 188 | ACPI_ERROR((AE_INFO, | 195 | ACPI_ERROR((AE_INFO, |
| 189 | "Invalid NS Node (%p) while traversing path", | 196 | "Invalid Namespace Node (%p) while traversing namespace", |
| 190 | next_node)); | 197 | next_node)); |
| 191 | return 0; | 198 | return 0; |
| 192 | } | 199 | } |
| @@ -234,8 +241,7 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle, | |||
| 234 | 241 | ||
| 235 | required_size = acpi_ns_get_pathname_length(node); | 242 | required_size = acpi_ns_get_pathname_length(node); |
| 236 | if (!required_size) { | 243 | if (!required_size) { |
| 237 | ACPI_ERROR((AE_INFO, "Invalid node failure")); | 244 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 238 | return_ACPI_STATUS(AE_ERROR); | ||
| 239 | } | 245 | } |
| 240 | 246 | ||
| 241 | /* Validate/Allocate/Clear caller buffer */ | 247 | /* Validate/Allocate/Clear caller buffer */ |
| @@ -247,7 +253,11 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle, | |||
| 247 | 253 | ||
| 248 | /* Build the path in the caller buffer */ | 254 | /* Build the path in the caller buffer */ |
| 249 | 255 | ||
| 250 | acpi_ns_build_external_path(node, required_size, buffer->pointer); | 256 | status = |
| 257 | acpi_ns_build_external_path(node, required_size, buffer->pointer); | ||
| 258 | if (ACPI_FAILURE(status)) { | ||
| 259 | return_ACPI_STATUS(status); | ||
| 260 | } | ||
| 251 | 261 | ||
| 252 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n", | 262 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n", |
| 253 | (char *)buffer->pointer, (u32) required_size)); | 263 | (char *)buffer->pointer, (u32) required_size)); |
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index 89f3b2abfdc7..cf47805a7448 100644 --- a/drivers/acpi/pci_link.c +++ b/drivers/acpi/pci_link.c | |||
| @@ -849,7 +849,7 @@ static int __init acpi_irq_penalty_update(char *str, int used) | |||
| 849 | if (irq < 0) | 849 | if (irq < 0) |
| 850 | continue; | 850 | continue; |
| 851 | 851 | ||
| 852 | if (irq >= ACPI_MAX_IRQS) | 852 | if (irq >= ARRAY_SIZE(acpi_irq_penalty)) |
| 853 | continue; | 853 | continue; |
| 854 | 854 | ||
| 855 | if (used) | 855 | if (used) |
| @@ -872,10 +872,12 @@ static int __init acpi_irq_penalty_update(char *str, int used) | |||
| 872 | */ | 872 | */ |
| 873 | void acpi_penalize_isa_irq(int irq, int active) | 873 | void acpi_penalize_isa_irq(int irq, int active) |
| 874 | { | 874 | { |
| 875 | if (active) | 875 | if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) { |
| 876 | acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; | 876 | if (active) |
| 877 | else | 877 | acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; |
| 878 | acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; | 878 | else |
| 879 | acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; | ||
| 880 | } | ||
| 879 | } | 881 | } |
| 880 | 882 | ||
| 881 | /* | 883 | /* |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index e36422a7122c..ee68ac54c0d4 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -123,7 +123,7 @@ struct acpi_processor_errata errata __read_mostly; | |||
| 123 | static int set_no_mwait(const struct dmi_system_id *id) | 123 | static int set_no_mwait(const struct dmi_system_id *id) |
| 124 | { | 124 | { |
| 125 | printk(KERN_NOTICE PREFIX "%s detected - " | 125 | printk(KERN_NOTICE PREFIX "%s detected - " |
| 126 | "disable mwait for CPU C-stetes\n", id->ident); | 126 | "disabling mwait for CPU C-states\n", id->ident); |
| 127 | idle_nomwait = 1; | 127 | idle_nomwait = 1; |
| 128 | return 0; | 128 | return 0; |
| 129 | } | 129 | } |
| @@ -138,7 +138,7 @@ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { | |||
| 138 | { | 138 | { |
| 139 | set_no_mwait, "Extensa 5220", { | 139 | set_no_mwait, "Extensa 5220", { |
| 140 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), | 140 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), |
| 141 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | 141 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
| 142 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | 142 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), |
| 143 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, | 143 | DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, |
| 144 | {}, | 144 | {}, |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 283c08f5f4d4..cf5b1b7b684f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -41,7 +41,6 @@ | |||
| 41 | #include <linux/pm_qos_params.h> | 41 | #include <linux/pm_qos_params.h> |
| 42 | #include <linux/clockchips.h> | 42 | #include <linux/clockchips.h> |
| 43 | #include <linux/cpuidle.h> | 43 | #include <linux/cpuidle.h> |
| 44 | #include <linux/cpuidle.h> | ||
| 45 | 44 | ||
| 46 | /* | 45 | /* |
| 47 | * Include the apic definitions for x86 to have the APIC timer related defines | 46 | * Include the apic definitions for x86 to have the APIC timer related defines |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 0133af49cf06..80c251ec6d2a 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
| @@ -70,8 +70,8 @@ static DEFINE_MUTEX(performance_mutex); | |||
| 70 | * 0 -> cpufreq low level drivers initialized -> consider _PPC values | 70 | * 0 -> cpufreq low level drivers initialized -> consider _PPC values |
| 71 | * 1 -> ignore _PPC totally -> forced by user through boot param | 71 | * 1 -> ignore _PPC totally -> forced by user through boot param |
| 72 | */ | 72 | */ |
| 73 | static unsigned int ignore_ppc = -1; | 73 | static int ignore_ppc = -1; |
| 74 | module_param(ignore_ppc, uint, 0644); | 74 | module_param(ignore_ppc, int, 0644); |
| 75 | MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ | 75 | MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ |
| 76 | "limited by BIOS, this should help"); | 76 | "limited by BIOS, this should help"); |
| 77 | 77 | ||
diff --git a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c index f61ebc679e66..d9063ea414e3 100644 --- a/drivers/acpi/resources/rscalc.c +++ b/drivers/acpi/resources/rscalc.c | |||
| @@ -587,6 +587,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | |||
| 587 | } else { | 587 | } else { |
| 588 | temp_size_needed += | 588 | temp_size_needed += |
| 589 | acpi_ns_get_pathname_length((*sub_object_list)->reference.node); | 589 | acpi_ns_get_pathname_length((*sub_object_list)->reference.node); |
| 590 | if (!temp_size_needed) { | ||
| 591 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
| 592 | } | ||
| 590 | } | 593 | } |
| 591 | } else { | 594 | } else { |
| 592 | /* | 595 | /* |
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index c3419182c9a7..775c97a282bd 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c | |||
| @@ -300,6 +300,8 @@ int __init acpi_table_init(void) | |||
| 300 | 300 | ||
| 301 | static int __init acpi_parse_apic_instance(char *str) | 301 | static int __init acpi_parse_apic_instance(char *str) |
| 302 | { | 302 | { |
| 303 | if (!str) | ||
| 304 | return -EINVAL; | ||
| 303 | 305 | ||
| 304 | acpi_apic_instance = simple_strtoul(str, NULL, 0); | 306 | acpi_apic_instance = simple_strtoul(str, NULL, 0); |
| 305 | 307 | ||
diff --git a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c index e7bf34a7b1d2..7dcb67e0b215 100644 --- a/drivers/acpi/utilities/utalloc.c +++ b/drivers/acpi/utilities/utalloc.c | |||
| @@ -242,10 +242,12 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer, | |||
| 242 | { | 242 | { |
| 243 | acpi_status status = AE_OK; | 243 | acpi_status status = AE_OK; |
| 244 | 244 | ||
| 245 | if (!required_length) { | 245 | /* Parameter validation */ |
| 246 | WARN_ON(1); | 246 | |
| 247 | return AE_ERROR; | 247 | if (!buffer || !required_length) { |
| 248 | return (AE_BAD_PARAMETER); | ||
| 248 | } | 249 | } |
| 250 | |||
| 249 | switch (buffer->length) { | 251 | switch (buffer->length) { |
| 250 | case ACPI_NO_BUFFER: | 252 | case ACPI_NO_BUFFER: |
| 251 | 253 | ||
diff --git a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c index c5c791a575c9..42609d3a8aa9 100644 --- a/drivers/acpi/utilities/utdelete.c +++ b/drivers/acpi/utilities/utdelete.c | |||
| @@ -135,6 +135,10 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object) | |||
| 135 | obj_pointer = object->package.elements; | 135 | obj_pointer = object->package.elements; |
| 136 | break; | 136 | break; |
| 137 | 137 | ||
| 138 | /* | ||
| 139 | * These objects have a possible list of notify handlers. | ||
| 140 | * Device object also may have a GPE block. | ||
| 141 | */ | ||
| 138 | case ACPI_TYPE_DEVICE: | 142 | case ACPI_TYPE_DEVICE: |
| 139 | 143 | ||
| 140 | if (object->device.gpe_block) { | 144 | if (object->device.gpe_block) { |
| @@ -142,9 +146,14 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object) | |||
| 142 | gpe_block); | 146 | gpe_block); |
| 143 | } | 147 | } |
| 144 | 148 | ||
| 145 | /* Walk the handler list for this device */ | 149 | /*lint -fallthrough */ |
| 150 | |||
| 151 | case ACPI_TYPE_PROCESSOR: | ||
| 152 | case ACPI_TYPE_THERMAL: | ||
| 153 | |||
| 154 | /* Walk the notify handler list for this object */ | ||
| 146 | 155 | ||
| 147 | handler_desc = object->device.handler; | 156 | handler_desc = object->common_notify.handler; |
| 148 | while (handler_desc) { | 157 | while (handler_desc) { |
| 149 | next_desc = handler_desc->address_space.next; | 158 | next_desc = handler_desc->address_space.next; |
| 150 | acpi_ut_remove_reference(handler_desc); | 159 | acpi_ut_remove_reference(handler_desc); |
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index e25484495e65..916eff399eb3 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
| @@ -425,6 +425,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
| 425 | acpi_size * obj_length) | 425 | acpi_size * obj_length) |
| 426 | { | 426 | { |
| 427 | acpi_size length; | 427 | acpi_size length; |
| 428 | acpi_size size; | ||
| 428 | acpi_status status = AE_OK; | 429 | acpi_status status = AE_OK; |
| 429 | 430 | ||
| 430 | ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); | 431 | ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); |
| @@ -484,10 +485,14 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
| 484 | * Get the actual length of the full pathname to this object. | 485 | * Get the actual length of the full pathname to this object. |
| 485 | * The reference will be converted to the pathname to the object | 486 | * The reference will be converted to the pathname to the object |
| 486 | */ | 487 | */ |
| 487 | length += | 488 | size = |
| 488 | ACPI_ROUND_UP_TO_NATIVE_WORD | 489 | acpi_ns_get_pathname_length(internal_object-> |
| 489 | (acpi_ns_get_pathname_length | 490 | reference.node); |
| 490 | (internal_object->reference.node)); | 491 | if (!size) { |
| 492 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
| 493 | } | ||
| 494 | |||
| 495 | length += ACPI_ROUND_UP_TO_NATIVE_WORD(size); | ||
| 491 | break; | 496 | break; |
| 492 | 497 | ||
| 493 | default: | 498 | default: |
diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c index c33b1c6e93b1..cfe2c833474d 100644 --- a/drivers/acpi/wmi.c +++ b/drivers/acpi/wmi.c | |||
| @@ -347,7 +347,7 @@ struct acpi_buffer *out) | |||
| 347 | strcpy(method, "WQ"); | 347 | strcpy(method, "WQ"); |
| 348 | strncat(method, block->object_id, 2); | 348 | strncat(method, block->object_id, 2); |
| 349 | 349 | ||
| 350 | status = acpi_evaluate_object(handle, method, NULL, out); | 350 | status = acpi_evaluate_object(handle, method, &input, out); |
| 351 | 351 | ||
| 352 | /* | 352 | /* |
| 353 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if | 353 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if |
diff --git a/drivers/char/pcmcia/ipwireless/tty.c b/drivers/char/pcmcia/ipwireless/tty.c index b1414507997c..3a23e7694d55 100644 --- a/drivers/char/pcmcia/ipwireless/tty.c +++ b/drivers/char/pcmcia/ipwireless/tty.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include <linux/tty_driver.h> | 29 | #include <linux/tty_driver.h> |
| 30 | #include <linux/tty_flip.h> | 30 | #include <linux/tty_flip.h> |
| 31 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
| 32 | #include <linux/version.h> | ||
| 33 | 32 | ||
| 34 | #include "tty.h" | 33 | #include "tty.h" |
| 35 | #include "network.h" | 34 | #include "network.h" |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 509c89ac5bd3..08911ed66494 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
| @@ -47,7 +47,6 @@ | |||
| 47 | 47 | ||
| 48 | 48 | ||
| 49 | #include <linux/module.h> | 49 | #include <linux/module.h> |
| 50 | #include <linux/version.h> | ||
| 51 | #include <linux/errno.h> | 50 | #include <linux/errno.h> |
| 52 | #include <linux/signal.h> | 51 | #include <linux/signal.h> |
| 53 | #include <linux/sched.h> | 52 | #include <linux/sched.h> |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 0e6866fe0f96..a27160ba21d7 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -2496,45 +2496,25 @@ static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg) | |||
| 2496 | } | 2496 | } |
| 2497 | 2497 | ||
| 2498 | /** | 2498 | /** |
| 2499 | * tiocswinsz - implement window size set ioctl | 2499 | * tty_do_resize - resize event |
| 2500 | * @tty; tty | 2500 | * @tty: tty being resized |
| 2501 | * @arg: user buffer for result | 2501 | * @real_tty: real tty (if using a pty/tty pair) |
| 2502 | * @rows: rows (character) | ||
| 2503 | * @cols: cols (character) | ||
| 2502 | * | 2504 | * |
| 2503 | * Copies the user idea of the window size to the kernel. Traditionally | 2505 | * Update the termios variables and send the neccessary signals to |
| 2504 | * this is just advisory information but for the Linux console it | 2506 | * peform a terminal resize correctly |
| 2505 | * actually has driver level meaning and triggers a VC resize. | ||
| 2506 | * | ||
| 2507 | * Locking: | ||
| 2508 | * Called function use the console_sem is used to ensure we do | ||
| 2509 | * not try and resize the console twice at once. | ||
| 2510 | * The tty->termios_mutex is used to ensure we don't double | ||
| 2511 | * resize and get confused. Lock order - tty->termios_mutex before | ||
| 2512 | * console sem | ||
| 2513 | */ | 2507 | */ |
| 2514 | 2508 | ||
| 2515 | static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | 2509 | int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, |
| 2516 | struct winsize __user *arg) | 2510 | struct winsize *ws) |
| 2517 | { | 2511 | { |
| 2518 | struct winsize tmp_ws; | ||
| 2519 | struct pid *pgrp, *rpgrp; | 2512 | struct pid *pgrp, *rpgrp; |
| 2520 | unsigned long flags; | 2513 | unsigned long flags; |
| 2521 | 2514 | ||
| 2522 | if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) | ||
| 2523 | return -EFAULT; | ||
| 2524 | |||
| 2525 | mutex_lock(&tty->termios_mutex); | 2515 | mutex_lock(&tty->termios_mutex); |
| 2526 | if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg))) | 2516 | if (!memcmp(ws, &tty->winsize, sizeof(*ws))) |
| 2527 | goto done; | 2517 | goto done; |
| 2528 | |||
| 2529 | #ifdef CONFIG_VT | ||
| 2530 | if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { | ||
| 2531 | if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col, | ||
| 2532 | tmp_ws.ws_row)) { | ||
| 2533 | mutex_unlock(&tty->termios_mutex); | ||
| 2534 | return -ENXIO; | ||
| 2535 | } | ||
| 2536 | } | ||
| 2537 | #endif | ||
| 2538 | /* Get the PID values and reference them so we can | 2518 | /* Get the PID values and reference them so we can |
| 2539 | avoid holding the tty ctrl lock while sending signals */ | 2519 | avoid holding the tty ctrl lock while sending signals */ |
| 2540 | spin_lock_irqsave(&tty->ctrl_lock, flags); | 2520 | spin_lock_irqsave(&tty->ctrl_lock, flags); |
| @@ -2550,14 +2530,42 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | |||
| 2550 | put_pid(pgrp); | 2530 | put_pid(pgrp); |
| 2551 | put_pid(rpgrp); | 2531 | put_pid(rpgrp); |
| 2552 | 2532 | ||
| 2553 | tty->winsize = tmp_ws; | 2533 | tty->winsize = *ws; |
| 2554 | real_tty->winsize = tmp_ws; | 2534 | real_tty->winsize = *ws; |
| 2555 | done: | 2535 | done: |
| 2556 | mutex_unlock(&tty->termios_mutex); | 2536 | mutex_unlock(&tty->termios_mutex); |
| 2557 | return 0; | 2537 | return 0; |
| 2558 | } | 2538 | } |
| 2559 | 2539 | ||
| 2560 | /** | 2540 | /** |
| 2541 | * tiocswinsz - implement window size set ioctl | ||
| 2542 | * @tty; tty | ||
| 2543 | * @arg: user buffer for result | ||
| 2544 | * | ||
| 2545 | * Copies the user idea of the window size to the kernel. Traditionally | ||
| 2546 | * this is just advisory information but for the Linux console it | ||
| 2547 | * actually has driver level meaning and triggers a VC resize. | ||
| 2548 | * | ||
| 2549 | * Locking: | ||
| 2550 | * Driver dependant. The default do_resize method takes the | ||
| 2551 | * tty termios mutex and ctrl_lock. The console takes its own lock | ||
| 2552 | * then calls into the default method. | ||
| 2553 | */ | ||
| 2554 | |||
| 2555 | static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 2556 | struct winsize __user *arg) | ||
| 2557 | { | ||
| 2558 | struct winsize tmp_ws; | ||
| 2559 | if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) | ||
| 2560 | return -EFAULT; | ||
| 2561 | |||
| 2562 | if (tty->ops->resize) | ||
| 2563 | return tty->ops->resize(tty, real_tty, &tmp_ws); | ||
| 2564 | else | ||
| 2565 | return tty_do_resize(tty, real_tty, &tmp_ws); | ||
| 2566 | } | ||
| 2567 | |||
| 2568 | /** | ||
| 2561 | * tioccons - allow admin to move logical console | 2569 | * tioccons - allow admin to move logical console |
| 2562 | * @file: the file to become console | 2570 | * @file: the file to become console |
| 2563 | * | 2571 | * |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 1bc00c9d860d..60359c360912 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
| @@ -803,7 +803,25 @@ static inline int resize_screen(struct vc_data *vc, int width, int height, | |||
| 803 | */ | 803 | */ |
| 804 | #define VC_RESIZE_MAXCOL (32767) | 804 | #define VC_RESIZE_MAXCOL (32767) |
| 805 | #define VC_RESIZE_MAXROW (32767) | 805 | #define VC_RESIZE_MAXROW (32767) |
| 806 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | 806 | |
| 807 | /** | ||
| 808 | * vc_do_resize - resizing method for the tty | ||
| 809 | * @tty: tty being resized | ||
| 810 | * @real_tty: real tty (different to tty if a pty/tty pair) | ||
| 811 | * @vc: virtual console private data | ||
| 812 | * @cols: columns | ||
| 813 | * @lines: lines | ||
| 814 | * | ||
| 815 | * Resize a virtual console, clipping according to the actual constraints. | ||
| 816 | * If the caller passes a tty structure then update the termios winsize | ||
| 817 | * information and perform any neccessary signal handling. | ||
| 818 | * | ||
| 819 | * Caller must hold the console semaphore. Takes the termios mutex and | ||
| 820 | * ctrl_lock of the tty IFF a tty is passed. | ||
| 821 | */ | ||
| 822 | |||
| 823 | static int vc_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 824 | struct vc_data *vc, unsigned int cols, unsigned int lines) | ||
| 807 | { | 825 | { |
| 808 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; | 826 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; |
| 809 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; | 827 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; |
| @@ -907,24 +925,15 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
| 907 | gotoxy(vc, vc->vc_x, vc->vc_y); | 925 | gotoxy(vc, vc->vc_x, vc->vc_y); |
| 908 | save_cur(vc); | 926 | save_cur(vc); |
| 909 | 927 | ||
| 910 | if (vc->vc_tty) { | 928 | if (tty) { |
| 911 | struct winsize ws, *cws = &vc->vc_tty->winsize; | 929 | /* Rewrite the requested winsize data with the actual |
| 912 | struct pid *pgrp = NULL; | 930 | resulting sizes */ |
| 913 | 931 | struct winsize ws; | |
| 914 | memset(&ws, 0, sizeof(ws)); | 932 | memset(&ws, 0, sizeof(ws)); |
| 915 | ws.ws_row = vc->vc_rows; | 933 | ws.ws_row = vc->vc_rows; |
| 916 | ws.ws_col = vc->vc_cols; | 934 | ws.ws_col = vc->vc_cols; |
| 917 | ws.ws_ypixel = vc->vc_scan_lines; | 935 | ws.ws_ypixel = vc->vc_scan_lines; |
| 918 | 936 | tty_do_resize(tty, real_tty, &ws); | |
| 919 | spin_lock_irq(&vc->vc_tty->ctrl_lock); | ||
| 920 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col)) | ||
| 921 | pgrp = get_pid(vc->vc_tty->pgrp); | ||
| 922 | spin_unlock_irq(&vc->vc_tty->ctrl_lock); | ||
| 923 | if (pgrp) { | ||
| 924 | kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1); | ||
| 925 | put_pid(pgrp); | ||
| 926 | } | ||
| 927 | *cws = ws; | ||
| 928 | } | 937 | } |
| 929 | 938 | ||
| 930 | if (CON_IS_VISIBLE(vc)) | 939 | if (CON_IS_VISIBLE(vc)) |
| @@ -932,14 +941,47 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
| 932 | return err; | 941 | return err; |
| 933 | } | 942 | } |
| 934 | 943 | ||
| 935 | int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | 944 | /** |
| 945 | * vc_resize - resize a VT | ||
| 946 | * @vc: virtual console | ||
| 947 | * @cols: columns | ||
| 948 | * @rows: rows | ||
| 949 | * | ||
| 950 | * Resize a virtual console as seen from the console end of things. We | ||
| 951 | * use the common vc_do_resize methods to update the structures. The | ||
| 952 | * caller must hold the console sem to protect console internals and | ||
| 953 | * vc->vc_tty | ||
| 954 | */ | ||
| 955 | |||
| 956 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows) | ||
| 957 | { | ||
| 958 | return vc_do_resize(vc->vc_tty, vc->vc_tty, vc, cols, rows); | ||
| 959 | } | ||
| 960 | |||
| 961 | /** | ||
| 962 | * vt_resize - resize a VT | ||
| 963 | * @tty: tty to resize | ||
| 964 | * @real_tty: tty if a pty/tty pair | ||
| 965 | * @ws: winsize attributes | ||
| 966 | * | ||
| 967 | * Resize a virtual terminal. This is called by the tty layer as we | ||
| 968 | * register our own handler for resizing. The mutual helper does all | ||
| 969 | * the actual work. | ||
| 970 | * | ||
| 971 | * Takes the console sem and the called methods then take the tty | ||
| 972 | * termios_mutex and the tty ctrl_lock in that order. | ||
| 973 | */ | ||
| 974 | |||
| 975 | int vt_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 976 | struct winsize *ws) | ||
| 936 | { | 977 | { |
| 937 | int rc; | 978 | struct vc_data *vc = tty->driver_data; |
| 979 | int ret; | ||
| 938 | 980 | ||
| 939 | acquire_console_sem(); | 981 | acquire_console_sem(); |
| 940 | rc = vc_resize(vc, cols, lines); | 982 | ret = vc_do_resize(tty, real_tty, vc, ws->ws_col, ws->ws_row); |
| 941 | release_console_sem(); | 983 | release_console_sem(); |
| 942 | return rc; | 984 | return ret; |
| 943 | } | 985 | } |
| 944 | 986 | ||
| 945 | void vc_deallocate(unsigned int currcons) | 987 | void vc_deallocate(unsigned int currcons) |
| @@ -2907,6 +2949,7 @@ static const struct tty_operations con_ops = { | |||
| 2907 | .start = con_start, | 2949 | .start = con_start, |
| 2908 | .throttle = con_throttle, | 2950 | .throttle = con_throttle, |
| 2909 | .unthrottle = con_unthrottle, | 2951 | .unthrottle = con_unthrottle, |
| 2952 | .resize = vt_resize, | ||
| 2910 | }; | 2953 | }; |
| 2911 | 2954 | ||
| 2912 | int __init vty_init(void) | 2955 | int __init vty_init(void) |
| @@ -4061,7 +4104,6 @@ EXPORT_SYMBOL(default_blu); | |||
| 4061 | EXPORT_SYMBOL(update_region); | 4104 | EXPORT_SYMBOL(update_region); |
| 4062 | EXPORT_SYMBOL(redraw_screen); | 4105 | EXPORT_SYMBOL(redraw_screen); |
| 4063 | EXPORT_SYMBOL(vc_resize); | 4106 | EXPORT_SYMBOL(vc_resize); |
| 4064 | EXPORT_SYMBOL(vc_lock_resize); | ||
| 4065 | EXPORT_SYMBOL(fg_console); | 4107 | EXPORT_SYMBOL(fg_console); |
| 4066 | EXPORT_SYMBOL(console_blank_hook); | 4108 | EXPORT_SYMBOL(console_blank_hook); |
| 4067 | EXPORT_SYMBOL(console_blanked); | 4109 | EXPORT_SYMBOL(console_blanked); |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 3211afd9d57e..c904e9ad4a71 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
| @@ -947,14 +947,16 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
| 947 | get_user(cc, &vtsizes->v_cols)) | 947 | get_user(cc, &vtsizes->v_cols)) |
| 948 | ret = -EFAULT; | 948 | ret = -EFAULT; |
| 949 | else { | 949 | else { |
| 950 | acquire_console_sem(); | ||
| 950 | for (i = 0; i < MAX_NR_CONSOLES; i++) { | 951 | for (i = 0; i < MAX_NR_CONSOLES; i++) { |
| 951 | vc = vc_cons[i].d; | 952 | vc = vc_cons[i].d; |
| 952 | 953 | ||
| 953 | if (vc) { | 954 | if (vc) { |
| 954 | vc->vc_resize_user = 1; | 955 | vc->vc_resize_user = 1; |
| 955 | vc_lock_resize(vc_cons[i].d, cc, ll); | 956 | vc_resize(vc_cons[i].d, cc, ll); |
| 956 | } | 957 | } |
| 957 | } | 958 | } |
| 959 | release_console_sem(); | ||
| 958 | } | 960 | } |
| 959 | break; | 961 | break; |
| 960 | } | 962 | } |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 8bfee5fb7223..278c9857bcf5 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
| @@ -74,7 +74,6 @@ | |||
| 74 | * currently programmed in the FPGA. | 74 | * currently programmed in the FPGA. |
| 75 | */ | 75 | */ |
| 76 | 76 | ||
| 77 | #include <linux/version.h> | ||
| 78 | #include <linux/module.h> | 77 | #include <linux/module.h> |
| 79 | #include <linux/kernel.h> | 78 | #include <linux/kernel.h> |
| 80 | #include <linux/types.h> | 79 | #include <linux/types.h> |
diff --git a/drivers/cpuidle/governors/ladder.c b/drivers/cpuidle/governors/ladder.c index ba7b9a6b17a1..a4bec3f919aa 100644 --- a/drivers/cpuidle/governors/ladder.c +++ b/drivers/cpuidle/governors/ladder.c | |||
| @@ -67,10 +67,17 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
| 67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); | 67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); |
| 68 | struct ladder_device_state *last_state; | 68 | struct ladder_device_state *last_state; |
| 69 | int last_residency, last_idx = ldev->last_state_idx; | 69 | int last_residency, last_idx = ldev->last_state_idx; |
| 70 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | ||
| 70 | 71 | ||
| 71 | if (unlikely(!ldev)) | 72 | if (unlikely(!ldev)) |
| 72 | return 0; | 73 | return 0; |
| 73 | 74 | ||
| 75 | /* Special case when user has set very strict latency requirement */ | ||
| 76 | if (unlikely(latency_req == 0)) { | ||
| 77 | ladder_do_selection(ldev, last_idx, 0); | ||
| 78 | return 0; | ||
| 79 | } | ||
| 80 | |||
| 74 | last_state = &ldev->states[last_idx]; | 81 | last_state = &ldev->states[last_idx]; |
| 75 | 82 | ||
| 76 | if (dev->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID) | 83 | if (dev->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID) |
| @@ -81,8 +88,7 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
| 81 | /* consider promotion */ | 88 | /* consider promotion */ |
| 82 | if (last_idx < dev->state_count - 1 && | 89 | if (last_idx < dev->state_count - 1 && |
| 83 | last_residency > last_state->threshold.promotion_time && | 90 | last_residency > last_state->threshold.promotion_time && |
| 84 | dev->states[last_idx + 1].exit_latency <= | 91 | dev->states[last_idx + 1].exit_latency <= latency_req) { |
| 85 | pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) { | ||
| 86 | last_state->stats.promotion_count++; | 92 | last_state->stats.promotion_count++; |
| 87 | last_state->stats.demotion_count = 0; | 93 | last_state->stats.demotion_count = 0; |
| 88 | if (last_state->stats.promotion_count >= last_state->threshold.promotion_count) { | 94 | if (last_state->stats.promotion_count >= last_state->threshold.promotion_count) { |
| @@ -92,7 +98,19 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
| 92 | } | 98 | } |
| 93 | 99 | ||
| 94 | /* consider demotion */ | 100 | /* consider demotion */ |
| 95 | if (last_idx > 0 && | 101 | if (last_idx > CPUIDLE_DRIVER_STATE_START && |
| 102 | dev->states[last_idx].exit_latency > latency_req) { | ||
| 103 | int i; | ||
| 104 | |||
| 105 | for (i = last_idx - 1; i > CPUIDLE_DRIVER_STATE_START; i--) { | ||
| 106 | if (dev->states[i].exit_latency <= latency_req) | ||
| 107 | break; | ||
| 108 | } | ||
| 109 | ladder_do_selection(ldev, last_idx, i); | ||
| 110 | return i; | ||
| 111 | } | ||
| 112 | |||
| 113 | if (last_idx > CPUIDLE_DRIVER_STATE_START && | ||
| 96 | last_residency < last_state->threshold.demotion_time) { | 114 | last_residency < last_state->threshold.demotion_time) { |
| 97 | last_state->stats.demotion_count++; | 115 | last_state->stats.demotion_count++; |
| 98 | last_state->stats.promotion_count = 0; | 116 | last_state->stats.promotion_count = 0; |
| @@ -117,7 +135,7 @@ static int ladder_enable_device(struct cpuidle_device *dev) | |||
| 117 | struct ladder_device_state *lstate; | 135 | struct ladder_device_state *lstate; |
| 118 | struct cpuidle_state *state; | 136 | struct cpuidle_state *state; |
| 119 | 137 | ||
| 120 | ldev->last_state_idx = 0; | 138 | ldev->last_state_idx = CPUIDLE_DRIVER_STATE_START; |
| 121 | 139 | ||
| 122 | for (i = 0; i < dev->state_count; i++) { | 140 | for (i = 0; i < dev->state_count; i++) { |
| 123 | state = &dev->states[i]; | 141 | state = &dev->states[i]; |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 78d77c5dc35c..8d7cf3f31450 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
| @@ -34,21 +34,28 @@ static DEFINE_PER_CPU(struct menu_device, menu_devices); | |||
| 34 | static int menu_select(struct cpuidle_device *dev) | 34 | static int menu_select(struct cpuidle_device *dev) |
| 35 | { | 35 | { |
| 36 | struct menu_device *data = &__get_cpu_var(menu_devices); | 36 | struct menu_device *data = &__get_cpu_var(menu_devices); |
| 37 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | ||
| 37 | int i; | 38 | int i; |
| 38 | 39 | ||
| 40 | /* Special case when user has set very strict latency requirement */ | ||
| 41 | if (unlikely(latency_req == 0)) { | ||
| 42 | data->last_state_idx = 0; | ||
| 43 | return 0; | ||
| 44 | } | ||
| 45 | |||
| 39 | /* determine the expected residency time */ | 46 | /* determine the expected residency time */ |
| 40 | data->expected_us = | 47 | data->expected_us = |
| 41 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; | 48 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; |
| 42 | 49 | ||
| 43 | /* find the deepest idle state that satisfies our constraints */ | 50 | /* find the deepest idle state that satisfies our constraints */ |
| 44 | for (i = 1; i < dev->state_count; i++) { | 51 | for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) { |
| 45 | struct cpuidle_state *s = &dev->states[i]; | 52 | struct cpuidle_state *s = &dev->states[i]; |
| 46 | 53 | ||
| 47 | if (s->target_residency > data->expected_us) | 54 | if (s->target_residency > data->expected_us) |
| 48 | break; | 55 | break; |
| 49 | if (s->target_residency > data->predicted_us) | 56 | if (s->target_residency > data->predicted_us) |
| 50 | break; | 57 | break; |
| 51 | if (s->exit_latency > pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) | 58 | if (s->exit_latency > latency_req) |
| 52 | break; | 59 | break; |
| 53 | } | 60 | } |
| 54 | 61 | ||
| @@ -67,9 +74,9 @@ static void menu_reflect(struct cpuidle_device *dev) | |||
| 67 | { | 74 | { |
| 68 | struct menu_device *data = &__get_cpu_var(menu_devices); | 75 | struct menu_device *data = &__get_cpu_var(menu_devices); |
| 69 | int last_idx = data->last_state_idx; | 76 | int last_idx = data->last_state_idx; |
| 70 | unsigned int measured_us = | 77 | unsigned int last_idle_us = cpuidle_get_last_residency(dev); |
| 71 | cpuidle_get_last_residency(dev) + data->elapsed_us; | ||
| 72 | struct cpuidle_state *target = &dev->states[last_idx]; | 78 | struct cpuidle_state *target = &dev->states[last_idx]; |
| 79 | unsigned int measured_us; | ||
| 73 | 80 | ||
| 74 | /* | 81 | /* |
| 75 | * Ugh, this idle state doesn't support residency measurements, so we | 82 | * Ugh, this idle state doesn't support residency measurements, so we |
| @@ -77,20 +84,27 @@ static void menu_reflect(struct cpuidle_device *dev) | |||
| 77 | * for one full standard timer tick. However, be aware that this | 84 | * for one full standard timer tick. However, be aware that this |
| 78 | * could potentially result in a suboptimal state transition. | 85 | * could potentially result in a suboptimal state transition. |
| 79 | */ | 86 | */ |
| 80 | if (!(target->flags & CPUIDLE_FLAG_TIME_VALID)) | 87 | if (unlikely(!(target->flags & CPUIDLE_FLAG_TIME_VALID))) |
| 81 | measured_us = USEC_PER_SEC / HZ; | 88 | last_idle_us = USEC_PER_SEC / HZ; |
| 89 | |||
| 90 | /* | ||
| 91 | * measured_us and elapsed_us are the cumulative idle time, since the | ||
| 92 | * last time we were woken out of idle by an interrupt. | ||
| 93 | */ | ||
| 94 | if (data->elapsed_us <= data->elapsed_us + last_idle_us) | ||
| 95 | measured_us = data->elapsed_us + last_idle_us; | ||
| 96 | else | ||
| 97 | measured_us = -1; | ||
| 98 | |||
| 99 | /* Predict time until next break event */ | ||
| 100 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
| 82 | 101 | ||
| 83 | /* Predict time remaining until next break event */ | 102 | if (last_idle_us + BREAK_FUZZ < |
| 84 | if (measured_us + BREAK_FUZZ < data->expected_us - target->exit_latency) { | 103 | data->expected_us - target->exit_latency) { |
| 85 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
| 86 | data->last_measured_us = measured_us; | 104 | data->last_measured_us = measured_us; |
| 87 | data->elapsed_us = 0; | 105 | data->elapsed_us = 0; |
| 88 | } else { | 106 | } else { |
| 89 | if (data->elapsed_us < data->elapsed_us + measured_us) | 107 | data->elapsed_us = measured_us; |
| 90 | data->elapsed_us = measured_us; | ||
| 91 | else | ||
| 92 | data->elapsed_us = -1; | ||
| 93 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
| 94 | } | 108 | } |
| 95 | } | 109 | } |
| 96 | 110 | ||
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index a4e4494663bf..0328da020a10 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/memory.h> | 27 | #include <linux/memory.h> |
| 28 | #include <asm/plat-orion/mv_xor.h> | 28 | #include <plat/mv_xor.h> |
| 29 | #include "mv_xor.h" | 29 | #include "mv_xor.h" |
| 30 | 30 | ||
| 31 | static void mv_xor_issue_pending(struct dma_chan *chan); | 31 | static void mv_xor_issue_pending(struct dma_chan *chan); |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 61e78a4369b9..b15f88249639 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -654,12 +654,12 @@ static const struct hid_blacklist { | |||
| 654 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | 654 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, |
| 655 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 655 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, |
| 656 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | 656 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, |
| 657 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN }, | 657 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
| 658 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 658 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE}, |
| 659 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN }, | 659 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE}, |
| 660 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN }, | 660 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE}, |
| 661 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 661 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE }, |
| 662 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN }, | 662 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
| 663 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | 663 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
| 664 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | 664 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
| 665 | 665 | ||
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index bf4ebfb86fa5..d402e8d813ce 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -77,6 +77,22 @@ config SENSORS_AD7418 | |||
| 77 | This driver can also be built as a module. If so, the module | 77 | This driver can also be built as a module. If so, the module |
| 78 | will be called ad7418. | 78 | will be called ad7418. |
| 79 | 79 | ||
| 80 | config SENSORS_ADCXX | ||
| 81 | tristate "National Semiconductor ADCxxxSxxx" | ||
| 82 | depends on SPI_MASTER && EXPERIMENTAL | ||
| 83 | help | ||
| 84 | If you say yes here you get support for the National Semiconductor | ||
| 85 | ADC<bb><c>S<sss> chip family, where | ||
| 86 | * bb is the resolution in number of bits (8, 10, 12) | ||
| 87 | * c is the number of channels (1, 2, 4, 8) | ||
| 88 | * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 | ||
| 89 | kSPS and 101 for 1 MSPS) | ||
| 90 | |||
| 91 | Examples : ADC081S101, ADC124S501, ... | ||
| 92 | |||
| 93 | This driver can also be built as a module. If so, the module | ||
| 94 | will be called adcxx. | ||
| 95 | |||
| 80 | config SENSORS_ADM1021 | 96 | config SENSORS_ADM1021 |
| 81 | tristate "Analog Devices ADM1021 and compatibles" | 97 | tristate "Analog Devices ADM1021 and compatibles" |
| 82 | depends on I2C | 98 | depends on I2C |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 7943e5cefb06..950134ab8426 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
| @@ -17,6 +17,7 @@ obj-$(CONFIG_SENSORS_ABITUGURU) += abituguru.o | |||
| 17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o | 17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o |
| 18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o | 18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o |
| 19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o | 19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o |
| 20 | obj-$(CONFIG_SENSORS_ADCXX) += adcxx.o | ||
| 20 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o | 21 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o |
| 21 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o | 22 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o |
| 22 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o | 23 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o |
diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c index f00f497b9ca9..d568c65c1370 100644 --- a/drivers/hwmon/abituguru3.c +++ b/drivers/hwmon/abituguru3.c | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | abituguru3.c Copyright (c) 2006 Hans de Goede <j.w.r.degoede@hhs.nl> | 2 | abituguru3.c |
| 3 | |||
| 4 | Copyright (c) 2006-2008 Hans de Goede <j.w.r.degoede@hhs.nl> | ||
| 5 | Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk> | ||
| 3 | 6 | ||
| 4 | This program is free software; you can redistribute it and/or modify | 7 | This program is free software; you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
| @@ -116,7 +119,7 @@ struct abituguru3_sensor_info { | |||
| 116 | 119 | ||
| 117 | struct abituguru3_motherboard_info { | 120 | struct abituguru3_motherboard_info { |
| 118 | u16 id; | 121 | u16 id; |
| 119 | const char *name; | 122 | const char *dmi_name; |
| 120 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ | 123 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ |
| 121 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; | 124 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; |
| 122 | }; | 125 | }; |
| @@ -161,7 +164,7 @@ struct abituguru3_data { | |||
| 161 | 164 | ||
| 162 | /* Constants */ | 165 | /* Constants */ |
| 163 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | 166 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { |
| 164 | { 0x000C, "unknown", { | 167 | { 0x000C, NULL /* Unknown, need DMI string */, { |
| 165 | { "CPU Core", 0, 0, 10, 1, 0 }, | 168 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 166 | { "DDR", 1, 0, 10, 1, 0 }, | 169 | { "DDR", 1, 0, 10, 1, 0 }, |
| 167 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 170 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -183,7 +186,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 183 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, | 186 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, |
| 184 | { NULL, 0, 0, 0, 0, 0 } } | 187 | { NULL, 0, 0, 0, 0, 0 } } |
| 185 | }, | 188 | }, |
| 186 | { 0x000D, "Abit AW8", { | 189 | { 0x000D, NULL /* Abit AW8, need DMI string */, { |
| 187 | { "CPU Core", 0, 0, 10, 1, 0 }, | 190 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 188 | { "DDR", 1, 0, 10, 1, 0 }, | 191 | { "DDR", 1, 0, 10, 1, 0 }, |
| 189 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 192 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -212,7 +215,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 212 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 215 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
| 213 | { NULL, 0, 0, 0, 0, 0 } } | 216 | { NULL, 0, 0, 0, 0, 0 } } |
| 214 | }, | 217 | }, |
| 215 | { 0x000E, "AL-8", { | 218 | { 0x000E, NULL /* AL-8, need DMI string */, { |
| 216 | { "CPU Core", 0, 0, 10, 1, 0 }, | 219 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 217 | { "DDR", 1, 0, 10, 1, 0 }, | 220 | { "DDR", 1, 0, 10, 1, 0 }, |
| 218 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 221 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -233,7 +236,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 233 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 236 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 234 | { NULL, 0, 0, 0, 0, 0 } } | 237 | { NULL, 0, 0, 0, 0, 0 } } |
| 235 | }, | 238 | }, |
| 236 | { 0x000F, "unknown", { | 239 | { 0x000F, NULL /* Unknown, need DMI string */, { |
| 237 | { "CPU Core", 0, 0, 10, 1, 0 }, | 240 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 238 | { "DDR", 1, 0, 10, 1, 0 }, | 241 | { "DDR", 1, 0, 10, 1, 0 }, |
| 239 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 242 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -254,7 +257,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 254 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 257 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 255 | { NULL, 0, 0, 0, 0, 0 } } | 258 | { NULL, 0, 0, 0, 0, 0 } } |
| 256 | }, | 259 | }, |
| 257 | { 0x0010, "Abit NI8 SLI GR", { | 260 | { 0x0010, NULL /* Abit NI8 SLI GR, need DMI string */, { |
| 258 | { "CPU Core", 0, 0, 10, 1, 0 }, | 261 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 259 | { "DDR", 1, 0, 10, 1, 0 }, | 262 | { "DDR", 1, 0, 10, 1, 0 }, |
| 260 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 263 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -276,7 +279,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 276 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, | 279 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, |
| 277 | { NULL, 0, 0, 0, 0, 0 } } | 280 | { NULL, 0, 0, 0, 0, 0 } } |
| 278 | }, | 281 | }, |
| 279 | { 0x0011, "Abit AT8 32X", { | 282 | { 0x0011, NULL /* Abit AT8 32X, need DMI string */, { |
| 280 | { "CPU Core", 0, 0, 10, 1, 0 }, | 283 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 281 | { "DDR", 1, 0, 20, 1, 0 }, | 284 | { "DDR", 1, 0, 20, 1, 0 }, |
| 282 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 285 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -302,7 +305,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 302 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, | 305 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, |
| 303 | { NULL, 0, 0, 0, 0, 0 } } | 306 | { NULL, 0, 0, 0, 0, 0 } } |
| 304 | }, | 307 | }, |
| 305 | { 0x0012, "Abit AN8 32X", { | 308 | { 0x0012, NULL /* Abit AN8 32X, need DMI string */, { |
| 306 | { "CPU Core", 0, 0, 10, 1, 0 }, | 309 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 307 | { "DDR", 1, 0, 20, 1, 0 }, | 310 | { "DDR", 1, 0, 20, 1, 0 }, |
| 308 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 311 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -324,7 +327,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 324 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, | 327 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, |
| 325 | { NULL, 0, 0, 0, 0, 0 } } | 328 | { NULL, 0, 0, 0, 0, 0 } } |
| 326 | }, | 329 | }, |
| 327 | { 0x0013, "Abit AW8D", { | 330 | { 0x0013, NULL /* Abit AW8D, need DMI string */, { |
| 328 | { "CPU Core", 0, 0, 10, 1, 0 }, | 331 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 329 | { "DDR", 1, 0, 10, 1, 0 }, | 332 | { "DDR", 1, 0, 10, 1, 0 }, |
| 330 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 333 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -353,7 +356,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 353 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 356 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
| 354 | { NULL, 0, 0, 0, 0, 0 } } | 357 | { NULL, 0, 0, 0, 0, 0 } } |
| 355 | }, | 358 | }, |
| 356 | { 0x0014, "Abit AB9 Pro", { | 359 | { 0x0014, NULL /* Abit AB9 Pro, need DMI string */, { |
| 357 | { "CPU Core", 0, 0, 10, 1, 0 }, | 360 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 358 | { "DDR", 1, 0, 10, 1, 0 }, | 361 | { "DDR", 1, 0, 10, 1, 0 }, |
| 359 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 362 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -374,7 +377,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 374 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 377 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 375 | { NULL, 0, 0, 0, 0, 0 } } | 378 | { NULL, 0, 0, 0, 0, 0 } } |
| 376 | }, | 379 | }, |
| 377 | { 0x0015, "unknown", { | 380 | { 0x0015, NULL /* Unknown, need DMI string */, { |
| 378 | { "CPU Core", 0, 0, 10, 1, 0 }, | 381 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 379 | { "DDR", 1, 0, 20, 1, 0 }, | 382 | { "DDR", 1, 0, 20, 1, 0 }, |
| 380 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 383 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -398,7 +401,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 398 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 401 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 399 | { NULL, 0, 0, 0, 0, 0 } } | 402 | { NULL, 0, 0, 0, 0, 0 } } |
| 400 | }, | 403 | }, |
| 401 | { 0x0016, "AW9D-MAX", { | 404 | { 0x0016, NULL /* AW9D-MAX, need DMI string */, { |
| 402 | { "CPU Core", 0, 0, 10, 1, 0 }, | 405 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 403 | { "DDR2", 1, 0, 20, 1, 0 }, | 406 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 404 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 407 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -426,7 +429,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 426 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, | 429 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, |
| 427 | { NULL, 0, 0, 0, 0, 0 } } | 430 | { NULL, 0, 0, 0, 0, 0 } } |
| 428 | }, | 431 | }, |
| 429 | { 0x0017, "unknown", { | 432 | { 0x0017, NULL /* Unknown, need DMI string */, { |
| 430 | { "CPU Core", 0, 0, 10, 1, 0 }, | 433 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 431 | { "DDR2", 1, 0, 20, 1, 0 }, | 434 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 432 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 435 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -451,7 +454,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 451 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, | 454 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, |
| 452 | { NULL, 0, 0, 0, 0, 0 } } | 455 | { NULL, 0, 0, 0, 0, 0 } } |
| 453 | }, | 456 | }, |
| 454 | { 0x0018, "unknown", { | 457 | { 0x0018, NULL /* Unknown, need DMI string */, { |
| 455 | { "CPU Core", 0, 0, 10, 1, 0 }, | 458 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 456 | { "DDR2", 1, 0, 20, 1, 0 }, | 459 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 457 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 460 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -478,7 +481,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 478 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 481 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 479 | { NULL, 0, 0, 0, 0, 0 } } | 482 | { NULL, 0, 0, 0, 0, 0 } } |
| 480 | }, | 483 | }, |
| 481 | { 0x0019, "unknown", { | 484 | { 0x0019, NULL /* Unknown, need DMI string */, { |
| 482 | { "CPU Core", 7, 0, 10, 1, 0 }, | 485 | { "CPU Core", 7, 0, 10, 1, 0 }, |
| 483 | { "DDR2", 13, 0, 20, 1, 0 }, | 486 | { "DDR2", 13, 0, 20, 1, 0 }, |
| 484 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, | 487 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, |
| @@ -505,7 +508,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 505 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, | 508 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, |
| 506 | { NULL, 0, 0, 0, 0, 0 } } | 509 | { NULL, 0, 0, 0, 0, 0 } } |
| 507 | }, | 510 | }, |
| 508 | { 0x001A, "Abit IP35 Pro", { | 511 | { 0x001A, "IP35 Pro(Intel P35-ICH9R)", { |
| 509 | { "CPU Core", 0, 0, 10, 1, 0 }, | 512 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 510 | { "DDR2", 1, 0, 20, 1, 0 }, | 513 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 511 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 514 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -533,7 +536,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 533 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, | 536 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, |
| 534 | { NULL, 0, 0, 0, 0, 0 } } | 537 | { NULL, 0, 0, 0, 0, 0 } } |
| 535 | }, | 538 | }, |
| 536 | { 0x001B, "unknown", { | 539 | { 0x001B, NULL /* Unknown, need DMI string */, { |
| 537 | { "CPU Core", 0, 0, 10, 1, 0 }, | 540 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 538 | { "DDR3", 1, 0, 20, 1, 0 }, | 541 | { "DDR3", 1, 0, 20, 1, 0 }, |
| 539 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, | 542 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, |
| @@ -560,7 +563,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 560 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 563 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 561 | { NULL, 0, 0, 0, 0, 0 } } | 564 | { NULL, 0, 0, 0, 0, 0 } } |
| 562 | }, | 565 | }, |
| 563 | { 0x001C, "unknown", { | 566 | { 0x001C, NULL /* Unknown, need DMI string */, { |
| 564 | { "CPU Core", 0, 0, 10, 1, 0 }, | 567 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 565 | { "DDR2", 1, 0, 20, 1, 0 }, | 568 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 566 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 569 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -935,9 +938,18 @@ static int __devinit abituguru3_probe(struct platform_device *pdev) | |||
| 935 | goto abituguru3_probe_error; | 938 | goto abituguru3_probe_error; |
| 936 | } | 939 | } |
| 937 | data->sensors = abituguru3_motherboards[i].sensors; | 940 | data->sensors = abituguru3_motherboards[i].sensors; |
| 941 | |||
| 938 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " | 942 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " |
| 939 | "ID: %04X (%s)\n", (unsigned int)id, | 943 | "ID: %04X\n", (unsigned int)id); |
| 940 | abituguru3_motherboards[i].name); | 944 | |
| 945 | #ifdef CONFIG_DMI | ||
| 946 | if (!abituguru3_motherboards[i].dmi_name) { | ||
| 947 | printk(KERN_WARNING ABIT_UGURU3_NAME ": this motherboard was " | ||
| 948 | "not detected using DMI. Please send the output of " | ||
| 949 | "\"dmidecode\" to the abituguru3 maintainer" | ||
| 950 | "(see MAINTAINERS)\n"); | ||
| 951 | } | ||
| 952 | #endif | ||
| 941 | 953 | ||
| 942 | /* Fill the sysfs attr array */ | 954 | /* Fill the sysfs attr array */ |
| 943 | sysfs_attr_i = 0; | 955 | sysfs_attr_i = 0; |
| @@ -1109,6 +1121,46 @@ static struct platform_driver abituguru3_driver = { | |||
| 1109 | .resume = abituguru3_resume | 1121 | .resume = abituguru3_resume |
| 1110 | }; | 1122 | }; |
| 1111 | 1123 | ||
| 1124 | #ifdef CONFIG_DMI | ||
| 1125 | |||
| 1126 | static int __init abituguru3_dmi_detect(void) | ||
| 1127 | { | ||
| 1128 | const char *board_vendor, *board_name; | ||
| 1129 | int i, err = (force) ? 1 : -ENODEV; | ||
| 1130 | |||
| 1131 | board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | ||
| 1132 | if (!board_vendor || strcmp(board_vendor, "http://www.abit.com.tw/")) | ||
| 1133 | return err; | ||
| 1134 | |||
| 1135 | board_name = dmi_get_system_info(DMI_BOARD_NAME); | ||
| 1136 | if (!board_name) | ||
| 1137 | return err; | ||
| 1138 | |||
| 1139 | for (i = 0; abituguru3_motherboards[i].id; i++) { | ||
| 1140 | const char *dmi_name = abituguru3_motherboards[i].dmi_name; | ||
| 1141 | if (dmi_name && !strcmp(dmi_name, board_name)) | ||
| 1142 | break; | ||
| 1143 | } | ||
| 1144 | |||
| 1145 | if (!abituguru3_motherboards[i].id) | ||
| 1146 | return 1; | ||
| 1147 | |||
| 1148 | return 0; | ||
| 1149 | } | ||
| 1150 | |||
| 1151 | #else /* !CONFIG_DMI */ | ||
| 1152 | |||
| 1153 | static inline int abituguru3_dmi_detect(void) | ||
| 1154 | { | ||
| 1155 | return -ENODEV; | ||
| 1156 | } | ||
| 1157 | |||
| 1158 | #endif /* CONFIG_DMI */ | ||
| 1159 | |||
| 1160 | /* FIXME: Manual detection should die eventually; we need to collect stable | ||
| 1161 | * DMI model names first before we can rely entirely on CONFIG_DMI. | ||
| 1162 | */ | ||
| 1163 | |||
| 1112 | static int __init abituguru3_detect(void) | 1164 | static int __init abituguru3_detect(void) |
| 1113 | { | 1165 | { |
| 1114 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or | 1166 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or |
| @@ -1119,7 +1171,7 @@ static int __init abituguru3_detect(void) | |||
| 1119 | if (((data_val == 0x00) || (data_val == 0x08)) && | 1171 | if (((data_val == 0x00) || (data_val == 0x08)) && |
| 1120 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || | 1172 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || |
| 1121 | (cmd_val == 0x55))) | 1173 | (cmd_val == 0x55))) |
| 1122 | return ABIT_UGURU3_BASE; | 1174 | return 0; |
| 1123 | 1175 | ||
| 1124 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " | 1176 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " |
| 1125 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); | 1177 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); |
| @@ -1127,7 +1179,7 @@ static int __init abituguru3_detect(void) | |||
| 1127 | if (force) { | 1179 | if (force) { |
| 1128 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " | 1180 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " |
| 1129 | "present because of \"force\" parameter\n"); | 1181 | "present because of \"force\" parameter\n"); |
| 1130 | return ABIT_UGURU3_BASE; | 1182 | return 0; |
| 1131 | } | 1183 | } |
| 1132 | 1184 | ||
| 1133 | /* No uGuru3 found */ | 1185 | /* No uGuru3 found */ |
| @@ -1138,27 +1190,29 @@ static struct platform_device *abituguru3_pdev; | |||
| 1138 | 1190 | ||
| 1139 | static int __init abituguru3_init(void) | 1191 | static int __init abituguru3_init(void) |
| 1140 | { | 1192 | { |
| 1141 | int address, err; | ||
| 1142 | struct resource res = { .flags = IORESOURCE_IO }; | 1193 | struct resource res = { .flags = IORESOURCE_IO }; |
| 1143 | 1194 | int err; | |
| 1144 | #ifdef CONFIG_DMI | 1195 | |
| 1145 | const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | 1196 | /* Attempt DMI detection first */ |
| 1146 | 1197 | err = abituguru3_dmi_detect(); | |
| 1147 | /* safety check, refuse to load on non Abit motherboards */ | 1198 | if (err < 0) |
| 1148 | if (!force && (!board_vendor || | 1199 | return err; |
| 1149 | strcmp(board_vendor, "http://www.abit.com.tw/"))) | 1200 | |
| 1150 | return -ENODEV; | 1201 | /* Fall back to manual detection if there was no exact |
| 1151 | #endif | 1202 | * board name match, or force was specified. |
| 1152 | 1203 | */ | |
| 1153 | address = abituguru3_detect(); | 1204 | if (err > 0) { |
| 1154 | if (address < 0) | 1205 | err = abituguru3_detect(); |
| 1155 | return address; | 1206 | if (err) |
| 1207 | return err; | ||
| 1208 | } | ||
| 1156 | 1209 | ||
| 1157 | err = platform_driver_register(&abituguru3_driver); | 1210 | err = platform_driver_register(&abituguru3_driver); |
| 1158 | if (err) | 1211 | if (err) |
| 1159 | goto exit; | 1212 | goto exit; |
| 1160 | 1213 | ||
| 1161 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, address); | 1214 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, |
| 1215 | ABIT_UGURU3_BASE); | ||
| 1162 | if (!abituguru3_pdev) { | 1216 | if (!abituguru3_pdev) { |
| 1163 | printk(KERN_ERR ABIT_UGURU3_NAME | 1217 | printk(KERN_ERR ABIT_UGURU3_NAME |
| 1164 | ": Device allocation failed\n"); | 1218 | ": Device allocation failed\n"); |
| @@ -1166,8 +1220,8 @@ static int __init abituguru3_init(void) | |||
| 1166 | goto exit_driver_unregister; | 1220 | goto exit_driver_unregister; |
| 1167 | } | 1221 | } |
| 1168 | 1222 | ||
| 1169 | res.start = address; | 1223 | res.start = ABIT_UGURU3_BASE; |
| 1170 | res.end = address + ABIT_UGURU3_REGION_LENGTH - 1; | 1224 | res.end = ABIT_UGURU3_BASE + ABIT_UGURU3_REGION_LENGTH - 1; |
| 1171 | res.name = ABIT_UGURU3_NAME; | 1225 | res.name = ABIT_UGURU3_NAME; |
| 1172 | 1226 | ||
| 1173 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); | 1227 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); |
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c new file mode 100644 index 000000000000..242294db3db6 --- /dev/null +++ b/drivers/hwmon/adcxx.c | |||
| @@ -0,0 +1,329 @@ | |||
| 1 | /* | ||
| 2 | * adcxx.c | ||
| 3 | * | ||
| 4 | * The adcxx4s is an AD converter family from National Semiconductor (NS). | ||
| 5 | * | ||
| 6 | * Copyright (c) 2008 Marc Pignat <marc.pignat@hevs.ch> | ||
| 7 | * | ||
| 8 | * The adcxx4s communicates with a host processor via an SPI/Microwire Bus | ||
| 9 | * interface. This driver supports the whole family of devices with name | ||
| 10 | * ADC<bb><c>S<sss>, where | ||
| 11 | * * bb is the resolution in number of bits (8, 10, 12) | ||
| 12 | * * c is the number of channels (1, 2, 4, 8) | ||
| 13 | * * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 kSPS | ||
| 14 | * and 101 for 1 MSPS) | ||
| 15 | * | ||
| 16 | * Complete datasheets are available at National's website here: | ||
| 17 | * http://www.national.com/ds/DC/ADC<bb><c>S<sss>.pdf | ||
| 18 | * | ||
| 19 | * Handling of 8, 10 and 12 bits converters are the same, the | ||
| 20 | * unavailable bits are 0 :) | ||
| 21 | * | ||
| 22 | * This program is free software; you can redistribute it and/or modify | ||
| 23 | * it under the terms of the GNU General Public License as published by | ||
| 24 | * the Free Software Foundation; either version 2 of the License, or | ||
| 25 | * (at your option) any later version. | ||
| 26 | * | ||
| 27 | * This program is distributed in the hope that it will be useful, | ||
| 28 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 29 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 30 | * GNU General Public License for more details. | ||
| 31 | * | ||
| 32 | * You should have received a copy of the GNU General Public License | ||
| 33 | * along with this program; if not, write to the Free Software | ||
| 34 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 35 | */ | ||
| 36 | |||
| 37 | #include <linux/init.h> | ||
| 38 | #include <linux/module.h> | ||
| 39 | #include <linux/kernel.h> | ||
| 40 | #include <linux/device.h> | ||
| 41 | #include <linux/err.h> | ||
| 42 | #include <linux/sysfs.h> | ||
| 43 | #include <linux/hwmon.h> | ||
| 44 | #include <linux/hwmon-sysfs.h> | ||
| 45 | #include <linux/mutex.h> | ||
| 46 | #include <linux/spi/spi.h> | ||
| 47 | |||
| 48 | #define DRVNAME "adcxx" | ||
| 49 | |||
| 50 | struct adcxx { | ||
| 51 | struct device *hwmon_dev; | ||
| 52 | struct mutex lock; | ||
| 53 | u32 channels; | ||
| 54 | u32 reference; /* in millivolts */ | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* sysfs hook function */ | ||
| 58 | static ssize_t adcxx_read(struct device *dev, | ||
| 59 | struct device_attribute *devattr, char *buf) | ||
| 60 | { | ||
| 61 | struct spi_device *spi = to_spi_device(dev); | ||
| 62 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
| 63 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 64 | u8 tx_buf[2] = { attr->index << 3 }; /* other bits are don't care */ | ||
| 65 | u8 rx_buf[2]; | ||
| 66 | int status; | ||
| 67 | int value; | ||
| 68 | |||
| 69 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 70 | return -ERESTARTSYS; | ||
| 71 | |||
| 72 | status = spi_write_then_read(spi, tx_buf, sizeof(tx_buf), | ||
| 73 | rx_buf, sizeof(rx_buf)); | ||
| 74 | if (status < 0) { | ||
| 75 | dev_warn(dev, "spi_write_then_read failed with status %d\n", | ||
| 76 | status); | ||
| 77 | goto out; | ||
| 78 | } | ||
| 79 | |||
| 80 | value = (rx_buf[0] << 8) + rx_buf[1]; | ||
| 81 | dev_dbg(dev, "raw value = 0x%x\n", value); | ||
| 82 | |||
| 83 | value = value * adc->reference >> 12; | ||
| 84 | status = sprintf(buf, "%d\n", value); | ||
| 85 | out: | ||
| 86 | mutex_unlock(&adc->lock); | ||
| 87 | return status; | ||
| 88 | } | ||
| 89 | |||
| 90 | static ssize_t adcxx_show_min(struct device *dev, | ||
| 91 | struct device_attribute *devattr, char *buf) | ||
| 92 | { | ||
| 93 | /* The minimum reference is 0 for this chip family */ | ||
| 94 | return sprintf(buf, "0\n"); | ||
| 95 | } | ||
| 96 | |||
| 97 | static ssize_t adcxx_show_max(struct device *dev, | ||
| 98 | struct device_attribute *devattr, char *buf) | ||
| 99 | { | ||
| 100 | struct spi_device *spi = to_spi_device(dev); | ||
| 101 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 102 | u32 reference; | ||
| 103 | |||
| 104 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 105 | return -ERESTARTSYS; | ||
| 106 | |||
| 107 | reference = adc->reference; | ||
| 108 | |||
| 109 | mutex_unlock(&adc->lock); | ||
| 110 | |||
| 111 | return sprintf(buf, "%d\n", reference); | ||
| 112 | } | ||
| 113 | |||
| 114 | static ssize_t adcxx_set_max(struct device *dev, | ||
| 115 | struct device_attribute *devattr, const char *buf, size_t count) | ||
| 116 | { | ||
| 117 | struct spi_device *spi = to_spi_device(dev); | ||
| 118 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 119 | unsigned long value; | ||
| 120 | |||
| 121 | if (strict_strtoul(buf, 10, &value)) | ||
| 122 | return -EINVAL; | ||
| 123 | |||
| 124 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 125 | return -ERESTARTSYS; | ||
| 126 | |||
| 127 | adc->reference = value; | ||
| 128 | |||
| 129 | mutex_unlock(&adc->lock); | ||
| 130 | |||
| 131 | return count; | ||
| 132 | } | ||
| 133 | |||
| 134 | static ssize_t adcxx_show_name(struct device *dev, struct device_attribute | ||
| 135 | *devattr, char *buf) | ||
| 136 | { | ||
| 137 | struct spi_device *spi = to_spi_device(dev); | ||
| 138 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 139 | |||
| 140 | return sprintf(buf, "adcxx%ds\n", adc->channels); | ||
| 141 | } | ||
| 142 | |||
| 143 | static struct sensor_device_attribute ad_input[] = { | ||
| 144 | SENSOR_ATTR(name, S_IRUGO, adcxx_show_name, NULL, 0), | ||
| 145 | SENSOR_ATTR(in_min, S_IRUGO, adcxx_show_min, NULL, 0), | ||
| 146 | SENSOR_ATTR(in_max, S_IWUSR | S_IRUGO, adcxx_show_max, | ||
| 147 | adcxx_set_max, 0), | ||
| 148 | SENSOR_ATTR(in0_input, S_IRUGO, adcxx_read, NULL, 0), | ||
| 149 | SENSOR_ATTR(in1_input, S_IRUGO, adcxx_read, NULL, 1), | ||
| 150 | SENSOR_ATTR(in2_input, S_IRUGO, adcxx_read, NULL, 2), | ||
| 151 | SENSOR_ATTR(in3_input, S_IRUGO, adcxx_read, NULL, 3), | ||
| 152 | SENSOR_ATTR(in4_input, S_IRUGO, adcxx_read, NULL, 4), | ||
| 153 | SENSOR_ATTR(in5_input, S_IRUGO, adcxx_read, NULL, 5), | ||
| 154 | SENSOR_ATTR(in6_input, S_IRUGO, adcxx_read, NULL, 6), | ||
| 155 | SENSOR_ATTR(in7_input, S_IRUGO, adcxx_read, NULL, 7), | ||
| 156 | }; | ||
| 157 | |||
| 158 | /*----------------------------------------------------------------------*/ | ||
| 159 | |||
| 160 | static int __devinit adcxx_probe(struct spi_device *spi, int channels) | ||
| 161 | { | ||
| 162 | struct adcxx *adc; | ||
| 163 | int status; | ||
| 164 | int i; | ||
| 165 | |||
| 166 | adc = kzalloc(sizeof *adc, GFP_KERNEL); | ||
| 167 | if (!adc) | ||
| 168 | return -ENOMEM; | ||
| 169 | |||
| 170 | /* set a default value for the reference */ | ||
| 171 | adc->reference = 3300; | ||
| 172 | adc->channels = channels; | ||
| 173 | mutex_init(&adc->lock); | ||
| 174 | |||
| 175 | mutex_lock(&adc->lock); | ||
| 176 | |||
| 177 | dev_set_drvdata(&spi->dev, adc); | ||
| 178 | |||
| 179 | for (i = 0; i < 3 + adc->channels; i++) { | ||
| 180 | status = device_create_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 181 | if (status) { | ||
| 182 | dev_err(&spi->dev, "device_create_file failed.\n"); | ||
| 183 | goto out_err; | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | adc->hwmon_dev = hwmon_device_register(&spi->dev); | ||
| 188 | if (IS_ERR(adc->hwmon_dev)) { | ||
| 189 | dev_err(&spi->dev, "hwmon_device_register failed.\n"); | ||
| 190 | status = PTR_ERR(adc->hwmon_dev); | ||
| 191 | goto out_err; | ||
| 192 | } | ||
| 193 | |||
| 194 | mutex_unlock(&adc->lock); | ||
| 195 | return 0; | ||
| 196 | |||
| 197 | out_err: | ||
| 198 | for (i--; i >= 0; i--) | ||
| 199 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 200 | |||
| 201 | dev_set_drvdata(&spi->dev, NULL); | ||
| 202 | mutex_unlock(&adc->lock); | ||
| 203 | kfree(adc); | ||
| 204 | return status; | ||
| 205 | } | ||
| 206 | |||
| 207 | static int __devinit adcxx1s_probe(struct spi_device *spi) | ||
| 208 | { | ||
| 209 | return adcxx_probe(spi, 1); | ||
| 210 | } | ||
| 211 | |||
| 212 | static int __devinit adcxx2s_probe(struct spi_device *spi) | ||
| 213 | { | ||
| 214 | return adcxx_probe(spi, 2); | ||
| 215 | } | ||
| 216 | |||
| 217 | static int __devinit adcxx4s_probe(struct spi_device *spi) | ||
| 218 | { | ||
| 219 | return adcxx_probe(spi, 4); | ||
| 220 | } | ||
| 221 | |||
| 222 | static int __devinit adcxx8s_probe(struct spi_device *spi) | ||
| 223 | { | ||
| 224 | return adcxx_probe(spi, 8); | ||
| 225 | } | ||
| 226 | |||
| 227 | static int __devexit adcxx_remove(struct spi_device *spi) | ||
| 228 | { | ||
| 229 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 230 | int i; | ||
| 231 | |||
| 232 | mutex_lock(&adc->lock); | ||
| 233 | hwmon_device_unregister(adc->hwmon_dev); | ||
| 234 | for (i = 0; i < 3 + adc->channels; i++) | ||
| 235 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 236 | |||
| 237 | dev_set_drvdata(&spi->dev, NULL); | ||
| 238 | mutex_unlock(&adc->lock); | ||
| 239 | kfree(adc); | ||
| 240 | |||
| 241 | return 0; | ||
| 242 | } | ||
| 243 | |||
| 244 | static struct spi_driver adcxx1s_driver = { | ||
| 245 | .driver = { | ||
| 246 | .name = "adcxx1s", | ||
| 247 | .owner = THIS_MODULE, | ||
| 248 | }, | ||
| 249 | .probe = adcxx1s_probe, | ||
| 250 | .remove = __devexit_p(adcxx_remove), | ||
| 251 | }; | ||
| 252 | |||
| 253 | static struct spi_driver adcxx2s_driver = { | ||
| 254 | .driver = { | ||
| 255 | .name = "adcxx2s", | ||
| 256 | .owner = THIS_MODULE, | ||
| 257 | }, | ||
| 258 | .probe = adcxx2s_probe, | ||
| 259 | .remove = __devexit_p(adcxx_remove), | ||
| 260 | }; | ||
| 261 | |||
| 262 | static struct spi_driver adcxx4s_driver = { | ||
| 263 | .driver = { | ||
| 264 | .name = "adcxx4s", | ||
| 265 | .owner = THIS_MODULE, | ||
| 266 | }, | ||
| 267 | .probe = adcxx4s_probe, | ||
| 268 | .remove = __devexit_p(adcxx_remove), | ||
| 269 | }; | ||
| 270 | |||
| 271 | static struct spi_driver adcxx8s_driver = { | ||
| 272 | .driver = { | ||
| 273 | .name = "adcxx8s", | ||
| 274 | .owner = THIS_MODULE, | ||
| 275 | }, | ||
| 276 | .probe = adcxx8s_probe, | ||
| 277 | .remove = __devexit_p(adcxx_remove), | ||
| 278 | }; | ||
| 279 | |||
| 280 | static int __init init_adcxx(void) | ||
| 281 | { | ||
| 282 | int status; | ||
| 283 | status = spi_register_driver(&adcxx1s_driver); | ||
| 284 | if (status) | ||
| 285 | goto reg_1_failed; | ||
| 286 | |||
| 287 | status = spi_register_driver(&adcxx2s_driver); | ||
| 288 | if (status) | ||
| 289 | goto reg_2_failed; | ||
| 290 | |||
| 291 | status = spi_register_driver(&adcxx4s_driver); | ||
| 292 | if (status) | ||
| 293 | goto reg_4_failed; | ||
| 294 | |||
| 295 | status = spi_register_driver(&adcxx8s_driver); | ||
| 296 | if (status) | ||
| 297 | goto reg_8_failed; | ||
| 298 | |||
| 299 | return status; | ||
| 300 | |||
| 301 | reg_8_failed: | ||
| 302 | spi_unregister_driver(&adcxx4s_driver); | ||
| 303 | reg_4_failed: | ||
| 304 | spi_unregister_driver(&adcxx2s_driver); | ||
| 305 | reg_2_failed: | ||
| 306 | spi_unregister_driver(&adcxx1s_driver); | ||
| 307 | reg_1_failed: | ||
| 308 | return status; | ||
| 309 | } | ||
| 310 | |||
| 311 | static void __exit exit_adcxx(void) | ||
| 312 | { | ||
| 313 | spi_unregister_driver(&adcxx1s_driver); | ||
| 314 | spi_unregister_driver(&adcxx2s_driver); | ||
| 315 | spi_unregister_driver(&adcxx4s_driver); | ||
| 316 | spi_unregister_driver(&adcxx8s_driver); | ||
| 317 | } | ||
| 318 | |||
| 319 | module_init(init_adcxx); | ||
| 320 | module_exit(exit_adcxx); | ||
| 321 | |||
| 322 | MODULE_AUTHOR("Marc Pignat"); | ||
| 323 | MODULE_DESCRIPTION("National Semiconductor adcxx8sxxx Linux driver"); | ||
| 324 | MODULE_LICENSE("GPL"); | ||
| 325 | |||
| 326 | MODULE_ALIAS("adcxx1s"); | ||
| 327 | MODULE_ALIAS("adcxx2s"); | ||
| 328 | MODULE_ALIAS("adcxx4s"); | ||
| 329 | MODULE_ALIAS("adcxx8s"); | ||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index aacc0c4b809c..b06b8e090a27 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -98,6 +98,12 @@ static const char* temperature_sensors_sets[][36] = { | |||
| 98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", | 98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", |
| 99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", | 99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", |
| 100 | "TM9S", "TN0H", "TS0C", NULL }, | 100 | "TM9S", "TN0H", "TS0C", NULL }, |
| 101 | /* Set 5: iMac */ | ||
| 102 | { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P", | ||
| 103 | "Tp0C", NULL }, | ||
| 104 | /* Set 6: Macbook3 set */ | ||
| 105 | { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H", | ||
| 106 | "Th0S", "Th1H", NULL }, | ||
| 101 | }; | 107 | }; |
| 102 | 108 | ||
| 103 | /* List of keys used to read/write fan speeds */ | 109 | /* List of keys used to read/write fan speeds */ |
| @@ -1223,6 +1229,10 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
| 1223 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, | 1229 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, |
| 1224 | /* MacPro: temperature set 4 */ | 1230 | /* MacPro: temperature set 4 */ |
| 1225 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, | 1231 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, |
| 1232 | /* iMac: temperature set 5 */ | ||
| 1233 | { .accelerometer = 0, .light = 0, .temperature_set = 5 }, | ||
| 1234 | /* MacBook3: accelerometer and temperature set 6 */ | ||
| 1235 | { .accelerometer = 1, .light = 0, .temperature_set = 6 }, | ||
| 1226 | }; | 1236 | }; |
| 1227 | 1237 | ||
| 1228 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1238 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
| @@ -1232,10 +1242,14 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1232 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1242 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1233 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, | 1243 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, |
| 1234 | (void*)&applesmc_dmi_data[0]}, | 1244 | (void*)&applesmc_dmi_data[0]}, |
| 1235 | { applesmc_dmi_match, "Apple MacBook", { | 1245 | { applesmc_dmi_match, "Apple MacBook (v2)", { |
| 1236 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1246 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1237 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, | 1247 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, |
| 1238 | (void*)&applesmc_dmi_data[1]}, | 1248 | (void*)&applesmc_dmi_data[1]}, |
| 1249 | { applesmc_dmi_match, "Apple MacBook (v3)", { | ||
| 1250 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
| 1251 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") }, | ||
| 1252 | (void*)&applesmc_dmi_data[6]}, | ||
| 1239 | { applesmc_dmi_match, "Apple MacBook", { | 1253 | { applesmc_dmi_match, "Apple MacBook", { |
| 1240 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1254 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1241 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, | 1255 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, |
| @@ -1248,6 +1262,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1248 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1262 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1249 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1263 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
| 1250 | (void*)&applesmc_dmi_data[4]}, | 1264 | (void*)&applesmc_dmi_data[4]}, |
| 1265 | { applesmc_dmi_match, "Apple iMac", { | ||
| 1266 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
| 1267 | DMI_MATCH(DMI_PRODUCT_NAME,"iMac") }, | ||
| 1268 | (void*)&applesmc_dmi_data[5]}, | ||
| 1251 | { .ident = NULL } | 1269 | { .ident = NULL } |
| 1252 | }; | 1270 | }; |
| 1253 | 1271 | ||
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 70239acecc8e..93c17223b527 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
| @@ -413,10 +413,11 @@ static int __init coretemp_init(void) | |||
| 413 | for_each_online_cpu(i) { | 413 | for_each_online_cpu(i) { |
| 414 | struct cpuinfo_x86 *c = &cpu_data(i); | 414 | struct cpuinfo_x86 *c = &cpu_data(i); |
| 415 | 415 | ||
| 416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17 */ | 416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A */ |
| 417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || | 417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || |
| 418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || | 418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || |
| 419 | (c->x86_model == 0x16) || (c->x86_model == 0x17))) { | 419 | (c->x86_model == 0x16) || (c->x86_model == 0x17) || |
| 420 | (c->x86_model == 0x1A))) { | ||
| 420 | 421 | ||
| 421 | /* supported CPU not found, but report the unknown | 422 | /* supported CPU not found, but report the unknown |
| 422 | family 6 CPU */ | 423 | family 6 CPU */ |
diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c index 7b0a32c4dcfb..c54eff92be4a 100644 --- a/drivers/hwmon/hwmon-vid.c +++ b/drivers/hwmon/hwmon-vid.c | |||
| @@ -37,13 +37,21 @@ | |||
| 37 | * For VRD 10.0 and up, "VRD x.y Design Guide", | 37 | * For VRD 10.0 and up, "VRD x.y Design Guide", |
| 38 | * available at http://developer.intel.com/. | 38 | * available at http://developer.intel.com/. |
| 39 | * | 39 | * |
| 40 | * AMD NPT 0Fh (Athlon64 & Opteron), AMD Publication 32559, | 40 | * AMD Athlon 64 and AMD Opteron Processors, AMD Publication 26094, |
| 41 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26094.PDF | ||
| 42 | * Table 74. VID Code Voltages | ||
| 43 | * This corresponds to an arbitrary VRM code of 24 in the functions below. | ||
| 44 | * These CPU models (K8 revision <= E) have 5 VID pins. See also: | ||
| 45 | * Revision Guide for AMD Athlon 64 and AMD Opteron Processors, AMD Publication 25759, | ||
| 46 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25759.pdf | ||
| 47 | * | ||
| 48 | * AMD NPT Family 0Fh Processors, AMD Publication 32559, | ||
| 41 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf | 49 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf |
| 42 | * Table 71. VID Code Voltages | 50 | * Table 71. VID Code Voltages |
| 43 | * AMD Opteron processors don't follow the Intel specifications. | 51 | * This corresponds to an arbitrary VRM code of 25 in the functions below. |
| 44 | * I'm going to "make up" 2.4 as the spec number for the Opterons. | 52 | * These CPU models (K8 revision >= F) have 6 VID pins. See also: |
| 45 | * No good reason just a mnemonic for the 24x Opteron processor | 53 | * Revision Guide for AMD NPT Family 0Fh Processors, AMD Publication 33610, |
| 46 | * series. | 54 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33610.pdf |
| 47 | * | 55 | * |
| 48 | * The 17 specification is in fact Intel Mobile Voltage Positioning - | 56 | * The 17 specification is in fact Intel Mobile Voltage Positioning - |
| 49 | * (IMVP-II). You can find more information in the datasheet of Max1718 | 57 | * (IMVP-II). You can find more information in the datasheet of Max1718 |
| @@ -95,7 +103,12 @@ int vid_from_reg(int val, u8 vrm) | |||
| 95 | return 0; | 103 | return 0; |
| 96 | return((1600000 - (val - 2) * 6250 + 500) / 1000); | 104 | return((1600000 - (val - 2) * 6250 + 500) / 1000); |
| 97 | 105 | ||
| 98 | case 24: /* AMD NPT 0Fh (Athlon64 & Opteron) */ | 106 | case 24: /* Athlon64 & Opteron */ |
| 107 | val &= 0x1f; | ||
| 108 | if (val == 0x1f) | ||
| 109 | return 0; | ||
| 110 | /* fall through */ | ||
| 111 | case 25: /* AMD NPT 0Fh */ | ||
| 99 | val &= 0x3f; | 112 | val &= 0x3f; |
| 100 | return (val < 32) ? 1550 - 25 * val | 113 | return (val < 32) ? 1550 - 25 * val |
| 101 | : 775 - (25 * (val - 31)) / 2; | 114 | : 775 - (25 * (val - 31)) / 2; |
| @@ -157,11 +170,16 @@ struct vrm_model { | |||
| 157 | 170 | ||
| 158 | #ifdef CONFIG_X86 | 171 | #ifdef CONFIG_X86 |
| 159 | 172 | ||
| 160 | /* the stepping parameter is highest acceptable stepping for current line */ | 173 | /* |
| 174 | * The stepping parameter is highest acceptable stepping for current line. | ||
| 175 | * The model match must be exact for 4-bit values. For model values 0x10 | ||
| 176 | * and above (extended model), all models below the parameter will match. | ||
| 177 | */ | ||
| 161 | 178 | ||
| 162 | static struct vrm_model vrm_models[] = { | 179 | static struct vrm_model vrm_models[] = { |
| 163 | {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ | 180 | {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ |
| 164 | {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */ | 181 | {X86_VENDOR_AMD, 0xF, 0x3F, ANY, 24}, /* Athlon 64, Opteron */ |
| 182 | {X86_VENDOR_AMD, 0xF, ANY, ANY, 25}, /* NPT family 0Fh */ | ||
| 165 | {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */ | 183 | {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */ |
| 166 | {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ | 184 | {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ |
| 167 | {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */ | 185 | {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */ |
| @@ -189,6 +207,8 @@ static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor) | |||
| 189 | if (vrm_models[i].vendor==vendor) | 207 | if (vrm_models[i].vendor==vendor) |
| 190 | if ((vrm_models[i].eff_family==eff_family) | 208 | if ((vrm_models[i].eff_family==eff_family) |
| 191 | && ((vrm_models[i].eff_model==eff_model) || | 209 | && ((vrm_models[i].eff_model==eff_model) || |
| 210 | (vrm_models[i].eff_model >= 0x10 && | ||
| 211 | eff_model <= vrm_models[i].eff_model) || | ||
| 192 | (vrm_models[i].eff_model==ANY)) && | 212 | (vrm_models[i].eff_model==ANY)) && |
| 193 | (eff_stepping <= vrm_models[i].eff_stepping)) | 213 | (eff_stepping <= vrm_models[i].eff_stepping)) |
| 194 | return vrm_models[i].vrm_type; | 214 | return vrm_models[i].vrm_type; |
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c index f9e2ed621f7b..2ede9388096b 100644 --- a/drivers/hwmon/i5k_amb.c +++ b/drivers/hwmon/i5k_amb.c | |||
| @@ -81,6 +81,8 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
| 81 | #define MAX_AMBS_PER_CHANNEL 16 | 81 | #define MAX_AMBS_PER_CHANNEL 16 |
| 82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ | 82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ |
| 83 | MAX_AMBS_PER_CHANNEL) | 83 | MAX_AMBS_PER_CHANNEL) |
| 84 | #define CHANNEL_SHIFT 4 | ||
| 85 | #define DIMM_MASK 0xF | ||
| 84 | /* | 86 | /* |
| 85 | * Ugly hack: For some reason the highest bit is set if there | 87 | * Ugly hack: For some reason the highest bit is set if there |
| 86 | * are _any_ DIMMs in the channel. Attempting to read from | 88 | * are _any_ DIMMs in the channel. Attempting to read from |
| @@ -89,7 +91,7 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
| 89 | * might prevent us from seeing the 16th DIMM in the channel. | 91 | * might prevent us from seeing the 16th DIMM in the channel. |
| 90 | */ | 92 | */ |
| 91 | #define REAL_MAX_AMBS_PER_CHANNEL 15 | 93 | #define REAL_MAX_AMBS_PER_CHANNEL 15 |
| 92 | #define KNOBS_PER_AMB 5 | 94 | #define KNOBS_PER_AMB 6 |
| 93 | 95 | ||
| 94 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) | 96 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) |
| 95 | { | 97 | { |
| @@ -238,6 +240,16 @@ static ssize_t show_amb_temp(struct device *dev, | |||
| 238 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); | 240 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); |
| 239 | } | 241 | } |
| 240 | 242 | ||
| 243 | static ssize_t show_label(struct device *dev, | ||
| 244 | struct device_attribute *devattr, | ||
| 245 | char *buf) | ||
| 246 | { | ||
| 247 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
| 248 | |||
| 249 | return sprintf(buf, "Ch. %d DIMM %d\n", attr->index >> CHANNEL_SHIFT, | ||
| 250 | attr->index & DIMM_MASK); | ||
| 251 | } | ||
| 252 | |||
| 241 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | 253 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) |
| 242 | { | 254 | { |
| 243 | int i, j, k, d = 0; | 255 | int i, j, k, d = 0; |
| @@ -268,6 +280,20 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 268 | continue; | 280 | continue; |
| 269 | d++; | 281 | d++; |
| 270 | 282 | ||
| 283 | /* sysfs label */ | ||
| 284 | iattr = data->attrs + data->num_attrs; | ||
| 285 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | ||
| 286 | "temp%d_label", d); | ||
| 287 | iattr->s_attr.dev_attr.attr.name = iattr->name; | ||
| 288 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | ||
| 289 | iattr->s_attr.dev_attr.show = show_label; | ||
| 290 | iattr->s_attr.index = k; | ||
| 291 | res = device_create_file(&pdev->dev, | ||
| 292 | &iattr->s_attr.dev_attr); | ||
| 293 | if (res) | ||
| 294 | goto exit_remove; | ||
| 295 | data->num_attrs++; | ||
| 296 | |||
| 271 | /* Temperature sysfs knob */ | 297 | /* Temperature sysfs knob */ |
| 272 | iattr = data->attrs + data->num_attrs; | 298 | iattr = data->attrs + data->num_attrs; |
| 273 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | 299 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, |
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index c9416e657487..0f70dc204105 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * A hwmon driver for the IBM Active Energy Manager temperature/power sensors | 2 | * A hwmon driver for the IBM System Director Active Energy Manager (AEM) |
| 3 | * and capping functionality. | 3 | * temperature/power/energy sensors and capping functionality. |
| 4 | * Copyright (C) 2008 IBM | 4 | * Copyright (C) 2008 IBM |
| 5 | * | 5 | * |
| 6 | * Author: Darrick J. Wong <djwong@us.ibm.com> | 6 | * Author: Darrick J. Wong <djwong@us.ibm.com> |
| @@ -463,12 +463,18 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
| 463 | } | 463 | } |
| 464 | 464 | ||
| 465 | /* Update AEM energy registers */ | 465 | /* Update AEM energy registers */ |
| 466 | static void update_aem_energy_one(struct aem_data *data, int which) | ||
| 467 | { | ||
| 468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, which, | ||
| 469 | &data->energy[which], 8); | ||
| 470 | } | ||
| 471 | |||
| 466 | static void update_aem_energy(struct aem_data *data) | 472 | static void update_aem_energy(struct aem_data *data) |
| 467 | { | 473 | { |
| 468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 0, &data->energy[0], 8); | 474 | update_aem_energy_one(data, 0); |
| 469 | if (data->ver_major < 2) | 475 | if (data->ver_major < 2) |
| 470 | return; | 476 | return; |
| 471 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 1, &data->energy[1], 8); | 477 | update_aem_energy_one(data, 1); |
| 472 | } | 478 | } |
| 473 | 479 | ||
| 474 | /* Update all AEM1 sensors */ | 480 | /* Update all AEM1 sensors */ |
| @@ -676,7 +682,8 @@ static int aem_find_aem2(struct aem_ipmi_data *data, | |||
| 676 | return -ETIMEDOUT; | 682 | return -ETIMEDOUT; |
| 677 | 683 | ||
| 678 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || | 684 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || |
| 679 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id))) | 685 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)) || |
| 686 | fi_resp->num_instances <= instance_num) | ||
| 680 | return -ENOENT; | 687 | return -ENOENT; |
| 681 | 688 | ||
| 682 | return 0; | 689 | return 0; |
| @@ -849,7 +856,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
| 849 | struct timespec b, a; | 856 | struct timespec b, a; |
| 850 | 857 | ||
| 851 | mutex_lock(&data->lock); | 858 | mutex_lock(&data->lock); |
| 852 | update_aem_energy(data); | 859 | update_aem_energy_one(data, attr->index); |
| 853 | getnstimeofday(&b); | 860 | getnstimeofday(&b); |
| 854 | before = data->energy[attr->index]; | 861 | before = data->energy[attr->index]; |
| 855 | 862 | ||
| @@ -861,7 +868,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
| 861 | return 0; | 868 | return 0; |
| 862 | } | 869 | } |
| 863 | 870 | ||
| 864 | update_aem_energy(data); | 871 | update_aem_energy_one(data, attr->index); |
| 865 | getnstimeofday(&a); | 872 | getnstimeofday(&a); |
| 866 | after = data->energy[attr->index]; | 873 | after = data->energy[attr->index]; |
| 867 | mutex_unlock(&data->lock); | 874 | mutex_unlock(&data->lock); |
| @@ -880,7 +887,9 @@ static ssize_t aem_show_energy(struct device *dev, | |||
| 880 | { | 887 | { |
| 881 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 888 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 882 | struct aem_data *a = dev_get_drvdata(dev); | 889 | struct aem_data *a = dev_get_drvdata(dev); |
| 883 | a->update(a); | 890 | mutex_lock(&a->lock); |
| 891 | update_aem_energy_one(a, attr->index); | ||
| 892 | mutex_unlock(&a->lock); | ||
| 884 | 893 | ||
| 885 | return sprintf(buf, "%llu\n", | 894 | return sprintf(buf, "%llu\n", |
| 886 | (unsigned long long)a->energy[attr->index] * 1000); | 895 | (unsigned long long)a->energy[attr->index] * 1000); |
| @@ -1104,7 +1113,7 @@ static void __exit aem_exit(void) | |||
| 1104 | } | 1113 | } |
| 1105 | 1114 | ||
| 1106 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1115 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); |
| 1107 | MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver"); | 1116 | MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); |
| 1108 | MODULE_LICENSE("GPL"); | 1117 | MODULE_LICENSE("GPL"); |
| 1109 | 1118 | ||
| 1110 | module_init(aem_init); | 1119 | module_init(aem_init); |
diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c index daa7d121483b..de21142d106c 100644 --- a/drivers/hwmon/w83791d.c +++ b/drivers/hwmon/w83791d.c | |||
| @@ -1055,9 +1055,10 @@ static int w83791d_probe(struct i2c_client *client, | |||
| 1055 | { | 1055 | { |
| 1056 | struct w83791d_data *data; | 1056 | struct w83791d_data *data; |
| 1057 | struct device *dev = &client->dev; | 1057 | struct device *dev = &client->dev; |
| 1058 | int i, val1, err; | 1058 | int i, err; |
| 1059 | 1059 | ||
| 1060 | #ifdef DEBUG | 1060 | #ifdef DEBUG |
| 1061 | int val1; | ||
| 1061 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); | 1062 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); |
| 1062 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", | 1063 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", |
| 1063 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); | 1064 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 2d65411f6763..a92d81567559 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
| @@ -647,6 +647,47 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p) | |||
| 647 | return copy_to_user(p, str, len) ? -EFAULT : len; | 647 | return copy_to_user(p, str, len) ? -EFAULT : len; |
| 648 | } | 648 | } |
| 649 | 649 | ||
| 650 | #define OLD_KEY_MAX 0x1ff | ||
| 651 | static int handle_eviocgbit(struct input_dev *dev, unsigned int cmd, void __user *p, int compat_mode) | ||
| 652 | { | ||
| 653 | static unsigned long keymax_warn_time; | ||
| 654 | unsigned long *bits; | ||
| 655 | int len; | ||
| 656 | |||
| 657 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
| 658 | |||
| 659 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
| 660 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
| 661 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
| 662 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
| 663 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
| 664 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
| 665 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
| 666 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
| 667 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
| 668 | default: return -EINVAL; | ||
| 669 | } | ||
| 670 | |||
| 671 | /* | ||
| 672 | * Work around bugs in userspace programs that like to do | ||
| 673 | * EVIOCGBIT(EV_KEY, KEY_MAX) and not realize that 'len' | ||
| 674 | * should be in bytes, not in bits. | ||
| 675 | */ | ||
| 676 | if ((_IOC_NR(cmd) & EV_MAX) == EV_KEY && _IOC_SIZE(cmd) == OLD_KEY_MAX) { | ||
| 677 | len = OLD_KEY_MAX; | ||
| 678 | if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000)) | ||
| 679 | printk(KERN_WARNING | ||
| 680 | "evdev.c(EVIOCGBIT): Suspicious buffer size %d, " | ||
| 681 | "limiting output to %d bytes. See " | ||
| 682 | "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n", | ||
| 683 | OLD_KEY_MAX, | ||
| 684 | BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long)); | ||
| 685 | } | ||
| 686 | |||
| 687 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
| 688 | } | ||
| 689 | #undef OLD_KEY_MAX | ||
| 690 | |||
| 650 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, | 691 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, |
| 651 | void __user *p, int compat_mode) | 692 | void __user *p, int compat_mode) |
| 652 | { | 693 | { |
| @@ -733,26 +774,8 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
| 733 | 774 | ||
| 734 | if (_IOC_DIR(cmd) == _IOC_READ) { | 775 | if (_IOC_DIR(cmd) == _IOC_READ) { |
| 735 | 776 | ||
| 736 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) { | 777 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) |
| 737 | 778 | return handle_eviocgbit(dev, cmd, p, compat_mode); | |
| 738 | unsigned long *bits; | ||
| 739 | int len; | ||
| 740 | |||
| 741 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
| 742 | |||
| 743 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
| 744 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
| 745 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
| 746 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
| 747 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
| 748 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
| 749 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
| 750 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
| 751 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
| 752 | default: return -EINVAL; | ||
| 753 | } | ||
| 754 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
| 755 | } | ||
| 756 | 779 | ||
| 757 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) | 780 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) |
| 758 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), | 781 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 87d3e7eabffd..6791be81eb29 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
| @@ -127,6 +127,7 @@ static const struct xpad_device { | |||
| 127 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 127 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, |
| 128 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 128 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
| 129 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 129 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
| 130 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | ||
| 130 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 131 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
| 131 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 132 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
| 132 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 133 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index be58730e636a..3f48279f2195 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
| @@ -118,6 +118,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
| 118 | unsigned int type = button->type ?: EV_KEY; | 118 | unsigned int type = button->type ?: EV_KEY; |
| 119 | 119 | ||
| 120 | bdata->input = input; | 120 | bdata->input = input; |
| 121 | bdata->button = button; | ||
| 121 | setup_timer(&bdata->timer, | 122 | setup_timer(&bdata->timer, |
| 122 | gpio_check_button, (unsigned long)bdata); | 123 | gpio_check_button, (unsigned long)bdata); |
| 123 | 124 | ||
| @@ -256,7 +257,7 @@ static int gpio_keys_resume(struct platform_device *pdev) | |||
| 256 | #define gpio_keys_resume NULL | 257 | #define gpio_keys_resume NULL |
| 257 | #endif | 258 | #endif |
| 258 | 259 | ||
| 259 | struct platform_driver gpio_keys_device_driver = { | 260 | static struct platform_driver gpio_keys_device_driver = { |
| 260 | .probe = gpio_keys_probe, | 261 | .probe = gpio_keys_probe, |
| 261 | .remove = __devexit_p(gpio_keys_remove), | 262 | .remove = __devexit_p(gpio_keys_remove), |
| 262 | .suspend = gpio_keys_suspend, | 263 | .suspend = gpio_keys_suspend, |
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index 7bbea097cda2..f996546fc443 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig | |||
| @@ -130,6 +130,29 @@ config MOUSE_APPLETOUCH | |||
| 130 | To compile this driver as a module, choose M here: the | 130 | To compile this driver as a module, choose M here: the |
| 131 | module will be called appletouch. | 131 | module will be called appletouch. |
| 132 | 132 | ||
| 133 | config MOUSE_BCM5974 | ||
| 134 | tristate "Apple USB BCM5974 Multitouch trackpad support" | ||
| 135 | depends on USB_ARCH_HAS_HCD | ||
| 136 | select USB | ||
| 137 | help | ||
| 138 | Say Y here if you have an Apple USB BCM5974 Multitouch | ||
| 139 | trackpad. | ||
| 140 | |||
| 141 | The BCM5974 is the multitouch trackpad found in the Macbook | ||
| 142 | Air (JAN2008) and Macbook Pro Penryn (FEB2008) laptops. | ||
| 143 | |||
| 144 | It is also found in the IPhone (2007) and Ipod Touch (2008). | ||
| 145 | |||
| 146 | This driver provides multitouch functionality together with | ||
| 147 | the synaptics X11 driver. | ||
| 148 | |||
| 149 | The interface is currently identical to the appletouch interface, | ||
| 150 | for further information, see | ||
| 151 | <file:Documentation/input/appletouch.txt>. | ||
| 152 | |||
| 153 | To compile this driver as a module, choose M here: the | ||
| 154 | module will be called bcm5974. | ||
| 155 | |||
| 133 | config MOUSE_INPORT | 156 | config MOUSE_INPORT |
| 134 | tristate "InPort/MS/ATIXL busmouse" | 157 | tristate "InPort/MS/ATIXL busmouse" |
| 135 | depends on ISA | 158 | depends on ISA |
diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile index 9e6e36330820..d4d202516090 100644 --- a/drivers/input/mouse/Makefile +++ b/drivers/input/mouse/Makefile | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o | 7 | obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o |
| 8 | obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o | 8 | obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o |
| 9 | obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o | ||
| 9 | obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o | 10 | obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o |
| 10 | obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o | 11 | obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o |
| 11 | obj-$(CONFIG_MOUSE_INPORT) += inport.o | 12 | obj-$(CONFIG_MOUSE_INPORT) += inport.o |
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c new file mode 100644 index 000000000000..2ec921bf3c60 --- /dev/null +++ b/drivers/input/mouse/bcm5974.c | |||
| @@ -0,0 +1,681 @@ | |||
| 1 | /* | ||
| 2 | * Apple USB BCM5974 (Macbook Air and Penryn Macbook Pro) multitouch driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Henrik Rydberg (rydberg@euromail.se) | ||
| 5 | * | ||
| 6 | * The USB initialization and package decoding was made by | ||
| 7 | * Scott Shawcroft as part of the touchd user-space driver project: | ||
| 8 | * Copyright (C) 2008 Scott Shawcroft (scott.shawcroft@gmail.com) | ||
| 9 | * | ||
| 10 | * The BCM5974 driver is based on the appletouch driver: | ||
| 11 | * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) | ||
| 12 | * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) | ||
| 13 | * Copyright (C) 2005 Stelian Pop (stelian@popies.net) | ||
| 14 | * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) | ||
| 15 | * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) | ||
| 16 | * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) | ||
| 17 | * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) | ||
| 18 | * | ||
| 19 | * This program is free software; you can redistribute it and/or modify | ||
| 20 | * it under the terms of the GNU General Public License as published by | ||
| 21 | * the Free Software Foundation; either version 2 of the License, or | ||
| 22 | * (at your option) any later version. | ||
| 23 | * | ||
| 24 | * This program is distributed in the hope that it will be useful, | ||
| 25 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 27 | * GNU General Public License for more details. | ||
| 28 | * | ||
| 29 | * You should have received a copy of the GNU General Public License | ||
| 30 | * along with this program; if not, write to the Free Software | ||
| 31 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 32 | * | ||
| 33 | */ | ||
| 34 | |||
| 35 | #include <linux/kernel.h> | ||
| 36 | #include <linux/errno.h> | ||
| 37 | #include <linux/init.h> | ||
| 38 | #include <linux/slab.h> | ||
| 39 | #include <linux/module.h> | ||
| 40 | #include <linux/usb/input.h> | ||
| 41 | #include <linux/hid.h> | ||
| 42 | #include <linux/mutex.h> | ||
| 43 | |||
| 44 | #define USB_VENDOR_ID_APPLE 0x05ac | ||
| 45 | |||
| 46 | /* MacbookAir, aka wellspring */ | ||
| 47 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 | ||
| 48 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 | ||
| 49 | #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 | ||
| 50 | /* MacbookProPenryn, aka wellspring2 */ | ||
| 51 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 | ||
| 52 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 | ||
| 53 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 | ||
| 54 | |||
| 55 | #define BCM5974_DEVICE(prod) { \ | ||
| 56 | .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ | ||
| 57 | USB_DEVICE_ID_MATCH_INT_CLASS | \ | ||
| 58 | USB_DEVICE_ID_MATCH_INT_PROTOCOL), \ | ||
| 59 | .idVendor = USB_VENDOR_ID_APPLE, \ | ||
| 60 | .idProduct = (prod), \ | ||
| 61 | .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ | ||
| 62 | .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE \ | ||
| 63 | } | ||
| 64 | |||
| 65 | /* table of devices that work with this driver */ | ||
| 66 | static const struct usb_device_id bcm5974_table [] = { | ||
| 67 | /* MacbookAir1.1 */ | ||
| 68 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | ||
| 69 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ISO), | ||
| 70 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_JIS), | ||
| 71 | /* MacbookProPenryn */ | ||
| 72 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), | ||
| 73 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), | ||
| 74 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), | ||
| 75 | /* Terminating entry */ | ||
| 76 | {} | ||
| 77 | }; | ||
| 78 | MODULE_DEVICE_TABLE(usb, bcm5974_table); | ||
| 79 | |||
| 80 | MODULE_AUTHOR("Henrik Rydberg"); | ||
| 81 | MODULE_DESCRIPTION("Apple USB BCM5974 multitouch driver"); | ||
| 82 | MODULE_LICENSE("GPL"); | ||
| 83 | |||
| 84 | #define dprintk(level, format, a...)\ | ||
| 85 | { if (debug >= level) printk(KERN_DEBUG format, ##a); } | ||
| 86 | |||
| 87 | static int debug = 1; | ||
| 88 | module_param(debug, int, 0644); | ||
| 89 | MODULE_PARM_DESC(debug, "Activate debugging output"); | ||
| 90 | |||
| 91 | /* button data structure */ | ||
| 92 | struct bt_data { | ||
| 93 | u8 unknown1; /* constant */ | ||
| 94 | u8 button; /* left button */ | ||
| 95 | u8 rel_x; /* relative x coordinate */ | ||
| 96 | u8 rel_y; /* relative y coordinate */ | ||
| 97 | }; | ||
| 98 | |||
| 99 | /* trackpad header structure */ | ||
| 100 | struct tp_header { | ||
| 101 | u8 unknown1[16]; /* constants, timers, etc */ | ||
| 102 | u8 fingers; /* number of fingers on trackpad */ | ||
| 103 | u8 unknown2[9]; /* constants, timers, etc */ | ||
| 104 | }; | ||
| 105 | |||
| 106 | /* trackpad finger structure */ | ||
| 107 | struct tp_finger { | ||
| 108 | __le16 origin; /* left/right origin? */ | ||
| 109 | __le16 abs_x; /* absolute x coodinate */ | ||
| 110 | __le16 abs_y; /* absolute y coodinate */ | ||
| 111 | __le16 rel_x; /* relative x coodinate */ | ||
| 112 | __le16 rel_y; /* relative y coodinate */ | ||
| 113 | __le16 size_major; /* finger size, major axis? */ | ||
| 114 | __le16 size_minor; /* finger size, minor axis? */ | ||
| 115 | __le16 orientation; /* 16384 when point, else 15 bit angle */ | ||
| 116 | __le16 force_major; /* trackpad force, major axis? */ | ||
| 117 | __le16 force_minor; /* trackpad force, minor axis? */ | ||
| 118 | __le16 unused[3]; /* zeros */ | ||
| 119 | __le16 multi; /* one finger: varies, more fingers: constant */ | ||
| 120 | }; | ||
| 121 | |||
| 122 | /* trackpad data structure, empirically at least ten fingers */ | ||
| 123 | struct tp_data { | ||
| 124 | struct tp_header header; | ||
| 125 | struct tp_finger finger[16]; | ||
| 126 | }; | ||
| 127 | |||
| 128 | /* device-specific parameters */ | ||
| 129 | struct bcm5974_param { | ||
| 130 | int dim; /* logical dimension */ | ||
| 131 | int fuzz; /* logical noise value */ | ||
| 132 | int devmin; /* device minimum reading */ | ||
| 133 | int devmax; /* device maximum reading */ | ||
| 134 | }; | ||
| 135 | |||
| 136 | /* device-specific configuration */ | ||
| 137 | struct bcm5974_config { | ||
| 138 | int ansi, iso, jis; /* the product id of this device */ | ||
| 139 | int bt_ep; /* the endpoint of the button interface */ | ||
| 140 | int bt_datalen; /* data length of the button interface */ | ||
| 141 | int tp_ep; /* the endpoint of the trackpad interface */ | ||
| 142 | int tp_datalen; /* data length of the trackpad interface */ | ||
| 143 | struct bcm5974_param p; /* finger pressure limits */ | ||
| 144 | struct bcm5974_param w; /* finger width limits */ | ||
| 145 | struct bcm5974_param x; /* horizontal limits */ | ||
| 146 | struct bcm5974_param y; /* vertical limits */ | ||
| 147 | }; | ||
| 148 | |||
| 149 | /* logical device structure */ | ||
| 150 | struct bcm5974 { | ||
| 151 | char phys[64]; | ||
| 152 | struct usb_device *udev; /* usb device */ | ||
| 153 | struct usb_interface *intf; /* our interface */ | ||
| 154 | struct input_dev *input; /* input dev */ | ||
| 155 | struct bcm5974_config cfg; /* device configuration */ | ||
| 156 | struct mutex pm_mutex; /* serialize access to open/suspend */ | ||
| 157 | int opened; /* 1: opened, 0: closed */ | ||
| 158 | struct urb *bt_urb; /* button usb request block */ | ||
| 159 | struct bt_data *bt_data; /* button transferred data */ | ||
| 160 | struct urb *tp_urb; /* trackpad usb request block */ | ||
| 161 | struct tp_data *tp_data; /* trackpad transferred data */ | ||
| 162 | }; | ||
| 163 | |||
| 164 | /* logical dimensions */ | ||
| 165 | #define DIM_PRESSURE 256 /* maximum finger pressure */ | ||
| 166 | #define DIM_WIDTH 16 /* maximum finger width */ | ||
| 167 | #define DIM_X 1280 /* maximum trackpad x value */ | ||
| 168 | #define DIM_Y 800 /* maximum trackpad y value */ | ||
| 169 | |||
| 170 | /* logical signal quality */ | ||
| 171 | #define SN_PRESSURE 45 /* pressure signal-to-noise ratio */ | ||
| 172 | #define SN_WIDTH 100 /* width signal-to-noise ratio */ | ||
| 173 | #define SN_COORD 250 /* coordinate signal-to-noise ratio */ | ||
| 174 | |||
| 175 | /* device constants */ | ||
| 176 | static const struct bcm5974_config bcm5974_config_table[] = { | ||
| 177 | { | ||
| 178 | USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, | ||
| 179 | USB_DEVICE_ID_APPLE_WELLSPRING_ISO, | ||
| 180 | USB_DEVICE_ID_APPLE_WELLSPRING_JIS, | ||
| 181 | 0x84, sizeof(struct bt_data), | ||
| 182 | 0x81, sizeof(struct tp_data), | ||
| 183 | { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 }, | ||
| 184 | { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, | ||
| 185 | { DIM_X, DIM_X / SN_COORD, -4824, 5342 }, | ||
| 186 | { DIM_Y, DIM_Y / SN_COORD, -172, 5820 } | ||
| 187 | }, | ||
| 188 | { | ||
| 189 | USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, | ||
| 190 | USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, | ||
| 191 | USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, | ||
| 192 | 0x84, sizeof(struct bt_data), | ||
| 193 | 0x81, sizeof(struct tp_data), | ||
| 194 | { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 }, | ||
| 195 | { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, | ||
| 196 | { DIM_X, DIM_X / SN_COORD, -4824, 4824 }, | ||
| 197 | { DIM_Y, DIM_Y / SN_COORD, -172, 4290 } | ||
| 198 | }, | ||
| 199 | {} | ||
| 200 | }; | ||
| 201 | |||
| 202 | /* return the device-specific configuration by device */ | ||
| 203 | static const struct bcm5974_config *bcm5974_get_config(struct usb_device *udev) | ||
| 204 | { | ||
| 205 | u16 id = le16_to_cpu(udev->descriptor.idProduct); | ||
| 206 | const struct bcm5974_config *cfg; | ||
| 207 | |||
| 208 | for (cfg = bcm5974_config_table; cfg->ansi; ++cfg) | ||
| 209 | if (cfg->ansi == id || cfg->iso == id || cfg->jis == id) | ||
| 210 | return cfg; | ||
| 211 | |||
| 212 | return bcm5974_config_table; | ||
| 213 | } | ||
| 214 | |||
| 215 | /* convert 16-bit little endian to signed integer */ | ||
| 216 | static inline int raw2int(__le16 x) | ||
| 217 | { | ||
| 218 | return (signed short)le16_to_cpu(x); | ||
| 219 | } | ||
| 220 | |||
| 221 | /* scale device data to logical dimensions (asserts devmin < devmax) */ | ||
| 222 | static inline int int2scale(const struct bcm5974_param *p, int x) | ||
| 223 | { | ||
| 224 | return x * p->dim / (p->devmax - p->devmin); | ||
| 225 | } | ||
| 226 | |||
| 227 | /* all logical value ranges are [0,dim). */ | ||
| 228 | static inline int int2bound(const struct bcm5974_param *p, int x) | ||
| 229 | { | ||
| 230 | int s = int2scale(p, x); | ||
| 231 | |||
| 232 | return clamp_val(s, 0, p->dim - 1); | ||
| 233 | } | ||
| 234 | |||
| 235 | /* setup which logical events to report */ | ||
| 236 | static void setup_events_to_report(struct input_dev *input_dev, | ||
| 237 | const struct bcm5974_config *cfg) | ||
| 238 | { | ||
| 239 | __set_bit(EV_ABS, input_dev->evbit); | ||
| 240 | |||
| 241 | input_set_abs_params(input_dev, ABS_PRESSURE, | ||
| 242 | 0, cfg->p.dim, cfg->p.fuzz, 0); | ||
| 243 | input_set_abs_params(input_dev, ABS_TOOL_WIDTH, | ||
| 244 | 0, cfg->w.dim, cfg->w.fuzz, 0); | ||
| 245 | input_set_abs_params(input_dev, ABS_X, | ||
| 246 | 0, cfg->x.dim, cfg->x.fuzz, 0); | ||
| 247 | input_set_abs_params(input_dev, ABS_Y, | ||
| 248 | 0, cfg->y.dim, cfg->y.fuzz, 0); | ||
| 249 | |||
| 250 | __set_bit(EV_KEY, input_dev->evbit); | ||
| 251 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); | ||
| 252 | __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); | ||
| 253 | __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); | ||
| 254 | __set_bit(BTN_LEFT, input_dev->keybit); | ||
| 255 | } | ||
| 256 | |||
| 257 | /* report button data as logical button state */ | ||
| 258 | static int report_bt_state(struct bcm5974 *dev, int size) | ||
| 259 | { | ||
| 260 | if (size != sizeof(struct bt_data)) | ||
| 261 | return -EIO; | ||
| 262 | |||
| 263 | input_report_key(dev->input, BTN_LEFT, dev->bt_data->button); | ||
| 264 | input_sync(dev->input); | ||
| 265 | |||
| 266 | return 0; | ||
| 267 | } | ||
| 268 | |||
| 269 | /* report trackpad data as logical trackpad state */ | ||
| 270 | static int report_tp_state(struct bcm5974 *dev, int size) | ||
| 271 | { | ||
| 272 | const struct bcm5974_config *c = &dev->cfg; | ||
| 273 | const struct tp_finger *f = dev->tp_data->finger; | ||
| 274 | struct input_dev *input = dev->input; | ||
| 275 | const int fingers = (size - 26) / 28; | ||
| 276 | int p = 0, w, x, y, n = 0; | ||
| 277 | |||
| 278 | if (size < 26 || (size - 26) % 28 != 0) | ||
| 279 | return -EIO; | ||
| 280 | |||
| 281 | if (fingers) { | ||
| 282 | p = raw2int(f->force_major); | ||
| 283 | w = raw2int(f->size_major); | ||
| 284 | x = raw2int(f->abs_x); | ||
| 285 | y = raw2int(f->abs_y); | ||
| 286 | n = p > 0 ? fingers : 0; | ||
| 287 | |||
| 288 | dprintk(9, | ||
| 289 | "bcm5974: p: %+05d w: %+05d x: %+05d y: %+05d n: %d\n", | ||
| 290 | p, w, x, y, n); | ||
| 291 | |||
| 292 | input_report_abs(input, ABS_TOOL_WIDTH, int2bound(&c->w, w)); | ||
| 293 | input_report_abs(input, ABS_X, int2bound(&c->x, x - c->x.devmin)); | ||
| 294 | input_report_abs(input, ABS_Y, int2bound(&c->y, c->y.devmax - y)); | ||
| 295 | } | ||
| 296 | |||
| 297 | input_report_abs(input, ABS_PRESSURE, int2bound(&c->p, p)); | ||
| 298 | |||
| 299 | input_report_key(input, BTN_TOOL_FINGER, n == 1); | ||
| 300 | input_report_key(input, BTN_TOOL_DOUBLETAP, n == 2); | ||
| 301 | input_report_key(input, BTN_TOOL_TRIPLETAP, n > 2); | ||
| 302 | |||
| 303 | input_sync(input); | ||
| 304 | |||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | |||
| 308 | /* Wellspring initialization constants */ | ||
| 309 | #define BCM5974_WELLSPRING_MODE_READ_REQUEST_ID 1 | ||
| 310 | #define BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID 9 | ||
| 311 | #define BCM5974_WELLSPRING_MODE_REQUEST_VALUE 0x300 | ||
| 312 | #define BCM5974_WELLSPRING_MODE_REQUEST_INDEX 0 | ||
| 313 | #define BCM5974_WELLSPRING_MODE_VENDOR_VALUE 0x01 | ||
| 314 | |||
| 315 | static int bcm5974_wellspring_mode(struct bcm5974 *dev) | ||
| 316 | { | ||
| 317 | char *data = kmalloc(8, GFP_KERNEL); | ||
| 318 | int retval = 0, size; | ||
| 319 | |||
| 320 | if (!data) { | ||
| 321 | err("bcm5974: out of memory"); | ||
| 322 | retval = -ENOMEM; | ||
| 323 | goto out; | ||
| 324 | } | ||
| 325 | |||
| 326 | /* read configuration */ | ||
| 327 | size = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | ||
| 328 | BCM5974_WELLSPRING_MODE_READ_REQUEST_ID, | ||
| 329 | USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 330 | BCM5974_WELLSPRING_MODE_REQUEST_VALUE, | ||
| 331 | BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); | ||
| 332 | |||
| 333 | if (size != 8) { | ||
| 334 | err("bcm5974: could not read from device"); | ||
| 335 | retval = -EIO; | ||
| 336 | goto out; | ||
| 337 | } | ||
| 338 | |||
| 339 | /* apply the mode switch */ | ||
| 340 | data[0] = BCM5974_WELLSPRING_MODE_VENDOR_VALUE; | ||
| 341 | |||
| 342 | /* write configuration */ | ||
| 343 | size = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
| 344 | BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID, | ||
| 345 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 346 | BCM5974_WELLSPRING_MODE_REQUEST_VALUE, | ||
| 347 | BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); | ||
| 348 | |||
| 349 | if (size != 8) { | ||
| 350 | err("bcm5974: could not write to device"); | ||
| 351 | retval = -EIO; | ||
| 352 | goto out; | ||
| 353 | } | ||
| 354 | |||
| 355 | dprintk(2, "bcm5974: switched to wellspring mode.\n"); | ||
| 356 | |||
| 357 | out: | ||
| 358 | kfree(data); | ||
| 359 | return retval; | ||
| 360 | } | ||
| 361 | |||
| 362 | static void bcm5974_irq_button(struct urb *urb) | ||
| 363 | { | ||
| 364 | struct bcm5974 *dev = urb->context; | ||
| 365 | int error; | ||
| 366 | |||
| 367 | switch (urb->status) { | ||
| 368 | case 0: | ||
| 369 | break; | ||
| 370 | case -EOVERFLOW: | ||
| 371 | case -ECONNRESET: | ||
| 372 | case -ENOENT: | ||
| 373 | case -ESHUTDOWN: | ||
| 374 | dbg("bcm5974: button urb shutting down: %d", urb->status); | ||
| 375 | return; | ||
| 376 | default: | ||
| 377 | dbg("bcm5974: button urb status: %d", urb->status); | ||
| 378 | goto exit; | ||
| 379 | } | ||
| 380 | |||
| 381 | if (report_bt_state(dev, dev->bt_urb->actual_length)) | ||
| 382 | dprintk(1, "bcm5974: bad button package, length: %d\n", | ||
| 383 | dev->bt_urb->actual_length); | ||
| 384 | |||
| 385 | exit: | ||
| 386 | error = usb_submit_urb(dev->bt_urb, GFP_ATOMIC); | ||
| 387 | if (error) | ||
| 388 | err("bcm5974: button urb failed: %d", error); | ||
| 389 | } | ||
| 390 | |||
| 391 | static void bcm5974_irq_trackpad(struct urb *urb) | ||
| 392 | { | ||
| 393 | struct bcm5974 *dev = urb->context; | ||
| 394 | int error; | ||
| 395 | |||
| 396 | switch (urb->status) { | ||
| 397 | case 0: | ||
| 398 | break; | ||
| 399 | case -EOVERFLOW: | ||
| 400 | case -ECONNRESET: | ||
| 401 | case -ENOENT: | ||
| 402 | case -ESHUTDOWN: | ||
| 403 | dbg("bcm5974: trackpad urb shutting down: %d", urb->status); | ||
| 404 | return; | ||
| 405 | default: | ||
| 406 | dbg("bcm5974: trackpad urb status: %d", urb->status); | ||
| 407 | goto exit; | ||
| 408 | } | ||
| 409 | |||
| 410 | /* control response ignored */ | ||
| 411 | if (dev->tp_urb->actual_length == 2) | ||
| 412 | goto exit; | ||
| 413 | |||
| 414 | if (report_tp_state(dev, dev->tp_urb->actual_length)) | ||
| 415 | dprintk(1, "bcm5974: bad trackpad package, length: %d\n", | ||
| 416 | dev->tp_urb->actual_length); | ||
| 417 | |||
| 418 | exit: | ||
| 419 | error = usb_submit_urb(dev->tp_urb, GFP_ATOMIC); | ||
| 420 | if (error) | ||
| 421 | err("bcm5974: trackpad urb failed: %d", error); | ||
| 422 | } | ||
| 423 | |||
| 424 | /* | ||
| 425 | * The Wellspring trackpad, like many recent Apple trackpads, share | ||
| 426 | * the usb device with the keyboard. Since keyboards are usually | ||
| 427 | * handled by the HID system, the device ends up being handled by two | ||
| 428 | * modules. Setting up the device therefore becomes slightly | ||
| 429 | * complicated. To enable multitouch features, a mode switch is | ||
| 430 | * required, which is usually applied via the control interface of the | ||
| 431 | * device. It can be argued where this switch should take place. In | ||
| 432 | * some drivers, like appletouch, the switch is made during | ||
| 433 | * probe. However, the hid module may also alter the state of the | ||
| 434 | * device, resulting in trackpad malfunction under certain | ||
| 435 | * circumstances. To get around this problem, there is at least one | ||
| 436 | * example that utilizes the USB_QUIRK_RESET_RESUME quirk in order to | ||
| 437 | * recieve a reset_resume request rather than the normal resume. | ||
| 438 | * Since the implementation of reset_resume is equal to mode switch | ||
| 439 | * plus start_traffic, it seems easier to always do the switch when | ||
| 440 | * starting traffic on the device. | ||
| 441 | */ | ||
| 442 | static int bcm5974_start_traffic(struct bcm5974 *dev) | ||
| 443 | { | ||
| 444 | if (bcm5974_wellspring_mode(dev)) { | ||
| 445 | dprintk(1, "bcm5974: mode switch failed\n"); | ||
| 446 | goto error; | ||
| 447 | } | ||
| 448 | |||
| 449 | if (usb_submit_urb(dev->bt_urb, GFP_KERNEL)) | ||
| 450 | goto error; | ||
| 451 | |||
| 452 | if (usb_submit_urb(dev->tp_urb, GFP_KERNEL)) | ||
| 453 | goto err_kill_bt; | ||
| 454 | |||
| 455 | return 0; | ||
| 456 | |||
| 457 | err_kill_bt: | ||
| 458 | usb_kill_urb(dev->bt_urb); | ||
| 459 | error: | ||
| 460 | return -EIO; | ||
| 461 | } | ||
| 462 | |||
| 463 | static void bcm5974_pause_traffic(struct bcm5974 *dev) | ||
| 464 | { | ||
| 465 | usb_kill_urb(dev->tp_urb); | ||
| 466 | usb_kill_urb(dev->bt_urb); | ||
| 467 | } | ||
| 468 | |||
| 469 | /* | ||
| 470 | * The code below implements open/close and manual suspend/resume. | ||
| 471 | * All functions may be called in random order. | ||
| 472 | * | ||
| 473 | * Opening a suspended device fails with EACCES - permission denied. | ||
| 474 | * | ||
| 475 | * Failing a resume leaves the device resumed but closed. | ||
| 476 | */ | ||
| 477 | static int bcm5974_open(struct input_dev *input) | ||
| 478 | { | ||
| 479 | struct bcm5974 *dev = input_get_drvdata(input); | ||
| 480 | int error; | ||
| 481 | |||
| 482 | error = usb_autopm_get_interface(dev->intf); | ||
| 483 | if (error) | ||
| 484 | return error; | ||
| 485 | |||
| 486 | mutex_lock(&dev->pm_mutex); | ||
| 487 | |||
| 488 | error = bcm5974_start_traffic(dev); | ||
| 489 | if (!error) | ||
| 490 | dev->opened = 1; | ||
| 491 | |||
| 492 | mutex_unlock(&dev->pm_mutex); | ||
| 493 | |||
| 494 | if (error) | ||
| 495 | usb_autopm_put_interface(dev->intf); | ||
| 496 | |||
| 497 | return error; | ||
| 498 | } | ||
| 499 | |||
| 500 | static void bcm5974_close(struct input_dev *input) | ||
| 501 | { | ||
| 502 | struct bcm5974 *dev = input_get_drvdata(input); | ||
| 503 | |||
| 504 | mutex_lock(&dev->pm_mutex); | ||
| 505 | |||
| 506 | bcm5974_pause_traffic(dev); | ||
| 507 | dev->opened = 0; | ||
| 508 | |||
| 509 | mutex_unlock(&dev->pm_mutex); | ||
| 510 | |||
| 511 | usb_autopm_put_interface(dev->intf); | ||
| 512 | } | ||
| 513 | |||
| 514 | static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message) | ||
| 515 | { | ||
| 516 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
| 517 | |||
| 518 | mutex_lock(&dev->pm_mutex); | ||
| 519 | |||
| 520 | if (dev->opened) | ||
| 521 | bcm5974_pause_traffic(dev); | ||
| 522 | |||
| 523 | mutex_unlock(&dev->pm_mutex); | ||
| 524 | |||
| 525 | return 0; | ||
| 526 | } | ||
| 527 | |||
| 528 | static int bcm5974_resume(struct usb_interface *iface) | ||
| 529 | { | ||
| 530 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
| 531 | int error = 0; | ||
| 532 | |||
| 533 | mutex_lock(&dev->pm_mutex); | ||
| 534 | |||
| 535 | if (dev->opened) | ||
| 536 | error = bcm5974_start_traffic(dev); | ||
| 537 | |||
| 538 | mutex_unlock(&dev->pm_mutex); | ||
| 539 | |||
| 540 | return error; | ||
| 541 | } | ||
| 542 | |||
| 543 | static int bcm5974_probe(struct usb_interface *iface, | ||
| 544 | const struct usb_device_id *id) | ||
| 545 | { | ||
| 546 | struct usb_device *udev = interface_to_usbdev(iface); | ||
| 547 | const struct bcm5974_config *cfg; | ||
| 548 | struct bcm5974 *dev; | ||
| 549 | struct input_dev *input_dev; | ||
| 550 | int error = -ENOMEM; | ||
| 551 | |||
| 552 | /* find the product index */ | ||
| 553 | cfg = bcm5974_get_config(udev); | ||
| 554 | |||
| 555 | /* allocate memory for our device state and initialize it */ | ||
| 556 | dev = kzalloc(sizeof(struct bcm5974), GFP_KERNEL); | ||
| 557 | input_dev = input_allocate_device(); | ||
| 558 | if (!dev || !input_dev) { | ||
| 559 | err("bcm5974: out of memory"); | ||
| 560 | goto err_free_devs; | ||
| 561 | } | ||
| 562 | |||
| 563 | dev->udev = udev; | ||
| 564 | dev->intf = iface; | ||
| 565 | dev->input = input_dev; | ||
| 566 | dev->cfg = *cfg; | ||
| 567 | mutex_init(&dev->pm_mutex); | ||
| 568 | |||
| 569 | /* setup urbs */ | ||
| 570 | dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 571 | if (!dev->bt_urb) | ||
| 572 | goto err_free_devs; | ||
| 573 | |||
| 574 | dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 575 | if (!dev->tp_urb) | ||
| 576 | goto err_free_bt_urb; | ||
| 577 | |||
| 578 | dev->bt_data = usb_buffer_alloc(dev->udev, | ||
| 579 | dev->cfg.bt_datalen, GFP_KERNEL, | ||
| 580 | &dev->bt_urb->transfer_dma); | ||
| 581 | if (!dev->bt_data) | ||
| 582 | goto err_free_urb; | ||
| 583 | |||
| 584 | dev->tp_data = usb_buffer_alloc(dev->udev, | ||
| 585 | dev->cfg.tp_datalen, GFP_KERNEL, | ||
| 586 | &dev->tp_urb->transfer_dma); | ||
| 587 | if (!dev->tp_data) | ||
| 588 | goto err_free_bt_buffer; | ||
| 589 | |||
| 590 | usb_fill_int_urb(dev->bt_urb, udev, | ||
| 591 | usb_rcvintpipe(udev, cfg->bt_ep), | ||
| 592 | dev->bt_data, dev->cfg.bt_datalen, | ||
| 593 | bcm5974_irq_button, dev, 1); | ||
| 594 | |||
| 595 | usb_fill_int_urb(dev->tp_urb, udev, | ||
| 596 | usb_rcvintpipe(udev, cfg->tp_ep), | ||
| 597 | dev->tp_data, dev->cfg.tp_datalen, | ||
| 598 | bcm5974_irq_trackpad, dev, 1); | ||
| 599 | |||
| 600 | /* create bcm5974 device */ | ||
| 601 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); | ||
| 602 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); | ||
| 603 | |||
| 604 | input_dev->name = "bcm5974"; | ||
| 605 | input_dev->phys = dev->phys; | ||
| 606 | usb_to_input_id(dev->udev, &input_dev->id); | ||
| 607 | input_dev->dev.parent = &iface->dev; | ||
| 608 | |||
| 609 | input_set_drvdata(input_dev, dev); | ||
| 610 | |||
| 611 | input_dev->open = bcm5974_open; | ||
| 612 | input_dev->close = bcm5974_close; | ||
| 613 | |||
| 614 | setup_events_to_report(input_dev, cfg); | ||
| 615 | |||
| 616 | error = input_register_device(dev->input); | ||
| 617 | if (error) | ||
| 618 | goto err_free_buffer; | ||
| 619 | |||
| 620 | /* save our data pointer in this interface device */ | ||
| 621 | usb_set_intfdata(iface, dev); | ||
| 622 | |||
| 623 | return 0; | ||
| 624 | |||
| 625 | err_free_buffer: | ||
| 626 | usb_buffer_free(dev->udev, dev->cfg.tp_datalen, | ||
| 627 | dev->tp_data, dev->tp_urb->transfer_dma); | ||
| 628 | err_free_bt_buffer: | ||
| 629 | usb_buffer_free(dev->udev, dev->cfg.bt_datalen, | ||
| 630 | dev->bt_data, dev->bt_urb->transfer_dma); | ||
| 631 | err_free_urb: | ||
| 632 | usb_free_urb(dev->tp_urb); | ||
| 633 | err_free_bt_urb: | ||
| 634 | usb_free_urb(dev->bt_urb); | ||
| 635 | err_free_devs: | ||
| 636 | usb_set_intfdata(iface, NULL); | ||
| 637 | input_free_device(input_dev); | ||
| 638 | kfree(dev); | ||
| 639 | return error; | ||
| 640 | } | ||
| 641 | |||
| 642 | static void bcm5974_disconnect(struct usb_interface *iface) | ||
| 643 | { | ||
| 644 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
| 645 | |||
| 646 | usb_set_intfdata(iface, NULL); | ||
| 647 | |||
| 648 | input_unregister_device(dev->input); | ||
| 649 | usb_buffer_free(dev->udev, dev->cfg.tp_datalen, | ||
| 650 | dev->tp_data, dev->tp_urb->transfer_dma); | ||
| 651 | usb_buffer_free(dev->udev, dev->cfg.bt_datalen, | ||
| 652 | dev->bt_data, dev->bt_urb->transfer_dma); | ||
| 653 | usb_free_urb(dev->tp_urb); | ||
| 654 | usb_free_urb(dev->bt_urb); | ||
| 655 | kfree(dev); | ||
| 656 | } | ||
| 657 | |||
| 658 | static struct usb_driver bcm5974_driver = { | ||
| 659 | .name = "bcm5974", | ||
| 660 | .probe = bcm5974_probe, | ||
| 661 | .disconnect = bcm5974_disconnect, | ||
| 662 | .suspend = bcm5974_suspend, | ||
| 663 | .resume = bcm5974_resume, | ||
| 664 | .reset_resume = bcm5974_resume, | ||
| 665 | .id_table = bcm5974_table, | ||
| 666 | .supports_autosuspend = 1, | ||
| 667 | }; | ||
| 668 | |||
| 669 | static int __init bcm5974_init(void) | ||
| 670 | { | ||
| 671 | return usb_register(&bcm5974_driver); | ||
| 672 | } | ||
| 673 | |||
| 674 | static void __exit bcm5974_exit(void) | ||
| 675 | { | ||
| 676 | usb_deregister(&bcm5974_driver); | ||
| 677 | } | ||
| 678 | |||
| 679 | module_init(bcm5974_init); | ||
| 680 | module_exit(bcm5974_exit); | ||
| 681 | |||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index fe732a574ec2..3282b741e246 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -394,6 +394,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | |||
| 394 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), | 394 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), |
| 395 | }, | 395 | }, |
| 396 | }, | 396 | }, |
| 397 | { | ||
| 398 | .ident = "Acer TravelMate 4280", | ||
| 399 | .matches = { | ||
| 400 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 401 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), | ||
| 402 | }, | ||
| 403 | }, | ||
| 397 | { } | 404 | { } |
| 398 | }; | 405 | }; |
| 399 | 406 | ||
diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c index 0ed044d5e685..765007899d9a 100644 --- a/drivers/input/serio/xilinx_ps2.c +++ b/drivers/input/serio/xilinx_ps2.c | |||
| @@ -269,8 +269,8 @@ static int xps2_setup(struct device *dev, struct resource *regs_res, | |||
| 269 | * we have the PS2 in a good state */ | 269 | * we have the PS2 in a good state */ |
| 270 | out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); | 270 | out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); |
| 271 | 271 | ||
| 272 | dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%08X, irq=%d\n", | 272 | dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%p, irq=%d\n", |
| 273 | drvdata->phys_addr, (u32)drvdata->base_address, drvdata->irq); | 273 | drvdata->phys_addr, drvdata->base_address, drvdata->irq); |
| 274 | 274 | ||
| 275 | serio = &drvdata->serio; | 275 | serio = &drvdata->serio; |
| 276 | serio->id.type = SERIO_8042; | 276 | serio->id.type = SERIO_8042; |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 6e60a97a234c..25287e80e236 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
| @@ -249,29 +249,26 @@ config TOUCHSCREEN_WM97XX | |||
| 249 | config TOUCHSCREEN_WM9705 | 249 | config TOUCHSCREEN_WM9705 |
| 250 | bool "WM9705 Touchscreen interface support" | 250 | bool "WM9705 Touchscreen interface support" |
| 251 | depends on TOUCHSCREEN_WM97XX | 251 | depends on TOUCHSCREEN_WM97XX |
| 252 | default y | ||
| 252 | help | 253 | help |
| 253 | Say Y here if you have a Wolfson Microelectronics WM9705 | 254 | Say Y here to enable support for the Wolfson Microelectronics |
| 254 | touchscreen controller connected to your system. | 255 | WM9705 touchscreen controller. |
| 255 | |||
| 256 | If unsure, say N. | ||
| 257 | 256 | ||
| 258 | config TOUCHSCREEN_WM9712 | 257 | config TOUCHSCREEN_WM9712 |
| 259 | bool "WM9712 Touchscreen interface support" | 258 | bool "WM9712 Touchscreen interface support" |
| 260 | depends on TOUCHSCREEN_WM97XX | 259 | depends on TOUCHSCREEN_WM97XX |
| 260 | default y | ||
| 261 | help | 261 | help |
| 262 | Say Y here if you have a Wolfson Microelectronics WM9712 | 262 | Say Y here to enable support for the Wolfson Microelectronics |
| 263 | touchscreen controller connected to your system. | 263 | WM9712 touchscreen controller. |
| 264 | |||
| 265 | If unsure, say N. | ||
| 266 | 264 | ||
| 267 | config TOUCHSCREEN_WM9713 | 265 | config TOUCHSCREEN_WM9713 |
| 268 | bool "WM9713 Touchscreen interface support" | 266 | bool "WM9713 Touchscreen interface support" |
| 269 | depends on TOUCHSCREEN_WM97XX | 267 | depends on TOUCHSCREEN_WM97XX |
| 268 | default y | ||
| 270 | help | 269 | help |
| 271 | Say Y here if you have a Wolfson Microelectronics WM9713 touchscreen | 270 | Say Y here to enable support for the Wolfson Microelectronics |
| 272 | controller connected to your system. | 271 | WM9713 touchscreen controller. |
| 273 | |||
| 274 | If unsure, say N. | ||
| 275 | 272 | ||
| 276 | config TOUCHSCREEN_WM97XX_MAINSTONE | 273 | config TOUCHSCREEN_WM97XX_MAINSTONE |
| 277 | tristate "WM97xx Mainstone accelerated touch" | 274 | tristate "WM97xx Mainstone accelerated touch" |
diff --git a/drivers/md/md.c b/drivers/md/md.c index c7aae66c6f9b..8cfadc5bd2ba 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -2393,6 +2393,8 @@ static void analyze_sbs(mddev_t * mddev) | |||
| 2393 | 2393 | ||
| 2394 | } | 2394 | } |
| 2395 | 2395 | ||
| 2396 | static void md_safemode_timeout(unsigned long data); | ||
| 2397 | |||
| 2396 | static ssize_t | 2398 | static ssize_t |
| 2397 | safe_delay_show(mddev_t *mddev, char *page) | 2399 | safe_delay_show(mddev_t *mddev, char *page) |
| 2398 | { | 2400 | { |
| @@ -2432,9 +2434,12 @@ safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len) | |||
| 2432 | if (msec == 0) | 2434 | if (msec == 0) |
| 2433 | mddev->safemode_delay = 0; | 2435 | mddev->safemode_delay = 0; |
| 2434 | else { | 2436 | else { |
| 2437 | unsigned long old_delay = mddev->safemode_delay; | ||
| 2435 | mddev->safemode_delay = (msec*HZ)/1000; | 2438 | mddev->safemode_delay = (msec*HZ)/1000; |
| 2436 | if (mddev->safemode_delay == 0) | 2439 | if (mddev->safemode_delay == 0) |
| 2437 | mddev->safemode_delay = 1; | 2440 | mddev->safemode_delay = 1; |
| 2441 | if (mddev->safemode_delay < old_delay) | ||
| 2442 | md_safemode_timeout((unsigned long)mddev); | ||
| 2438 | } | 2443 | } |
| 2439 | return len; | 2444 | return len; |
| 2440 | } | 2445 | } |
| @@ -4634,6 +4639,11 @@ static int update_size(mddev_t *mddev, sector_t num_sectors) | |||
| 4634 | */ | 4639 | */ |
| 4635 | if (mddev->sync_thread) | 4640 | if (mddev->sync_thread) |
| 4636 | return -EBUSY; | 4641 | return -EBUSY; |
| 4642 | if (mddev->bitmap) | ||
| 4643 | /* Sorry, cannot grow a bitmap yet, just remove it, | ||
| 4644 | * grow, and re-add. | ||
| 4645 | */ | ||
| 4646 | return -EBUSY; | ||
| 4637 | rdev_for_each(rdev, tmp, mddev) { | 4647 | rdev_for_each(rdev, tmp, mddev) { |
| 4638 | sector_t avail; | 4648 | sector_t avail; |
| 4639 | avail = rdev->size * 2; | 4649 | avail = rdev->size * 2; |
| @@ -5993,7 +6003,7 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
| 5993 | } | 6003 | } |
| 5994 | } | 6004 | } |
| 5995 | 6005 | ||
| 5996 | if (mddev->degraded) { | 6006 | if (mddev->degraded && ! mddev->ro) { |
| 5997 | rdev_for_each(rdev, rtmp, mddev) { | 6007 | rdev_for_each(rdev, rtmp, mddev) { |
| 5998 | if (rdev->raid_disk >= 0 && | 6008 | if (rdev->raid_disk >= 0 && |
| 5999 | !test_bit(In_sync, &rdev->flags) && | 6009 | !test_bit(In_sync, &rdev->flags) && |
| @@ -6067,6 +6077,8 @@ void md_check_recovery(mddev_t *mddev) | |||
| 6067 | flush_signals(current); | 6077 | flush_signals(current); |
| 6068 | } | 6078 | } |
| 6069 | 6079 | ||
| 6080 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) | ||
| 6081 | return; | ||
| 6070 | if ( ! ( | 6082 | if ( ! ( |
| 6071 | (mddev->flags && !mddev->external) || | 6083 | (mddev->flags && !mddev->external) || |
| 6072 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || | 6084 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || |
| @@ -6080,6 +6092,15 @@ void md_check_recovery(mddev_t *mddev) | |||
| 6080 | if (mddev_trylock(mddev)) { | 6092 | if (mddev_trylock(mddev)) { |
| 6081 | int spares = 0; | 6093 | int spares = 0; |
| 6082 | 6094 | ||
| 6095 | if (mddev->ro) { | ||
| 6096 | /* Only thing we do on a ro array is remove | ||
| 6097 | * failed devices. | ||
| 6098 | */ | ||
| 6099 | remove_and_add_spares(mddev); | ||
| 6100 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
| 6101 | goto unlock; | ||
| 6102 | } | ||
| 6103 | |||
| 6083 | if (!mddev->external) { | 6104 | if (!mddev->external) { |
| 6084 | int did_change = 0; | 6105 | int did_change = 0; |
| 6085 | spin_lock_irq(&mddev->write_lock); | 6106 | spin_lock_irq(&mddev->write_lock); |
| @@ -6117,7 +6138,8 @@ void md_check_recovery(mddev_t *mddev) | |||
| 6117 | /* resync has finished, collect result */ | 6138 | /* resync has finished, collect result */ |
| 6118 | md_unregister_thread(mddev->sync_thread); | 6139 | md_unregister_thread(mddev->sync_thread); |
| 6119 | mddev->sync_thread = NULL; | 6140 | mddev->sync_thread = NULL; |
| 6120 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { | 6141 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && |
| 6142 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | ||
| 6121 | /* success...*/ | 6143 | /* success...*/ |
| 6122 | /* activate any spares */ | 6144 | /* activate any spares */ |
| 6123 | if (mddev->pers->spare_active(mddev)) | 6145 | if (mddev->pers->spare_active(mddev)) |
| @@ -6169,6 +6191,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 6169 | } else if ((spares = remove_and_add_spares(mddev))) { | 6191 | } else if ((spares = remove_and_add_spares(mddev))) { |
| 6170 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 6192 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| 6171 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); | 6193 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); |
| 6194 | clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); | ||
| 6172 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); | 6195 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); |
| 6173 | } else if (mddev->recovery_cp < MaxSector) { | 6196 | } else if (mddev->recovery_cp < MaxSector) { |
| 6174 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 6197 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| @@ -6232,7 +6255,11 @@ static int md_notify_reboot(struct notifier_block *this, | |||
| 6232 | 6255 | ||
| 6233 | for_each_mddev(mddev, tmp) | 6256 | for_each_mddev(mddev, tmp) |
| 6234 | if (mddev_trylock(mddev)) { | 6257 | if (mddev_trylock(mddev)) { |
| 6235 | do_md_stop (mddev, 1, 0); | 6258 | /* Force a switch to readonly even array |
| 6259 | * appears to still be in use. Hence | ||
| 6260 | * the '100'. | ||
| 6261 | */ | ||
| 6262 | do_md_stop (mddev, 1, 100); | ||
| 6236 | mddev_unlock(mddev); | 6263 | mddev_unlock(mddev); |
| 6237 | } | 6264 | } |
| 6238 | /* | 6265 | /* |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index d41bebb6da0f..e34cd0e62473 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -76,11 +76,13 @@ static void r10bio_pool_free(void *r10_bio, void *data) | |||
| 76 | kfree(r10_bio); | 76 | kfree(r10_bio); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | /* Maximum size of each resync request */ | ||
| 79 | #define RESYNC_BLOCK_SIZE (64*1024) | 80 | #define RESYNC_BLOCK_SIZE (64*1024) |
| 80 | //#define RESYNC_BLOCK_SIZE PAGE_SIZE | ||
| 81 | #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9) | ||
| 82 | #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) | 81 | #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) |
| 83 | #define RESYNC_WINDOW (2048*1024) | 82 | /* amount of memory to reserve for resync requests */ |
| 83 | #define RESYNC_WINDOW (1024*1024) | ||
| 84 | /* maximum number of concurrent requests, memory permitting */ | ||
| 85 | #define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) | ||
| 84 | 86 | ||
| 85 | /* | 87 | /* |
| 86 | * When performing a resync, we need to read and compare, so | 88 | * When performing a resync, we need to read and compare, so |
| @@ -690,7 +692,6 @@ static int flush_pending_writes(conf_t *conf) | |||
| 690 | * there is no normal IO happeing. It must arrange to call | 692 | * there is no normal IO happeing. It must arrange to call |
| 691 | * lower_barrier when the particular background IO completes. | 693 | * lower_barrier when the particular background IO completes. |
| 692 | */ | 694 | */ |
| 693 | #define RESYNC_DEPTH 32 | ||
| 694 | 695 | ||
| 695 | static void raise_barrier(conf_t *conf, int force) | 696 | static void raise_barrier(conf_t *conf, int force) |
| 696 | { | 697 | { |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 40e939675657..224de022e7c5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2568,10 +2568,10 @@ static bool handle_stripe5(struct stripe_head *sh) | |||
| 2568 | if (dev->written) | 2568 | if (dev->written) |
| 2569 | s.written++; | 2569 | s.written++; |
| 2570 | rdev = rcu_dereference(conf->disks[i].rdev); | 2570 | rdev = rcu_dereference(conf->disks[i].rdev); |
| 2571 | if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | 2571 | if (blocked_rdev == NULL && |
| 2572 | rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | ||
| 2572 | blocked_rdev = rdev; | 2573 | blocked_rdev = rdev; |
| 2573 | atomic_inc(&rdev->nr_pending); | 2574 | atomic_inc(&rdev->nr_pending); |
| 2574 | break; | ||
| 2575 | } | 2575 | } |
| 2576 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 2576 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { |
| 2577 | /* The ReadError flag will just be confusing now */ | 2577 | /* The ReadError flag will just be confusing now */ |
| @@ -2588,8 +2588,14 @@ static bool handle_stripe5(struct stripe_head *sh) | |||
| 2588 | rcu_read_unlock(); | 2588 | rcu_read_unlock(); |
| 2589 | 2589 | ||
| 2590 | if (unlikely(blocked_rdev)) { | 2590 | if (unlikely(blocked_rdev)) { |
| 2591 | set_bit(STRIPE_HANDLE, &sh->state); | 2591 | if (s.syncing || s.expanding || s.expanded || |
| 2592 | goto unlock; | 2592 | s.to_write || s.written) { |
| 2593 | set_bit(STRIPE_HANDLE, &sh->state); | ||
| 2594 | goto unlock; | ||
| 2595 | } | ||
| 2596 | /* There is nothing for the blocked_rdev to block */ | ||
| 2597 | rdev_dec_pending(blocked_rdev, conf->mddev); | ||
| 2598 | blocked_rdev = NULL; | ||
| 2593 | } | 2599 | } |
| 2594 | 2600 | ||
| 2595 | if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) { | 2601 | if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) { |
| @@ -2832,10 +2838,10 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page) | |||
| 2832 | if (dev->written) | 2838 | if (dev->written) |
| 2833 | s.written++; | 2839 | s.written++; |
| 2834 | rdev = rcu_dereference(conf->disks[i].rdev); | 2840 | rdev = rcu_dereference(conf->disks[i].rdev); |
| 2835 | if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | 2841 | if (blocked_rdev == NULL && |
| 2842 | rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | ||
| 2836 | blocked_rdev = rdev; | 2843 | blocked_rdev = rdev; |
| 2837 | atomic_inc(&rdev->nr_pending); | 2844 | atomic_inc(&rdev->nr_pending); |
| 2838 | break; | ||
| 2839 | } | 2845 | } |
| 2840 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 2846 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { |
| 2841 | /* The ReadError flag will just be confusing now */ | 2847 | /* The ReadError flag will just be confusing now */ |
| @@ -2853,9 +2859,16 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page) | |||
| 2853 | rcu_read_unlock(); | 2859 | rcu_read_unlock(); |
| 2854 | 2860 | ||
| 2855 | if (unlikely(blocked_rdev)) { | 2861 | if (unlikely(blocked_rdev)) { |
| 2856 | set_bit(STRIPE_HANDLE, &sh->state); | 2862 | if (s.syncing || s.expanding || s.expanded || |
| 2857 | goto unlock; | 2863 | s.to_write || s.written) { |
| 2864 | set_bit(STRIPE_HANDLE, &sh->state); | ||
| 2865 | goto unlock; | ||
| 2866 | } | ||
| 2867 | /* There is nothing for the blocked_rdev to block */ | ||
| 2868 | rdev_dec_pending(blocked_rdev, conf->mddev); | ||
| 2869 | blocked_rdev = NULL; | ||
| 2858 | } | 2870 | } |
| 2871 | |||
| 2859 | pr_debug("locked=%d uptodate=%d to_read=%d" | 2872 | pr_debug("locked=%d uptodate=%d to_read=%d" |
| 2860 | " to_write=%d failed=%d failed_num=%d,%d\n", | 2873 | " to_write=%d failed=%d failed_num=%d,%d\n", |
| 2861 | s.locked, s.uptodate, s.to_read, s.to_write, s.failed, | 2874 | s.locked, s.uptodate, s.to_read, s.to_write, s.failed, |
| @@ -4446,6 +4459,9 @@ static int raid5_check_reshape(mddev_t *mddev) | |||
| 4446 | return -EINVAL; /* Cannot shrink array or change level yet */ | 4459 | return -EINVAL; /* Cannot shrink array or change level yet */ |
| 4447 | if (mddev->delta_disks == 0) | 4460 | if (mddev->delta_disks == 0) |
| 4448 | return 0; /* nothing to do */ | 4461 | return 0; /* nothing to do */ |
| 4462 | if (mddev->bitmap) | ||
| 4463 | /* Cannot grow a bitmap yet */ | ||
| 4464 | return -EBUSY; | ||
| 4449 | 4465 | ||
| 4450 | /* Can only proceed if there are plenty of stripe_heads. | 4466 | /* Can only proceed if there are plenty of stripe_heads. |
| 4451 | * We need a minimum of one full stripe,, and for sensible progress | 4467 | * We need a minimum of one full stripe,, and for sensible progress |
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index e7a3fe508dff..b2d9878dc3f0 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
| @@ -803,11 +803,30 @@ static acpi_status get_u32(u32 *value, u32 cap) | |||
| 803 | 803 | ||
| 804 | static acpi_status set_u32(u32 value, u32 cap) | 804 | static acpi_status set_u32(u32 value, u32 cap) |
| 805 | { | 805 | { |
| 806 | acpi_status status; | ||
| 807 | |||
| 806 | if (interface->capability & cap) { | 808 | if (interface->capability & cap) { |
| 807 | switch (interface->type) { | 809 | switch (interface->type) { |
| 808 | case ACER_AMW0: | 810 | case ACER_AMW0: |
| 809 | return AMW0_set_u32(value, cap, interface); | 811 | return AMW0_set_u32(value, cap, interface); |
| 810 | case ACER_AMW0_V2: | 812 | case ACER_AMW0_V2: |
| 813 | if (cap == ACER_CAP_MAILLED) | ||
| 814 | return AMW0_set_u32(value, cap, interface); | ||
| 815 | |||
| 816 | /* | ||
| 817 | * On some models, some WMID methods don't toggle | ||
| 818 | * properly. For those cases, we want to run the AMW0 | ||
| 819 | * method afterwards to be certain we've really toggled | ||
| 820 | * the device state. | ||
| 821 | */ | ||
| 822 | if (cap == ACER_CAP_WIRELESS || | ||
| 823 | cap == ACER_CAP_BLUETOOTH) { | ||
| 824 | status = WMID_set_u32(value, cap, interface); | ||
| 825 | if (ACPI_FAILURE(status)) | ||
| 826 | return status; | ||
| 827 | |||
| 828 | return AMW0_set_u32(value, cap, interface); | ||
| 829 | } | ||
| 811 | case ACER_WMID: | 830 | case ACER_WMID: |
| 812 | return WMID_set_u32(value, cap, interface); | 831 | return WMID_set_u32(value, cap, interface); |
| 813 | default: | 832 | default: |
diff --git a/drivers/misc/fujitsu-laptop.c b/drivers/misc/fujitsu-laptop.c index 7a1ef6c262de..3e56203e4947 100644 --- a/drivers/misc/fujitsu-laptop.c +++ b/drivers/misc/fujitsu-laptop.c | |||
| @@ -463,6 +463,13 @@ static struct dmi_system_id __initdata fujitsu_dmi_table[] = { | |||
| 463 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6410"), | 463 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6410"), |
| 464 | }, | 464 | }, |
| 465 | .callback = dmi_check_cb_s6410}, | 465 | .callback = dmi_check_cb_s6410}, |
| 466 | { | ||
| 467 | .ident = "FUJITSU LifeBook P8010", | ||
| 468 | .matches = { | ||
| 469 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 470 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P8010"), | ||
| 471 | }, | ||
| 472 | .callback = dmi_check_cb_s6410}, | ||
| 466 | {} | 473 | {} |
| 467 | }; | 474 | }; |
| 468 | 475 | ||
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index d3eb7903c346..6b9300779a43 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -3086,7 +3086,6 @@ static struct ibm_struct wan_driver_data = { | |||
| 3086 | .read = wan_read, | 3086 | .read = wan_read, |
| 3087 | .write = wan_write, | 3087 | .write = wan_write, |
| 3088 | .exit = wan_exit, | 3088 | .exit = wan_exit, |
| 3089 | .flags.experimental = 1, | ||
| 3090 | }; | 3089 | }; |
| 3091 | 3090 | ||
| 3092 | /************************************************************************* | 3091 | /************************************************************************* |
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 64002488c6ee..917cf8d3ae95 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 20 | #include <asm/sizes.h> | 20 | #include <asm/sizes.h> |
| 21 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
| 22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_MTD_CMDLINE_PARTS | 24 | #ifdef CONFIG_MTD_CMDLINE_PARTS |
| 25 | static const char *part_probes[] = { "cmdlinepart", NULL }; | 25 | static const char *part_probes[] = { "cmdlinepart", NULL }; |
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c index a8771ffc61e8..e07b5c51ec5b 100644 --- a/drivers/pcmcia/pxa2xx_palmtx.c +++ b/drivers/pcmcia/pxa2xx_palmtx.c | |||
| @@ -23,12 +23,57 @@ | |||
| 23 | 23 | ||
| 24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | 24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) |
| 25 | { | 25 | { |
| 26 | skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY); | 26 | int ret; |
| 27 | |||
| 28 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER1, "PCMCIA PWR1"); | ||
| 29 | if (ret) | ||
| 30 | goto err1; | ||
| 31 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER1, 0); | ||
| 32 | if (ret) | ||
| 33 | goto err2; | ||
| 34 | |||
| 35 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER2, "PCMCIA PWR2"); | ||
| 36 | if (ret) | ||
| 37 | goto err2; | ||
| 38 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER2, 0); | ||
| 39 | if (ret) | ||
| 40 | goto err3; | ||
| 41 | |||
| 42 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_RESET, "PCMCIA RST"); | ||
| 43 | if (ret) | ||
| 44 | goto err3; | ||
| 45 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_RESET, 1); | ||
| 46 | if (ret) | ||
| 47 | goto err4; | ||
| 48 | |||
| 49 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_READY, "PCMCIA RDY"); | ||
| 50 | if (ret) | ||
| 51 | goto err4; | ||
| 52 | ret = gpio_direction_input(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 53 | if (ret) | ||
| 54 | goto err5; | ||
| 55 | |||
| 56 | skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 27 | return 0; | 57 | return 0; |
| 58 | |||
| 59 | err5: | ||
| 60 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 61 | err4: | ||
| 62 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
| 63 | err3: | ||
| 64 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
| 65 | err2: | ||
| 66 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
| 67 | err1: | ||
| 68 | return ret; | ||
| 28 | } | 69 | } |
| 29 | 70 | ||
| 30 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | 71 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) |
| 31 | { | 72 | { |
| 73 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 74 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
| 75 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
| 76 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
| 32 | } | 77 | } |
| 33 | 78 | ||
| 34 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | 79 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, |
| @@ -109,7 +154,7 @@ static void __exit palmtx_pcmcia_exit(void) | |||
| 109 | platform_device_unregister(palmtx_pcmcia_device); | 154 | platform_device_unregister(palmtx_pcmcia_device); |
| 110 | } | 155 | } |
| 111 | 156 | ||
| 112 | fs_initcall(palmtx_pcmcia_init); | 157 | module_init(palmtx_pcmcia_init); |
| 113 | module_exit(palmtx_pcmcia_exit); | 158 | module_exit(palmtx_pcmcia_exit); |
| 114 | 159 | ||
| 115 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | 160 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); |
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index d7e9f2152df0..95015cbfd33f 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
| @@ -405,8 +405,6 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, | |||
| 405 | 405 | ||
| 406 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: | 406 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: |
| 407 | extended_irq = &res->data.extended_irq; | 407 | extended_irq = &res->data.extended_irq; |
| 408 | if (extended_irq->producer_consumer == ACPI_PRODUCER) | ||
| 409 | return AE_OK; | ||
| 410 | 408 | ||
| 411 | if (extended_irq->interrupt_count == 0) | 409 | if (extended_irq->interrupt_count == 0) |
| 412 | pnp_add_irq_resource(dev, 0, IORESOURCE_DISABLED); | 410 | pnp_add_irq_resource(dev, 0, IORESOURCE_DISABLED); |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 3b4a14e355c1..77cb34270fc1 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
| @@ -449,6 +449,7 @@ config SERIAL_CLPS711X_CONSOLE | |||
| 449 | config SERIAL_SAMSUNG | 449 | config SERIAL_SAMSUNG |
| 450 | tristate "Samsung SoC serial support" | 450 | tristate "Samsung SoC serial support" |
| 451 | depends on ARM && PLAT_S3C24XX | 451 | depends on ARM && PLAT_S3C24XX |
| 452 | select SERIAL_CORE | ||
| 452 | help | 453 | help |
| 453 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, | 454 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, |
| 454 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not | 455 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 964124b60db2..75e86865234c 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -226,10 +226,11 @@ EXPORT_SYMBOL_GPL(spi_alloc_device); | |||
| 226 | * Companion function to spi_alloc_device. Devices allocated with | 226 | * Companion function to spi_alloc_device. Devices allocated with |
| 227 | * spi_alloc_device can be added onto the spi bus with this function. | 227 | * spi_alloc_device can be added onto the spi bus with this function. |
| 228 | * | 228 | * |
| 229 | * Returns 0 on success; non-zero on failure | 229 | * Returns 0 on success; negative errno on failure |
| 230 | */ | 230 | */ |
| 231 | int spi_add_device(struct spi_device *spi) | 231 | int spi_add_device(struct spi_device *spi) |
| 232 | { | 232 | { |
| 233 | static DEFINE_MUTEX(spi_add_lock); | ||
| 233 | struct device *dev = spi->master->dev.parent; | 234 | struct device *dev = spi->master->dev.parent; |
| 234 | int status; | 235 | int status; |
| 235 | 236 | ||
| @@ -246,26 +247,43 @@ int spi_add_device(struct spi_device *spi) | |||
| 246 | "%s.%u", spi->master->dev.bus_id, | 247 | "%s.%u", spi->master->dev.bus_id, |
| 247 | spi->chip_select); | 248 | spi->chip_select); |
| 248 | 249 | ||
| 249 | /* drivers may modify this initial i/o setup */ | 250 | |
| 251 | /* We need to make sure there's no other device with this | ||
| 252 | * chipselect **BEFORE** we call setup(), else we'll trash | ||
| 253 | * its configuration. Lock against concurrent add() calls. | ||
| 254 | */ | ||
| 255 | mutex_lock(&spi_add_lock); | ||
| 256 | |||
| 257 | if (bus_find_device_by_name(&spi_bus_type, NULL, spi->dev.bus_id) | ||
| 258 | != NULL) { | ||
| 259 | dev_err(dev, "chipselect %d already in use\n", | ||
| 260 | spi->chip_select); | ||
| 261 | status = -EBUSY; | ||
| 262 | goto done; | ||
| 263 | } | ||
| 264 | |||
| 265 | /* Drivers may modify this initial i/o setup, but will | ||
| 266 | * normally rely on the device being setup. Devices | ||
| 267 | * using SPI_CS_HIGH can't coexist well otherwise... | ||
| 268 | */ | ||
| 250 | status = spi->master->setup(spi); | 269 | status = spi->master->setup(spi); |
| 251 | if (status < 0) { | 270 | if (status < 0) { |
| 252 | dev_err(dev, "can't %s %s, status %d\n", | 271 | dev_err(dev, "can't %s %s, status %d\n", |
| 253 | "setup", spi->dev.bus_id, status); | 272 | "setup", spi->dev.bus_id, status); |
| 254 | return status; | 273 | goto done; |
| 255 | } | 274 | } |
| 256 | 275 | ||
| 257 | /* driver core catches callers that misbehave by defining | 276 | /* Device may be bound to an active driver when this returns */ |
| 258 | * devices that already exist. | ||
| 259 | */ | ||
| 260 | status = device_add(&spi->dev); | 277 | status = device_add(&spi->dev); |
| 261 | if (status < 0) { | 278 | if (status < 0) |
| 262 | dev_err(dev, "can't %s %s, status %d\n", | 279 | dev_err(dev, "can't %s %s, status %d\n", |
| 263 | "add", spi->dev.bus_id, status); | 280 | "add", spi->dev.bus_id, status); |
| 264 | return status; | 281 | else |
| 265 | } | 282 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); |
| 266 | 283 | ||
| 267 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); | 284 | done: |
| 268 | return 0; | 285 | mutex_unlock(&spi_add_lock); |
| 286 | return status; | ||
| 269 | } | 287 | } |
| 270 | EXPORT_SYMBOL_GPL(spi_add_device); | 288 | EXPORT_SYMBOL_GPL(spi_add_device); |
| 271 | 289 | ||
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 5fbdc14e63b3..5416cf969005 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
| 14 | #include <linux/mbus.h> | 14 | #include <linux/mbus.h> |
| 15 | #include <asm/plat-orion/ehci-orion.h> | 15 | #include <plat/ehci-orion.h> |
| 16 | 16 | ||
| 17 | #define rdl(off) __raw_readl(hcd->regs + (off)) | 17 | #define rdl(off) __raw_readl(hcd->regs + (off)) |
| 18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) | 18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index bd320a2bfb7c..fb51197d1c98 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
| @@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var, | |||
| 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; | 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; |
| 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; | 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; |
| 481 | 481 | ||
| 482 | if (mfbi->x_aoi_d < 0) | ||
| 483 | mfbi->x_aoi_d = 0; | ||
| 484 | if (mfbi->y_aoi_d < 0) | ||
| 485 | mfbi->y_aoi_d = 0; | ||
| 482 | switch (index) { | 486 | switch (index) { |
| 483 | case 0: | 487 | case 0: |
| 484 | if (mfbi->x_aoi_d != 0) | 488 | if (mfbi->x_aoi_d != 0) |
| @@ -778,6 +782,22 @@ static void unmap_video_memory(struct fb_info *info) | |||
| 778 | } | 782 | } |
| 779 | 783 | ||
| 780 | /* | 784 | /* |
| 785 | * Using the fb_var_screeninfo in fb_info we set the aoi of this | ||
| 786 | * particular framebuffer. It is a light version of fsl_diu_set_par. | ||
| 787 | */ | ||
| 788 | static int fsl_diu_set_aoi(struct fb_info *info) | ||
| 789 | { | ||
| 790 | struct fb_var_screeninfo *var = &info->var; | ||
| 791 | struct mfb_info *mfbi = info->par; | ||
| 792 | struct diu_ad *ad = mfbi->ad; | ||
| 793 | |||
| 794 | /* AOI should not be greater than display size */ | ||
| 795 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); | ||
| 796 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | ||
| 797 | return 0; | ||
| 798 | } | ||
| 799 | |||
| 800 | /* | ||
| 781 | * Using the fb_var_screeninfo in fb_info we set the resolution of this | 801 | * Using the fb_var_screeninfo in fb_info we set the resolution of this |
| 782 | * particular framebuffer. This function alters the fb_fix_screeninfo stored | 802 | * particular framebuffer. This function alters the fb_fix_screeninfo stored |
| 783 | * in fb_info. It does not alter var in fb_info since we are using that | 803 | * in fb_info. It does not alter var in fb_info since we are using that |
| @@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info) | |||
| 817 | diu_ops.get_pixel_format(var->bits_per_pixel, | 837 | diu_ops.get_pixel_format(var->bits_per_pixel, |
| 818 | machine_data->monitor_port); | 838 | machine_data->monitor_port); |
| 819 | ad->addr = cpu_to_le32(info->fix.smem_start); | 839 | ad->addr = cpu_to_le32(info->fix.smem_start); |
| 820 | ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) | | 840 | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) | |
| 821 | var->xres) | mfbi->g_alpha; | 841 | var->xres_virtual) | mfbi->g_alpha; |
| 822 | /* fix me. AOI should not be greater than display size */ | 842 | /* AOI should not be greater than display size */ |
| 823 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); | 843 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); |
| 824 | ad->offset_xyi = 0; | 844 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); |
| 825 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | 845 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); |
| 826 | 846 | ||
| 827 | /* Disable chroma keying function */ | 847 | /* Disable chroma keying function */ |
| @@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var, | |||
| 921 | else | 941 | else |
| 922 | info->var.vmode &= ~FB_VMODE_YWRAP; | 942 | info->var.vmode &= ~FB_VMODE_YWRAP; |
| 923 | 943 | ||
| 944 | fsl_diu_set_aoi(info); | ||
| 945 | |||
| 924 | return 0; | 946 | return 0; |
| 925 | } | 947 | } |
| 926 | 948 | ||
| @@ -989,7 +1011,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 989 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", | 1011 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", |
| 990 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); | 1012 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); |
| 991 | fsl_diu_check_var(&info->var, info); | 1013 | fsl_diu_check_var(&info->var, info); |
| 992 | fsl_diu_set_par(info); | 1014 | fsl_diu_set_aoi(info); |
| 993 | break; | 1015 | break; |
| 994 | case MFB_GET_AOID: | 1016 | case MFB_GET_AOID: |
| 995 | aoi_d.x_aoi_d = mfbi->x_aoi_d; | 1017 | aoi_d.x_aoi_d = mfbi->x_aoi_d; |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index e7aa7ae8fca8..97204497d9f7 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -1031,7 +1031,9 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi) | |||
| 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); | 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); |
| 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); | 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); |
| 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); | 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); |
| 1034 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | 1034 | |
| 1035 | if ((lccr0 & LCCR0_PAS) == 0) | ||
| 1036 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | ||
| 1035 | } | 1037 | } |
| 1036 | 1038 | ||
| 1037 | static void pxafb_enable_controller(struct pxafb_info *fbi) | 1039 | static void pxafb_enable_controller(struct pxafb_info *fbi) |
| @@ -1400,6 +1402,8 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
| 1400 | if (lcd_conn == LCD_MONO_STN_8BPP) | 1402 | if (lcd_conn == LCD_MONO_STN_8BPP) |
| 1401 | fbi->lccr0 |= LCCR0_DPD; | 1403 | fbi->lccr0 |= LCCR0_DPD; |
| 1402 | 1404 | ||
| 1405 | fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; | ||
| 1406 | |||
| 1403 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); | 1407 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); |
| 1404 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; | 1408 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; |
| 1405 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; | 1409 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; |
| @@ -1673,53 +1677,63 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
| 1673 | #define pxafb_setup_options() (0) | 1677 | #define pxafb_setup_options() (0) |
| 1674 | #endif | 1678 | #endif |
| 1675 | 1679 | ||
| 1676 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
| 1677 | { | ||
| 1678 | struct pxafb_info *fbi; | ||
| 1679 | struct pxafb_mach_info *inf; | ||
| 1680 | struct resource *r; | ||
| 1681 | int irq, ret; | ||
| 1682 | |||
| 1683 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
| 1684 | |||
| 1685 | inf = dev->dev.platform_data; | ||
| 1686 | ret = -ENOMEM; | ||
| 1687 | fbi = NULL; | ||
| 1688 | if (!inf) | ||
| 1689 | goto failed; | ||
| 1690 | |||
| 1691 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
| 1692 | if (ret < 0) | ||
| 1693 | goto failed; | ||
| 1694 | |||
| 1695 | #ifdef DEBUG_VAR | 1680 | #ifdef DEBUG_VAR |
| 1696 | /* Check for various illegal bit-combinations. Currently only | 1681 | /* Check for various illegal bit-combinations. Currently only |
| 1697 | * a warning is given. */ | 1682 | * a warning is given. */ |
| 1683 | static void __devinit pxafb_check_options(struct device *dev, | ||
| 1684 | struct pxafb_mach_info *inf) | ||
| 1685 | { | ||
| 1686 | if (inf->lcd_conn) | ||
| 1687 | return; | ||
| 1698 | 1688 | ||
| 1699 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) | 1689 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) |
| 1700 | dev_warn(&dev->dev, "machine LCCR0 setting contains " | 1690 | dev_warn(dev, "machine LCCR0 setting contains " |
| 1701 | "illegal bits: %08x\n", | 1691 | "illegal bits: %08x\n", |
| 1702 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); | 1692 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); |
| 1703 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | 1693 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) |
| 1704 | dev_warn(&dev->dev, "machine LCCR3 setting contains " | 1694 | dev_warn(dev, "machine LCCR3 setting contains " |
| 1705 | "illegal bits: %08x\n", | 1695 | "illegal bits: %08x\n", |
| 1706 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | 1696 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); |
| 1707 | if (inf->lccr0 & LCCR0_DPD && | 1697 | if (inf->lccr0 & LCCR0_DPD && |
| 1708 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || | 1698 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || |
| 1709 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || | 1699 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || |
| 1710 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) | 1700 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) |
| 1711 | dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is " | 1701 | dev_warn(dev, "Double Pixel Data (DPD) mode is " |
| 1712 | "only valid in passive mono" | 1702 | "only valid in passive mono" |
| 1713 | " single panel mode\n"); | 1703 | " single panel mode\n"); |
| 1714 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && | 1704 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && |
| 1715 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) | 1705 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) |
| 1716 | dev_warn(&dev->dev, "Dual panel only valid in passive mode\n"); | 1706 | dev_warn(dev, "Dual panel only valid in passive mode\n"); |
| 1717 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && | 1707 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && |
| 1718 | (inf->modes->upper_margin || inf->modes->lower_margin)) | 1708 | (inf->modes->upper_margin || inf->modes->lower_margin)) |
| 1719 | dev_warn(&dev->dev, "Upper and lower margins must be 0 in " | 1709 | dev_warn(dev, "Upper and lower margins must be 0 in " |
| 1720 | "passive mode\n"); | 1710 | "passive mode\n"); |
| 1711 | } | ||
| 1712 | #else | ||
| 1713 | #define pxafb_check_options(...) do {} while (0) | ||
| 1721 | #endif | 1714 | #endif |
| 1722 | 1715 | ||
| 1716 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
| 1717 | { | ||
| 1718 | struct pxafb_info *fbi; | ||
| 1719 | struct pxafb_mach_info *inf; | ||
| 1720 | struct resource *r; | ||
| 1721 | int irq, ret; | ||
| 1722 | |||
| 1723 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
| 1724 | |||
| 1725 | inf = dev->dev.platform_data; | ||
| 1726 | ret = -ENOMEM; | ||
| 1727 | fbi = NULL; | ||
| 1728 | if (!inf) | ||
| 1729 | goto failed; | ||
| 1730 | |||
| 1731 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
| 1732 | if (ret < 0) | ||
| 1733 | goto failed; | ||
| 1734 | |||
| 1735 | pxafb_check_options(&dev->dev, inf); | ||
| 1736 | |||
| 1723 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", | 1737 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", |
| 1724 | inf->modes->xres, | 1738 | inf->modes->xres, |
| 1725 | inf->modes->yres, | 1739 | inf->modes->yres, |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 3da2b90d2fe6..22715e3be5e7 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
| @@ -157,8 +157,6 @@ static void s3c2410wdt_start(void) | |||
| 157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
| 158 | writel(wtcon, wdt_base + S3C2410_WTCON); | 158 | writel(wtcon, wdt_base + S3C2410_WTCON); |
| 159 | spin_unlock(&wdt_lock); | 159 | spin_unlock(&wdt_lock); |
| 160 | |||
| 161 | return 0; | ||
| 162 | } | 160 | } |
| 163 | 161 | ||
| 164 | static int s3c2410wdt_set_heartbeat(int timeout) | 162 | static int s3c2410wdt_set_heartbeat(int timeout) |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index e8da4ee761b5..25ecbd5b0404 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -175,6 +175,8 @@ out_no_root: | |||
| 175 | if (inode) | 175 | if (inode) |
| 176 | iput(inode); | 176 | iput(inode); |
| 177 | 177 | ||
| 178 | cifs_umount(sb, cifs_sb); | ||
| 179 | |||
| 178 | out_mount_failed: | 180 | out_mount_failed: |
| 179 | if (cifs_sb) { | 181 | if (cifs_sb) { |
| 180 | #ifdef CONFIG_CIFS_DFS_UPCALL | 182 | #ifdef CONFIG_CIFS_DFS_UPCALL |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 28a22092d450..848286861c31 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -649,6 +649,7 @@ struct inode *cifs_iget(struct super_block *sb, unsigned long ino) | |||
| 649 | inode->i_fop = &simple_dir_operations; | 649 | inode->i_fop = &simple_dir_operations; |
| 650 | inode->i_uid = cifs_sb->mnt_uid; | 650 | inode->i_uid = cifs_sb->mnt_uid; |
| 651 | inode->i_gid = cifs_sb->mnt_gid; | 651 | inode->i_gid = cifs_sb->mnt_gid; |
| 652 | } else if (rc) { | ||
| 652 | _FreeXid(xid); | 653 | _FreeXid(xid); |
| 653 | iget_failed(inode); | 654 | iget_failed(inode); |
| 654 | return ERR_PTR(rc); | 655 | return ERR_PTR(rc); |
diff --git a/fs/inode.c b/fs/inode.c index b6726f644530..0487ddba1397 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -166,6 +166,7 @@ static struct inode *alloc_inode(struct super_block *sb) | |||
| 166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); | 166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); |
| 167 | mapping->assoc_mapping = NULL; | 167 | mapping->assoc_mapping = NULL; |
| 168 | mapping->backing_dev_info = &default_backing_dev_info; | 168 | mapping->backing_dev_info = &default_backing_dev_info; |
| 169 | mapping->writeback_index = 0; | ||
| 169 | 170 | ||
| 170 | /* | 171 | /* |
| 171 | * If the block_device provides a backing_dev_info for client | 172 | * If the block_device provides a backing_dev_info for client |
diff --git a/fs/omfs/bitmap.c b/fs/omfs/bitmap.c index 697663b01bae..e1c0ec0ae989 100644 --- a/fs/omfs/bitmap.c +++ b/fs/omfs/bitmap.c | |||
| @@ -92,7 +92,7 @@ int omfs_allocate_block(struct super_block *sb, u64 block) | |||
| 92 | struct buffer_head *bh; | 92 | struct buffer_head *bh; |
| 93 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 93 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
| 94 | int bits_per_entry = 8 * sb->s_blocksize; | 94 | int bits_per_entry = 8 * sb->s_blocksize; |
| 95 | int map, bit; | 95 | unsigned int map, bit; |
| 96 | int ret = 0; | 96 | int ret = 0; |
| 97 | u64 tmp; | 97 | u64 tmp; |
| 98 | 98 | ||
| @@ -176,7 +176,8 @@ int omfs_clear_range(struct super_block *sb, u64 block, int count) | |||
| 176 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 176 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
| 177 | int bits_per_entry = 8 * sb->s_blocksize; | 177 | int bits_per_entry = 8 * sb->s_blocksize; |
| 178 | u64 tmp; | 178 | u64 tmp; |
| 179 | int map, bit, ret; | 179 | unsigned int map, bit; |
| 180 | int ret; | ||
| 180 | 181 | ||
| 181 | tmp = block; | 182 | tmp = block; |
| 182 | bit = do_div(tmp, bits_per_entry); | 183 | bit = do_div(tmp, bits_per_entry); |
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 7e2499053e4d..834b2331f6b3 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c | |||
| @@ -26,6 +26,13 @@ static int omfs_sync_file(struct file *file, struct dentry *dentry, | |||
| 26 | return err ? -EIO : 0; | 26 | return err ? -EIO : 0; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | static u32 omfs_max_extents(struct omfs_sb_info *sbi, int offset) | ||
| 30 | { | ||
| 31 | return (sbi->s_sys_blocksize - offset - | ||
| 32 | sizeof(struct omfs_extent)) / | ||
| 33 | sizeof(struct omfs_extent_entry) + 1; | ||
| 34 | } | ||
| 35 | |||
| 29 | void omfs_make_empty_table(struct buffer_head *bh, int offset) | 36 | void omfs_make_empty_table(struct buffer_head *bh, int offset) |
| 30 | { | 37 | { |
| 31 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; | 38 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; |
| @@ -45,6 +52,7 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 45 | struct buffer_head *bh; | 52 | struct buffer_head *bh; |
| 46 | u64 next, last; | 53 | u64 next, last; |
| 47 | u32 extent_count; | 54 | u32 extent_count; |
| 55 | u32 max_extents; | ||
| 48 | int ret; | 56 | int ret; |
| 49 | 57 | ||
| 50 | /* traverse extent table, freeing each entry that is greater | 58 | /* traverse extent table, freeing each entry that is greater |
| @@ -62,15 +70,18 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 62 | goto out; | 70 | goto out; |
| 63 | 71 | ||
| 64 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 72 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
| 73 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
| 65 | 74 | ||
| 66 | for (;;) { | 75 | for (;;) { |
| 67 | 76 | ||
| 68 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) { | 77 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) |
| 69 | brelse(bh); | 78 | goto out_brelse; |
| 70 | goto out; | ||
| 71 | } | ||
| 72 | 79 | ||
| 73 | extent_count = be32_to_cpu(oe->e_extent_count); | 80 | extent_count = be32_to_cpu(oe->e_extent_count); |
| 81 | |||
| 82 | if (extent_count > max_extents) | ||
| 83 | goto out_brelse; | ||
| 84 | |||
| 74 | last = next; | 85 | last = next; |
| 75 | next = be64_to_cpu(oe->e_next); | 86 | next = be64_to_cpu(oe->e_next); |
| 76 | entry = &oe->e_entry; | 87 | entry = &oe->e_entry; |
| @@ -98,10 +109,14 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 98 | if (!bh) | 109 | if (!bh) |
| 99 | goto out; | 110 | goto out; |
| 100 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 111 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
| 112 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
| 101 | } | 113 | } |
| 102 | ret = 0; | 114 | ret = 0; |
| 103 | out: | 115 | out: |
| 104 | return ret; | 116 | return ret; |
| 117 | out_brelse: | ||
| 118 | brelse(bh); | ||
| 119 | return ret; | ||
| 105 | } | 120 | } |
| 106 | 121 | ||
| 107 | static void omfs_truncate(struct inode *inode) | 122 | static void omfs_truncate(struct inode *inode) |
| @@ -154,9 +169,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe, | |||
| 154 | goto out; | 169 | goto out; |
| 155 | } | 170 | } |
| 156 | } | 171 | } |
| 157 | max_count = (sbi->s_sys_blocksize - OMFS_EXTENT_START - | 172 | max_count = omfs_max_extents(sbi, OMFS_EXTENT_START); |
| 158 | sizeof(struct omfs_extent)) / | ||
| 159 | sizeof(struct omfs_extent_entry) + 1; | ||
| 160 | 173 | ||
| 161 | /* TODO: add a continuation block here */ | 174 | /* TODO: add a continuation block here */ |
| 162 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) | 175 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) |
| @@ -225,6 +238,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 225 | sector_t next, offset; | 238 | sector_t next, offset; |
| 226 | int ret; | 239 | int ret; |
| 227 | u64 new_block; | 240 | u64 new_block; |
| 241 | u32 max_extents; | ||
| 228 | int extent_count; | 242 | int extent_count; |
| 229 | struct omfs_extent *oe; | 243 | struct omfs_extent *oe; |
| 230 | struct omfs_extent_entry *entry; | 244 | struct omfs_extent_entry *entry; |
| @@ -238,6 +252,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 238 | goto out; | 252 | goto out; |
| 239 | 253 | ||
| 240 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 254 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
| 255 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
| 241 | next = inode->i_ino; | 256 | next = inode->i_ino; |
| 242 | 257 | ||
| 243 | for (;;) { | 258 | for (;;) { |
| @@ -249,6 +264,9 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 249 | next = be64_to_cpu(oe->e_next); | 264 | next = be64_to_cpu(oe->e_next); |
| 250 | entry = &oe->e_entry; | 265 | entry = &oe->e_entry; |
| 251 | 266 | ||
| 267 | if (extent_count > max_extents) | ||
| 268 | goto out_brelse; | ||
| 269 | |||
| 252 | offset = find_block(inode, entry, block, extent_count, &remain); | 270 | offset = find_block(inode, entry, block, extent_count, &remain); |
| 253 | if (offset > 0) { | 271 | if (offset > 0) { |
| 254 | ret = 0; | 272 | ret = 0; |
| @@ -266,6 +284,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 266 | if (!bh) | 284 | if (!bh) |
| 267 | goto out; | 285 | goto out; |
| 268 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 286 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
| 287 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
| 269 | } | 288 | } |
| 270 | if (create) { | 289 | if (create) { |
| 271 | ret = omfs_grow_extent(inode, oe, &new_block); | 290 | ret = omfs_grow_extent(inode, oe, &new_block); |
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index a95fe5984f4b..d29047b1b9b0 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
| @@ -232,8 +232,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino) | |||
| 232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); | 232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); |
| 233 | inode->i_op = &omfs_dir_inops; | 233 | inode->i_op = &omfs_dir_inops; |
| 234 | inode->i_fop = &omfs_dir_operations; | 234 | inode->i_fop = &omfs_dir_operations; |
| 235 | inode->i_size = be32_to_cpu(oi->i_head.h_body_size) + | 235 | inode->i_size = sbi->s_sys_blocksize; |
| 236 | sizeof(struct omfs_header); | ||
| 237 | inc_nlink(inode); | 236 | inc_nlink(inode); |
| 238 | break; | 237 | break; |
| 239 | case OMFS_FILE: | 238 | case OMFS_FILE: |
diff --git a/fs/ubifs/budget.c b/fs/ubifs/budget.c index d81fb9ed2b8e..154098157473 100644 --- a/fs/ubifs/budget.c +++ b/fs/ubifs/budget.c | |||
| @@ -263,8 +263,8 @@ int ubifs_calc_min_idx_lebs(struct ubifs_info *c) | |||
| 263 | 263 | ||
| 264 | idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx; | 264 | idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx; |
| 265 | 265 | ||
| 266 | /* And make sure we have twice the index size of space reserved */ | 266 | /* And make sure we have thrice the index size of space reserved */ |
| 267 | idx_size <<= 1; | 267 | idx_size = idx_size + (idx_size << 1); |
| 268 | 268 | ||
| 269 | /* | 269 | /* |
| 270 | * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes' | 270 | * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes' |
| @@ -388,11 +388,11 @@ static int can_use_rp(struct ubifs_info *c) | |||
| 388 | * This function makes sure UBIFS has enough free eraseblocks for index growth | 388 | * This function makes sure UBIFS has enough free eraseblocks for index growth |
| 389 | * and data. | 389 | * and data. |
| 390 | * | 390 | * |
| 391 | * When budgeting index space, UBIFS reserves twice as more LEBs as the index | 391 | * When budgeting index space, UBIFS reserves thrice as many LEBs as the index |
| 392 | * would take if it was consolidated and written to the flash. This guarantees | 392 | * would take if it was consolidated and written to the flash. This guarantees |
| 393 | * that the "in-the-gaps" commit method always succeeds and UBIFS will always | 393 | * that the "in-the-gaps" commit method always succeeds and UBIFS will always |
| 394 | * be able to commit dirty index. So this function basically adds amount of | 394 | * be able to commit dirty index. So this function basically adds amount of |
| 395 | * budgeted index space to the size of the current index, multiplies this by 2, | 395 | * budgeted index space to the size of the current index, multiplies this by 3, |
| 396 | * and makes sure this does not exceed the amount of free eraseblocks. | 396 | * and makes sure this does not exceed the amount of free eraseblocks. |
| 397 | * | 397 | * |
| 398 | * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables: | 398 | * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables: |
| @@ -543,8 +543,16 @@ int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req) | |||
| 543 | int err, idx_growth, data_growth, dd_growth; | 543 | int err, idx_growth, data_growth, dd_growth; |
| 544 | struct retries_info ri; | 544 | struct retries_info ri; |
| 545 | 545 | ||
| 546 | ubifs_assert(req->new_page <= 1); | ||
| 547 | ubifs_assert(req->dirtied_page <= 1); | ||
| 548 | ubifs_assert(req->new_dent <= 1); | ||
| 549 | ubifs_assert(req->mod_dent <= 1); | ||
| 550 | ubifs_assert(req->new_ino <= 1); | ||
| 551 | ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA); | ||
| 546 | ubifs_assert(req->dirtied_ino <= 4); | 552 | ubifs_assert(req->dirtied_ino <= 4); |
| 547 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); | 553 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); |
| 554 | ubifs_assert(!(req->new_ino_d & 7)); | ||
| 555 | ubifs_assert(!(req->dirtied_ino_d & 7)); | ||
| 548 | 556 | ||
| 549 | data_growth = calc_data_growth(c, req); | 557 | data_growth = calc_data_growth(c, req); |
| 550 | dd_growth = calc_dd_growth(c, req); | 558 | dd_growth = calc_dd_growth(c, req); |
| @@ -618,8 +626,16 @@ again: | |||
| 618 | */ | 626 | */ |
| 619 | void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) | 627 | void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) |
| 620 | { | 628 | { |
| 629 | ubifs_assert(req->new_page <= 1); | ||
| 630 | ubifs_assert(req->dirtied_page <= 1); | ||
| 631 | ubifs_assert(req->new_dent <= 1); | ||
| 632 | ubifs_assert(req->mod_dent <= 1); | ||
| 633 | ubifs_assert(req->new_ino <= 1); | ||
| 634 | ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA); | ||
| 621 | ubifs_assert(req->dirtied_ino <= 4); | 635 | ubifs_assert(req->dirtied_ino <= 4); |
| 622 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); | 636 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); |
| 637 | ubifs_assert(!(req->new_ino_d & 7)); | ||
| 638 | ubifs_assert(!(req->dirtied_ino_d & 7)); | ||
| 623 | if (!req->recalculate) { | 639 | if (!req->recalculate) { |
| 624 | ubifs_assert(req->idx_growth >= 0); | 640 | ubifs_assert(req->idx_growth >= 0); |
| 625 | ubifs_assert(req->data_growth >= 0); | 641 | ubifs_assert(req->data_growth >= 0); |
| @@ -647,7 +663,11 @@ void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) | |||
| 647 | 663 | ||
| 648 | ubifs_assert(c->budg_idx_growth >= 0); | 664 | ubifs_assert(c->budg_idx_growth >= 0); |
| 649 | ubifs_assert(c->budg_data_growth >= 0); | 665 | ubifs_assert(c->budg_data_growth >= 0); |
| 666 | ubifs_assert(c->budg_dd_growth >= 0); | ||
| 650 | ubifs_assert(c->min_idx_lebs < c->main_lebs); | 667 | ubifs_assert(c->min_idx_lebs < c->main_lebs); |
| 668 | ubifs_assert(!(c->budg_idx_growth & 7)); | ||
| 669 | ubifs_assert(!(c->budg_data_growth & 7)); | ||
| 670 | ubifs_assert(!(c->budg_dd_growth & 7)); | ||
| 651 | spin_unlock(&c->space_lock); | 671 | spin_unlock(&c->space_lock); |
| 652 | } | 672 | } |
| 653 | 673 | ||
| @@ -686,9 +706,10 @@ void ubifs_convert_page_budget(struct ubifs_info *c) | |||
| 686 | void ubifs_release_dirty_inode_budget(struct ubifs_info *c, | 706 | void ubifs_release_dirty_inode_budget(struct ubifs_info *c, |
| 687 | struct ubifs_inode *ui) | 707 | struct ubifs_inode *ui) |
| 688 | { | 708 | { |
| 689 | struct ubifs_budget_req req = {.dd_growth = c->inode_budget, | 709 | struct ubifs_budget_req req; |
| 690 | .dirtied_ino_d = ui->data_len}; | ||
| 691 | 710 | ||
| 711 | memset(&req, 0, sizeof(struct ubifs_budget_req)); | ||
| 712 | req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8); | ||
| 692 | ubifs_release_budget(c, &req); | 713 | ubifs_release_budget(c, &req); |
| 693 | } | 714 | } |
| 694 | 715 | ||
diff --git a/fs/ubifs/commit.c b/fs/ubifs/commit.c index 3b516316c9b3..0a6aa2cc78f0 100644 --- a/fs/ubifs/commit.c +++ b/fs/ubifs/commit.c | |||
| @@ -74,6 +74,7 @@ static int do_commit(struct ubifs_info *c) | |||
| 74 | goto out_up; | 74 | goto out_up; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | c->cmt_no += 1; | ||
| 77 | err = ubifs_gc_start_commit(c); | 78 | err = ubifs_gc_start_commit(c); |
| 78 | if (err) | 79 | if (err) |
| 79 | goto out_up; | 80 | goto out_up; |
| @@ -115,7 +116,7 @@ static int do_commit(struct ubifs_info *c) | |||
| 115 | goto out; | 116 | goto out; |
| 116 | 117 | ||
| 117 | mutex_lock(&c->mst_mutex); | 118 | mutex_lock(&c->mst_mutex); |
| 118 | c->mst_node->cmt_no = cpu_to_le64(++c->cmt_no); | 119 | c->mst_node->cmt_no = cpu_to_le64(c->cmt_no); |
| 119 | c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); | 120 | c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); |
| 120 | c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); | 121 | c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); |
| 121 | c->mst_node->root_offs = cpu_to_le32(zroot.offs); | 122 | c->mst_node->root_offs = cpu_to_le32(zroot.offs); |
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 4e3aaeba4eca..b9cb77473758 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c | |||
| @@ -568,8 +568,8 @@ void dbg_dump_budget_req(const struct ubifs_budget_req *req) | |||
| 568 | void dbg_dump_lstats(const struct ubifs_lp_stats *lst) | 568 | void dbg_dump_lstats(const struct ubifs_lp_stats *lst) |
| 569 | { | 569 | { |
| 570 | spin_lock(&dbg_lock); | 570 | spin_lock(&dbg_lock); |
| 571 | printk(KERN_DEBUG "Lprops statistics: empty_lebs %d, idx_lebs %d\n", | 571 | printk(KERN_DEBUG "(pid %d) Lprops statistics: empty_lebs %d, " |
| 572 | lst->empty_lebs, lst->idx_lebs); | 572 | "idx_lebs %d\n", current->pid, lst->empty_lebs, lst->idx_lebs); |
| 573 | printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, " | 573 | printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, " |
| 574 | "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free, | 574 | "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free, |
| 575 | lst->total_dirty); | 575 | lst->total_dirty); |
| @@ -587,8 +587,8 @@ void dbg_dump_budg(struct ubifs_info *c) | |||
| 587 | struct ubifs_gced_idx_leb *idx_gc; | 587 | struct ubifs_gced_idx_leb *idx_gc; |
| 588 | 588 | ||
| 589 | spin_lock(&dbg_lock); | 589 | spin_lock(&dbg_lock); |
| 590 | printk(KERN_DEBUG "Budgeting info: budg_data_growth %lld, " | 590 | printk(KERN_DEBUG "(pid %d) Budgeting info: budg_data_growth %lld, " |
| 591 | "budg_dd_growth %lld, budg_idx_growth %lld\n", | 591 | "budg_dd_growth %lld, budg_idx_growth %lld\n", current->pid, |
| 592 | c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth); | 592 | c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth); |
| 593 | printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, " | 593 | printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, " |
| 594 | "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth, | 594 | "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth, |
| @@ -634,7 +634,7 @@ void dbg_dump_lprops(struct ubifs_info *c) | |||
| 634 | struct ubifs_lprops lp; | 634 | struct ubifs_lprops lp; |
| 635 | struct ubifs_lp_stats lst; | 635 | struct ubifs_lp_stats lst; |
| 636 | 636 | ||
| 637 | printk(KERN_DEBUG "Dumping LEB properties\n"); | 637 | printk(KERN_DEBUG "(pid %d) Dumping LEB properties\n", current->pid); |
| 638 | ubifs_get_lp_stats(c, &lst); | 638 | ubifs_get_lp_stats(c, &lst); |
| 639 | dbg_dump_lstats(&lst); | 639 | dbg_dump_lstats(&lst); |
| 640 | 640 | ||
| @@ -655,7 +655,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum) | |||
| 655 | if (dbg_failure_mode) | 655 | if (dbg_failure_mode) |
| 656 | return; | 656 | return; |
| 657 | 657 | ||
| 658 | printk(KERN_DEBUG "Dumping LEB %d\n", lnum); | 658 | printk(KERN_DEBUG "(pid %d) Dumping LEB %d\n", current->pid, lnum); |
| 659 | 659 | ||
| 660 | sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); | 660 | sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); |
| 661 | if (IS_ERR(sleb)) { | 661 | if (IS_ERR(sleb)) { |
| @@ -720,8 +720,8 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat) | |||
| 720 | { | 720 | { |
| 721 | int i; | 721 | int i; |
| 722 | 722 | ||
| 723 | printk(KERN_DEBUG "Dumping heap cat %d (%d elements)\n", | 723 | printk(KERN_DEBUG "(pid %d) Dumping heap cat %d (%d elements)\n", |
| 724 | cat, heap->cnt); | 724 | current->pid, cat, heap->cnt); |
| 725 | for (i = 0; i < heap->cnt; i++) { | 725 | for (i = 0; i < heap->cnt; i++) { |
| 726 | struct ubifs_lprops *lprops = heap->arr[i]; | 726 | struct ubifs_lprops *lprops = heap->arr[i]; |
| 727 | 727 | ||
| @@ -736,7 +736,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode, | |||
| 736 | { | 736 | { |
| 737 | int i; | 737 | int i; |
| 738 | 738 | ||
| 739 | printk(KERN_DEBUG "Dumping pnode:\n"); | 739 | printk(KERN_DEBUG "(pid %d) Dumping pnode:\n", current->pid); |
| 740 | printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n", | 740 | printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n", |
| 741 | (size_t)pnode, (size_t)parent, (size_t)pnode->cnext); | 741 | (size_t)pnode, (size_t)parent, (size_t)pnode->cnext); |
| 742 | printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n", | 742 | printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n", |
| @@ -755,7 +755,7 @@ void dbg_dump_tnc(struct ubifs_info *c) | |||
| 755 | int level; | 755 | int level; |
| 756 | 756 | ||
| 757 | printk(KERN_DEBUG "\n"); | 757 | printk(KERN_DEBUG "\n"); |
| 758 | printk(KERN_DEBUG "Dumping the TNC tree\n"); | 758 | printk(KERN_DEBUG "(pid %d) Dumping the TNC tree\n", current->pid); |
| 759 | znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); | 759 | znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); |
| 760 | level = znode->level; | 760 | level = znode->level; |
| 761 | printk(KERN_DEBUG "== Level %d ==\n", level); | 761 | printk(KERN_DEBUG "== Level %d ==\n", level); |
| @@ -2208,16 +2208,17 @@ int dbg_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset, | |||
| 2208 | int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, | 2208 | int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, |
| 2209 | int offset, int len, int dtype) | 2209 | int offset, int len, int dtype) |
| 2210 | { | 2210 | { |
| 2211 | int err; | 2211 | int err, failing; |
| 2212 | 2212 | ||
| 2213 | if (in_failure_mode(desc)) | 2213 | if (in_failure_mode(desc)) |
| 2214 | return -EIO; | 2214 | return -EIO; |
| 2215 | if (do_fail(desc, lnum, 1)) | 2215 | failing = do_fail(desc, lnum, 1); |
| 2216 | if (failing) | ||
| 2216 | cut_data(buf, len); | 2217 | cut_data(buf, len); |
| 2217 | err = ubi_leb_write(desc, lnum, buf, offset, len, dtype); | 2218 | err = ubi_leb_write(desc, lnum, buf, offset, len, dtype); |
| 2218 | if (err) | 2219 | if (err) |
| 2219 | return err; | 2220 | return err; |
| 2220 | if (in_failure_mode(desc)) | 2221 | if (failing) |
| 2221 | return -EIO; | 2222 | return -EIO; |
| 2222 | return 0; | 2223 | return 0; |
| 2223 | } | 2224 | } |
diff --git a/fs/ubifs/debug.h b/fs/ubifs/debug.h index 3c4f1e93c9e0..50315fc57185 100644 --- a/fs/ubifs/debug.h +++ b/fs/ubifs/debug.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | 27 | ||
| 28 | #define UBIFS_DBG(op) op | 28 | #define UBIFS_DBG(op) op |
| 29 | 29 | ||
| 30 | #define ubifs_assert(expr) do { \ | 30 | #define ubifs_assert(expr) do { \ |
| 31 | if (unlikely(!(expr))) { \ | 31 | if (unlikely(!(expr))) { \ |
| 32 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ | 32 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ |
| 33 | __func__, __LINE__, current->pid); \ | 33 | __func__, __LINE__, current->pid); \ |
| @@ -73,50 +73,50 @@ const char *dbg_key_str1(const struct ubifs_info *c, | |||
| 73 | const union ubifs_key *key); | 73 | const union ubifs_key *key); |
| 74 | 74 | ||
| 75 | /* | 75 | /* |
| 76 | * DBGKEY macros require dbg_lock to be held, which it is in the dbg message | 76 | * DBGKEY macros require @dbg_lock to be held, which it is in the dbg message |
| 77 | * macros. | 77 | * macros. |
| 78 | */ | 78 | */ |
| 79 | #define DBGKEY(key) dbg_key_str0(c, (key)) | 79 | #define DBGKEY(key) dbg_key_str0(c, (key)) |
| 80 | #define DBGKEY1(key) dbg_key_str1(c, (key)) | 80 | #define DBGKEY1(key) dbg_key_str1(c, (key)) |
| 81 | 81 | ||
| 82 | /* General messages */ | 82 | /* General messages */ |
| 83 | #define dbg_gen(fmt, ...) dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__) | 83 | #define dbg_gen(fmt, ...) dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__) |
| 84 | 84 | ||
| 85 | /* Additional journal messages */ | 85 | /* Additional journal messages */ |
| 86 | #define dbg_jnl(fmt, ...) dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__) | 86 | #define dbg_jnl(fmt, ...) dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__) |
| 87 | 87 | ||
| 88 | /* Additional TNC messages */ | 88 | /* Additional TNC messages */ |
| 89 | #define dbg_tnc(fmt, ...) dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__) | 89 | #define dbg_tnc(fmt, ...) dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__) |
| 90 | 90 | ||
| 91 | /* Additional lprops messages */ | 91 | /* Additional lprops messages */ |
| 92 | #define dbg_lp(fmt, ...) dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__) | 92 | #define dbg_lp(fmt, ...) dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__) |
| 93 | 93 | ||
| 94 | /* Additional LEB find messages */ | 94 | /* Additional LEB find messages */ |
| 95 | #define dbg_find(fmt, ...) dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__) | 95 | #define dbg_find(fmt, ...) dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__) |
| 96 | 96 | ||
| 97 | /* Additional mount messages */ | 97 | /* Additional mount messages */ |
| 98 | #define dbg_mnt(fmt, ...) dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__) | 98 | #define dbg_mnt(fmt, ...) dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__) |
| 99 | 99 | ||
| 100 | /* Additional I/O messages */ | 100 | /* Additional I/O messages */ |
| 101 | #define dbg_io(fmt, ...) dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__) | 101 | #define dbg_io(fmt, ...) dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__) |
| 102 | 102 | ||
| 103 | /* Additional commit messages */ | 103 | /* Additional commit messages */ |
| 104 | #define dbg_cmt(fmt, ...) dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__) | 104 | #define dbg_cmt(fmt, ...) dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__) |
| 105 | 105 | ||
| 106 | /* Additional budgeting messages */ | 106 | /* Additional budgeting messages */ |
| 107 | #define dbg_budg(fmt, ...) dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__) | 107 | #define dbg_budg(fmt, ...) dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__) |
| 108 | 108 | ||
| 109 | /* Additional log messages */ | 109 | /* Additional log messages */ |
| 110 | #define dbg_log(fmt, ...) dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__) | 110 | #define dbg_log(fmt, ...) dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__) |
| 111 | 111 | ||
| 112 | /* Additional gc messages */ | 112 | /* Additional gc messages */ |
| 113 | #define dbg_gc(fmt, ...) dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__) | 113 | #define dbg_gc(fmt, ...) dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__) |
| 114 | 114 | ||
| 115 | /* Additional scan messages */ | 115 | /* Additional scan messages */ |
| 116 | #define dbg_scan(fmt, ...) dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__) | 116 | #define dbg_scan(fmt, ...) dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__) |
| 117 | 117 | ||
| 118 | /* Additional recovery messages */ | 118 | /* Additional recovery messages */ |
| 119 | #define dbg_rcvry(fmt, ...) dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__) | 119 | #define dbg_rcvry(fmt, ...) dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__) |
| 120 | 120 | ||
| 121 | /* | 121 | /* |
| 122 | * Debugging message type flags (must match msg_type_names in debug.c). | 122 | * Debugging message type flags (must match msg_type_names in debug.c). |
| @@ -239,34 +239,23 @@ typedef int (*dbg_leaf_callback)(struct ubifs_info *c, | |||
| 239 | struct ubifs_zbranch *zbr, void *priv); | 239 | struct ubifs_zbranch *zbr, void *priv); |
| 240 | typedef int (*dbg_znode_callback)(struct ubifs_info *c, | 240 | typedef int (*dbg_znode_callback)(struct ubifs_info *c, |
| 241 | struct ubifs_znode *znode, void *priv); | 241 | struct ubifs_znode *znode, void *priv); |
| 242 | |||
| 243 | int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb, | 242 | int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb, |
| 244 | dbg_znode_callback znode_cb, void *priv); | 243 | dbg_znode_callback znode_cb, void *priv); |
| 245 | 244 | ||
| 246 | /* Checking functions */ | 245 | /* Checking functions */ |
| 247 | 246 | ||
| 248 | int dbg_check_lprops(struct ubifs_info *c); | 247 | int dbg_check_lprops(struct ubifs_info *c); |
| 249 | |||
| 250 | int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot); | 248 | int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot); |
| 251 | int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot); | 249 | int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot); |
| 252 | |||
| 253 | int dbg_check_cats(struct ubifs_info *c); | 250 | int dbg_check_cats(struct ubifs_info *c); |
| 254 | |||
| 255 | int dbg_check_ltab(struct ubifs_info *c); | 251 | int dbg_check_ltab(struct ubifs_info *c); |
| 256 | |||
| 257 | int dbg_check_synced_i_size(struct inode *inode); | 252 | int dbg_check_synced_i_size(struct inode *inode); |
| 258 | |||
| 259 | int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir); | 253 | int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir); |
| 260 | |||
| 261 | int dbg_check_tnc(struct ubifs_info *c, int extra); | 254 | int dbg_check_tnc(struct ubifs_info *c, int extra); |
| 262 | |||
| 263 | int dbg_check_idx_size(struct ubifs_info *c, long long idx_size); | 255 | int dbg_check_idx_size(struct ubifs_info *c, long long idx_size); |
| 264 | |||
| 265 | int dbg_check_filesystem(struct ubifs_info *c); | 256 | int dbg_check_filesystem(struct ubifs_info *c); |
| 266 | |||
| 267 | void dbg_check_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat, | 257 | void dbg_check_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat, |
| 268 | int add_pos); | 258 | int add_pos); |
| 269 | |||
| 270 | int dbg_check_lprops(struct ubifs_info *c); | 259 | int dbg_check_lprops(struct ubifs_info *c); |
| 271 | int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode, | 260 | int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode, |
| 272 | int row, int col); | 261 | int row, int col); |
| @@ -329,71 +318,77 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum, | |||
| 329 | #else /* !CONFIG_UBIFS_FS_DEBUG */ | 318 | #else /* !CONFIG_UBIFS_FS_DEBUG */ |
| 330 | 319 | ||
| 331 | #define UBIFS_DBG(op) | 320 | #define UBIFS_DBG(op) |
| 332 | #define ubifs_assert(expr) ({}) | 321 | |
| 333 | #define ubifs_assert_cmt_locked(c) | 322 | /* Use "if (0)" to make compiler check arguments even if debugging is off */ |
| 323 | #define ubifs_assert(expr) do { \ | ||
| 324 | if (0 && (expr)) \ | ||
| 325 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ | ||
| 326 | __func__, __LINE__, current->pid); \ | ||
| 327 | } while (0) | ||
| 328 | |||
| 329 | #define dbg_err(fmt, ...) do { \ | ||
| 330 | if (0) \ | ||
| 331 | ubifs_err(fmt, ##__VA_ARGS__); \ | ||
| 332 | } while (0) | ||
| 333 | |||
| 334 | #define dbg_msg(fmt, ...) do { \ | ||
| 335 | if (0) \ | ||
| 336 | printk(KERN_DEBUG "UBIFS DBG (pid %d): %s: " fmt "\n", \ | ||
| 337 | current->pid, __func__, ##__VA_ARGS__); \ | ||
| 338 | } while (0) | ||
| 339 | |||
| 334 | #define dbg_dump_stack() | 340 | #define dbg_dump_stack() |
| 335 | #define dbg_err(fmt, ...) ({}) | 341 | #define ubifs_assert_cmt_locked(c) |
| 336 | #define dbg_msg(fmt, ...) ({}) | ||
| 337 | #define dbg_key(c, key, fmt, ...) ({}) | ||
| 338 | |||
| 339 | #define dbg_gen(fmt, ...) ({}) | ||
| 340 | #define dbg_jnl(fmt, ...) ({}) | ||
| 341 | #define dbg_tnc(fmt, ...) ({}) | ||
| 342 | #define dbg_lp(fmt, ...) ({}) | ||
| 343 | #define dbg_find(fmt, ...) ({}) | ||
| 344 | #define dbg_mnt(fmt, ...) ({}) | ||
| 345 | #define dbg_io(fmt, ...) ({}) | ||
| 346 | #define dbg_cmt(fmt, ...) ({}) | ||
| 347 | #define dbg_budg(fmt, ...) ({}) | ||
| 348 | #define dbg_log(fmt, ...) ({}) | ||
| 349 | #define dbg_gc(fmt, ...) ({}) | ||
| 350 | #define dbg_scan(fmt, ...) ({}) | ||
| 351 | #define dbg_rcvry(fmt, ...) ({}) | ||
| 352 | |||
| 353 | #define dbg_ntype(type) "" | ||
| 354 | #define dbg_cstate(cmt_state) "" | ||
| 355 | #define dbg_get_key_dump(c, key) ({}) | ||
| 356 | #define dbg_dump_inode(c, inode) ({}) | ||
| 357 | #define dbg_dump_node(c, node) ({}) | ||
| 358 | #define dbg_dump_budget_req(req) ({}) | ||
| 359 | #define dbg_dump_lstats(lst) ({}) | ||
| 360 | #define dbg_dump_budg(c) ({}) | ||
| 361 | #define dbg_dump_lprop(c, lp) ({}) | ||
| 362 | #define dbg_dump_lprops(c) ({}) | ||
| 363 | #define dbg_dump_leb(c, lnum) ({}) | ||
| 364 | #define dbg_dump_znode(c, znode) ({}) | ||
| 365 | #define dbg_dump_heap(c, heap, cat) ({}) | ||
| 366 | #define dbg_dump_pnode(c, pnode, parent, iip) ({}) | ||
| 367 | #define dbg_dump_tnc(c) ({}) | ||
| 368 | #define dbg_dump_index(c) ({}) | ||
| 369 | 342 | ||
| 370 | #define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0 | 343 | #define dbg_gen(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) |
| 344 | #define dbg_jnl(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 345 | #define dbg_tnc(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 346 | #define dbg_lp(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 347 | #define dbg_find(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 348 | #define dbg_mnt(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 349 | #define dbg_io(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 350 | #define dbg_cmt(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 351 | #define dbg_budg(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 352 | #define dbg_log(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 353 | #define dbg_gc(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 354 | #define dbg_scan(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 355 | #define dbg_rcvry(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
| 356 | |||
| 357 | #define DBGKEY(key) ((char *)(key)) | ||
| 358 | #define DBGKEY1(key) ((char *)(key)) | ||
| 359 | |||
| 360 | #define dbg_ntype(type) "" | ||
| 361 | #define dbg_cstate(cmt_state) "" | ||
| 362 | #define dbg_get_key_dump(c, key) ({}) | ||
| 363 | #define dbg_dump_inode(c, inode) ({}) | ||
| 364 | #define dbg_dump_node(c, node) ({}) | ||
| 365 | #define dbg_dump_budget_req(req) ({}) | ||
| 366 | #define dbg_dump_lstats(lst) ({}) | ||
| 367 | #define dbg_dump_budg(c) ({}) | ||
| 368 | #define dbg_dump_lprop(c, lp) ({}) | ||
| 369 | #define dbg_dump_lprops(c) ({}) | ||
| 370 | #define dbg_dump_leb(c, lnum) ({}) | ||
| 371 | #define dbg_dump_znode(c, znode) ({}) | ||
| 372 | #define dbg_dump_heap(c, heap, cat) ({}) | ||
| 373 | #define dbg_dump_pnode(c, pnode, parent, iip) ({}) | ||
| 374 | #define dbg_dump_tnc(c) ({}) | ||
| 375 | #define dbg_dump_index(c) ({}) | ||
| 371 | 376 | ||
| 377 | #define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0 | ||
| 372 | #define dbg_old_index_check_init(c, zroot) 0 | 378 | #define dbg_old_index_check_init(c, zroot) 0 |
| 373 | #define dbg_check_old_index(c, zroot) 0 | 379 | #define dbg_check_old_index(c, zroot) 0 |
| 374 | |||
| 375 | #define dbg_check_cats(c) 0 | 380 | #define dbg_check_cats(c) 0 |
| 376 | |||
| 377 | #define dbg_check_ltab(c) 0 | 381 | #define dbg_check_ltab(c) 0 |
| 378 | |||
| 379 | #define dbg_check_synced_i_size(inode) 0 | 382 | #define dbg_check_synced_i_size(inode) 0 |
| 380 | |||
| 381 | #define dbg_check_dir_size(c, dir) 0 | 383 | #define dbg_check_dir_size(c, dir) 0 |
| 382 | |||
| 383 | #define dbg_check_tnc(c, x) 0 | 384 | #define dbg_check_tnc(c, x) 0 |
| 384 | |||
| 385 | #define dbg_check_idx_size(c, idx_size) 0 | 385 | #define dbg_check_idx_size(c, idx_size) 0 |
| 386 | |||
| 387 | #define dbg_check_filesystem(c) 0 | 386 | #define dbg_check_filesystem(c) 0 |
| 388 | |||
| 389 | #define dbg_check_heap(c, heap, cat, add_pos) ({}) | 387 | #define dbg_check_heap(c, heap, cat, add_pos) ({}) |
| 390 | |||
| 391 | #define dbg_check_lprops(c) 0 | 388 | #define dbg_check_lprops(c) 0 |
| 392 | #define dbg_check_lpt_nodes(c, cnode, row, col) 0 | 389 | #define dbg_check_lpt_nodes(c, cnode, row, col) 0 |
| 393 | |||
| 394 | #define dbg_force_in_the_gaps_enabled 0 | 390 | #define dbg_force_in_the_gaps_enabled 0 |
| 395 | #define dbg_force_in_the_gaps() 0 | 391 | #define dbg_force_in_the_gaps() 0 |
| 396 | |||
| 397 | #define dbg_failure_mode 0 | 392 | #define dbg_failure_mode 0 |
| 398 | #define dbg_failure_mode_registration(c) ({}) | 393 | #define dbg_failure_mode_registration(c) ({}) |
| 399 | #define dbg_failure_mode_deregistration(c) ({}) | 394 | #define dbg_failure_mode_deregistration(c) ({}) |
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c index e90374be7d3b..5c96f1fb7016 100644 --- a/fs/ubifs/dir.c +++ b/fs/ubifs/dir.c | |||
| @@ -165,7 +165,6 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir, | |||
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | inode->i_ino = ++c->highest_inum; | 167 | inode->i_ino = ++c->highest_inum; |
| 168 | inode->i_generation = ++c->vfs_gen; | ||
| 169 | /* | 168 | /* |
| 170 | * The creation sequence number remains with this inode for its | 169 | * The creation sequence number remains with this inode for its |
| 171 | * lifetime. All nodes for this inode have a greater sequence number, | 170 | * lifetime. All nodes for this inode have a greater sequence number, |
| @@ -220,15 +219,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 220 | 219 | ||
| 221 | err = ubifs_tnc_lookup_nm(c, &key, dent, &dentry->d_name); | 220 | err = ubifs_tnc_lookup_nm(c, &key, dent, &dentry->d_name); |
| 222 | if (err) { | 221 | if (err) { |
| 223 | /* | 222 | if (err == -ENOENT) { |
| 224 | * Do not hash the direntry if parent 'i_nlink' is zero, because | ||
| 225 | * this has side-effects - '->delete_inode()' call will not be | ||
| 226 | * called for the parent orphan inode, because 'd_count' of its | ||
| 227 | * direntry will stay 1 (it'll be negative direntry I guess) | ||
| 228 | * and prevent 'iput_final()' until the dentry is destroyed due | ||
| 229 | * to unmount or memory pressure. | ||
| 230 | */ | ||
| 231 | if (err == -ENOENT && dir->i_nlink != 0) { | ||
| 232 | dbg_gen("not found"); | 223 | dbg_gen("not found"); |
| 233 | goto done; | 224 | goto done; |
| 234 | } | 225 | } |
| @@ -525,7 +516,7 @@ static int ubifs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 525 | struct ubifs_inode *dir_ui = ubifs_inode(dir); | 516 | struct ubifs_inode *dir_ui = ubifs_inode(dir); |
| 526 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 517 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
| 527 | struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2, | 518 | struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2, |
| 528 | .dirtied_ino_d = ui->data_len }; | 519 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
| 529 | 520 | ||
| 530 | /* | 521 | /* |
| 531 | * Budget request settings: new direntry, changing the target inode, | 522 | * Budget request settings: new direntry, changing the target inode, |
| @@ -727,8 +718,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 727 | struct ubifs_inode *dir_ui = ubifs_inode(dir); | 718 | struct ubifs_inode *dir_ui = ubifs_inode(dir); |
| 728 | struct ubifs_info *c = dir->i_sb->s_fs_info; | 719 | struct ubifs_info *c = dir->i_sb->s_fs_info; |
| 729 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 720 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
| 730 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 721 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1 }; |
| 731 | .dirtied_ino_d = 1 }; | ||
| 732 | 722 | ||
| 733 | /* | 723 | /* |
| 734 | * Budget request settings: new inode, new direntry and changing parent | 724 | * Budget request settings: new inode, new direntry and changing parent |
| @@ -789,7 +779,8 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry, | |||
| 789 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 779 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
| 790 | int err, devlen = 0; | 780 | int err, devlen = 0; |
| 791 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 781 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
| 792 | .new_ino_d = devlen, .dirtied_ino = 1 }; | 782 | .new_ino_d = ALIGN(devlen, 8), |
| 783 | .dirtied_ino = 1 }; | ||
| 793 | 784 | ||
| 794 | /* | 785 | /* |
| 795 | * Budget request settings: new inode, new direntry and changing parent | 786 | * Budget request settings: new inode, new direntry and changing parent |
| @@ -863,7 +854,8 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry, | |||
| 863 | int err, len = strlen(symname); | 854 | int err, len = strlen(symname); |
| 864 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 855 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
| 865 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 856 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
| 866 | .new_ino_d = len, .dirtied_ino = 1 }; | 857 | .new_ino_d = ALIGN(len, 8), |
| 858 | .dirtied_ino = 1 }; | ||
| 867 | 859 | ||
| 868 | /* | 860 | /* |
| 869 | * Budget request settings: new inode, new direntry and changing parent | 861 | * Budget request settings: new inode, new direntry and changing parent |
| @@ -1012,7 +1004,7 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1012 | struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1, | 1004 | struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1, |
| 1013 | .dirtied_ino = 3 }; | 1005 | .dirtied_ino = 3 }; |
| 1014 | struct ubifs_budget_req ino_req = { .dirtied_ino = 1, | 1006 | struct ubifs_budget_req ino_req = { .dirtied_ino = 1, |
| 1015 | .dirtied_ino_d = old_inode_ui->data_len }; | 1007 | .dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) }; |
| 1016 | struct timespec time; | 1008 | struct timespec time; |
| 1017 | 1009 | ||
| 1018 | /* | 1010 | /* |
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 8565e586e533..4071d1cae29f 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c | |||
| @@ -890,7 +890,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode, | |||
| 890 | loff_t new_size = attr->ia_size; | 890 | loff_t new_size = attr->ia_size; |
| 891 | struct ubifs_inode *ui = ubifs_inode(inode); | 891 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 892 | struct ubifs_budget_req req = { .dirtied_ino = 1, | 892 | struct ubifs_budget_req req = { .dirtied_ino = 1, |
| 893 | .dirtied_ino_d = ui->data_len }; | 893 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
| 894 | 894 | ||
| 895 | err = ubifs_budget_space(c, &req); | 895 | err = ubifs_budget_space(c, &req); |
| 896 | if (err) | 896 | if (err) |
| @@ -941,7 +941,8 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 941 | struct inode *inode = dentry->d_inode; | 941 | struct inode *inode = dentry->d_inode; |
| 942 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 942 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
| 943 | 943 | ||
| 944 | dbg_gen("ino %lu, ia_valid %#x", inode->i_ino, attr->ia_valid); | 944 | dbg_gen("ino %lu, mode %#x, ia_valid %#x", |
| 945 | inode->i_ino, inode->i_mode, attr->ia_valid); | ||
| 945 | err = inode_change_ok(inode, attr); | 946 | err = inode_change_ok(inode, attr); |
| 946 | if (err) | 947 | if (err) |
| 947 | return err; | 948 | return err; |
| @@ -1051,7 +1052,7 @@ static int update_mctime(struct ubifs_info *c, struct inode *inode) | |||
| 1051 | if (mctime_update_needed(inode, &now)) { | 1052 | if (mctime_update_needed(inode, &now)) { |
| 1052 | int err, release; | 1053 | int err, release; |
| 1053 | struct ubifs_budget_req req = { .dirtied_ino = 1, | 1054 | struct ubifs_budget_req req = { .dirtied_ino = 1, |
| 1054 | .dirtied_ino_d = ui->data_len }; | 1055 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
| 1055 | 1056 | ||
| 1056 | err = ubifs_budget_space(c, &req); | 1057 | err = ubifs_budget_space(c, &req); |
| 1057 | if (err) | 1058 | if (err) |
| @@ -1270,6 +1271,7 @@ struct file_operations ubifs_file_operations = { | |||
| 1270 | .fsync = ubifs_fsync, | 1271 | .fsync = ubifs_fsync, |
| 1271 | .unlocked_ioctl = ubifs_ioctl, | 1272 | .unlocked_ioctl = ubifs_ioctl, |
| 1272 | .splice_read = generic_file_splice_read, | 1273 | .splice_read = generic_file_splice_read, |
| 1274 | .splice_write = generic_file_splice_write, | ||
| 1273 | #ifdef CONFIG_COMPAT | 1275 | #ifdef CONFIG_COMPAT |
| 1274 | .compat_ioctl = ubifs_compat_ioctl, | 1276 | .compat_ioctl = ubifs_compat_ioctl, |
| 1275 | #endif | 1277 | #endif |
diff --git a/fs/ubifs/find.c b/fs/ubifs/find.c index 10394c548367..adee7b5ddeab 100644 --- a/fs/ubifs/find.c +++ b/fs/ubifs/find.c | |||
| @@ -290,9 +290,14 @@ int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp, | |||
| 290 | idx_lp = idx_heap->arr[0]; | 290 | idx_lp = idx_heap->arr[0]; |
| 291 | sum = idx_lp->free + idx_lp->dirty; | 291 | sum = idx_lp->free + idx_lp->dirty; |
| 292 | /* | 292 | /* |
| 293 | * Since we reserve twice as more space for the index than it | 293 | * Since we reserve thrice as much space for the index than it |
| 294 | * actually takes, it does not make sense to pick indexing LEBs | 294 | * actually takes, it does not make sense to pick indexing LEBs |
| 295 | * with less than half LEB of dirty space. | 295 | * with less than, say, half LEB of dirty space. May be half is |
| 296 | * not the optimal boundary - this should be tested and | ||
| 297 | * checked. This boundary should determine how much we use | ||
| 298 | * in-the-gaps to consolidate the index comparing to how much | ||
| 299 | * we use garbage collector to consolidate it. The "half" | ||
| 300 | * criteria just feels to be fine. | ||
| 296 | */ | 301 | */ |
| 297 | if (sum < min_space || sum < c->half_leb_size) | 302 | if (sum < min_space || sum < c->half_leb_size) |
| 298 | idx_lp = NULL; | 303 | idx_lp = NULL; |
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c index 3374f91b6709..054363f2b207 100644 --- a/fs/ubifs/io.c +++ b/fs/ubifs/io.c | |||
| @@ -54,6 +54,20 @@ | |||
| 54 | #include "ubifs.h" | 54 | #include "ubifs.h" |
| 55 | 55 | ||
| 56 | /** | 56 | /** |
| 57 | * ubifs_ro_mode - switch UBIFS to read read-only mode. | ||
| 58 | * @c: UBIFS file-system description object | ||
| 59 | * @err: error code which is the reason of switching to R/O mode | ||
| 60 | */ | ||
| 61 | void ubifs_ro_mode(struct ubifs_info *c, int err) | ||
| 62 | { | ||
| 63 | if (!c->ro_media) { | ||
| 64 | c->ro_media = 1; | ||
| 65 | ubifs_warn("switched to read-only mode, error %d", err); | ||
| 66 | dbg_dump_stack(); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | /** | ||
| 57 | * ubifs_check_node - check node. | 71 | * ubifs_check_node - check node. |
| 58 | * @c: UBIFS file-system description object | 72 | * @c: UBIFS file-system description object |
| 59 | * @buf: node to check | 73 | * @buf: node to check |
diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c index 283155abe5f5..22993f867d19 100644 --- a/fs/ubifs/journal.c +++ b/fs/ubifs/journal.c | |||
| @@ -447,13 +447,11 @@ static int get_dent_type(int mode) | |||
| 447 | * @ino: buffer in which to pack inode node | 447 | * @ino: buffer in which to pack inode node |
| 448 | * @inode: inode to pack | 448 | * @inode: inode to pack |
| 449 | * @last: indicates the last node of the group | 449 | * @last: indicates the last node of the group |
| 450 | * @last_reference: non-zero if this is a deletion inode | ||
| 451 | */ | 450 | */ |
| 452 | static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino, | 451 | static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino, |
| 453 | const struct inode *inode, int last, | 452 | const struct inode *inode, int last) |
| 454 | int last_reference) | ||
| 455 | { | 453 | { |
| 456 | int data_len = 0; | 454 | int data_len = 0, last_reference = !inode->i_nlink; |
| 457 | struct ubifs_inode *ui = ubifs_inode(inode); | 455 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 458 | 456 | ||
| 459 | ino->ch.node_type = UBIFS_INO_NODE; | 457 | ino->ch.node_type = UBIFS_INO_NODE; |
| @@ -596,9 +594,9 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
| 596 | ubifs_prep_grp_node(c, dent, dlen, 0); | 594 | ubifs_prep_grp_node(c, dent, dlen, 0); |
| 597 | 595 | ||
| 598 | ino = (void *)dent + aligned_dlen; | 596 | ino = (void *)dent + aligned_dlen; |
| 599 | pack_inode(c, ino, inode, 0, last_reference); | 597 | pack_inode(c, ino, inode, 0); |
| 600 | ino = (void *)ino + aligned_ilen; | 598 | ino = (void *)ino + aligned_ilen; |
| 601 | pack_inode(c, ino, dir, 1, 0); | 599 | pack_inode(c, ino, dir, 1); |
| 602 | 600 | ||
| 603 | if (last_reference) { | 601 | if (last_reference) { |
| 604 | err = ubifs_add_orphan(c, inode->i_ino); | 602 | err = ubifs_add_orphan(c, inode->i_ino); |
| @@ -606,6 +604,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
| 606 | release_head(c, BASEHD); | 604 | release_head(c, BASEHD); |
| 607 | goto out_finish; | 605 | goto out_finish; |
| 608 | } | 606 | } |
| 607 | ui->del_cmtno = c->cmt_no; | ||
| 609 | } | 608 | } |
| 610 | 609 | ||
| 611 | err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync); | 610 | err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync); |
| @@ -750,30 +749,25 @@ out_free: | |||
| 750 | * ubifs_jnl_write_inode - flush inode to the journal. | 749 | * ubifs_jnl_write_inode - flush inode to the journal. |
| 751 | * @c: UBIFS file-system description object | 750 | * @c: UBIFS file-system description object |
| 752 | * @inode: inode to flush | 751 | * @inode: inode to flush |
| 753 | * @deletion: inode has been deleted | ||
| 754 | * | 752 | * |
| 755 | * This function writes inode @inode to the journal. If the inode is | 753 | * This function writes inode @inode to the journal. If the inode is |
| 756 | * synchronous, it also synchronizes the write-buffer. Returns zero in case of | 754 | * synchronous, it also synchronizes the write-buffer. Returns zero in case of |
| 757 | * success and a negative error code in case of failure. | 755 | * success and a negative error code in case of failure. |
| 758 | */ | 756 | */ |
| 759 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | 757 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode) |
| 760 | int deletion) | ||
| 761 | { | 758 | { |
| 762 | int err, len, lnum, offs, sync = 0; | 759 | int err, lnum, offs; |
| 763 | struct ubifs_ino_node *ino; | 760 | struct ubifs_ino_node *ino; |
| 764 | struct ubifs_inode *ui = ubifs_inode(inode); | 761 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 762 | int sync = 0, len = UBIFS_INO_NODE_SZ, last_reference = !inode->i_nlink; | ||
| 765 | 763 | ||
| 766 | dbg_jnl("ino %lu%s", inode->i_ino, | 764 | dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink); |
| 767 | deletion ? " (last reference)" : ""); | ||
| 768 | if (deletion) | ||
| 769 | ubifs_assert(inode->i_nlink == 0); | ||
| 770 | 765 | ||
| 771 | len = UBIFS_INO_NODE_SZ; | ||
| 772 | /* | 766 | /* |
| 773 | * If the inode is being deleted, do not write the attached data. No | 767 | * If the inode is being deleted, do not write the attached data. No |
| 774 | * need to synchronize the write-buffer either. | 768 | * need to synchronize the write-buffer either. |
| 775 | */ | 769 | */ |
| 776 | if (!deletion) { | 770 | if (!last_reference) { |
| 777 | len += ui->data_len; | 771 | len += ui->data_len; |
| 778 | sync = IS_SYNC(inode); | 772 | sync = IS_SYNC(inode); |
| 779 | } | 773 | } |
| @@ -786,7 +780,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | |||
| 786 | if (err) | 780 | if (err) |
| 787 | goto out_free; | 781 | goto out_free; |
| 788 | 782 | ||
| 789 | pack_inode(c, ino, inode, 1, deletion); | 783 | pack_inode(c, ino, inode, 1); |
| 790 | err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync); | 784 | err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync); |
| 791 | if (err) | 785 | if (err) |
| 792 | goto out_release; | 786 | goto out_release; |
| @@ -795,7 +789,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | |||
| 795 | inode->i_ino); | 789 | inode->i_ino); |
| 796 | release_head(c, BASEHD); | 790 | release_head(c, BASEHD); |
| 797 | 791 | ||
| 798 | if (deletion) { | 792 | if (last_reference) { |
| 799 | err = ubifs_tnc_remove_ino(c, inode->i_ino); | 793 | err = ubifs_tnc_remove_ino(c, inode->i_ino); |
| 800 | if (err) | 794 | if (err) |
| 801 | goto out_ro; | 795 | goto out_ro; |
| @@ -828,6 +822,65 @@ out_free: | |||
| 828 | } | 822 | } |
| 829 | 823 | ||
| 830 | /** | 824 | /** |
| 825 | * ubifs_jnl_delete_inode - delete an inode. | ||
| 826 | * @c: UBIFS file-system description object | ||
| 827 | * @inode: inode to delete | ||
| 828 | * | ||
| 829 | * This function deletes inode @inode which includes removing it from orphans, | ||
| 830 | * deleting it from TNC and, in some cases, writing a deletion inode to the | ||
| 831 | * journal. | ||
| 832 | * | ||
| 833 | * When regular file inodes are unlinked or a directory inode is removed, the | ||
| 834 | * 'ubifs_jnl_update()' function writes a corresponding deletion inode and | ||
| 835 | * direntry to the media, and adds the inode to orphans. After this, when the | ||
| 836 | * last reference to this inode has been dropped, this function is called. In | ||
| 837 | * general, it has to write one more deletion inode to the media, because if | ||
| 838 | * a commit happened between 'ubifs_jnl_update()' and | ||
| 839 | * 'ubifs_jnl_delete_inode()', the deletion inode is not in the journal | ||
| 840 | * anymore, and in fact it might not be on the flash anymore, because it might | ||
| 841 | * have been garbage-collected already. And for optimization reasons UBIFS does | ||
| 842 | * not read the orphan area if it has been unmounted cleanly, so it would have | ||
| 843 | * no indication in the journal that there is a deleted inode which has to be | ||
| 844 | * removed from TNC. | ||
| 845 | * | ||
| 846 | * However, if there was no commit between 'ubifs_jnl_update()' and | ||
| 847 | * 'ubifs_jnl_delete_inode()', then there is no need to write the deletion | ||
| 848 | * inode to the media for the second time. And this is quite a typical case. | ||
| 849 | * | ||
| 850 | * This function returns zero in case of success and a negative error code in | ||
| 851 | * case of failure. | ||
| 852 | */ | ||
| 853 | int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode) | ||
| 854 | { | ||
| 855 | int err; | ||
| 856 | struct ubifs_inode *ui = ubifs_inode(inode); | ||
| 857 | |||
| 858 | ubifs_assert(inode->i_nlink == 0); | ||
| 859 | |||
| 860 | if (ui->del_cmtno != c->cmt_no) | ||
| 861 | /* A commit happened for sure */ | ||
| 862 | return ubifs_jnl_write_inode(c, inode); | ||
| 863 | |||
| 864 | down_read(&c->commit_sem); | ||
| 865 | /* | ||
| 866 | * Check commit number again, because the first test has been done | ||
| 867 | * without @c->commit_sem, so a commit might have happened. | ||
| 868 | */ | ||
| 869 | if (ui->del_cmtno != c->cmt_no) { | ||
| 870 | up_read(&c->commit_sem); | ||
| 871 | return ubifs_jnl_write_inode(c, inode); | ||
| 872 | } | ||
| 873 | |||
| 874 | err = ubifs_tnc_remove_ino(c, inode->i_ino); | ||
| 875 | if (err) | ||
| 876 | ubifs_ro_mode(c, err); | ||
| 877 | else | ||
| 878 | ubifs_delete_orphan(c, inode->i_ino); | ||
| 879 | up_read(&c->commit_sem); | ||
| 880 | return err; | ||
| 881 | } | ||
| 882 | |||
| 883 | /** | ||
| 831 | * ubifs_jnl_rename - rename a directory entry. | 884 | * ubifs_jnl_rename - rename a directory entry. |
| 832 | * @c: UBIFS file-system description object | 885 | * @c: UBIFS file-system description object |
| 833 | * @old_dir: parent inode of directory entry to rename | 886 | * @old_dir: parent inode of directory entry to rename |
| @@ -917,16 +970,16 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | |||
| 917 | 970 | ||
| 918 | p = (void *)dent2 + aligned_dlen2; | 971 | p = (void *)dent2 + aligned_dlen2; |
| 919 | if (new_inode) { | 972 | if (new_inode) { |
| 920 | pack_inode(c, p, new_inode, 0, last_reference); | 973 | pack_inode(c, p, new_inode, 0); |
| 921 | p += ALIGN(ilen, 8); | 974 | p += ALIGN(ilen, 8); |
| 922 | } | 975 | } |
| 923 | 976 | ||
| 924 | if (!move) | 977 | if (!move) |
| 925 | pack_inode(c, p, old_dir, 1, 0); | 978 | pack_inode(c, p, old_dir, 1); |
| 926 | else { | 979 | else { |
| 927 | pack_inode(c, p, old_dir, 0, 0); | 980 | pack_inode(c, p, old_dir, 0); |
| 928 | p += ALIGN(plen, 8); | 981 | p += ALIGN(plen, 8); |
| 929 | pack_inode(c, p, new_dir, 1, 0); | 982 | pack_inode(c, p, new_dir, 1); |
| 930 | } | 983 | } |
| 931 | 984 | ||
| 932 | if (last_reference) { | 985 | if (last_reference) { |
| @@ -935,6 +988,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | |||
| 935 | release_head(c, BASEHD); | 988 | release_head(c, BASEHD); |
| 936 | goto out_finish; | 989 | goto out_finish; |
| 937 | } | 990 | } |
| 991 | new_ui->del_cmtno = c->cmt_no; | ||
| 938 | } | 992 | } |
| 939 | 993 | ||
| 940 | err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync); | 994 | err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync); |
| @@ -1131,7 +1185,7 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode, | |||
| 1131 | if (err) | 1185 | if (err) |
| 1132 | goto out_free; | 1186 | goto out_free; |
| 1133 | 1187 | ||
| 1134 | pack_inode(c, ino, inode, 0, 0); | 1188 | pack_inode(c, ino, inode, 0); |
| 1135 | ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1); | 1189 | ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1); |
| 1136 | if (dlen) | 1190 | if (dlen) |
| 1137 | ubifs_prep_grp_node(c, dn, dlen, 1); | 1191 | ubifs_prep_grp_node(c, dn, dlen, 1); |
| @@ -1251,9 +1305,9 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, | |||
| 1251 | ubifs_prep_grp_node(c, xent, xlen, 0); | 1305 | ubifs_prep_grp_node(c, xent, xlen, 0); |
| 1252 | 1306 | ||
| 1253 | ino = (void *)xent + aligned_xlen; | 1307 | ino = (void *)xent + aligned_xlen; |
| 1254 | pack_inode(c, ino, inode, 0, 1); | 1308 | pack_inode(c, ino, inode, 0); |
| 1255 | ino = (void *)ino + UBIFS_INO_NODE_SZ; | 1309 | ino = (void *)ino + UBIFS_INO_NODE_SZ; |
| 1256 | pack_inode(c, ino, host, 1, 0); | 1310 | pack_inode(c, ino, host, 1); |
| 1257 | 1311 | ||
| 1258 | err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync); | 1312 | err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync); |
| 1259 | if (!sync && !err) | 1313 | if (!sync && !err) |
| @@ -1320,7 +1374,7 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode, | |||
| 1320 | const struct inode *host) | 1374 | const struct inode *host) |
| 1321 | { | 1375 | { |
| 1322 | int err, len1, len2, aligned_len, aligned_len1, lnum, offs; | 1376 | int err, len1, len2, aligned_len, aligned_len1, lnum, offs; |
| 1323 | struct ubifs_inode *host_ui = ubifs_inode(inode); | 1377 | struct ubifs_inode *host_ui = ubifs_inode(host); |
| 1324 | struct ubifs_ino_node *ino; | 1378 | struct ubifs_ino_node *ino; |
| 1325 | union ubifs_key key; | 1379 | union ubifs_key key; |
| 1326 | int sync = IS_DIRSYNC(host); | 1380 | int sync = IS_DIRSYNC(host); |
| @@ -1344,8 +1398,8 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode, | |||
| 1344 | if (err) | 1398 | if (err) |
| 1345 | goto out_free; | 1399 | goto out_free; |
| 1346 | 1400 | ||
| 1347 | pack_inode(c, ino, host, 0, 0); | 1401 | pack_inode(c, ino, host, 0); |
| 1348 | pack_inode(c, (void *)ino + aligned_len1, inode, 1, 0); | 1402 | pack_inode(c, (void *)ino + aligned_len1, inode, 1); |
| 1349 | 1403 | ||
| 1350 | err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0); | 1404 | err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0); |
| 1351 | if (!sync && !err) { | 1405 | if (!sync && !err) { |
diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index 36857b9ed59e..3e0aa7367556 100644 --- a/fs/ubifs/log.c +++ b/fs/ubifs/log.c | |||
| @@ -317,6 +317,8 @@ int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs) | |||
| 317 | return 0; | 317 | return 0; |
| 318 | 318 | ||
| 319 | out_unlock: | 319 | out_unlock: |
| 320 | if (err != -EAGAIN) | ||
| 321 | ubifs_ro_mode(c, err); | ||
| 320 | mutex_unlock(&c->log_mutex); | 322 | mutex_unlock(&c->log_mutex); |
| 321 | kfree(ref); | 323 | kfree(ref); |
| 322 | kfree(bud); | 324 | kfree(bud); |
| @@ -410,7 +412,7 @@ int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum) | |||
| 410 | return -ENOMEM; | 412 | return -ENOMEM; |
| 411 | 413 | ||
| 412 | cs->ch.node_type = UBIFS_CS_NODE; | 414 | cs->ch.node_type = UBIFS_CS_NODE; |
| 413 | cs->cmt_no = cpu_to_le64(c->cmt_no + 1); | 415 | cs->cmt_no = cpu_to_le64(c->cmt_no); |
| 414 | ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); | 416 | ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); |
| 415 | 417 | ||
| 416 | /* | 418 | /* |
diff --git a/fs/ubifs/misc.h b/fs/ubifs/misc.h index 4beccfc256d2..87dabf9fe742 100644 --- a/fs/ubifs/misc.h +++ b/fs/ubifs/misc.h | |||
| @@ -80,20 +80,6 @@ static inline struct ubifs_inode *ubifs_inode(const struct inode *inode) | |||
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | /** | 82 | /** |
| 83 | * ubifs_ro_mode - switch UBIFS to read read-only mode. | ||
| 84 | * @c: UBIFS file-system description object | ||
| 85 | * @err: error code which is the reason of switching to R/O mode | ||
| 86 | */ | ||
| 87 | static inline void ubifs_ro_mode(struct ubifs_info *c, int err) | ||
| 88 | { | ||
| 89 | if (!c->ro_media) { | ||
| 90 | c->ro_media = 1; | ||
| 91 | ubifs_warn("switched to read-only mode, error %d", err); | ||
| 92 | dbg_dump_stack(); | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | /** | ||
| 97 | * ubifs_compr_present - check if compressor was compiled in. | 83 | * ubifs_compr_present - check if compressor was compiled in. |
| 98 | * @compr_type: compressor type to check | 84 | * @compr_type: compressor type to check |
| 99 | * | 85 | * |
| @@ -322,7 +308,7 @@ static inline long long ubifs_reported_space(const struct ubifs_info *c, | |||
| 322 | { | 308 | { |
| 323 | int divisor, factor; | 309 | int divisor, factor; |
| 324 | 310 | ||
| 325 | divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz << 1); | 311 | divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz * 3); |
| 326 | factor = UBIFS_MAX_DATA_NODE_SZ - UBIFS_DATA_NODE_SZ; | 312 | factor = UBIFS_MAX_DATA_NODE_SZ - UBIFS_DATA_NODE_SZ; |
| 327 | do_div(free, divisor); | 313 | do_div(free, divisor); |
| 328 | 314 | ||
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c index 3afeb9242c6a..02d3462f4d3e 100644 --- a/fs/ubifs/orphan.c +++ b/fs/ubifs/orphan.c | |||
| @@ -310,10 +310,10 @@ static int write_orph_node(struct ubifs_info *c, int atomic) | |||
| 310 | c->cmt_orphans -= cnt; | 310 | c->cmt_orphans -= cnt; |
| 311 | spin_unlock(&c->orphan_lock); | 311 | spin_unlock(&c->orphan_lock); |
| 312 | if (c->cmt_orphans) | 312 | if (c->cmt_orphans) |
| 313 | orph->cmt_no = cpu_to_le64(c->cmt_no + 1); | 313 | orph->cmt_no = cpu_to_le64(c->cmt_no); |
| 314 | else | 314 | else |
| 315 | /* Mark the last node of the commit */ | 315 | /* Mark the last node of the commit */ |
| 316 | orph->cmt_no = cpu_to_le64((c->cmt_no + 1) | (1ULL << 63)); | 316 | orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63)); |
| 317 | ubifs_assert(c->ohead_offs + len <= c->leb_size); | 317 | ubifs_assert(c->ohead_offs + len <= c->leb_size); |
| 318 | ubifs_assert(c->ohead_lnum >= c->orph_first); | 318 | ubifs_assert(c->ohead_lnum >= c->orph_first); |
| 319 | ubifs_assert(c->ohead_lnum <= c->orph_last); | 319 | ubifs_assert(c->ohead_lnum <= c->orph_last); |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index ca1e2d4e03cc..f71e6b8822c4 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
| 32 | #include <linux/ctype.h> | 32 | #include <linux/ctype.h> |
| 33 | #include <linux/random.h> | ||
| 34 | #include <linux/kthread.h> | 33 | #include <linux/kthread.h> |
| 35 | #include <linux/parser.h> | 34 | #include <linux/parser.h> |
| 36 | #include <linux/seq_file.h> | 35 | #include <linux/seq_file.h> |
| @@ -149,7 +148,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) | |||
| 149 | if (err) | 148 | if (err) |
| 150 | goto out_invalid; | 149 | goto out_invalid; |
| 151 | 150 | ||
| 152 | /* Disable readahead */ | 151 | /* Disable read-ahead */ |
| 153 | inode->i_mapping->backing_dev_info = &c->bdi; | 152 | inode->i_mapping->backing_dev_info = &c->bdi; |
| 154 | 153 | ||
| 155 | switch (inode->i_mode & S_IFMT) { | 154 | switch (inode->i_mode & S_IFMT) { |
| @@ -278,7 +277,7 @@ static void ubifs_destroy_inode(struct inode *inode) | |||
| 278 | */ | 277 | */ |
| 279 | static int ubifs_write_inode(struct inode *inode, int wait) | 278 | static int ubifs_write_inode(struct inode *inode, int wait) |
| 280 | { | 279 | { |
| 281 | int err; | 280 | int err = 0; |
| 282 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 281 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
| 283 | struct ubifs_inode *ui = ubifs_inode(inode); | 282 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 284 | 283 | ||
| @@ -299,10 +298,18 @@ static int ubifs_write_inode(struct inode *inode, int wait) | |||
| 299 | return 0; | 298 | return 0; |
| 300 | } | 299 | } |
| 301 | 300 | ||
| 302 | dbg_gen("inode %lu", inode->i_ino); | 301 | /* |
| 303 | err = ubifs_jnl_write_inode(c, inode, 0); | 302 | * As an optimization, do not write orphan inodes to the media just |
| 304 | if (err) | 303 | * because this is not needed. |
| 305 | ubifs_err("can't write inode %lu, error %d", inode->i_ino, err); | 304 | */ |
| 305 | dbg_gen("inode %lu, mode %#x, nlink %u", | ||
| 306 | inode->i_ino, (int)inode->i_mode, inode->i_nlink); | ||
| 307 | if (inode->i_nlink) { | ||
| 308 | err = ubifs_jnl_write_inode(c, inode); | ||
| 309 | if (err) | ||
| 310 | ubifs_err("can't write inode %lu, error %d", | ||
| 311 | inode->i_ino, err); | ||
| 312 | } | ||
| 306 | 313 | ||
| 307 | ui->dirty = 0; | 314 | ui->dirty = 0; |
| 308 | mutex_unlock(&ui->ui_mutex); | 315 | mutex_unlock(&ui->ui_mutex); |
| @@ -314,8 +321,9 @@ static void ubifs_delete_inode(struct inode *inode) | |||
| 314 | { | 321 | { |
| 315 | int err; | 322 | int err; |
| 316 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 323 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
| 324 | struct ubifs_inode *ui = ubifs_inode(inode); | ||
| 317 | 325 | ||
| 318 | if (ubifs_inode(inode)->xattr) | 326 | if (ui->xattr) |
| 319 | /* | 327 | /* |
| 320 | * Extended attribute inode deletions are fully handled in | 328 | * Extended attribute inode deletions are fully handled in |
| 321 | * 'ubifs_removexattr()'. These inodes are special and have | 329 | * 'ubifs_removexattr()'. These inodes are special and have |
| @@ -323,7 +331,7 @@ static void ubifs_delete_inode(struct inode *inode) | |||
| 323 | */ | 331 | */ |
| 324 | goto out; | 332 | goto out; |
| 325 | 333 | ||
| 326 | dbg_gen("inode %lu", inode->i_ino); | 334 | dbg_gen("inode %lu, mode %#x", inode->i_ino, (int)inode->i_mode); |
| 327 | ubifs_assert(!atomic_read(&inode->i_count)); | 335 | ubifs_assert(!atomic_read(&inode->i_count)); |
| 328 | ubifs_assert(inode->i_nlink == 0); | 336 | ubifs_assert(inode->i_nlink == 0); |
| 329 | 337 | ||
| @@ -331,15 +339,19 @@ static void ubifs_delete_inode(struct inode *inode) | |||
| 331 | if (is_bad_inode(inode)) | 339 | if (is_bad_inode(inode)) |
| 332 | goto out; | 340 | goto out; |
| 333 | 341 | ||
| 334 | ubifs_inode(inode)->ui_size = inode->i_size = 0; | 342 | ui->ui_size = inode->i_size = 0; |
| 335 | err = ubifs_jnl_write_inode(c, inode, 1); | 343 | err = ubifs_jnl_delete_inode(c, inode); |
| 336 | if (err) | 344 | if (err) |
| 337 | /* | 345 | /* |
| 338 | * Worst case we have a lost orphan inode wasting space, so a | 346 | * Worst case we have a lost orphan inode wasting space, so a |
| 339 | * simple error message is ok here. | 347 | * simple error message is OK here. |
| 340 | */ | 348 | */ |
| 341 | ubifs_err("can't write inode %lu, error %d", inode->i_ino, err); | 349 | ubifs_err("can't delete inode %lu, error %d", |
| 350 | inode->i_ino, err); | ||
| 351 | |||
| 342 | out: | 352 | out: |
| 353 | if (ui->dirty) | ||
| 354 | ubifs_release_dirty_inode_budget(c, ui); | ||
| 343 | clear_inode(inode); | 355 | clear_inode(inode); |
| 344 | } | 356 | } |
| 345 | 357 | ||
| @@ -1122,8 +1134,8 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1122 | if (err) | 1134 | if (err) |
| 1123 | goto out_infos; | 1135 | goto out_infos; |
| 1124 | 1136 | ||
| 1125 | ubifs_msg("mounted UBI device %d, volume %d", c->vi.ubi_num, | 1137 | ubifs_msg("mounted UBI device %d, volume %d, name \"%s\"", |
| 1126 | c->vi.vol_id); | 1138 | c->vi.ubi_num, c->vi.vol_id, c->vi.name); |
| 1127 | if (mounted_read_only) | 1139 | if (mounted_read_only) |
| 1128 | ubifs_msg("mounted read-only"); | 1140 | ubifs_msg("mounted read-only"); |
| 1129 | x = (long long)c->main_lebs * c->leb_size; | 1141 | x = (long long)c->main_lebs * c->leb_size; |
| @@ -1469,6 +1481,7 @@ static void ubifs_put_super(struct super_block *sb) | |||
| 1469 | */ | 1481 | */ |
| 1470 | ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0); | 1482 | ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0); |
| 1471 | ubifs_assert(c->budg_idx_growth == 0); | 1483 | ubifs_assert(c->budg_idx_growth == 0); |
| 1484 | ubifs_assert(c->budg_dd_growth == 0); | ||
| 1472 | ubifs_assert(c->budg_data_growth == 0); | 1485 | ubifs_assert(c->budg_data_growth == 0); |
| 1473 | 1486 | ||
| 1474 | /* | 1487 | /* |
| @@ -1657,7 +1670,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1657 | INIT_LIST_HEAD(&c->orph_new); | 1670 | INIT_LIST_HEAD(&c->orph_new); |
| 1658 | 1671 | ||
| 1659 | c->highest_inum = UBIFS_FIRST_INO; | 1672 | c->highest_inum = UBIFS_FIRST_INO; |
| 1660 | get_random_bytes(&c->vfs_gen, sizeof(int)); | ||
| 1661 | c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM; | 1673 | c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM; |
| 1662 | 1674 | ||
| 1663 | ubi_get_volume_info(ubi, &c->vi); | 1675 | ubi_get_volume_info(ubi, &c->vi); |
| @@ -1671,10 +1683,10 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1671 | } | 1683 | } |
| 1672 | 1684 | ||
| 1673 | /* | 1685 | /* |
| 1674 | * UBIFS provids 'backing_dev_info' in order to disable readahead. For | 1686 | * UBIFS provides 'backing_dev_info' in order to disable read-ahead. For |
| 1675 | * UBIFS, I/O is not deferred, it is done immediately in readpage, | 1687 | * UBIFS, I/O is not deferred, it is done immediately in readpage, |
| 1676 | * which means the user would have to wait not just for their own I/O | 1688 | * which means the user would have to wait not just for their own I/O |
| 1677 | * but the readahead I/O as well i.e. completely pointless. | 1689 | * but the read-ahead I/O as well i.e. completely pointless. |
| 1678 | * | 1690 | * |
| 1679 | * Read-ahead will be disabled because @c->bdi.ra_pages is 0. | 1691 | * Read-ahead will be disabled because @c->bdi.ra_pages is 0. |
| 1680 | */ | 1692 | */ |
diff --git a/fs/ubifs/tnc_commit.c b/fs/ubifs/tnc_commit.c index 8117e65ba2e9..8ac76b1c2d55 100644 --- a/fs/ubifs/tnc_commit.c +++ b/fs/ubifs/tnc_commit.c | |||
| @@ -372,26 +372,25 @@ static int layout_in_gaps(struct ubifs_info *c, int cnt) | |||
| 372 | written = layout_leb_in_gaps(c, p); | 372 | written = layout_leb_in_gaps(c, p); |
| 373 | if (written < 0) { | 373 | if (written < 0) { |
| 374 | err = written; | 374 | err = written; |
| 375 | if (err == -ENOSPC) { | 375 | if (err != -ENOSPC) { |
| 376 | if (!dbg_force_in_the_gaps_enabled) { | 376 | kfree(c->gap_lebs); |
| 377 | /* | 377 | c->gap_lebs = NULL; |
| 378 | * Do not print scary warnings if the | 378 | return err; |
| 379 | * debugging option which forces | ||
| 380 | * in-the-gaps is enabled. | ||
| 381 | */ | ||
| 382 | ubifs_err("out of space"); | ||
| 383 | spin_lock(&c->space_lock); | ||
| 384 | dbg_dump_budg(c); | ||
| 385 | spin_unlock(&c->space_lock); | ||
| 386 | dbg_dump_lprops(c); | ||
| 387 | } | ||
| 388 | /* Try to commit anyway */ | ||
| 389 | err = 0; | ||
| 390 | break; | ||
| 391 | } | 379 | } |
| 392 | kfree(c->gap_lebs); | 380 | if (!dbg_force_in_the_gaps_enabled) { |
| 393 | c->gap_lebs = NULL; | 381 | /* |
| 394 | return err; | 382 | * Do not print scary warnings if the debugging |
| 383 | * option which forces in-the-gaps is enabled. | ||
| 384 | */ | ||
| 385 | ubifs_err("out of space"); | ||
| 386 | spin_lock(&c->space_lock); | ||
| 387 | dbg_dump_budg(c); | ||
| 388 | spin_unlock(&c->space_lock); | ||
| 389 | dbg_dump_lprops(c); | ||
| 390 | } | ||
| 391 | /* Try to commit anyway */ | ||
| 392 | err = 0; | ||
| 393 | break; | ||
| 395 | } | 394 | } |
| 396 | p++; | 395 | p++; |
| 397 | cnt -= written; | 396 | cnt -= written; |
diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h index 0cc7da9bed47..bd2121f3426e 100644 --- a/fs/ubifs/ubifs-media.h +++ b/fs/ubifs/ubifs-media.h | |||
| @@ -228,10 +228,10 @@ enum { | |||
| 228 | /* Minimum number of orphan area logical eraseblocks */ | 228 | /* Minimum number of orphan area logical eraseblocks */ |
| 229 | #define UBIFS_MIN_ORPH_LEBS 1 | 229 | #define UBIFS_MIN_ORPH_LEBS 1 |
| 230 | /* | 230 | /* |
| 231 | * Minimum number of main area logical eraseblocks (buds, 2 for the index, 1 | 231 | * Minimum number of main area logical eraseblocks (buds, 3 for the index, 1 |
| 232 | * for GC, 1 for deletions, and at least 1 for committed data). | 232 | * for GC, 1 for deletions, and at least 1 for committed data). |
| 233 | */ | 233 | */ |
| 234 | #define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 5) | 234 | #define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 6) |
| 235 | 235 | ||
| 236 | /* Minimum number of logical eraseblocks */ | 236 | /* Minimum number of logical eraseblocks */ |
| 237 | #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ | 237 | #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index e4f89f271827..d7f706f7a302 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
| @@ -20,8 +20,6 @@ | |||
| 20 | * Adrian Hunter | 20 | * Adrian Hunter |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | /* Implementation version 0.7 */ | ||
| 24 | |||
| 25 | #ifndef __UBIFS_H__ | 23 | #ifndef __UBIFS_H__ |
| 26 | #define __UBIFS_H__ | 24 | #define __UBIFS_H__ |
| 27 | 25 | ||
| @@ -322,6 +320,8 @@ struct ubifs_gced_idx_leb { | |||
| 322 | * struct ubifs_inode - UBIFS in-memory inode description. | 320 | * struct ubifs_inode - UBIFS in-memory inode description. |
| 323 | * @vfs_inode: VFS inode description object | 321 | * @vfs_inode: VFS inode description object |
| 324 | * @creat_sqnum: sequence number at time of creation | 322 | * @creat_sqnum: sequence number at time of creation |
| 323 | * @del_cmtno: commit number corresponding to the time the inode was deleted, | ||
| 324 | * protected by @c->commit_sem; | ||
| 325 | * @xattr_size: summarized size of all extended attributes in bytes | 325 | * @xattr_size: summarized size of all extended attributes in bytes |
| 326 | * @xattr_cnt: count of extended attributes this inode has | 326 | * @xattr_cnt: count of extended attributes this inode has |
| 327 | * @xattr_names: sum of lengths of all extended attribute names belonging to | 327 | * @xattr_names: sum of lengths of all extended attribute names belonging to |
| @@ -373,6 +373,7 @@ struct ubifs_gced_idx_leb { | |||
| 373 | struct ubifs_inode { | 373 | struct ubifs_inode { |
| 374 | struct inode vfs_inode; | 374 | struct inode vfs_inode; |
| 375 | unsigned long long creat_sqnum; | 375 | unsigned long long creat_sqnum; |
| 376 | unsigned long long del_cmtno; | ||
| 376 | unsigned int xattr_size; | 377 | unsigned int xattr_size; |
| 377 | unsigned int xattr_cnt; | 378 | unsigned int xattr_cnt; |
| 378 | unsigned int xattr_names; | 379 | unsigned int xattr_names; |
| @@ -779,7 +780,7 @@ struct ubifs_compressor { | |||
| 779 | /** | 780 | /** |
| 780 | * struct ubifs_budget_req - budget requirements of an operation. | 781 | * struct ubifs_budget_req - budget requirements of an operation. |
| 781 | * | 782 | * |
| 782 | * @fast: non-zero if the budgeting should try to aquire budget quickly and | 783 | * @fast: non-zero if the budgeting should try to acquire budget quickly and |
| 783 | * should not try to call write-back | 784 | * should not try to call write-back |
| 784 | * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields | 785 | * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields |
| 785 | * have to be re-calculated | 786 | * have to be re-calculated |
| @@ -805,21 +806,31 @@ struct ubifs_compressor { | |||
| 805 | * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d | 806 | * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d |
| 806 | * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made | 807 | * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made |
| 807 | * dirty by the re-name operation. | 808 | * dirty by the re-name operation. |
| 809 | * | ||
| 810 | * Note, UBIFS aligns node lengths to 8-bytes boundary, so the requester has to | ||
| 811 | * make sure the amount of inode data which contribute to @new_ino_d and | ||
| 812 | * @dirtied_ino_d fields are aligned. | ||
| 808 | */ | 813 | */ |
| 809 | struct ubifs_budget_req { | 814 | struct ubifs_budget_req { |
| 810 | unsigned int fast:1; | 815 | unsigned int fast:1; |
| 811 | unsigned int recalculate:1; | 816 | unsigned int recalculate:1; |
| 817 | #ifndef UBIFS_DEBUG | ||
| 812 | unsigned int new_page:1; | 818 | unsigned int new_page:1; |
| 813 | unsigned int dirtied_page:1; | 819 | unsigned int dirtied_page:1; |
| 814 | unsigned int new_dent:1; | 820 | unsigned int new_dent:1; |
| 815 | unsigned int mod_dent:1; | 821 | unsigned int mod_dent:1; |
| 816 | unsigned int new_ino:1; | 822 | unsigned int new_ino:1; |
| 817 | unsigned int new_ino_d:13; | 823 | unsigned int new_ino_d:13; |
| 818 | #ifndef UBIFS_DEBUG | ||
| 819 | unsigned int dirtied_ino:4; | 824 | unsigned int dirtied_ino:4; |
| 820 | unsigned int dirtied_ino_d:15; | 825 | unsigned int dirtied_ino_d:15; |
| 821 | #else | 826 | #else |
| 822 | /* Not bit-fields to check for overflows */ | 827 | /* Not bit-fields to check for overflows */ |
| 828 | unsigned int new_page; | ||
| 829 | unsigned int dirtied_page; | ||
| 830 | unsigned int new_dent; | ||
| 831 | unsigned int mod_dent; | ||
| 832 | unsigned int new_ino; | ||
| 833 | unsigned int new_ino_d; | ||
| 823 | unsigned int dirtied_ino; | 834 | unsigned int dirtied_ino; |
| 824 | unsigned int dirtied_ino_d; | 835 | unsigned int dirtied_ino_d; |
| 825 | #endif | 836 | #endif |
| @@ -860,13 +871,13 @@ struct ubifs_mount_opts { | |||
| 860 | * struct ubifs_info - UBIFS file-system description data structure | 871 | * struct ubifs_info - UBIFS file-system description data structure |
| 861 | * (per-superblock). | 872 | * (per-superblock). |
| 862 | * @vfs_sb: VFS @struct super_block object | 873 | * @vfs_sb: VFS @struct super_block object |
| 863 | * @bdi: backing device info object to make VFS happy and disable readahead | 874 | * @bdi: backing device info object to make VFS happy and disable read-ahead |
| 864 | * | 875 | * |
| 865 | * @highest_inum: highest used inode number | 876 | * @highest_inum: highest used inode number |
| 866 | * @vfs_gen: VFS inode generation counter | ||
| 867 | * @max_sqnum: current global sequence number | 877 | * @max_sqnum: current global sequence number |
| 868 | * @cmt_no: commit number (last successfully completed commit) | 878 | * @cmt_no: commit number of the last successfully completed commit, protected |
| 869 | * @cnt_lock: protects @highest_inum, @vfs_gen, and @max_sqnum counters | 879 | * by @commit_sem |
| 880 | * @cnt_lock: protects @highest_inum and @max_sqnum counters | ||
| 870 | * @fmt_version: UBIFS on-flash format version | 881 | * @fmt_version: UBIFS on-flash format version |
| 871 | * @uuid: UUID from super block | 882 | * @uuid: UUID from super block |
| 872 | * | 883 | * |
| @@ -1103,7 +1114,6 @@ struct ubifs_info { | |||
| 1103 | struct backing_dev_info bdi; | 1114 | struct backing_dev_info bdi; |
| 1104 | 1115 | ||
| 1105 | ino_t highest_inum; | 1116 | ino_t highest_inum; |
| 1106 | unsigned int vfs_gen; | ||
| 1107 | unsigned long long max_sqnum; | 1117 | unsigned long long max_sqnum; |
| 1108 | unsigned long long cmt_no; | 1118 | unsigned long long cmt_no; |
| 1109 | spinlock_t cnt_lock; | 1119 | spinlock_t cnt_lock; |
| @@ -1346,6 +1356,7 @@ extern struct backing_dev_info ubifs_backing_dev_info; | |||
| 1346 | extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; | 1356 | extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; |
| 1347 | 1357 | ||
| 1348 | /* io.c */ | 1358 | /* io.c */ |
| 1359 | void ubifs_ro_mode(struct ubifs_info *c, int err); | ||
| 1349 | int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); | 1360 | int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); |
| 1350 | int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, | 1361 | int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, |
| 1351 | int dtype); | 1362 | int dtype); |
| @@ -1399,8 +1410,8 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
| 1399 | int deletion, int xent); | 1410 | int deletion, int xent); |
| 1400 | int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, | 1411 | int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, |
| 1401 | const union ubifs_key *key, const void *buf, int len); | 1412 | const union ubifs_key *key, const void *buf, int len); |
| 1402 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | 1413 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode); |
| 1403 | int last_reference); | 1414 | int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode); |
| 1404 | int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | 1415 | int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, |
| 1405 | const struct dentry *old_dentry, | 1416 | const struct dentry *old_dentry, |
| 1406 | const struct inode *new_dir, | 1417 | const struct inode *new_dir, |
diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c index 1388a078e1a9..649bec78b645 100644 --- a/fs/ubifs/xattr.c +++ b/fs/ubifs/xattr.c | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | 61 | ||
| 62 | /* | 62 | /* |
| 63 | * Limit the number of extended attributes per inode so that the total size | 63 | * Limit the number of extended attributes per inode so that the total size |
| 64 | * (xattr_size) is guaranteeded to fit in an 'unsigned int'. | 64 | * (@xattr_size) is guaranteeded to fit in an 'unsigned int'. |
| 65 | */ | 65 | */ |
| 66 | #define MAX_XATTRS_PER_INODE 65535 | 66 | #define MAX_XATTRS_PER_INODE 65535 |
| 67 | 67 | ||
| @@ -103,14 +103,14 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
| 103 | struct inode *inode; | 103 | struct inode *inode; |
| 104 | struct ubifs_inode *ui, *host_ui = ubifs_inode(host); | 104 | struct ubifs_inode *ui, *host_ui = ubifs_inode(host); |
| 105 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 105 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
| 106 | .new_ino_d = size, .dirtied_ino = 1, | 106 | .new_ino_d = ALIGN(size, 8), .dirtied_ino = 1, |
| 107 | .dirtied_ino_d = host_ui->data_len}; | 107 | .dirtied_ino_d = ALIGN(host_ui->data_len, 8) }; |
| 108 | 108 | ||
| 109 | if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE) | 109 | if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE) |
| 110 | return -ENOSPC; | 110 | return -ENOSPC; |
| 111 | /* | 111 | /* |
| 112 | * Linux limits the maximum size of the extended attribute names list | 112 | * Linux limits the maximum size of the extended attribute names list |
| 113 | * to %XATTR_LIST_MAX. This means we should not allow creating more* | 113 | * to %XATTR_LIST_MAX. This means we should not allow creating more |
| 114 | * extended attributes if the name list becomes larger. This limitation | 114 | * extended attributes if the name list becomes larger. This limitation |
| 115 | * is artificial for UBIFS, though. | 115 | * is artificial for UBIFS, though. |
| 116 | */ | 116 | */ |
| @@ -128,7 +128,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
| 128 | goto out_budg; | 128 | goto out_budg; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | mutex_lock(&host_ui->ui_mutex); | ||
| 132 | /* Re-define all operations to be "nothing" */ | 131 | /* Re-define all operations to be "nothing" */ |
| 133 | inode->i_mapping->a_ops = &none_address_operations; | 132 | inode->i_mapping->a_ops = &none_address_operations; |
| 134 | inode->i_op = &none_inode_operations; | 133 | inode->i_op = &none_inode_operations; |
| @@ -141,23 +140,19 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
| 141 | ui->data = kmalloc(size, GFP_NOFS); | 140 | ui->data = kmalloc(size, GFP_NOFS); |
| 142 | if (!ui->data) { | 141 | if (!ui->data) { |
| 143 | err = -ENOMEM; | 142 | err = -ENOMEM; |
| 144 | goto out_unlock; | 143 | goto out_free; |
| 145 | } | 144 | } |
| 146 | |||
| 147 | memcpy(ui->data, value, size); | 145 | memcpy(ui->data, value, size); |
| 146 | inode->i_size = ui->ui_size = size; | ||
| 147 | ui->data_len = size; | ||
| 148 | |||
| 149 | mutex_lock(&host_ui->ui_mutex); | ||
| 148 | host->i_ctime = ubifs_current_time(host); | 150 | host->i_ctime = ubifs_current_time(host); |
| 149 | host_ui->xattr_cnt += 1; | 151 | host_ui->xattr_cnt += 1; |
| 150 | host_ui->xattr_size += CALC_DENT_SIZE(nm->len); | 152 | host_ui->xattr_size += CALC_DENT_SIZE(nm->len); |
| 151 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | 153 | host_ui->xattr_size += CALC_XATTR_BYTES(size); |
| 152 | host_ui->xattr_names += nm->len; | 154 | host_ui->xattr_names += nm->len; |
| 153 | 155 | ||
| 154 | /* | ||
| 155 | * We do not use i_size_write() because nobody can race with us as we | ||
| 156 | * are holding host @host->i_mutex - every xattr operation for this | ||
| 157 | * inode is serialized by it. | ||
| 158 | */ | ||
| 159 | inode->i_size = ui->ui_size = size; | ||
| 160 | ui->data_len = size; | ||
| 161 | err = ubifs_jnl_update(c, host, nm, inode, 0, 1); | 156 | err = ubifs_jnl_update(c, host, nm, inode, 0, 1); |
| 162 | if (err) | 157 | if (err) |
| 163 | goto out_cancel; | 158 | goto out_cancel; |
| @@ -172,8 +167,8 @@ out_cancel: | |||
| 172 | host_ui->xattr_cnt -= 1; | 167 | host_ui->xattr_cnt -= 1; |
| 173 | host_ui->xattr_size -= CALC_DENT_SIZE(nm->len); | 168 | host_ui->xattr_size -= CALC_DENT_SIZE(nm->len); |
| 174 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); | 169 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); |
| 175 | out_unlock: | ||
| 176 | mutex_unlock(&host_ui->ui_mutex); | 170 | mutex_unlock(&host_ui->ui_mutex); |
| 171 | out_free: | ||
| 177 | make_bad_inode(inode); | 172 | make_bad_inode(inode); |
| 178 | iput(inode); | 173 | iput(inode); |
| 179 | out_budg: | 174 | out_budg: |
| @@ -200,29 +195,28 @@ static int change_xattr(struct ubifs_info *c, struct inode *host, | |||
| 200 | struct ubifs_inode *host_ui = ubifs_inode(host); | 195 | struct ubifs_inode *host_ui = ubifs_inode(host); |
| 201 | struct ubifs_inode *ui = ubifs_inode(inode); | 196 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 202 | struct ubifs_budget_req req = { .dirtied_ino = 2, | 197 | struct ubifs_budget_req req = { .dirtied_ino = 2, |
| 203 | .dirtied_ino_d = size + host_ui->data_len }; | 198 | .dirtied_ino_d = ALIGN(size, 8) + ALIGN(host_ui->data_len, 8) }; |
| 204 | 199 | ||
| 205 | ubifs_assert(ui->data_len == inode->i_size); | 200 | ubifs_assert(ui->data_len == inode->i_size); |
| 206 | err = ubifs_budget_space(c, &req); | 201 | err = ubifs_budget_space(c, &req); |
| 207 | if (err) | 202 | if (err) |
| 208 | return err; | 203 | return err; |
| 209 | 204 | ||
| 210 | mutex_lock(&host_ui->ui_mutex); | ||
| 211 | host->i_ctime = ubifs_current_time(host); | ||
| 212 | host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len); | ||
| 213 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | ||
| 214 | |||
| 215 | kfree(ui->data); | 205 | kfree(ui->data); |
| 216 | ui->data = kmalloc(size, GFP_NOFS); | 206 | ui->data = kmalloc(size, GFP_NOFS); |
| 217 | if (!ui->data) { | 207 | if (!ui->data) { |
| 218 | err = -ENOMEM; | 208 | err = -ENOMEM; |
| 219 | goto out_unlock; | 209 | goto out_free; |
| 220 | } | 210 | } |
| 221 | |||
| 222 | memcpy(ui->data, value, size); | 211 | memcpy(ui->data, value, size); |
| 223 | inode->i_size = ui->ui_size = size; | 212 | inode->i_size = ui->ui_size = size; |
| 224 | ui->data_len = size; | 213 | ui->data_len = size; |
| 225 | 214 | ||
| 215 | mutex_lock(&host_ui->ui_mutex); | ||
| 216 | host->i_ctime = ubifs_current_time(host); | ||
| 217 | host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len); | ||
| 218 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | ||
| 219 | |||
| 226 | /* | 220 | /* |
| 227 | * It is important to write the host inode after the xattr inode | 221 | * It is important to write the host inode after the xattr inode |
| 228 | * because if the host inode gets synchronized (via 'fsync()'), then | 222 | * because if the host inode gets synchronized (via 'fsync()'), then |
| @@ -240,9 +234,9 @@ static int change_xattr(struct ubifs_info *c, struct inode *host, | |||
| 240 | out_cancel: | 234 | out_cancel: |
| 241 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); | 235 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); |
| 242 | host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len); | 236 | host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len); |
| 243 | make_bad_inode(inode); | ||
| 244 | out_unlock: | ||
| 245 | mutex_unlock(&host_ui->ui_mutex); | 237 | mutex_unlock(&host_ui->ui_mutex); |
| 238 | make_bad_inode(inode); | ||
| 239 | out_free: | ||
| 246 | ubifs_release_budget(c, &req); | 240 | ubifs_release_budget(c, &req); |
| 247 | return err; | 241 | return err; |
| 248 | } | 242 | } |
| @@ -312,6 +306,7 @@ int ubifs_setxattr(struct dentry *dentry, const char *name, | |||
| 312 | 306 | ||
| 313 | dbg_gen("xattr '%s', host ino %lu ('%.*s'), size %zd", name, | 307 | dbg_gen("xattr '%s', host ino %lu ('%.*s'), size %zd", name, |
| 314 | host->i_ino, dentry->d_name.len, dentry->d_name.name, size); | 308 | host->i_ino, dentry->d_name.len, dentry->d_name.name, size); |
| 309 | ubifs_assert(mutex_is_locked(&host->i_mutex)); | ||
| 315 | 310 | ||
| 316 | if (size > UBIFS_MAX_INO_DATA) | 311 | if (size > UBIFS_MAX_INO_DATA) |
| 317 | return -ERANGE; | 312 | return -ERANGE; |
| @@ -384,7 +379,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | |||
| 384 | if (!xent) | 379 | if (!xent) |
| 385 | return -ENOMEM; | 380 | return -ENOMEM; |
| 386 | 381 | ||
| 387 | mutex_lock(&host->i_mutex); | ||
| 388 | xent_key_init(c, &key, host->i_ino, &nm); | 382 | xent_key_init(c, &key, host->i_ino, &nm); |
| 389 | err = ubifs_tnc_lookup_nm(c, &key, xent, &nm); | 383 | err = ubifs_tnc_lookup_nm(c, &key, xent, &nm); |
| 390 | if (err) { | 384 | if (err) { |
| @@ -419,7 +413,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | |||
| 419 | out_iput: | 413 | out_iput: |
| 420 | iput(inode); | 414 | iput(inode); |
| 421 | out_unlock: | 415 | out_unlock: |
| 422 | mutex_unlock(&host->i_mutex); | ||
| 423 | kfree(xent); | 416 | kfree(xent); |
| 424 | return err; | 417 | return err; |
| 425 | } | 418 | } |
| @@ -449,8 +442,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
| 449 | return -ERANGE; | 442 | return -ERANGE; |
| 450 | 443 | ||
| 451 | lowest_xent_key(c, &key, host->i_ino); | 444 | lowest_xent_key(c, &key, host->i_ino); |
| 452 | |||
| 453 | mutex_lock(&host->i_mutex); | ||
| 454 | while (1) { | 445 | while (1) { |
| 455 | int type; | 446 | int type; |
| 456 | 447 | ||
| @@ -479,7 +470,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
| 479 | pxent = xent; | 470 | pxent = xent; |
| 480 | key_read(c, &xent->key, &key); | 471 | key_read(c, &xent->key, &key); |
| 481 | } | 472 | } |
| 482 | mutex_unlock(&host->i_mutex); | ||
| 483 | 473 | ||
| 484 | kfree(pxent); | 474 | kfree(pxent); |
| 485 | if (err != -ENOENT) { | 475 | if (err != -ENOENT) { |
| @@ -497,8 +487,8 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host, | |||
| 497 | int err; | 487 | int err; |
| 498 | struct ubifs_inode *host_ui = ubifs_inode(host); | 488 | struct ubifs_inode *host_ui = ubifs_inode(host); |
| 499 | struct ubifs_inode *ui = ubifs_inode(inode); | 489 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 500 | struct ubifs_budget_req req = { .dirtied_ino = 1, .mod_dent = 1, | 490 | struct ubifs_budget_req req = { .dirtied_ino = 2, .mod_dent = 1, |
| 501 | .dirtied_ino_d = host_ui->data_len }; | 491 | .dirtied_ino_d = ALIGN(host_ui->data_len, 8) }; |
| 502 | 492 | ||
| 503 | ubifs_assert(ui->data_len == inode->i_size); | 493 | ubifs_assert(ui->data_len == inode->i_size); |
| 504 | 494 | ||
diff --git a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h index 9ed70a050580..c34008507b69 100644 --- a/include/acpi/acnamesp.h +++ b/include/acpi/acnamesp.h | |||
| @@ -182,7 +182,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); | |||
| 182 | */ | 182 | */ |
| 183 | u32 acpi_ns_opens_scope(acpi_object_type type); | 183 | u32 acpi_ns_opens_scope(acpi_object_type type); |
| 184 | 184 | ||
| 185 | void | 185 | acpi_status |
| 186 | acpi_ns_build_external_path(struct acpi_namespace_node *node, | 186 | acpi_ns_build_external_path(struct acpi_namespace_node *node, |
| 187 | acpi_size size, char *name_buffer); | 187 | acpi_size size, char *name_buffer); |
| 188 | 188 | ||
diff --git a/include/asm-arm/plat-s3c/regs-nand.h b/include/asm-arm/plat-s3c/regs-nand.h index 09f0b5503f5b..b2caa4bca270 100644 --- a/include/asm-arm/plat-s3c/regs-nand.h +++ b/include/asm-arm/plat-s3c/regs-nand.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_REGS_NAND | 13 | #ifndef __ASM_ARM_REGS_NAND |
| 14 | #define __ASM_ARM_REGS_NAND "$Id: nand.h,v 1.3 2003/12/09 11:36:29 ben Exp $" | 14 | #define __ASM_ARM_REGS_NAND |
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | #define S3C2410_NFREG(x) (x) | 17 | #define S3C2410_NFREG(x) (x) |
diff --git a/include/asm-arm/plat-s3c/regs-timer.h b/include/asm-arm/plat-s3c/regs-timer.h index b4366ea39677..cc0eedd53e38 100644 --- a/include/asm-arm/plat-s3c/regs-timer.h +++ b/include/asm-arm/plat-s3c/regs-timer.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_TIMER_H | 14 | #ifndef __ASM_ARCH_REGS_TIMER_H |
| 15 | #define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $" | 15 | #define __ASM_ARCH_REGS_TIMER_H |
| 16 | 16 | ||
| 17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) | 17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) |
| 18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) | 18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) |
diff --git a/include/asm-arm/plat-s3c/regs-watchdog.h b/include/asm-arm/plat-s3c/regs-watchdog.h index 1229f076c0a0..4938492470f7 100644 --- a/include/asm-arm/plat-s3c/regs-watchdog.h +++ b/include/asm-arm/plat-s3c/regs-watchdog.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H | 14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H |
| 15 | #define __ASM_ARCH_REGS_WATCHDOG_H "$Id: watchdog.h,v 1.2 2003/04/29 13:31:09 ben Exp $" | 15 | #define __ASM_ARCH_REGS_WATCHDOG_H |
| 16 | 16 | ||
| 17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) | 17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) |
| 18 | 18 | ||
diff --git a/include/asm-arm/plat-s3c24xx/s3c2410.h b/include/asm-arm/plat-s3c24xx/s3c2410.h index 36de0b835873..3cd1ec677b3f 100644 --- a/include/asm-arm/plat-s3c24xx/s3c2410.h +++ b/include/asm-arm/plat-s3c24xx/s3c2410.h | |||
| @@ -21,11 +21,11 @@ extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); | |||
| 21 | 21 | ||
| 22 | extern void s3c2410_init_clocks(int xtal); | 22 | extern void s3c2410_init_clocks(int xtal); |
| 23 | 23 | ||
| 24 | extern int s3c2410_baseclk_add(void); | ||
| 25 | |||
| 26 | #else | 24 | #else |
| 27 | #define s3c2410_init_clocks NULL | 25 | #define s3c2410_init_clocks NULL |
| 28 | #define s3c2410_init_uarts NULL | 26 | #define s3c2410_init_uarts NULL |
| 29 | #define s3c2410_map_io NULL | 27 | #define s3c2410_map_io NULL |
| 30 | #define s3c2410_init NULL | 28 | #define s3c2410_init NULL |
| 31 | #endif | 29 | #endif |
| 30 | |||
| 31 | extern int s3c2410_baseclk_add(void); | ||
diff --git a/include/asm-blackfin/Kbuild b/include/asm-blackfin/Kbuild index 71f8fe783258..606ecfdcc962 100644 --- a/include/asm-blackfin/Kbuild +++ b/include/asm-blackfin/Kbuild | |||
| @@ -1,3 +1,3 @@ | |||
| 1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
| 2 | 2 | ||
| 3 | header-y += fixed_code.h | 3 | unifdef-y += fixed_code.h |
diff --git a/include/asm-blackfin/bfin-global.h b/include/asm-blackfin/bfin-global.h index 320aa5e167e9..7ba70de66f2b 100644 --- a/include/asm-blackfin/bfin-global.h +++ b/include/asm-blackfin/bfin-global.h | |||
| @@ -56,37 +56,20 @@ extern void dump_bfin_process(struct pt_regs *regs); | |||
| 56 | extern void dump_bfin_mem(struct pt_regs *regs); | 56 | extern void dump_bfin_mem(struct pt_regs *regs); |
| 57 | extern void dump_bfin_trace_buffer(void); | 57 | extern void dump_bfin_trace_buffer(void); |
| 58 | 58 | ||
| 59 | /* init functions only */ | ||
| 59 | extern int init_arch_irq(void); | 60 | extern int init_arch_irq(void); |
| 60 | extern void bfin_reset(void); | ||
| 61 | extern void _cplb_hdr(void); | ||
| 62 | /* Blackfin cache functions */ | ||
| 63 | extern void bfin_icache_init(void); | 61 | extern void bfin_icache_init(void); |
| 64 | extern void bfin_dcache_init(void); | 62 | extern void bfin_dcache_init(void); |
| 65 | extern int read_iloc(void); | ||
| 66 | extern int bfin_console_init(void); | ||
| 67 | extern asmlinkage void lower_to_irq14(void); | ||
| 68 | extern asmlinkage void bfin_return_from_exception(void); | ||
| 69 | extern void init_exception_vectors(void); | 63 | extern void init_exception_vectors(void); |
| 70 | extern void init_dma(void); | ||
| 71 | extern void program_IAR(void); | 64 | extern void program_IAR(void); |
| 72 | extern void evt14_softirq(void); | 65 | |
| 66 | extern void bfin_reset(void); | ||
| 67 | extern asmlinkage void lower_to_irq14(void); | ||
| 68 | extern asmlinkage void bfin_return_from_exception(void); | ||
| 69 | extern asmlinkage void evt14_softirq(void); | ||
| 73 | extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs); | 70 | extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs); |
| 74 | extern void bfin_gpio_interrupt_setup(int irq, int irq_pfx, int type); | ||
| 75 | extern int bfin_internal_set_wake(unsigned int irq, unsigned int state); | 71 | extern int bfin_internal_set_wake(unsigned int irq, unsigned int state); |
| 76 | 72 | ||
| 77 | extern asmlinkage void finish_atomic_sections (struct pt_regs *regs); | ||
| 78 | extern char fixed_code_start; | ||
| 79 | extern char fixed_code_end; | ||
| 80 | extern int atomic_xchg32(void); | ||
| 81 | extern int atomic_cas32(void); | ||
| 82 | extern int atomic_add32(void); | ||
| 83 | extern int atomic_sub32(void); | ||
| 84 | extern int atomic_ior32(void); | ||
| 85 | extern int atomic_and32(void); | ||
| 86 | extern int atomic_xor32(void); | ||
| 87 | extern void safe_user_instruction(void); | ||
| 88 | extern void sigreturn_stub(void); | ||
| 89 | |||
| 90 | extern void *l1_data_A_sram_alloc(size_t); | 73 | extern void *l1_data_A_sram_alloc(size_t); |
| 91 | extern void *l1_data_B_sram_alloc(size_t); | 74 | extern void *l1_data_B_sram_alloc(size_t); |
| 92 | extern void *l1_inst_sram_alloc(size_t); | 75 | extern void *l1_inst_sram_alloc(size_t); |
| @@ -110,11 +93,10 @@ extern void *sram_alloc_with_lsl(size_t, unsigned long); | |||
| 110 | extern int sram_free_with_lsl(const void*); | 93 | extern int sram_free_with_lsl(const void*); |
| 111 | 94 | ||
| 112 | extern const char bfin_board_name[]; | 95 | extern const char bfin_board_name[]; |
| 113 | extern unsigned long wall_jiffies; | ||
| 114 | 96 | ||
| 115 | extern unsigned long bfin_sic_iwr[]; | 97 | extern unsigned long bfin_sic_iwr[]; |
| 98 | extern unsigned vr_wakeup; | ||
| 116 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | 99 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ |
| 117 | extern struct file_operations dpmc_fops; | ||
| 118 | extern unsigned long _ramstart, _ramend, _rambase; | 100 | extern unsigned long _ramstart, _ramend, _rambase; |
| 119 | extern unsigned long memory_start, memory_end, physical_mem_end; | 101 | extern unsigned long memory_start, memory_end, physical_mem_end; |
| 120 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | 102 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], |
| @@ -122,8 +104,12 @@ extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | |||
| 122 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | 104 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], |
| 123 | _ebss_l2[], _l2_lma_start[]; | 105 | _ebss_l2[], _l2_lma_start[]; |
| 124 | 106 | ||
| 125 | #ifdef CONFIG_MTD_UCLINUX | 107 | /* only used when CONFIG_MTD_UCLINUX */ |
| 126 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; | 108 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; |
| 109 | |||
| 110 | #ifdef CONFIG_BFIN_ICACHE_LOCK | ||
| 111 | extern void cache_grab_lock(int way); | ||
| 112 | extern void cache_lock(int way); | ||
| 127 | #endif | 113 | #endif |
| 128 | 114 | ||
| 129 | #endif | 115 | #endif |
diff --git a/include/asm-blackfin/dpmc.h b/include/asm-blackfin/dpmc.h index de28e6e018b3..96e8208f929a 100644 --- a/include/asm-blackfin/dpmc.h +++ b/include/asm-blackfin/dpmc.h | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #ifndef __ASSEMBLY__ | 11 | #ifndef __ASSEMBLY__ |
| 12 | 12 | ||
| 13 | void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 13 | void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
| 14 | void deep_sleep(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | ||
| 15 | void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 14 | void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
| 16 | void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 15 | void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
| 17 | void do_hibernate(int wakeup); | 16 | void do_hibernate(int wakeup); |
diff --git a/include/asm-blackfin/fixed_code.h b/include/asm-blackfin/fixed_code.h index 37db66c7030d..32c4d495d847 100644 --- a/include/asm-blackfin/fixed_code.h +++ b/include/asm-blackfin/fixed_code.h | |||
| @@ -1,6 +1,28 @@ | |||
| 1 | /* This file defines the fixed addresses where userspace programs can find | 1 | /* This file defines the fixed addresses where userspace programs can find |
| 2 | atomic code sequences. */ | 2 | atomic code sequences. */ |
| 3 | 3 | ||
| 4 | #ifndef __BFIN_ASM_FIXED_CODE_H__ | ||
| 5 | #define __BFIN_ASM_FIXED_CODE_H__ | ||
| 6 | |||
| 7 | #ifdef __KERNEL__ | ||
| 8 | #ifndef __ASSEMBLY__ | ||
| 9 | #include <linux/linkage.h> | ||
| 10 | #include <linux/ptrace.h> | ||
| 11 | extern asmlinkage void finish_atomic_sections(struct pt_regs *regs); | ||
| 12 | extern char fixed_code_start; | ||
| 13 | extern char fixed_code_end; | ||
| 14 | extern int atomic_xchg32(void); | ||
| 15 | extern int atomic_cas32(void); | ||
| 16 | extern int atomic_add32(void); | ||
| 17 | extern int atomic_sub32(void); | ||
| 18 | extern int atomic_ior32(void); | ||
| 19 | extern int atomic_and32(void); | ||
| 20 | extern int atomic_xor32(void); | ||
| 21 | extern void safe_user_instruction(void); | ||
| 22 | extern void sigreturn_stub(void); | ||
| 23 | #endif | ||
| 24 | #endif | ||
| 25 | |||
| 4 | #define FIXED_CODE_START 0x400 | 26 | #define FIXED_CODE_START 0x400 |
| 5 | 27 | ||
| 6 | #define SIGRETURN_STUB 0x400 | 28 | #define SIGRETURN_STUB 0x400 |
| @@ -20,3 +42,5 @@ | |||
| 20 | #define SAFE_USER_INSTRUCTION 0x480 | 42 | #define SAFE_USER_INSTRUCTION 0x480 |
| 21 | 43 | ||
| 22 | #define FIXED_CODE_END 0x490 | 44 | #define FIXED_CODE_END 0x490 |
| 45 | |||
| 46 | #endif | ||
diff --git a/include/asm-blackfin/mach-bf527/mem_map.h b/include/asm-blackfin/mach-bf527/mem_map.h index 193082deaa4e..ef46dc991cd4 100644 --- a/include/asm-blackfin/mach-bf527/mem_map.h +++ b/include/asm-blackfin/mach-bf527/mem_map.h | |||
| @@ -89,6 +89,11 @@ | |||
| 89 | #define BFIN_DSUPBANKS 0 | 89 | #define BFIN_DSUPBANKS 0 |
| 90 | #endif /*CONFIG_BFIN_DCACHE */ | 90 | #endif /*CONFIG_BFIN_DCACHE */ |
| 91 | 91 | ||
| 92 | /* Level 2 Memory - none */ | ||
| 93 | |||
| 94 | #define L2_START 0 | ||
| 95 | #define L2_LENGTH 0 | ||
| 96 | |||
| 92 | /* Scratch Pad Memory */ | 97 | /* Scratch Pad Memory */ |
| 93 | 98 | ||
| 94 | #define L1_SCRATCH_START 0xFFB00000 | 99 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-bf533/mem_init.h b/include/asm-blackfin/mach-bf533/mem_init.h index 995c06b2b1ef..ed2034bf10ec 100644 --- a/include/asm-blackfin/mach-bf533/mem_init.h +++ b/include/asm-blackfin/mach-bf533/mem_init.h | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | #define SDRAM_tRCD TRCD_2 | 47 | #define SDRAM_tRCD TRCD_2 |
| 48 | #define SDRAM_tWR TWR_2 | 48 | #define SDRAM_tWR TWR_2 |
| 49 | #endif | 49 | #endif |
| 50 | #if (CONFIG_SCLK_HZ > 8955223) && (CONFIG_SCLK_HZ <= 104477612) | 50 | #if (CONFIG_SCLK_HZ > 89552239) && (CONFIG_SCLK_HZ <= 104477612) |
| 51 | #define SDRAM_tRP TRP_2 | 51 | #define SDRAM_tRP TRP_2 |
| 52 | #define SDRAM_tRP_num 2 | 52 | #define SDRAM_tRP_num 2 |
| 53 | #define SDRAM_tRAS TRAS_5 | 53 | #define SDRAM_tRAS TRAS_5 |
diff --git a/include/asm-blackfin/mach-bf533/mem_map.h b/include/asm-blackfin/mach-bf533/mem_map.h index bd30b6f3be00..581fc6eea789 100644 --- a/include/asm-blackfin/mach-bf533/mem_map.h +++ b/include/asm-blackfin/mach-bf533/mem_map.h | |||
| @@ -158,6 +158,11 @@ | |||
| 158 | 158 | ||
| 159 | #endif | 159 | #endif |
| 160 | 160 | ||
| 161 | /* Level 2 Memory - none */ | ||
| 162 | |||
| 163 | #define L2_START 0 | ||
| 164 | #define L2_LENGTH 0 | ||
| 165 | |||
| 161 | /* Scratch Pad Memory */ | 166 | /* Scratch Pad Memory */ |
| 162 | 167 | ||
| 163 | #define L1_SCRATCH_START 0xFFB00000 | 168 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-bf537/mem_map.h b/include/asm-blackfin/mach-bf537/mem_map.h index 5c6726d6f3b1..5078b669431f 100644 --- a/include/asm-blackfin/mach-bf537/mem_map.h +++ b/include/asm-blackfin/mach-bf537/mem_map.h | |||
| @@ -166,6 +166,11 @@ | |||
| 166 | 166 | ||
| 167 | #endif | 167 | #endif |
| 168 | 168 | ||
| 169 | /* Level 2 Memory - none */ | ||
| 170 | |||
| 171 | #define L2_START 0 | ||
| 172 | #define L2_LENGTH 0 | ||
| 173 | |||
| 169 | /* Scratch Pad Memory */ | 174 | /* Scratch Pad Memory */ |
| 170 | 175 | ||
| 171 | #define L1_SCRATCH_START 0xFFB00000 | 176 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h index ede210eca4ec..d39c396f850d 100644 --- a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h +++ b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h | |||
| @@ -39,11 +39,7 @@ | |||
| 39 | #define bfin_read_SRAM_BASE_ADDRESS() bfin_read32(SRAM_BASE_ADDRESS) | 39 | #define bfin_read_SRAM_BASE_ADDRESS() bfin_read32(SRAM_BASE_ADDRESS) |
| 40 | #define bfin_write_SRAM_BASE_ADDRESS(val) bfin_write32(SRAM_BASE_ADDRESS,val) | 40 | #define bfin_write_SRAM_BASE_ADDRESS(val) bfin_write32(SRAM_BASE_ADDRESS,val) |
| 41 | #define bfin_read_DMEM_CONTROL() bfin_read32(DMEM_CONTROL) | 41 | #define bfin_read_DMEM_CONTROL() bfin_read32(DMEM_CONTROL) |
| 42 | #if ANOMALY_05000125 | ||
| 43 | extern void bfin_write_DMEM_CONTROL(unsigned int val); | ||
| 44 | #else | ||
| 45 | #define bfin_write_DMEM_CONTROL(val) bfin_write32(DMEM_CONTROL,val) | 42 | #define bfin_write_DMEM_CONTROL(val) bfin_write32(DMEM_CONTROL,val) |
| 46 | #endif | ||
| 47 | #define bfin_read_DCPLB_STATUS() bfin_read32(DCPLB_STATUS) | 43 | #define bfin_read_DCPLB_STATUS() bfin_read32(DCPLB_STATUS) |
| 48 | #define bfin_write_DCPLB_STATUS(val) bfin_write32(DCPLB_STATUS,val) | 44 | #define bfin_write_DCPLB_STATUS(val) bfin_write32(DCPLB_STATUS,val) |
| 49 | #define bfin_read_DCPLB_FAULT_ADDR() bfin_read32(DCPLB_FAULT_ADDR) | 45 | #define bfin_read_DCPLB_FAULT_ADDR() bfin_read32(DCPLB_FAULT_ADDR) |
| @@ -129,11 +125,7 @@ extern void bfin_write_DMEM_CONTROL(unsigned int val); | |||
| 129 | #define DTEST_DATA3 0xFFE0040C | 125 | #define DTEST_DATA3 0xFFE0040C |
| 130 | */ | 126 | */ |
| 131 | #define bfin_read_IMEM_CONTROL() bfin_read32(IMEM_CONTROL) | 127 | #define bfin_read_IMEM_CONTROL() bfin_read32(IMEM_CONTROL) |
| 132 | #if ANOMALY_05000125 | ||
| 133 | extern void bfin_write_IMEM_CONTROL(unsigned int val); | ||
| 134 | #else | ||
| 135 | #define bfin_write_IMEM_CONTROL(val) bfin_write32(IMEM_CONTROL,val) | 128 | #define bfin_write_IMEM_CONTROL(val) bfin_write32(IMEM_CONTROL,val) |
| 136 | #endif | ||
| 137 | #define bfin_read_ICPLB_STATUS() bfin_read32(ICPLB_STATUS) | 129 | #define bfin_read_ICPLB_STATUS() bfin_read32(ICPLB_STATUS) |
| 138 | #define bfin_write_ICPLB_STATUS(val) bfin_write32(ICPLB_STATUS,val) | 130 | #define bfin_write_ICPLB_STATUS(val) bfin_write32(ICPLB_STATUS,val) |
| 139 | #define bfin_read_ICPLB_FAULT_ADDR() bfin_read32(ICPLB_FAULT_ADDR) | 131 | #define bfin_read_ICPLB_FAULT_ADDR() bfin_read32(ICPLB_FAULT_ADDR) |
diff --git a/include/asm-blackfin/unistd.h b/include/asm-blackfin/unistd.h index 42955d0c439b..1e57b636e0bc 100644 --- a/include/asm-blackfin/unistd.h +++ b/include/asm-blackfin/unistd.h | |||
| @@ -372,8 +372,14 @@ | |||
| 372 | #define __NR_semtimedop 357 | 372 | #define __NR_semtimedop 357 |
| 373 | #define __NR_timerfd_settime 358 | 373 | #define __NR_timerfd_settime 358 |
| 374 | #define __NR_timerfd_gettime 359 | 374 | #define __NR_timerfd_gettime 359 |
| 375 | #define __NR_signalfd4 360 | ||
| 376 | #define __NR_eventfd2 361 | ||
| 377 | #define __NR_epoll_create1 362 | ||
| 378 | #define __NR_dup3 363 | ||
| 379 | #define __NR_pipe2 364 | ||
| 380 | #define __NR_inotify_init1 365 | ||
| 375 | 381 | ||
| 376 | #define __NR_syscall 360 | 382 | #define __NR_syscall 366 |
| 377 | #define NR_syscalls __NR_syscall | 383 | #define NR_syscalls __NR_syscall |
| 378 | 384 | ||
| 379 | /* Old optional stuff no one actually uses */ | 385 | /* Old optional stuff no one actually uses */ |
diff --git a/include/asm-mips/kexec.h b/include/asm-mips/kexec.h index cdbab43b7d3a..4314892aaebb 100644 --- a/include/asm-mips/kexec.h +++ b/include/asm-mips/kexec.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | /* Maximum address we can use for the control code buffer */ | 16 | /* Maximum address we can use for the control code buffer */ |
| 17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) | 17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) |
| 18 | 18 | ||
| 19 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 19 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 20 | 20 | ||
| 21 | /* The native architecture */ | 21 | /* The native architecture */ |
| 22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS | 22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS |
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h index 22aa58ca1991..dcc812067394 100644 --- a/include/asm-x86/amd_iommu_types.h +++ b/include/asm-x86/amd_iommu_types.h | |||
| @@ -31,9 +31,6 @@ | |||
| 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 | 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 |
| 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) | 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) |
| 33 | 33 | ||
| 34 | /* helper macros */ | ||
| 35 | #define LOW_U32(x) ((x) & ((1ULL << 32)-1)) | ||
| 36 | |||
| 37 | /* Length of the MMIO region for the AMD IOMMU */ | 34 | /* Length of the MMIO region for the AMD IOMMU */ |
| 38 | #define MMIO_REGION_LENGTH 0x4000 | 35 | #define MMIO_REGION_LENGTH 0x4000 |
| 39 | 36 | ||
| @@ -69,6 +66,9 @@ | |||
| 69 | #define MMIO_EVT_TAIL_OFFSET 0x2018 | 66 | #define MMIO_EVT_TAIL_OFFSET 0x2018 |
| 70 | #define MMIO_STATUS_OFFSET 0x2020 | 67 | #define MMIO_STATUS_OFFSET 0x2020 |
| 71 | 68 | ||
| 69 | /* MMIO status bits */ | ||
| 70 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 | ||
| 71 | |||
| 72 | /* feature control bits */ | 72 | /* feature control bits */ |
| 73 | #define CONTROL_IOMMU_EN 0x00ULL | 73 | #define CONTROL_IOMMU_EN 0x00ULL |
| 74 | #define CONTROL_HT_TUN_EN 0x01ULL | 74 | #define CONTROL_HT_TUN_EN 0x01ULL |
| @@ -89,6 +89,7 @@ | |||
| 89 | #define CMD_INV_IOMMU_PAGES 0x03 | 89 | #define CMD_INV_IOMMU_PAGES 0x03 |
| 90 | 90 | ||
| 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 | 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 |
| 92 | #define CMD_COMPL_WAIT_INT_MASK 0x02 | ||
| 92 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 | 93 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 |
| 93 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 | 94 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 |
| 94 | 95 | ||
| @@ -99,6 +100,7 @@ | |||
| 99 | #define DEV_ENTRY_TRANSLATION 0x01 | 100 | #define DEV_ENTRY_TRANSLATION 0x01 |
| 100 | #define DEV_ENTRY_IR 0x3d | 101 | #define DEV_ENTRY_IR 0x3d |
| 101 | #define DEV_ENTRY_IW 0x3e | 102 | #define DEV_ENTRY_IW 0x3e |
| 103 | #define DEV_ENTRY_NO_PAGE_FAULT 0x62 | ||
| 102 | #define DEV_ENTRY_EX 0x67 | 104 | #define DEV_ENTRY_EX 0x67 |
| 103 | #define DEV_ENTRY_SYSMGT1 0x68 | 105 | #define DEV_ENTRY_SYSMGT1 0x68 |
| 104 | #define DEV_ENTRY_SYSMGT2 0x69 | 106 | #define DEV_ENTRY_SYSMGT2 0x69 |
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h index bb06027fc83e..2c1cda0b8a86 100644 --- a/include/asm-x86/geode.h +++ b/include/asm-x86/geode.h | |||
| @@ -50,6 +50,7 @@ extern int geode_get_dev_base(unsigned int dev); | |||
| 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 | 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 |
| 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 | 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 |
| 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 | 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 |
| 53 | #define MSR_PIC_IRQM_LPC 0x51400025 | ||
| 53 | 54 | ||
| 54 | #define MSR_MFGPT_IRQ 0x51400028 | 55 | #define MSR_MFGPT_IRQ 0x51400028 |
| 55 | #define MSR_MFGPT_NR 0x51400029 | 56 | #define MSR_MFGPT_NR 0x51400029 |
| @@ -237,7 +238,7 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg) | |||
| 237 | } | 238 | } |
| 238 | 239 | ||
| 239 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); | 240 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); |
| 240 | extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable); | 241 | extern int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable); |
| 241 | extern int geode_mfgpt_alloc_timer(int timer, int domain); | 242 | extern int geode_mfgpt_alloc_timer(int timer, int domain); |
| 242 | 243 | ||
| 243 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) | 244 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) |
diff --git a/include/asm-x86/i387.h b/include/asm-x86/i387.h index 6d3b21063419..56d00e31aec0 100644 --- a/include/asm-x86/i387.h +++ b/include/asm-x86/i387.h | |||
| @@ -63,8 +63,6 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) | |||
| 63 | #else | 63 | #else |
| 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); | 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); |
| 65 | #endif | 65 | #endif |
| 66 | if (unlikely(err)) | ||
| 67 | init_fpu(current); | ||
| 68 | return err; | 66 | return err; |
| 69 | } | 67 | } |
| 70 | 68 | ||
diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h index bf5d629b3a39..0f954dc89cb3 100644 --- a/include/asm-x86/io.h +++ b/include/asm-x86/io.h | |||
| @@ -21,7 +21,7 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | |||
| 21 | 21 | ||
| 22 | #define build_mmio_read(name, size, type, reg, barrier) \ | 22 | #define build_mmio_read(name, size, type, reg, barrier) \ |
| 23 | static inline type name(const volatile void __iomem *addr) \ | 23 | static inline type name(const volatile void __iomem *addr) \ |
| 24 | { type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \ | 24 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
| 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } | 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } |
| 26 | 26 | ||
| 27 | #define build_mmio_write(name, size, type, reg, barrier) \ | 27 | #define build_mmio_write(name, size, type, reg, barrier) \ |
| @@ -29,13 +29,13 @@ static inline void name(type val, volatile void __iomem *addr) \ | |||
| 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ | 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ |
| 30 | "m" (*(volatile type __force *)addr) barrier); } | 30 | "m" (*(volatile type __force *)addr) barrier); } |
| 31 | 31 | ||
| 32 | build_mmio_read(readb, "b", unsigned char, "q", :"memory") | 32 | build_mmio_read(readb, "b", unsigned char, "=q", :"memory") |
| 33 | build_mmio_read(readw, "w", unsigned short, "r", :"memory") | 33 | build_mmio_read(readw, "w", unsigned short, "=r", :"memory") |
| 34 | build_mmio_read(readl, "l", unsigned int, "r", :"memory") | 34 | build_mmio_read(readl, "l", unsigned int, "=r", :"memory") |
| 35 | 35 | ||
| 36 | build_mmio_read(__readb, "b", unsigned char, "q", ) | 36 | build_mmio_read(__readb, "b", unsigned char, "=q", ) |
| 37 | build_mmio_read(__readw, "w", unsigned short, "r", ) | 37 | build_mmio_read(__readw, "w", unsigned short, "=r", ) |
| 38 | build_mmio_read(__readl, "l", unsigned int, "r", ) | 38 | build_mmio_read(__readl, "l", unsigned int, "=r", ) |
| 39 | 39 | ||
| 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") | 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") |
| 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") | 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") |
| @@ -59,8 +59,8 @@ build_mmio_write(__writel, "l", unsigned int, "r", ) | |||
| 59 | #define mmiowb() barrier() | 59 | #define mmiowb() barrier() |
| 60 | 60 | ||
| 61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
| 62 | build_mmio_read(readq, "q", unsigned long, "r", :"memory") | 62 | build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
| 63 | build_mmio_read(__readq, "q", unsigned long, "r", ) | 63 | build_mmio_read(__readq, "q", unsigned long, "=r", ) |
| 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") | 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
| 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) | 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) |
| 66 | 66 | ||
diff --git a/include/asm-x86/kexec.h b/include/asm-x86/kexec.h index c0e52a14fd4d..4246ab7dc988 100644 --- a/include/asm-x86/kexec.h +++ b/include/asm-x86/kexec.h | |||
| @@ -41,6 +41,10 @@ | |||
| 41 | # define PAGES_NR 17 | 41 | # define PAGES_NR 17 |
| 42 | #endif | 42 | #endif |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_X86_32 | ||
| 45 | # define KEXEC_CONTROL_CODE_MAX_SIZE 2048 | ||
| 46 | #endif | ||
| 47 | |||
| 44 | #ifndef __ASSEMBLY__ | 48 | #ifndef __ASSEMBLY__ |
| 45 | 49 | ||
| 46 | #include <linux/string.h> | 50 | #include <linux/string.h> |
| @@ -63,7 +67,7 @@ | |||
| 63 | /* Maximum address we can use for the control code buffer */ | 67 | /* Maximum address we can use for the control code buffer */ |
| 64 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 68 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 65 | 69 | ||
| 66 | # define KEXEC_CONTROL_CODE_SIZE 4096 | 70 | # define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 67 | 71 | ||
| 68 | /* The native architecture */ | 72 | /* The native architecture */ |
| 69 | # define KEXEC_ARCH KEXEC_ARCH_386 | 73 | # define KEXEC_ARCH KEXEC_ARCH_386 |
| @@ -79,7 +83,7 @@ | |||
| 79 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) | 83 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) |
| 80 | 84 | ||
| 81 | /* Allocate one page for the pdp and the second for the code */ | 85 | /* Allocate one page for the pdp and the second for the code */ |
| 82 | # define KEXEC_CONTROL_CODE_SIZE (4096UL + 4096UL) | 86 | # define KEXEC_CONTROL_PAGE_SIZE (4096UL + 4096UL) |
| 83 | 87 | ||
| 84 | /* The native architecture */ | 88 | /* The native architecture */ |
| 85 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 | 89 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 |
diff --git a/include/asm-x86/mman.h b/include/asm-x86/mman.h index c1682b542daf..90bc4108a4fd 100644 --- a/include/asm-x86/mman.h +++ b/include/asm-x86/mman.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ | 12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ |
| 13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ | 13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ |
| 14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | 14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ |
| 15 | #define MAP_STACK 0x20000 /* give out an address that is best suited for process/thread stacks */ | ||
| 15 | 16 | ||
| 16 | #define MCL_CURRENT 1 /* lock all current mappings */ | 17 | #define MCL_CURRENT 1 /* lock all current mappings */ |
| 17 | #define MCL_FUTURE 2 /* lock all future mappings */ | 18 | #define MCL_FUTURE 2 /* lock all future mappings */ |
diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index b2298a227567..5862e6460658 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
| @@ -97,10 +97,16 @@ static inline int pfn_valid(int pfn) | |||
| 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) | 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) |
| 98 | #define alloc_bootmem(x) \ | 98 | #define alloc_bootmem(x) \ |
| 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
| 100 | #define alloc_bootmem_nopanic(x) \ | ||
| 101 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ | ||
| 102 | __pa(MAX_DMA_ADDRESS)) | ||
| 100 | #define alloc_bootmem_low(x) \ | 103 | #define alloc_bootmem_low(x) \ |
| 101 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) | 104 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) |
| 102 | #define alloc_bootmem_pages(x) \ | 105 | #define alloc_bootmem_pages(x) \ |
| 103 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) | 106 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) |
| 107 | #define alloc_bootmem_pages_nopanic(x) \ | ||
| 108 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \ | ||
| 109 | __pa(MAX_DMA_ADDRESS)) | ||
| 104 | #define alloc_bootmem_low_pages(x) \ | 110 | #define alloc_bootmem_low_pages(x) \ |
| 105 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) | 111 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) |
| 106 | #define alloc_bootmem_node(pgdat, x) \ | 112 | #define alloc_bootmem_node(pgdat, x) \ |
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h index ac5fff4cc58a..549144d03d99 100644 --- a/include/asm-x86/pgtable_64.h +++ b/include/asm-x86/pgtable_64.h | |||
| @@ -151,7 +151,7 @@ static inline void native_pgd_clear(pgd_t *pgd) | |||
| 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) |
| 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) |
| 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) |
| 154 | #define MODULES_END _AC(0xfffffffffff00000, UL) | 154 | #define MODULES_END _AC(0xffffffffff000000, UL) |
| 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
| 156 | 156 | ||
| 157 | #ifndef __ASSEMBLY__ | 157 | #ifndef __ASSEMBLY__ |
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 5f58da401b43..4df3e2f6fb56 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
| @@ -728,6 +728,29 @@ extern unsigned long boot_option_idle_override; | |||
| 728 | extern unsigned long idle_halt; | 728 | extern unsigned long idle_halt; |
| 729 | extern unsigned long idle_nomwait; | 729 | extern unsigned long idle_nomwait; |
| 730 | 730 | ||
| 731 | /* | ||
| 732 | * on systems with caches, caches must be flashed as the absolute | ||
| 733 | * last instruction before going into a suspended halt. Otherwise, | ||
| 734 | * dirty data can linger in the cache and become stale on resume, | ||
| 735 | * leading to strange errors. | ||
| 736 | * | ||
| 737 | * perform a variety of operations to guarantee that the compiler | ||
| 738 | * will not reorder instructions. wbinvd itself is serializing | ||
| 739 | * so the processor will not reorder. | ||
| 740 | * | ||
| 741 | * Systems without cache can just go into halt. | ||
| 742 | */ | ||
| 743 | static inline void wbinvd_halt(void) | ||
| 744 | { | ||
| 745 | mb(); | ||
| 746 | /* check for clflush to determine if wbinvd is legal */ | ||
| 747 | if (cpu_has_clflush) | ||
| 748 | asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory"); | ||
| 749 | else | ||
| 750 | while (1) | ||
| 751 | halt(); | ||
| 752 | } | ||
| 753 | |||
| 731 | extern void enable_sep_cpu(void); | 754 | extern void enable_sep_cpu(void); |
| 732 | extern int sysenter_setup(void); | 755 | extern int sysenter_setup(void); |
| 733 | 756 | ||
diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h index 4f9a9861799a..e39c790dbfd2 100644 --- a/include/asm-x86/spinlock.h +++ b/include/asm-x86/spinlock.h | |||
| @@ -65,7 +65,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
| 65 | { | 65 | { |
| 66 | int tmp = ACCESS_ONCE(lock->slock); | 66 | int tmp = ACCESS_ONCE(lock->slock); |
| 67 | 67 | ||
| 68 | return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1; | 68 | return (((tmp >> 8) - tmp) & 0xff) > 1; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
| @@ -127,7 +127,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
| 127 | { | 127 | { |
| 128 | int tmp = ACCESS_ONCE(lock->slock); | 128 | int tmp = ACCESS_ONCE(lock->slock); |
| 129 | 129 | ||
| 130 | return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1; | 130 | return (((tmp >> 16) - tmp) & 0xffff) > 1; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 327f60658d94..7d970678f940 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -250,6 +250,8 @@ unifdef-y += isdn.h | |||
| 250 | unifdef-y += isdnif.h | 250 | unifdef-y += isdnif.h |
| 251 | unifdef-y += isdn_divertif.h | 251 | unifdef-y += isdn_divertif.h |
| 252 | unifdef-y += isdn_ppp.h | 252 | unifdef-y += isdn_ppp.h |
| 253 | unifdef-y += ivtv.h | ||
| 254 | unifdef-y += ivtvfb.h | ||
| 253 | unifdef-y += joystick.h | 255 | unifdef-y += joystick.h |
| 254 | unifdef-y += kdev_t.h | 256 | unifdef-y += kdev_t.h |
| 255 | unifdef-y += kd.h | 257 | unifdef-y += kd.h |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 02673846d205..9d1fe30b6f6c 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
| @@ -503,8 +503,19 @@ extern const kernel_cap_t __cap_init_eff_set; | |||
| 503 | 503 | ||
| 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); | 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); |
| 505 | 505 | ||
| 506 | int capable(int cap); | 506 | /** |
| 507 | int __capable(struct task_struct *t, int cap); | 507 | * has_capability - Determine if a task has a superior capability available |
| 508 | * @t: The task in question | ||
| 509 | * @cap: The capability to be tested for | ||
| 510 | * | ||
| 511 | * Return true if the specified task has the given superior capability | ||
| 512 | * currently in effect, false if not. | ||
| 513 | * | ||
| 514 | * Note that this does not set PF_SUPERPRIV on the task. | ||
| 515 | */ | ||
| 516 | #define has_capability(t, cap) (security_capable((t), (cap)) == 0) | ||
| 517 | |||
| 518 | extern int capable(int cap); | ||
| 508 | 519 | ||
| 509 | #endif /* __KERNEL__ */ | 520 | #endif /* __KERNEL__ */ |
| 510 | 521 | ||
diff --git a/include/linux/completion.h b/include/linux/completion.h index 57faa60de9bd..02ef8835999c 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h | |||
| @@ -49,6 +49,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x, | |||
| 49 | unsigned long timeout); | 49 | unsigned long timeout); |
| 50 | extern unsigned long wait_for_completion_interruptible_timeout( | 50 | extern unsigned long wait_for_completion_interruptible_timeout( |
| 51 | struct completion *x, unsigned long timeout); | 51 | struct completion *x, unsigned long timeout); |
| 52 | extern bool try_wait_for_completion(struct completion *x); | ||
| 53 | extern bool completion_done(struct completion *x); | ||
| 52 | 54 | ||
| 53 | extern void complete(struct completion *); | 55 | extern void complete(struct completion *); |
| 54 | extern void complete_all(struct completion *); | 56 | extern void complete_all(struct completion *); |
| @@ -56,48 +58,4 @@ extern void complete_all(struct completion *); | |||
| 56 | #define INIT_COMPLETION(x) ((x).done = 0) | 58 | #define INIT_COMPLETION(x) ((x).done = 0) |
| 57 | 59 | ||
| 58 | 60 | ||
| 59 | /** | ||
| 60 | * try_wait_for_completion - try to decrement a completion without blocking | ||
| 61 | * @x: completion structure | ||
| 62 | * | ||
| 63 | * Returns: 0 if a decrement cannot be done without blocking | ||
| 64 | * 1 if a decrement succeeded. | ||
| 65 | * | ||
| 66 | * If a completion is being used as a counting completion, | ||
| 67 | * attempt to decrement the counter without blocking. This | ||
| 68 | * enables us to avoid waiting if the resource the completion | ||
| 69 | * is protecting is not available. | ||
| 70 | */ | ||
| 71 | static inline bool try_wait_for_completion(struct completion *x) | ||
| 72 | { | ||
| 73 | int ret = 1; | ||
| 74 | |||
| 75 | spin_lock_irq(&x->wait.lock); | ||
| 76 | if (!x->done) | ||
| 77 | ret = 0; | ||
| 78 | else | ||
| 79 | x->done--; | ||
| 80 | spin_unlock_irq(&x->wait.lock); | ||
| 81 | return ret; | ||
| 82 | } | ||
| 83 | |||
| 84 | /** | ||
| 85 | * completion_done - Test to see if a completion has any waiters | ||
| 86 | * @x: completion structure | ||
| 87 | * | ||
| 88 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
| 89 | * 1 if there are no waiters. | ||
| 90 | * | ||
| 91 | */ | ||
| 92 | static inline bool completion_done(struct completion *x) | ||
| 93 | { | ||
| 94 | int ret = 1; | ||
| 95 | |||
| 96 | spin_lock_irq(&x->wait.lock); | ||
| 97 | if (!x->done) | ||
| 98 | ret = 0; | ||
| 99 | spin_unlock_irq(&x->wait.lock); | ||
| 100 | return ret; | ||
| 101 | } | ||
| 102 | |||
| 103 | #endif | 61 | #endif |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index f368d041e02d..bb384068272e 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -98,6 +98,27 @@ static inline void tracer_disable(void) | |||
| 98 | #endif | 98 | #endif |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | /* Ftrace disable/restore without lock. Some synchronization mechanism | ||
| 102 | * must be used to prevent ftrace_enabled to be changed between | ||
| 103 | * disable/restore. */ | ||
| 104 | static inline int __ftrace_enabled_save(void) | ||
| 105 | { | ||
| 106 | #ifdef CONFIG_FTRACE | ||
| 107 | int saved_ftrace_enabled = ftrace_enabled; | ||
| 108 | ftrace_enabled = 0; | ||
| 109 | return saved_ftrace_enabled; | ||
| 110 | #else | ||
| 111 | return 0; | ||
| 112 | #endif | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline void __ftrace_enabled_restore(int enabled) | ||
| 116 | { | ||
| 117 | #ifdef CONFIG_FTRACE | ||
| 118 | ftrace_enabled = enabled; | ||
| 119 | #endif | ||
| 120 | } | ||
| 121 | |||
| 101 | #ifdef CONFIG_FRAME_POINTER | 122 | #ifdef CONFIG_FRAME_POINTER |
| 102 | /* TODO: need to fix this for ARM */ | 123 | /* TODO: need to fix this for ARM */ |
| 103 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | 124 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) |
diff --git a/include/linux/ivtv.h b/include/linux/ivtv.h index 794b8daa9378..17ca64b5a66c 100644 --- a/include/linux/ivtv.h +++ b/include/linux/ivtv.h | |||
| @@ -21,11 +21,7 @@ | |||
| 21 | #ifndef __LINUX_IVTV_H__ | 21 | #ifndef __LINUX_IVTV_H__ |
| 22 | #define __LINUX_IVTV_H__ | 22 | #define __LINUX_IVTV_H__ |
| 23 | 23 | ||
| 24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
| 25 | #include <linux/compiler.h> /* need __user */ | ||
| 26 | #else | ||
| 27 | #define __user | ||
| 28 | #endif | ||
| 29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 30 | 26 | ||
| 31 | /* ivtv knows several distinct output modes: MPEG streaming, | 27 | /* ivtv knows several distinct output modes: MPEG streaming, |
diff --git a/include/linux/ivtvfb.h b/include/linux/ivtvfb.h index e980ba62ddcc..e20af47b59ad 100644 --- a/include/linux/ivtvfb.h +++ b/include/linux/ivtvfb.h | |||
| @@ -21,11 +21,7 @@ | |||
| 21 | #ifndef __LINUX_IVTVFB_H__ | 21 | #ifndef __LINUX_IVTVFB_H__ |
| 22 | #define __LINUX_IVTVFB_H__ | 22 | #define __LINUX_IVTVFB_H__ |
| 23 | 23 | ||
| 24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
| 25 | #include <linux/compiler.h> /* need __user */ | ||
| 26 | #else | ||
| 27 | #define __user | ||
| 28 | #endif | ||
| 29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 30 | 26 | ||
| 31 | /* Framebuffer external API */ | 27 | /* Framebuffer external API */ |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 32110cede64f..17f76fc05173 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
| @@ -25,8 +25,8 @@ | |||
| 25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined | 25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined |
| 26 | #endif | 26 | #endif |
| 27 | 27 | ||
| 28 | #ifndef KEXEC_CONTROL_CODE_SIZE | 28 | #ifndef KEXEC_CONTROL_PAGE_SIZE |
| 29 | #error KEXEC_CONTROL_CODE_SIZE not defined | 29 | #error KEXEC_CONTROL_PAGE_SIZE not defined |
| 30 | #endif | 30 | #endif |
| 31 | 31 | ||
| 32 | #ifndef KEXEC_ARCH | 32 | #ifndef KEXEC_ARCH |
diff --git a/include/linux/mm.h b/include/linux/mm.h index fa651609b65d..72a15dc26bbf 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -73,7 +73,7 @@ extern unsigned int kobjsize(const void *objp); | |||
| 73 | #endif | 73 | #endif |
| 74 | 74 | ||
| 75 | /* | 75 | /* |
| 76 | * vm_flags.. | 76 | * vm_flags in vm_area_struct, see mm_types.h. |
| 77 | */ | 77 | */ |
| 78 | #define VM_READ 0x00000001 /* currently active flags */ | 78 | #define VM_READ 0x00000001 /* currently active flags */ |
| 79 | #define VM_WRITE 0x00000002 | 79 | #define VM_WRITE 0x00000002 |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 386edbe2cb4e..bf334138c7c1 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
| @@ -113,7 +113,7 @@ struct vm_area_struct { | |||
| 113 | struct vm_area_struct *vm_next; | 113 | struct vm_area_struct *vm_next; |
| 114 | 114 | ||
| 115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | 115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ |
| 116 | unsigned long vm_flags; /* Flags, listed below. */ | 116 | unsigned long vm_flags; /* Flags, see mm.h. */ |
| 117 | 117 | ||
| 118 | struct rb_node vm_rb; | 118 | struct rb_node vm_rb; |
| 119 | 119 | ||
diff --git a/include/linux/reboot.h b/include/linux/reboot.h index b93b541cf111..988e55fe649b 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h | |||
| @@ -59,6 +59,7 @@ extern void machine_crash_shutdown(struct pt_regs *); | |||
| 59 | * Architecture independent implemenations of sys_reboot commands. | 59 | * Architecture independent implemenations of sys_reboot commands. |
| 60 | */ | 60 | */ |
| 61 | 61 | ||
| 62 | extern void kernel_restart_prepare(char *cmd); | ||
| 62 | extern void kernel_restart(char *cmd); | 63 | extern void kernel_restart(char *cmd); |
| 63 | extern void kernel_halt(void); | 64 | extern void kernel_halt(void); |
| 64 | extern void kernel_power_off(void); | 65 | extern void kernel_power_off(void); |
diff --git a/include/linux/security.h b/include/linux/security.h index fd96e7f8a6f9..2ee5ecfb2393 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -46,8 +46,8 @@ struct audit_krule; | |||
| 46 | */ | 46 | */ |
| 47 | extern int cap_capable(struct task_struct *tsk, int cap); | 47 | extern int cap_capable(struct task_struct *tsk, int cap); |
| 48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); | 48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); |
| 49 | extern int cap_ptrace(struct task_struct *parent, struct task_struct *child, | 49 | extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode); |
| 50 | unsigned int mode); | 50 | extern int cap_ptrace_traceme(struct task_struct *parent); |
| 51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| 52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| 53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| @@ -1157,17 +1157,24 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1157 | * @alter contains the flag indicating whether changes are to be made. | 1157 | * @alter contains the flag indicating whether changes are to be made. |
| 1158 | * Return 0 if permission is granted. | 1158 | * Return 0 if permission is granted. |
| 1159 | * | 1159 | * |
| 1160 | * @ptrace: | 1160 | * @ptrace_may_access: |
| 1161 | * Check permission before allowing the @parent process to trace the | 1161 | * Check permission before allowing the current process to trace the |
| 1162 | * @child process. | 1162 | * @child process. |
| 1163 | * Security modules may also want to perform a process tracing check | 1163 | * Security modules may also want to perform a process tracing check |
| 1164 | * during an execve in the set_security or apply_creds hooks of | 1164 | * during an execve in the set_security or apply_creds hooks of |
| 1165 | * binprm_security_ops if the process is being traced and its security | 1165 | * binprm_security_ops if the process is being traced and its security |
| 1166 | * attributes would be changed by the execve. | 1166 | * attributes would be changed by the execve. |
| 1167 | * @parent contains the task_struct structure for parent process. | 1167 | * @child contains the task_struct structure for the target process. |
| 1168 | * @child contains the task_struct structure for child process. | ||
| 1169 | * @mode contains the PTRACE_MODE flags indicating the form of access. | 1168 | * @mode contains the PTRACE_MODE flags indicating the form of access. |
| 1170 | * Return 0 if permission is granted. | 1169 | * Return 0 if permission is granted. |
| 1170 | * @ptrace_traceme: | ||
| 1171 | * Check that the @parent process has sufficient permission to trace the | ||
| 1172 | * current process before allowing the current process to present itself | ||
| 1173 | * to the @parent process for tracing. | ||
| 1174 | * The parent process will still have to undergo the ptrace_may_access | ||
| 1175 | * checks before it is allowed to trace this one. | ||
| 1176 | * @parent contains the task_struct structure for debugger process. | ||
| 1177 | * Return 0 if permission is granted. | ||
| 1171 | * @capget: | 1178 | * @capget: |
| 1172 | * Get the @effective, @inheritable, and @permitted capability sets for | 1179 | * Get the @effective, @inheritable, and @permitted capability sets for |
| 1173 | * the @target process. The hook may also perform permission checking to | 1180 | * the @target process. The hook may also perform permission checking to |
| @@ -1287,8 +1294,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1287 | struct security_operations { | 1294 | struct security_operations { |
| 1288 | char name[SECURITY_NAME_MAX + 1]; | 1295 | char name[SECURITY_NAME_MAX + 1]; |
| 1289 | 1296 | ||
| 1290 | int (*ptrace) (struct task_struct *parent, struct task_struct *child, | 1297 | int (*ptrace_may_access) (struct task_struct *child, unsigned int mode); |
| 1291 | unsigned int mode); | 1298 | int (*ptrace_traceme) (struct task_struct *parent); |
| 1292 | int (*capget) (struct task_struct *target, | 1299 | int (*capget) (struct task_struct *target, |
| 1293 | kernel_cap_t *effective, | 1300 | kernel_cap_t *effective, |
| 1294 | kernel_cap_t *inheritable, kernel_cap_t *permitted); | 1301 | kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| @@ -1560,8 +1567,8 @@ extern struct dentry *securityfs_create_dir(const char *name, struct dentry *par | |||
| 1560 | extern void securityfs_remove(struct dentry *dentry); | 1567 | extern void securityfs_remove(struct dentry *dentry); |
| 1561 | 1568 | ||
| 1562 | /* Security operations */ | 1569 | /* Security operations */ |
| 1563 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 1570 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode); |
| 1564 | unsigned int mode); | 1571 | int security_ptrace_traceme(struct task_struct *parent); |
| 1565 | int security_capget(struct task_struct *target, | 1572 | int security_capget(struct task_struct *target, |
| 1566 | kernel_cap_t *effective, | 1573 | kernel_cap_t *effective, |
| 1567 | kernel_cap_t *inheritable, | 1574 | kernel_cap_t *inheritable, |
| @@ -1742,11 +1749,15 @@ static inline int security_init(void) | |||
| 1742 | return 0; | 1749 | return 0; |
| 1743 | } | 1750 | } |
| 1744 | 1751 | ||
| 1745 | static inline int security_ptrace(struct task_struct *parent, | 1752 | static inline int security_ptrace_may_access(struct task_struct *child, |
| 1746 | struct task_struct *child, | 1753 | unsigned int mode) |
| 1747 | unsigned int mode) | 1754 | { |
| 1755 | return cap_ptrace_may_access(child, mode); | ||
| 1756 | } | ||
| 1757 | |||
| 1758 | static inline int security_ptrace_traceme(struct task_struct *child) | ||
| 1748 | { | 1759 | { |
| 1749 | return cap_ptrace(parent, child, mode); | 1760 | return cap_ptrace_traceme(parent); |
| 1750 | } | 1761 | } |
| 1751 | 1762 | ||
| 1752 | static inline int security_capget(struct task_struct *target, | 1763 | static inline int security_capget(struct task_struct *target, |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index c63435095970..2ce8207686e2 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -217,11 +217,11 @@ struct platform_hibernation_ops { | |||
| 217 | #ifdef CONFIG_HIBERNATION | 217 | #ifdef CONFIG_HIBERNATION |
| 218 | /* kernel/power/snapshot.c */ | 218 | /* kernel/power/snapshot.c */ |
| 219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); | 219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); |
| 220 | static inline void register_nosave_region(unsigned long b, unsigned long e) | 220 | static inline void __init register_nosave_region(unsigned long b, unsigned long e) |
| 221 | { | 221 | { |
| 222 | __register_nosave_region(b, e, 0); | 222 | __register_nosave_region(b, e, 0); |
| 223 | } | 223 | } |
| 224 | static inline void register_nosave_region_late(unsigned long b, unsigned long e) | 224 | static inline void __init register_nosave_region_late(unsigned long b, unsigned long e) |
| 225 | { | 225 | { |
| 226 | __register_nosave_region(b, e, 1); | 226 | __register_nosave_region(b, e, 1); |
| 227 | } | 227 | } |
diff --git a/include/linux/tty.h b/include/linux/tty.h index e3579cb086e0..0cbec74ec086 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
| @@ -331,6 +331,8 @@ extern int tty_write_room(struct tty_struct *tty); | |||
| 331 | extern void tty_driver_flush_buffer(struct tty_struct *tty); | 331 | extern void tty_driver_flush_buffer(struct tty_struct *tty); |
| 332 | extern void tty_throttle(struct tty_struct *tty); | 332 | extern void tty_throttle(struct tty_struct *tty); |
| 333 | extern void tty_unthrottle(struct tty_struct *tty); | 333 | extern void tty_unthrottle(struct tty_struct *tty); |
| 334 | extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 335 | struct winsize *ws); | ||
| 334 | 336 | ||
| 335 | extern int is_current_pgrp_orphaned(void); | 337 | extern int is_current_pgrp_orphaned(void); |
| 336 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); | 338 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index e1065ac0d922..16d27944c321 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
| @@ -168,6 +168,18 @@ | |||
| 168 | * | 168 | * |
| 169 | * Optional: If not provided then the write method is called under | 169 | * Optional: If not provided then the write method is called under |
| 170 | * the atomic write lock to keep it serialized with the ldisc. | 170 | * the atomic write lock to keep it serialized with the ldisc. |
| 171 | * | ||
| 172 | * int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 173 | * unsigned int rows, unsigned int cols); | ||
| 174 | * | ||
| 175 | * Called when a termios request is issued which changes the | ||
| 176 | * requested terminal geometry. | ||
| 177 | * | ||
| 178 | * Optional: the default action is to update the termios structure | ||
| 179 | * without error. This is usually the correct behaviour. Drivers should | ||
| 180 | * not force errors here if they are not resizable objects (eg a serial | ||
| 181 | * line). See tty_do_resize() if you need to wrap the standard method | ||
| 182 | * in your own logic - the usual case. | ||
| 171 | */ | 183 | */ |
| 172 | 184 | ||
| 173 | #include <linux/fs.h> | 185 | #include <linux/fs.h> |
| @@ -206,6 +218,8 @@ struct tty_operations { | |||
| 206 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 218 | int (*tiocmget)(struct tty_struct *tty, struct file *file); |
| 207 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 219 | int (*tiocmset)(struct tty_struct *tty, struct file *file, |
| 208 | unsigned int set, unsigned int clear); | 220 | unsigned int set, unsigned int clear); |
| 221 | int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | ||
| 222 | struct winsize *ws); | ||
| 209 | #ifdef CONFIG_CONSOLE_POLL | 223 | #ifdef CONFIG_CONSOLE_POLL |
| 210 | int (*poll_init)(struct tty_driver *driver, int line, char *options); | 224 | int (*poll_init)(struct tty_driver *driver, int line, char *options); |
| 211 | int (*poll_get_char)(struct tty_driver *driver, int line); | 225 | int (*poll_get_char)(struct tty_driver *driver, int line); |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index e466bd54a50e..e65a6bed4e3e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -55,13 +55,13 @@ | |||
| 55 | */ | 55 | */ |
| 56 | #ifndef __LINUX_VIDEODEV2_H | 56 | #ifndef __LINUX_VIDEODEV2_H |
| 57 | #define __LINUX_VIDEODEV2_H | 57 | #define __LINUX_VIDEODEV2_H |
| 58 | |||
| 58 | #ifdef __KERNEL__ | 59 | #ifdef __KERNEL__ |
| 59 | #include <linux/time.h> /* need struct timeval */ | 60 | #include <linux/time.h> /* need struct timeval */ |
| 60 | #include <linux/compiler.h> /* need __user */ | ||
| 61 | #else | 61 | #else |
| 62 | #define __user | ||
| 63 | #include <sys/time.h> | 62 | #include <sys/time.h> |
| 64 | #endif | 63 | #endif |
| 64 | #include <linux/compiler.h> | ||
| 65 | #include <linux/ioctl.h> | 65 | #include <linux/ioctl.h> |
| 66 | #include <linux/types.h> | 66 | #include <linux/types.h> |
| 67 | 67 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 364789aae9f3..328eb4022727 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
| @@ -4,9 +4,9 @@ | |||
| 4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
| 5 | #include <asm/page.h> /* pgprot_t */ | 5 | #include <asm/page.h> /* pgprot_t */ |
| 6 | 6 | ||
| 7 | struct vm_area_struct; | 7 | struct vm_area_struct; /* vma defining user mapping in mm_types.h */ |
| 8 | 8 | ||
| 9 | /* bits in vm_struct->flags */ | 9 | /* bits in flags of vmalloc's vm_struct below */ |
| 10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ | 10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ |
| 11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ | 11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ |
| 12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ | 12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ |
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 1c78d56c57e5..1cbd0a7db4e6 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
| @@ -35,7 +35,6 @@ extern int fg_console, last_console, want_console; | |||
| 35 | int vc_allocate(unsigned int console); | 35 | int vc_allocate(unsigned int console); |
| 36 | int vc_cons_allocated(unsigned int console); | 36 | int vc_cons_allocated(unsigned int console); |
| 37 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); | 37 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); |
| 38 | int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); | ||
| 39 | void vc_deallocate(unsigned int console); | 38 | void vc_deallocate(unsigned int console); |
| 40 | void reset_palette(struct vc_data *vc); | 39 | void reset_palette(struct vc_data *vc); |
| 41 | void do_blank_screen(int entering_gfx); | 40 | void do_blank_screen(int entering_gfx); |
diff --git a/init/Kconfig b/init/Kconfig index b678803deccf..c11da38837e5 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -558,17 +558,6 @@ config SYSCTL_SYSCALL | |||
| 558 | 558 | ||
| 559 | If unsure say Y here. | 559 | If unsure say Y here. |
| 560 | 560 | ||
| 561 | config SYSCTL_SYSCALL_CHECK | ||
| 562 | bool "Sysctl checks" if EMBEDDED | ||
| 563 | depends on SYSCTL_SYSCALL | ||
| 564 | default y | ||
| 565 | ---help--- | ||
| 566 | sys_sysctl uses binary paths that have been found challenging | ||
| 567 | to properly maintain and use. This enables checks that help | ||
| 568 | you to keep things correct. | ||
| 569 | |||
| 570 | If unsure say Y here. | ||
| 571 | |||
| 572 | config KALLSYMS | 561 | config KALLSYMS |
| 573 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED | 562 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED |
| 574 | default y | 563 | default y |
diff --git a/kernel/capability.c b/kernel/capability.c index 0101e847603e..33e51e78c2d8 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
| @@ -486,17 +486,22 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) | |||
| 486 | return ret; | 486 | return ret; |
| 487 | } | 487 | } |
| 488 | 488 | ||
| 489 | int __capable(struct task_struct *t, int cap) | 489 | /** |
| 490 | * capable - Determine if the current task has a superior capability in effect | ||
| 491 | * @cap: The capability to be tested for | ||
| 492 | * | ||
| 493 | * Return true if the current task has the given superior capability currently | ||
| 494 | * available for use, false if not. | ||
| 495 | * | ||
| 496 | * This sets PF_SUPERPRIV on the task if the capability is available on the | ||
| 497 | * assumption that it's about to be used. | ||
| 498 | */ | ||
| 499 | int capable(int cap) | ||
| 490 | { | 500 | { |
| 491 | if (security_capable(t, cap) == 0) { | 501 | if (has_capability(current, cap)) { |
| 492 | t->flags |= PF_SUPERPRIV; | 502 | current->flags |= PF_SUPERPRIV; |
| 493 | return 1; | 503 | return 1; |
| 494 | } | 504 | } |
| 495 | return 0; | 505 | return 0; |
| 496 | } | 506 | } |
| 497 | |||
| 498 | int capable(int cap) | ||
| 499 | { | ||
| 500 | return __capable(current, cap); | ||
| 501 | } | ||
| 502 | EXPORT_SYMBOL(capable); | 507 | EXPORT_SYMBOL(capable); |
diff --git a/kernel/kexec.c b/kernel/kexec.c index c8a4370e2a34..59f3f0df35d4 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
| 13 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
| 14 | #include <linux/kexec.h> | 14 | #include <linux/kexec.h> |
| 15 | #include <linux/spinlock.h> | 15 | #include <linux/mutex.h> |
| 16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
| 17 | #include <linux/highmem.h> | 17 | #include <linux/highmem.h> |
| 18 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
| @@ -77,7 +77,7 @@ int kexec_should_crash(struct task_struct *p) | |||
| 77 | * | 77 | * |
| 78 | * The code for the transition from the current kernel to the | 78 | * The code for the transition from the current kernel to the |
| 79 | * the new kernel is placed in the control_code_buffer, whose size | 79 | * the new kernel is placed in the control_code_buffer, whose size |
| 80 | * is given by KEXEC_CONTROL_CODE_SIZE. In the best case only a single | 80 | * is given by KEXEC_CONTROL_PAGE_SIZE. In the best case only a single |
| 81 | * page of memory is necessary, but some architectures require more. | 81 | * page of memory is necessary, but some architectures require more. |
| 82 | * Because this memory must be identity mapped in the transition from | 82 | * Because this memory must be identity mapped in the transition from |
| 83 | * virtual to physical addresses it must live in the range | 83 | * virtual to physical addresses it must live in the range |
| @@ -242,7 +242,7 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry, | |||
| 242 | */ | 242 | */ |
| 243 | result = -ENOMEM; | 243 | result = -ENOMEM; |
| 244 | image->control_code_page = kimage_alloc_control_pages(image, | 244 | image->control_code_page = kimage_alloc_control_pages(image, |
| 245 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 245 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
| 246 | if (!image->control_code_page) { | 246 | if (!image->control_code_page) { |
| 247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
| 248 | goto out; | 248 | goto out; |
| @@ -317,7 +317,7 @@ static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry, | |||
| 317 | */ | 317 | */ |
| 318 | result = -ENOMEM; | 318 | result = -ENOMEM; |
| 319 | image->control_code_page = kimage_alloc_control_pages(image, | 319 | image->control_code_page = kimage_alloc_control_pages(image, |
| 320 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 320 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
| 321 | if (!image->control_code_page) { | 321 | if (!image->control_code_page) { |
| 322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
| 323 | goto out; | 323 | goto out; |
| @@ -924,19 +924,14 @@ static int kimage_load_segment(struct kimage *image, | |||
| 924 | */ | 924 | */ |
| 925 | struct kimage *kexec_image; | 925 | struct kimage *kexec_image; |
| 926 | struct kimage *kexec_crash_image; | 926 | struct kimage *kexec_crash_image; |
| 927 | /* | 927 | |
| 928 | * A home grown binary mutex. | 928 | static DEFINE_MUTEX(kexec_mutex); |
| 929 | * Nothing can wait so this mutex is safe to use | ||
| 930 | * in interrupt context :) | ||
| 931 | */ | ||
| 932 | static int kexec_lock; | ||
| 933 | 929 | ||
| 934 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | 930 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, |
| 935 | struct kexec_segment __user *segments, | 931 | struct kexec_segment __user *segments, |
| 936 | unsigned long flags) | 932 | unsigned long flags) |
| 937 | { | 933 | { |
| 938 | struct kimage **dest_image, *image; | 934 | struct kimage **dest_image, *image; |
| 939 | int locked; | ||
| 940 | int result; | 935 | int result; |
| 941 | 936 | ||
| 942 | /* We only trust the superuser with rebooting the system. */ | 937 | /* We only trust the superuser with rebooting the system. */ |
| @@ -972,8 +967,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
| 972 | * | 967 | * |
| 973 | * KISS: always take the mutex. | 968 | * KISS: always take the mutex. |
| 974 | */ | 969 | */ |
| 975 | locked = xchg(&kexec_lock, 1); | 970 | if (!mutex_trylock(&kexec_mutex)) |
| 976 | if (locked) | ||
| 977 | return -EBUSY; | 971 | return -EBUSY; |
| 978 | 972 | ||
| 979 | dest_image = &kexec_image; | 973 | dest_image = &kexec_image; |
| @@ -1015,8 +1009,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
| 1015 | image = xchg(dest_image, image); | 1009 | image = xchg(dest_image, image); |
| 1016 | 1010 | ||
| 1017 | out: | 1011 | out: |
| 1018 | locked = xchg(&kexec_lock, 0); /* Release the mutex */ | 1012 | mutex_unlock(&kexec_mutex); |
| 1019 | BUG_ON(!locked); | ||
| 1020 | kimage_free(image); | 1013 | kimage_free(image); |
| 1021 | 1014 | ||
| 1022 | return result; | 1015 | return result; |
| @@ -1063,10 +1056,7 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry, | |||
| 1063 | 1056 | ||
| 1064 | void crash_kexec(struct pt_regs *regs) | 1057 | void crash_kexec(struct pt_regs *regs) |
| 1065 | { | 1058 | { |
| 1066 | int locked; | 1059 | /* Take the kexec_mutex here to prevent sys_kexec_load |
| 1067 | |||
| 1068 | |||
| 1069 | /* Take the kexec_lock here to prevent sys_kexec_load | ||
| 1070 | * running on one cpu from replacing the crash kernel | 1060 | * running on one cpu from replacing the crash kernel |
| 1071 | * we are using after a panic on a different cpu. | 1061 | * we are using after a panic on a different cpu. |
| 1072 | * | 1062 | * |
| @@ -1074,8 +1064,7 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1074 | * of memory the xchg(&kexec_crash_image) would be | 1064 | * of memory the xchg(&kexec_crash_image) would be |
| 1075 | * sufficient. But since I reuse the memory... | 1065 | * sufficient. But since I reuse the memory... |
| 1076 | */ | 1066 | */ |
| 1077 | locked = xchg(&kexec_lock, 1); | 1067 | if (mutex_trylock(&kexec_mutex)) { |
| 1078 | if (!locked) { | ||
| 1079 | if (kexec_crash_image) { | 1068 | if (kexec_crash_image) { |
| 1080 | struct pt_regs fixed_regs; | 1069 | struct pt_regs fixed_regs; |
| 1081 | crash_setup_regs(&fixed_regs, regs); | 1070 | crash_setup_regs(&fixed_regs, regs); |
| @@ -1083,8 +1072,7 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1083 | machine_crash_shutdown(&fixed_regs); | 1072 | machine_crash_shutdown(&fixed_regs); |
| 1084 | machine_kexec(kexec_crash_image); | 1073 | machine_kexec(kexec_crash_image); |
| 1085 | } | 1074 | } |
| 1086 | locked = xchg(&kexec_lock, 0); | 1075 | mutex_unlock(&kexec_mutex); |
| 1087 | BUG_ON(!locked); | ||
| 1088 | } | 1076 | } |
| 1089 | } | 1077 | } |
| 1090 | 1078 | ||
| @@ -1426,25 +1414,23 @@ static int __init crash_save_vmcoreinfo_init(void) | |||
| 1426 | 1414 | ||
| 1427 | module_init(crash_save_vmcoreinfo_init) | 1415 | module_init(crash_save_vmcoreinfo_init) |
| 1428 | 1416 | ||
| 1429 | /** | 1417 | /* |
| 1430 | * kernel_kexec - reboot the system | 1418 | * Move into place and start executing a preloaded standalone |
| 1431 | * | 1419 | * executable. If nothing was preloaded return an error. |
| 1432 | * Move into place and start executing a preloaded standalone | ||
| 1433 | * executable. If nothing was preloaded return an error. | ||
| 1434 | */ | 1420 | */ |
| 1435 | int kernel_kexec(void) | 1421 | int kernel_kexec(void) |
| 1436 | { | 1422 | { |
| 1437 | int error = 0; | 1423 | int error = 0; |
| 1438 | 1424 | ||
| 1439 | if (xchg(&kexec_lock, 1)) | 1425 | if (!mutex_trylock(&kexec_mutex)) |
| 1440 | return -EBUSY; | 1426 | return -EBUSY; |
| 1441 | if (!kexec_image) { | 1427 | if (!kexec_image) { |
| 1442 | error = -EINVAL; | 1428 | error = -EINVAL; |
| 1443 | goto Unlock; | 1429 | goto Unlock; |
| 1444 | } | 1430 | } |
| 1445 | 1431 | ||
| 1446 | if (kexec_image->preserve_context) { | ||
| 1447 | #ifdef CONFIG_KEXEC_JUMP | 1432 | #ifdef CONFIG_KEXEC_JUMP |
| 1433 | if (kexec_image->preserve_context) { | ||
| 1448 | mutex_lock(&pm_mutex); | 1434 | mutex_lock(&pm_mutex); |
| 1449 | pm_prepare_console(); | 1435 | pm_prepare_console(); |
| 1450 | error = freeze_processes(); | 1436 | error = freeze_processes(); |
| @@ -1459,6 +1445,7 @@ int kernel_kexec(void) | |||
| 1459 | error = disable_nonboot_cpus(); | 1445 | error = disable_nonboot_cpus(); |
| 1460 | if (error) | 1446 | if (error) |
| 1461 | goto Resume_devices; | 1447 | goto Resume_devices; |
| 1448 | device_pm_lock(); | ||
| 1462 | local_irq_disable(); | 1449 | local_irq_disable(); |
| 1463 | /* At this point, device_suspend() has been called, | 1450 | /* At this point, device_suspend() has been called, |
| 1464 | * but *not* device_power_down(). We *must* | 1451 | * but *not* device_power_down(). We *must* |
| @@ -1470,26 +1457,22 @@ int kernel_kexec(void) | |||
| 1470 | error = device_power_down(PMSG_FREEZE); | 1457 | error = device_power_down(PMSG_FREEZE); |
| 1471 | if (error) | 1458 | if (error) |
| 1472 | goto Enable_irqs; | 1459 | goto Enable_irqs; |
| 1473 | save_processor_state(); | 1460 | } else |
| 1474 | #endif | 1461 | #endif |
| 1475 | } else { | 1462 | { |
| 1476 | blocking_notifier_call_chain(&reboot_notifier_list, | 1463 | kernel_restart_prepare(NULL); |
| 1477 | SYS_RESTART, NULL); | ||
| 1478 | system_state = SYSTEM_RESTART; | ||
| 1479 | device_shutdown(); | ||
| 1480 | sysdev_shutdown(); | ||
| 1481 | printk(KERN_EMERG "Starting new kernel\n"); | 1464 | printk(KERN_EMERG "Starting new kernel\n"); |
| 1482 | machine_shutdown(); | 1465 | machine_shutdown(); |
| 1483 | } | 1466 | } |
| 1484 | 1467 | ||
| 1485 | machine_kexec(kexec_image); | 1468 | machine_kexec(kexec_image); |
| 1486 | 1469 | ||
| 1487 | if (kexec_image->preserve_context) { | ||
| 1488 | #ifdef CONFIG_KEXEC_JUMP | 1470 | #ifdef CONFIG_KEXEC_JUMP |
| 1489 | restore_processor_state(); | 1471 | if (kexec_image->preserve_context) { |
| 1490 | device_power_up(PMSG_RESTORE); | 1472 | device_power_up(PMSG_RESTORE); |
| 1491 | Enable_irqs: | 1473 | Enable_irqs: |
| 1492 | local_irq_enable(); | 1474 | local_irq_enable(); |
| 1475 | device_pm_unlock(); | ||
| 1493 | enable_nonboot_cpus(); | 1476 | enable_nonboot_cpus(); |
| 1494 | Resume_devices: | 1477 | Resume_devices: |
| 1495 | device_resume(PMSG_RESTORE); | 1478 | device_resume(PMSG_RESTORE); |
| @@ -1499,11 +1482,10 @@ int kernel_kexec(void) | |||
| 1499 | Restore_console: | 1482 | Restore_console: |
| 1500 | pm_restore_console(); | 1483 | pm_restore_console(); |
| 1501 | mutex_unlock(&pm_mutex); | 1484 | mutex_unlock(&pm_mutex); |
| 1502 | #endif | ||
| 1503 | } | 1485 | } |
| 1486 | #endif | ||
| 1504 | 1487 | ||
| 1505 | Unlock: | 1488 | Unlock: |
| 1506 | xchg(&kexec_lock, 0); | 1489 | mutex_unlock(&kexec_mutex); |
| 1507 | |||
| 1508 | return error; | 1490 | return error; |
| 1509 | } | 1491 | } |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 1aa91fd6b06e..77fa776a2da8 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -1759,11 +1759,10 @@ static void check_chain_key(struct task_struct *curr) | |||
| 1759 | hlock = curr->held_locks + i; | 1759 | hlock = curr->held_locks + i; |
| 1760 | if (chain_key != hlock->prev_chain_key) { | 1760 | if (chain_key != hlock->prev_chain_key) { |
| 1761 | debug_locks_off(); | 1761 | debug_locks_off(); |
| 1762 | printk("hm#1, depth: %u [%u], %016Lx != %016Lx\n", | 1762 | WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n", |
| 1763 | curr->lockdep_depth, i, | 1763 | curr->lockdep_depth, i, |
| 1764 | (unsigned long long)chain_key, | 1764 | (unsigned long long)chain_key, |
| 1765 | (unsigned long long)hlock->prev_chain_key); | 1765 | (unsigned long long)hlock->prev_chain_key); |
| 1766 | WARN_ON(1); | ||
| 1767 | return; | 1766 | return; |
| 1768 | } | 1767 | } |
| 1769 | id = hlock->class_idx - 1; | 1768 | id = hlock->class_idx - 1; |
| @@ -1778,11 +1777,10 @@ static void check_chain_key(struct task_struct *curr) | |||
| 1778 | } | 1777 | } |
| 1779 | if (chain_key != curr->curr_chain_key) { | 1778 | if (chain_key != curr->curr_chain_key) { |
| 1780 | debug_locks_off(); | 1779 | debug_locks_off(); |
| 1781 | printk("hm#2, depth: %u [%u], %016Lx != %016Lx\n", | 1780 | WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n", |
| 1782 | curr->lockdep_depth, i, | 1781 | curr->lockdep_depth, i, |
| 1783 | (unsigned long long)chain_key, | 1782 | (unsigned long long)chain_key, |
| 1784 | (unsigned long long)curr->curr_chain_key); | 1783 | (unsigned long long)curr->curr_chain_key); |
| 1785 | WARN_ON(1); | ||
| 1786 | } | 1784 | } |
| 1787 | #endif | 1785 | #endif |
| 1788 | } | 1786 | } |
diff --git a/kernel/lockdep_internals.h b/kernel/lockdep_internals.h index 55db193d366d..56b196932c08 100644 --- a/kernel/lockdep_internals.h +++ b/kernel/lockdep_internals.h | |||
| @@ -50,8 +50,21 @@ extern unsigned int nr_process_chains; | |||
| 50 | extern unsigned int max_lockdep_depth; | 50 | extern unsigned int max_lockdep_depth; |
| 51 | extern unsigned int max_recursion_depth; | 51 | extern unsigned int max_recursion_depth; |
| 52 | 52 | ||
| 53 | #ifdef CONFIG_PROVE_LOCKING | ||
| 53 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); | 54 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); |
| 54 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); | 55 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); |
| 56 | #else | ||
| 57 | static inline unsigned long | ||
| 58 | lockdep_count_forward_deps(struct lock_class *class) | ||
| 59 | { | ||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | static inline unsigned long | ||
| 63 | lockdep_count_backward_deps(struct lock_class *class) | ||
| 64 | { | ||
| 65 | return 0; | ||
| 66 | } | ||
| 67 | #endif | ||
| 55 | 68 | ||
| 56 | #ifdef CONFIG_DEBUG_LOCKDEP | 69 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 57 | /* | 70 | /* |
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index fa19aee604c2..4b194d34d77f 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c | |||
| @@ -82,7 +82,6 @@ static void print_name(struct seq_file *m, struct lock_class *class) | |||
| 82 | 82 | ||
| 83 | static int l_show(struct seq_file *m, void *v) | 83 | static int l_show(struct seq_file *m, void *v) |
| 84 | { | 84 | { |
| 85 | unsigned long nr_forward_deps, nr_backward_deps; | ||
| 86 | struct lock_class *class = v; | 85 | struct lock_class *class = v; |
| 87 | struct lock_list *entry; | 86 | struct lock_list *entry; |
| 88 | char c1, c2, c3, c4; | 87 | char c1, c2, c3, c4; |
| @@ -96,11 +95,10 @@ static int l_show(struct seq_file *m, void *v) | |||
| 96 | #ifdef CONFIG_DEBUG_LOCKDEP | 95 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 97 | seq_printf(m, " OPS:%8ld", class->ops); | 96 | seq_printf(m, " OPS:%8ld", class->ops); |
| 98 | #endif | 97 | #endif |
| 99 | nr_forward_deps = lockdep_count_forward_deps(class); | 98 | #ifdef CONFIG_PROVE_LOCKING |
| 100 | seq_printf(m, " FD:%5ld", nr_forward_deps); | 99 | seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class)); |
| 101 | 100 | seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class)); | |
| 102 | nr_backward_deps = lockdep_count_backward_deps(class); | 101 | #endif |
| 103 | seq_printf(m, " BD:%5ld", nr_backward_deps); | ||
| 104 | 102 | ||
| 105 | get_usage_chars(class, &c1, &c2, &c3, &c4); | 103 | get_usage_chars(class, &c1, &c2, &c3, &c4); |
| 106 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); | 104 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); |
| @@ -325,7 +323,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) | |||
| 325 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) | 323 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) |
| 326 | nr_hardirq_read_unsafe++; | 324 | nr_hardirq_read_unsafe++; |
| 327 | 325 | ||
| 326 | #ifdef CONFIG_PROVE_LOCKING | ||
| 328 | sum_forward_deps += lockdep_count_forward_deps(class); | 327 | sum_forward_deps += lockdep_count_forward_deps(class); |
| 328 | #endif | ||
| 329 | } | 329 | } |
| 330 | #ifdef CONFIG_DEBUG_LOCKDEP | 330 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); | 331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 082b3fcb32a0..356699a96d56 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -140,7 +140,7 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode) | |||
| 140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) | 140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) |
| 141 | return -EPERM; | 141 | return -EPERM; |
| 142 | 142 | ||
| 143 | return security_ptrace(current, task, mode); | 143 | return security_ptrace_may_access(task, mode); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) | 146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) |
| @@ -499,8 +499,7 @@ repeat: | |||
| 499 | goto repeat; | 499 | goto repeat; |
| 500 | } | 500 | } |
| 501 | 501 | ||
| 502 | ret = security_ptrace(current->parent, current, | 502 | ret = security_ptrace_traceme(current->parent); |
| 503 | PTRACE_MODE_ATTACH); | ||
| 504 | 503 | ||
| 505 | /* | 504 | /* |
| 506 | * Set the ptrace bit in the process ptrace flags. | 505 | * Set the ptrace bit in the process ptrace flags. |
diff --git a/kernel/sched.c b/kernel/sched.c index d601fb0406ca..9a1ddb84e26d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -808,9 +808,9 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32; | |||
| 808 | 808 | ||
| 809 | /* | 809 | /* |
| 810 | * ratelimit for updating the group shares. | 810 | * ratelimit for updating the group shares. |
| 811 | * default: 0.5ms | 811 | * default: 0.25ms |
| 812 | */ | 812 | */ |
| 813 | const_debug unsigned int sysctl_sched_shares_ratelimit = 500000; | 813 | unsigned int sysctl_sched_shares_ratelimit = 250000; |
| 814 | 814 | ||
| 815 | /* | 815 | /* |
| 816 | * period over which we measure -rt task cpu usage in us. | 816 | * period over which we measure -rt task cpu usage in us. |
| @@ -4669,6 +4669,52 @@ int __sched wait_for_completion_killable(struct completion *x) | |||
| 4669 | } | 4669 | } |
| 4670 | EXPORT_SYMBOL(wait_for_completion_killable); | 4670 | EXPORT_SYMBOL(wait_for_completion_killable); |
| 4671 | 4671 | ||
| 4672 | /** | ||
| 4673 | * try_wait_for_completion - try to decrement a completion without blocking | ||
| 4674 | * @x: completion structure | ||
| 4675 | * | ||
| 4676 | * Returns: 0 if a decrement cannot be done without blocking | ||
| 4677 | * 1 if a decrement succeeded. | ||
| 4678 | * | ||
| 4679 | * If a completion is being used as a counting completion, | ||
| 4680 | * attempt to decrement the counter without blocking. This | ||
| 4681 | * enables us to avoid waiting if the resource the completion | ||
| 4682 | * is protecting is not available. | ||
| 4683 | */ | ||
| 4684 | bool try_wait_for_completion(struct completion *x) | ||
| 4685 | { | ||
| 4686 | int ret = 1; | ||
| 4687 | |||
| 4688 | spin_lock_irq(&x->wait.lock); | ||
| 4689 | if (!x->done) | ||
| 4690 | ret = 0; | ||
| 4691 | else | ||
| 4692 | x->done--; | ||
| 4693 | spin_unlock_irq(&x->wait.lock); | ||
| 4694 | return ret; | ||
| 4695 | } | ||
| 4696 | EXPORT_SYMBOL(try_wait_for_completion); | ||
| 4697 | |||
| 4698 | /** | ||
| 4699 | * completion_done - Test to see if a completion has any waiters | ||
| 4700 | * @x: completion structure | ||
| 4701 | * | ||
| 4702 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
| 4703 | * 1 if there are no waiters. | ||
| 4704 | * | ||
| 4705 | */ | ||
| 4706 | bool completion_done(struct completion *x) | ||
| 4707 | { | ||
| 4708 | int ret = 1; | ||
| 4709 | |||
| 4710 | spin_lock_irq(&x->wait.lock); | ||
| 4711 | if (!x->done) | ||
| 4712 | ret = 0; | ||
| 4713 | spin_unlock_irq(&x->wait.lock); | ||
| 4714 | return ret; | ||
| 4715 | } | ||
| 4716 | EXPORT_SYMBOL(completion_done); | ||
| 4717 | |||
| 4672 | static long __sched | 4718 | static long __sched |
| 4673 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) | 4719 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) |
| 4674 | { | 4720 | { |
| @@ -5740,6 +5786,8 @@ static inline void sched_init_granularity(void) | |||
| 5740 | sysctl_sched_latency = limit; | 5786 | sysctl_sched_latency = limit; |
| 5741 | 5787 | ||
| 5742 | sysctl_sched_wakeup_granularity *= factor; | 5788 | sysctl_sched_wakeup_granularity *= factor; |
| 5789 | |||
| 5790 | sysctl_sched_shares_ratelimit *= factor; | ||
| 5743 | } | 5791 | } |
| 5744 | 5792 | ||
| 5745 | #ifdef CONFIG_SMP | 5793 | #ifdef CONFIG_SMP |
| @@ -8462,8 +8510,8 @@ struct task_group *sched_create_group(struct task_group *parent) | |||
| 8462 | WARN_ON(!parent); /* root should already exist */ | 8510 | WARN_ON(!parent); /* root should already exist */ |
| 8463 | 8511 | ||
| 8464 | tg->parent = parent; | 8512 | tg->parent = parent; |
| 8465 | list_add_rcu(&tg->siblings, &parent->children); | ||
| 8466 | INIT_LIST_HEAD(&tg->children); | 8513 | INIT_LIST_HEAD(&tg->children); |
| 8514 | list_add_rcu(&tg->siblings, &parent->children); | ||
| 8467 | spin_unlock_irqrestore(&task_group_lock, flags); | 8515 | spin_unlock_irqrestore(&task_group_lock, flags); |
| 8468 | 8516 | ||
| 8469 | return tg; | 8517 | return tg; |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 6163e4cf885b..998ba54b4543 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -298,7 +298,7 @@ static void __disable_runtime(struct rq *rq) | |||
| 298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); | 298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); |
| 299 | s64 diff; | 299 | s64 diff; |
| 300 | 300 | ||
| 301 | if (iter == rt_rq) | 301 | if (iter == rt_rq || iter->rt_runtime == RUNTIME_INF) |
| 302 | continue; | 302 | continue; |
| 303 | 303 | ||
| 304 | spin_lock(&iter->rt_runtime_lock); | 304 | spin_lock(&iter->rt_runtime_lock); |
diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 44baeea94ab9..29ab20749dd3 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
| @@ -290,7 +290,6 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
| 290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); | 290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); |
| 291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
| 292 | } | 292 | } |
| 293 | |||
| 294 | EXPORT_SYMBOL(_spin_lock_nested); | 293 | EXPORT_SYMBOL(_spin_lock_nested); |
| 295 | 294 | ||
| 296 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | 295 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) |
| @@ -312,7 +311,6 @@ unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclas | |||
| 312 | #endif | 311 | #endif |
| 313 | return flags; | 312 | return flags; |
| 314 | } | 313 | } |
| 315 | |||
| 316 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); | 314 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); |
| 317 | 315 | ||
| 318 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | 316 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, |
| @@ -322,7 +320,6 @@ void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | |||
| 322 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); | 320 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); |
| 323 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 321 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
| 324 | } | 322 | } |
| 325 | |||
| 326 | EXPORT_SYMBOL(_spin_lock_nest_lock); | 323 | EXPORT_SYMBOL(_spin_lock_nest_lock); |
| 327 | 324 | ||
| 328 | #endif | 325 | #endif |
diff --git a/kernel/sys.c b/kernel/sys.c index c01858090a98..3dacb00a7f76 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -274,7 +274,7 @@ void emergency_restart(void) | |||
| 274 | } | 274 | } |
| 275 | EXPORT_SYMBOL_GPL(emergency_restart); | 275 | EXPORT_SYMBOL_GPL(emergency_restart); |
| 276 | 276 | ||
| 277 | static void kernel_restart_prepare(char *cmd) | 277 | void kernel_restart_prepare(char *cmd) |
| 278 | { | 278 | { |
| 279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); | 279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); |
| 280 | system_state = SYSTEM_RESTART; | 280 | system_state = SYSTEM_RESTART; |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 800ac8485544..8b5a7d304a5f 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -693,6 +693,14 @@ config LATENCYTOP | |||
| 693 | Enable this option if you want to use the LatencyTOP tool | 693 | Enable this option if you want to use the LatencyTOP tool |
| 694 | to find out which userspace is blocking on what kernel operations. | 694 | to find out which userspace is blocking on what kernel operations. |
| 695 | 695 | ||
| 696 | config SYSCTL_SYSCALL_CHECK | ||
| 697 | bool "Sysctl checks" | ||
| 698 | depends on SYSCTL_SYSCALL | ||
| 699 | ---help--- | ||
| 700 | sys_sysctl uses binary paths that have been found challenging | ||
| 701 | to properly maintain and use. This enables checks that help | ||
| 702 | you to keep things correct. | ||
| 703 | |||
| 696 | source kernel/trace/Kconfig | 704 | source kernel/trace/Kconfig |
| 697 | 705 | ||
| 698 | config PROVIDE_OHCI1394_DMA_INIT | 706 | config PROVIDE_OHCI1394_DMA_INIT |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 4af15d0340ad..e023c68b0255 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
| @@ -473,7 +473,7 @@ find_block: | |||
| 473 | goto find_block; | 473 | goto find_block; |
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | if (bdata->last_end_off && | 476 | if (bdata->last_end_off & (PAGE_SIZE - 1) && |
| 477 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) | 477 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) |
| 478 | start_off = ALIGN(bdata->last_end_off, align); | 478 | start_off = ALIGN(bdata->last_end_off, align); |
| 479 | else | 479 | else |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 8a5467ee6265..64e5b4bcd964 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
| 28 | #include <linux/memcontrol.h> | 28 | #include <linux/memcontrol.h> |
| 29 | #include <linux/security.h> | ||
| 29 | 30 | ||
| 30 | int sysctl_panic_on_oom; | 31 | int sysctl_panic_on_oom; |
| 31 | int sysctl_oom_kill_allocating_task; | 32 | int sysctl_oom_kill_allocating_task; |
| @@ -128,7 +129,8 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
| 128 | * Superuser processes are usually more important, so we make it | 129 | * Superuser processes are usually more important, so we make it |
| 129 | * less likely that we kill those. | 130 | * less likely that we kill those. |
| 130 | */ | 131 | */ |
| 131 | if (__capable(p, CAP_SYS_ADMIN) || __capable(p, CAP_SYS_RESOURCE)) | 132 | if (has_capability(p, CAP_SYS_ADMIN) || |
| 133 | has_capability(p, CAP_SYS_RESOURCE)) | ||
| 132 | points /= 4; | 134 | points /= 4; |
| 133 | 135 | ||
| 134 | /* | 136 | /* |
| @@ -137,7 +139,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
| 137 | * tend to only have this flag set on applications they think | 139 | * tend to only have this flag set on applications they think |
| 138 | * of as important. | 140 | * of as important. |
| 139 | */ | 141 | */ |
| 140 | if (__capable(p, CAP_SYS_RAWIO)) | 142 | if (has_capability(p, CAP_SYS_RAWIO)) |
| 141 | points /= 4; | 143 | points /= 4; |
| 142 | 144 | ||
| 143 | /* | 145 | /* |
diff --git a/security/capability.c b/security/capability.c index 63d10da515a5..245874819036 100644 --- a/security/capability.c +++ b/security/capability.c | |||
| @@ -811,7 +811,8 @@ struct security_operations default_security_ops = { | |||
| 811 | 811 | ||
| 812 | void security_fixup_ops(struct security_operations *ops) | 812 | void security_fixup_ops(struct security_operations *ops) |
| 813 | { | 813 | { |
| 814 | set_to_cap_if_null(ops, ptrace); | 814 | set_to_cap_if_null(ops, ptrace_may_access); |
| 815 | set_to_cap_if_null(ops, ptrace_traceme); | ||
| 815 | set_to_cap_if_null(ops, capget); | 816 | set_to_cap_if_null(ops, capget); |
| 816 | set_to_cap_if_null(ops, capset_check); | 817 | set_to_cap_if_null(ops, capset_check); |
| 817 | set_to_cap_if_null(ops, capset_set); | 818 | set_to_cap_if_null(ops, capset_set); |
diff --git a/security/commoncap.c b/security/commoncap.c index 4afbece37a08..e4c4b3fc0c04 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
| @@ -63,14 +63,24 @@ int cap_settime(struct timespec *ts, struct timezone *tz) | |||
| 63 | return 0; | 63 | return 0; |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | int cap_ptrace (struct task_struct *parent, struct task_struct *child, | 66 | int cap_ptrace_may_access(struct task_struct *child, unsigned int mode) |
| 67 | unsigned int mode) | ||
| 68 | { | 67 | { |
| 69 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | 68 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ |
| 70 | if (!cap_issubset(child->cap_permitted, parent->cap_permitted) && | 69 | if (cap_issubset(child->cap_permitted, current->cap_permitted)) |
| 71 | !__capable(parent, CAP_SYS_PTRACE)) | 70 | return 0; |
| 72 | return -EPERM; | 71 | if (capable(CAP_SYS_PTRACE)) |
| 73 | return 0; | 72 | return 0; |
| 73 | return -EPERM; | ||
| 74 | } | ||
| 75 | |||
| 76 | int cap_ptrace_traceme(struct task_struct *parent) | ||
| 77 | { | ||
| 78 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | ||
| 79 | if (cap_issubset(current->cap_permitted, parent->cap_permitted)) | ||
| 80 | return 0; | ||
| 81 | if (has_capability(parent, CAP_SYS_PTRACE)) | ||
| 82 | return 0; | ||
| 83 | return -EPERM; | ||
| 74 | } | 84 | } |
| 75 | 85 | ||
| 76 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, | 86 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, |
| @@ -534,7 +544,7 @@ int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, | |||
| 534 | static inline int cap_safe_nice(struct task_struct *p) | 544 | static inline int cap_safe_nice(struct task_struct *p) |
| 535 | { | 545 | { |
| 536 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && | 546 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && |
| 537 | !__capable(current, CAP_SYS_NICE)) | 547 | !capable(CAP_SYS_NICE)) |
| 538 | return -EPERM; | 548 | return -EPERM; |
| 539 | return 0; | 549 | return 0; |
| 540 | } | 550 | } |
diff --git a/security/root_plug.c b/security/root_plug.c index be0ebec2580b..c3f68b5b372d 100644 --- a/security/root_plug.c +++ b/security/root_plug.c | |||
| @@ -72,7 +72,8 @@ static int rootplug_bprm_check_security (struct linux_binprm *bprm) | |||
| 72 | 72 | ||
| 73 | static struct security_operations rootplug_security_ops = { | 73 | static struct security_operations rootplug_security_ops = { |
| 74 | /* Use the capability functions for some of the hooks */ | 74 | /* Use the capability functions for some of the hooks */ |
| 75 | .ptrace = cap_ptrace, | 75 | .ptrace_may_access = cap_ptrace_may_access, |
| 76 | .ptrace_traceme = cap_ptrace_traceme, | ||
| 76 | .capget = cap_capget, | 77 | .capget = cap_capget, |
| 77 | .capset_check = cap_capset_check, | 78 | .capset_check = cap_capset_check, |
| 78 | .capset_set = cap_capset_set, | 79 | .capset_set = cap_capset_set, |
diff --git a/security/security.c b/security/security.c index ff7068727757..3a4b4f55b33f 100644 --- a/security/security.c +++ b/security/security.c | |||
| @@ -127,10 +127,14 @@ int register_security(struct security_operations *ops) | |||
| 127 | 127 | ||
| 128 | /* Security operations */ | 128 | /* Security operations */ |
| 129 | 129 | ||
| 130 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 130 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode) |
| 131 | unsigned int mode) | ||
| 132 | { | 131 | { |
| 133 | return security_ops->ptrace(parent, child, mode); | 132 | return security_ops->ptrace_may_access(child, mode); |
| 133 | } | ||
| 134 | |||
| 135 | int security_ptrace_traceme(struct task_struct *parent) | ||
| 136 | { | ||
| 137 | return security_ops->ptrace_traceme(parent); | ||
| 134 | } | 138 | } |
| 135 | 139 | ||
| 136 | int security_capget(struct task_struct *target, | 140 | int security_capget(struct task_struct *target, |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 3ae9bec5a508..03fc6a81ae32 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1738,24 +1738,34 @@ static inline u32 file_to_av(struct file *file) | |||
| 1738 | 1738 | ||
| 1739 | /* Hook functions begin here. */ | 1739 | /* Hook functions begin here. */ |
| 1740 | 1740 | ||
| 1741 | static int selinux_ptrace(struct task_struct *parent, | 1741 | static int selinux_ptrace_may_access(struct task_struct *child, |
| 1742 | struct task_struct *child, | 1742 | unsigned int mode) |
| 1743 | unsigned int mode) | ||
| 1744 | { | 1743 | { |
| 1745 | int rc; | 1744 | int rc; |
| 1746 | 1745 | ||
| 1747 | rc = secondary_ops->ptrace(parent, child, mode); | 1746 | rc = secondary_ops->ptrace_may_access(child, mode); |
| 1748 | if (rc) | 1747 | if (rc) |
| 1749 | return rc; | 1748 | return rc; |
| 1750 | 1749 | ||
| 1751 | if (mode == PTRACE_MODE_READ) { | 1750 | if (mode == PTRACE_MODE_READ) { |
| 1752 | struct task_security_struct *tsec = parent->security; | 1751 | struct task_security_struct *tsec = current->security; |
| 1753 | struct task_security_struct *csec = child->security; | 1752 | struct task_security_struct *csec = child->security; |
| 1754 | return avc_has_perm(tsec->sid, csec->sid, | 1753 | return avc_has_perm(tsec->sid, csec->sid, |
| 1755 | SECCLASS_FILE, FILE__READ, NULL); | 1754 | SECCLASS_FILE, FILE__READ, NULL); |
| 1756 | } | 1755 | } |
| 1757 | 1756 | ||
| 1758 | return task_has_perm(parent, child, PROCESS__PTRACE); | 1757 | return task_has_perm(current, child, PROCESS__PTRACE); |
| 1758 | } | ||
| 1759 | |||
| 1760 | static int selinux_ptrace_traceme(struct task_struct *parent) | ||
| 1761 | { | ||
| 1762 | int rc; | ||
| 1763 | |||
| 1764 | rc = secondary_ops->ptrace_traceme(parent); | ||
| 1765 | if (rc) | ||
| 1766 | return rc; | ||
| 1767 | |||
| 1768 | return task_has_perm(parent, current, PROCESS__PTRACE); | ||
| 1759 | } | 1769 | } |
| 1760 | 1770 | ||
| 1761 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, | 1771 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, |
| @@ -5346,7 +5356,8 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) | |||
| 5346 | static struct security_operations selinux_ops = { | 5356 | static struct security_operations selinux_ops = { |
| 5347 | .name = "selinux", | 5357 | .name = "selinux", |
| 5348 | 5358 | ||
| 5349 | .ptrace = selinux_ptrace, | 5359 | .ptrace_may_access = selinux_ptrace_may_access, |
| 5360 | .ptrace_traceme = selinux_ptrace_traceme, | ||
| 5350 | .capget = selinux_capget, | 5361 | .capget = selinux_capget, |
| 5351 | .capset_check = selinux_capset_check, | 5362 | .capset_check = selinux_capset_check, |
| 5352 | .capset_set = selinux_capset_set, | 5363 | .capset_set = selinux_capset_set, |
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 1b40e558f983..87d75417ea93 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
| @@ -87,27 +87,46 @@ struct inode_smack *new_inode_smack(char *smack) | |||
| 87 | */ | 87 | */ |
| 88 | 88 | ||
| 89 | /** | 89 | /** |
| 90 | * smack_ptrace - Smack approval on ptrace | 90 | * smack_ptrace_may_access - Smack approval on PTRACE_ATTACH |
| 91 | * @ptp: parent task pointer | ||
| 92 | * @ctp: child task pointer | 91 | * @ctp: child task pointer |
| 93 | * | 92 | * |
| 94 | * Returns 0 if access is OK, an error code otherwise | 93 | * Returns 0 if access is OK, an error code otherwise |
| 95 | * | 94 | * |
| 96 | * Do the capability checks, and require read and write. | 95 | * Do the capability checks, and require read and write. |
| 97 | */ | 96 | */ |
| 98 | static int smack_ptrace(struct task_struct *ptp, struct task_struct *ctp, | 97 | static int smack_ptrace_may_access(struct task_struct *ctp, unsigned int mode) |
| 99 | unsigned int mode) | ||
| 100 | { | 98 | { |
| 101 | int rc; | 99 | int rc; |
| 102 | 100 | ||
| 103 | rc = cap_ptrace(ptp, ctp, mode); | 101 | rc = cap_ptrace_may_access(ctp, mode); |
| 104 | if (rc != 0) | 102 | if (rc != 0) |
| 105 | return rc; | 103 | return rc; |
| 106 | 104 | ||
| 107 | rc = smk_access(ptp->security, ctp->security, MAY_READWRITE); | 105 | rc = smk_access(current->security, ctp->security, MAY_READWRITE); |
| 108 | if (rc != 0 && __capable(ptp, CAP_MAC_OVERRIDE)) | 106 | if (rc != 0 && capable(CAP_MAC_OVERRIDE)) |
| 109 | return 0; | 107 | return 0; |
| 108 | return rc; | ||
| 109 | } | ||
| 110 | |||
| 111 | /** | ||
| 112 | * smack_ptrace_traceme - Smack approval on PTRACE_TRACEME | ||
| 113 | * @ptp: parent task pointer | ||
| 114 | * | ||
| 115 | * Returns 0 if access is OK, an error code otherwise | ||
| 116 | * | ||
| 117 | * Do the capability checks, and require read and write. | ||
| 118 | */ | ||
| 119 | static int smack_ptrace_traceme(struct task_struct *ptp) | ||
| 120 | { | ||
| 121 | int rc; | ||
| 122 | |||
| 123 | rc = cap_ptrace_traceme(ptp); | ||
| 124 | if (rc != 0) | ||
| 125 | return rc; | ||
| 110 | 126 | ||
| 127 | rc = smk_access(ptp->security, current->security, MAY_READWRITE); | ||
| 128 | if (rc != 0 && has_capability(ptp, CAP_MAC_OVERRIDE)) | ||
| 129 | return 0; | ||
| 111 | return rc; | 130 | return rc; |
| 112 | } | 131 | } |
| 113 | 132 | ||
| @@ -923,7 +942,7 @@ static int smack_file_send_sigiotask(struct task_struct *tsk, | |||
| 923 | */ | 942 | */ |
| 924 | file = container_of(fown, struct file, f_owner); | 943 | file = container_of(fown, struct file, f_owner); |
| 925 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); | 944 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); |
| 926 | if (rc != 0 && __capable(tsk, CAP_MAC_OVERRIDE)) | 945 | if (rc != 0 && has_capability(tsk, CAP_MAC_OVERRIDE)) |
| 927 | return 0; | 946 | return 0; |
| 928 | return rc; | 947 | return rc; |
| 929 | } | 948 | } |
| @@ -1164,12 +1183,12 @@ static int smack_task_wait(struct task_struct *p) | |||
| 1164 | * account for the smack labels having gotten to | 1183 | * account for the smack labels having gotten to |
| 1165 | * be different in the first place. | 1184 | * be different in the first place. |
| 1166 | * | 1185 | * |
| 1167 | * This breaks the strict subjet/object access | 1186 | * This breaks the strict subject/object access |
| 1168 | * control ideal, taking the object's privilege | 1187 | * control ideal, taking the object's privilege |
| 1169 | * state into account in the decision as well as | 1188 | * state into account in the decision as well as |
| 1170 | * the smack value. | 1189 | * the smack value. |
| 1171 | */ | 1190 | */ |
| 1172 | if (capable(CAP_MAC_OVERRIDE) || __capable(p, CAP_MAC_OVERRIDE)) | 1191 | if (capable(CAP_MAC_OVERRIDE) || has_capability(p, CAP_MAC_OVERRIDE)) |
| 1173 | return 0; | 1192 | return 0; |
| 1174 | 1193 | ||
| 1175 | return rc; | 1194 | return rc; |
| @@ -2016,9 +2035,6 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
| 2016 | { | 2035 | { |
| 2017 | char *newsmack; | 2036 | char *newsmack; |
| 2018 | 2037 | ||
| 2019 | if (!__capable(p, CAP_MAC_ADMIN)) | ||
| 2020 | return -EPERM; | ||
| 2021 | |||
| 2022 | /* | 2038 | /* |
| 2023 | * Changing another process' Smack value is too dangerous | 2039 | * Changing another process' Smack value is too dangerous |
| 2024 | * and supports no sane use case. | 2040 | * and supports no sane use case. |
| @@ -2026,6 +2042,9 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
| 2026 | if (p != current) | 2042 | if (p != current) |
| 2027 | return -EPERM; | 2043 | return -EPERM; |
| 2028 | 2044 | ||
| 2045 | if (!capable(CAP_MAC_ADMIN)) | ||
| 2046 | return -EPERM; | ||
| 2047 | |||
| 2029 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) | 2048 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) |
| 2030 | return -EINVAL; | 2049 | return -EINVAL; |
| 2031 | 2050 | ||
| @@ -2552,7 +2571,8 @@ static void smack_release_secctx(char *secdata, u32 seclen) | |||
| 2552 | struct security_operations smack_ops = { | 2571 | struct security_operations smack_ops = { |
| 2553 | .name = "smack", | 2572 | .name = "smack", |
| 2554 | 2573 | ||
| 2555 | .ptrace = smack_ptrace, | 2574 | .ptrace_may_access = smack_ptrace_may_access, |
| 2575 | .ptrace_traceme = smack_ptrace_traceme, | ||
| 2556 | .capget = cap_capget, | 2576 | .capget = cap_capget, |
| 2557 | .capset_check = cap_capset_check, | 2577 | .capset_check = cap_capset_check, |
| 2558 | .capset_set = cap_capset_set, | 2578 | .capset_set = cap_capset_set, |
| @@ -2729,4 +2749,3 @@ static __init int smack_init(void) | |||
| 2729 | * all processes and objects when they are created. | 2749 | * all processes and objects when they are created. |
| 2730 | */ | 2750 | */ |
| 2731 | security_initcall(smack_init); | 2751 | security_initcall(smack_init); |
| 2732 | |||
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index f7d95b224a98..31f52d3fc21f 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
| @@ -845,7 +845,7 @@ config SND_VIRTUOSO | |||
| 845 | select SND_OXYGEN_LIB | 845 | select SND_OXYGEN_LIB |
| 846 | help | 846 | help |
| 847 | Say Y here to include support for sound cards based on the | 847 | Say Y here to include support for sound cards based on the |
| 848 | Asus AV100/AV200 chips, i.e., Xonar D2, DX and D2X. | 848 | Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2 and D2X. |
| 849 | 849 | ||
| 850 | To compile this driver as a module, choose M here: the module | 850 | To compile this driver as a module, choose M here: the module |
| 851 | will be called snd-virtuoso. | 851 | will be called snd-virtuoso. |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 9a2c16bf94e0..01d7b75f9182 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
| @@ -36,15 +36,15 @@ | |||
| 36 | */ | 36 | */ |
| 37 | 37 | ||
| 38 | /* | 38 | /* |
| 39 | * Xonar DX | 39 | * Xonar D1/DX |
| 40 | * -------- | 40 | * ----------- |
| 41 | * | 41 | * |
| 42 | * CMI8788: | 42 | * CMI8788: |
| 43 | * | 43 | * |
| 44 | * I²C <-> CS4398 (front) | 44 | * I²C <-> CS4398 (front) |
| 45 | * <-> CS4362A (surround, center/LFE, back) | 45 | * <-> CS4362A (surround, center/LFE, back) |
| 46 | * | 46 | * |
| 47 | * GPI 0 <- external power present | 47 | * GPI 0 <- external power present (DX only) |
| 48 | * | 48 | * |
| 49 | * GPIO 0 -> enable output to speakers | 49 | * GPIO 0 -> enable output to speakers |
| 50 | * GPIO 1 -> enable front panel I/O | 50 | * GPIO 1 -> enable front panel I/O |
| @@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card"); | |||
| 96 | enum { | 96 | enum { |
| 97 | MODEL_D2, | 97 | MODEL_D2, |
| 98 | MODEL_D2X, | 98 | MODEL_D2X, |
| 99 | MODEL_D1, | ||
| 99 | MODEL_DX, | 100 | MODEL_DX, |
| 100 | }; | 101 | }; |
| 101 | 102 | ||
| @@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = { | |||
| 103 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, | 104 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, |
| 104 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, | 105 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, |
| 105 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, | 106 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, |
| 107 | { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, | ||
| 106 | { } | 108 | { } |
| 107 | }; | 109 | }; |
| 108 | MODULE_DEVICE_TABLE(pci, xonar_ids); | 110 | MODULE_DEVICE_TABLE(pci, xonar_ids); |
| @@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip) | |||
| 313 | cs4362a_write(chip, 0x01, CS4362A_CPEN); | 315 | cs4362a_write(chip, 0x01, CS4362A_CPEN); |
| 314 | } | 316 | } |
| 315 | 317 | ||
| 316 | static void xonar_dx_init(struct oxygen *chip) | 318 | static void xonar_d1_init(struct oxygen *chip) |
| 317 | { | 319 | { |
| 318 | struct xonar_data *data = chip->model_data; | 320 | struct xonar_data *data = chip->model_data; |
| 319 | 321 | ||
| 320 | data->anti_pop_delay = 800; | 322 | data->anti_pop_delay = 800; |
| 321 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; | 323 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; |
| 322 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
| 323 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
| 324 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
| 325 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; | 324 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; |
| 326 | data->cs4362a_fm = CS4362A_FM_SINGLE | | 325 | data->cs4362a_fm = CS4362A_FM_SINGLE | |
| 327 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | 326 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; |
| @@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip) | |||
| 345 | snd_component_add(chip->card, "CS5361"); | 344 | snd_component_add(chip->card, "CS5361"); |
| 346 | } | 345 | } |
| 347 | 346 | ||
| 347 | static void xonar_dx_init(struct oxygen *chip) | ||
| 348 | { | ||
| 349 | struct xonar_data *data = chip->model_data; | ||
| 350 | |||
| 351 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
| 352 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
| 353 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
| 354 | xonar_d1_init(chip); | ||
| 355 | } | ||
| 356 | |||
| 348 | static void xonar_cleanup(struct oxygen *chip) | 357 | static void xonar_cleanup(struct oxygen *chip) |
| 349 | { | 358 | { |
| 350 | struct xonar_data *data = chip->model_data; | 359 | struct xonar_data *data = chip->model_data; |
| @@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip) | |||
| 352 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); | 361 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); |
| 353 | } | 362 | } |
| 354 | 363 | ||
| 355 | static void xonar_dx_cleanup(struct oxygen *chip) | 364 | static void xonar_d1_cleanup(struct oxygen *chip) |
| 356 | { | 365 | { |
| 357 | xonar_cleanup(chip); | 366 | xonar_cleanup(chip); |
| 358 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); | 367 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); |
| @@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip) | |||
| 365 | xonar_enable_output(chip); | 374 | xonar_enable_output(chip); |
| 366 | } | 375 | } |
| 367 | 376 | ||
| 368 | static void xonar_dx_resume(struct oxygen *chip) | 377 | static void xonar_d1_resume(struct oxygen *chip) |
| 369 | { | 378 | { |
| 370 | cs43xx_init(chip); | 379 | cs43xx_init(chip); |
| 371 | xonar_enable_output(chip); | 380 | xonar_enable_output(chip); |
| @@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = { | |||
| 513 | .put = front_panel_put, | 522 | .put = front_panel_put, |
| 514 | }; | 523 | }; |
| 515 | 524 | ||
| 516 | static void xonar_dx_ac97_switch(struct oxygen *chip, | 525 | static void xonar_d1_ac97_switch(struct oxygen *chip, |
| 517 | unsigned int reg, unsigned int mute) | 526 | unsigned int reg, unsigned int mute) |
| 518 | { | 527 | { |
| 519 | if (reg == AC97_LINE) { | 528 | if (reg == AC97_LINE) { |
| @@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template) | |||
| 536 | return 0; | 545 | return 0; |
| 537 | } | 546 | } |
| 538 | 547 | ||
| 539 | static int xonar_dx_control_filter(struct snd_kcontrol_new *template) | 548 | static int xonar_d1_control_filter(struct snd_kcontrol_new *template) |
| 540 | { | 549 | { |
| 541 | if (!strncmp(template->name, "CD Capture ", 11)) | 550 | if (!strncmp(template->name, "CD Capture ", 11)) |
| 542 | return 1; /* no CD input */ | 551 | return 1; /* no CD input */ |
| @@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip) | |||
| 548 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); | 557 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); |
| 549 | } | 558 | } |
| 550 | 559 | ||
| 551 | static int xonar_dx_mixer_init(struct oxygen *chip) | 560 | static int xonar_d1_mixer_init(struct oxygen *chip) |
| 552 | { | 561 | { |
| 553 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); | 562 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); |
| 554 | } | 563 | } |
| @@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = { | |||
| 615 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 624 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
| 616 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 625 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
| 617 | }, | 626 | }, |
| 627 | [MODEL_D1] = { | ||
| 628 | .shortname = "Xonar D1", | ||
| 629 | .longname = "Asus Virtuoso 100", | ||
| 630 | .chip = "AV200", | ||
| 631 | .owner = THIS_MODULE, | ||
| 632 | .init = xonar_d1_init, | ||
| 633 | .control_filter = xonar_d1_control_filter, | ||
| 634 | .mixer_init = xonar_d1_mixer_init, | ||
| 635 | .cleanup = xonar_d1_cleanup, | ||
| 636 | .suspend = xonar_d1_cleanup, | ||
| 637 | .resume = xonar_d1_resume, | ||
| 638 | .set_dac_params = set_cs43xx_params, | ||
| 639 | .set_adc_params = set_cs53x1_params, | ||
| 640 | .update_dac_volume = update_cs43xx_volume, | ||
| 641 | .update_dac_mute = update_cs43xx_mute, | ||
| 642 | .ac97_switch = xonar_d1_ac97_switch, | ||
| 643 | .dac_tlv = cs4362a_db_scale, | ||
| 644 | .model_data_size = sizeof(struct xonar_data), | ||
| 645 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | ||
| 646 | PLAYBACK_1_TO_SPDIF | | ||
| 647 | CAPTURE_0_FROM_I2S_2, | ||
| 648 | .dac_channels = 8, | ||
| 649 | .dac_volume_min = 0, | ||
| 650 | .dac_volume_max = 127, | ||
| 651 | .function_flags = OXYGEN_FUNCTION_2WIRE, | ||
| 652 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
| 653 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
| 654 | }, | ||
| 618 | [MODEL_DX] = { | 655 | [MODEL_DX] = { |
| 619 | .shortname = "Xonar DX", | 656 | .shortname = "Xonar DX", |
| 620 | .longname = "Asus Virtuoso 100", | 657 | .longname = "Asus Virtuoso 100", |
| 621 | .chip = "AV200", | 658 | .chip = "AV200", |
| 622 | .owner = THIS_MODULE, | 659 | .owner = THIS_MODULE, |
| 623 | .init = xonar_dx_init, | 660 | .init = xonar_dx_init, |
| 624 | .control_filter = xonar_dx_control_filter, | 661 | .control_filter = xonar_d1_control_filter, |
| 625 | .mixer_init = xonar_dx_mixer_init, | 662 | .mixer_init = xonar_d1_mixer_init, |
| 626 | .cleanup = xonar_dx_cleanup, | 663 | .cleanup = xonar_d1_cleanup, |
| 627 | .suspend = xonar_dx_cleanup, | 664 | .suspend = xonar_d1_cleanup, |
| 628 | .resume = xonar_dx_resume, | 665 | .resume = xonar_d1_resume, |
| 629 | .set_dac_params = set_cs43xx_params, | 666 | .set_dac_params = set_cs43xx_params, |
| 630 | .set_adc_params = set_cs53x1_params, | 667 | .set_adc_params = set_cs53x1_params, |
| 631 | .update_dac_volume = update_cs43xx_volume, | 668 | .update_dac_volume = update_cs43xx_volume, |
| 632 | .update_dac_mute = update_cs43xx_mute, | 669 | .update_dac_mute = update_cs43xx_mute, |
| 633 | .gpio_changed = xonar_gpio_changed, | 670 | .gpio_changed = xonar_gpio_changed, |
| 634 | .ac97_switch = xonar_dx_ac97_switch, | 671 | .ac97_switch = xonar_d1_ac97_switch, |
| 635 | .dac_tlv = cs4362a_db_scale, | 672 | .dac_tlv = cs4362a_db_scale, |
| 636 | .model_data_size = sizeof(struct xonar_data), | 673 | .model_data_size = sizeof(struct xonar_data), |
| 637 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | 674 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | |
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 3ecce5168e94..e44153fa38de 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c | |||
| @@ -82,7 +82,7 @@ static const u16 wm8990_reg[] = { | |||
| 82 | 0x0003, /* R35 - ClassD1 */ | 82 | 0x0003, /* R35 - ClassD1 */ |
| 83 | 0x0000, /* R36 */ | 83 | 0x0000, /* R36 */ |
| 84 | 0x0100, /* R37 - ClassD3 */ | 84 | 0x0100, /* R37 - ClassD3 */ |
| 85 | 0x0000, /* R38 */ | 85 | 0x0079, /* R38 - ClassD4 */ |
| 86 | 0x0000, /* R39 - Input Mixer1 */ | 86 | 0x0000, /* R39 - Input Mixer1 */ |
| 87 | 0x0000, /* R40 - Input Mixer2 */ | 87 | 0x0000, /* R40 - Input Mixer2 */ |
| 88 | 0x0000, /* R41 - Input Mixer3 */ | 88 | 0x0000, /* R41 - Input Mixer3 */ |
| @@ -311,11 +311,15 @@ SOC_SINGLE("Speaker Mode Switch", WM8990_CLASSD1, | |||
| 311 | WM8990_CDMODE_BIT, 1, 0), | 311 | WM8990_CDMODE_BIT, 1, 0), |
| 312 | 312 | ||
| 313 | SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME, | 313 | SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME, |
| 314 | WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0), | 314 | WM8990_SPKATTN_SHIFT, WM8990_SPKATTN_MASK, 0), |
| 315 | SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3, | 315 | SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3, |
| 316 | WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0), | 316 | WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0), |
| 317 | SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3, | 317 | SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3, |
| 318 | WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0), | 318 | WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0), |
| 319 | SOC_SINGLE_TLV("Speaker Volume", WM8990_CLASSD4, | ||
| 320 | WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0, out_pga_tlv), | ||
| 321 | SOC_SINGLE("Speaker ZC Switch", WM8990_CLASSD4, | ||
| 322 | WM8990_SPKZC_SHIFT, WM8990_SPKZC_MASK, 0), | ||
| 319 | 323 | ||
| 320 | SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume", | 324 | SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume", |
| 321 | WM8990_LEFT_DAC_DIGITAL_VOLUME, | 325 | WM8990_LEFT_DAC_DIGITAL_VOLUME, |
| @@ -920,7 +924,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
| 920 | {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"}, | 924 | {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"}, |
| 921 | {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"}, | 925 | {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"}, |
| 922 | {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"}, | 926 | {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"}, |
| 923 | {"SPKMIX", "SPKMIX Left DAC Switch", "Right DAC"}, | 927 | {"SPKMIX", "SPKMIX Left DAC Switch", "Left DAC"}, |
| 924 | 928 | ||
| 925 | /* LONMIX */ | 929 | /* LONMIX */ |
| 926 | {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"}, | 930 | {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"}, |
diff --git a/sound/soc/codecs/wm8990.h b/sound/soc/codecs/wm8990.h index 6bea57485283..0a08325d5443 100644 --- a/sound/soc/codecs/wm8990.h +++ b/sound/soc/codecs/wm8990.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #define WM8990_SPEAKER_VOLUME 0x22 | 54 | #define WM8990_SPEAKER_VOLUME 0x22 |
| 55 | #define WM8990_CLASSD1 0x23 | 55 | #define WM8990_CLASSD1 0x23 |
| 56 | #define WM8990_CLASSD3 0x25 | 56 | #define WM8990_CLASSD3 0x25 |
| 57 | #define WM8990_CLASSD4 0x26 | ||
| 57 | #define WM8990_INPUT_MIXER1 0x27 | 58 | #define WM8990_INPUT_MIXER1 0x27 |
| 58 | #define WM8990_INPUT_MIXER2 0x28 | 59 | #define WM8990_INPUT_MIXER2 0x28 |
| 59 | #define WM8990_INPUT_MIXER3 0x29 | 60 | #define WM8990_INPUT_MIXER3 0x29 |
| @@ -528,8 +529,8 @@ | |||
| 528 | /* | 529 | /* |
| 529 | * R34 (0x22) - Speaker Volume | 530 | * R34 (0x22) - Speaker Volume |
| 530 | */ | 531 | */ |
| 531 | #define WM8990_SPKVOL_MASK 0x0003 /* SPKVOL - [1:0] */ | 532 | #define WM8990_SPKATTN_MASK 0x0003 /* SPKATTN - [1:0] */ |
| 532 | #define WM8990_SPKVOL_SHIFT 0 | 533 | #define WM8990_SPKATTN_SHIFT 0 |
| 533 | 534 | ||
| 534 | /* | 535 | /* |
| 535 | * R35 (0x23) - ClassD1 | 536 | * R35 (0x23) - ClassD1 |
| @@ -544,6 +545,15 @@ | |||
| 544 | #define WM8990_DCGAIN_SHIFT 3 | 545 | #define WM8990_DCGAIN_SHIFT 3 |
| 545 | #define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */ | 546 | #define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */ |
| 546 | #define WM8990_ACGAIN_SHIFT 0 | 547 | #define WM8990_ACGAIN_SHIFT 0 |
| 548 | |||
| 549 | /* | ||
| 550 | * R38 (0x26) - ClassD4 | ||
| 551 | */ | ||
| 552 | #define WM8990_SPKZC_MASK 0x0001 /* SPKZC */ | ||
| 553 | #define WM8990_SPKZC_SHIFT 7 /* SPKZC */ | ||
| 554 | #define WM8990_SPKVOL_MASK 0x007F /* SPKVOL - [6:0] */ | ||
| 555 | #define WM8990_SPKVOL_SHIFT 0 /* SPKVOL - [6:0] */ | ||
| 556 | |||
| 547 | /* | 557 | /* |
| 548 | * R39 (0x27) - Input Mixer1 | 558 | * R39 (0x27) - Input Mixer1 |
| 549 | */ | 559 | */ |
