Merge branch 'linus' into x86/urgent

Merge in Linus's tree to avoid a conflict.

Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2012-07-25 21:40:40 +02:00
commit d431adfbc9
567 changed files with 11589 additions and 6284 deletions

View file

@ -142,13 +142,14 @@ KernelVersion: 3.4
Contact: linux-mtd@lists.infradead.org Contact: linux-mtd@lists.infradead.org
Description: Description:
This allows the user to examine and adjust the criteria by which This allows the user to examine and adjust the criteria by which
mtd returns -EUCLEAN from mtd_read(). If the maximum number of mtd returns -EUCLEAN from mtd_read() and mtd_read_oob(). If the
bit errors that were corrected on any single region comprising maximum number of bit errors that were corrected on any single
an ecc step (as reported by the driver) equals or exceeds this region comprising an ecc step (as reported by the driver) equals
value, -EUCLEAN is returned. Otherwise, absent an error, 0 is or exceeds this value, -EUCLEAN is returned. Otherwise, absent
returned. Higher layers (e.g., UBI) use this return code as an an error, 0 is returned. Higher layers (e.g., UBI) use this
indication that an erase block may be degrading and should be return code as an indication that an erase block may be
scrutinized as a candidate for being marked as bad. degrading and should be scrutinized as a candidate for being
marked as bad.
The initial value may be specified by the flash device driver. The initial value may be specified by the flash device driver.
If not, then the default value is ecc_strength. If not, then the default value is ecc_strength.
@ -167,7 +168,7 @@ Description:
block degradation, but high enough to avoid the consequences of block degradation, but high enough to avoid the consequences of
a persistent return value of -EUCLEAN on devices where sticky a persistent return value of -EUCLEAN on devices where sticky
bitflips occur. Note that if bitflip_threshold exceeds bitflips occur. Note that if bitflip_threshold exceeds
ecc_strength, -EUCLEAN is never returned by mtd_read(). ecc_strength, -EUCLEAN is never returned by the read operations.
Conversely, if bitflip_threshold is zero, -EUCLEAN is always Conversely, if bitflip_threshold is zero, -EUCLEAN is always
returned, absent a hard error. returned, absent a hard error.

View file

@ -3988,7 +3988,7 @@ interface and may change in the future.</para>
from RGB to Y'CbCr color space. from RGB to Y'CbCr color space.
</entry> </entry>
</row> </row>
<row id = "v4l2-jpeg-chroma-subsampling"> <row>
<entrytbl spanname="descr" cols="2"> <entrytbl spanname="descr" cols="2">
<tbody valign="top"> <tbody valign="top">
<row> <row>

View file

@ -284,13 +284,6 @@ These controls are described in <xref
processing controls. These controls are described in <xref processing controls. These controls are described in <xref
linkend="image-process-controls" />.</entry> linkend="image-process-controls" />.</entry>
</row> </row>
<row>
<entry><constant>V4L2_CTRL_CLASS_JPEG</constant></entry>
<entry>0x9d0000</entry>
<entry>The class containing JPEG compression controls.
These controls are described in <xref
linkend="jpeg-controls" />.</entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>

View file

@ -162,9 +162,9 @@ over a rather long period of time, but improvements are always welcome!
when publicizing a pointer to a structure that can when publicizing a pointer to a structure that can
be traversed by an RCU read-side critical section. be traversed by an RCU read-side critical section.
5. If call_rcu(), or a related primitive such as call_rcu_bh() or 5. If call_rcu(), or a related primitive such as call_rcu_bh(),
call_rcu_sched(), is used, the callback function must be call_rcu_sched(), or call_srcu() is used, the callback function
written to be called from softirq context. In particular, must be written to be called from softirq context. In particular,
it cannot block. it cannot block.
6. Since synchronize_rcu() can block, it cannot be called from 6. Since synchronize_rcu() can block, it cannot be called from
@ -202,11 +202,12 @@ over a rather long period of time, but improvements are always welcome!
updater uses call_rcu_sched() or synchronize_sched(), then updater uses call_rcu_sched() or synchronize_sched(), then
the corresponding readers must disable preemption, possibly the corresponding readers must disable preemption, possibly
by calling rcu_read_lock_sched() and rcu_read_unlock_sched(). by calling rcu_read_lock_sched() and rcu_read_unlock_sched().
If the updater uses synchronize_srcu(), the the corresponding If the updater uses synchronize_srcu() or call_srcu(),
readers must use srcu_read_lock() and srcu_read_unlock(), the the corresponding readers must use srcu_read_lock() and
and with the same srcu_struct. The rules for the expedited srcu_read_unlock(), and with the same srcu_struct. The rules for
primitives are the same as for their non-expedited counterparts. the expedited primitives are the same as for their non-expedited
Mixing things up will result in confusion and broken kernels. counterparts. Mixing things up will result in confusion and
broken kernels.
One exception to this rule: rcu_read_lock() and rcu_read_unlock() One exception to this rule: rcu_read_lock() and rcu_read_unlock()
may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh() may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh()
@ -333,14 +334,14 @@ over a rather long period of time, but improvements are always welcome!
victim CPU from ever going offline.) victim CPU from ever going offline.)
14. SRCU (srcu_read_lock(), srcu_read_unlock(), srcu_dereference(), 14. SRCU (srcu_read_lock(), srcu_read_unlock(), srcu_dereference(),
synchronize_srcu(), and synchronize_srcu_expedited()) may only synchronize_srcu(), synchronize_srcu_expedited(), and call_srcu())
be invoked from process context. Unlike other forms of RCU, it may only be invoked from process context. Unlike other forms of
-is- permissible to block in an SRCU read-side critical section RCU, it -is- permissible to block in an SRCU read-side critical
(demarked by srcu_read_lock() and srcu_read_unlock()), hence the section (demarked by srcu_read_lock() and srcu_read_unlock()),
"SRCU": "sleepable RCU". Please note that if you don't need hence the "SRCU": "sleepable RCU". Please note that if you
to sleep in read-side critical sections, you should be using don't need to sleep in read-side critical sections, you should be
RCU rather than SRCU, because RCU is almost always faster and using RCU rather than SRCU, because RCU is almost always faster
easier to use than is SRCU. and easier to use than is SRCU.
If you need to enter your read-side critical section in a If you need to enter your read-side critical section in a
hardirq or exception handler, and then exit that same read-side hardirq or exception handler, and then exit that same read-side
@ -353,8 +354,8 @@ over a rather long period of time, but improvements are always welcome!
cleanup_srcu_struct(). These are passed a "struct srcu_struct" cleanup_srcu_struct(). These are passed a "struct srcu_struct"
that defines the scope of a given SRCU domain. Once initialized, that defines the scope of a given SRCU domain. Once initialized,
the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock() the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock()
synchronize_srcu(), and synchronize_srcu_expedited(). A given synchronize_srcu(), synchronize_srcu_expedited(), and call_srcu().
synchronize_srcu() waits only for SRCU read-side critical A given synchronize_srcu() waits only for SRCU read-side critical
sections governed by srcu_read_lock() and srcu_read_unlock() sections governed by srcu_read_lock() and srcu_read_unlock()
calls that have been passed the same srcu_struct. This property calls that have been passed the same srcu_struct. This property
is what makes sleeping read-side critical sections tolerable -- is what makes sleeping read-side critical sections tolerable --
@ -374,7 +375,7 @@ over a rather long period of time, but improvements are always welcome!
requiring SRCU's read-side deadlock immunity or low read-side requiring SRCU's read-side deadlock immunity or low read-side
realtime latency. realtime latency.
Note that, rcu_assign_pointer() relates to SRCU just as they do Note that, rcu_assign_pointer() relates to SRCU just as it does
to other forms of RCU. to other forms of RCU.
15. The whole point of call_rcu(), synchronize_rcu(), and friends 15. The whole point of call_rcu(), synchronize_rcu(), and friends

View file

@ -79,8 +79,6 @@ complete. Pseudo-code using rcu_barrier() is as follows:
2. Execute rcu_barrier(). 2. Execute rcu_barrier().
3. Allow the module to be unloaded. 3. Allow the module to be unloaded.
Quick Quiz #1: Why is there no srcu_barrier()?
The rcutorture module makes use of rcu_barrier in its exit function The rcutorture module makes use of rcu_barrier in its exit function
as follows: as follows:
@ -162,7 +160,7 @@ for any pre-existing callbacks to complete.
Then lines 55-62 print status and do operation-specific cleanup, and Then lines 55-62 print status and do operation-specific cleanup, and
then return, permitting the module-unload operation to be completed. then return, permitting the module-unload operation to be completed.
Quick Quiz #2: Is there any other situation where rcu_barrier() might Quick Quiz #1: Is there any other situation where rcu_barrier() might
be required? be required?
Your module might have additional complications. For example, if your Your module might have additional complications. For example, if your
@ -242,7 +240,7 @@ reaches zero, as follows:
4 complete(&rcu_barrier_completion); 4 complete(&rcu_barrier_completion);
5 } 5 }
Quick Quiz #3: What happens if CPU 0's rcu_barrier_func() executes Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes
immediately (thus incrementing rcu_barrier_cpu_count to the immediately (thus incrementing rcu_barrier_cpu_count to the
value one), but the other CPU's rcu_barrier_func() invocations value one), but the other CPU's rcu_barrier_func() invocations
are delayed for a full grace period? Couldn't this result in are delayed for a full grace period? Couldn't this result in
@ -259,12 +257,7 @@ so that your module may be safely unloaded.
Answers to Quick Quizzes Answers to Quick Quizzes
Quick Quiz #1: Why is there no srcu_barrier()? Quick Quiz #1: Is there any other situation where rcu_barrier() might
Answer: Since there is no call_srcu(), there can be no outstanding SRCU
callbacks. Therefore, there is no need to wait for them.
Quick Quiz #2: Is there any other situation where rcu_barrier() might
be required? be required?
Answer: Interestingly enough, rcu_barrier() was not originally Answer: Interestingly enough, rcu_barrier() was not originally
@ -278,7 +271,7 @@ Answer: Interestingly enough, rcu_barrier() was not originally
implementing rcutorture, and found that rcu_barrier() solves implementing rcutorture, and found that rcu_barrier() solves
this problem as well. this problem as well.
Quick Quiz #3: What happens if CPU 0's rcu_barrier_func() executes Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes
immediately (thus incrementing rcu_barrier_cpu_count to the immediately (thus incrementing rcu_barrier_cpu_count to the
value one), but the other CPU's rcu_barrier_func() invocations value one), but the other CPU's rcu_barrier_func() invocations
are delayed for a full grace period? Couldn't this result in are delayed for a full grace period? Couldn't this result in

View file

@ -174,11 +174,20 @@ torture_type The type of RCU to test, with string values as follows:
and synchronize_rcu_bh_expedited(). and synchronize_rcu_bh_expedited().
"srcu": srcu_read_lock(), srcu_read_unlock() and "srcu": srcu_read_lock(), srcu_read_unlock() and
call_srcu().
"srcu_sync": srcu_read_lock(), srcu_read_unlock() and
synchronize_srcu(). synchronize_srcu().
"srcu_expedited": srcu_read_lock(), srcu_read_unlock() and "srcu_expedited": srcu_read_lock(), srcu_read_unlock() and
synchronize_srcu_expedited(). synchronize_srcu_expedited().
"srcu_raw": srcu_read_lock_raw(), srcu_read_unlock_raw(),
and call_srcu().
"srcu_raw_sync": srcu_read_lock_raw(), srcu_read_unlock_raw(),
and synchronize_srcu().
"sched": preempt_disable(), preempt_enable(), and "sched": preempt_disable(), preempt_enable(), and
call_rcu_sched(). call_rcu_sched().

View file

@ -833,9 +833,9 @@ sched: Critical sections Grace period Barrier
SRCU: Critical sections Grace period Barrier SRCU: Critical sections Grace period Barrier
srcu_read_lock synchronize_srcu N/A srcu_read_lock synchronize_srcu srcu_barrier
srcu_read_unlock synchronize_srcu_expedited srcu_read_unlock call_srcu
srcu_read_lock_raw srcu_read_lock_raw synchronize_srcu_expedited
srcu_read_unlock_raw srcu_read_unlock_raw
srcu_dereference srcu_dereference

View file

@ -1626,3 +1626,5 @@ MX6Q_PAD_SD2_DAT3__PCIE_CTRL_MUX_11 1587
MX6Q_PAD_SD2_DAT3__GPIO_1_12 1588 MX6Q_PAD_SD2_DAT3__GPIO_1_12 1588
MX6Q_PAD_SD2_DAT3__SJC_DONE 1589 MX6Q_PAD_SD2_DAT3__SJC_DONE 1589
MX6Q_PAD_SD2_DAT3__ANATOP_TESTO_3 1590 MX6Q_PAD_SD2_DAT3__ANATOP_TESTO_3 1590
MX6Q_PAD_ENET_RX_ER__ANATOP_USBOTG_ID 1591
MX6Q_PAD_GPIO_1__ANATOP_USBOTG_ID 1592

View file

@ -86,7 +86,7 @@ There is also a gitweb interface available at
http://www.kernel.org/git/?p=utils/kernel/kexec/kexec-tools.git http://www.kernel.org/git/?p=utils/kernel/kexec/kexec-tools.git
More information about kexec-tools can be found at More information about kexec-tools can be found at
http://www.kernel.org/pub/linux/utils/kernel/kexec/README.html http://horms.net/projects/kexec/
3) Unpack the tarball with the tar command, as follows: 3) Unpack the tarball with the tar command, as follows:

