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
9fc85a71
Commit
9fc85a71
authored
Dec 30, 2019
by
Tony Lindgren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'omap-for-v5.6/sdma' into omap-for-v5.6/ti-sysc-drop-pdata
parents
6e678a76
37b156ec
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
389 additions
and
1160 deletions
+389
-1160
arch/arm/boot/dts/dra7-l4.dtsi
arch/arm/boot/dts/dra7-l4.dtsi
+1
-2
arch/arm/boot/dts/omap2.dtsi
arch/arm/boot/dts/omap2.dtsi
+32
-11
arch/arm/boot/dts/omap2430.dtsi
arch/arm/boot/dts/omap2430.dtsi
+4
-0
arch/arm/boot/dts/omap3-n900.dts
arch/arm/boot/dts/omap3-n900.dts
+5
-0
arch/arm/boot/dts/omap3.dtsi
arch/arm/boot/dts/omap3.dtsi
+35
-11
arch/arm/boot/dts/omap36xx.dtsi
arch/arm/boot/dts/omap36xx.dtsi
+4
-0
arch/arm/boot/dts/omap4-l4.dtsi
arch/arm/boot/dts/omap4-l4.dtsi
+1
-2
arch/arm/boot/dts/omap5-l4.dtsi
arch/arm/boot/dts/omap5-l4.dtsi
+1
-2
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/common.h
+3
-0
arch/arm/mach-omap2/dma.c
arch/arm/mach-omap2/dma.c
+16
-103
arch/arm/mach-omap2/omap_device.c
arch/arm/mach-omap2/omap_device.c
+0
-170
arch/arm/mach-omap2/omap_device.h
arch/arm/mach-omap2/omap_device.h
+0
-4
arch/arm/mach-omap2/omap_hwmod_2420_data.c
arch/arm/mach-omap2/omap_hwmod_2420_data.c
+0
-34
arch/arm/mach-omap2/omap_hwmod_2430_data.c
arch/arm/mach-omap2/omap_hwmod_2430_data.c
+0
-34
arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
+0
-18
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+0
-61
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+0
-69
arch/arm/mach-omap2/omap_hwmod_54xx_data.c
arch/arm/mach-omap2/omap_hwmod_54xx_data.c
+0
-62
arch/arm/mach-omap2/omap_hwmod_7xx_data.c
arch/arm/mach-omap2/omap_hwmod_7xx_data.c
+0
-60
arch/arm/mach-omap2/omap_hwmod_common_data.h
arch/arm/mach-omap2/omap_hwmod_common_data.h
+0
-1
arch/arm/mach-omap2/pdata-quirks.c
arch/arm/mach-omap2/pdata-quirks.c
+1
-0
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-omap2/pm24xx.c
+10
-12
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/pm34xx.c
+0
-5
arch/arm/plat-omap/dma.c
arch/arm/plat-omap/dma.c
+8
-463
drivers/dma/ti/omap-dma.c
drivers/dma/ti/omap-dma.c
+268
-18
include/linux/omap-dma.h
include/linux/omap-dma.h
+0
-18
No files found.
arch/arm/boot/dts/dra7-l4.dtsi
View file @
9fc85a71
...
...
@@ -186,7 +186,6 @@ cm_core_clockdomains: clockdomains {
target-module@56000 { /* 0x4a056000, ap 9 02.0 */
compatible = "ti,sysc-omap2", "ti,sysc";
ti,hwmods = "dma_system";
reg = <0x56000 0x4>,
<0x5602c 0x4>,
<0x56028 0x4>;
...
...
@@ -212,7 +211,7 @@ SYSC_OMAP2_SOFTRESET |
ranges = <0x0 0x56000 0x1000>;
sdma: dma-controller@0 {
compatible = "ti,omap4430-sdma";
compatible = "ti,omap4430-sdma"
, "ti,omap-sdma"
;
reg = <0x0 0x1000>;
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
...
...
arch/arm/boot/dts/omap2.dtsi
View file @
9fc85a71
...
...
@@ -8,6 +8,7 @@
* kind, whether express or implied.
*/
#include <dt-bindings/bus/ti-sysc.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pinctrl/omap.h>
...
...
@@ -79,17 +80,37 @@ intc: interrupt-controller@1 {
reg = <0x480FE000 0x1000>;
};
sdma: dma-controller@48056000 {
compatible = "ti,omap2430-sdma", "ti,omap2420-sdma";
ti,hwmods = "dma";
reg = <0x48056000 0x1000>;
interrupts = <12>,
<13>,
<14>,
<15>;
#dma-cells = <1>;
dma-channels = <32>;
dma-requests = <64>;
target-module@48056000 {
compatible = "ti,sysc-omap2", "ti,sysc";
reg = <0x48056000 0x4>,
<0x4805602c 0x4>,
<0x48056028 0x4>;
reg-names = "rev", "sysc", "syss";
ti,sysc-mask = <(SYSC_OMAP2_CLOCKACTIVITY |
SYSC_OMAP2_EMUFREE |
SYSC_OMAP2_SOFTRESET |
SYSC_OMAP2_AUTOIDLE)>;
ti,sysc-midle = <SYSC_IDLE_FORCE>,
<SYSC_IDLE_NO>,
<SYSC_IDLE_SMART>;
ti,syss-mask = <1>;
clocks = <&core_l3_ck>;
clock-names = "fck";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x48056000 0x1000>;
sdma: dma-controller@0 {
compatible = "ti,omap2420-sdma", "ti,omap-sdma";
reg = <0 0x1000>;
interrupts = <12>,
<13>,
<14>,
<15>;
#dma-cells = <1>;
dma-channels = <32>;
dma-requests = <64>;
};
};
i2c1: i2c@48070000 {
...
...
arch/arm/boot/dts/omap2430.dtsi
View file @
9fc85a71
...
...
@@ -309,6 +309,10 @@ wd_timer2: wdt@49016000 {
};
};
&sdma {
compatible = "ti,omap2430-sdma", "ti,omap-sdma";
};
&i2c1 {
compatible = "ti,omap2430-i2c";
};
...
...
arch/arm/boot/dts/omap3-n900.dts
View file @
9fc85a71
...
...
@@ -482,6 +482,11 @@ &vintdig {
regulator
-
always
-
on
;
};
/*
First
two
dma
channels
are
reserved
on
secure
omap3
*/
&
sdma
{
dma
-
channel
-
mask
=
<
0xfffffffc
>;
};
&
twl
{
twl_audio
:
audio
{
compatible
=
"ti,twl4030-audio"
;
...
...
arch/arm/boot/dts/omap3.dtsi
View file @
9fc85a71
...
...
@@ -206,17 +206,41 @@ intc: interrupt-controller@48200000 {
reg = <0x48200000 0x1000>;
};
sdma: dma-controller@48056000 {
compatible = "ti,omap3630-sdma", "ti,omap3430-sdma";
reg = <0x48056000 0x1000>;
interrupts = <12>,
<13>,
<14>,
<15>;
#dma-cells = <1>;
dma-channels = <32>;
dma-requests = <96>;
ti,hwmods = "dma";
target-module@48056000 {
compatible = "ti,sysc-omap2", "ti,sysc";
reg = <0x48056000 0x4>,
<0x4805602c 0x4>,
<0x48056028 0x4>;
reg-names = "rev", "sysc", "syss";
ti,sysc-mask = <(SYSC_OMAP2_CLOCKACTIVITY |
SYSC_OMAP2_EMUFREE |
SYSC_OMAP2_SOFTRESET |
SYSC_OMAP2_AUTOIDLE)>;
ti,sysc-midle = <SYSC_IDLE_FORCE>,
<SYSC_IDLE_NO>,
<SYSC_IDLE_SMART>;
ti,sysc-sidle = <SYSC_IDLE_FORCE>,
<SYSC_IDLE_NO>,
<SYSC_IDLE_SMART>;
ti,syss-mask = <1>;
/* Domains (V, P, C): core, core_pwrdm, core_l3_clkdm */
clocks = <&core_l3_ick>;
clock-names = "ick";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x48056000 0x1000>;
sdma: dma-controller@0 {
compatible = "ti,omap3430-sdma", "ti,omap-sdma";
reg = <0x0 0x1000>;
interrupts = <12>,
<13>,
<14>,
<15>;
#dma-cells = <1>;
dma-channels = <32>;
dma-requests = <96>;
};
};
gpio1: gpio@48310000 {
...
...
arch/arm/boot/dts/omap36xx.dtsi
View file @
9fc85a71
...
...
@@ -223,6 +223,10 @@ thermal_zones: thermal-zones {
};
};
&sdma {
compatible = "ti,omap3630-sdma", "ti,omap-sdma";
};
/* OMAP3630 needs dss_96m_fck for VENC */
&venc {
clocks = <&dss_tv_fck>, <&dss_96m_fck>;
...
...
arch/arm/boot/dts/omap4-l4.dtsi
View file @
9fc85a71
...
...
@@ -136,7 +136,6 @@ cm2_clockdomains: clockdomains {
target-module@56000 { /* 0x4a056000, ap 7 0a.0 */
compatible = "ti,sysc-omap2", "ti,sysc";
ti,hwmods = "dma_system";
reg = <0x56000 0x4>,
<0x5602c 0x4>,
<0x56028 0x4>;
...
...
@@ -160,7 +159,7 @@ SYSC_OMAP2_SOFTRESET |
ranges = <0x0 0x56000 0x1000>;
sdma: dma-controller@0 {
compatible = "ti,omap4430-sdma";
compatible = "ti,omap4430-sdma"
, "ti,omap-sdma"
;
reg = <0x0 0x1000>;
interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
...
...
arch/arm/boot/dts/omap5-l4.dtsi
View file @
9fc85a71
...
...
@@ -213,7 +213,6 @@ dwc3: dwc3@10000 {
target-module@56000 { /* 0x4a056000, ap 7 02.0 */
compatible = "ti,sysc-omap2", "ti,sysc";
ti,hwmods = "dma_system";
reg = <0x56000 0x4>,
<0x5602c 0x4>,
<0x56028 0x4>;
...
...
@@ -237,7 +236,7 @@ SYSC_OMAP2_SOFTRESET |
ranges = <0x0 0x56000 0x1000>;
sdma: dma-controller@0 {
compatible = "ti,omap4430-sdma";
compatible = "ti,omap4430-sdma"
, "ti,omap-sdma"
;
reg = <0x0 0x1000>;
interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
...
...
arch/arm/mach-omap2/common.h
View file @
9fc85a71
...
...
@@ -345,9 +345,12 @@ static inline int dra7xx_pciess_reset(struct omap_hwmod *oh)
}
#endif
struct
omap_system_dma_plat_info
;
void
pdata_quirks_init
(
const
struct
of_device_id
*
);
void
omap_auxdata_legacy_init
(
struct
device
*
dev
);
void
omap_pcs_legacy_init
(
int
irq
,
void
(
*
rearm
)(
void
));
extern
struct
omap_system_dma_plat_info
dma_plat_info
;
struct
omap_sdrc_params
;
extern
void
omap_sdrc_init
(
struct
omap_sdrc_params
*
sdrc_cs0
,
...
...
arch/arm/mach-omap2/dma.c
View file @
9fc85a71
...
...
@@ -30,10 +30,6 @@
#include <linux/omap-dma.h>
#include "soc.h"
#include "omap_hwmod.h"
#include "omap_device.h"
static
enum
omap_reg_offsets
dma_common_ch_end
;
static
const
struct
omap_dma_reg
reg_map
[]
=
{
[
REVISION
]
=
{
0x0000
,
0x00
,
OMAP_DMA_REG_32BIT
},
...
...
@@ -81,42 +77,6 @@ static const struct omap_dma_reg reg_map[] = {
[
CCDN
]
=
{
0x00d8
,
0x60
,
OMAP_DMA_REG_32BIT
},
};
static
void
__iomem
*
dma_base
;
static
inline
void
dma_write
(
u32
val
,
int
reg
,
int
lch
)
{
void
__iomem
*
addr
=
dma_base
;
addr
+=
reg_map
[
reg
].
offset
;
addr
+=
reg_map
[
reg
].
stride
*
lch
;
writel_relaxed
(
val
,
addr
);
}
static
inline
u32
dma_read
(
int
reg
,
int
lch
)
{
void
__iomem
*
addr
=
dma_base
;
addr
+=
reg_map
[
reg
].
offset
;
addr
+=
reg_map
[
reg
].
stride
*
lch
;
return
readl_relaxed
(
addr
);
}
static
void
omap2_clear_dma
(
int
lch
)
{
int
i
;
for
(
i
=
CSDP
;
i
<=
dma_common_ch_end
;
i
+=
1
)
dma_write
(
0
,
i
,
lch
);
}
static
void
omap2_show_dma_caps
(
void
)
{
u8
revision
=
dma_read
(
REVISION
,
0
)
&
0xff
;
printk
(
KERN_INFO
"OMAP DMA hardware revision %d.%d
\n
"
,
revision
>>
4
,
revision
&
0xf
);
}
static
unsigned
configure_dma_errata
(
void
)
{
unsigned
errata
=
0
;
...
...
@@ -211,82 +171,35 @@ static const struct dma_slave_map omap24xx_sdma_dt_map[] = {
{
"musb-hdrc.1.auto"
,
"dmareq5"
,
SDMA_FILTER_PARAM
(
64
)
},
/* OMAP2420 only */
};
static
struct
omap_system_dma_plat_info
dma_plat_info
__initdata
=
{
.
reg_map
=
reg_map
,
.
channel_stride
=
0x60
,
.
show_dma_caps
=
omap2_show_dma_caps
,
.
clear_dma
=
omap2_clear_dma
,
.
dma_write
=
dma_write
,
.
dma_read
=
dma_read
,
static
struct
omap_dma_dev_attr
dma_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
,
.
lch_count
=
32
,
};
st
atic
struct
platform_device_info
omap_dma_dev_info
__initdata
=
{
.
name
=
"omap-dma-engine"
,
.
id
=
-
1
,
.
dma_
mask
=
DMA_BIT_MASK
(
32
)
,
st
ruct
omap_system_dma_plat_info
dma_plat_info
=
{
.
reg_map
=
reg_map
,
.
channel_stride
=
0x60
,
.
dma_
attr
=
&
dma_attr
,
};
/* One time initializations */
static
int
__init
omap2_system_dma_init
_dev
(
struct
omap_hwmod
*
oh
,
void
*
unuse
d
)
static
int
__init
omap2_system_dma_init
(
voi
d
)
{
struct
platform_device
*
pdev
;
struct
omap_system_dma_plat_info
p
;
struct
omap_dma_dev_attr
*
d
;
struct
resource
*
mem
;
char
*
name
=
"omap_dma_system"
;
p
=
dma_plat_info
;
p
.
dma_attr
=
(
struct
omap_dma_dev_attr
*
)
oh
->
dev_attr
;
p
.
errata
=
configure_dma_errata
();
dma_plat_info
.
errata
=
configure_dma_errata
();
if
(
soc_is_omap24xx
())
{
/* DMA slave map for drivers not yet converted to DT */
p
.
slave_map
=
omap24xx_sdma_dt_map
;
p
.
slavecnt
=
ARRAY_SIZE
(
omap24xx_sdma_dt_map
);
dma_plat_info
.
slave_map
=
omap24xx_sdma_dt_map
;
dma_plat_info
.
slavecnt
=
ARRAY_SIZE
(
omap24xx_sdma_dt_map
);
}
pdev
=
omap_device_build
(
name
,
0
,
oh
,
&
p
,
sizeof
(
p
));
if
(
IS_ERR
(
pdev
))
{
pr_err
(
"%s: Can't build omap_device for %s:%s.
\n
"
,
__func__
,
name
,
oh
->
name
);
return
PTR_ERR
(
pdev
);
}
omap_dma_dev_info
.
res
=
pdev
->
resource
;
omap_dma_dev_info
.
num_res
=
pdev
->
num_resources
;
if
(
!
soc_is_omap242x
())
dma_attr
.
dev_caps
|=
IS_RW_PRIORITY
;
mem
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
mem
)
{
dev_err
(
&
pdev
->
dev
,
"%s: no mem resource
\n
"
,
__func__
);
return
-
EINVAL
;
}
dma_base
=
ioremap
(
mem
->
start
,
resource_size
(
mem
));
if
(
!
dma_base
)
{
dev_err
(
&
pdev
->
dev
,
"%s: ioremap fail
\n
"
,
__func__
);
return
-
ENOMEM
;
}
d
=
oh
->
dev_attr
;
if
(
cpu_is_omap34xx
()
&&
(
omap_type
()
!=
OMAP2_DEVICE_TYPE_GP
))
d
->
dev_caps
|=
HS_CHANNELS_RESERVED
;
if
(
platform_get_irq_byname
(
pdev
,
"0"
)
<
0
)
d
->
dev_caps
|=
DMA_ENGINE_HANDLE_IRQ
;
/* Check the capabilities register for descriptor loading feature */
if
(
dma_read
(
CAPS_0
,
0
)
&
DMA_HAS_DESCRIPTOR_CAPS
)
dma_common_ch_end
=
CCDN
;
else
dma_common_ch_end
=
CCFN
;
if
(
soc_is_omap34xx
()
&&
(
omap_type
()
!=
OMAP2_DEVICE_TYPE_GP
))
dma_attr
.
dev_caps
|=
HS_CHANNELS_RESERVED
;
return
0
;
}
static
int
__init
omap2_system_dma_init
(
void
)
{
return
omap_hwmod_for_each_by_class
(
"dma"
,
omap2_system_dma_init_dev
,
NULL
);
}
omap_arch_initcall
(
omap2_system_dma_init
);
arch/arm/mach-omap2/omap_device.c
View file @
9fc85a71
...
...
@@ -373,176 +373,6 @@ void omap_device_delete(struct omap_device *od)
kfree
(
od
);
}
/**
* omap_device_copy_resources - Add legacy IO and IRQ resources
* @oh: interconnect target module
* @pdev: platform device to copy resources to
*
* We still have legacy DMA and smartreflex needing resources.
* Let's populate what they need until we can eventually just
* remove this function. Note that there should be no need to
* call this from omap_device_build_from_dt(), nor should there
* be any need to call it for other devices.
*/
static
int
omap_device_copy_resources
(
struct
omap_hwmod
*
oh
,
struct
platform_device
*
pdev
)
{
struct
device_node
*
np
,
*
child
;
struct
property
*
prop
;
struct
resource
*
res
;
const
char
*
name
;
int
error
,
irq
=
0
;
if
(
!
oh
||
!
oh
->
od
||
!
oh
->
od
->
pdev
)
return
-
EINVAL
;
np
=
oh
->
od
->
pdev
->
dev
.
of_node
;
if
(
!
np
)
{
error
=
-
ENODEV
;
goto
error
;
}
res
=
kcalloc
(
2
,
sizeof
(
*
res
),
GFP_KERNEL
);
if
(
!
res
)
return
-
ENOMEM
;
/* Do we have a dts range for the interconnect target module? */
error
=
omap_hwmod_parse_module_range
(
oh
,
np
,
res
);
/* No ranges, rely on device reg entry */
if
(
error
)
error
=
of_address_to_resource
(
np
,
0
,
res
);
if
(
error
)
goto
free
;
/* SmartReflex needs first IO resource name to be "mpu" */
res
[
0
].
name
=
"mpu"
;
/*
* We may have a configured "ti,sysc" interconnect target with a
* dts child with the interrupt. If so use the first child's
* first interrupt for "ti-hwmods" legacy support.
*/
of_property_for_each_string
(
np
,
"compatible"
,
prop
,
name
)
if
(
!
strncmp
(
"ti,sysc-"
,
name
,
8
))
break
;
child
=
of_get_next_available_child
(
np
,
NULL
);
if
(
name
)
irq
=
irq_of_parse_and_map
(
child
,
0
);
if
(
!
irq
)
irq
=
irq_of_parse_and_map
(
np
,
0
);
if
(
!
irq
)
{
error
=
-
EINVAL
;
goto
free
;
}
/* Legacy DMA code needs interrupt name to be "0" */
res
[
1
].
start
=
irq
;
res
[
1
].
end
=
irq
;
res
[
1
].
flags
=
IORESOURCE_IRQ
;
res
[
1
].
name
=
"0"
;
error
=
platform_device_add_resources
(
pdev
,
res
,
2
);
free:
kfree
(
res
);
error:
WARN
(
error
,
"%s: %s device %s failed: %i
\n
"
,
__func__
,
oh
->
name
,
dev_name
(
&
pdev
->
dev
),
error
);
return
error
;
}
/**
* omap_device_build - build and register an omap_device with one omap_hwmod
* @pdev_name: name of the platform_device driver to use
* @pdev_id: this platform_device's connection ID
* @oh: ptr to the single omap_hwmod that backs this omap_device
* @pdata: platform_data ptr to associate with the platform_device
* @pdata_len: amount of memory pointed to by @pdata
*
* Convenience function for building and registering a single
* omap_device record, which in turn builds and registers a
* platform_device record. See omap_device_build_ss() for more
* information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise,
* passes along the return value of omap_device_build_ss().
*/
struct
platform_device
__init
*
omap_device_build
(
const
char
*
pdev_name
,
int
pdev_id
,
struct
omap_hwmod
*
oh
,
void
*
pdata
,
int
pdata_len
)
{
int
ret
=
-
ENOMEM
;
struct
platform_device
*
pdev
;
struct
omap_device
*
od
;
if
(
!
oh
||
!
pdev_name
)
return
ERR_PTR
(
-
EINVAL
);
if
(
!
pdata
&&
pdata_len
>
0
)
return
ERR_PTR
(
-
EINVAL
);
if
(
strncmp
(
oh
->
name
,
"smartreflex"
,
11
)
&&
strncmp
(
oh
->
name
,
"dma"
,
3
))
{
pr_warn
(
"%s need to update %s to probe with dt
\n
a"
,
__func__
,
pdev_name
);
ret
=
-
ENODEV
;
goto
odbs_exit
;
}
pdev
=
platform_device_alloc
(
pdev_name
,
pdev_id
);
if
(
!
pdev
)
{
ret
=
-
ENOMEM
;
goto
odbs_exit
;
}
/* Set the dev_name early to allow dev_xxx in omap_device_alloc */
if
(
pdev
->
id
!=
-
1
)
dev_set_name
(
&
pdev
->
dev
,
"%s.%d"
,
pdev
->
name
,
pdev
->
id
);
else
dev_set_name
(
&
pdev
->
dev
,
"%s"
,
pdev
->
name
);
/*
* Must be called before omap_device_alloc() as oh->od
* only contains the currently registered omap_device
* and will get overwritten by omap_device_alloc().
*/
ret
=
omap_device_copy_resources
(
oh
,
pdev
);
if
(
ret
)
goto
odbs_exit1
;
od
=
omap_device_alloc
(
pdev
,
&
oh
,
1
);
if
(
IS_ERR
(
od
))
{
ret
=
PTR_ERR
(
od
);
goto
odbs_exit1
;
}
ret
=
platform_device_add_data
(
pdev
,
pdata
,
pdata_len
);
if
(
ret
)
goto
odbs_exit2
;
ret
=
omap_device_register
(
pdev
);
if
(
ret
)
goto
odbs_exit2
;
return
pdev
;
odbs_exit2:
omap_device_delete
(
od
);
odbs_exit1:
platform_device_put
(
pdev
);
odbs_exit:
pr_err
(
"omap_device: %s: build failed (%d)
\n
"
,
pdev_name
,
ret
);
return
ERR_PTR
(
ret
);
}
#ifdef CONFIG_PM
static
int
_od_runtime_suspend
(
struct
device
*
dev
)
{
...
...
arch/arm/mach-omap2/omap_device.h
View file @
9fc85a71
...
...
@@ -68,10 +68,6 @@ int omap_device_idle(struct platform_device *pdev);
/* Core code interface */
struct
platform_device
*
omap_device_build
(
const
char
*
pdev_name
,
int
pdev_id
,
struct
omap_hwmod
*
oh
,
void
*
pdata
,
int
pdata_len
);
struct
omap_device
*
omap_device_alloc
(
struct
platform_device
*
pdev
,
struct
omap_hwmod
**
ohs
,
int
oh_cnt
);
void
omap_device_delete
(
struct
omap_device
*
od
);
...
...
arch/arm/mach-omap2/omap_hwmod_2420_data.c
View file @
9fc85a71
...
...
@@ -11,7 +11,6 @@
*/
#include <linux/platform_data/i2c-omap.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "l3_2xxx.h"
...
...
@@ -126,21 +125,6 @@ static struct omap_hwmod omap2420_i2c2_hwmod = {
.
flags
=
HWMOD_16BIT_REG
,
};
/* dma attributes */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
,
.
lch_count
=
32
,
};
static
struct
omap_hwmod
omap2420_dma_system_hwmod
=
{
.
name
=
"dma"
,
.
class
=
&
omap2xxx_dma_hwmod_class
,
.
main_clk
=
"core_l3_ck"
,
.
dev_attr
=
&
dma_dev_attr
,
.
flags
=
HWMOD_NO_IDLEST
,
};
/* mailbox */
static
struct
omap_hwmod
omap2420_mailbox_hwmod
=
{
.
name
=
"mailbox"
,
...
...
@@ -328,22 +312,6 @@ static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio4 = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* dma_system -> L3 */
static
struct
omap_hwmod_ocp_if
omap2420_dma_system__l3
=
{
.
master
=
&
omap2420_dma_system_hwmod
,
.
slave
=
&
omap2xxx_l3_main_hwmod
,
.
clk
=
"core_l3_ck"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_core -> dma_system */
static
struct
omap_hwmod_ocp_if
omap2420_l4_core__dma_system
=
{
.
master
=
&
omap2xxx_l4_core_hwmod
,
.
slave
=
&
omap2420_dma_system_hwmod
,
.
clk
=
"sdma_ick"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_core -> mailbox */
static
struct
omap_hwmod_ocp_if
omap2420_l4_core__mailbox
=
{
.
master
=
&
omap2xxx_l4_core_hwmod
,
...
...
@@ -435,8 +403,6 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {
&
omap2420_l4_wkup__gpio2
,
&
omap2420_l4_wkup__gpio3
,
&
omap2420_l4_wkup__gpio4
,
&
omap2420_dma_system__l3
,
&
omap2420_l4_core__dma_system
,
&
omap2420_l4_core__mailbox
,
&
omap2420_l4_core__mcbsp1
,
&
omap2420_l4_core__mcbsp2
,
...
...
arch/arm/mach-omap2/omap_hwmod_2430_data.c
View file @
9fc85a71
...
...
@@ -12,7 +12,6 @@
#include <linux/platform_data/i2c-omap.h>
#include <linux/platform_data/hsmmc-omap.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "l3_2xxx.h"
...
...
@@ -121,21 +120,6 @@ static struct omap_hwmod omap2430_gpio5_hwmod = {
.
class
=
&
omap2xxx_gpio_hwmod_class
,
};
/* dma attributes */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
|
IS_RW_PRIORITY
,
.
lch_count
=
32
,
};
static
struct
omap_hwmod
omap2430_dma_system_hwmod
=
{
.
name
=
"dma"
,
.
class
=
&
omap2xxx_dma_hwmod_class
,
.
main_clk
=
"core_l3_ck"
,
.
dev_attr
=
&
dma_dev_attr
,
.
flags
=
HWMOD_NO_IDLEST
,
};
/* mailbox */
static
struct
omap_hwmod
omap2430_mailbox_hwmod
=
{
.
name
=
"mailbox"
,
...
...
@@ -508,22 +492,6 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* dma_system -> L3 */
static
struct
omap_hwmod_ocp_if
omap2430_dma_system__l3
=
{
.
master
=
&
omap2430_dma_system_hwmod
,
.
slave
=
&
omap2xxx_l3_main_hwmod
,
.
clk
=
"core_l3_ck"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_core -> dma_system */
static
struct
omap_hwmod_ocp_if
omap2430_l4_core__dma_system
=
{
.
master
=
&
omap2xxx_l4_core_hwmod
,
.
slave
=
&
omap2430_dma_system_hwmod
,
.
clk
=
"sdma_ick"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_core -> mailbox */
static
struct
omap_hwmod_ocp_if
omap2430_l4_core__mailbox
=
{
.
master
=
&
omap2xxx_l4_core_hwmod
,
...
...
@@ -635,8 +603,6 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {
&
omap2430_l4_wkup__gpio3
,
&
omap2430_l4_wkup__gpio4
,
&
omap2430_l4_core__gpio5
,
&
omap2430_dma_system__l3
,
&
omap2430_l4_core__dma_system
,
&
omap2430_l4_core__mailbox
,
&
omap2430_l4_core__mcbsp1
,
&
omap2430_l4_core__mcbsp2
,
...
...
arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
View file @
9fc85a71
...
...
@@ -7,7 +7,6 @@
*/
#include <linux/types.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "omap_hwmod_common_data.h"
...
...
@@ -95,23 +94,6 @@ struct omap_hwmod_class omap2xxx_gpio_hwmod_class = {
.
sysc
=
&
omap2xxx_gpio_sysc
,
};
/* system dma */
static
struct
omap_hwmod_class_sysconfig
omap2xxx_dma_sysc
=
{
.
rev_offs
=
0x0000
,
.
sysc_offs
=
0x002c
,
.
syss_offs
=
0x0028
,
.
sysc_flags
=
(
SYSC_HAS_SOFTRESET
|
SYSC_HAS_MIDLEMODE
|
SYSC_HAS_CLOCKACTIVITY
|
SYSC_HAS_EMUFREE
|
SYSC_HAS_AUTOIDLE
|
SYSS_HAS_RESET_STATUS
),
.
idlemodes
=
(
MSTANDBY_FORCE
|
MSTANDBY_NO
|
MSTANDBY_SMART
),
.
sysc_fields
=
&
omap_hwmod_sysc_type1
,
};
struct
omap_hwmod_class
omap2xxx_dma_hwmod_class
=
{
.
name
=
"dma"
,
.
sysc
=
&
omap2xxx_dma_sysc
,
};
/*
* 'mailbox' class
* mailbox module allowing communication between the on-chip processors
...
...
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
View file @
9fc85a71
...
...
@@ -16,7 +16,6 @@
#include <linux/power/smartreflex.h>
#include <linux/platform_data/hsmmc-omap.h>
#include <linux/omap-dma.h>
#include "l3_3xxx.h"
#include "l4_3xxx.h"
...
...
@@ -833,47 +832,6 @@ static struct omap_hwmod omap3xxx_gpio6_hwmod = {
.
class
=
&
omap3xxx_gpio_hwmod_class
,
};
/* dma attributes */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
|
IS_RW_PRIORITY
,
.
lch_count
=
32
,
};
static
struct
omap_hwmod_class_sysconfig
omap3xxx_dma_sysc
=
{
.
rev_offs
=
0x0000
,
.
sysc_offs
=
0x002c
,
.
syss_offs
=
0x0028
,
.
sysc_flags
=
(
SYSC_HAS_SIDLEMODE
|
SYSC_HAS_SOFTRESET
|
SYSC_HAS_MIDLEMODE
|
SYSC_HAS_CLOCKACTIVITY
|
SYSC_HAS_EMUFREE
|
SYSC_HAS_AUTOIDLE
|
SYSS_HAS_RESET_STATUS
),
.
idlemodes
=
(
SIDLE_FORCE
|
SIDLE_NO
|
SIDLE_SMART
|
MSTANDBY_FORCE
|
MSTANDBY_NO
|
MSTANDBY_SMART
),
.
sysc_fields
=
&
omap_hwmod_sysc_type1
,
};
static
struct
omap_hwmod_class
omap3xxx_dma_hwmod_class
=
{
.
name
=
"dma"
,
.
sysc
=
&
omap3xxx_dma_sysc
,
};
/* dma_system */
static
struct
omap_hwmod
omap3xxx_dma_system_hwmod
=
{
.
name
=
"dma"
,
.
class
=
&
omap3xxx_dma_hwmod_class
,
.
main_clk
=
"core_l3_ick"
,
.
prcm
=
{
.
omap2
=
{
.
module_offs
=
CORE_MOD
,
.
idlest_reg_id
=
1
,
.
idlest_idle_bit
=
OMAP3430_ST_SDMA_SHIFT
,
},
},
.
dev_attr
=
&
dma_dev_attr
,
.
flags
=
HWMOD_NO_IDLEST
,
};
/*
* 'mcbsp' class
* multi channel buffered serial port controller
...
...
@@ -2233,23 +2191,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* dma_system -> L3 */
static
struct
omap_hwmod_ocp_if
omap3xxx_dma_system__l3
=
{
.
master
=
&
omap3xxx_dma_system_hwmod
,
.
slave
=
&
omap3xxx_l3_main_hwmod
,
.
clk
=
"core_l3_ick"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_cfg -> dma_system */
static
struct
omap_hwmod_ocp_if
omap3xxx_l4_core__dma_system
=
{
.
master
=
&
omap3xxx_l4_core_hwmod
,
.
slave
=
&
omap3xxx_dma_system_hwmod
,
.
clk
=
"core_l4_ick"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_core -> mcbsp1 */
static
struct
omap_hwmod_ocp_if
omap3xxx_l4_core__mcbsp1
=
{
.
master
=
&
omap3xxx_l4_core_hwmod
,
...
...
@@ -2628,8 +2569,6 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
&
omap3xxx_l4_per__gpio4
,
&
omap3xxx_l4_per__gpio5
,
&
omap3xxx_l4_per__gpio6
,
&
omap3xxx_dma_system__l3
,
&
omap3xxx_l4_core__dma_system
,
&
omap3xxx_l4_core__mcbsp1
,
&
omap3xxx_l4_per__mcbsp2
,
&
omap3xxx_l4_per__mcbsp3
,
...
...
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
View file @
9fc85a71
...
...
@@ -18,7 +18,6 @@
*/
#include <linux/io.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "omap_hwmod_common_data.h"
...
...
@@ -30,9 +29,6 @@
/* Base offset for all OMAP4 interrupts external to MPUSS */
#define OMAP44XX_IRQ_GIC_START 32
/* Base offset for all OMAP4 dma requests */
#define OMAP44XX_DMA_REQ_START 1
/*
* IP blocks
*/
...
...
@@ -359,53 +355,6 @@ static struct omap_hwmod omap44xx_debugss_hwmod = {
},
};
/*
* 'dma' class
* dma controller for data exchange between memory to memory (i.e. internal or
* external memory) and gp peripherals to memory or memory to gp peripherals
*/
static
struct
omap_hwmod_class_sysconfig
omap44xx_dma_sysc
=
{
.
rev_offs
=
0x0000
,
.
sysc_offs
=
0x002c
,
.
syss_offs
=
0x0028
,
.
sysc_flags
=
(
SYSC_HAS_AUTOIDLE
|
SYSC_HAS_CLOCKACTIVITY
|
SYSC_HAS_EMUFREE
|
SYSC_HAS_MIDLEMODE
|
SYSC_HAS_SIDLEMODE
|
SYSC_HAS_SOFTRESET
|
SYSS_HAS_RESET_STATUS
),
.
idlemodes
=
(
SIDLE_FORCE
|
SIDLE_NO
|
SIDLE_SMART
|
MSTANDBY_FORCE
|
MSTANDBY_NO
|
MSTANDBY_SMART
),
.
sysc_fields
=
&
omap_hwmod_sysc_type1
,
};
static
struct
omap_hwmod_class
omap44xx_dma_hwmod_class
=
{
.
name
=
"dma"
,
.
sysc
=
&
omap44xx_dma_sysc
,
};
/* dma dev_attr */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
|
IS_RW_PRIORITY
,
.
lch_count
=
32
,
};
/* dma_system */
static
struct
omap_hwmod
omap44xx_dma_system_hwmod
=
{
.
name
=
"dma_system"
,
.
class
=
&
omap44xx_dma_hwmod_class
,
.
clkdm_name
=
"l3_dma_clkdm"
,
.
main_clk
=
"l3_div_ck"
,
.
prcm
=
{
.
omap4
=
{
.
clkctrl_offs
=
OMAP4_CM_SDMA_SDMA_CLKCTRL_OFFSET
,
.
context_offs
=
OMAP4_RM_SDMA_SDMA_CONTEXT_OFFSET
,
},
},
.
dev_attr
=
&
dma_dev_attr
,
};
/*
* 'dsp' class
* dsp sub-system
...
...
@@ -1458,14 +1407,6 @@ static struct omap_hwmod_ocp_if omap44xx_debugss__l3_main_2 = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* dma_system -> l3_main_2 */
static
struct
omap_hwmod_ocp_if
omap44xx_dma_system__l3_main_2
=
{
.
master
=
&
omap44xx_dma_system_hwmod
,
.
slave
=
&
omap44xx_l3_main_2_hwmod
,
.
clk
=
"l3_div_ck"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* ipu -> l3_main_2 */
static
struct
omap_hwmod_ocp_if
omap44xx_ipu__l3_main_2
=
{
.
master
=
&
omap44xx_ipu_hwmod
,
...
...
@@ -1658,14 +1599,6 @@ static struct omap_hwmod_ocp_if omap44xx_l3_instr__debugss = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_cfg -> dma_system */
static
struct
omap_hwmod_ocp_if
omap44xx_l4_cfg__dma_system
=
{
.
master
=
&
omap44xx_l4_cfg_hwmod
,
.
slave
=
&
omap44xx_dma_system_hwmod
,
.
clk
=
"l4_div_ck"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* dsp -> iva */
static
struct
omap_hwmod_ocp_if
omap44xx_dsp__iva
=
{
.
master
=
&
omap44xx_dsp_hwmod
,
...
...
@@ -1966,7 +1899,6 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
&
omap44xx_l4_cfg__l3_main_1
,
&
omap44xx_mpu__l3_main_1
,
&
omap44xx_debugss__l3_main_2
,
&
omap44xx_dma_system__l3_main_2
,
&
omap44xx_ipu__l3_main_2
,
&
omap44xx_iss__l3_main_2
,
&
omap44xx_iva__l3_main_2
,
...
...
@@ -1991,7 +1923,6 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
&
omap44xx_l4_wkup__ctrl_module_wkup
,
&
omap44xx_l4_wkup__ctrl_module_pad_wkup
,
&
omap44xx_l3_instr__debugss
,
&
omap44xx_l4_cfg__dma_system
,
&
omap44xx_dsp__iva
,
/* &omap44xx_dsp__sl2if, */
&
omap44xx_l4_cfg__dsp
,
...
...
arch/arm/mach-omap2/omap_hwmod_54xx_data.c
View file @
9fc85a71
...
...
@@ -17,8 +17,6 @@
#include <linux/io.h>
#include <linux/power/smartreflex.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "omap_hwmod_common_data.h"
#include "cm1_54xx.h"
...
...
@@ -28,10 +26,6 @@
/* Base offset for all OMAP5 interrupts external to MPUSS */
#define OMAP54XX_IRQ_GIC_START 32
/* Base offset for all OMAP5 dma requests */
#define OMAP54XX_DMA_REQ_START 1
/*
* IP blocks
*/
...
...
@@ -232,53 +226,6 @@ static struct omap_hwmod omap54xx_counter_32k_hwmod = {
},
};
/*
* 'dma' class
* dma controller for data exchange between memory to memory (i.e. internal or
* external memory) and gp peripherals to memory or memory to gp peripherals
*/
static
struct
omap_hwmod_class_sysconfig
omap54xx_dma_sysc
=
{
.
rev_offs
=
0x0000
,
.
sysc_offs
=
0x002c
,
.
syss_offs
=
0x0028
,
.
sysc_flags
=
(
SYSC_HAS_AUTOIDLE
|
SYSC_HAS_CLOCKACTIVITY
|
SYSC_HAS_EMUFREE
|
SYSC_HAS_MIDLEMODE
|
SYSC_HAS_SIDLEMODE
|
SYSC_HAS_SOFTRESET
|
SYSS_HAS_RESET_STATUS
),
.
idlemodes
=
(
SIDLE_FORCE
|
SIDLE_NO
|
SIDLE_SMART
|
MSTANDBY_FORCE
|
MSTANDBY_NO
|
MSTANDBY_SMART
),
.
sysc_fields
=
&
omap_hwmod_sysc_type1
,
};
static
struct
omap_hwmod_class
omap54xx_dma_hwmod_class
=
{
.
name
=
"dma"
,
.
sysc
=
&
omap54xx_dma_sysc
,
};
/* dma dev_attr */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
|
IS_RW_PRIORITY
,
.
lch_count
=
32
,
};
/* dma_system */
static
struct
omap_hwmod
omap54xx_dma_system_hwmod
=
{
.
name
=
"dma_system"
,
.
class
=
&
omap54xx_dma_hwmod_class
,
.
clkdm_name
=
"dma_clkdm"
,
.
main_clk
=
"l3_iclk_div"
,
.
prcm
=
{
.
omap4
=
{
.
clkctrl_offs
=
OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET
,
.
context_offs
=
OMAP54XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET
,
},
},
.
dev_attr
=
&
dma_dev_attr
,
};
/*
* 'dss' class
* display sub-system
...
...
@@ -961,14 +908,6 @@ static struct omap_hwmod_ocp_if omap54xx_l4_wkup__counter_32k = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_cfg -> dma_system */
static
struct
omap_hwmod_ocp_if
omap54xx_l4_cfg__dma_system
=
{
.
master
=
&
omap54xx_l4_cfg_hwmod
,
.
slave
=
&
omap54xx_dma_system_hwmod
,
.
clk
=
"l4_root_clk_div"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l3_main_2 -> dss */
static
struct
omap_hwmod_ocp_if
omap54xx_l3_main_2__dss
=
{
.
master
=
&
omap54xx_l3_main_2_hwmod
,
...
...
@@ -1091,7 +1030,6 @@ static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
&
omap54xx_l3_main_1__l4_wkup
,
&
omap54xx_mpu__mpu_private
,
&
omap54xx_l4_wkup__counter_32k
,
&
omap54xx_l4_cfg__dma_system
,
&
omap54xx_l3_main_2__dss
,
&
omap54xx_l3_main_2__dss_dispc
,
&
omap54xx_l3_main_2__dss_dsi1_a
,
...
...
arch/arm/mach-omap2/omap_hwmod_7xx_data.c
View file @
9fc85a71
...
...
@@ -15,7 +15,6 @@
*/
#include <linux/io.h>
#include <linux/omap-dma.h>
#include "omap_hwmod.h"
#include "omap_hwmod_common_data.h"
...
...
@@ -27,10 +26,6 @@
/* Base offset for all DRA7XX interrupts external to MPUSS */
#define DRA7XX_IRQ_GIC_START 32
/* Base offset for all DRA7XX dma requests */
#define DRA7XX_DMA_REQ_START 1
/*
* IP blocks
*/
...
...
@@ -281,52 +276,6 @@ static struct omap_hwmod dra7xx_ctrl_module_wkup_hwmod = {
},
};
/*
* 'dma' class
*
*/
static
struct
omap_hwmod_class_sysconfig
dra7xx_dma_sysc
=
{
.
rev_offs
=
0x0000
,
.
sysc_offs
=
0x002c
,
.
syss_offs
=
0x0028
,
.
sysc_flags
=
(
SYSC_HAS_AUTOIDLE
|
SYSC_HAS_CLOCKACTIVITY
|
SYSC_HAS_EMUFREE
|
SYSC_HAS_MIDLEMODE
|
SYSC_HAS_SIDLEMODE
|
SYSC_HAS_SOFTRESET
|
SYSS_HAS_RESET_STATUS
),
.
idlemodes
=
(
SIDLE_FORCE
|
SIDLE_NO
|
SIDLE_SMART
|
SIDLE_SMART_WKUP
|
MSTANDBY_FORCE
|
MSTANDBY_NO
|
MSTANDBY_SMART
|
MSTANDBY_SMART_WKUP
),
.
sysc_fields
=
&
omap_hwmod_sysc_type1
,
};
static
struct
omap_hwmod_class
dra7xx_dma_hwmod_class
=
{
.
name
=
"dma"
,
.
sysc
=
&
dra7xx_dma_sysc
,
};
/* dma dev_attr */
static
struct
omap_dma_dev_attr
dma_dev_attr
=
{
.
dev_caps
=
RESERVE_CHANNEL
|
DMA_LINKED_LCH
|
GLOBAL_PRIORITY
|
IS_CSSA_32
|
IS_CDSA_32
|
IS_RW_PRIORITY
,
.
lch_count
=
32
,
};
/* dma_system */
static
struct
omap_hwmod
dra7xx_dma_system_hwmod
=
{
.
name
=
"dma_system"
,
.
class
=
&
dra7xx_dma_hwmod_class
,
.
clkdm_name
=
"dma_clkdm"
,
.
main_clk
=
"l3_iclk_div"
,
.
prcm
=
{
.
omap4
=
{
.
clkctrl_offs
=
DRA7XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET
,
.
context_offs
=
DRA7XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET
,
},
},
.
dev_attr
=
&
dma_dev_attr
,
};
/*
* 'tpcc' class
*
...
...
@@ -1128,14 +1077,6 @@ static struct omap_hwmod_ocp_if dra7xx_l4_wkup__ctrl_module_wkup = {
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l4_cfg -> dma_system */
static
struct
omap_hwmod_ocp_if
dra7xx_l4_cfg__dma_system
=
{
.
master
=
&
dra7xx_l4_cfg_hwmod
,
.
slave
=
&
dra7xx_dma_system_hwmod
,
.
clk
=
"l3_iclk_div"
,
.
user
=
OCP_USER_MPU
|
OCP_USER_SDMA
,
};
/* l3_main_1 -> tpcc */
static
struct
omap_hwmod_ocp_if
dra7xx_l3_main_1__tpcc
=
{
.
master
=
&
dra7xx_l3_main_1_hwmod
,
...
...
@@ -1368,7 +1309,6 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
&
dra7xx_l3_main_1__bb2d
,
&
dra7xx_l4_wkup__counter_32k
,
&
dra7xx_l4_wkup__ctrl_module_wkup
,
&
dra7xx_l4_cfg__dma_system
,
&
dra7xx_l3_main_1__tpcc
,
&
dra7xx_l3_main_1__tptc0
,
&
dra7xx_l3_main_1__tptc1
,
...
...
arch/arm/mach-omap2/omap_hwmod_common_data.h
View file @
9fc85a71
...
...
@@ -98,7 +98,6 @@ extern struct omap_hwmod_class omap2_hdq1w_class;
extern
struct
omap_hwmod_class
omap2xxx_timer_hwmod_class
;
extern
struct
omap_hwmod_class
omap2xxx_wd_timer_hwmod_class
;
extern
struct
omap_hwmod_class
omap2xxx_gpio_hwmod_class
;
extern
struct
omap_hwmod_class
omap2xxx_dma_hwmod_class
;
extern
struct
omap_hwmod_class
omap2xxx_mailbox_hwmod_class
;
extern
struct
omap_hwmod_class
omap2xxx_mcspi_class
;
...
...
arch/arm/mach-omap2/pdata-quirks.c
View file @
9fc85a71
...
...
@@ -514,6 +514,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = {
/* Common auxdata */
OF_DEV_AUXDATA
(
"ti,sysc"
,
0
,
NULL
,
&
ti_sysc_pdata
),
OF_DEV_AUXDATA
(
"pinctrl-single"
,
0
,
NULL
,
&
pcs_pdata
),
OF_DEV_AUXDATA
(
"ti,omap-sdma"
,
0
,
NULL
,
&
dma_plat_info
),
{
/* sentinel */
},
};
...
...
arch/arm/mach-omap2/pm24xx.c
View file @
9fc85a71
...
...
@@ -83,8 +83,6 @@ static int omap2_enter_full_retention(void)
l
=
omap_ctrl_readl
(
OMAP2_CONTROL_DEVCONF0
)
|
OMAP24XX_USBSTANDBYCTRL
;
omap_ctrl_writel
(
l
,
OMAP2_CONTROL_DEVCONF0
);
cpu_cluster_pm_enter
();
/* One last check for pending IRQs to avoid extra latency due
* to sleeping unnecessarily. */
if
(
omap_irq_pending
())
...
...
@@ -96,8 +94,6 @@ static int omap2_enter_full_retention(void)
OMAP_SDRC_REGADDR
(
SDRC_POWER
));
no_sleep:
cpu_cluster_pm_exit
();
clk_enable
(
osc_ck
);
/* clear CORE wake-up events */
...
...
@@ -162,25 +158,27 @@ static int omap2_can_sleep(void)
return
0
;
if
(
__clk_is_enabled
(
osc_ck
))
return
0
;
if
(
omap_dma_running
())
return
0
;
return
1
;
}
static
void
omap2_pm_idle
(
void
)
{
if
(
!
omap2_can_sleep
())
{
if
(
omap_irq_pending
())
return
;
omap2_enter_mpu_retention
();
return
;
}
int
error
;
if
(
omap_irq_pending
())
return
;
error
=
cpu_cluster_pm_enter
();
if
(
error
||
!
omap2_can_sleep
())
{
omap2_enter_mpu_retention
();
goto
out_cpu_cluster_pm
;
}
omap2_enter_full_retention
();
out_cpu_cluster_pm:
cpu_cluster_pm_exit
();
}
static
void
__init
prcm_setup_regs
(
void
)
...
...
arch/arm/mach-omap2/pm34xx.c
View file @
9fc85a71
...
...
@@ -25,7 +25,6 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/omap-dma.h>
#include <linux/omap-gpmc.h>
#include <trace/events/power.h>
...
...
@@ -85,7 +84,6 @@ static void omap3_core_save_context(void)
omap3_gpmc_save_context
();
/* Save the system control module context, padconf already save above*/
omap3_control_save_context
();
omap_dma_global_context_save
();
}
static
void
omap3_core_restore_context
(
void
)
...
...
@@ -96,7 +94,6 @@ static void omap3_core_restore_context(void)
omap3_gpmc_restore_context
();
/* Restore the interrupt controller context */
omap_intc_restore_context
();
omap_dma_global_context_restore
();
}
/*
...
...
@@ -547,9 +544,7 @@ int __init omap3_pm_init(void)
local_irq_disable
();
omap_dma_global_context_save
();
omap3_save_secure_ram_context
();
omap_dma_global_context_restore
();
local_irq_enable
();
}
...
...
arch/arm/plat-omap/dma.c
View file @
9fc85a71
...
...
@@ -65,18 +65,9 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
static
struct
omap_system_dma_plat_info
*
p
;
static
struct
omap_dma_dev_attr
*
d
;
static
void
omap_clear_dma
(
int
lch
);
static
int
omap_dma_set_prio_lch
(
int
lch
,
unsigned
char
read_prio
,
unsigned
char
write_prio
);
static
int
enable_1510_mode
;
static
u32
errata
;
static
struct
omap_dma_global_context_registers
{
u32
dma_irqenable_l0
;
u32
dma_irqenable_l1
;
u32
dma_ocp_sysconfig
;
u32
dma_gcr
;
}
omap_dma_global_context
;
struct
dma_link_info
{
int
*
linked_dmach_q
;
int
no_of_lchs_linked
;
...
...
@@ -90,42 +81,6 @@ struct dma_link_info {
};
static
struct
dma_link_info
*
dma_linked_lch
;
#ifndef CONFIG_ARCH_OMAP1
/* Chain handling macros */
#define OMAP_DMA_CHAIN_QINIT(chain_id) \
do { \
dma_linked_lch[chain_id].q_head = \
dma_linked_lch[chain_id].q_tail = \
dma_linked_lch[chain_id].q_count = 0; \
} while (0)
#define OMAP_DMA_CHAIN_QFULL(chain_id) \
(dma_linked_lch[chain_id].no_of_lchs_linked == \
dma_linked_lch[chain_id].q_count)
#define OMAP_DMA_CHAIN_QLAST(chain_id) \
do { \
((dma_linked_lch[chain_id].no_of_lchs_linked-1) == \
dma_linked_lch[chain_id].q_count) \
} while (0)
#define OMAP_DMA_CHAIN_QEMPTY(chain_id) \
(0 == dma_linked_lch[chain_id].q_count)
#define __OMAP_DMA_CHAIN_INCQ(end) \
((end) = ((end)+1) % dma_linked_lch[chain_id].no_of_lchs_linked)
#define OMAP_DMA_CHAIN_INCQHEAD(chain_id) \
do { \
__OMAP_DMA_CHAIN_INCQ(dma_linked_lch[chain_id].q_head); \
dma_linked_lch[chain_id].q_count--; \
} while (0)
#define OMAP_DMA_CHAIN_INCQTAIL(chain_id) \
do { \
__OMAP_DMA_CHAIN_INCQ(dma_linked_lch[chain_id].q_tail); \
dma_linked_lch[chain_id].q_count++; \
} while (0)
#endif
static
int
dma_lch_count
;
static
int
dma_chan_count
;
static
int
omap_dma_reserve_channels
;
...
...
@@ -137,9 +92,6 @@ static inline void disable_lnk(int lch);
static
void
omap_disable_channel_irq
(
int
lch
);
static
inline
void
omap_enable_channel_irq
(
int
lch
);
#define REVISIT_24XX() printk(KERN_ERR "FIXME: no %s on 24xx\n", \
__func__);
#ifdef CONFIG_ARCH_OMAP15XX
/* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */
static
int
omap_dma_in_1510_mode
(
void
)
...
...
@@ -278,19 +230,6 @@ void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,
}
EXPORT_SYMBOL
(
omap_set_dma_transfer_params
);
void
omap_set_dma_write_mode
(
int
lch
,
enum
omap_dma_write_mode
mode
)
{
if
(
dma_omap2plus
())
{
u32
csdp
;
csdp
=
p
->
dma_read
(
CSDP
,
lch
);
csdp
&=
~
(
0x3
<<
16
);
csdp
|=
(
mode
<<
16
);
p
->
dma_write
(
csdp
,
CSDP
,
lch
);
}
}
EXPORT_SYMBOL
(
omap_set_dma_write_mode
);
void
omap_set_dma_channel_mode
(
int
lch
,
enum
omap_dma_channel_mode
mode
)
{
if
(
dma_omap1
()
&&
!
dma_omap15xx
())
{
...
...
@@ -332,25 +271,6 @@ void omap_set_dma_src_params(int lch, int src_port, int src_amode,
}
EXPORT_SYMBOL
(
omap_set_dma_src_params
);
void
omap_set_dma_params
(
int
lch
,
struct
omap_dma_channel_params
*
params
)
{
omap_set_dma_transfer_params
(
lch
,
params
->
data_type
,
params
->
elem_count
,
params
->
frame_count
,
params
->
sync_mode
,
params
->
trigger
,
params
->
src_or_dst_synch
);
omap_set_dma_src_params
(
lch
,
params
->
src_port
,
params
->
src_amode
,
params
->
src_start
,
params
->
src_ei
,
params
->
src_fi
);
omap_set_dma_dest_params
(
lch
,
params
->
dst_port
,
params
->
dst_amode
,
params
->
dst_start
,
params
->
dst_ei
,
params
->
dst_fi
);
if
(
params
->
read_prio
||
params
->
write_prio
)
omap_dma_set_prio_lch
(
lch
,
params
->
read_prio
,
params
->
write_prio
);
}
EXPORT_SYMBOL
(
omap_set_dma_params
);
void
omap_set_dma_src_data_pack
(
int
lch
,
int
enable
)
{
u32
l
;
...
...
@@ -507,12 +427,6 @@ static inline void omap_disable_channel_irq(int lch)
p
->
dma_write
(
OMAP2_DMA_CSR_CLEAR_MASK
,
CSR
,
lch
);
}
void
omap_enable_dma_irq
(
int
lch
,
u16
bits
)
{
dma_chan
[
lch
].
enabled_irqs
|=
bits
;
}
EXPORT_SYMBOL
(
omap_enable_dma_irq
);
void
omap_disable_dma_irq
(
int
lch
,
u16
bits
)
{
dma_chan
[
lch
].
enabled_irqs
&=
~
bits
;
...
...
@@ -532,12 +446,6 @@ static inline void enable_lnk(int lch)
if
(
dma_chan
[
lch
].
next_lch
!=
-
1
)
l
=
dma_chan
[
lch
].
next_lch
|
(
1
<<
15
);
#ifndef CONFIG_ARCH_OMAP1
if
(
dma_omap2plus
())
if
(
dma_chan
[
lch
].
next_linked_ch
!=
-
1
)
l
=
dma_chan
[
lch
].
next_linked_ch
|
(
1
<<
15
);
#endif
p
->
dma_write
(
l
,
CLNK_CTRL
,
lch
);
}
...
...
@@ -564,42 +472,6 @@ static inline void disable_lnk(int lch)
dma_chan
[
lch
].
flags
&=
~
OMAP_DMA_ACTIVE
;
}
static
inline
void
omap2_enable_irq_lch
(
int
lch
)
{
u32
val
;
unsigned
long
flags
;
if
(
dma_omap1
())
return
;
spin_lock_irqsave
(
&
dma_chan_lock
,
flags
);
/* clear IRQ STATUS */
p
->
dma_write
(
1
<<
lch
,
IRQSTATUS_L0
,
lch
);
/* Enable interrupt */
val
=
p
->
dma_read
(
IRQENABLE_L0
,
lch
);
val
|=
1
<<
lch
;
p
->
dma_write
(
val
,
IRQENABLE_L0
,
lch
);
spin_unlock_irqrestore
(
&
dma_chan_lock
,
flags
);
}
static
inline
void
omap2_disable_irq_lch
(
int
lch
)
{
u32
val
;
unsigned
long
flags
;
if
(
dma_omap1
())
return
;
spin_lock_irqsave
(
&
dma_chan_lock
,
flags
);
/* Disable interrupt */
val
=
p
->
dma_read
(
IRQENABLE_L0
,
lch
);
val
&=
~
(
1
<<
lch
);
p
->
dma_write
(
val
,
IRQENABLE_L0
,
lch
);
/* clear IRQ STATUS */
p
->
dma_write
(
1
<<
lch
,
IRQSTATUS_L0
,
lch
);
spin_unlock_irqrestore
(
&
dma_chan_lock
,
flags
);
}
int
omap_request_dma
(
int
dev_id
,
const
char
*
dev_name
,
void
(
*
callback
)(
int
lch
,
u16
ch_status
,
void
*
data
),
void
*
data
,
int
*
dma_ch_out
)
...
...
@@ -628,9 +500,6 @@ int omap_request_dma(int dev_id, const char *dev_name,
if
(
p
->
clear_lch_regs
)
p
->
clear_lch_regs
(
free_ch
);
if
(
dma_omap2plus
())
omap_clear_dma
(
free_ch
);
spin_unlock_irqrestore
(
&
dma_chan_lock
,
flags
);
chan
->
dev_name
=
dev_name
;
...
...
@@ -638,20 +507,10 @@ int omap_request_dma(int dev_id, const char *dev_name,
chan
->
data
=
data
;
chan
->
flags
=
0
;
#ifndef CONFIG_ARCH_OMAP1
if
(
dma_omap2plus
())
{
chan
->
chain_id
=
-
1
;
chan
->
next_linked_ch
=
-
1
;
}
#endif
chan
->
enabled_irqs
=
OMAP_DMA_DROP_IRQ
|
OMAP_DMA_BLOCK_IRQ
;
if
(
dma_omap1
())
chan
->
enabled_irqs
|=
OMAP1_DMA_TOUT_IRQ
;
else
if
(
dma_omap2plus
())
chan
->
enabled_irqs
|=
OMAP2_DMA_MISALIGNED_ERR_IRQ
|
OMAP2_DMA_TRANS_ERR_IRQ
;
if
(
dma_omap16xx
())
{
/* If the sync device is set, configure it dynamically. */
...
...
@@ -668,11 +527,6 @@ int omap_request_dma(int dev_id, const char *dev_name,
p
->
dma_write
(
dev_id
,
CCR
,
free_ch
);
}
if
(
dma_omap2plus
())
{
omap_enable_channel_irq
(
free_ch
);
omap2_enable_irq_lch
(
free_ch
);
}
*
dma_ch_out
=
free_ch
;
return
0
;
...
...
@@ -689,20 +543,12 @@ void omap_free_dma(int lch)
return
;
}
/* Disable interrupt for logical channel */
if
(
dma_omap2plus
())
omap2_disable_irq_lch
(
lch
);
/* Disable all DMA interrupts for the channel. */
omap_disable_channel_irq
(
lch
);
/* Make sure the DMA transfer is stopped. */
p
->
dma_write
(
0
,
CCR
,
lch
);
/* Clear registers */
if
(
dma_omap2plus
())
omap_clear_dma
(
lch
);
spin_lock_irqsave
(
&
dma_chan_lock
,
flags
);
dma_chan
[
lch
].
dev_id
=
-
1
;
dma_chan
[
lch
].
next_lch
=
-
1
;
...
...
@@ -711,71 +557,6 @@ void omap_free_dma(int lch)
}
EXPORT_SYMBOL
(
omap_free_dma
);
/**
* @brief omap_dma_set_global_params : Set global priority settings for dma
*
* @param arb_rate
* @param max_fifo_depth
* @param tparams - Number of threads to reserve : DMA_THREAD_RESERVE_NORM
* DMA_THREAD_RESERVE_ONET
* DMA_THREAD_RESERVE_TWOT
* DMA_THREAD_RESERVE_THREET
*/
void
omap_dma_set_global_params
(
int
arb_rate
,
int
max_fifo_depth
,
int
tparams
)
{
u32
reg
;
if
(
dma_omap1
())
{
printk
(
KERN_ERR
"FIXME: no %s on 15xx/16xx
\n
"
,
__func__
);
return
;
}
if
(
max_fifo_depth
==
0
)
max_fifo_depth
=
1
;
if
(
arb_rate
==
0
)
arb_rate
=
1
;
reg
=
0xff
&
max_fifo_depth
;
reg
|=
(
0x3
&
tparams
)
<<
12
;
reg
|=
(
arb_rate
&
0xff
)
<<
16
;
p
->
dma_write
(
reg
,
GCR
,
0
);
}
EXPORT_SYMBOL
(
omap_dma_set_global_params
);
/**
* @brief omap_dma_set_prio_lch : Set channel wise priority settings
*
* @param lch
* @param read_prio - Read priority
* @param write_prio - Write priority
* Both of the above can be set with one of the following values :
* DMA_CH_PRIO_HIGH/DMA_CH_PRIO_LOW
*/
static
int
omap_dma_set_prio_lch
(
int
lch
,
unsigned
char
read_prio
,
unsigned
char
write_prio
)
{
u32
l
;
if
(
unlikely
((
lch
<
0
||
lch
>=
dma_lch_count
)))
{
printk
(
KERN_ERR
"Invalid channel id
\n
"
);
return
-
EINVAL
;
}
l
=
p
->
dma_read
(
CCR
,
lch
);
l
&=
~
((
1
<<
6
)
|
(
1
<<
26
));
if
(
d
->
dev_caps
&
IS_RW_PRIORITY
)
l
|=
((
read_prio
&
0x1
)
<<
6
)
|
((
write_prio
&
0x1
)
<<
26
);
else
l
|=
((
read_prio
&
0x1
)
<<
6
);
p
->
dma_write
(
l
,
CCR
,
lch
);
return
0
;
}
/*
* Clears any DMA state so the DMA engine is ready to restart with new buffers
* through omap_start_dma(). Any buffers in flight are discarded.
...
...
@@ -926,29 +707,6 @@ EXPORT_SYMBOL(omap_stop_dma);
* Allows changing the DMA callback function or data. This may be needed if
* the driver shares a single DMA channel for multiple dma triggers.
*/
int
omap_set_dma_callback
(
int
lch
,
void
(
*
callback
)(
int
lch
,
u16
ch_status
,
void
*
data
),
void
*
data
)
{
unsigned
long
flags
;
if
(
lch
<
0
)
return
-
ENODEV
;
spin_lock_irqsave
(
&
dma_chan_lock
,
flags
);
if
(
dma_chan
[
lch
].
dev_id
==
-
1
)
{
printk
(
KERN_ERR
"DMA callback for not set for free channel
\n
"
);
spin_unlock_irqrestore
(
&
dma_chan_lock
,
flags
);
return
-
EINVAL
;
}
dma_chan
[
lch
].
callback
=
callback
;
dma_chan
[
lch
].
data
=
data
;
spin_unlock_irqrestore
(
&
dma_chan_lock
,
flags
);
return
0
;
}
EXPORT_SYMBOL
(
omap_set_dma_callback
);
/*
* Returns current physical source address for the given DMA channel.
* If the channel is running the caller must disable interrupts prior calling
...
...
@@ -1048,34 +806,6 @@ int omap_dma_running(void)
return
0
;
}
/*
* lch_queue DMA will start right after lch_head one is finished.
* For this DMA link to start, you still need to start (see omap_start_dma)
* the first one. That will fire up the entire queue.
*/
void
omap_dma_link_lch
(
int
lch_head
,
int
lch_queue
)
{
if
(
omap_dma_in_1510_mode
())
{
if
(
lch_head
==
lch_queue
)
{
p
->
dma_write
(
p
->
dma_read
(
CCR
,
lch_head
)
|
(
3
<<
8
),
CCR
,
lch_head
);
return
;
}
printk
(
KERN_ERR
"DMA linking is not supported in 1510 mode
\n
"
);
BUG
();
return
;
}
if
((
dma_chan
[
lch_head
].
dev_id
==
-
1
)
||
(
dma_chan
[
lch_queue
].
dev_id
==
-
1
))
{
pr_err
(
"omap_dma: trying to link non requested channels
\n
"
);
dump_stack
();
}
dma_chan
[
lch_head
].
next_lch
=
lch_queue
;
}
EXPORT_SYMBOL
(
omap_dma_link_lch
);
/*----------------------------------------------------------------------------*/
#ifdef CONFIG_ARCH_OMAP1
...
...
@@ -1136,145 +866,6 @@ static irqreturn_t omap1_dma_irq_handler(int irq, void *dev_id)
#define omap1_dma_irq_handler NULL
#endif
#ifdef CONFIG_ARCH_OMAP2PLUS
static
int
omap2_dma_handle_ch
(
int
ch
)
{
u32
status
=
p
->
dma_read
(
CSR
,
ch
);
if
(
!
status
)
{
if
(
printk_ratelimit
())
pr_warn
(
"Spurious DMA IRQ for lch %d
\n
"
,
ch
);
p
->
dma_write
(
1
<<
ch
,
IRQSTATUS_L0
,
ch
);
return
0
;
}
if
(
unlikely
(
dma_chan
[
ch
].
dev_id
==
-
1
))
{
if
(
printk_ratelimit
())
pr_warn
(
"IRQ %04x for non-allocated DMA channel %d
\n
"
,
status
,
ch
);
return
0
;
}
if
(
unlikely
(
status
&
OMAP_DMA_DROP_IRQ
))
pr_info
(
"DMA synchronization event drop occurred with device %d
\n
"
,
dma_chan
[
ch
].
dev_id
);
if
(
unlikely
(
status
&
OMAP2_DMA_TRANS_ERR_IRQ
))
{
printk
(
KERN_INFO
"DMA transaction error with device %d
\n
"
,
dma_chan
[
ch
].
dev_id
);
if
(
IS_DMA_ERRATA
(
DMA_ERRATA_i378
))
{
u32
ccr
;
ccr
=
p
->
dma_read
(
CCR
,
ch
);
ccr
&=
~
OMAP_DMA_CCR_EN
;
p
->
dma_write
(
ccr
,
CCR
,
ch
);
dma_chan
[
ch
].
flags
&=
~
OMAP_DMA_ACTIVE
;
}
}
if
(
unlikely
(
status
&
OMAP2_DMA_SECURE_ERR_IRQ
))
printk
(
KERN_INFO
"DMA secure error with device %d
\n
"
,
dma_chan
[
ch
].
dev_id
);
if
(
unlikely
(
status
&
OMAP2_DMA_MISALIGNED_ERR_IRQ
))
printk
(
KERN_INFO
"DMA misaligned error with device %d
\n
"
,
dma_chan
[
ch
].
dev_id
);
p
->
dma_write
(
status
,
CSR
,
ch
);
p
->
dma_write
(
1
<<
ch
,
IRQSTATUS_L0
,
ch
);
/* read back the register to flush the write */
p
->
dma_read
(
IRQSTATUS_L0
,
ch
);
/* If the ch is not chained then chain_id will be -1 */
if
(
dma_chan
[
ch
].
chain_id
!=
-
1
)
{
int
chain_id
=
dma_chan
[
ch
].
chain_id
;
dma_chan
[
ch
].
state
=
DMA_CH_NOTSTARTED
;
if
(
p
->
dma_read
(
CLNK_CTRL
,
ch
)
&
(
1
<<
15
))
dma_chan
[
dma_chan
[
ch
].
next_linked_ch
].
state
=
DMA_CH_STARTED
;
if
(
dma_linked_lch
[
chain_id
].
chain_mode
==
OMAP_DMA_DYNAMIC_CHAIN
)
disable_lnk
(
ch
);
if
(
!
OMAP_DMA_CHAIN_QEMPTY
(
chain_id
))
OMAP_DMA_CHAIN_INCQHEAD
(
chain_id
);
status
=
p
->
dma_read
(
CSR
,
ch
);
p
->
dma_write
(
status
,
CSR
,
ch
);
}
if
(
likely
(
dma_chan
[
ch
].
callback
!=
NULL
))
dma_chan
[
ch
].
callback
(
ch
,
status
,
dma_chan
[
ch
].
data
);
return
0
;
}
/* STATUS register count is from 1-32 while our is 0-31 */
static
irqreturn_t
omap2_dma_irq_handler
(
int
irq
,
void
*
dev_id
)
{
u32
val
,
enable_reg
;
int
i
;
val
=
p
->
dma_read
(
IRQSTATUS_L0
,
0
);
if
(
val
==
0
)
{
if
(
printk_ratelimit
())
printk
(
KERN_WARNING
"Spurious DMA IRQ
\n
"
);
return
IRQ_HANDLED
;
}
enable_reg
=
p
->
dma_read
(
IRQENABLE_L0
,
0
);
val
&=
enable_reg
;
/* Dispatch only relevant interrupts */
for
(
i
=
0
;
i
<
dma_lch_count
&&
val
!=
0
;
i
++
)
{
if
(
val
&
1
)
omap2_dma_handle_ch
(
i
);
val
>>=
1
;
}
return
IRQ_HANDLED
;
}
static
struct
irqaction
omap24xx_dma_irq
=
{
.
name
=
"DMA"
,
.
handler
=
omap2_dma_irq_handler
,
};
#else
static
struct
irqaction
omap24xx_dma_irq
;
#endif
/*----------------------------------------------------------------------------*/
/*
* Note that we are currently using only IRQENABLE_L0 and L1.
* As the DSP may be using IRQENABLE_L2 and L3, let's not
* touch those for now.
*/
void
omap_dma_global_context_save
(
void
)
{
omap_dma_global_context
.
dma_irqenable_l0
=
p
->
dma_read
(
IRQENABLE_L0
,
0
);
omap_dma_global_context
.
dma_irqenable_l1
=
p
->
dma_read
(
IRQENABLE_L1
,
0
);
omap_dma_global_context
.
dma_ocp_sysconfig
=
p
->
dma_read
(
OCP_SYSCONFIG
,
0
);
omap_dma_global_context
.
dma_gcr
=
p
->
dma_read
(
GCR
,
0
);
}
void
omap_dma_global_context_restore
(
void
)
{
int
ch
;
p
->
dma_write
(
omap_dma_global_context
.
dma_gcr
,
GCR
,
0
);
p
->
dma_write
(
omap_dma_global_context
.
dma_ocp_sysconfig
,
OCP_SYSCONFIG
,
0
);
p
->
dma_write
(
omap_dma_global_context
.
dma_irqenable_l0
,
IRQENABLE_L0
,
0
);
p
->
dma_write
(
omap_dma_global_context
.
dma_irqenable_l1
,
IRQENABLE_L1
,
0
);
if
(
IS_DMA_ERRATA
(
DMA_ROMCODE_BUG
))
p
->
dma_write
(
0x3
,
IRQSTATUS_L0
,
0
);
for
(
ch
=
0
;
ch
<
dma_chan_count
;
ch
++
)
if
(
dma_chan
[
ch
].
dev_id
!=
-
1
)
omap_clear_dma
(
ch
);
}
struct
omap_system_dma_plat_info
*
omap_get_plat_info
(
void
)
{
return
p
;
...
...
@@ -1286,7 +877,6 @@ static int omap_system_dma_probe(struct platform_device *pdev)
int
ch
,
ret
=
0
;
int
dma_irq
;
char
irq_name
[
4
];
int
irq_rel
;
p
=
pdev
->
dev
.
platform_data
;
if
(
!
p
)
{
...
...
@@ -1312,21 +902,9 @@ static int omap_system_dma_probe(struct platform_device *pdev)
if
(
!
dma_chan
)
return
-
ENOMEM
;
if
(
dma_omap2plus
())
{
dma_linked_lch
=
kcalloc
(
dma_lch_count
,
sizeof
(
*
dma_linked_lch
),
GFP_KERNEL
);
if
(
!
dma_linked_lch
)
{
ret
=
-
ENOMEM
;
goto
exit_dma_lch_fail
;
}
}
spin_lock_init
(
&
dma_chan_lock
);
for
(
ch
=
0
;
ch
<
dma_chan_count
;
ch
++
)
{
omap_clear_dma
(
ch
);
if
(
dma_omap2plus
())
omap2_disable_irq_lch
(
ch
);
dma_chan
[
ch
].
dev_id
=
-
1
;
dma_chan
[
ch
].
next_lch
=
-
1
;
...
...
@@ -1359,26 +937,6 @@ static int omap_system_dma_probe(struct platform_device *pdev)
}
}
if
(
d
->
dev_caps
&
IS_RW_PRIORITY
)
omap_dma_set_global_params
(
DMA_DEFAULT_ARB_RATE
,
DMA_DEFAULT_FIFO_DEPTH
,
0
);
if
(
dma_omap2plus
()
&&
!
(
d
->
dev_caps
&
DMA_ENGINE_HANDLE_IRQ
))
{
strcpy
(
irq_name
,
"0"
);
dma_irq
=
platform_get_irq_byname
(
pdev
,
irq_name
);
if
(
dma_irq
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"failed: request IRQ %d"
,
dma_irq
);
ret
=
dma_irq
;
goto
exit_dma_lch_fail
;
}
ret
=
setup_irq
(
dma_irq
,
&
omap24xx_dma_irq
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"set_up failed for IRQ %d for DMA (error %d)
\n
"
,
dma_irq
,
ret
);
goto
exit_dma_lch_fail
;
}
}
/* reserve dma channels 0 and 1 in high security devices on 34xx */
if
(
d
->
dev_caps
&
HS_CHANNELS_RESERVED
)
{
pr_info
(
"Reserving DMA channels 0 and 1 for HS ROM code
\n
"
);
...
...
@@ -1389,34 +947,21 @@ static int omap_system_dma_probe(struct platform_device *pdev)
return
0
;
exit_dma_irq_fail:
dev_err
(
&
pdev
->
dev
,
"unable to request IRQ %d for DMA (error %d)
\n
"
,
dma_irq
,
ret
);
for
(
irq_rel
=
0
;
irq_rel
<
ch
;
irq_rel
++
)
{
dma_irq
=
platform_get_irq
(
pdev
,
irq_rel
);
free_irq
(
dma_irq
,
(
void
*
)(
irq_rel
+
1
));
}
exit_dma_lch_fail:
return
ret
;
}
static
int
omap_system_dma_remove
(
struct
platform_device
*
pdev
)
{
int
dma_irq
;
int
dma_irq
,
irq_rel
=
0
;
if
(
dma_omap2plus
())
{
char
irq_name
[
4
];
strcpy
(
irq_name
,
"0"
);
dma_irq
=
platform_get_irq_byname
(
pdev
,
irq_name
);
if
(
dma_irq
>=
0
)
remove_irq
(
dma_irq
,
&
omap24xx_dma_irq
);
}
else
{
int
irq_rel
=
0
;
for
(
;
irq_rel
<
dma_chan_count
;
irq_rel
++
)
{
dma_irq
=
platform_get_irq
(
pdev
,
irq_rel
);
free_irq
(
dma_irq
,
(
void
*
)(
irq_rel
+
1
));
}
if
(
dma_omap2plus
())
return
0
;
for
(
;
irq_rel
<
dma_chan_count
;
irq_rel
++
)
{
dma_irq
=
platform_get_irq
(
pdev
,
irq_rel
);
free_irq
(
dma_irq
,
(
void
*
)(
irq_rel
+
1
));
}
return
0
;
}
...
...
drivers/dma/ti/omap-dma.c
View file @
9fc85a71
...
...
@@ -2,6 +2,7 @@
/*
* OMAP DMAengine support
*/
#include <linux/cpu_pm.h>
#include <linux/delay.h>
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
...
...
@@ -23,12 +24,33 @@
#define OMAP_SDMA_REQUESTS 127
#define OMAP_SDMA_CHANNELS 32
struct
omap_dma_config
{
int
lch_end
;
unsigned
int
rw_priority
:
1
;
unsigned
int
needs_busy_check
:
1
;
unsigned
int
may_lose_context
:
1
;
unsigned
int
needs_lch_clear
:
1
;
};
struct
omap_dma_context
{
u32
irqenable_l0
;
u32
irqenable_l1
;
u32
ocp_sysconfig
;
u32
gcr
;
};
struct
omap_dmadev
{
struct
dma_device
ddev
;
spinlock_t
lock
;
void
__iomem
*
base
;
const
struct
omap_dma_reg
*
reg_map
;
struct
omap_system_dma_plat_info
*
plat
;
const
struct
omap_dma_config
*
cfg
;
struct
notifier_block
nb
;
struct
omap_dma_context
context
;
int
lch_count
;
DECLARE_BITMAP
(
lch_bitmap
,
OMAP_SDMA_CHANNELS
);
struct
mutex
lch_lock
;
/* for assigning logical channels */
bool
legacy
;
bool
ll123_supported
;
struct
dma_pool
*
desc_pool
;
...
...
@@ -376,6 +398,19 @@ static unsigned omap_dma_get_csr(struct omap_chan *c)
return
val
;
}
static
void
omap_dma_clear_lch
(
struct
omap_dmadev
*
od
,
int
lch
)
{
struct
omap_chan
*
c
;
int
i
;
c
=
od
->
lch_map
[
lch
];
if
(
!
c
)
return
;
for
(
i
=
CSDP
;
i
<=
od
->
cfg
->
lch_end
;
i
++
)
omap_dma_chan_write
(
c
,
i
,
0
);
}
static
void
omap_dma_assign
(
struct
omap_dmadev
*
od
,
struct
omap_chan
*
c
,
unsigned
lch
)
{
...
...
@@ -633,6 +668,37 @@ static irqreturn_t omap_dma_irq(int irq, void *devid)
return
IRQ_HANDLED
;
}
static
int
omap_dma_get_lch
(
struct
omap_dmadev
*
od
,
int
*
lch
)
{
int
channel
;
mutex_lock
(
&
od
->
lch_lock
);
channel
=
find_first_zero_bit
(
od
->
lch_bitmap
,
od
->
lch_count
);
if
(
channel
>=
od
->
lch_count
)
goto
out_busy
;
set_bit
(
channel
,
od
->
lch_bitmap
);
mutex_unlock
(
&
od
->
lch_lock
);
omap_dma_clear_lch
(
od
,
channel
);
*
lch
=
channel
;
return
0
;
out_busy:
mutex_unlock
(
&
od
->
lch_lock
);
*
lch
=
-
EINVAL
;
return
-
EBUSY
;
}
static
void
omap_dma_put_lch
(
struct
omap_dmadev
*
od
,
int
lch
)
{
omap_dma_clear_lch
(
od
,
lch
);
mutex_lock
(
&
od
->
lch_lock
);
clear_bit
(
lch
,
od
->
lch_bitmap
);
mutex_unlock
(
&
od
->
lch_lock
);
}
static
int
omap_dma_alloc_chan_resources
(
struct
dma_chan
*
chan
)
{
struct
omap_dmadev
*
od
=
to_omap_dma_dev
(
chan
->
device
);
...
...
@@ -644,8 +710,7 @@ static int omap_dma_alloc_chan_resources(struct dma_chan *chan)
ret
=
omap_request_dma
(
c
->
dma_sig
,
"DMA engine"
,
omap_dma_callback
,
c
,
&
c
->
dma_ch
);
}
else
{
ret
=
omap_request_dma
(
c
->
dma_sig
,
"DMA engine"
,
NULL
,
NULL
,
&
c
->
dma_ch
);
ret
=
omap_dma_get_lch
(
od
,
&
c
->
dma_ch
);
}
dev_dbg
(
dev
,
"allocating channel %u for %u
\n
"
,
c
->
dma_ch
,
c
->
dma_sig
);
...
...
@@ -702,7 +767,11 @@ static void omap_dma_free_chan_resources(struct dma_chan *chan)
c
->
channel_base
=
NULL
;
od
->
lch_map
[
c
->
dma_ch
]
=
NULL
;
vchan_free_chan_resources
(
&
c
->
vc
);
omap_free_dma
(
c
->
dma_ch
);
if
(
od
->
legacy
)
omap_free_dma
(
c
->
dma_ch
);
else
omap_dma_put_lch
(
od
,
c
->
dma_ch
);
dev_dbg
(
od
->
ddev
.
dev
,
"freeing channel %u used for %u
\n
"
,
c
->
dma_ch
,
c
->
dma_sig
);
...
...
@@ -1453,16 +1522,128 @@ static void omap_dma_free(struct omap_dmadev *od)
}
}
/* Currently only used for omap2. For omap1, also a check for lcd_dma is needed */
static
int
omap_dma_busy_notifier
(
struct
notifier_block
*
nb
,
unsigned
long
cmd
,
void
*
v
)
{
struct
omap_dmadev
*
od
;
struct
omap_chan
*
c
;
int
lch
=
-
1
;
od
=
container_of
(
nb
,
struct
omap_dmadev
,
nb
);
switch
(
cmd
)
{
case
CPU_CLUSTER_PM_ENTER
:
while
(
1
)
{
lch
=
find_next_bit
(
od
->
lch_bitmap
,
od
->
lch_count
,
lch
+
1
);
if
(
lch
>=
od
->
lch_count
)
break
;
c
=
od
->
lch_map
[
lch
];
if
(
!
c
)
continue
;
if
(
omap_dma_chan_read
(
c
,
CCR
)
&
CCR_ENABLE
)
return
NOTIFY_BAD
;
}
break
;
case
CPU_CLUSTER_PM_ENTER_FAILED
:
case
CPU_CLUSTER_PM_EXIT
:
break
;
}
return
NOTIFY_OK
;
}
/*
* We are using IRQENABLE_L1, and legacy DMA code was using IRQENABLE_L0.
* As the DSP may be using IRQENABLE_L2 and L3, let's not touch those for
* now. Context save seems to be only currently needed on omap3.
*/
static
void
omap_dma_context_save
(
struct
omap_dmadev
*
od
)
{
od
->
context
.
irqenable_l0
=
omap_dma_glbl_read
(
od
,
IRQENABLE_L0
);
od
->
context
.
irqenable_l1
=
omap_dma_glbl_read
(
od
,
IRQENABLE_L1
);
od
->
context
.
ocp_sysconfig
=
omap_dma_glbl_read
(
od
,
OCP_SYSCONFIG
);
od
->
context
.
gcr
=
omap_dma_glbl_read
(
od
,
GCR
);
}
static
void
omap_dma_context_restore
(
struct
omap_dmadev
*
od
)
{
int
i
;
omap_dma_glbl_write
(
od
,
GCR
,
od
->
context
.
gcr
);
omap_dma_glbl_write
(
od
,
OCP_SYSCONFIG
,
od
->
context
.
ocp_sysconfig
);
omap_dma_glbl_write
(
od
,
IRQENABLE_L0
,
od
->
context
.
irqenable_l0
);
omap_dma_glbl_write
(
od
,
IRQENABLE_L1
,
od
->
context
.
irqenable_l1
);
/* Clear IRQSTATUS_L0 as legacy DMA code is no longer doing it */
if
(
od
->
plat
->
errata
&
DMA_ROMCODE_BUG
)
omap_dma_glbl_write
(
od
,
IRQSTATUS_L0
,
0
);
/* Clear dma channels */
for
(
i
=
0
;
i
<
od
->
lch_count
;
i
++
)
omap_dma_clear_lch
(
od
,
i
);
}
/* Currently only used for omap3 */
static
int
omap_dma_context_notifier
(
struct
notifier_block
*
nb
,
unsigned
long
cmd
,
void
*
v
)
{
struct
omap_dmadev
*
od
;
od
=
container_of
(
nb
,
struct
omap_dmadev
,
nb
);
switch
(
cmd
)
{
case
CPU_CLUSTER_PM_ENTER
:
omap_dma_context_save
(
od
);
break
;
case
CPU_CLUSTER_PM_ENTER_FAILED
:
case
CPU_CLUSTER_PM_EXIT
:
omap_dma_context_restore
(
od
);
break
;
}
return
NOTIFY_OK
;
}
static
void
omap_dma_init_gcr
(
struct
omap_dmadev
*
od
,
int
arb_rate
,
int
max_fifo_depth
,
int
tparams
)
{
u32
val
;
/* Set only for omap2430 and later */
if
(
!
od
->
cfg
->
rw_priority
)
return
;
if
(
max_fifo_depth
==
0
)
max_fifo_depth
=
1
;
if
(
arb_rate
==
0
)
arb_rate
=
1
;
val
=
0xff
&
max_fifo_depth
;
val
|=
(
0x3
&
tparams
)
<<
12
;
val
|=
(
arb_rate
&
0xff
)
<<
16
;
omap_dma_glbl_write
(
od
,
GCR
,
val
);
}
#define OMAP_DMA_BUSWIDTHS (BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
BIT(DMA_SLAVE_BUSWIDTH_4_BYTES))
/*
* No flags currently set for default configuration as omap1 is still
* using platform data.
*/
static
const
struct
omap_dma_config
default_cfg
;
static
int
omap_dma_probe
(
struct
platform_device
*
pdev
)
{
const
struct
omap_dma_config
*
conf
;
struct
omap_dmadev
*
od
;
struct
resource
*
res
;
int
rc
,
i
,
irq
;
u32
lch_count
;
u32
val
;
od
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
od
),
GFP_KERNEL
);
if
(
!
od
)
...
...
@@ -1473,9 +1654,19 @@ static int omap_dma_probe(struct platform_device *pdev)
if
(
IS_ERR
(
od
->
base
))
return
PTR_ERR
(
od
->
base
);
od
->
plat
=
omap_get_plat_info
();
if
(
!
od
->
plat
)
return
-
EPROBE_DEFER
;
conf
=
of_device_get_match_data
(
&
pdev
->
dev
);
if
(
conf
)
{
od
->
cfg
=
conf
;
od
->
plat
=
dev_get_platdata
(
&
pdev
->
dev
);
if
(
!
od
->
plat
)
dev_warn
(
&
pdev
->
dev
,
"no sdma auxdata needed?
\n
"
);
}
else
{
od
->
cfg
=
&
default_cfg
;
od
->
plat
=
omap_get_plat_info
();
if
(
!
od
->
plat
)
return
-
EPROBE_DEFER
;
}
od
->
reg_map
=
od
->
plat
->
reg_map
;
...
...
@@ -1507,6 +1698,7 @@ static int omap_dma_probe(struct platform_device *pdev)
od
->
ddev
.
max_burst
=
SZ_16M
-
1
;
/* CCEN: 24bit unsigned */
od
->
ddev
.
dev
=
&
pdev
->
dev
;
INIT_LIST_HEAD
(
&
od
->
ddev
.
channels
);
mutex_init
(
&
od
->
lch_lock
);
spin_lock_init
(
&
od
->
lock
);
spin_lock_init
(
&
od
->
irq_lock
);
...
...
@@ -1522,18 +1714,30 @@ static int omap_dma_probe(struct platform_device *pdev)
/* Number of available logical channels */
if
(
!
pdev
->
dev
.
of_node
)
{
lch_count
=
od
->
plat
->
dma_attr
->
lch_count
;
if
(
unlikely
(
!
lch_count
))
lch_count
=
OMAP_SDMA_CHANNELS
;
od
->
lch_count
=
od
->
plat
->
dma_attr
->
lch_count
;
if
(
unlikely
(
!
od
->
lch_count
))
od
->
lch_count
=
OMAP_SDMA_CHANNELS
;
}
else
if
(
of_property_read_u32
(
pdev
->
dev
.
of_node
,
"dma-channels"
,
&
lch_count
))
{
&
od
->
lch_count
))
{
dev_info
(
&
pdev
->
dev
,
"Missing dma-channels property, using %u.
\n
"
,
OMAP_SDMA_CHANNELS
);
lch_count
=
OMAP_SDMA_CHANNELS
;
od
->
lch_count
=
OMAP_SDMA_CHANNELS
;
}
/* Mask of allowed logical channels */
if
(
pdev
->
dev
.
of_node
&&
!
of_property_read_u32
(
pdev
->
dev
.
of_node
,
"dma-channel-mask"
,
&
val
))
{
/* Tag channels not in mask as reserved */
val
=
~
val
;
bitmap_from_arr32
(
od
->
lch_bitmap
,
&
val
,
od
->
lch_count
);
}
if
(
od
->
plat
->
dma_attr
->
dev_caps
&
HS_CHANNELS_RESERVED
)
bitmap_set
(
od
->
lch_bitmap
,
0
,
2
);
od
->
lch_map
=
devm_kcalloc
(
&
pdev
->
dev
,
lch_count
,
sizeof
(
*
od
->
lch_map
),
od
->
lch_map
=
devm_kcalloc
(
&
pdev
->
dev
,
od
->
lch_count
,
sizeof
(
*
od
->
lch_map
),
GFP_KERNEL
);
if
(
!
od
->
lch_map
)
return
-
ENOMEM
;
...
...
@@ -1605,6 +1809,16 @@ static int omap_dma_probe(struct platform_device *pdev)
}
}
omap_dma_init_gcr
(
od
,
DMA_DEFAULT_ARB_RATE
,
DMA_DEFAULT_FIFO_DEPTH
,
0
);
if
(
od
->
cfg
->
needs_busy_check
)
{
od
->
nb
.
notifier_call
=
omap_dma_busy_notifier
;
cpu_pm_register_notifier
(
&
od
->
nb
);
}
else
if
(
od
->
cfg
->
may_lose_context
)
{
od
->
nb
.
notifier_call
=
omap_dma_context_notifier
;
cpu_pm_register_notifier
(
&
od
->
nb
);
}
dev_info
(
&
pdev
->
dev
,
"OMAP DMA engine driver%s
\n
"
,
od
->
ll123_supported
?
" (LinkedList1/2/3 supported)"
:
""
);
...
...
@@ -1616,6 +1830,9 @@ static int omap_dma_remove(struct platform_device *pdev)
struct
omap_dmadev
*
od
=
platform_get_drvdata
(
pdev
);
int
irq
;
if
(
od
->
cfg
->
may_lose_context
)
cpu_pm_unregister_notifier
(
&
od
->
nb
);
if
(
pdev
->
dev
.
of_node
)
of_dma_controller_free
(
pdev
->
dev
.
of_node
);
...
...
@@ -1637,12 +1854,45 @@ static int omap_dma_remove(struct platform_device *pdev)
return
0
;
}
static
const
struct
omap_dma_config
omap2420_data
=
{
.
lch_end
=
CCFN
,
.
rw_priority
=
true
,
.
needs_lch_clear
=
true
,
.
needs_busy_check
=
true
,
};
static
const
struct
omap_dma_config
omap2430_data
=
{
.
lch_end
=
CCFN
,
.
rw_priority
=
true
,
.
needs_lch_clear
=
true
,
};
static
const
struct
omap_dma_config
omap3430_data
=
{
.
lch_end
=
CCFN
,
.
rw_priority
=
true
,
.
needs_lch_clear
=
true
,
.
may_lose_context
=
true
,
};
static
const
struct
omap_dma_config
omap3630_data
=
{
.
lch_end
=
CCDN
,
.
rw_priority
=
true
,
.
needs_lch_clear
=
true
,
.
may_lose_context
=
true
,
};
static
const
struct
omap_dma_config
omap4_data
=
{
.
lch_end
=
CCDN
,
.
rw_priority
=
true
,
.
needs_lch_clear
=
true
,
};
static
const
struct
of_device_id
omap_dma_match
[]
=
{
{
.
compatible
=
"ti,omap2420-sdma"
,
},
{
.
compatible
=
"ti,omap2430-sdma"
,
},
{
.
compatible
=
"ti,omap3430-sdma"
,
},
{
.
compatible
=
"ti,omap3630-sdma"
,
},
{
.
compatible
=
"ti,omap4430-sdma"
,
},
{
.
compatible
=
"ti,omap2420-sdma"
,
.
data
=
&
omap2420_data
,
},
{
.
compatible
=
"ti,omap2430-sdma"
,
.
data
=
&
omap2430_data
,
},
{
.
compatible
=
"ti,omap3430-sdma"
,
.
data
=
&
omap3430_data
,
},
{
.
compatible
=
"ti,omap3630-sdma"
,
.
data
=
&
omap3630_data
,
},
{
.
compatible
=
"ti,omap4430-sdma"
,
.
data
=
&
omap4_data
,
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
omap_dma_match
);
...
...
include/linux/omap-dma.h
View file @
9fc85a71
...
...
@@ -129,7 +129,6 @@
#define IS_WORD_16 BIT(0xd)
#define ENABLE_16XX_MODE BIT(0xe)
#define HS_CHANNELS_RESERVED BIT(0xf)
#define DMA_ENGINE_HANDLE_IRQ BIT(0x10)
/* Defines for DMA Capabilities */
#define DMA_HAS_TRANSPARENT_CAPS (0x1 << 18)
...
...
@@ -239,9 +238,6 @@ struct omap_dma_lch {
void
(
*
callback
)(
int
lch
,
u16
ch_status
,
void
*
data
);
void
*
data
;
long
flags
;
/* required for Dynamic chaining */
int
prev_linked_ch
;
int
next_linked_ch
;
int
state
;
int
chain_id
;
int
status
;
...
...
@@ -303,7 +299,6 @@ extern void omap_set_dma_priority(int lch, int dst_port, int priority);
extern
int
omap_request_dma
(
int
dev_id
,
const
char
*
dev_name
,
void
(
*
callback
)(
int
lch
,
u16
ch_status
,
void
*
data
),
void
*
data
,
int
*
dma_ch
);
extern
void
omap_enable_dma_irq
(
int
ch
,
u16
irq_bits
);
extern
void
omap_disable_dma_irq
(
int
ch
,
u16
irq_bits
);
extern
void
omap_free_dma
(
int
ch
);
extern
void
omap_start_dma
(
int
lch
);
...
...
@@ -312,7 +307,6 @@ extern void omap_set_dma_transfer_params(int lch, int data_type,
int
elem_count
,
int
frame_count
,
int
sync_mode
,
int
dma_trigger
,
int
src_or_dst_synch
);
extern
void
omap_set_dma_write_mode
(
int
lch
,
enum
omap_dma_write_mode
mode
);
extern
void
omap_set_dma_channel_mode
(
int
lch
,
enum
omap_dma_channel_mode
mode
);
extern
void
omap_set_dma_src_params
(
int
lch
,
int
src_port
,
int
src_amode
,
...
...
@@ -329,22 +323,10 @@ extern void omap_set_dma_dest_data_pack(int lch, int enable);
extern
void
omap_set_dma_dest_burst_mode
(
int
lch
,
enum
omap_dma_burst_mode
burst_mode
);
extern
void
omap_set_dma_params
(
int
lch
,
struct
omap_dma_channel_params
*
params
);
extern
void
omap_dma_link_lch
(
int
lch_head
,
int
lch_queue
);
extern
int
omap_set_dma_callback
(
int
lch
,
void
(
*
callback
)(
int
lch
,
u16
ch_status
,
void
*
data
),
void
*
data
);
extern
dma_addr_t
omap_get_dma_src_pos
(
int
lch
);
extern
dma_addr_t
omap_get_dma_dst_pos
(
int
lch
);
extern
int
omap_get_dma_active_status
(
int
lch
);
extern
int
omap_dma_running
(
void
);
extern
void
omap_dma_set_global_params
(
int
arb_rate
,
int
max_fifo_depth
,
int
tparams
);
void
omap_dma_global_context_save
(
void
);
void
omap_dma_global_context_restore
(
void
);
#if defined(CONFIG_ARCH_OMAP1) && IS_ENABLED(CONFIG_FB_OMAP)
#include <mach/lcd_dma.h>
...
...
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