Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
bff97dde
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bff97dde
编写于
7月 11, 2016
作者:
T
Tom Rini
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.denx.de/u-boot-spi
上级
94fbd3e3
96907c0f
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
450 addition
and
117 deletion
+450
-117
arch/arm/dts/dra7-evm.dts
arch/arm/dts/dra7-evm.dts
+2
-4
arch/arm/dts/dra72-evm.dts
arch/arm/dts/dra72-evm.dts
+2
-4
arch/arm/dts/k2e-evm.dts
arch/arm/dts/k2e-evm.dts
+2
-1
arch/arm/dts/k2g-evm.dts
arch/arm/dts/k2g-evm.dts
+69
-0
arch/arm/dts/k2g.dtsi
arch/arm/dts/k2g.dtsi
+61
-0
arch/arm/dts/k2hk-evm.dts
arch/arm/dts/k2hk-evm.dts
+2
-1
arch/arm/dts/k2l-evm.dts
arch/arm/dts/k2l-evm.dts
+2
-1
arch/arm/dts/keystone.dtsi
arch/arm/dts/keystone.dtsi
+3
-0
cmd/sf.c
cmd/sf.c
+2
-0
common/env_sf.c
common/env_sf.c
+4
-4
configs/k2e_evm_defconfig
configs/k2e_evm_defconfig
+2
-0
configs/k2g_evm_defconfig
configs/k2g_evm_defconfig
+4
-0
configs/k2hk_evm_defconfig
configs/k2hk_evm_defconfig
+2
-0
configs/k2l_evm_defconfig
configs/k2l_evm_defconfig
+2
-0
drivers/core/device.c
drivers/core/device.c
+11
-0
drivers/spi/cadence_qspi.c
drivers/spi/cadence_qspi.c
+2
-1
drivers/spi/cadence_qspi.h
drivers/spi/cadence_qspi.h
+1
-1
drivers/spi/cadence_qspi_apb.c
drivers/spi/cadence_qspi_apb.c
+7
-8
drivers/spi/davinci_spi.c
drivers/spi/davinci_spi.c
+240
-89
drivers/spi/spi-uclass.c
drivers/spi/spi-uclass.c
+7
-3
include/configs/k2g_evm.h
include/configs/k2g_evm.h
+6
-0
include/configs/ti_armv7_keystone2.h
include/configs/ti_armv7_keystone2.h
+4
-0
include/dm/device.h
include/dm/device.h
+13
-0
未找到文件。
arch/arm/dts/dra7-evm.dts
浏览文件 @
bff97dde
...
...
@@ -491,15 +491,13 @@
pinctrl
-
names
=
"default"
;
pinctrl
-
0
=
<&
qspi1_pins
>;
spi
-
max
-
frequency
=
<
48
000000
>;
spi
-
max
-
frequency
=
<
64
000000
>;
m25p80
@
0
{
compatible
=
"s25fl256s1"
,
"spi-flash"
;
spi
-
max
-
frequency
=
<
48
000000
>;
spi
-
max
-
frequency
=
<
64
000000
>;
reg
=
<
0
>;
spi
-
tx
-
bus
-
width
=
<
1
>;
spi
-
rx
-
bus
-
width
=
<
4
>;
spi
-
cpol
;
spi
-
cpha
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
...
...
arch/arm/dts/dra72-evm.dts
浏览文件 @
bff97dde
...
...
@@ -603,15 +603,13 @@
pinctrl
-
names
=
"default"
;
pinctrl
-
0
=
<&
qspi1_pins
>;
spi
-
max
-
frequency
=
<
48
000000
>;
spi
-
max
-
frequency
=
<
64
000000
>;
m25p80
@
0
{
compatible
=
"s25fl256s1"
,
"spi-flash"
;
spi
-
max
-
frequency
=
<
48
000000
>;
spi
-
max
-
frequency
=
<
64
000000
>;
reg
=
<
0
>;
spi
-
tx
-
bus
-
width
=
<
1
>;
spi
-
rx
-
bus
-
width
=
<
4
>;
spi
-
cpol
;
spi
-
cpha
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
...
...
arch/arm/dts/k2e-evm.dts
浏览文件 @
bff97dde
...
...
@@ -119,10 +119,11 @@
};
&
spi0
{
status
=
"okay"
;
nor_flash
:
n25q128a11
@
0
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
compatible
=
"Micron,n25q128a11"
;
compatible
=
"Micron,n25q128a11"
,
"spi-flash"
;
spi
-
max
-
frequency
=
<
54000000
>;
m25p
,
fast
-
read
;
reg
=
<
0
>;
...
...
arch/arm/dts/k2g-evm.dts
浏览文件 @
bff97dde
...
...
@@ -31,3 +31,72 @@
&
gbe0
{
phy
-
handle
=
<&
ethphy0
>;
};
&
spi1
{
status
=
"okay"
;
spi_nor
:
flash
@
0
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
compatible
=
"spi-flash"
;
spi
-
max
-
frequency
=
<
50000000
>;
m25p
,
fast
-
read
;
reg
=
<
0
>;
partition
@
0
{
label
=
"u-boot-spl"
;
reg
=
<
0x0
0x80000
>;
read
-
only
;
};
partition
@
1
{
label
=
"misc"
;
reg
=
<
0x80000
0xf80000
>;
};
};
};
&
qspi
{
status
=
"okay"
;
flash0
:
m25p80
@
0
{
compatible
=
"s25fl512s"
,
"spi-flash"
;
reg
=
<
0
>;
spi
-
tx
-
bus
-
width
=
<
1
>;
spi
-
rx
-
bus
-
width
=
<
4
>;
spi
-
max
-
frequency
=
<
96000000
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
tshsl
-
ns
=
<
392
>;
tsd2d
-
ns
=
<
392
>;
tchsh
-
ns
=
<
100
>;
tslch
-
ns
=
<
100
>;
block
-
size
=
<
18
>;
partition
@
0
{
label
=
"QSPI.u-boot-spl-os"
;
reg
=
<
0x00000000
0x00100000
>;
};
partition
@
1
{
label
=
"QSPI.u-boot-env"
;
reg
=
<
0x00100000
0x00040000
>;
};
partition
@
2
{
label
=
"QSPI.skern"
;
reg
=
<
0x00140000
0x0040000
>;
};
partition
@
3
{
label
=
"QSPI.pmmc-firmware"
;
reg
=
<
0x00180000
0x0040000
>;
};
partition
@
4
{
label
=
"QSPI.kernel"
;
reg
=
<
0x001C0000
0x0800000
>;
};
partition
@
5
{
label
=
"QSPI.file-system"
;
reg
=
<
0x009C0000
0x3640000
>;
};
};
};
arch/arm/dts/k2g.dtsi
浏览文件 @
bff97dde
...
...
@@ -19,6 +19,11 @@
aliases
{
serial0
=
&
uart0
;
spi0
=
&
spi0
;
spi1
=
&
spi1
;
spi2
=
&
spi2
;
spi3
=
&
spi3
;
spi4
=
&
qspi
;
};
memory
{
...
...
@@ -80,6 +85,19 @@
bus_freq
=
<
2500000
>;
};
qspi
:
qspi
@
2940000
{
compatible
=
"cadence,qspi"
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
reg
=
<
0x02940000
0x1000
>,
<
0x24000000
0x4000000
>;
interrupts
=
<
GIC_SPI
198
IRQ_TYPE_EDGE_RISING
>;
num
-
cs
=
<
4
>;
fifo
-
depth
=
<
256
>;
sram
-
size
=
<
256
>;
status
=
"disabled"
;
};
#
include
"k2g-netcp.dtsi"
pmmc
:
pmmc
@
2900000
{
...
...
@@ -88,5 +106,48 @@
ti
,
lpsc_module
=
<
1
>;
};
spi0
:
spi
@
21805400
{
compatible
=
"ti,keystone-spi"
,
"ti,dm6441-spi"
;
reg
=
<
0x21805400
0x200
>;
num
-
cs
=
<
4
>;
ti
,
davinci
-
spi
-
intr
-
line
=
<
0
>;
interrupts
=
<
GIC_SPI
64
IRQ_TYPE_EDGE_RISING
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
status
=
"disabled"
;
};
spi1
:
spi
@
21805800
{
compatible
=
"ti,keystone-spi"
,
"ti,dm6441-spi"
;
reg
=
<
0x21805800
0x200
>;
num
-
cs
=
<
4
>;
ti
,
davinci
-
spi
-
intr
-
line
=
<
0
>;
interrupts
=
<
GIC_SPI
66
IRQ_TYPE_EDGE_RISING
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
status
=
"disabled"
;
};
spi2
:
spi
@
21805
c00
{
compatible
=
"ti,keystone-spi"
,
"ti,dm6441-spi"
;
reg
=
<
0x21805C00
0x200
>;
num
-
cs
=
<
4
>;
ti
,
davinci
-
spi
-
intr
-
line
=
<
0
>;
interrupts
=
<
GIC_SPI
68
IRQ_TYPE_EDGE_RISING
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
status
=
"disabled"
;
};
spi3
:
spi
@
21806000
{
compatible
=
"ti,keystone-spi"
,
"ti,dm6441-spi"
;
reg
=
<
0x21806000
0x200
>;
num
-
cs
=
<
4
>;
ti
,
davinci
-
spi
-
intr
-
line
=
<
0
>;
interrupts
=
<
GIC_SPI
70
IRQ_TYPE_EDGE_RISING
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
status
=
"disabled"
;
};
};
};
arch/arm/dts/k2hk-evm.dts
浏览文件 @
bff97dde
...
...
@@ -147,10 +147,11 @@
};
&
spi0
{
status
=
"okay"
;
nor_flash
:
n25q128a11
@
0
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
compatible
=
"Micron,n25q128a11"
;
compatible
=
"Micron,n25q128a11"
,
"spi-flash"
;
spi
-
max
-
frequency
=
<
54000000
>;
m25p
,
fast
-
read
;
reg
=
<
0
>;
...
...
arch/arm/dts/k2l-evm.dts
浏览文件 @
bff97dde
...
...
@@ -96,10 +96,11 @@
};
&
spi0
{
status
=
"okay"
;
nor_flash
:
n25q128a11
@
0
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
compatible
=
"Micron,n25q128a11"
;
compatible
=
"Micron,n25q128a11"
,
"spi-flash"
;
spi
-
max
-
frequency
=
<
54000000
>;
m25p
,
fast
-
read
;
reg
=
<
0
>;
...
...
arch/arm/dts/keystone.dtsi
浏览文件 @
bff97dde
...
...
@@ -19,6 +19,9 @@
aliases
{
serial0
=
&
uart0
;
spi0
=
&
spi0
;
spi1
=
&
spi1
;
spi2
=
&
spi2
;
};
chosen
{
...
...
cmd/sf.c
浏览文件 @
bff97dde
...
...
@@ -88,6 +88,8 @@ static int do_spi_flash_probe(int argc, char * const argv[])
#ifdef CONFIG_DM_SPI_FLASH
struct
udevice
*
new
,
*
bus_dev
;
int
ret
;
/* In DM mode defaults will be taken from DT */
speed
=
0
,
mode
=
0
;
#else
struct
spi_flash
*
new
;
#endif
...
...
common/env_sf.c
浏览文件 @
bff97dde
...
...
@@ -55,9 +55,9 @@ int saveenv(void)
#ifdef CONFIG_DM_SPI_FLASH
struct
udevice
*
new
;
/* speed and mode will be read from DT */
ret
=
spi_flash_probe_bus_cs
(
CONFIG_ENV_SPI_BUS
,
CONFIG_ENV_SPI_CS
,
CONFIG_ENV_SPI_MAX_HZ
,
CONFIG_ENV_SPI_MODE
,
&
new
);
0
,
0
,
&
new
);
if
(
ret
)
{
set_default_env
(
"!spi_flash_probe_bus_cs() failed"
);
return
1
;
...
...
@@ -245,9 +245,9 @@ int saveenv(void)
#ifdef CONFIG_DM_SPI_FLASH
struct
udevice
*
new
;
/* speed and mode will be read from DT */
ret
=
spi_flash_probe_bus_cs
(
CONFIG_ENV_SPI_BUS
,
CONFIG_ENV_SPI_CS
,
CONFIG_ENV_SPI_MAX_HZ
,
CONFIG_ENV_SPI_MODE
,
&
new
);
0
,
0
,
&
new
);
if
(
ret
)
{
set_default_env
(
"!spi_flash_probe_bus_cs() failed"
);
return
1
;
...
...
configs/k2e_evm_defconfig
浏览文件 @
bff97dde
...
...
@@ -28,6 +28,8 @@ CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
CONFIG_DM=y
CONFIG_TI_AEMIF=y
CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DM_ETH=y
...
...
configs/k2g_evm_defconfig
浏览文件 @
bff97dde
...
...
@@ -27,6 +27,8 @@ CONFIG_CMD_FAT=y
CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
CONFIG_DM=y
CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DM_ETH=y
...
...
@@ -35,3 +37,5 @@ CONFIG_SYS_NS16550=y
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DWC3=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_BAR=y
configs/k2hk_evm_defconfig
浏览文件 @
bff97dde
...
...
@@ -28,6 +28,8 @@ CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
CONFIG_DM=y
CONFIG_TI_AEMIF=y
CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DM_ETH=y
...
...
configs/k2l_evm_defconfig
浏览文件 @
bff97dde
...
...
@@ -28,6 +28,8 @@ CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
CONFIG_DM=y
CONFIG_TI_AEMIF=y
CONFIG_DM_SPI=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DM_ETH=y
...
...
drivers/core/device.c
浏览文件 @
bff97dde
...
...
@@ -10,6 +10,7 @@
*/
#include <common.h>
#include <asm/io.h>
#include <fdtdec.h>
#include <fdt_support.h>
#include <malloc.h>
...
...
@@ -697,6 +698,16 @@ void *dev_get_addr_ptr(struct udevice *dev)
return
(
void
*
)(
uintptr_t
)
dev_get_addr_index
(
dev
,
0
);
}
void
*
dev_map_physmem
(
struct
udevice
*
dev
,
unsigned
long
size
)
{
fdt_addr_t
addr
=
dev_get_addr
(
dev
);
if
(
addr
==
FDT_ADDR_T_NONE
)
return
NULL
;
return
map_physmem
(
addr
,
size
,
MAP_NOCACHE
);
}
bool
device_has_children
(
struct
udevice
*
dev
)
{
return
!
list_empty
(
&
dev
->
child_head
);
...
...
drivers/spi/cadence_qspi.c
浏览文件 @
bff97dde
...
...
@@ -191,6 +191,7 @@ static int cadence_spi_xfer(struct udevice *dev, unsigned int bitlen,
struct
udevice
*
bus
=
dev
->
parent
;
struct
cadence_spi_platdata
*
plat
=
bus
->
platdata
;
struct
cadence_spi_priv
*
priv
=
dev_get_priv
(
bus
);
struct
dm_spi_slave_platdata
*
dm_plat
=
dev_get_parent_platdata
(
dev
);
void
*
base
=
priv
->
regbase
;
u8
*
cmd_buf
=
priv
->
cmd_buf
;
size_t
data_bytes
;
...
...
@@ -250,7 +251,7 @@ static int cadence_spi_xfer(struct udevice *dev, unsigned int bitlen,
break
;
case
CQSPI_INDIRECT_READ
:
err
=
cadence_qspi_apb_indirect_read_setup
(
plat
,
priv
->
cmd_len
,
cmd_buf
);
priv
->
cmd_len
,
dm_plat
->
mode_rx
,
cmd_buf
);
if
(
!
err
)
{
err
=
cadence_qspi_apb_indirect_read_execute
(
plat
,
data_bytes
,
din
);
...
...
drivers/spi/cadence_qspi.h
浏览文件 @
bff97dde
...
...
@@ -53,7 +53,7 @@ int cadence_qspi_apb_command_write(void *reg_base_addr,
unsigned
int
txlen
,
const
u8
*
txbuf
);
int
cadence_qspi_apb_indirect_read_setup
(
struct
cadence_spi_platdata
*
plat
,
unsigned
int
cmdlen
,
const
u8
*
cmdbuf
);
unsigned
int
cmdlen
,
unsigned
int
rx_width
,
const
u8
*
cmdbuf
);
int
cadence_qspi_apb_indirect_read_execute
(
struct
cadence_spi_platdata
*
plat
,
unsigned
int
rxlen
,
u8
*
rxbuf
);
int
cadence_qspi_apb_indirect_write_setup
(
struct
cadence_spi_platdata
*
plat
,
...
...
drivers/spi/cadence_qspi_apb.c
浏览文件 @
bff97dde
...
...
@@ -29,6 +29,7 @@
#include <asm/io.h>
#include <asm/errno.h>
#include <wait_bit.h>
#include <spi.h>
#include "cadence_qspi.h"
#define CQSPI_REG_POLL_US (1)
/* 1us */
...
...
@@ -45,7 +46,6 @@
#define CQSPI_INST_TYPE_QUAD (2)
#define CQSPI_STIG_DATA_LEN_MAX (8)
#define CQSPI_INDIRECTTRIGGER_ADDR_MASK (0xFFFFF)
#define CQSPI_DUMMY_CLKS_PER_BYTE (8)
#define CQSPI_DUMMY_BYTES_MAX (4)
...
...
@@ -549,7 +549,7 @@ int cadence_qspi_apb_command_write(void *reg_base, unsigned int cmdlen,
/* Opcode + Address (3/4 bytes) + dummy bytes (0-4 bytes) */
int
cadence_qspi_apb_indirect_read_setup
(
struct
cadence_spi_platdata
*
plat
,
unsigned
int
cmdlen
,
const
u8
*
cmdbuf
)
unsigned
int
cmdlen
,
unsigned
int
rx_width
,
const
u8
*
cmdbuf
)
{
unsigned
int
reg
;
unsigned
int
rd_reg
;
...
...
@@ -573,16 +573,15 @@ int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,
addr_bytes
=
cmdlen
-
1
;
/* Setup the indirect trigger address */
writel
((
(
u32
)
plat
->
ahbbase
&
CQSPI_INDIRECTTRIGGER_ADDR_MASK
)
,
writel
((
u32
)
plat
->
ahbbase
,
plat
->
regbase
+
CQSPI_REG_INDIRECTTRIGGER
);
/* Configure the opcode */
rd_reg
=
cmdbuf
[
0
]
<<
CQSPI_REG_RD_INSTR_OPCODE_LSB
;
#if (CONFIG_SPI_FLASH_QUAD == 1)
/* Instruction and address at DQ0, data at DQ0-3. */
rd_reg
|=
CQSPI_INST_TYPE_QUAD
<<
CQSPI_REG_RD_INSTR_TYPE_DATA_LSB
;
#endif
if
(
rx_width
&
SPI_RX_QUAD
)
/* Instruction and address at DQ0, data at DQ0-3. */
rd_reg
|=
CQSPI_INST_TYPE_QUAD
<<
CQSPI_REG_RD_INSTR_TYPE_DATA_LSB
;
/* Get address */
addr_value
=
cadence_qspi_apb_cmd2addr
(
&
cmdbuf
[
1
],
addr_bytes
);
...
...
@@ -714,7 +713,7 @@ int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
return
-
EINVAL
;
}
/* Setup the indirect trigger address */
writel
((
(
u32
)
plat
->
ahbbase
&
CQSPI_INDIRECTTRIGGER_ADDR_MASK
)
,
writel
((
u32
)
plat
->
ahbbase
,
plat
->
regbase
+
CQSPI_REG_INDIRECTTRIGGER
);
/* Configure the opcode */
...
...
drivers/spi/davinci_spi.c
浏览文件 @
bff97dde
...
...
@@ -14,6 +14,7 @@
#include <malloc.h>
#include <asm/io.h>
#include <asm/arch/hardware.h>
#include <dm.h>
/* SPIGCR0 */
#define SPIGCR0_SPIENA_MASK 0x1
...
...
@@ -51,6 +52,7 @@
/* SPIDEF */
#define SPIDEF_CSDEF0_MASK BIT(0)
#ifndef CONFIG_DM_SPI
#define SPI0_BUS 0
#define SPI0_BASE CONFIG_SYS_SPI_BASE
/*
...
...
@@ -83,6 +85,9 @@
#define SPI2_NUM_CS CONFIG_SYS_SPI2_NUM_CS
#define SPI2_BASE CONFIG_SYS_SPI2_BASE
#endif
#endif
DECLARE_GLOBAL_DATA_PTR
;
/* davinci spi register set */
struct
davinci_spi_regs
{
...
...
@@ -114,16 +119,17 @@ struct davinci_spi_regs {
/* davinci spi slave */
struct
davinci_spi_slave
{
#ifndef CONFIG_DM_SPI
struct
spi_slave
slave
;
#endif
struct
davinci_spi_regs
*
regs
;
unsigned
int
freq
;
unsigned
int
freq
;
/* current SPI bus frequency */
unsigned
int
mode
;
/* current SPI mode used */
u8
num_cs
;
/* total no. of CS available */
u8
cur_cs
;
/* CS of current slave */
bool
half_duplex
;
/* true, if master is half-duplex only */
};
static
inline
struct
davinci_spi_slave
*
to_davinci_spi
(
struct
spi_slave
*
slave
)
{
return
container_of
(
slave
,
struct
davinci_spi_slave
,
slave
);
}
/*
* This functions needs to act like a macro to avoid pipeline reloads in the
* loops below. Use always_inline. This gains us about 160KiB/s and the bloat
...
...
@@ -144,15 +150,14 @@ static inline u32 davinci_spi_xfer_data(struct davinci_spi_slave *ds, u32 data)
return
buf_reg_val
;
}
static
int
davinci_spi_read
(
struct
spi_slave
*
slave
,
unsigned
int
len
,
static
int
davinci_spi_read
(
struct
davinci_spi_slave
*
ds
,
unsigned
int
len
,
u8
*
rxp
,
unsigned
long
flags
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
unsigned
int
data1_reg_val
;
/* enable CS hold, CS[n] and clear the data bits */
data1_reg_val
=
((
1
<<
SPIDAT1_CSHOLD_SHIFT
)
|
(
slave
->
cs
<<
SPIDAT1_CSNR_SHIFT
));
(
ds
->
cur_
cs
<<
SPIDAT1_CSNR_SHIFT
));
/* wait till TXFULL is deasserted */
while
(
readl
(
&
ds
->
regs
->
buf
)
&
SPIBUF_TXFULL_MASK
)
...
...
@@ -175,15 +180,14 @@ static int davinci_spi_read(struct spi_slave *slave, unsigned int len,
return
0
;
}
static
int
davinci_spi_write
(
struct
spi_slave
*
slave
,
unsigned
int
len
,
static
int
davinci_spi_write
(
struct
davinci_spi_slave
*
ds
,
unsigned
int
len
,
const
u8
*
txp
,
unsigned
long
flags
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
unsigned
int
data1_reg_val
;
/* enable CS hold and clear the data bits */
data1_reg_val
=
((
1
<<
SPIDAT1_CSHOLD_SHIFT
)
|
(
slave
->
cs
<<
SPIDAT1_CSNR_SHIFT
));
(
ds
->
cur_
cs
<<
SPIDAT1_CSNR_SHIFT
));
/* wait till TXFULL is deasserted */
while
(
readl
(
&
ds
->
regs
->
buf
)
&
SPIBUF_TXFULL_MASK
)
...
...
@@ -209,16 +213,15 @@ static int davinci_spi_write(struct spi_slave *slave, unsigned int len,
return
0
;
}
#ifndef CONFIG_SPI_HALF_DUPLEX
static
int
davinci_spi_read_write
(
struct
spi_slave
*
slave
,
unsigned
int
len
,
u
8
*
rxp
,
const
u8
*
txp
,
u
nsigned
long
flags
)
static
int
davinci_spi_read_write
(
struct
davinci_spi_slave
*
ds
,
unsigned
int
len
,
u8
*
rxp
,
const
u8
*
txp
,
unsigned
long
flags
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
unsigned
int
data1_reg_val
;
/* enable CS hold and clear the data bits */
data1_reg_val
=
((
1
<<
SPIDAT1_CSHOLD_SHIFT
)
|
(
slave
->
cs
<<
SPIDAT1_CSNR_SHIFT
));
(
ds
->
cur_
cs
<<
SPIDAT1_CSNR_SHIFT
));
/* wait till TXFULL is deasserted */
while
(
readl
(
&
ds
->
regs
->
buf
)
&
SPIBUF_TXFULL_MASK
)
...
...
@@ -237,7 +240,115 @@ static int davinci_spi_read_write(struct spi_slave *slave, unsigned int len,
return
0
;
}
#endif
static
int
__davinci_spi_claim_bus
(
struct
davinci_spi_slave
*
ds
,
int
cs
)
{
unsigned
int
mode
=
0
,
scalar
;
/* Enable the SPI hardware */
writel
(
SPIGCR0_SPIRST_MASK
,
&
ds
->
regs
->
gcr0
);
udelay
(
1000
);
writel
(
SPIGCR0_SPIENA_MASK
,
&
ds
->
regs
->
gcr0
);
/* Set master mode, powered up and not activated */
writel
(
SPIGCR1_MASTER_MASK
|
SPIGCR1_CLKMOD_MASK
,
&
ds
->
regs
->
gcr1
);
/* CS, CLK, SIMO and SOMI are functional pins */
writel
(((
1
<<
cs
)
|
SPIPC0_CLKFUN_MASK
|
SPIPC0_DOFUN_MASK
|
SPIPC0_DIFUN_MASK
),
&
ds
->
regs
->
pc0
);
/* setup format */
scalar
=
((
CONFIG_SYS_SPI_CLK
/
ds
->
freq
)
-
1
)
&
0xFF
;
/*
* Use following format:
* character length = 8,
* MSB shifted out first
*/
if
(
ds
->
mode
&
SPI_CPOL
)
mode
|=
SPI_CPOL
;
if
(
!
(
ds
->
mode
&
SPI_CPHA
))
mode
|=
SPI_CPHA
;
writel
(
8
|
(
scalar
<<
SPIFMT_PRESCALE_SHIFT
)
|
(
mode
<<
SPIFMT_PHASE_SHIFT
),
&
ds
->
regs
->
fmt0
);
/*
* Including a minor delay. No science here. Should be good even with
* no delay
*/
writel
((
50
<<
SPI_C2TDELAY_SHIFT
)
|
(
50
<<
SPI_T2CDELAY_SHIFT
),
&
ds
->
regs
->
delay
);
/* default chip select register */
writel
(
SPIDEF_CSDEF0_MASK
,
&
ds
->
regs
->
def
);
/* no interrupts */
writel
(
0
,
&
ds
->
regs
->
int0
);
writel
(
0
,
&
ds
->
regs
->
lvl
);
/* enable SPI */
writel
((
readl
(
&
ds
->
regs
->
gcr1
)
|
SPIGCR1_SPIENA_MASK
),
&
ds
->
regs
->
gcr1
);
return
0
;
}
static
int
__davinci_spi_release_bus
(
struct
davinci_spi_slave
*
ds
)
{
/* Disable the SPI hardware */
writel
(
SPIGCR0_SPIRST_MASK
,
&
ds
->
regs
->
gcr0
);
return
0
;
}
static
int
__davinci_spi_xfer
(
struct
davinci_spi_slave
*
ds
,
unsigned
int
bitlen
,
const
void
*
dout
,
void
*
din
,
unsigned
long
flags
)
{
unsigned
int
len
;
if
(
bitlen
==
0
)
/* Finish any previously submitted transfers */
goto
out
;
/*
* It's not clear how non-8-bit-aligned transfers are supposed to be
* represented as a stream of bytes...this is a limitation of
* the current SPI interface - here we terminate on receiving such a
* transfer request.
*/
if
(
bitlen
%
8
)
{
/* Errors always terminate an ongoing transfer */
flags
|=
SPI_XFER_END
;
goto
out
;
}
len
=
bitlen
/
8
;
if
(
!
dout
)
return
davinci_spi_read
(
ds
,
len
,
din
,
flags
);
if
(
!
din
)
return
davinci_spi_write
(
ds
,
len
,
dout
,
flags
);
if
(
!
ds
->
half_duplex
)
return
davinci_spi_read_write
(
ds
,
len
,
din
,
dout
,
flags
);
printf
(
"SPI full duplex not supported
\n
"
);
flags
|=
SPI_XFER_END
;
out:
if
(
flags
&
SPI_XFER_END
)
{
u8
dummy
=
0
;
davinci_spi_write
(
ds
,
1
,
&
dummy
,
flags
);
}
return
0
;
}
#ifndef CONFIG_DM_SPI
static
inline
struct
davinci_spi_slave
*
to_davinci_spi
(
struct
spi_slave
*
slave
)
{
return
container_of
(
slave
,
struct
davinci_spi_slave
,
slave
);
}
int
spi_cs_is_valid
(
unsigned
int
bus
,
unsigned
int
cs
)
{
...
...
@@ -313,6 +424,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
}
ds
->
freq
=
max_hz
;
ds
->
mode
=
mode
;
return
&
ds
->
slave
;
}
...
...
@@ -324,104 +436,143 @@ void spi_free_slave(struct spi_slave *slave)
free
(
ds
);
}
int
spi_xfer
(
struct
spi_slave
*
slave
,
unsigned
int
bitlen
,
const
void
*
dout
,
void
*
din
,
unsigned
long
flags
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
ds
->
cur_cs
=
slave
->
cs
;
return
__davinci_spi_xfer
(
ds
,
bitlen
,
dout
,
din
,
flags
);
}
int
spi_claim_bus
(
struct
spi_slave
*
slave
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
unsigned
int
scalar
;
/* Enable the SPI hardware */
writel
(
SPIGCR0_SPIRST_MASK
,
&
ds
->
regs
->
gcr0
);
udelay
(
1000
);
writel
(
SPIGCR0_SPIENA_MASK
,
&
ds
->
regs
->
gcr0
);
#ifdef CONFIG_SPI_HALF_DUPLEX
ds
->
half_duplex
=
true
;
#else
ds
->
half_duplex
=
false
;
#endif
return
__davinci_spi_claim_bus
(
ds
,
ds
->
slave
.
cs
);
}
/* Set master mode, powered up and not activated */
writel
(
SPIGCR1_MASTER_MASK
|
SPIGCR1_CLKMOD_MASK
,
&
ds
->
regs
->
gcr1
);
void
spi_release_bus
(
struct
spi_slave
*
slave
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
/* CS, CLK, SIMO and SOMI are functional pins */
writel
(((
1
<<
slave
->
cs
)
|
SPIPC0_CLKFUN_MASK
|
SPIPC0_DOFUN_MASK
|
SPIPC0_DIFUN_MASK
),
&
ds
->
regs
->
pc0
);
__davinci_spi_release_bus
(
ds
);
}
/* setup format */
scalar
=
((
CONFIG_SYS_SPI_CLK
/
ds
->
freq
)
-
1
)
&
0xFF
;
#else
static
int
davinci_spi_set_speed
(
struct
udevice
*
bus
,
uint
max_hz
)
{
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
bus
);
/*
* Use following format:
* character length = 8,
* clock signal delayed by half clk cycle,
* clock low in idle state - Mode 0,
* MSB shifted out first
*/
writel
(
8
|
(
scalar
<<
SPIFMT_PRESCALE_SHIFT
)
|
(
1
<<
SPIFMT_PHASE_SHIFT
),
&
ds
->
regs
->
fmt0
);
debug
(
"%s speed %u
\n
"
,
__func__
,
max_hz
);
if
(
max_hz
>
CONFIG_SYS_SPI_CLK
/
2
)
return
-
EINVAL
;
/*
* Including a minor delay. No science here. Should be good even with
* no delay
*/
writel
((
50
<<
SPI_C2TDELAY_SHIFT
)
|
(
50
<<
SPI_T2CDELAY_SHIFT
),
&
ds
->
regs
->
delay
);
ds
->
freq
=
max_hz
;
/* default chip select register */
writel
(
SPIDEF_CSDEF0_MASK
,
&
ds
->
regs
->
def
);
return
0
;
}
/* no interrupts */
writel
(
0
,
&
ds
->
regs
->
int0
);
writel
(
0
,
&
ds
->
regs
->
lvl
);
static
int
davinci_spi_set_mode
(
struct
udevice
*
bus
,
uint
mode
)
{
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
bus
);
/* enable SPI */
writel
((
readl
(
&
ds
->
regs
->
gcr1
)
|
SPIGCR1_SPIENA_MASK
),
&
ds
->
regs
->
gcr1
)
;
debug
(
"%s mode %u
\n
"
,
__func__
,
mode
);
ds
->
mode
=
mode
;
return
0
;
}
void
spi_release_bus
(
struct
spi_slave
*
slave
)
static
int
davinci_spi_claim_bus
(
struct
udevice
*
dev
)
{
struct
davinci_spi_slave
*
ds
=
to_davinci_spi
(
slave
);
struct
dm_spi_slave_platdata
*
slave_plat
=
dev_get_parent_platdata
(
dev
);
struct
udevice
*
bus
=
dev
->
parent
;
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
bus
);
if
(
slave_plat
->
cs
>=
ds
->
num_cs
)
{
printf
(
"Invalid SPI chipselect
\n
"
);
return
-
EINVAL
;
}
ds
->
half_duplex
=
slave_plat
->
mode
&
SPI_PREAMBLE
;
/* Disable the SPI hardware */
writel
(
SPIGCR0_SPIRST_MASK
,
&
ds
->
regs
->
gcr0
);
return
__davinci_spi_claim_bus
(
ds
,
slave_plat
->
cs
);
}
int
spi_xfer
(
struct
spi_slave
*
slave
,
unsigned
int
bitlen
,
const
void
*
dout
,
void
*
din
,
unsigned
long
flags
)
static
int
davinci_spi_release_bus
(
struct
udevice
*
dev
)
{
unsigned
int
len
;
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
dev
->
parent
)
;
if
(
bitlen
==
0
)
/* Finish any previously submitted transfers */
goto
out
;
return
__davinci_spi_release_bus
(
ds
);
}
/*
* It's not clear how non-8-bit-aligned transfers are supposed to be
* represented as a stream of bytes...this is a limitation of
* the current SPI interface - here we terminate on receiving such a
* transfer request.
*/
if
(
bitlen
%
8
)
{
/* Errors always terminate an ongoing transfer */
flags
|=
SPI_XFER_END
;
goto
out
;
static
int
davinci_spi_xfer
(
struct
udevice
*
dev
,
unsigned
int
bitlen
,
const
void
*
dout
,
void
*
din
,
unsigned
long
flags
)
{
struct
dm_spi_slave_platdata
*
slave
=
dev_get_parent_platdata
(
dev
);
struct
udevice
*
bus
=
dev
->
parent
;
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
bus
);
if
(
slave
->
cs
>=
ds
->
num_cs
)
{
printf
(
"Invalid SPI chipselect
\n
"
);
return
-
EINVAL
;
}
ds
->
cur_cs
=
slave
->
cs
;
len
=
bitlen
/
8
;
return
__davinci_spi_xfer
(
ds
,
bitlen
,
dout
,
din
,
flags
);
}
if
(
!
dout
)
return
davinci_spi_read
(
slave
,
len
,
din
,
flags
);
else
if
(
!
din
)
return
davinci_spi_write
(
slave
,
len
,
dout
,
flags
);
#ifndef CONFIG_SPI_HALF_DUPLEX
else
return
davinci_spi_read_write
(
slave
,
len
,
din
,
dout
,
flags
);
#else
printf
(
"SPI full duplex transaction requested with "
"CONFIG_SPI_HALF_DUPLEX defined.
\n
"
);
flags
|=
SPI_XFER_END
;
#endif
static
int
davinci_spi_probe
(
struct
udevice
*
bus
)
{
/* Nothing to do */
return
0
;
}
out:
if
(
flags
&
SPI_XFER_END
)
{
u8
dummy
=
0
;
davinci_spi_write
(
slave
,
1
,
&
dummy
,
flags
);
static
int
davinci_ofdata_to_platadata
(
struct
udevice
*
bus
)
{
struct
davinci_spi_slave
*
ds
=
dev_get_priv
(
bus
);
const
void
*
blob
=
gd
->
fdt_blob
;
int
node
=
bus
->
of_offset
;
ds
->
regs
=
dev_map_physmem
(
bus
,
sizeof
(
struct
davinci_spi_regs
));
if
(
!
ds
->
regs
)
{
printf
(
"%s: could not map device address
\n
"
,
__func__
);
return
-
EINVAL
;
}
ds
->
num_cs
=
fdtdec_get_int
(
blob
,
node
,
"num-cs"
,
4
);
return
0
;
}
static
const
struct
dm_spi_ops
davinci_spi_ops
=
{
.
claim_bus
=
davinci_spi_claim_bus
,
.
release_bus
=
davinci_spi_release_bus
,
.
xfer
=
davinci_spi_xfer
,
.
set_speed
=
davinci_spi_set_speed
,
.
set_mode
=
davinci_spi_set_mode
,
};
static
const
struct
udevice_id
davinci_spi_ids
[]
=
{
{
.
compatible
=
"ti,keystone-spi"
},
{
.
compatible
=
"ti,dm6441-spi"
},
{
}
};
U_BOOT_DRIVER
(
davinci_spi
)
=
{
.
name
=
"davinci_spi"
,
.
id
=
UCLASS_SPI
,
.
of_match
=
davinci_spi_ids
,
.
ops
=
&
davinci_spi_ops
,
.
ofdata_to_platdata
=
davinci_ofdata_to_platadata
,
.
priv_auto_alloc_size
=
sizeof
(
struct
davinci_spi_slave
),
.
probe
=
davinci_spi_probe
,
};
#endif
drivers/spi/spi-uclass.c
浏览文件 @
bff97dde
...
...
@@ -278,6 +278,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
struct
udevice
**
busp
,
struct
spi_slave
**
devp
)
{
struct
udevice
*
bus
,
*
dev
;
struct
dm_spi_slave_platdata
*
plat
;
bool
created
=
false
;
int
ret
;
...
...
@@ -294,8 +295,6 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
* SPI flash chip - we will bind to the correct driver.
*/
if
(
ret
==
-
ENODEV
&&
drv_name
)
{
struct
dm_spi_slave_platdata
*
plat
;
debug
(
"%s: Binding new device '%s', busnum=%d, cs=%d, driver=%s
\n
"
,
__func__
,
dev_name
,
busnum
,
cs
,
drv_name
);
ret
=
device_bind_driver
(
bus
,
drv_name
,
dev_name
,
&
dev
);
...
...
@@ -322,6 +321,11 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
slave
->
dev
=
dev
;
}
plat
=
dev_get_parent_platdata
(
dev
);
if
(
!
speed
)
{
speed
=
plat
->
max_hz
;
mode
=
plat
->
mode
;
}
ret
=
spi_set_speed_mode
(
bus
,
speed
,
mode
);
if
(
ret
)
goto
err
;
...
...
@@ -333,7 +337,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
return
0
;
err:
debug
(
"%s: Error path, cre
d
ted=%d, device '%s'
\n
"
,
__func__
,
debug
(
"%s: Error path, cre
a
ted=%d, device '%s'
\n
"
,
__func__
,
created
,
dev
->
name
);
if
(
created
)
{
device_remove
(
dev
);
...
...
include/configs/k2g_evm.h
浏览文件 @
bff97dde
...
...
@@ -73,4 +73,10 @@
#define CONFIG_SF_DEFAULT_BUS 1
#define CONFIG_SF_DEFAULT_CS 0
#ifndef CONFIG_SPL_BUILD
#define CONFIG_CADENCE_QSPI
#define CONFIG_CQSPI_REF_CLK 384000000
#define CONFIG_CQSPI_DECODER 0x0
#endif
#endif
/* __CONFIG_K2G_EVM_H */
include/configs/ti_armv7_keystone2.h
浏览文件 @
bff97dde
...
...
@@ -89,6 +89,10 @@
#define CONFIG_SYS_SPI2
#define CONFIG_SYS_SPI2_BASE KS2_SPI2_BASE
#define CONFIG_SYS_SPI2_NUM_CS 4
#ifdef CONFIG_SPL_BUILD
#undef CONFIG_DM_SPI
#undef CONFIG_DM_SPI_FLASH
#endif
/* Network Configuration */
#define CONFIG_PHYLIB
...
...
include/dm/device.h
浏览文件 @
bff97dde
...
...
@@ -466,6 +466,19 @@ fdt_addr_t dev_get_addr(struct udevice *dev);
*/
void
*
dev_get_addr_ptr
(
struct
udevice
*
dev
);
/**
* dev_map_physmem() - Read device address from reg property of the
* device node and map the address into CPU address
* space.
*
* @dev: Pointer to device
* @size: size of the memory to map
*
* @return mapped address, or NULL if the device does not have reg
* property.
*/
void
*
dev_map_physmem
(
struct
udevice
*
dev
,
unsigned
long
size
);
/**
* dev_get_addr_index() - Get the indexed reg property of a device
*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录