View file

@ -2367,6 +2367,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
Set maximum number of finished RCU callbacks to process Set maximum number of finished RCU callbacks to process
in one batch. in one batch.
rcutree.fanout_leaf= [KNL,BOOT]
Increase the number of CPUs assigned to each
leaf rcu_node structure. Useful for very large
systems.
rcutree.qhimark= [KNL,BOOT] rcutree.qhimark= [KNL,BOOT]
Set threshold of queued Set threshold of queued
RCU callbacks over which batch limiting is disabled. RCU callbacks over which batch limiting is disabled.

View file

@ -3433,13 +3433,14 @@ S: Supported
F: drivers/idle/i7300_idle.c F: drivers/idle/i7300_idle.c
IEEE 802.15.4 SUBSYSTEM IEEE 802.15.4 SUBSYSTEM
M: Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
M: Sergey Lapin <slapin@ossfans.org>
L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers) L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
W: http://apps.sourceforge.net/trac/linux-zigbee W: http://apps.sourceforge.net/trac/linux-zigbee
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
S: Maintained S: Maintained
F: net/ieee802154/ F: net/ieee802154/
F: net/mac802154/
F: drivers/ieee802154/ F: drivers/ieee802154/
IIO SUBSYSTEM AND DRIVERS IIO SUBSYSTEM AND DRIVERS
@ -4857,6 +4858,7 @@ M: Kevin Hilman <khilman@ti.com>
L: linux-omap@vger.kernel.org L: linux-omap@vger.kernel.org
S: Maintained S: Maintained
F: arch/arm/*omap*/*pm* F: arch/arm/*omap*/*pm*
F: drivers/cpufreq/omap-cpufreq.c
OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT
M: Rajendra Nayak <rnayak@ti.com> M: Rajendra Nayak <rnayak@ti.com>
@ -5563,7 +5565,7 @@ F: Documentation/networking/LICENSE.qla3xxx
F: drivers/net/ethernet/qlogic/qla3xxx.* F: drivers/net/ethernet/qlogic/qla3xxx.*
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
M: Anirban Chakraborty <anirban.chakraborty@qlogic.com> M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
M: Sony Chacko <sony.chacko@qlogic.com> M: Sony Chacko <sony.chacko@qlogic.com>
M: linux-driver@qlogic.com M: linux-driver@qlogic.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
@ -5571,7 +5573,6 @@ S: Supported
F: drivers/net/ethernet/qlogic/qlcnic/ F: drivers/net/ethernet/qlogic/qlcnic/
QLOGIC QLGE 10Gb ETHERNET DRIVER QLOGIC QLGE 10Gb ETHERNET DRIVER
M: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
M: Ron Mercer <ron.mercer@qlogic.com> M: Ron Mercer <ron.mercer@qlogic.com>
M: linux-driver@qlogic.com M: linux-driver@qlogic.com
@ -5909,7 +5910,7 @@ M: Ingo Molnar <mingo@redhat.com>
M: Peter Zijlstra <peterz@infradead.org> M: Peter Zijlstra <peterz@infradead.org>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
S: Maintained S: Maintained
F: kernel/sched* F: kernel/sched/
F: include/linux/sched.h F: include/linux/sched.h
SCORE ARCHITECTURE SCORE ARCHITECTURE

View file

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 5 PATCHLEVEL = 5
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc6 EXTRAVERSION =
NAME = Saber-toothed Squirrel NAME = Saber-toothed Squirrel
# *DOCUMENTATION* # *DOCUMENTATION*

View file

