Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
1ad105fc
Commit
1ad105fc
authored
Mar 26, 2012
by
Stephen Warren
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote branch 'remotes/korg_olof_tegra/for-3.4/soc' into for-3.4/fixes-for-io-cleanup
parents
2bc856c4
e186ad74
Changes
14
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
3456 additions
and
13 deletions
+3456
-13
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/Makefile
+3
-0
arch/arm/mach-tegra/board-dt-tegra30.c
arch/arm/mach-tegra/board-dt-tegra30.c
+23
-1
arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/clock.c
+22
-0
arch/arm/mach-tegra/clock.h
arch/arm/mach-tegra/clock.h
+15
-0
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/common.c
+1
-0
arch/arm/mach-tegra/cpuidle.c
arch/arm/mach-tegra/cpuidle.c
+107
-0
arch/arm/mach-tegra/flowctrl.h
arch/arm/mach-tegra/flowctrl.h
+37
-0
arch/arm/mach-tegra/include/mach/clk.h
arch/arm/mach-tegra/include/mach/clk.h
+10
-0
arch/arm/mach-tegra/include/mach/iomap.h
arch/arm/mach-tegra/include/mach/iomap.h
+3
-0
arch/arm/mach-tegra/include/mach/irqs.h
arch/arm/mach-tegra/include/mach/irqs.h
+4
-3
arch/arm/mach-tegra/irq.c
arch/arm/mach-tegra/irq.c
+16
-4
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.S
+91
-0
arch/arm/mach-tegra/tegra2_clocks.c
arch/arm/mach-tegra/tegra2_clocks.c
+25
-5
arch/arm/mach-tegra/tegra30_clocks.c
arch/arm/mach-tegra/tegra30_clocks.c
+3099
-0
No files found.
arch/arm/mach-tegra/Makefile
View file @
1ad105fc
...
...
@@ -7,12 +7,15 @@ obj-y += clock.o
obj-y
+=
timer.o
obj-y
+=
pinmux.o
obj-y
+=
fuse.o
obj-$(CONFIG_CPU_IDLE)
+=
cpuidle.o
obj-$(CONFIG_CPU_IDLE)
+=
sleep.o
obj-$(CONFIG_ARCH_TEGRA_2x_SOC)
+=
powergate.o
obj-$(CONFIG_ARCH_TEGRA_2x_SOC)
+=
tegra2_clocks.o
obj-$(CONFIG_ARCH_TEGRA_2x_SOC)
+=
tegra2_emc.o
obj-$(CONFIG_ARCH_TEGRA_2x_SOC)
+=
pinmux-tegra20-tables.o
obj-$(CONFIG_ARCH_TEGRA_3x_SOC)
+=
pinmux-tegra30-tables.o
obj-$(CONFIG_ARCH_TEGRA_3x_SOC)
+=
board-dt-tegra30.o
obj-$(CONFIG_ARCH_TEGRA_3x_SOC)
+=
tegra30_clocks.o
obj-$(CONFIG_SMP)
+=
platsmp.o localtimer.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU)
+=
hotplug.o
obj-$(CONFIG_TEGRA_SYSTEM_DMA)
+=
dma.o
...
...
arch/arm/mach-tegra/board-dt-tegra30.c
View file @
1ad105fc
...
...
@@ -34,16 +34,38 @@
#include <asm/hardware/gic.h>
#include "board.h"
#include "clock.h"
static
struct
of_device_id
tegra_dt_match_table
[]
__initdata
=
{
{
.
compatible
=
"simple-bus"
,
},
{}
};
struct
of_dev_auxdata
tegra30_auxdata_lookup
[]
__initdata
=
{
OF_DEV_AUXDATA
(
"nvidia,tegra20-sdhci"
,
0x78000000
,
"sdhci-tegra.0"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-sdhci"
,
0x78000200
,
"sdhci-tegra.1"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-sdhci"
,
0x78000400
,
"sdhci-tegra.2"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-sdhci"
,
0x78000600
,
"sdhci-tegra.3"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-i2c"
,
0x7000C000
,
"tegra-i2c.0"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-i2c"
,
0x7000C400
,
"tegra-i2c.1"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-i2c"
,
0x7000C500
,
"tegra-i2c.2"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-i2c"
,
0x7000C700
,
"tegra-i2c.3"
,
NULL
),
OF_DEV_AUXDATA
(
"nvidia,tegra20-i2c"
,
0x7000D000
,
"tegra-i2c.4"
,
NULL
),
{}
};
static
__initdata
struct
tegra_clk_init_table
tegra_dt_clk_init_table
[]
=
{
/* name parent rate enabled */
{
"uartd"
,
"pll_p"
,
408000000
,
true
},
{
NULL
,
NULL
,
0
,
0
},
};
static
void
__init
tegra30_dt_init
(
void
)
{
tegra_clk_init_from_table
(
tegra_dt_clk_init_table
);
of_platform_populate
(
NULL
,
tegra_dt_match_table
,
NULL
,
NULL
);
tegra30_auxdata_lookup
,
NULL
);
}
static
const
char
*
tegra30_dt_board_compat
[]
=
{
...
...
arch/arm/mach-tegra/clock.c
View file @
1ad105fc
...
...
@@ -399,6 +399,28 @@ void tegra_periph_reset_assert(struct clk *c)
}
EXPORT_SYMBOL
(
tegra_periph_reset_assert
);
/* Several extended clock configuration bits (e.g., clock routing, clock
* phase control) are included in PLL and peripheral clock source
* registers. */
int
tegra_clk_cfg_ex
(
struct
clk
*
c
,
enum
tegra_clk_ex_param
p
,
u32
setting
)
{
int
ret
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
c
->
spinlock
,
flags
);
if
(
!
c
->
ops
||
!
c
->
ops
->
clk_cfg_ex
)
{
ret
=
-
ENOSYS
;
goto
out
;
}
ret
=
c
->
ops
->
clk_cfg_ex
(
c
,
p
,
setting
);
out:
spin_unlock_irqrestore
(
&
c
->
spinlock
,
flags
);
return
ret
;
}
#ifdef CONFIG_DEBUG_FS
static
int
__clk_lock_all_spinlocks
(
void
)
...
...
arch/arm/mach-tegra/clock.h
View file @
1ad105fc
...
...
@@ -24,6 +24,8 @@
#include <linux/list.h>
#include <linux/spinlock.h>
#include <mach/clk.h>
#define DIV_BUS (1 << 0)
#define DIV_U71 (1 << 1)
#define DIV_U71_FIXED (1 << 2)
...
...
@@ -39,7 +41,16 @@
#define PERIPH_MANUAL_RESET (1 << 12)
#define PLL_ALT_MISC_REG (1 << 13)
#define PLLU (1 << 14)
#define PLLX (1 << 15)
#define MUX_PWM (1 << 16)
#define MUX8 (1 << 17)
#define DIV_U71_UART (1 << 18)
#define MUX_CLK_OUT (1 << 19)
#define PLLM (1 << 20)
#define DIV_U71_INT (1 << 21)
#define DIV_U71_IDLE (1 << 22)
#define ENABLE_ON_INIT (1 << 28)
#define PERIPH_ON_APB (1 << 29)
struct
clk
;
...
...
@@ -65,6 +76,8 @@ struct clk_ops {
int
(
*
set_rate
)(
struct
clk
*
,
unsigned
long
);
long
(
*
round_rate
)(
struct
clk
*
,
unsigned
long
);
void
(
*
reset
)(
struct
clk
*
,
bool
);
int
(
*
clk_cfg_ex
)(
struct
clk
*
,
enum
tegra_clk_ex_param
,
u32
);
};
enum
clk_state
{
...
...
@@ -114,6 +127,7 @@ struct clk {
unsigned
long
vco_max
;
const
struct
clk_pll_freq_table
*
freq_table
;
int
lock_delay
;
unsigned
long
fixed_rate
;
}
pll
;
struct
{
u32
sel
;
...
...
@@ -146,6 +160,7 @@ struct tegra_clk_init_table {
};
void
tegra2_init_clocks
(
void
);
void
tegra30_init_clocks
(
void
);
void
clk_init
(
struct
clk
*
clk
);
struct
clk
*
tegra_get_clock_by_name
(
const
char
*
name
);
int
clk_reparent
(
struct
clk
*
c
,
struct
clk
*
parent
);
...
...
arch/arm/mach-tegra/common.c
View file @
1ad105fc
...
...
@@ -106,6 +106,7 @@ void __init tegra20_init_early(void)
#ifdef CONFIG_ARCH_TEGRA_3x_SOC
void
__init
tegra30_init_early
(
void
)
{
tegra30_init_clocks
();
tegra_init_cache
(
0x441
,
0x551
);
}
#endif
arch/arm/mach-tegra/cpuidle.c
0 → 100644
View file @
1ad105fc
/*
* arch/arm/mach-tegra/cpuidle.c
*
* CPU idle driver for Tegra CPUs
*
* Copyright (c) 2010-2012, NVIDIA Corporation.
* Copyright (c) 2011 Google, Inc.
* Author: Colin Cross <ccross@android.com>
* Gary King <gking@nvidia.com>
*
* Rework for 3.3 by Peter De Schrijver <pdeschrijver@nvidia.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cpu.h>
#include <linux/cpuidle.h>
#include <linux/hrtimer.h>
#include <mach/iomap.h>
extern
void
tegra_cpu_wfi
(
void
);
static
int
tegra_idle_enter_lp3
(
struct
cpuidle_device
*
dev
,
struct
cpuidle_driver
*
drv
,
int
index
);
struct
cpuidle_driver
tegra_idle_driver
=
{
.
name
=
"tegra_idle"
,
.
owner
=
THIS_MODULE
,
.
state_count
=
1
,
.
states
=
{
[
0
]
=
{
.
enter
=
tegra_idle_enter_lp3
,
.
exit_latency
=
10
,
.
target_residency
=
10
,
.
power_usage
=
600
,
.
flags
=
CPUIDLE_FLAG_TIME_VALID
,
.
name
=
"LP3"
,
.
desc
=
"CPU flow-controlled"
,
},
},
};
static
DEFINE_PER_CPU
(
struct
cpuidle_device
,
tegra_idle_device
);
static
int
tegra_idle_enter_lp3
(
struct
cpuidle_device
*
dev
,
struct
cpuidle_driver
*
drv
,
int
index
)
{
ktime_t
enter
,
exit
;
s64
us
;
local_irq_disable
();
local_fiq_disable
();
enter
=
ktime_get
();
tegra_cpu_wfi
();
exit
=
ktime_sub
(
ktime_get
(),
enter
);
us
=
ktime_to_us
(
exit
);
local_fiq_enable
();
local_irq_enable
();
dev
->
last_residency
=
us
;
return
index
;
}
static
int
__init
tegra_cpuidle_init
(
void
)
{
int
ret
;
unsigned
int
cpu
;
struct
cpuidle_device
*
dev
;
struct
cpuidle_driver
*
drv
=
&
tegra_idle_driver
;
ret
=
cpuidle_register_driver
(
&
tegra_idle_driver
);
if
(
ret
)
{
pr_err
(
"CPUidle driver registration failed
\n
"
);
return
ret
;
}
for_each_possible_cpu
(
cpu
)
{
dev
=
&
per_cpu
(
tegra_idle_device
,
cpu
);
dev
->
cpu
=
cpu
;
dev
->
state_count
=
drv
->
state_count
;
ret
=
cpuidle_register_device
(
dev
);
if
(
ret
)
{
pr_err
(
"CPU%u: CPUidle device registration failed
\n
"
,
cpu
);
return
ret
;
}
}
return
0
;
}
device_initcall
(
tegra_cpuidle_init
);
arch/arm/mach-tegra/flowctrl.h
0 → 100644
View file @
1ad105fc
/*
* arch/arm/mach-tegra/flowctrl.h
*
* functions and macros to control the flowcontroller
*
* Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MACH_TEGRA_FLOWCTRL_H
#define __MACH_TEGRA_FLOWCTRL_H
#define FLOW_CTRL_HALT_CPU0_EVENTS 0x0
#define FLOW_CTRL_WAITEVENT (2 << 29)
#define FLOW_CTRL_WAIT_FOR_INTERRUPT (4 << 29)
#define FLOW_CTRL_JTAG_RESUME (1 << 28)
#define FLOW_CTRL_HALT_CPU_IRQ (1 << 10)
#define FLOW_CTRL_HALT_CPU_FIQ (1 << 8)
#define FLOW_CTRL_CPU0_CSR 0x8
#define FLOW_CTRL_CSR_INTR_FLAG (1 << 15)
#define FLOW_CTRL_CSR_EVENT_FLAG (1 << 14)
#define FLOW_CTRL_CSR_ENABLE (1 << 0)
#define FLOW_CTRL_HALT_CPU1_EVENTS 0x14
#define FLOW_CTRL_CPU1_CSR 0x18
#endif
arch/arm/mach-tegra/include/mach/clk.h
View file @
1ad105fc
...
...
@@ -22,10 +22,20 @@
struct
clk
;
enum
tegra_clk_ex_param
{
TEGRA_CLK_VI_INP_SEL
,
TEGRA_CLK_DTV_INVERT
,
TEGRA_CLK_NAND_PAD_DIV2_ENB
,
TEGRA_CLK_PLLD_CSI_OUT_ENB
,
TEGRA_CLK_PLLD_DSI_OUT_ENB
,
TEGRA_CLK_PLLD_MIPI_MUX_SEL
,
};
void
tegra_periph_reset_deassert
(
struct
clk
*
c
);
void
tegra_periph_reset_assert
(
struct
clk
*
c
);
unsigned
long
clk_get_rate_all_locked
(
struct
clk
*
c
);
void
tegra2_sdmmc_tap_delay
(
struct
clk
*
c
,
int
delay
);
int
tegra_clk_cfg_ex
(
struct
clk
*
c
,
enum
tegra_clk_ex_param
p
,
u32
setting
);
#endif
arch/arm/mach-tegra/include/mach/iomap.h
View file @
1ad105fc
...
...
@@ -74,6 +74,9 @@
#define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300
#define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64
#define TEGRA_QUINARY_ICTLR_BASE 0x60004400
#define TEGRA_QUINARY_ICTLR_SIZE SZ_64
#define TEGRA_TMR1_BASE 0x60005000
#define TEGRA_TMR1_SIZE SZ_8
...
...
arch/arm/mach-tegra/include/mach/irqs.h
View file @
1ad105fc
...
...
@@ -165,11 +165,12 @@
#define INT_QUAD_RES_30 (INT_QUAD_BASE + 30)
#define INT_QUAD_RES_31 (INT_QUAD_BASE + 31)
#define INT_MAIN_NR (INT_QUAD_BASE + 32 - INT_PRI_BASE)
/* Tegra30 has 5 banks of 32 IRQs */
#define INT_MAIN_NR (32 * 5)
#define INT_GPIO_BASE (INT_PRI_BASE + INT_MAIN_NR)
#define INT_GPIO_NR (28 * 8)
/* Tegra30 has 8 banks of 32 GPIOs */
#define INT_GPIO_NR (32 * 8)
#define TEGRA_NR_IRQS (INT_GPIO_BASE + INT_GPIO_NR)
...
...
arch/arm/mach-tegra/irq.c
View file @
1ad105fc
...
...
@@ -44,14 +44,16 @@
#define ICTLR_COP_IER_CLR 0x38
#define ICTLR_COP_IEP_CLASS 0x3c
#define NUM_ICTLRS 4
#define FIRST_LEGACY_IRQ 32
static
int
num_ictlrs
;
static
void
__iomem
*
ictlr_reg_base
[]
=
{
IO_ADDRESS
(
TEGRA_PRIMARY_ICTLR_BASE
),
IO_ADDRESS
(
TEGRA_SECONDARY_ICTLR_BASE
),
IO_ADDRESS
(
TEGRA_TERTIARY_ICTLR_BASE
),
IO_ADDRESS
(
TEGRA_QUATERNARY_ICTLR_BASE
),
IO_ADDRESS
(
TEGRA_QUINARY_ICTLR_BASE
),
};
static
inline
void
tegra_irq_write_mask
(
unsigned
int
irq
,
unsigned
long
reg
)
...
...
@@ -60,7 +62,7 @@ static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg)
u32
mask
;
BUG_ON
(
irq
<
FIRST_LEGACY_IRQ
||
irq
>=
FIRST_LEGACY_IRQ
+
NUM_ICTLRS
*
32
);
irq
>=
FIRST_LEGACY_IRQ
+
num_ictlrs
*
32
);
base
=
ictlr_reg_base
[(
irq
-
FIRST_LEGACY_IRQ
)
/
32
];
mask
=
BIT
((
irq
-
FIRST_LEGACY_IRQ
)
%
32
);
...
...
@@ -113,8 +115,18 @@ static int tegra_retrigger(struct irq_data *d)
void
__init
tegra_init_irq
(
void
)
{
int
i
;
void
__iomem
*
distbase
;
distbase
=
IO_ADDRESS
(
TEGRA_ARM_INT_DIST_BASE
);
num_ictlrs
=
readl_relaxed
(
distbase
+
GIC_DIST_CTR
)
&
0x1f
;
if
(
num_ictlrs
>
ARRAY_SIZE
(
ictlr_reg_base
))
{
WARN
(
1
,
"Too many (%d) interrupt controllers found. Maximum is %d."
,
num_ictlrs
,
ARRAY_SIZE
(
ictlr_reg_base
));
num_ictlrs
=
ARRAY_SIZE
(
ictlr_reg_base
);
}
for
(
i
=
0
;
i
<
NUM_ICTLRS
;
i
++
)
{
for
(
i
=
0
;
i
<
num_ictlrs
;
i
++
)
{
void
__iomem
*
ictlr
=
ictlr_reg_base
[
i
];
writel
(
~
0
,
ictlr
+
ICTLR_CPU_IER_CLR
);
writel
(
0
,
ictlr
+
ICTLR_CPU_IEP_CLASS
);
...
...
@@ -131,6 +143,6 @@ void __init tegra_init_irq(void)
* initialized elsewhere under DT.
*/
if
(
!
of_have_populated_dt
())
gic_init
(
0
,
29
,
IO_ADDRESS
(
TEGRA_ARM_INT_DIST_BASE
)
,
gic_init
(
0
,
29
,
distbase
,
IO_ADDRESS
(
TEGRA_ARM_PERIF_BASE
+
0x100
));
}
arch/arm/mach-tegra/sleep.S
0 → 100644
View file @
1ad105fc
/*
*
arch
/
arm
/
mach
-
tegra
/
sleep
.
S
*
*
Copyright
(
c
)
2010
-
2011
,
NVIDIA
Corporation
.
*
Copyright
(
c
)
2011
,
Google
,
Inc
.
*
*
Author
:
Colin
Cross
<
ccross
@
android
.
com
>
*
Gary
King
<
gking
@
nvidia
.
com
>
*
*
This
program
is
free
software
; you can redistribute it and/or modify
*
it
under
the
terms
of
the
GNU
General
Public
License
as
published
by
*
the
Free
Software
Foundation
; either version 2 of the License, or
*
(
at
your
option
)
any
later
version
.
*
*
This
program
is
distributed
in
the
hope
that
it
will
be
useful
,
but
WITHOUT
*
ANY
WARRANTY
; without even the implied warranty of MERCHANTABILITY or
*
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
GNU
General
Public
License
for
*
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
General
Public
License
along
*
with
this
program
; if not, write to the Free Software Foundation, Inc.,
*
51
Franklin
Street
,
Fifth
Floor
,
Boston
,
MA
02110
-
1301
,
USA
.
*/
#include <linux/linkage.h>
#include <mach/io.h>
#include <mach/iomap.h>
#include "flowctrl.h"
#define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
+
IO_PPSB_VIRT
)
/*
returns
the
offset
of
the
flow
controller
halt
register
for
a
cpu
*/
.
macro
cpu_to_halt_reg
rd
,
rcpu
cmp
\
rcpu
,
#
0
subne
\
rd
,
\
rcpu
,
#
1
movne
\
rd
,
\
rd
,
lsl
#
3
addne
\
rd
,
\
rd
,
#
0x14
moveq
\
rd
,
#
0
.
endm
/*
returns
the
offset
of
the
flow
controller
csr
register
for
a
cpu
*/
.
macro
cpu_to_csr_reg
rd
,
rcpu
cmp
\
rcpu
,
#
0
subne
\
rd
,
\
rcpu
,
#
1
movne
\
rd
,
\
rd
,
lsl
#
3
addne
\
rd
,
\
rd
,
#
0x18
moveq
\
rd
,
#
8
.
endm
/*
returns
the
ID
of
the
current
processor
*/
.
macro
cpu_id
,
rd
mrc
p15
,
0
,
\
rd
,
c0
,
c0
,
5
and
\
rd
,
\
rd
,
#
0xF
.
endm
/*
loads
a
32
-
bit
value
into
a
register
without
a
data
access
*/
.
macro
mov32
,
reg
,
val
movw
\
reg
,
#
:
lower16
:\
val
movt
\
reg
,
#
:
upper16
:\
val
.
endm
/*
*
tegra_cpu_wfi
*
*
puts
current
CPU
in
clock
-
gated
wfi
using
the
flow
controller
*
*
corrupts
r0
-
r3
*
must
be
called
with
MMU
on
*/
ENTRY
(
tegra_cpu_wfi
)
cpu_id
r0
cpu_to_halt_reg
r1
,
r0
cpu_to_csr_reg
r2
,
r0
mov32
r0
,
TEGRA_FLOW_CTRL_VIRT
mov
r3
,
#
FLOW_CTRL_CSR_INTR_FLAG
|
FLOW_CTRL_CSR_EVENT_FLAG
str
r3
,
[
r0
,
r2
]
@
clear
event
&
interrupt
status
mov
r3
,
#
FLOW_CTRL_WAIT_FOR_INTERRUPT
|
FLOW_CTRL_JTAG_RESUME
str
r3
,
[
r0
,
r1
]
@
put
flow
controller
in
wait
irq
mode
dsb
wfi
mov
r3
,
#
0
str
r3
,
[
r0
,
r1
]
@
clear
flow
controller
halt
status
mov
r3
,
#
FLOW_CTRL_CSR_INTR_FLAG
|
FLOW_CTRL_CSR_EVENT_FLAG
str
r3
,
[
r0
,
r2
]
@
clear
event
&
interrupt
status
dsb
mov
pc
,
lr
ENDPROC
(
tegra_cpu_wfi
)
arch/arm/mach-tegra/tegra2_clocks.c
View file @
1ad105fc
...
...
@@ -1143,15 +1143,35 @@ static void tegra2_emc_clk_init(struct clk *c)
static
long
tegra2_emc_clk_round_rate
(
struct
clk
*
c
,
unsigned
long
rate
)
{
long
new_rate
=
rate
;
long
emc_rate
;
long
clk_rate
;
new_rate
=
tegra_emc_round_rate
(
new_rate
);
if
(
new_rate
<
0
)
/*
* The slowest entry in the EMC clock table that is at least as
* fast as rate.
*/
emc_rate
=
tegra_emc_round_rate
(
rate
);
if
(
emc_rate
<
0
)
return
c
->
max_rate
;
BUG_ON
(
new_rate
!=
tegra2_periph_clk_round_rate
(
c
,
new_rate
));
/*
* The fastest rate the PLL will generate that is at most the
* requested rate.
*/
clk_rate
=
tegra2_periph_clk_round_rate
(
c
,
emc_rate
);
/*
* If this fails, and emc_rate > clk_rate, it's because the maximum
* rate in the EMC tables is larger than the maximum rate of the EMC
* clock. The EMC clock's max rate is the rate it was running when the
* kernel booted. Such a mismatch is probably due to using the wrong
* BCT, i.e. using a Tegra20 BCT with an EMC table written for Tegra25.
*/
WARN_ONCE
(
emc_rate
!=
clk_rate
,
"emc_rate %ld != clk_rate %ld"
,
emc_rate
,
clk_rate
);
return
new
_rate
;
return
emc
_rate
;
}
static
int
tegra2_emc_clk_set_rate
(
struct
clk
*
c
,
unsigned
long
rate
)
...
...
arch/arm/mach-tegra/tegra30_clocks.c
0 → 100644
View file @
1ad105fc
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment