blob: 8857064dcd6bdb6ea82ecd1815d0f1a384a4381b [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* drivers/amlogic/media/di_multi/di_api.c
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/amlogic/media/vpu/vpu.h>
#include "deinterlace.h"
#include "di_data_l.h"
#include "di_prc.h"
#include "di_api.h"
/**********************************
* DI api is used for other module
*********************************/
static const struct di_ext_ops di_ext = {
.di_post_reg_rd = l_DI_POST_REG_RD,
.di_post_wr_reg_bits = l_DI_POST_WR_REG_BITS,
.post_update_mc = NULL,
.post_keep_cmd_release2 = dim_post_keep_cmd_release2_local,
.polic_cfg = dim_polic_cfg_local,
};
void dim_attach_to_local(void)
{
dil_attach_ext_api(&di_ext);
}
bool dim_attach_ext_api(struct di_ext_ops *di_api)
{
#ifdef MARK_HIS
di_api = &di_ext;
#else
if (!di_api)
return false;
memcpy(di_api, &di_ext, sizeof(struct di_ext_ops));
#endif
return true;
}
void diext_clk_b_sw(bool on)
{
struct di_dev_s *de_devp = get_dim_de_devp();
if (on)
vpu_dev_clk_gate_on(de_devp->dim_vpu_clk_gate_dev);
else
vpu_dev_clk_gate_off(de_devp->dim_vpu_clk_gate_dev);
}
/*EXPORT_SYMBOL(dim_attach_ext_api);*/
#ifdef MARK_SC2
/**********************************
* ext_api used by DI
********************************/
#define ARY_TEMP2
#ifdef ARY_TEMP2
void ext_switch_vpu_mem_pd_vmod(unsigned int vmod, bool on)
{
switch_vpu_mem_pd_vmod(vmod,
on ? VPU_MEM_POWER_ON : VPU_MEM_POWER_DOWN);
}
const struct ext_ops_s ext_ops = {
.switch_vpu_mem_pd_vmod = ext_switch_vpu_mem_pd_vmod,
/*no use ?*/
/* .vf_get_receiver_name = vf_get_receiver_name,*/
.switch_vpu_clk_gate_vmod = switch_vpu_clk_gate_vmod,
.get_current_vscale_skip_count = get_current_vscale_skip_count,
.canvas_pool_alloc_canvas_table = canvas_pool_alloc_canvas_table,
};
#else
void n_switch_vpu_mem_pd_vmod(unsigned int vmod, bool on)
{
}
char *n_vf_get_receiver_name(const char *provider_name)
{
return "";
}
void n_switch_vpu_clk_gate_vmod(unsigned int vmod, int flag)
{
}
int n_get_current_vscale_skip_count(struct vframe_s *vf)
{
return 0;
}
u32 n_canvas_pool_alloc_canvas_table(const char *owner, u32 *tab,
int size,
enum canvas_map_type_e type)
{
return 0;
}
const struct ext_ops_s ext_ops = {
.switch_vpu_mem_pd_vmod = n_switch_vpu_mem_pd_vmod,
.vf_get_receiver_name = n_vf_get_receiver_name,
.switch_vpu_clk_gate_vmod = n_switch_vpu_clk_gate_vmod,
.get_current_vscale_skip_count = n_get_current_vscale_skip_count,
.canvas_pool_alloc_canvas_table = n_canvas_pool_alloc_canvas_table,
};
#endif
#endif
void sc2wr(unsigned int adr, unsigned int val)
{
}
unsigned int sc2rd(unsigned int adr)
{
return 0;
}
unsigned int sc2wr_reg_bits(unsigned int adr, unsigned int val,
unsigned int start, unsigned int len)
{
return 0;
}
unsigned int sc2brd(unsigned int adr, unsigned int start,
unsigned int len)
{
return 0;
}
const struct reg_acc sc2reg = {
.wr = sc2wr,
.rd = sc2rd,
.bwr = sc2wr_reg_bits,
.brd = sc2brd,
};