@ -43,8 +43,8 @@
pmu { pmu {
compatible = "arm,cortex-a9-pmu"; compatible = "arm,cortex-a9-pmu";
interrupts = <0 8 0x04 interrupts = <0 6 0x04
0 9 0x04>; 0 7 0x04>;
}; };
L2: l2-cache { L2: l2-cache {
@ -119,8 +119,8 @@
gmac0: eth@e2000000 { gmac0: eth@e2000000 {
compatible = "st,spear600-gmac"; compatible = "st,spear600-gmac";
reg = <0xe2000000 0x8000>; reg = <0xe2000000 0x8000>;
interrupts = <0 23 0x4 interrupts = <0 33 0x4
0 24 0x4>; 0 34 0x4>;
interrupt-names = "macirq", "eth_wake_irq"; interrupt-names = "macirq", "eth_wake_irq";
status = "disabled"; status = "disabled";
}; };
@ -202,6 +202,7 @@
kbd@e0300000 { kbd@e0300000 {
compatible = "st,spear300-kbd"; compatible = "st,spear300-kbd";
reg = <0xe0300000 0x1000>; reg = <0xe0300000 0x1000>;
interrupts = <0 52 0x4>;
status = "disabled"; status = "disabled";
}; };
@ -224,7 +225,7 @@
serial@e0000000 { serial@e0000000 {
compatible = "arm,pl011", "arm,primecell"; compatible = "arm,pl011", "arm,primecell";
reg = <0xe0000000 0x1000>; reg = <0xe0000000 0x1000>;
interrupts = <0 36 0x4>; interrupts = <0 35 0x4>;
status = "disabled"; status = "disabled";
}; };

View file

@ -15,8 +15,8 @@
/include/ "spear320.dtsi" /include/ "spear320.dtsi"
/ { / {
model = "ST SPEAr300 Evaluation Board"; model = "ST SPEAr320 Evaluation Board";
compatible = "st,spear300-evb", "st,spear300"; compatible = "st,spear320-evb", "st,spear320";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
@ -26,7 +26,7 @@
ahb { ahb {
pinmux@b3000000 { pinmux@b3000000 {
st,pinmux-mode = <3>; st,pinmux-mode = <4>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&state_default>; pinctrl-0 = <&state_default>;

View file

@ -181,6 +181,7 @@
timer@f0000000 { timer@f0000000 {
compatible = "st,spear-timer"; compatible = "st,spear-timer";
reg = <0xf0000000 0x400>; reg = <0xf0000000 0x400>;
interrupt-parent = <&vic0>;
interrupts = <16>; interrupts = <16>;
}; };
}; };

View file

@ -176,7 +176,6 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEVICEFS=y CONFIG_USB_DEVICEFS=y
CONFIG_USB_SUSPEND=y CONFIG_USB_SUSPEND=y
CONFIG_USB_MON=y CONFIG_USB_MON=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_WDM=y CONFIG_USB_WDM=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_USB_LIBUSUAL=y CONFIG_USB_LIBUSUAL=y

View file

@ -119,7 +119,9 @@ static __init void exynos_pm_add_dev_to_genpd(struct platform_device *pdev,
struct exynos_pm_domain *pd) struct exynos_pm_domain *pd)
{ {
if (pdev->dev.bus) { if (pdev->dev.bus) {
if (pm_genpd_add_device(&pd->pd, &pdev->dev)) if (!pm_genpd_add_device(&pd->pd, &pdev->dev))
pm_genpd_dev_need_restore(&pdev->dev, true);
else
pr_info("%s: error in adding %s device to %s power" pr_info("%s: error in adding %s device to %s power"
"domain\n", __func__, dev_name(&pdev->dev), "domain\n", __func__, dev_name(&pdev->dev),
pd->name); pd->name);
@ -151,9 +153,12 @@ static __init int exynos4_pm_init_power_domain(void)
if (of_have_populated_dt()) if (of_have_populated_dt())
return exynos_pm_dt_parse_domains(); return exynos_pm_dt_parse_domains();
for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++) for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++) {
pm_genpd_init(&exynos4_pm_domains[idx]->pd, NULL, struct exynos_pm_domain *pd = exynos4_pm_domains[idx];
exynos4_pm_domains[idx]->is_off); int on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;
pm_genpd_init(&pd->pd, NULL, !on);
}
#ifdef CONFIG_S5P_DEV_FIMD0 #ifdef CONFIG_S5P_DEV_FIMD0
exynos_pm_add_dev_to_genpd(&s5p_device_fimd0, &exynos4_pd_lcd0); exynos_pm_add_dev_to_genpd(&s5p_device_fimd0, &exynos4_pd_lcd0);

View file

@ -31,12 +31,16 @@
* *
* CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this * CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this
* clockdomain. (Currently, this applies to OMAP3 clockdomains only.) * clockdomain. (Currently, this applies to OMAP3 clockdomains only.)
* CLKDM_ACTIVE_WITH_MPU: The PRCM guarantees that this clockdomain is
* active whenever the MPU is active. True for interconnects and
* the WKUP clockdomains.
*/ */
#define CLKDM_CAN_FORCE_SLEEP (1 << 0) #define CLKDM_CAN_FORCE_SLEEP (1 << 0)
#define CLKDM_CAN_FORCE_WAKEUP (1 << 1) #define CLKDM_CAN_FORCE_WAKEUP (1 << 1)
#define CLKDM_CAN_ENABLE_AUTO (1 << 2) #define CLKDM_CAN_ENABLE_AUTO (1 << 2)
#define CLKDM_CAN_DISABLE_AUTO (1 << 3) #define CLKDM_CAN_DISABLE_AUTO (1 << 3)
#define CLKDM_NO_AUTODEPS (1 << 4) #define CLKDM_NO_AUTODEPS (1 << 4)
#define CLKDM_ACTIVE_WITH_MPU (1 << 5)
#define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO)
#define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP)

View file

@ -88,4 +88,5 @@ struct clockdomain wkup_common_clkdm = {
.name = "wkup_clkdm", .name = "wkup_clkdm",
.pwrdm = { .name = "wkup_pwrdm" }, .pwrdm = { .name = "wkup_pwrdm" },
.dep_bit = OMAP_EN_WKUP_SHIFT, .dep_bit = OMAP_EN_WKUP_SHIFT,
.flags = CLKDM_ACTIVE_WITH_MPU,
}; };

View file

@ -381,7 +381,7 @@ static struct clockdomain l4_wkup_44xx_clkdm = {
.cm_inst = OMAP4430_PRM_WKUP_CM_INST, .cm_inst = OMAP4430_PRM_WKUP_CM_INST,
.clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS,
.dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT, .dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT,
.flags = CLKDM_CAN_HWSUP, .flags = CLKDM_CAN_HWSUP | CLKDM_ACTIVE_WITH_MPU,
}; };
static struct clockdomain emu_sys_44xx_clkdm = { static struct clockdomain emu_sys_44xx_clkdm = {

View file

@ -1124,15 +1124,18 @@ static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap
* _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
* *
* If module is marked as SWSUP_SIDLE, force the module out of slave * Ensure that the OCP_SYSCONFIG register for the IP block represented
* idle; otherwise, configure it for smart-idle. If module is marked * by @oh is set to indicate to the PRCM that the IP block is active.
* as SWSUP_MSUSPEND, force the module out of master standby; * Usually this means placing the module into smart-idle mode and
* otherwise, configure it for smart-standby. No return value. * smart-standby, but if there is a bug in the automatic idle handling
* for the IP block, it may need to be placed into the force-idle or
* no-idle variants of these modes. No return value.
*/ */
static void _enable_sysc(struct omap_hwmod *oh) static void _enable_sysc(struct omap_hwmod *oh)
{ {
u8 idlemode, sf; u8 idlemode, sf;
u32 v; u32 v;
bool clkdm_act;
if (!oh->class->sysc) if (!oh->class->sysc)
return; return;
@ -1141,6 +1144,14 @@ static void _enable_sysc(struct omap_hwmod *oh)
sf = oh->class->sysc->sysc_flags; sf = oh->class->sysc->sysc_flags;
if (sf & SYSC_HAS_SIDLEMODE) { if (sf & SYSC_HAS_SIDLEMODE) {
clkdm_act = ((oh->clkdm &&
oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) ||
(oh->_clk && oh->_clk->clkdm &&
oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU));
if (clkdm_act && !(oh->class->sysc->idlemodes &
(SIDLE_SMART | SIDLE_SMART_WKUP)))
idlemode = HWMOD_IDLEMODE_FORCE;
else
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
_set_slave_idlemode(oh, idlemode, &v); _set_slave_idlemode(oh, idlemode, &v);
@ -1208,8 +1219,13 @@ static void _idle_sysc(struct omap_hwmod *oh)
sf = oh->class->sysc->sysc_flags; sf = oh->class->sysc->sysc_flags;
if (sf & SYSC_HAS_SIDLEMODE) { if (sf & SYSC_HAS_SIDLEMODE) {
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */
HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; if (oh->flags & HWMOD_SWSUP_SIDLE ||
!(oh->class->sysc->idlemodes &
(SIDLE_SMART | SIDLE_SMART_WKUP)))
idlemode = HWMOD_IDLEMODE_FORCE;
else
idlemode = HWMOD_IDLEMODE_SMART;
_set_slave_idlemode(oh, idlemode, &v); _set_slave_idlemode(oh, idlemode, &v);
} }

View file

@ -106,7 +106,7 @@ static struct clk s3c2440_clk_cam_upll = {
static struct clk s3c2440_clk_ac97 = { static struct clk s3c2440_clk_ac97 = {
.name = "ac97", .name = "ac97",
.enable = s3c2410_clkcon_enable, .enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2440_CLKCON_CAMERA, .ctrlbit = S3C2440_CLKCON_AC97,
}; };
static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) static unsigned long s3c2440_fclk_n_getrate(struct clk *clk)

View file

@ -22,8 +22,13 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/emev2.h> #include <mach/emev2.h>
#ifdef CONFIG_ARCH_SH73A0
#define is_sh73a0() (machine_is_ag5evm() || machine_is_kota2() || \ #define is_sh73a0() (machine_is_ag5evm() || machine_is_kota2() || \
of_machine_is_compatible("renesas,sh73a0")) of_machine_is_compatible("renesas,sh73a0"))
#else
#define is_sh73a0() (0)
#endif
#define is_r8a7779() machine_is_marzen() #define is_r8a7779() machine_is_marzen()
#ifdef CONFIG_ARCH_EMEV2 #ifdef CONFIG_ARCH_EMEV2

View file

@ -87,7 +87,7 @@ void __init spear3xx_map_io(void)
static void __init spear3xx_timer_init(void) static void __init spear3xx_timer_init(void)
{ {
char pclk_name[] = "pll3_48m_clk"; char pclk_name[] = "pll3_clk";
struct clk *gpt_clk, *pclk; struct clk *gpt_clk, *pclk;
spear3xx_clk_init(); spear3xx_clk_init();

View file

@ -423,7 +423,7 @@ void __init spear6xx_map_io(void)
static void __init spear6xx_timer_init(void) static void __init spear6xx_timer_init(void)
{ {
char pclk_name[] = "pll3_48m_clk"; char pclk_name[] = "pll3_clk";
struct clk *gpt_clk, *pclk; struct clk *gpt_clk, *pclk;
spear6xx_clk_init(); spear6xx_clk_init();

View file

@ -625,11 +625,6 @@ static struct platform_device *snowball_platform_devs[] __initdata = {
&ab8500_device, &ab8500_device,
}; };
static struct platform_device *snowball_of_platform_devs[] __initdata = {
&snowball_led_dev,
&snowball_key_dev,
};
static void __init mop500_init_machine(void) static void __init mop500_init_machine(void)
{ {
struct device *parent = NULL; struct device *parent = NULL;
@ -769,6 +764,11 @@ MACHINE_END
#ifdef CONFIG_MACH_UX500_DT #ifdef CONFIG_MACH_UX500_DT
static struct platform_device *snowball_of_platform_devs[] __initdata = {
&snowball_led_dev,
&snowball_key_dev,
};
struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
/* Requires DMA and call-back bindings. */ /* Requires DMA and call-back bindings. */
OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
@ -786,6 +786,8 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL), OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),
OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL), OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),
OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL),
/* Requires device name bindings. */
OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
{}, {},
}; };

View file

@ -63,8 +63,10 @@ static void __init ux500_timer_init(void)
/* TODO: Once MTU has been DT:ed place code above into else. */ /* TODO: Once MTU has been DT:ed place code above into else. */
if (of_have_populated_dt()) { if (of_have_populated_dt()) {
#ifdef CONFIG_OF
np = of_find_matching_node(NULL, prcmu_timer_of_match); np = of_find_matching_node(NULL, prcmu_timer_of_match);
if (!np) if (!np)
#endif
goto dt_fail; goto dt_fail;
tmp_base = of_iomap(np, 0); tmp_base = of_iomap(np, 0);

View file

@ -1091,7 +1091,7 @@ error:
while (--i) while (--i)
if (pages[i]) if (pages[i])
__free_pages(pages[i], 0); __free_pages(pages[i], 0);
if (array_size < PAGE_SIZE) if (array_size <= PAGE_SIZE)
kfree(pages); kfree(pages);
else else
vfree(pages); vfree(pages);
@ -1106,7 +1106,7 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t s
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
if (pages[i]) if (pages[i])
__free_pages(pages[i], 0); __free_pages(pages[i], 0);
if (array_size < PAGE_SIZE) if (array_size <= PAGE_SIZE)
kfree(pages); kfree(pages);
else else
vfree(pages); vfree(pages);

View file

@ -157,11 +157,13 @@ int s3c_adc_start(struct s3c_adc_client *client,
return -EINVAL; return -EINVAL;
} }
if (client->is_ts && adc->ts_pend)
return -EAGAIN;
spin_lock_irqsave(&adc->lock, flags); spin_lock_irqsave(&adc->lock, flags);
if (client->is_ts && adc->ts_pend) {
spin_unlock_irqrestore(&adc->lock, flags);
return -EAGAIN;
}
client->channel = channel; client->channel = channel;
client->nr_samples = nr_samples; client->nr_samples = nr_samples;

View file

@ -126,7 +126,8 @@ struct platform_device s3c_device_adc = {
#ifdef CONFIG_CPU_S3C2440 #ifdef CONFIG_CPU_S3C2440
static struct resource s3c_camif_resource[] = { static struct resource s3c_camif_resource[] = {
[0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF), [0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF),
[1] = DEFINE_RES_IRQ(IRQ_CAM), [1] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_C),
[2] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_P),
}; };
struct platform_device s3c_device_camif = { struct platform_device s3c_device_camif = {

View file

@ -37,6 +37,7 @@ struct clk clk_ext_xtal_mux = {
struct clk clk_xusbxti = { struct clk clk_xusbxti = {
.name = "xusbxti", .name = "xusbxti",
.id = -1, .id = -1,
.rate = 24000000,
}; };
struct clk s5p_clk_27m = { struct clk s5p_clk_27m = {

View file

@ -70,4 +70,7 @@ extern int is_in_rom(unsigned long);
#define VMALLOC_END 0xffffffff #define VMALLOC_END 0xffffffff
#define arch_enter_lazy_cpu_mode() do {} while (0) #define arch_enter_lazy_cpu_mode() do {} while (0)
#include <asm-generic/pgtable.h>
#endif /* _H8300_PGTABLE_H */ #endif /* _H8300_PGTABLE_H */

View file

@ -100,7 +100,6 @@ extern int __put_user_bad(void);
break; \ break; \
default: \ default: \
__gu_err = __get_user_bad(); \ __gu_err = __get_user_bad(); \
__gu_val = 0; \
break; \ break; \
} \ } \
(x) = __gu_val; \ (x) = __gu_val; \
@ -159,4 +158,6 @@ clear_user(void *to, unsigned long n)
return 0; return 0;
} }
#define __clear_user clear_user
#endif /* _H8300_UACCESS_H */ #endif /* _H8300_UACCESS_H */

View file

@ -447,7 +447,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
* want to handle. Thus you cannot kill init even with a SIGKILL even by * want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake. * mistake.
*/ */
statis void do_signal(struct pt_regs *regs) static void do_signal(struct pt_regs *regs)
{ {
siginfo_t info; siginfo_t info;
int signr; int signr;

View file

@ -27,6 +27,7 @@
#include <linux/profile.h> #include <linux/profile.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq_regs.h>
#include <asm/timer.h> #include <asm/timer.h>
#define TICK_SIZE (tick_nsec / 1000) #define TICK_SIZE (tick_nsec / 1000)

View file

@ -180,9 +180,7 @@ void __cpuinit start_secondary(void)
notify_cpu_starting(cpu); notify_cpu_starting(cpu);
ipi_call_lock();
set_cpu_online(cpu, true); set_cpu_online(cpu, true);
ipi_call_unlock();
local_irq_enable(); local_irq_enable();

View file

@ -382,7 +382,6 @@ smp_callin (void)
set_numa_node(cpu_to_node_map[cpuid]); set_numa_node(cpu_to_node_map[cpuid]);
set_numa_mem(local_memory_node(cpu_to_node_map[cpuid])); set_numa_mem(local_memory_node(cpu_to_node_map[cpuid]));
ipi_call_lock_irq();
spin_lock(&vector_lock); spin_lock(&vector_lock);
/* Setup the per cpu irq handling data structures */ /* Setup the per cpu irq handling data structures */
__setup_vector_irq(cpuid); __setup_vector_irq(cpuid);
@ -390,7 +389,6 @@ smp_callin (void)
set_cpu_online(cpuid, true); set_cpu_online(cpuid, true);
per_cpu(cpu_state, cpuid) = CPU_ONLINE; per_cpu(cpu_state, cpuid) = CPU_ONLINE;
spin_unlock(&vector_lock); spin_unlock(&vector_lock);
ipi_call_unlock_irq();
smp_setup_percpu_timer(); smp_setup_percpu_timer();

View file

@ -43,9 +43,9 @@ endif
OBJCOPYFLAGS += -R .empty_zero_page OBJCOPYFLAGS += -R .empty_zero_page
suffix_$(CONFIG_KERNEL_GZIP) = gz suffix-$(CONFIG_KERNEL_GZIP) = gz
suffix_$(CONFIG_KERNEL_BZIP2) = bz2 suffix-$(CONFIG_KERNEL_BZIP2) = bz2
suffix_$(CONFIG_KERNEL_LZMA) = lzma suffix-$(CONFIG_KERNEL_LZMA) = lzma
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE
$(call if_changed,ld) $(call if_changed,ld)

View file

@ -28,7 +28,7 @@ static unsigned long free_mem_ptr;
static unsigned long free_mem_end_ptr; static unsigned long free_mem_end_ptr;
#ifdef CONFIG_KERNEL_BZIP2 #ifdef CONFIG_KERNEL_BZIP2
static void *memset(void *s, int c, size_t n) void *memset(void *s, int c, size_t n)
{ {
char *ss = s; char *ss = s;
@ -39,6 +39,16 @@ static void *memset(void *s, int c, size_t n)
#endif #endif
#ifdef CONFIG_KERNEL_GZIP #ifdef CONFIG_KERNEL_GZIP
void *memcpy(void *dest, const void *src, size_t n)
{
char *d = dest;
const char *s = src;
while (n--)
*d++ = *s++;
return dest;
}
#define BOOT_HEAP_SIZE 0x10000 #define BOOT_HEAP_SIZE 0x10000
#include "../../../../lib/decompress_inflate.c" #include "../../../../lib/decompress_inflate.c"
#endif #endif

View file

@ -113,9 +113,6 @@ struct pt_regs {
#define PTRACE_OLDSETOPTIONS 21 #define PTRACE_OLDSETOPTIONS 21
/* options set using PTRACE_SETOPTIONS */
#define PTRACE_O_TRACESYSGOOD 0x00000001
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */ #include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */

View file

@ -79,11 +79,6 @@ static __inline__ int cpu_number_map(int cpu)
return cpu; return cpu;
} }
static __inline__ unsigned int num_booting_cpus(void)
{
return cpumask_weight(&cpu_callout_map);
}
extern void smp_send_timer(void); extern void smp_send_timer(void);
extern unsigned long send_IPI_mask_phys(const cpumask_t*, int, int); extern unsigned long send_IPI_mask_phys(const cpumask_t*, int, int);

View file

@ -591,17 +591,16 @@ void user_enable_single_step(struct task_struct *child)
if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0)
!= sizeof(insn)) != sizeof(insn))
return -EIO; return;
compute_next_pc(insn, pc, &next_pc, child); compute_next_pc(insn, pc, &next_pc, child);
if (next_pc & 0x80000000) if (next_pc & 0x80000000)
return -EIO; return;
if (embed_debug_trap(child, next_pc)) if (embed_debug_trap(child, next_pc))
return -EIO; return;
invalidate_cache(); invalidate_cache();
return 0;
} }
void user_disable_single_step(struct task_struct *child) void user_disable_single_step(struct task_struct *child)

View file

@ -286,7 +286,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
case -ERESTARTNOINTR: case -ERESTARTNOINTR:
regs->r0 = regs->orig_r0; regs->r0 = regs->orig_r0;
if (prev_insn(regs) < 0) if (prev_insn(regs) < 0)
return -EFAULT; return;
} }
} }

View file

@ -288,6 +288,7 @@ config MIPS_MALTA
select SYS_HAS_CPU_MIPS32_R1 select SYS_HAS_CPU_MIPS32_R1
select SYS_HAS_CPU_MIPS32_R2 select SYS_HAS_CPU_MIPS32_R2
select SYS_HAS_CPU_MIPS64_R1 select SYS_HAS_CPU_MIPS64_R1
select SYS_HAS_CPU_MIPS64_R2
select SYS_HAS_CPU_NEVADA select SYS_HAS_CPU_NEVADA
select SYS_HAS_CPU_RM7000 select SYS_HAS_CPU_RM7000
select SYS_HAS_EARLY_PRINTK select SYS_HAS_EARLY_PRINTK
@ -1423,6 +1424,7 @@ config CPU_SB1
config CPU_CAVIUM_OCTEON config CPU_CAVIUM_OCTEON
bool "Cavium Octeon processor" bool "Cavium Octeon processor"
depends on SYS_HAS_CPU_CAVIUM_OCTEON depends on SYS_HAS_CPU_CAVIUM_OCTEON
select ARCH_SPARSEMEM_ENABLE
select CPU_HAS_PREFETCH select CPU_HAS_PREFETCH
select CPU_SUPPORTS_64BIT_KERNEL select CPU_SUPPORTS_64BIT_KERNEL
select SYS_SUPPORTS_SMP select SYS_SUPPORTS_SMP

View file

@ -21,6 +21,7 @@ config BCM47XX_BCMA
select BCMA select BCMA
select BCMA_HOST_SOC select BCMA_HOST_SOC
select BCMA_DRIVER_MIPS select BCMA_DRIVER_MIPS
select BCMA_HOST_PCI if PCI
select BCMA_DRIVER_PCI_HOSTMODE if PCI select BCMA_DRIVER_PCI_HOSTMODE if PCI
default y default y
help help

View file

@ -79,11 +79,11 @@ static int __init config_pcmcia_cs(unsigned int cs,
return ret; return ret;
} }
static const __initdata struct { static const struct {
unsigned int cs; unsigned int cs;
unsigned int base; unsigned int base;
unsigned int size; unsigned int size;
} pcmcia_cs[3] = { } pcmcia_cs[3] __initconst = {
{ {
.cs = MPI_CS_PCMCIA_COMMON, .cs = MPI_CS_PCMCIA_COMMON,
.base = BCM_PCMCIA_COMMON_BASE_PA, .base = BCM_PCMCIA_COMMON_BASE_PA,

View file

@ -82,10 +82,6 @@ config CAVIUM_OCTEON_LOCK_L2_MEMCPY
help help
Lock the kernel's implementation of memcpy() into L2. Lock the kernel's implementation of memcpy() into L2.
config ARCH_SPARSEMEM_ENABLE
def_bool y
select SPARSEMEM_STATIC
config IOMMU_HELPER config IOMMU_HELPER
bool bool

View file

@ -185,7 +185,6 @@ static void __cpuinit octeon_init_secondary(void)
octeon_init_cvmcount(); octeon_init_cvmcount();
octeon_irq_setup_secondary(); octeon_irq_setup_secondary();
raw_local_irq_enable();
} }
/** /**
@ -233,6 +232,7 @@ static void octeon_smp_finish(void)
/* to generate the first CPU timer interrupt */ /* to generate the first CPU timer interrupt */
write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ); write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ);
local_irq_enable();
} }
/** /**

View file

@ -17,7 +17,6 @@
#include <linux/irqflags.h> #include <linux/irqflags.h>
#include <linux/types.h> #include <linux/types.h>
#include <asm/barrier.h> #include <asm/barrier.h>
#include <asm/bug.h>
#include <asm/byteorder.h> /* sigh ... */ #include <asm/byteorder.h> /* sigh ... */
#include <asm/cpu-features.h> #include <asm/cpu-features.h>
#include <asm/sgidefs.h> #include <asm/sgidefs.h>

