hdmirx: add spin lock when R/D reg [1/1]

PD#SWPL-4073

Problem:
warning of CPU Tainted

Solution:
add spin lock when R/D reg

Verify:
verify by marconi

Change-Id: I8f47666f41c0ba3a010631f5d71416aad0e43beb
Signed-off-by: Lei Yang <lei.yang@amlogic.com>
This commit is contained in:
Lei Yang
2019-01-10 17:32:17 +08:00
committed by Luke Go
parent 97bb7dfb09
commit fd569d18ca
2 changed files with 34 additions and 12 deletions

View File

@@ -46,7 +46,7 @@
*
*
*/
#define RX_VER2 "ver.2019/01/04"
#define RX_VER2 "ver.2019/01/10"
/*print type*/
#define LOG_EN 0x01

View File

@@ -116,8 +116,10 @@ int data;
unsigned long dev_offset = 0x10;
if (rx.chip_id == CHIP_ID_TL1) {
spin_lock_irqsave(&reg_rw_lock, flags);
data = rd_reg(MAP_ADDR_MODULE_TOP,
addr + reg_maps[MAP_ADDR_MODULE_TOP].phy_addr);
spin_unlock_irqrestore(&reg_rw_lock, flags);
} else {
spin_lock_irqsave(&reg_rw_lock, flags);
wr_reg(MAP_ADDR_MODULE_TOP,
@@ -152,8 +154,10 @@ ulong flags;
unsigned int dev_offset = 0x10;
if (rx.chip_id == CHIP_ID_TL1) {
spin_lock_irqsave(&reg_rw_lock, flags);
wr_reg(MAP_ADDR_MODULE_TOP,
addr + reg_maps[MAP_ADDR_MODULE_TOP].phy_addr, data);
spin_unlock_irqrestore(&reg_rw_lock, flags);
} else {
spin_lock_irqsave(&reg_rw_lock, flags);
wr_reg(MAP_ADDR_MODULE_TOP,
@@ -284,6 +288,7 @@ unsigned int hdmirx_rd_top(unsigned int addr)
unsigned int tempaddr = 0;
if (rx.chip_id == CHIP_ID_TL1) {
spin_lock_irqsave(&reg_rw_lock, flags);
dev_offset = TOP_DWC_BASE_OFFSET +
reg_maps[MAP_ADDR_MODULE_TOP].phy_addr;
if ((addr >= TOP_EDID_OFFSET) &&
@@ -296,6 +301,7 @@ unsigned int hdmirx_rd_top(unsigned int addr)
data = rd_reg(MAP_ADDR_MODULE_TOP,
dev_offset + (addr<<2));
}
spin_unlock_irqrestore(&reg_rw_lock, flags);
} else {
data = rd_reg(MAP_ADDR_MODULE_TOP,
dev_offset + (addr<<2));
@@ -335,6 +341,7 @@ void hdmirx_wr_top(unsigned int addr, unsigned int data)
unsigned int tempaddr = 0;
if (rx.chip_id == CHIP_ID_TL1) {
spin_lock_irqsave(&reg_rw_lock, flags);
dev_offset = TOP_DWC_BASE_OFFSET +
reg_maps[MAP_ADDR_MODULE_TOP].phy_addr;
if ((addr >= TOP_EDID_OFFSET) &&
@@ -347,6 +354,7 @@ void hdmirx_wr_top(unsigned int addr, unsigned int data)
wr_reg(MAP_ADDR_MODULE_TOP,
dev_offset + (addr<<2), data);
}
spin_unlock_irqrestore(&reg_rw_lock, flags);
} else {
wr_reg(MAP_ADDR_MODULE_TOP,
dev_offset + (addr<<2), data);
@@ -381,10 +389,16 @@ hdmirx_wr_top(addr, rx_set_bits(hdmirx_rd_top(addr), mask, value));
*/
unsigned int rd_reg_hhi(unsigned int offset)
{
unsigned int addr = offset +
reg_maps[MAP_ADDR_MODULE_HIU].phy_addr;
unsigned int ret;
unsigned long flags;
unsigned int addr;
return rd_reg(MAP_ADDR_MODULE_HIU, addr);
spin_lock_irqsave(&reg_rw_lock, flags);
addr = offset +
reg_maps[MAP_ADDR_MODULE_HIU].phy_addr;
ret = rd_reg(MAP_ADDR_MODULE_HIU, addr);
spin_unlock_irqrestore(&reg_rw_lock, flags);
return ret;
}
/*
@@ -406,9 +420,14 @@ unsigned int rd_reg_hhi_bits(unsigned int offset, unsigned int mask)
*/
void wr_reg_hhi(unsigned int offset, unsigned int val)
{
unsigned int addr = offset +
reg_maps[MAP_ADDR_MODULE_HIU].phy_addr;
wr_reg(MAP_ADDR_MODULE_HIU, addr, val);
unsigned long flags;
unsigned int addr;
spin_lock_irqsave(&reg_rw_lock, flags);
addr = offset +
reg_maps[MAP_ADDR_MODULE_HIU].phy_addr;
wr_reg(MAP_ADDR_MODULE_HIU, addr, val);
spin_unlock_irqrestore(&reg_rw_lock, flags);
}
/*
@@ -714,14 +733,17 @@ void hdmirx_wr_ctl_port(unsigned int offset, unsigned int data)
*/
void hdmirx_top_sw_reset(void)
{
ulong flags;
unsigned long dev_offset = 0;
ulong flags;
unsigned long dev_offset = 0;
spin_lock_irqsave(&reg_rw_lock, flags);
if (rx.chip_id == CHIP_ID_TL1) {
hdmirx_wr_top(TOP_SW_RESET, 1);
dev_offset = TOP_DWC_BASE_OFFSET +
reg_maps[MAP_ADDR_MODULE_TOP].phy_addr;
wr_reg(MAP_ADDR_MODULE_TOP,
dev_offset + TOP_SW_RESET, 1);
udelay(1);
hdmirx_wr_top(TOP_SW_RESET, 0);
wr_reg(MAP_ADDR_MODULE_TOP,
dev_offset + TOP_SW_RESET, 0);
} else {
wr_reg(MAP_ADDR_MODULE_TOP,
hdmirx_addr_port | dev_offset, TOP_SW_RESET);