kernel_samsung_a53x/drivers/vision3/dsp/hardware/common/dsp-hw-common-clk.c
2024-06-15 16:02:09 -03:00

141 lines
2.6 KiB
C
Executable file

// SPDX-License-Identifier: GPL-2.0
/*
* Samsung Exynos SoC series dsp driver
*
* Copyright (c) 2020 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*/
#include "dsp-log.h"
#include "dsp-hw-common-system.h"
#include "dsp-hw-common-clk.h"
void dsp_hw_common_clk_dump(struct dsp_clk *clk)
{
long count;
const char *name;
unsigned long freq;
dsp_enter();
for (count = 0; count < clk->array_size; ++count) {
name = clk->array[count].name;
freq = clk_get_rate(clk->array[count].clk);
if (!freq)
continue;
dsp_dbg("%32s(%02ld) : %4lu.%06lu MHz\n",
name, count, freq / 1000000, freq % 1000000);
}
dsp_leave();
}
void dsp_hw_common_clk_user_dump(struct dsp_clk *clk, struct seq_file *file)
{
long count;
const char *name;
unsigned long freq;
dsp_enter();
for (count = 0; count < clk->array_size; ++count) {
name = clk->array[count].name;
freq = clk_get_rate(clk->array[count].clk);
seq_printf(file, "%32s(%ld) : %4lu.%06lu MHz\n",
name, count, freq / 1000000, freq % 1000000);
}
dsp_leave();
}
int dsp_hw_common_clk_enable(struct dsp_clk *clk)
{
int ret;
long count;
dsp_enter();
for (count = 0; count < clk->array_size; ++count) {
ret = clk_prepare_enable(clk->array[count].clk);
if (ret) {
dsp_err("Failed to enable [%s(%ld/%u)]clk(%d)\n",
clk->array[count].name, count,
clk->array_size, ret);
goto p_err;
}
}
clk->ops->dump(clk);
dsp_leave();
return 0;
p_err:
for (count -= 1; count >= 0; --count)
clk_disable_unprepare(clk->array[count].clk);
return ret;
}
int dsp_hw_common_clk_disable(struct dsp_clk *clk)
{
long count;
dsp_enter();
for (count = 0; count < clk->array_size; ++count)
clk_disable_unprepare(clk->array[count].clk);
dsp_leave();
return 0;
}
int dsp_hw_common_clk_open(struct dsp_clk *clk)
{
dsp_enter();
dsp_leave();
return 0;
}
int dsp_hw_common_clk_close(struct dsp_clk *clk)
{
dsp_enter();
dsp_leave();
return 0;
}
int dsp_hw_common_clk_probe(struct dsp_clk *clk, void *sys)
{
int ret;
long count;
dsp_enter();
clk->sys = sys;
clk->dev = clk->sys->dev;
for (count = 0; count < clk->array_size; ++count) {
clk->array[count].clk = devm_clk_get(clk->dev,
clk->array[count].name);
if (IS_ERR(clk->array[count].clk)) {
ret = IS_ERR(clk->array[count].clk);
dsp_err("Failed to get [%s(%ld/%u)]clk(%d)\n",
clk->array[count].name, count,
clk->array_size, ret);
goto p_err;
}
}
dsp_leave();
return 0;
p_err:
return ret;
}
void dsp_hw_common_clk_remove(struct dsp_clk *clk)
{
dsp_enter();
dsp_leave();
}
int dsp_hw_common_clk_set_ops(struct dsp_clk *clk, const void *ops)
{
dsp_enter();
clk->ops = ops;
dsp_leave();
return 0;
}