View file

@ -8,6 +8,7 @@
#ifndef __ASM_CMPXCHG_H #ifndef __ASM_CMPXCHG_H
#define __ASM_CMPXCHG_H #define __ASM_CMPXCHG_H
#include <linux/bug.h>
#include <linux/irqflags.h> #include <linux/irqflags.h>
#include <asm/war.h> #include <asm/war.h>

View file

@ -94,6 +94,7 @@
#define PRID_IMP_24KE 0x9600 #define PRID_IMP_24KE 0x9600
#define PRID_IMP_74K 0x9700 #define PRID_IMP_74K 0x9700
#define PRID_IMP_1004K 0x9900 #define PRID_IMP_1004K 0x9900
#define PRID_IMP_M14KC 0x9c00
/* /*
* These are the PRID's for when 23:16 == PRID_COMP_SIBYTE * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE
@ -260,12 +261,12 @@ enum cpu_type_enum {
*/ */
CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K,
CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350,
CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_M14KC,
/* /*
* MIPS64 class processors * MIPS64 class processors
*/ */
CPU_5KC, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2, CPU_5KC, CPU_5KE, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2,
CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2, CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2,
CPU_XLR, CPU_XLP, CPU_XLR, CPU_XLP,

View file

@ -206,7 +206,7 @@
#define GIC_VPE_EIC_SHADOW_SET_BASE 0x0100 #define GIC_VPE_EIC_SHADOW_SET_BASE 0x0100
#define GIC_VPE_EIC_SS(intr) \ #define GIC_VPE_EIC_SS(intr) \
(GIC_EIC_SHADOW_SET_BASE + (4 * intr)) (GIC_VPE_EIC_SHADOW_SET_BASE + (4 * intr))
#define GIC_VPE_EIC_VEC_BASE 0x0800 #define GIC_VPE_EIC_VEC_BASE 0x0800
#define GIC_VPE_EIC_VEC(intr) \ #define GIC_VPE_EIC_VEC(intr) \
@ -330,6 +330,17 @@ struct gic_intr_map {
#define GIC_FLAG_TRANSPARENT 0x02 #define GIC_FLAG_TRANSPARENT 0x02
}; };
/*
* This is only used in EIC mode. This helps to figure out which
* shared interrupts we need to process when we get a vector interrupt.
*/
#define GIC_MAX_SHARED_INTR 0x5
struct gic_shared_intr_map {
unsigned int num_shared_intr;
unsigned int intr_list[GIC_MAX_SHARED_INTR];
unsigned int local_intr_mask;
};
extern void gic_init(unsigned long gic_base_addr, extern void gic_init(unsigned long gic_base_addr,
unsigned long gic_addrspace_size, struct gic_intr_map *intrmap, unsigned long gic_addrspace_size, struct gic_intr_map *intrmap,
unsigned int intrmap_size, unsigned int irqbase); unsigned int intrmap_size, unsigned int irqbase);
@ -338,5 +349,7 @@ extern unsigned int gic_get_int(void);
extern void gic_send_ipi(unsigned int intr); extern void gic_send_ipi(unsigned int intr);
extern unsigned int plat_ipi_call_int_xlate(unsigned int); extern unsigned int plat_ipi_call_int_xlate(unsigned int);
extern unsigned int plat_ipi_resched_int_xlate(unsigned int); extern unsigned int plat_ipi_resched_int_xlate(unsigned int);
extern void gic_bind_eic_interrupt(int irq, int set);
extern unsigned int gic_get_timer_pending(void);
#endif /* _ASM_GICREGS_H */ #endif /* _ASM_GICREGS_H */

View file

