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
nexedi
linux
Commits
9af2ebbd
Commit
9af2ebbd
authored
Sep 23, 2010
by
Tony Lindgren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'hwmod_2.6.37' of
git://git.pwsan.com/linux-2.6
into omap-for-linus
parents
493c32a0
74ff3a68
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
829 additions
and
110 deletions
+829
-110
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/Makefile
+2
-2
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod.c
+472
-90
arch/arm/mach-omap2/prcm.c
arch/arm/mach-omap2/prcm.c
+27
-2
arch/arm/mach-omap2/prm.h
arch/arm/mach-omap2/prm.h
+17
-1
arch/arm/mach-omap2/prm2xxx_3xxx.c
arch/arm/mach-omap2/prm2xxx_3xxx.c
+110
-0
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm44xx.c
+116
-0
arch/arm/plat-omap/include/plat/omap_hwmod.h
arch/arm/plat-omap/include/plat/omap_hwmod.h
+41
-14
arch/arm/plat-omap/include/plat/prcm.h
arch/arm/plat-omap/include/plat/prcm.h
+2
-0
arch/arm/plat-omap/omap_device.c
arch/arm/plat-omap/omap_device.c
+42
-1
No files found.
arch/arm/mach-omap2/Makefile
View file @
9af2ebbd
...
...
@@ -5,7 +5,7 @@
# Common support
obj-y
:=
id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o
omap-2-3-common
=
irq.o sdrc.o
omap-2-3-common
=
irq.o sdrc.o
prm2xxx_3xxx.o
hwmod-common
=
omap_hwmod.o
\
omap_hwmod_common_data.o
prcm-common
=
prcm.o powerdomain.o
...
...
@@ -15,7 +15,7 @@ clock-common = clock.o clock_common_data.o \
obj-$(CONFIG_ARCH_OMAP2)
+=
$
(
omap-2-3-common
)
$
(
prcm-common
)
$
(
hwmod-common
)
obj-$(CONFIG_ARCH_OMAP3)
+=
$
(
omap-2-3-common
)
$
(
prcm-common
)
$
(
hwmod-common
)
obj-$(CONFIG_ARCH_OMAP4)
+=
$
(
prcm-common
)
$
(
hwmod-common
)
obj-$(CONFIG_ARCH_OMAP4)
+=
$
(
prcm-common
)
prm44xx.o
$
(
hwmod-common
)
obj-$(CONFIG_OMAP_MCBSP)
+=
mcbsp.o
...
...
arch/arm/mach-omap2/omap_hwmod.c
View file @
9af2ebbd
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap2/prcm.c
View file @
9af2ebbd
...
...
@@ -33,6 +33,7 @@
#include "cm.h"
#include "prm.h"
#include "prm-regbits-24xx.h"
#include "prm-regbits-44xx.h"
static
void
__iomem
*
prm_base
;
static
void
__iomem
*
cm_base
;
...
...
@@ -161,8 +162,8 @@ void omap_prcm_arch_reset(char mode, const char *cmd)
prm_set_mod_reg_bits
(
OMAP_RST_DPLL3_MASK
,
prcm_offs
,
OMAP2_RM_RSTCTRL
);
if
(
cpu_is_omap44xx
())
prm_set_mod_reg_bits
(
OMAP
_RST_DPLL3_MASK
,
prcm_offs
,
OMAP4_RM_RSTCTRL
);
prm_set_mod_reg_bits
(
OMAP
4430_RST_GLOBAL_WARM_SW_MASK
,
prcm_offs
,
OMAP4_RM_RSTCTRL
);
}
static
inline
u32
__omap_prcm_read
(
void
__iomem
*
base
,
s16
module
,
u16
reg
)
...
...
@@ -215,6 +216,30 @@ u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
return
v
;
}
/* Read a PRM register, AND it, and shift the result down to bit 0 */
u32
omap4_prm_read_bits_shift
(
void
__iomem
*
reg
,
u32
mask
)
{
u32
v
;
v
=
__raw_readl
(
reg
);
v
&=
mask
;
v
>>=
__ffs
(
mask
);
return
v
;
}
/* Read-modify-write a register in a PRM module. Caller must lock */
u32
omap4_prm_rmw_reg_bits
(
u32
mask
,
u32
bits
,
void
__iomem
*
reg
)
{
u32
v
;
v
=
__raw_readl
(
reg
);
v
&=
~
mask
;
v
|=
bits
;
__raw_writel
(
v
,
reg
);
return
v
;
}
/* Read a register in a CM module */
u32
cm_read_mod_reg
(
s16
module
,
u16
idx
)
{
...
...
arch/arm/mach-omap2/prm.h
View file @
9af2ebbd
...
...
@@ -5,7 +5,7 @@
* OMAP2/3 Power/Reset Management (PRM) register definitions
*
* Copyright (C) 2007-2009 Texas Instruments, Inc.
* Copyright (C) 20
09
Nokia Corporation
* Copyright (C) 20
10
Nokia Corporation
*
* Written by Paul Walmsley
*
...
...
@@ -246,6 +246,15 @@ static inline u32 prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
return
prm_rmw_mod_reg_bits
(
bits
,
0x0
,
module
,
idx
);
}
/* These omap2_ PRM functions apply to both OMAP2 and 3 */
int
omap2_prm_is_hardreset_asserted
(
s16
prm_mod
,
u8
shift
);
int
omap2_prm_assert_hardreset
(
s16
prm_mod
,
u8
shift
);
int
omap2_prm_deassert_hardreset
(
s16
prm_mod
,
u8
shift
);
int
omap4_prm_is_hardreset_asserted
(
void
__iomem
*
rstctrl_reg
,
u8
shift
);
int
omap4_prm_assert_hardreset
(
void
__iomem
*
rstctrl_reg
,
u8
shift
);
int
omap4_prm_deassert_hardreset
(
void
__iomem
*
rstctrl_reg
,
u8
shift
);
#endif
/*
...
...
@@ -398,4 +407,11 @@ static inline u32 prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
#define OMAP_POWERSTATE_MASK (0x3 << 0)
/*
* MAX_MODULE_HARDRESET_WAIT: Maximum microseconds to wait for an OMAP
* submodule to exit hardreset
*/
#define MAX_MODULE_HARDRESET_WAIT 10000
#endif
arch/arm/mach-omap2/prm2xxx_3xxx.c
0 → 100644
View file @
9af2ebbd
/*
* OMAP2/3 PRM module functions
*
* Copyright (C) 2010 Texas Instruments, Inc.
* Copyright (C) 2010 Nokia Corporation
* Benoît Cousson
* Paul Walmsley
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <plat/common.h>
#include <plat/cpu.h>
#include <plat/prcm.h>
#include "prm.h"
#include "prm-regbits-24xx.h"
#include "prm-regbits-34xx.h"
/**
* omap2_prm_is_hardreset_asserted - read the HW reset line state of
* submodules contained in the hwmod module
* @prm_mod: PRM submodule base (e.g. CORE_MOD)
* @shift: register bit shift corresponding to the reset line to check
*
* Returns 1 if the (sub)module hardreset line is currently asserted,
* 0 if the (sub)module hardreset line is not currently asserted, or
* -EINVAL if called while running on a non-OMAP2/3 chip.
*/
int
omap2_prm_is_hardreset_asserted
(
s16
prm_mod
,
u8
shift
)
{
if
(
!
(
cpu_is_omap24xx
()
||
cpu_is_omap34xx
()))
return
-
EINVAL
;
return
prm_read_mod_bits_shift
(
prm_mod
,
OMAP2_RM_RSTCTRL
,
(
1
<<
shift
));
}
/**
* omap2_prm_assert_hardreset - assert the HW reset line of a submodule
* @prm_mod: PRM submodule base (e.g. CORE_MOD)
* @shift: register bit shift corresponding to the reset line to assert
*
* Some IPs like dsp or iva contain processors that require an HW
* reset line to be asserted / deasserted in order to fully enable the
* IP. These modules may have multiple hard-reset lines that reset
* different 'submodules' inside the IP block. This function will
* place the submodule into reset. Returns 0 upon success or -EINVAL
* upon an argument error.
*/
int
omap2_prm_assert_hardreset
(
s16
prm_mod
,
u8
shift
)
{
u32
mask
;
if
(
!
(
cpu_is_omap24xx
()
||
cpu_is_omap34xx
()))
return
-
EINVAL
;
mask
=
1
<<
shift
;
prm_rmw_mod_reg_bits
(
mask
,
mask
,
prm_mod
,
OMAP2_RM_RSTCTRL
);
return
0
;
}
/**
* omap2_prm_deassert_hardreset - deassert a submodule hardreset line and wait
* @prm_mod: PRM submodule base (e.g. CORE_MOD)
* @shift: register bit shift corresponding to the reset line to deassert
*
* Some IPs like dsp or iva contain processors that require an HW
* reset line to be asserted / deasserted in order to fully enable the
* IP. These modules may have multiple hard-reset lines that reset
* different 'submodules' inside the IP block. This function will
* take the submodule out of reset and wait until the PRCM indicates
* that the reset has completed before returning. Returns 0 upon success or
* -EINVAL upon an argument error, -EEXIST if the submodule was already out
* of reset, or -EBUSY if the submodule did not exit reset promptly.
*/
int
omap2_prm_deassert_hardreset
(
s16
prm_mod
,
u8
shift
)
{
u32
mask
;
int
c
;
if
(
!
(
cpu_is_omap24xx
()
||
cpu_is_omap34xx
()))
return
-
EINVAL
;
mask
=
1
<<
shift
;
/* Check the current status to avoid de-asserting the line twice */
if
(
prm_read_mod_bits_shift
(
prm_mod
,
OMAP2_RM_RSTCTRL
,
mask
)
==
0
)
return
-
EEXIST
;
/* Clear the reset status by writing 1 to the status bit */
prm_rmw_mod_reg_bits
(
0xffffffff
,
mask
,
prm_mod
,
OMAP2_RM_RSTST
);
/* de-assert the reset control line */
prm_rmw_mod_reg_bits
(
mask
,
0
,
prm_mod
,
OMAP2_RM_RSTCTRL
);
/* wait the status to be set */
omap_test_timeout
(
prm_read_mod_bits_shift
(
prm_mod
,
OMAP2_RM_RSTST
,
mask
),
MAX_MODULE_HARDRESET_WAIT
,
c
);
return
(
c
==
MAX_MODULE_HARDRESET_WAIT
)
?
-
EBUSY
:
0
;
}
arch/arm/mach-omap2/prm44xx.c
0 → 100644
View file @
9af2ebbd
/*
* OMAP4 PRM module functions
*
* Copyright (C) 2010 Texas Instruments, Inc.
* Copyright (C) 2010 Nokia Corporation
* Benoît Cousson
* Paul Walmsley
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <plat/common.h>
#include <plat/cpu.h>
#include <plat/prcm.h>
#include "prm.h"
#include "prm-regbits-44xx.h"
/*
* Address offset (in bytes) between the reset control and the reset
* status registers: 4 bytes on OMAP4
*/
#define OMAP4_RST_CTRL_ST_OFFSET 4
/**
* omap4_prm_is_hardreset_asserted - read the HW reset line state of
* submodules contained in the hwmod module
* @rstctrl_reg: RM_RSTCTRL register address for this module
* @shift: register bit shift corresponding to the reset line to check
*
* Returns 1 if the (sub)module hardreset line is currently asserted,
* 0 if the (sub)module hardreset line is not currently asserted, or
* -EINVAL upon parameter error.
*/
int
omap4_prm_is_hardreset_asserted
(
void
__iomem
*
rstctrl_reg
,
u8
shift
)
{
if
(
!
cpu_is_omap44xx
()
||
!
rstctrl_reg
)
return
-
EINVAL
;
return
omap4_prm_read_bits_shift
(
rstctrl_reg
,
(
1
<<
shift
));
}
/**
* omap4_prm_assert_hardreset - assert the HW reset line of a submodule
* @rstctrl_reg: RM_RSTCTRL register address for this module
* @shift: register bit shift corresponding to the reset line to assert
*
* Some IPs like dsp, ipu or iva contain processors that require an HW
* reset line to be asserted / deasserted in order to fully enable the
* IP. These modules may have multiple hard-reset lines that reset
* different 'submodules' inside the IP block. This function will
* place the submodule into reset. Returns 0 upon success or -EINVAL
* upon an argument error.
*/
int
omap4_prm_assert_hardreset
(
void
__iomem
*
rstctrl_reg
,
u8
shift
)
{
u32
mask
;
if
(
!
cpu_is_omap44xx
()
||
!
rstctrl_reg
)
return
-
EINVAL
;
mask
=
1
<<
shift
;
omap4_prm_rmw_reg_bits
(
mask
,
mask
,
rstctrl_reg
);
return
0
;
}
/**
* omap4_prm_deassert_hardreset - deassert a submodule hardreset line and wait
* @rstctrl_reg: RM_RSTCTRL register address for this module
* @shift: register bit shift corresponding to the reset line to deassert
*
* Some IPs like dsp, ipu or iva contain processors that require an HW
* reset line to be asserted / deasserted in order to fully enable the
* IP. These modules may have multiple hard-reset lines that reset
* different 'submodules' inside the IP block. This function will
* take the submodule out of reset and wait until the PRCM indicates
* that the reset has completed before returning. Returns 0 upon success or
* -EINVAL upon an argument error, -EEXIST if the submodule was already out
* of reset, or -EBUSY if the submodule did not exit reset promptly.
*/
int
omap4_prm_deassert_hardreset
(
void
__iomem
*
rstctrl_reg
,
u8
shift
)
{
u32
mask
;
void
__iomem
*
rstst_reg
;
int
c
;
if
(
!
cpu_is_omap44xx
()
||
!
rstctrl_reg
)
return
-
EINVAL
;
rstst_reg
=
rstctrl_reg
+
OMAP4_RST_CTRL_ST_OFFSET
;
mask
=
1
<<
shift
;
/* Check the current status to avoid de-asserting the line twice */
if
(
omap4_prm_read_bits_shift
(
rstctrl_reg
,
mask
)
==
0
)
return
-
EEXIST
;
/* Clear the reset status by writing 1 to the status bit */
omap4_prm_rmw_reg_bits
(
0xffffffff
,
mask
,
rstst_reg
);
/* de-assert the reset control line */
omap4_prm_rmw_reg_bits
(
mask
,
0
,
rstctrl_reg
);
/* wait the status to be set */
omap_test_timeout
(
omap4_prm_read_bits_shift
(
rstst_reg
,
mask
),
MAX_MODULE_HARDRESET_WAIT
,
c
);
return
(
c
==
MAX_MODULE_HARDRESET_WAIT
)
?
-
EBUSY
:
0
;
}
arch/arm/plat-omap/include/plat/omap_hwmod.h
View file @
9af2ebbd
...
...
@@ -14,19 +14,16 @@
*
* These headers and macros are used to define OMAP on-chip module
* data and their integration with other OMAP modules and Linux.
*
* References:
* - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064)
* - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090)
* - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108)
* - OMAP4430 Multimedia Device Silicon Revision 1.0 (SWPU140)
* - Open Core Protocol Specification 2.2
* Copious documentation and references can also be found in the
* omap_hwmod code, in arch/arm/mach-omap2/omap_hwmod.c (as of this
* writing).
*
* To do:
* - add interconnect error log structures
* - add pinmuxing
* - init_conn_id_bit (CONNID_BIT_VECTOR)
* - implement default hwmod SMS/SDRC flags?
* - remove unused fields
*
*/
#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
...
...
@@ -35,6 +32,7 @@
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/ioport.h>
#include <linux/mutex.h>
#include <plat/cpu.h>
struct
omap_device
;
...
...
@@ -96,7 +94,7 @@ struct omap_hwmod_irq_info {
/**
* struct omap_hwmod_dma_info - DMA channels used by the hwmod
* @name: name of the DMA channel (module local name)
* @dma_
ch: DMA channel
ID
* @dma_
req: DMA request
ID
*
* @name should be something short, e.g., "tx" or "rx". It is for use
* by platform_get_resource_byname(). It is defined locally to the
...
...
@@ -104,7 +102,20 @@ struct omap_hwmod_irq_info {
*/
struct
omap_hwmod_dma_info
{
const
char
*
name
;
u16
dma_ch
;
u16
dma_req
;
};
/**
* struct omap_hwmod_rst_info - IPs reset lines use by hwmod
* @name: name of the reset line (module local name)
* @rst_shift: Offset of the reset bit
*
* @name should be something short, e.g., "cpu0" or "rst". It is defined
* locally to the hwmod.
*/
struct
omap_hwmod_rst_info
{
const
char
*
name
;
u8
rst_shift
;
};
/**
...
...
@@ -237,8 +248,9 @@ struct omap_hwmod_ocp_if {
#define SYSC_HAS_CLOCKACTIVITY (1 << 4)
#define SYSC_HAS_SIDLEMODE (1 << 5)
#define SYSC_HAS_MIDLEMODE (1 << 6)
#define SYSS_
MISSING
(1 << 7)
#define SYSS_
HAS_RESET_STATUS
(1 << 7)
#define SYSC_NO_CACHE (1 << 8)
/* XXX SW flag, belongs elsewhere */
#define SYSC_HAS_RESET_STATUS (1 << 9)
/* omap_hwmod_sysconfig.clockact flags */
#define CLOCKACT_TEST_BOTH 0x0
...
...
@@ -327,10 +339,12 @@ struct omap_hwmod_omap2_prcm {
/**
* struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data
* @clkctrl_reg: PRCM address of the clock control register
* @rstctrl_reg: adress of the XXX_RSTCTRL register located in the PRM
* @submodule_wkdep_bit: bit shift of the WKDEP range
*/
struct
omap_hwmod_omap4_prcm
{
void
__iomem
*
clkctrl_reg
;
void
__iomem
*
rstctrl_reg
;
u8
submodule_wkdep_bit
;
};
...
...
@@ -352,6 +366,10 @@ struct omap_hwmod_omap4_prcm {
* HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup
* HWMOD_NO_IDLEST : this module does not have idle status - this is the case
* only for few initiator modules on OMAP2 & 3.
* HWMOD_CONTROL_OPT_CLKS_IN_RESET: Enable all optional clocks during reset.
* This is needed for devices like DSS that require optional clocks enabled
* in order to complete the reset. Optional clocks will be disabled
* again after the reset.
*/
#define HWMOD_SWSUP_SIDLE (1 << 0)
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
...
...
@@ -360,6 +378,7 @@ struct omap_hwmod_omap4_prcm {
#define HWMOD_NO_OCP_AUTOIDLE (1 << 4)
#define HWMOD_SET_DEFAULT_CLOCKACT (1 << 5)
#define HWMOD_NO_IDLEST (1 << 6)
#define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7)
/*
* omap_hwmod._int_flags definitions
...
...
@@ -410,7 +429,7 @@ struct omap_hwmod_class {
* @class: struct omap_hwmod_class * to the class of this hwmod
* @od: struct omap_device currently associated with this hwmod (internal use)
* @mpu_irqs: ptr to an array of MPU IRQs (see also mpu_irqs_cnt)
* @sdma_
chs: ptr to an array of SDMA channel IDs (see also sdma_ch
s_cnt)
* @sdma_
reqs: ptr to an array of System DMA request IDs (see sdma_req
s_cnt)
* @prcm: PRCM data pertaining to this hwmod
* @main_clk: main clock: OMAP clock name
* @_clk: pointer to the main struct clk (filled in at runtime)
...
...
@@ -424,7 +443,7 @@ struct omap_hwmod_class {
* @msuspendmux_reg_id: CONTROL_MSUSPENDMUX register ID (1-6)
* @msuspendmux_shift: CONTROL_MSUSPENDMUX register bit shift
* @mpu_irqs_cnt: number of @mpu_irqs
* @sdma_
chs_cnt: number of @sdma_ch
s
* @sdma_
reqs_cnt: number of @sdma_req
s
* @opt_clks_cnt: number of @opt_clks
* @master_cnt: number of @master entries
* @slaves_cnt: number of @slave entries
...
...
@@ -433,6 +452,7 @@ struct omap_hwmod_class {
* @_state: internal-use hwmod state
* @flags: hwmod flags (documented below)
* @omap_chip: OMAP chips this hwmod is present on
* @_mutex: mutex serializing operations on this hwmod
* @node: list node for hwmod list (internal use)
*
* @main_clk refers to this module's "main clock," which for our
...
...
@@ -448,7 +468,8 @@ struct omap_hwmod {
struct
omap_hwmod_class
*
class
;
struct
omap_device
*
od
;
struct
omap_hwmod_irq_info
*
mpu_irqs
;
struct
omap_hwmod_dma_info
*
sdma_chs
;
struct
omap_hwmod_dma_info
*
sdma_reqs
;
struct
omap_hwmod_rst_info
*
rst_lines
;
union
{
struct
omap_hwmod_omap2_prcm
omap2
;
struct
omap_hwmod_omap4_prcm
omap4
;
...
...
@@ -461,6 +482,7 @@ struct omap_hwmod {
void
*
dev_attr
;
u32
_sysc_cache
;
void
__iomem
*
_mpu_rt_va
;
struct
mutex
_mutex
;
struct
list_head
node
;
u16
flags
;
u8
_mpu_port_index
;
...
...
@@ -468,7 +490,8 @@ struct omap_hwmod {
u8
msuspendmux_shift
;
u8
response_lat
;
u8
mpu_irqs_cnt
;
u8
sdma_chs_cnt
;
u8
sdma_reqs_cnt
;
u8
rst_lines_cnt
;
u8
opt_clks_cnt
;
u8
masters_cnt
;
u8
slaves_cnt
;
...
...
@@ -492,6 +515,10 @@ int omap_hwmod_idle(struct omap_hwmod *oh);
int
_omap_hwmod_idle
(
struct
omap_hwmod
*
oh
);
int
omap_hwmod_shutdown
(
struct
omap_hwmod
*
oh
);
int
omap_hwmod_assert_hardreset
(
struct
omap_hwmod
*
oh
,
const
char
*
name
);
int
omap_hwmod_deassert_hardreset
(
struct
omap_hwmod
*
oh
,
const
char
*
name
);
int
omap_hwmod_read_hardreset
(
struct
omap_hwmod
*
oh
,
const
char
*
name
);
int
omap_hwmod_enable_clocks
(
struct
omap_hwmod
*
oh
);
int
omap_hwmod_disable_clocks
(
struct
omap_hwmod
*
oh
);
...
...
arch/arm/plat-omap/include/plat/prcm.h
View file @
9af2ebbd
...
...
@@ -38,6 +38,8 @@ u32 prm_read_mod_reg(s16 module, u16 idx);
void
prm_write_mod_reg
(
u32
val
,
s16
module
,
u16
idx
);
u32
prm_rmw_mod_reg_bits
(
u32
mask
,
u32
bits
,
s16
module
,
s16
idx
);
u32
prm_read_mod_bits_shift
(
s16
domain
,
s16
idx
,
u32
mask
);
u32
omap4_prm_read_bits_shift
(
void
__iomem
*
reg
,
u32
mask
);
u32
omap4_prm_rmw_reg_bits
(
u32
mask
,
u32
bits
,
void
__iomem
*
reg
);
u32
cm_read_mod_reg
(
s16
module
,
u16
idx
);
void
cm_write_mod_reg
(
u32
val
,
s16
module
,
u16
idx
);
u32
cm_rmw_mod_reg_bits
(
u32
mask
,
u32
bits
,
s16
module
,
s16
idx
);
...
...
arch/arm/plat-omap/omap_device.c
View file @
9af2ebbd
...
...
@@ -82,6 +82,7 @@
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/clk.h>
#include <plat/omap_device.h>
#include <plat/omap_hwmod.h>
...
...
@@ -243,6 +244,44 @@ static inline struct omap_device *_find_by_pdev(struct platform_device *pdev)
return
container_of
(
pdev
,
struct
omap_device
,
pdev
);
}
/**
* _add_optional_clock_alias - Add clock alias for hwmod optional clocks
* @od: struct omap_device *od
*
* For every optional clock present per hwmod per omap_device, this function
* adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role>
* if an entry is already present in it with the form <dev-id=NULL, con-id=role>
*
* The function is called from inside omap_device_build_ss(), after
* omap_device_register.
*
* This allows drivers to get a pointer to its optional clocks based on its role
* by calling clk_get(<dev*>, <role>).
*
* No return value.
*/
static
void
_add_optional_clock_alias
(
struct
omap_device
*
od
,
struct
omap_hwmod
*
oh
)
{
int
i
;
for
(
i
=
0
;
i
<
oh
->
opt_clks_cnt
;
i
++
)
{
struct
omap_hwmod_opt_clk
*
oc
;
int
r
;
oc
=
&
oh
->
opt_clks
[
i
];
if
(
!
oc
->
_clk
)
continue
;
r
=
clk_add_alias
(
oc
->
role
,
dev_name
(
&
od
->
pdev
.
dev
),
(
char
*
)
oc
->
clk
,
&
od
->
pdev
.
dev
);
if
(
r
)
pr_err
(
"omap_device: %s: clk_add_alias for %s failed
\n
"
,
dev_name
(
&
od
->
pdev
.
dev
),
oc
->
role
);
}
}
/* Public functions for use by core code */
...
...
@@ -421,8 +460,10 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
else
ret
=
omap_device_register
(
od
);
for
(
i
=
0
;
i
<
oh_cnt
;
i
++
)
for
(
i
=
0
;
i
<
oh_cnt
;
i
++
)
{
hwmods
[
i
]
->
od
=
od
;
_add_optional_clock_alias
(
od
,
hwmods
[
i
]);
}
if
(
ret
)
goto
odbs_exit4
;
...
...
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