video-driver: Move register manipulation functions
Move register manipulation functions in a common variant file (msm_vidc_variant). Change-Id: Ic92a264b47b4d90efcfb4389e30d2749a23f792b Signed-off-by: Stanimir Varbanov <quic_c_svarba@quicinc.com>
This commit is contained in:

gecommit door
Gerrit - the friendly Code Review server

bovenliggende
cf7b4f85c9
commit
21974f4a60
@@ -26,8 +26,6 @@ struct msm_vidc_resources_ops {
|
||||
|
||||
int (*clk_disable)(struct msm_vidc_core *core, const char *name);
|
||||
int (*clk_enable)(struct msm_vidc_core *core, const char *name);
|
||||
|
||||
int (*set_regs)(struct msm_vidc_core *core);
|
||||
};
|
||||
|
||||
const struct msm_vidc_resources_ops *get_resources_ops(void);
|
||||
|
@@ -73,13 +73,6 @@ void venus_hfi_pm_work_handler(struct work_struct *work);
|
||||
irqreturn_t venus_hfi_isr(int irq, void *data);
|
||||
irqreturn_t venus_hfi_isr_handler(int irq, void *data);
|
||||
|
||||
int __write_register_masked(struct msm_vidc_core *core,
|
||||
u32 reg, u32 value, u32 mask);
|
||||
int __write_register(struct msm_vidc_core *core,
|
||||
u32 reg, u32 value);
|
||||
int __read_register(struct msm_vidc_core *core, u32 reg, u32 *value);
|
||||
int __read_register_with_poll_timeout(struct msm_vidc_core *core,
|
||||
u32 reg, u32 mask, u32 exp_val, u32 sleep_us, u32 timeout_us);
|
||||
int __prepare_pc(struct msm_vidc_core *core);
|
||||
bool __core_in_valid_state(struct msm_vidc_core *core);
|
||||
|
||||
|
@@ -443,28 +443,6 @@ static int __enable_regulator(struct msm_vidc_core *core, const char *reg_name)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __set_registers(struct msm_vidc_core *core)
|
||||
{
|
||||
struct reg_set *reg_set;
|
||||
int i, rc = 0;
|
||||
|
||||
if (!core || !core->dt) {
|
||||
d_vpr_e("core resources null, cannot set registers\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
reg_set = &core->dt->reg_set;
|
||||
for (i = 0; i < reg_set->count; i++) {
|
||||
rc = __write_register_masked(core, reg_set->reg_tbl[i].reg,
|
||||
reg_set->reg_tbl[i].value,
|
||||
reg_set->reg_tbl[i].mask);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MSM_MMRM
|
||||
static void __deregister_mmrm(struct msm_vidc_core *core)
|
||||
{
|
||||
@@ -1139,7 +1117,6 @@ static const struct msm_vidc_resources_ops res_ops = {
|
||||
.set_clks = __set_clocks,
|
||||
.clk_enable = __prepare_enable_clock,
|
||||
.clk_disable = __disable_unprepare_clock,
|
||||
.set_regs = __set_registers,
|
||||
};
|
||||
|
||||
const struct msm_vidc_resources_ops *get_resources_ops(void)
|
||||
|
@@ -161,150 +161,6 @@ static bool __valdiate_session(struct msm_vidc_core *core,
|
||||
return valid;
|
||||
}
|
||||
|
||||
int __write_register(struct msm_vidc_core *core,
|
||||
u32 reg, u32 value)
|
||||
{
|
||||
u32 hwiosymaddr = reg;
|
||||
u8 *base_addr;
|
||||
int rc = 0;
|
||||
|
||||
if (!core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = __strict_check(core, __func__);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!core->power_enabled) {
|
||||
d_vpr_e("HFI Write register failed : Power is OFF\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
base_addr = core->register_base_addr;
|
||||
d_vpr_l("regwrite(%pK + %#x) = %#x\n", base_addr, hwiosymaddr, value);
|
||||
base_addr += hwiosymaddr;
|
||||
writel_relaxed(value, base_addr);
|
||||
|
||||
/*
|
||||
* Memory barrier to make sure value is written into the register.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Argument mask is used to specify which bits to update. In case mask is 0x11,
|
||||
* only bits 0 & 4 will be updated with corresponding bits from value. To update
|
||||
* entire register with value, set mask = 0xFFFFFFFF.
|
||||
*/
|
||||
int __write_register_masked(struct msm_vidc_core *core,
|
||||
u32 reg, u32 value, u32 mask)
|
||||
{
|
||||
u32 prev_val, new_val;
|
||||
u8 *base_addr;
|
||||
int rc = 0;
|
||||
|
||||
if (!core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = __strict_check(core, __func__);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!core->power_enabled) {
|
||||
d_vpr_e("%s: register write failed, power is off\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
base_addr = core->register_base_addr;
|
||||
base_addr += reg;
|
||||
|
||||
prev_val = readl_relaxed(base_addr);
|
||||
/*
|
||||
* Memory barrier to ensure register read is correct
|
||||
*/
|
||||
rmb();
|
||||
|
||||
new_val = (prev_val & ~mask) | (value & mask);
|
||||
d_vpr_l(
|
||||
"Base addr: %pK, writing to: %#x, previous-value: %#x, value: %#x, mask: %#x, new-value: %#x...\n",
|
||||
base_addr, reg, prev_val, value, mask, new_val);
|
||||
writel_relaxed(new_val, base_addr);
|
||||
/*
|
||||
* Memory barrier to make sure value is written into the register.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int __read_register(struct msm_vidc_core *core, u32 reg, u32 *value)
|
||||
{
|
||||
int rc = 0;
|
||||
u8 *base_addr;
|
||||
|
||||
if (!core || !value) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!core->power_enabled) {
|
||||
d_vpr_e("HFI Read register failed : Power is OFF\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
base_addr = core->register_base_addr;
|
||||
|
||||
*value = readl_relaxed(base_addr + reg);
|
||||
/*
|
||||
* Memory barrier to make sure value is read correctly from the
|
||||
* register.
|
||||
*/
|
||||
rmb();
|
||||
d_vpr_l("regread(%pK + %#x) = %#x\n", base_addr, reg, *value);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int __read_register_with_poll_timeout(struct msm_vidc_core *core,
|
||||
u32 reg, u32 mask, u32 exp_val, u32 sleep_us, u32 timeout_us)
|
||||
{
|
||||
int rc = 0;
|
||||
u32 val = 0;
|
||||
u8 *addr;
|
||||
|
||||
if (!core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!core->power_enabled) {
|
||||
d_vpr_e("%s failed: Power is OFF\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
addr = (u8 *)core->register_base_addr + reg;
|
||||
|
||||
rc = readl_relaxed_poll_timeout(addr, val, ((val & mask) == exp_val), sleep_us, timeout_us);
|
||||
/*
|
||||
* Memory barrier to make sure value is read correctly from the
|
||||
* register.
|
||||
*/
|
||||
rmb();
|
||||
d_vpr_l(
|
||||
"regread(%pK + %#x) = %#x. rc %d, mask %#x, exp_val %#x, cond %u, sleep %u, timeout %u\n",
|
||||
core->register_base_addr, reg, val, rc, mask, exp_val,
|
||||
((val & mask) == exp_val), sleep_us, timeout_us);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void __schedule_power_collapse_work(struct msm_vidc_core *core)
|
||||
{
|
||||
if (!core || !core->capabilities) {
|
||||
|
Verwijs in nieuw issue
Block a user