@ -251,7 +251,7 @@ struct f_format { /* FPU register format */
unsigned int func : 6; unsigned int func : 6;
}; };
struct ma_format { /* FPU multipy and add format (MIPS IV) */ struct ma_format { /* FPU multiply and add format (MIPS IV) */
unsigned int opcode : 6; unsigned int opcode : 6;
unsigned int fr : 5; unsigned int fr : 5;
unsigned int ft : 5; unsigned int ft : 5;
@ -324,7 +324,7 @@ struct f_format { /* FPU register format */
unsigned int opcode : 6; unsigned int opcode : 6;
}; };
struct ma_format { /* FPU multipy and add format (MIPS IV) */ struct ma_format { /* FPU multiply and add format (MIPS IV) */
unsigned int fmt : 2; unsigned int fmt : 2;
unsigned int func : 4; unsigned int func : 4;
unsigned int fd : 5; unsigned int fd : 5;

View file

@ -17,6 +17,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/bug.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/cpu-features.h> #include <asm/cpu-features.h>

View file

@ -136,6 +136,7 @@ extern void free_irqno(unsigned int irq);
* IE7. Since R2 their number has to be read from the c0_intctl register. * IE7. Since R2 their number has to be read from the c0_intctl register.
*/ */
#define CP0_LEGACY_COMPARE_IRQ 7 #define CP0_LEGACY_COMPARE_IRQ 7
#define CP0_LEGACY_PERFCNT_IRQ 7
extern int cp0_compare_irq; extern int cp0_compare_irq;
extern int cp0_compare_irq_shift; extern int cp0_compare_irq_shift;

View file

@ -99,7 +99,7 @@
#define CKCTL_6368_USBH_CLK_EN (1 << 15) #define CKCTL_6368_USBH_CLK_EN (1 << 15)
#define CKCTL_6368_DISABLE_GLESS_EN (1 << 16) #define CKCTL_6368_DISABLE_GLESS_EN (1 << 16)
#define CKCTL_6368_NAND_CLK_EN (1 << 17) #define CKCTL_6368_NAND_CLK_EN (1 << 17)
#define CKCTL_6368_IPSEC_CLK_EN (1 << 17) #define CKCTL_6368_IPSEC_CLK_EN (1 << 18)
#define CKCTL_6368_ALL_SAFE_EN (CKCTL_6368_SWPKT_USB_EN | \ #define CKCTL_6368_ALL_SAFE_EN (CKCTL_6368_SWPKT_USB_EN | \
CKCTL_6368_SWPKT_SAR_EN | \ CKCTL_6368_SWPKT_SAR_EN | \

View file

@ -86,6 +86,16 @@
#define GIC_CPU_INT4 4 /* . */ #define GIC_CPU_INT4 4 /* . */
#define GIC_CPU_INT5 5 /* Core Interrupt 5 */ #define GIC_CPU_INT5 5 /* Core Interrupt 5 */
/* MALTA GIC local interrupts */
#define GIC_INT_TMR (GIC_CPU_INT5)
#define GIC_INT_PERFCTR (GIC_CPU_INT5)
/* GIC constants */
/* Add 2 to convert non-eic hw int # to eic vector # */
#define GIC_CPU_TO_VEC_OFFSET (2)
/* If we map an intr to pin X, GIC will actually generate vector X+1 */
#define GIC_PIN_TO_VEC_OFFSET (1)
#define GIC_EXT_INTR(x) x #define GIC_EXT_INTR(x) x
/* External Interrupts used for IPI */ /* External Interrupts used for IPI */

View file

@ -22,7 +22,7 @@ struct task_struct;
* switch_to(n) should switch tasks to task nr n, first * switch_to(n) should switch tasks to task nr n, first
* checking that n isn't the current task, in which case it does nothing. * checking that n isn't the current task, in which case it does nothing.
*/ */
extern asmlinkage void *resume(void *last, void *next, void *next_ti); extern asmlinkage void *resume(void *last, void *next, void *next_ti, u32 __usedfpu);
extern unsigned int ll_bit; extern unsigned int ll_bit;
extern struct task_struct *ll_task; extern struct task_struct *ll_task;
@ -66,11 +66,13 @@ do { \
#define switch_to(prev, next, last) \ #define switch_to(prev, next, last) \
do { \ do { \
u32 __usedfpu; \
__mips_mt_fpaff_switch_to(prev); \ __mips_mt_fpaff_switch_to(prev); \
if (cpu_has_dsp) \ if (cpu_has_dsp) \
__save_dsp(prev); \ __save_dsp(prev); \
__clear_software_ll_bit(); \ __clear_software_ll_bit(); \
(last) = resume(prev, next, task_thread_info(next)); \ __usedfpu = test_and_clear_tsk_thread_flag(prev, TIF_USEDFPU); \
(last) = resume(prev, next, task_thread_info(next), __usedfpu); \
} while (0) } while (0)
#define finish_arch_switch(prev) \ #define finish_arch_switch(prev) \

View file

@ -60,6 +60,8 @@ struct thread_info {
register struct thread_info *__current_thread_info __asm__("$28"); register struct thread_info *__current_thread_info __asm__("$28");
#define current_thread_info() __current_thread_info #define current_thread_info() __current_thread_info
#endif /* !__ASSEMBLY__ */
/* thread information allocation */ /* thread information allocation */
#if defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_32BIT) #if defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_32BIT)
#define THREAD_SIZE_ORDER (1) #define THREAD_SIZE_ORDER (1)
@ -85,8 +87,6 @@ register struct thread_info *__current_thread_info __asm__("$28");
#define STACK_WARN (THREAD_SIZE / 8) #define STACK_WARN (THREAD_SIZE / 8)
#endif /* !__ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x10000000 #define PREEMPT_ACTIVE 0x10000000
/* /*

View file

@ -4,7 +4,7 @@
* Copyright (C) xxxx the Anonymous * Copyright (C) xxxx the Anonymous
* Copyright (C) 1994 - 2006 Ralf Baechle * Copyright (C) 1994 - 2006 Ralf Baechle
* Copyright (C) 2003, 2004 Maciej W. Rozycki * Copyright (C) 2003, 2004 Maciej W. Rozycki
* Copyright (C) 2001, 2004 MIPS Inc. * Copyright (C) 2001, 2004, 2011, 2012 MIPS Technologies, Inc.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -199,6 +199,7 @@ void __init check_wait(void)
cpu_wait = rm7k_wait_irqoff; cpu_wait = rm7k_wait_irqoff;
break; break;
case CPU_M14KC:
case CPU_24K: case CPU_24K:
case CPU_34K: case CPU_34K:
case CPU_1004K: case CPU_1004K:
@ -810,6 +811,10 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
c->cputype = CPU_5KC; c->cputype = CPU_5KC;
__cpu_name[cpu] = "MIPS 5Kc"; __cpu_name[cpu] = "MIPS 5Kc";
break; break;
case PRID_IMP_5KE:
c->cputype = CPU_5KE;
__cpu_name[cpu] = "MIPS 5KE";
break;
case PRID_IMP_20KC: case PRID_IMP_20KC:
c->cputype = CPU_20KC; c->cputype = CPU_20KC;
__cpu_name[cpu] = "MIPS 20Kc"; __cpu_name[cpu] = "MIPS 20Kc";
@ -831,6 +836,10 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
c->cputype = CPU_74K; c->cputype = CPU_74K;
__cpu_name[cpu] = "MIPS 74Kc"; __cpu_name[cpu] = "MIPS 74Kc";
break; break;
case PRID_IMP_M14KC:
c->cputype = CPU_M14KC;
__cpu_name[cpu] = "MIPS M14Kc";
break;
case PRID_IMP_1004K: case PRID_IMP_1004K:
c->cputype = CPU_1004K; c->cputype = CPU_1004K;
__cpu_name[cpu] = "MIPS 1004Kc"; __cpu_name[cpu] = "MIPS 1004Kc";

View file

@ -5,7 +5,7 @@
* License. See the file "COPYING" in the main directory of this archive * License. See the file "COPYING" in the main directory of this archive
* for more details. * for more details.
* *
* Copyright (C) 1996, 97, 98, 99, 2000, 01, 03, 04, 05 by Ralf Baechle * Copyright (C) 1996, 97, 98, 99, 2000, 01, 03, 04, 05, 12 by Ralf Baechle
* Copyright (C) 1999, 2000, 01 Silicon Graphics, Inc. * Copyright (C) 1999, 2000, 01 Silicon Graphics, Inc.
*/ */
#include <linux/interrupt.h> #include <linux/interrupt.h>
@ -34,6 +34,12 @@ EXPORT_SYMBOL(memmove);
EXPORT_SYMBOL(kernel_thread); EXPORT_SYMBOL(kernel_thread);
/*
* Functions that operate on entire pages. Mostly used by memory management.
*/
EXPORT_SYMBOL(clear_page);
EXPORT_SYMBOL(copy_page);
/* /*
* Userspace access stuff. * Userspace access stuff.
*/ */

View file

@ -31,7 +31,7 @@
/* /*
* task_struct *resume(task_struct *prev, task_struct *next, * task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti) * struct thread_info *next_ti, int usedfpu)
*/ */
.align 7 .align 7
LEAF(resume) LEAF(resume)

View file

@ -162,11 +162,6 @@ static unsigned int counters_total_to_per_cpu(unsigned int counters)
return counters >> vpe_shift(); return counters >> vpe_shift();
} }
static unsigned int counters_per_cpu_to_total(unsigned int counters)
{
return counters << vpe_shift();
}
#else /* !CONFIG_MIPS_MT_SMP */ #else /* !CONFIG_MIPS_MT_SMP */
#define vpe_id() 0 #define vpe_id() 0

View file

@ -43,7 +43,7 @@
/* /*
* task_struct *resume(task_struct *prev, task_struct *next, * task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti) ) * struct thread_info *next_ti, int usedfpu)
*/ */
LEAF(resume) LEAF(resume)
mfc0 t1, CP0_STATUS mfc0 t1, CP0_STATUS
@ -51,18 +51,9 @@ LEAF(resume)
cpu_save_nonscratch a0 cpu_save_nonscratch a0
sw ra, THREAD_REG31(a0) sw ra, THREAD_REG31(a0)
/* beqz a3, 1f
* check if we need to save FPU registers
*/
lw t3, TASK_THREAD_INFO(a0)
lw t0, TI_FLAGS(t3)
li t1, _TIF_USEDFPU
and t2, t0, t1
beqz t2, 1f
nor t1, zero, t1
and t0, t0, t1 PTR_L t3, TASK_THREAD_INFO(a0)
sw t0, TI_FLAGS(t3)
/* /*
* clear saved user stack CU1 bit * clear saved user stack CU1 bit

View file

@ -41,7 +41,7 @@
/* /*
* task_struct *resume(task_struct *prev, task_struct *next, * task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti) * struct thread_info *next_ti, int usedfpu)
*/ */
.align 5 .align 5
LEAF(resume) LEAF(resume)
@ -53,16 +53,10 @@
/* /*
* check if we need to save FPU registers * check if we need to save FPU registers
*/ */
beqz a3, 1f
PTR_L t3, TASK_THREAD_INFO(a0) PTR_L t3, TASK_THREAD_INFO(a0)
LONG_L t0, TI_FLAGS(t3)
li t1, _TIF_USEDFPU
and t2, t0, t1
beqz t2, 1f
nor t1, zero, t1
and t0, t0, t1
LONG_S t0, TI_FLAGS(t3)
/* /*
* clear saved user stack CU1 bit * clear saved user stack CU1 bit
*/ */

View file

@ -15,7 +15,6 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/init.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/reboot.h> #include <linux/reboot.h>
@ -197,13 +196,6 @@ static void bmips_init_secondary(void)
write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0)); write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0));
#endif #endif
/* make sure there won't be a timer interrupt for a little while */
write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ);
irq_enable_hazard();
set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ1 | IE_IRQ5 | ST0_IE);
irq_enable_hazard();
} }
/* /*
@ -212,6 +204,13 @@ static void bmips_init_secondary(void)
static void bmips_smp_finish(void) static void bmips_smp_finish(void)
{ {
pr_info("SMP: CPU%d is running\n", smp_processor_id()); pr_info("SMP: CPU%d is running\n", smp_processor_id());
/* make sure there won't be a timer interrupt for a little while */
write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ);
irq_enable_hazard();
set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ1 | IE_IRQ5 | ST0_IE);
irq_enable_hazard();
} }
/* /*

View file

@ -122,13 +122,21 @@ asmlinkage __cpuinit void start_secondary(void)
notify_cpu_starting(cpu); notify_cpu_starting(cpu);
mp_ops->smp_finish(); set_cpu_online(cpu, true);
set_cpu_sibling_map(cpu); set_cpu_sibling_map(cpu);
cpu_set(cpu, cpu_callin_map); cpu_set(cpu, cpu_callin_map);
synchronise_count_slave(); synchronise_count_slave();
/*
* irq will be enabled in ->smp_finish(), enabling it too early
* is dangerous.
*/
WARN_ON_ONCE(!irqs_disabled());
mp_ops->smp_finish();
cpu_idle(); cpu_idle();
} }
@ -196,8 +204,6 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)
while (!cpu_isset(cpu, cpu_callin_map)) while (!cpu_isset(cpu, cpu_callin_map))
udelay(100); udelay(100);
set_cpu_online(cpu, true);
return 0; return 0;
} }

View file

@ -322,7 +322,7 @@ int __init smtc_build_cpu_map(int start_cpu_slot)
/* /*
* Common setup before any secondaries are started * Common setup before any secondaries are started
* Make sure all CPU's are in a sensible state before we boot any of the * Make sure all CPUs are in a sensible state before we boot any of the
* secondaries. * secondaries.
* *
* For MIPS MT "SMTC" operation, we set up all TCs, spread as evenly * For MIPS MT "SMTC" operation, we set up all TCs, spread as evenly
@ -340,12 +340,12 @@ static void smtc_tc_setup(int vpe, int tc, int cpu)
/* /*
* TCContext gets an offset from the base of the IPIQ array * TCContext gets an offset from the base of the IPIQ array
* to be used in low-level code to detect the presence of * to be used in low-level code to detect the presence of
* an active IPI queue * an active IPI queue.
*/ */
write_tc_c0_tccontext((sizeof(struct smtc_ipi_q) * cpu) << 16); write_tc_c0_tccontext((sizeof(struct smtc_ipi_q) * cpu) << 16);
/* Bind tc to vpe */ /* Bind tc to vpe */
write_tc_c0_tcbind(vpe); write_tc_c0_tcbind(vpe);
/* In general, all TCs should have the same cpu_data indications */ /* In general, all TCs should have the same cpu_data indications. */
memcpy(&cpu_data[cpu], &cpu_data[0], sizeof(struct cpuinfo_mips)); memcpy(&cpu_data[cpu], &cpu_data[0], sizeof(struct cpuinfo_mips));
/* For 34Kf, start with TC/CPU 0 as sole owner of single FPU context */ /* For 34Kf, start with TC/CPU 0 as sole owner of single FPU context */
if (cpu_data[0].cputype == CPU_34K || if (cpu_data[0].cputype == CPU_34K ||
@ -358,8 +358,8 @@ static void smtc_tc_setup(int vpe, int tc, int cpu)
} }
/* /*
* Tweak to get Count registes in as close a sync as possible. * Tweak to get Count registes in as close a sync as possible. The
* Value seems good for 34K-class cores. * value seems good for 34K-class cores.
*/ */
#define CP0_SKEW 8 #define CP0_SKEW 8
@ -615,7 +615,6 @@ void __cpuinit smtc_boot_secondary(int cpu, struct task_struct *idle)
void smtc_init_secondary(void) void smtc_init_secondary(void)
{ {
local_irq_enable();
} }
void smtc_smp_finish(void) void smtc_smp_finish(void)
@ -631,6 +630,8 @@ void smtc_smp_finish(void)
if (cpu > 0 && (cpu_data[cpu].vpe_id != cpu_data[cpu - 1].vpe_id)) if (cpu > 0 && (cpu_data[cpu].vpe_id != cpu_data[cpu - 1].vpe_id))
write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ); write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ);
local_irq_enable();
printk("TC %d going on-line as CPU %d\n", printk("TC %d going on-line as CPU %d\n",
cpu_data[smp_processor_id()].tc_id, smp_processor_id()); cpu_data[smp_processor_id()].tc_id, smp_processor_id());
} }

View file

@ -111,7 +111,6 @@ void __cpuinit synchronise_count_master(void)
void __cpuinit synchronise_count_slave(void) void __cpuinit synchronise_count_slave(void)
{ {
int i; int i;
unsigned long flags;
unsigned int initcount; unsigned int initcount;
int ncpus; int ncpus;
@ -123,8 +122,6 @@ void __cpuinit synchronise_count_slave(void)
return; return;
#endif #endif
local_irq_save(flags);
/* /*
* Not every cpu is online at the time this gets called, * Not every cpu is online at the time this gets called,
* so we first wait for the master to say everyone is ready * so we first wait for the master to say everyone is ready
@ -154,7 +151,5 @@ void __cpuinit synchronise_count_slave(void)
} }
/* Arrange for an interrupt in a short while */ /* Arrange for an interrupt in a short while */
write_c0_compare(read_c0_count() + COUNTON); write_c0_compare(read_c0_count() + COUNTON);
local_irq_restore(flags);
} }
#undef NR_LOOPS #undef NR_LOOPS

View file

@ -132,6 +132,9 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs)
unsigned long ra = regs->regs[31]; unsigned long ra = regs->regs[31];
unsigned long pc = regs->cp0_epc; unsigned long pc = regs->cp0_epc;
if (!task)
task = current;
if (raw_show_trace || !__kernel_text_address(pc)) { if (raw_show_trace || !__kernel_text_address(pc)) {
show_raw_backtrace(sp); show_raw_backtrace(sp);
return; return;
@ -1249,6 +1252,7 @@ static inline void parity_protection_init(void)
break; break;
case CPU_5KC: case CPU_5KC:
case CPU_5KE:
write_c0_ecc(0x80000000); write_c0_ecc(0x80000000);
back_to_back_c0_hazard(); back_to_back_c0_hazard();
/* Set the PE bit (bit 31) in the c0_errctl register. */ /* Set the PE bit (bit 31) in the c0_errctl register. */
@ -1498,6 +1502,7 @@ extern void flush_tlb_handlers(void);
* Timer interrupt * Timer interrupt
*/ */
int cp0_compare_irq; int cp0_compare_irq;
EXPORT_SYMBOL_GPL(cp0_compare_irq);
int cp0_compare_irq_shift; int cp0_compare_irq_shift;
/* /*
@ -1597,7 +1602,7 @@ void __cpuinit per_cpu_trap_init(bool is_boot_cpu)
cp0_perfcount_irq = -1; cp0_perfcount_irq = -1;
} else { } else {
cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ;
cp0_compare_irq_shift = cp0_compare_irq; cp0_compare_irq_shift = CP0_LEGACY_PERFCNT_IRQ;
cp0_perfcount_irq = -1; cp0_perfcount_irq = -1;
} }

View file

@ -1,5 +1,6 @@
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/thread_info.h>
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
#undef mips #undef mips
@ -72,7 +73,7 @@ SECTIONS
.data : { /* Data */ .data : { /* Data */
. = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */
INIT_TASK_DATA(PAGE_SIZE) INIT_TASK_DATA(THREAD_SIZE)
NOSAVE_DATA NOSAVE_DATA
CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT)

View file

@ -3,8 +3,8 @@
# #
obj-y += cache.o dma-default.o extable.o fault.o \ obj-y += cache.o dma-default.o extable.o fault.o \
gup.o init.o mmap.o page.o tlbex.o \ gup.o init.o mmap.o page.o page-funcs.o \
tlbex-fault.o uasm.o tlbex.o tlbex-fault.o uasm.o
obj-$(CONFIG_32BIT) += ioremap.o pgtable-32.o obj-$(CONFIG_32BIT) += ioremap.o pgtable-32.o
obj-$(CONFIG_64BIT) += pgtable-64.o obj-$(CONFIG_64BIT) += pgtable-64.o

View file

@ -977,7 +977,7 @@ static void __cpuinit probe_pcache(void)
c->icache.linesz = 2 << lsize; c->icache.linesz = 2 << lsize;
else else
c->icache.linesz = lsize; c->icache.linesz = lsize;
c->icache.sets = 64 << ((config1 >> 22) & 7); c->icache.sets = 32 << (((config1 >> 22) + 1) & 7);
c->icache.ways = 1 + ((config1 >> 16) & 7); c->icache.ways = 1 + ((config1 >> 16) & 7);
icache_size = c->icache.sets * icache_size = c->icache.sets *
@ -997,7 +997,7 @@ static void __cpuinit probe_pcache(void)
c->dcache.linesz = 2 << lsize; c->dcache.linesz = 2 << lsize;
else else
c->dcache.linesz= lsize; c->dcache.linesz= lsize;
c->dcache.sets = 64 << ((config1 >> 13) & 7); c->dcache.sets = 32 << (((config1 >> 13) + 1) & 7);
c->dcache.ways = 1 + ((config1 >> 7) & 7); c->dcache.ways = 1 + ((config1 >> 7) & 7);
dcache_size = c->dcache.sets * dcache_size = c->dcache.sets *
@ -1051,6 +1051,7 @@ static void __cpuinit probe_pcache(void)
case CPU_R14000: case CPU_R14000:
break; break;
case CPU_M14KC:
case CPU_24K: case CPU_24K:
case CPU_34K: case CPU_34K:
case CPU_74K: case CPU_74K:

50
arch/mips/mm/page-funcs.S Normal file
View file

@ -0,0 +1,50 @@
/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Micro-assembler generated clear_page/copy_page functions.
*
* Copyright (C) 2012 MIPS Technologies, Inc.
* Copyright (C) 2012 Ralf Baechle <ralf@linux-mips.org>
*/
#include <asm/asm.h>
#include <asm/regdef.h>
#ifdef CONFIG_SIBYTE_DMA_PAGEOPS
#define cpu_clear_page_function_name clear_page_cpu
#define cpu_copy_page_function_name copy_page_cpu
#else
#define cpu_clear_page_function_name clear_page
#define cpu_copy_page_function_name copy_page
#endif
/*
* Maximum sizes:
*
* R4000 128 bytes S-cache: 0x058 bytes
* R4600 v1.7: 0x05c bytes
* R4600 v2.0: 0x060 bytes
* With prefetching, 16 word strides 0x120 bytes
*/
EXPORT(__clear_page_start)
LEAF(cpu_clear_page_function_name)
1: j 1b /* Dummy, will be replaced. */
.space 288
END(cpu_clear_page_function_name)
EXPORT(__clear_page_end)
/*
* Maximum sizes:
*
* R4000 128 bytes S-cache: 0x11c bytes
* R4600 v1.7: 0x080 bytes
* R4600 v2.0: 0x07c bytes
* With prefetching, 16 word strides 0x540 bytes
*/
EXPORT(__copy_page_start)
LEAF(cpu_copy_page_function_name)
1: j 1b /* Dummy, will be replaced. */
.space 1344
END(cpu_copy_page_function_name)
EXPORT(__copy_page_end)

View file

@ -6,6 +6,7 @@
* Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org) * Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org)
* Copyright (C) 2007 Maciej W. Rozycki * Copyright (C) 2007 Maciej W. Rozycki
* Copyright (C) 2008 Thiemo Seufer * Copyright (C) 2008 Thiemo Seufer
* Copyright (C) 2012 MIPS Technologies, Inc.
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -71,45 +72,6 @@ static struct uasm_reloc __cpuinitdata relocs[5];
#define cpu_is_r4600_v1_x() ((read_c0_prid() & 0xfffffff0) == 0x00002010) #define cpu_is_r4600_v1_x() ((read_c0_prid() & 0xfffffff0) == 0x00002010)
#define cpu_is_r4600_v2_x() ((read_c0_prid() & 0xfffffff0) == 0x00002020) #define cpu_is_r4600_v2_x() ((read_c0_prid() & 0xfffffff0) == 0x00002020)
/*
* Maximum sizes:
*
* R4000 128 bytes S-cache: 0x058 bytes
* R4600 v1.7: 0x05c bytes
* R4600 v2.0: 0x060 bytes
* With prefetching, 16 word strides 0x120 bytes
*/
static u32 clear_page_array[0x120 / 4];
#ifdef CONFIG_SIBYTE_DMA_PAGEOPS
void clear_page_cpu(void *page) __attribute__((alias("clear_page_array")));
#else
void clear_page(void *page) __attribute__((alias("clear_page_array")));
#endif
EXPORT_SYMBOL(clear_page);
/*
* Maximum sizes:
*
* R4000 128 bytes S-cache: 0x11c bytes
* R4600 v1.7: 0x080 bytes
* R4600 v2.0: 0x07c bytes
* With prefetching, 16 word strides 0x540 bytes
*/
static u32 copy_page_array[0x540 / 4];
#ifdef CONFIG_SIBYTE_DMA_PAGEOPS
void
copy_page_cpu(void *to, void *from) __attribute__((alias("copy_page_array")));
#else
void copy_page(void *to, void *from) __attribute__((alias("copy_page_array")));
#endif
EXPORT_SYMBOL(copy_page);
static int pref_bias_clear_store __cpuinitdata; static int pref_bias_clear_store __cpuinitdata;
static int pref_bias_copy_load __cpuinitdata; static int pref_bias_copy_load __cpuinitdata;
static int pref_bias_copy_store __cpuinitdata; static int pref_bias_copy_store __cpuinitdata;
@ -282,10 +244,15 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off)
} }
} }
extern u32 __clear_page_start;
extern u32 __clear_page_end;
extern u32 __copy_page_start;
extern u32 __copy_page_end;
void __cpuinit build_clear_page(void) void __cpuinit build_clear_page(void)
{ {
int off; int off;
u32 *buf = (u32 *)&clear_page_array; u32 *buf = &__clear_page_start;
struct uasm_label *l = labels; struct uasm_label *l = labels;
struct uasm_reloc *r = relocs; struct uasm_reloc *r = relocs;
int i; int i;
@ -356,17 +323,17 @@ void __cpuinit build_clear_page(void)
uasm_i_jr(&buf, RA); uasm_i_jr(&buf, RA);
uasm_i_nop(&buf); uasm_i_nop(&buf);
BUG_ON(buf > clear_page_array + ARRAY_SIZE(clear_page_array)); BUG_ON(buf > &__clear_page_end);
uasm_resolve_relocs(relocs, labels); uasm_resolve_relocs(relocs, labels);
pr_debug("Synthesized clear page handler (%u instructions).\n", pr_debug("Synthesized clear page handler (%u instructions).\n",
(u32)(buf - clear_page_array)); (u32)(buf - &__clear_page_start));
pr_debug("\t.set push\n"); pr_debug("\t.set push\n");
pr_debug("\t.set noreorder\n"); pr_debug("\t.set noreorder\n");
for (i = 0; i < (buf - clear_page_array); i++) for (i = 0; i < (buf - &__clear_page_start); i++)
pr_debug("\t.word 0x%08x\n", clear_page_array[i]); pr_debug("\t.word 0x%08x\n", (&__clear_page_start)[i]);
pr_debug("\t.set pop\n"); pr_debug("\t.set pop\n");
} }
@ -427,7 +394,7 @@ static inline void build_copy_store_pref(u32 **buf, int off)
void __cpuinit build_copy_page(void) void __cpuinit build_copy_page(void)
{ {
int off; int off;
u32 *buf = (u32 *)&copy_page_array; u32 *buf = &__copy_page_start;
struct uasm_label *l = labels; struct uasm_label *l = labels;
struct uasm_reloc *r = relocs; struct uasm_reloc *r = relocs;
int i; int i;
@ -595,21 +562,23 @@ void __cpuinit build_copy_page(void)
uasm_i_jr(&buf, RA); uasm_i_jr(&buf, RA);
uasm_i_nop(&buf); uasm_i_nop(&buf);
BUG_ON(buf > copy_page_array + ARRAY_SIZE(copy_page_array)); BUG_ON(buf > &__copy_page_end);
uasm_resolve_relocs(relocs, labels); uasm_resolve_relocs(relocs, labels);
pr_debug("Synthesized copy page handler (%u instructions).\n", pr_debug("Synthesized copy page handler (%u instructions).\n",
(u32)(buf - copy_page_array)); (u32)(buf - &__copy_page_start));
pr_debug("\t.set push\n"); pr_debug("\t.set push\n");
pr_debug("\t.set noreorder\n"); pr_debug("\t.set noreorder\n");
for (i = 0; i < (buf - copy_page_array); i++) for (i = 0; i < (buf - &__copy_page_start); i++)
pr_debug("\t.word 0x%08x\n", copy_page_array[i]); pr_debug("\t.word 0x%08x\n", (&__copy_page_start)[i]);
pr_debug("\t.set pop\n"); pr_debug("\t.set pop\n");
} }
#ifdef CONFIG_SIBYTE_DMA_PAGEOPS #ifdef CONFIG_SIBYTE_DMA_PAGEOPS
extern void clear_page_cpu(void *page);
extern void copy_page_cpu(void *to, void *from);
/* /*
* Pad descriptors to cacheline, since each is exclusively owned by a * Pad descriptors to cacheline, since each is exclusively owned by a

View file

@ -9,6 +9,7 @@
* Copyright (C) 2005, 2007, 2008, 2009 Maciej W. Rozycki * Copyright (C) 2005, 2007, 2008, 2009 Maciej W. Rozycki
* Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org)
* Copyright (C) 2008, 2009 Cavium Networks, Inc. * Copyright (C) 2008, 2009 Cavium Networks, Inc.
* Copyright (C) 2011 MIPS Technologies, Inc.
* *
* ... and the days got worse and worse and now you see * ... and the days got worse and worse and now you see
* I've gone completly out of my mind. * I've gone completly out of my mind.
@ -494,6 +495,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,
case CPU_R14000: case CPU_R14000:
case CPU_4KC: case CPU_4KC:
case CPU_4KEC: case CPU_4KEC:
case CPU_M14KC:
case CPU_SB1: case CPU_SB1:
case CPU_SB1A: case CPU_SB1A:
case CPU_4KSC: case CPU_4KSC:

View file

@ -241,8 +241,9 @@ void __init mips_pcibios_init(void)
return; return;
} }
if (controller->io_resource->start < 0x00001000UL) /* FIXME */ /* Change start address to avoid conflicts with ACPI and SMB devices */
controller->io_resource->start = 0x00001000UL; if (controller->io_resource->start < 0x00002000UL)
controller->io_resource->start = 0x00002000UL;
iomem_resource.end &= 0xfffffffffULL; /* 64 GB */ iomem_resource.end &= 0xfffffffffULL; /* 64 GB */
ioport_resource.end = controller->io_resource->end; ioport_resource.end = controller->io_resource->end;
@ -253,7 +254,7 @@ void __init mips_pcibios_init(void)
} }
/* Enable PCI 2.1 compatibility in PIIX4 */ /* Enable PCI 2.1 compatibility in PIIX4 */
static void __init quirk_dlcsetup(struct pci_dev *dev) static void __devinit quirk_dlcsetup(struct pci_dev *dev)
{ {
u8 odlc, ndlc; u8 odlc, ndlc;
(void) pci_read_config_byte(dev, 0x82, &odlc); (void) pci_read_config_byte(dev, 0x82, &odlc);

View file

@ -111,7 +111,7 @@ static void __init pci_clock_check(void)
unsigned int __iomem *jmpr_p = unsigned int __iomem *jmpr_p =
(unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07; int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
static const int pciclocks[] __initdata = { static const int pciclocks[] __initconst = {
33, 20, 25, 30, 12, 16, 37, 10 33, 20, 25, 30, 12, 16, 37, 10
}; };
int pciclock = pciclocks[jmpr]; int pciclock = pciclocks[jmpr];

View file

@ -82,8 +82,10 @@ void __init prom_free_prom_memory(void)
void xlp_mmu_init(void) void xlp_mmu_init(void)
{ {
/* enable extended TLB and Large Fixed TLB */
write_c0_config6(read_c0_config6() | 0x24); write_c0_config6(read_c0_config6() | 0x24);
current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
/* set page mask of Fixed TLB in config7 */
write_c0_config7(PM_DEFAULT_MASK >> write_c0_config7(PM_DEFAULT_MASK >>
(13 + (ffz(PM_DEFAULT_MASK >> 13) / 2))); (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2)));
} }
@ -100,6 +102,10 @@ void __init prom_init(void)
nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1)); nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1));
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
nlm_wakeup_secondary_cpus(0xffffffff); nlm_wakeup_secondary_cpus(0xffffffff);
/* update TLB size after waking up threads */
current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
register_smp_ops(&nlm_smp_ops); register_smp_ops(&nlm_smp_ops);
#endif #endif
} }

View file

@ -78,6 +78,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
switch (current_cpu_type()) { switch (current_cpu_type()) {
case CPU_5KC: case CPU_5KC:
case CPU_M14KC:
case CPU_20KC: case CPU_20KC:
case CPU_24K: case CPU_24K:
case CPU_25KF: case CPU_25KF:

View file

@ -322,6 +322,10 @@ static int __init mipsxx_init(void)
op_model_mipsxx_ops.num_counters = counters; op_model_mipsxx_ops.num_counters = counters;
switch (current_cpu_type()) { switch (current_cpu_type()) {
case CPU_M14KC:
op_model_mipsxx_ops.cpu_type = "mips/M14Kc";
break;
case CPU_20KC: case CPU_20KC:
op_model_mipsxx_ops.cpu_type = "mips/20K"; op_model_mipsxx_ops.cpu_type = "mips/20K";
break; break;

View file

@ -48,7 +48,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
return 0; return 0;
} }
static void __init loongson2e_nec_fixup(struct pci_dev *pdev) static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev)
{ {
unsigned int val; unsigned int val;
@ -60,7 +60,7 @@ static void __init loongson2e_nec_fixup(struct pci_dev *pdev)
pci_write_config_dword(pdev, 0xe4, 1 << 5); pci_write_config_dword(pdev, 0xe4, 1 << 5);
} }
static void __init loongson2e_686b_func0_fixup(struct pci_dev *pdev) static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev)
{ {
unsigned char c; unsigned char c;
@ -135,7 +135,7 @@ static void __init loongson2e_686b_func0_fixup(struct pci_dev *pdev)
printk(KERN_INFO"via686b fix: ISA bridge done\n"); printk(KERN_INFO"via686b fix: ISA bridge done\n");
} }
static void __init loongson2e_686b_func1_fixup(struct pci_dev *pdev) static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev)
{ {
printk(KERN_INFO"via686b fix: IDE\n"); printk(KERN_INFO"via686b fix: IDE\n");
@ -168,19 +168,19 @@ static void __init loongson2e_686b_func1_fixup(struct pci_dev *pdev)
printk(KERN_INFO"via686b fix: IDE done\n"); printk(KERN_INFO"via686b fix: IDE done\n");
} }
static void __init loongson2e_686b_func2_fixup(struct pci_dev *pdev) static void __devinit loongson2e_686b_func2_fixup(struct pci_dev *pdev)
{ {
/* irq routing */ /* irq routing */
pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10); pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10);
} }
static void __init loongson2e_686b_func3_fixup(struct pci_dev *pdev) static void __devinit loongson2e_686b_func3_fixup(struct pci_dev *pdev)
{ {
/* irq routing */ /* irq routing */
pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11); pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11);
} }
static void __init loongson2e_686b_func5_fixup(struct pci_dev *pdev) static void __devinit loongson2e_686b_func5_fixup(struct pci_dev *pdev)
{ {
unsigned int val; unsigned int val;
unsigned char c; unsigned char c;

View file

@ -96,21 +96,21 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
} }
/* CS5536 SPEC. fixup */ /* CS5536 SPEC. fixup */
static void __init loongson_cs5536_isa_fixup(struct pci_dev *pdev) static void __devinit loongson_cs5536_isa_fixup(struct pci_dev *pdev)
{ {
/* the uart1 and uart2 interrupt in PIC is enabled as default */ /* the uart1 and uart2 interrupt in PIC is enabled as default */
pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1); pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1);
pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1); pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1);
} }
static void __init loongson_cs5536_ide_fixup(struct pci_dev *pdev) static void __devinit loongson_cs5536_ide_fixup(struct pci_dev *pdev)
{ {
/* setting the mutex pin as IDE function */ /* setting the mutex pin as IDE function */
pci_write_config_dword(pdev, PCI_IDE_CFG_REG, pci_write_config_dword(pdev, PCI_IDE_CFG_REG,
CS5536_IDE_FLASH_SIGNATURE); CS5536_IDE_FLASH_SIGNATURE);
} }
static void __init loongson_cs5536_acc_fixup(struct pci_dev *pdev) static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev)
{ {
/* enable the AUDIO interrupt in PIC */ /* enable the AUDIO interrupt in PIC */
pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1); pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1);
@ -118,14 +118,14 @@ static void __init loongson_cs5536_acc_fixup(struct pci_dev *pdev)
pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0); pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0);
} }
static void __init loongson_cs5536_ohci_fixup(struct pci_dev *pdev) static void __devinit loongson_cs5536_ohci_fixup(struct pci_dev *pdev)
{ {
/* enable the OHCI interrupt in PIC */ /* enable the OHCI interrupt in PIC */
/* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */ /* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */
pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1); pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1);
} }
static void __init loongson_cs5536_ehci_fixup(struct pci_dev *pdev) static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
{ {
u32 hi, lo; u32 hi, lo;
@ -137,7 +137,7 @@ static void __init loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000); pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000);
} }
static void __init loongson_nec_fixup(struct pci_dev *pdev) static void __devinit loongson_nec_fixup(struct pci_dev *pdev)
{ {
unsigned int val; unsigned int val;

View file

@ -49,10 +49,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
return 0; return 0;
} }
static void __init malta_piix_func0_fixup(struct pci_dev *pdev) static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev)
{ {
unsigned char reg_val; unsigned char reg_val;
static int piixirqmap[16] __initdata = { /* PIIX PIRQC[A:D] irq mappings */ static int piixirqmap[16] __devinitdata = { /* PIIX PIRQC[A:D] irq mappings */
0, 0, 0, 3, 0, 0, 0, 3,
4, 5, 6, 7, 4, 5, 6, 7,
0, 9, 10, 11, 0, 9, 10, 11,
@ -83,7 +83,7 @@ static void __init malta_piix_func0_fixup(struct pci_dev *pdev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0,
malta_piix_func0_fixup); malta_piix_func0_fixup);
static void __init malta_piix_func1_fixup(struct pci_dev *pdev) static void __devinit malta_piix_func1_fixup(struct pci_dev *pdev)
{ {
unsigned char reg_val; unsigned char reg_val;

View file

@ -22,13 +22,13 @@
#include <asm/vr41xx/mpc30x.h> #include <asm/vr41xx/mpc30x.h>
static const int internal_func_irqs[] __initdata = { static const int internal_func_irqs[] __initconst = {
VRC4173_CASCADE_IRQ, VRC4173_CASCADE_IRQ,
VRC4173_AC97_IRQ, VRC4173_AC97_IRQ,
VRC4173_USB_IRQ, VRC4173_USB_IRQ,
}; };
static const int irq_tab_mpc30x[] __initdata = { static const int irq_tab_mpc30x[] __initconst = {
[12] = VRC4173_PCMCIA1_IRQ, [12] = VRC4173_PCMCIA1_IRQ,
[13] = VRC4173_PCMCIA2_IRQ, [13] = VRC4173_PCMCIA2_IRQ,
[29] = MQ200_IRQ, [29] = MQ200_IRQ,

View file

@ -15,7 +15,7 @@
* Set the BCM1250, etc. PCI host bridge's TRDY timeout * Set the BCM1250, etc. PCI host bridge's TRDY timeout
* to the finite max. * to the finite max.
*/ */
static void __init quirk_sb1250_pci(struct pci_dev *dev) static void __devinit quirk_sb1250_pci(struct pci_dev *dev)
{ {
pci_write_config_byte(dev, 0x40, 0xff); pci_write_config_byte(dev, 0x40, 0xff);
} }
@ -25,7 +25,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_PCI,
/* /*
* The BCM1250, etc. PCI/HT bridge reports as a host bridge. * The BCM1250, etc. PCI/HT bridge reports as a host bridge.
*/ */
static void __init quirk_sb1250_ht(struct pci_dev *dev) static void __devinit quirk_sb1250_ht(struct pci_dev *dev)
{ {
dev->class = PCI_CLASS_BRIDGE_PCI << 8; dev->class = PCI_CLASS_BRIDGE_PCI << 8;
} }
@ -35,7 +35,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_HT,
/* /*
* Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max. * Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max.
*/ */
static void __init quirk_sp1011(struct pci_dev *dev) static void __devinit quirk_sp1011(struct pci_dev *dev)
{ {
pci_write_config_byte(dev, 0x64, 0xff); pci_write_config_byte(dev, 0x64, 0xff);
} }

View file

@ -495,7 +495,7 @@ irqreturn_t tx4927_pcierr_interrupt(int irq, void *dev_id)
} }
#ifdef CONFIG_TOSHIBA_FPCIB0 #ifdef CONFIG_TOSHIBA_FPCIB0
static void __init tx4927_quirk_slc90e66_bridge(struct pci_dev *dev) static void __devinit tx4927_quirk_slc90e66_bridge(struct pci_dev *dev)
{ {
struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus); struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus);

View file

@ -212,7 +212,7 @@ static inline void pci_enable_swapping(struct pci_dev *dev)
bridge->b_widget.w_tflush; /* Flush */ bridge->b_widget.w_tflush; /* Flush */
} }
static void __init pci_fixup_ioc3(struct pci_dev *d) static void __devinit pci_fixup_ioc3(struct pci_dev *d)
{ {
pci_disable_swapping(d); pci_disable_swapping(d);
} }

View file

@ -129,7 +129,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)
/* setup reset gpio used by pci */ /* setup reset gpio used by pci */
reset_gpio = of_get_named_gpio(node, "gpio-reset", 0); reset_gpio = of_get_named_gpio(node, "gpio-reset", 0);
if (reset_gpio > 0) if (gpio_is_valid(reset_gpio))
devm_gpio_request(&pdev->dev, reset_gpio, "pci-reset"); devm_gpio_request(&pdev->dev, reset_gpio, "pci-reset");
/* enable auto-switching between PCI and EBU */ /* enable auto-switching between PCI and EBU */
@ -192,7 +192,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)
ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN); ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN);
/* toggle reset pin */ /* toggle reset pin */
if (reset_gpio > 0) { if (gpio_is_valid(reset_gpio)) {
__gpio_set_value(reset_gpio, 0); __gpio_set_value(reset_gpio, 0);
wmb(); wmb();
mdelay(1); mdelay(1);

View file

@ -41,6 +41,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/irqdesc.h> #include <linux/irqdesc.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/pci_regs.h>
#include <asm/io.h> #include <asm/io.h>
@ -156,8 +157,27 @@ struct pci_controller nlm_pci_controller = {
.io_offset = 0x00000000UL, .io_offset = 0x00000000UL,
}; };
/*
* The top level PCIe links on the XLS PCIe controller appear as
* bridges. Given a device, this function finds which link it is
* on.
*/
static struct pci_dev *xls_get_pcie_link(const struct pci_dev *dev)
{
struct pci_bus *bus, *p;
/* Find the bridge on bus 0 */
bus = dev->bus;
for (p = bus->parent; p && p->number != 0; p = p->parent)
bus = p;
return p ? bus->self : NULL;
}
static int get_irq_vector(const struct pci_dev *dev) static int get_irq_vector(const struct pci_dev *dev)
{ {
struct pci_dev *lnk;
if (!nlm_chip_is_xls()) if (!nlm_chip_is_xls())
return PIC_PCIX_IRQ; /* for XLR just one IRQ */ return PIC_PCIX_IRQ; /* for XLR just one IRQ */
@ -165,26 +185,27 @@ static int get_irq_vector(const struct pci_dev *dev)
* For XLS PCIe, there is an IRQ per Link, find out which * For XLS PCIe, there is an IRQ per Link, find out which
* link the device is on to assign interrupts * link the device is on to assign interrupts
*/ */
if (dev->bus->self == NULL) lnk = xls_get_pcie_link(dev);
if (lnk == NULL)
return 0; return 0;
switch (dev->bus->self->devfn) { switch (PCI_SLOT(lnk->devfn)) {
case 0x0: case 0:
return PIC_PCIE_LINK0_IRQ; return PIC_PCIE_LINK0_IRQ;
case 0x8: case 1:
return PIC_PCIE_LINK1_IRQ; return PIC_PCIE_LINK1_IRQ;
case 0x10: case 2:
if (nlm_chip_is_xls_b()) if (nlm_chip_is_xls_b())
return PIC_PCIE_XLSB0_LINK2_IRQ; return PIC_PCIE_XLSB0_LINK2_IRQ;
else else
return PIC_PCIE_LINK2_IRQ; return PIC_PCIE_LINK2_IRQ;
case 0x18: case 3:
if (nlm_chip_is_xls_b()) if (nlm_chip_is_xls_b())
return PIC_PCIE_XLSB0_LINK3_IRQ; return PIC_PCIE_XLSB0_LINK3_IRQ;
else else
return PIC_PCIE_LINK3_IRQ; return PIC_PCIE_LINK3_IRQ;
} }
WARN(1, "Unexpected devfn %d\n", dev->bus->self->devfn); WARN(1, "Unexpected devfn %d\n", lnk->devfn);
return 0; return 0;
} }
@ -202,7 +223,27 @@ void arch_teardown_msi_irq(unsigned int irq)
int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
{ {
struct msi_msg msg; struct msi_msg msg;
struct pci_dev *lnk;
int irq, ret; int irq, ret;
u16 val;
/* MSI not supported on XLR */
if (!nlm_chip_is_xls())
return 1;
/*
* Enable MSI on the XLS PCIe controller bridge which was disabled
* at enumeration, the bridge MSI capability is at 0x50
*/
lnk = xls_get_pcie_link(dev);
if (lnk == NULL)
return 1;
pci_read_config_word(lnk, 0x50 + PCI_MSI_FLAGS, &val);
if ((val & PCI_MSI_FLAGS_ENABLE) == 0) {
val |= PCI_MSI_FLAGS_ENABLE;
pci_write_config_word(lnk, 0x50 + PCI_MSI_FLAGS, val);
}
irq = get_irq_vector(dev); irq = get_irq_vector(dev);
if (irq <= 0) if (irq <= 0)
@ -327,7 +368,7 @@ static int __init pcibios_init(void)
} }
} else { } else {
/* XLR PCI controller ACK */ /* XLR PCI controller ACK */
irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, xlr_pci_ack); irq_set_handler_data(PIC_PCIX_IRQ, xlr_pci_ack);
} }
return 0; return 0;

View file

@ -115,11 +115,11 @@ static void yos_send_ipi_mask(const struct cpumask *mask, unsigned int action)
*/ */
static void __cpuinit yos_init_secondary(void) static void __cpuinit yos_init_secondary(void)
{ {
set_c0_status(ST0_CO | ST0_IE | ST0_IM);
} }
static void __cpuinit yos_smp_finish(void) static void __cpuinit yos_smp_finish(void)
{ {
set_c0_status(ST0_CO | ST0_IM | ST0_IE);
} }
/* Hook for after all CPUs are online */ /* Hook for after all CPUs are online */

View file

@ -28,7 +28,7 @@
#define CALLIOPE_ADDR(x) (CALLIOPE_IO_BASE + (x)) #define CALLIOPE_ADDR(x) (CALLIOPE_IO_BASE + (x))
const struct register_map calliope_register_map __initdata = { const struct register_map calliope_register_map __initconst = {
.eic_slow0_strt_add = {.phys = CALLIOPE_ADDR(0x800000)}, .eic_slow0_strt_add = {.phys = CALLIOPE_ADDR(0x800000)},
.eic_cfg_bits = {.phys = CALLIOPE_ADDR(0x800038)}, .eic_cfg_bits = {.phys = CALLIOPE_ADDR(0x800038)},
.eic_ready_status = {.phys = CALLIOPE_ADDR(0x80004c)}, .eic_ready_status = {.phys = CALLIOPE_ADDR(0x80004c)},

View file

@ -28,7 +28,7 @@
#define CRONUS_ADDR(x) (CRONUS_IO_BASE + (x)) #define CRONUS_ADDR(x) (CRONUS_IO_BASE + (x))
const struct register_map cronus_register_map __initdata = { const struct register_map cronus_register_map __initconst = {
.eic_slow0_strt_add = {.phys = CRONUS_ADDR(0x000000)}, .eic_slow0_strt_add = {.phys = CRONUS_ADDR(0x000000)},
.eic_cfg_bits = {.phys = CRONUS_ADDR(0x000038)}, .eic_cfg_bits = {.phys = CRONUS_ADDR(0x000038)},
.eic_ready_status = {.phys = CRONUS_ADDR(0x00004C)}, .eic_ready_status = {.phys = CRONUS_ADDR(0x00004C)},

View file

@ -23,7 +23,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/mach-powertv/asic.h> #include <asm/mach-powertv/asic.h>
const struct register_map gaia_register_map __initdata = { const struct register_map gaia_register_map __initconst = {
.eic_slow0_strt_add = {.phys = GAIA_IO_BASE + 0x000000}, .eic_slow0_strt_add = {.phys = GAIA_IO_BASE + 0x000000},
.eic_cfg_bits = {.phys = GAIA_IO_BASE + 0x000038}, .eic_cfg_bits = {.phys = GAIA_IO_BASE + 0x000038},
.eic_ready_status = {.phys = GAIA_IO_BASE + 0x00004C}, .eic_ready_status = {.phys = GAIA_IO_BASE + 0x00004C},

View file

@ -28,7 +28,7 @@
#define ZEUS_ADDR(x) (ZEUS_IO_BASE + (x)) #define ZEUS_ADDR(x) (ZEUS_IO_BASE + (x))
const struct register_map zeus_register_map __initdata = { const struct register_map zeus_register_map __initconst = {
.eic_slow0_strt_add = {.phys = ZEUS_ADDR(0x000000)}, .eic_slow0_strt_add = {.phys = ZEUS_ADDR(0x000000)},
.eic_cfg_bits = {.phys = ZEUS_ADDR(0x000038)}, .eic_cfg_bits = {.phys = ZEUS_ADDR(0x000038)},
.eic_ready_status = {.phys = ZEUS_ADDR(0x00004c)}, .eic_ready_status = {.phys = ZEUS_ADDR(0x00004c)},

View file

@ -269,7 +269,7 @@ txx9_i8259_irq_setup(int irq)
return err; return err;
} }
static void __init quirk_slc90e66_bridge(struct pci_dev *dev) static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev)
{ {
int irq; /* PCI/ISA Bridge interrupt */ int irq; /* PCI/ISA Bridge interrupt */
u8 reg_64; u8 reg_64;

View file

@ -81,9 +81,6 @@ struct pt_regs {
#define PTRACE_GETFPREGS 14 #define PTRACE_GETFPREGS 14
#define PTRACE_SETFPREGS 15 #define PTRACE_SETFPREGS 15
/* options set using PTRACE_SETOPTIONS */
#define PTRACE_O_TRACESYSGOOD 0x00000001
#ifdef __KERNEL__ #ifdef __KERNEL__
#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) #define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL)

View file

@ -123,7 +123,7 @@ static inline unsigned long current_stack_pointer(void)
} }
#ifndef CONFIG_KGDB #ifndef CONFIG_KGDB
void arch_release_thread_info(struct thread_info *ti) void arch_release_thread_info(struct thread_info *ti);
#endif #endif
#define get_thread_info(ti) get_task_struct((ti)->task) #define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task) #define put_thread_info(ti) put_task_struct((ti)->task)

View file

@ -11,7 +11,6 @@
#ifndef _ASM_TIMEX_H #ifndef _ASM_TIMEX_H
#define _ASM_TIMEX_H #define _ASM_TIMEX_H
#include <asm/hardirq.h>
#include <unit/timex.h> #include <unit/timex.h>
#define TICK_SIZE (tick_nsec / 1000) #define TICK_SIZE (tick_nsec / 1000)
@ -30,16 +29,6 @@ static inline cycles_t get_cycles(void)
extern int init_clockevents(void); extern int init_clockevents(void);
extern int init_clocksource(void); extern int init_clocksource(void);
static inline void setup_jiffies_interrupt(int irq,
struct irqaction *action)
{
u16 tmp;
setup_irq(irq, action);
set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL));
GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST;
tmp = GxICR(irq);
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _ASM_TIMEX_H */ #endif /* _ASM_TIMEX_H */

View file

@ -70,6 +70,16 @@ static void event_handler(struct clock_event_device *dev)
{ {
} }
static inline void setup_jiffies_interrupt(int irq,
struct irqaction *action)
{
u16 tmp;
setup_irq(irq, action);
set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL));
GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST;
tmp = GxICR(irq);
}
int __init init_clockevents(void) int __init init_clockevents(void)
{ {
struct clock_event_device *cd; struct clock_event_device *cd;

Some files were not shown because too many files have changed in this diff Show more