blob: bbc3beed665d803632886f8b0cca80d10535148c [file] [log] [blame]
/*
* drivers/amlogic/media/common/arch/clk/clk.h
*
* Copyright (C) 2016 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.
*
*/
#ifndef VDEC_CHIP_CLK_HEADER
#define VDEC_CHIP_CLK_HEADER
#include <linux/types.h>
#include <linux/init.h>
#include <linux/module.h>
#include "clk_priv.h"
#include <linux/amlogic/media/clk/gp_pll.h>
#ifndef INCLUDE_FROM_ARCH_CLK_MGR
int vdec_clock_init(void);
int vdec_clock_set(int clk);
int vdec2_clock_set(int clk);
int hcodec_clock_set(int clk);
int hevc_clock_init(void);
int hevc_clock_set(int clk);
void vdec_clock_on(void);
void vdec_clock_off(void);
void vdec2_clock_on(void);
void vdec2_clock_off(void);
void hcodec_clock_on(void);
void hcodec_clock_off(void);
void hevc_clock_on(void);
void hevc_clock_off(void);
int hevc_back_clock_init(void);
void hevc_back_clock_on(void);
void hevc_back_clock_off(void);
int hevc_back_clock_set(int clk);
void hevc_back_clock_enable(void);
void hevc_back_clock_hi_enable(void);
int vdec_source_get(enum vdec_type_e core);
int vdec_clk_get(enum vdec_type_e core);
bool is_hevc_front_back_clk_combined(void);
int vdec_source_changed_for_clk_set(int format, int width, int height, int fps);
int get_clk_with_source(int format, int w_x_h_fps);
void vdec_clock_enable(void);
void vdec_clock_hi_enable(void);
void hcodec_clock_enable(void);
void hcodec_clock_hi_enable(void);
void hevc_clock_enable(void);
void hevc_clock_hi_enable(void);
void vdec2_clock_enable(void);
void vdec2_clock_hi_enable(void);
void set_clock_gate(struct gate_switch_node *nodes, int num);
#endif
int register_vdec_clk_mgr(int cputype[],
enum vdec_type_e vdec_type, struct chip_vdec_clk_s *t_mgr);
int unregister_vdec_clk_mgr(enum vdec_type_e vdec_type);
int register_vdec_clk_setting(int cputype[],
struct clk_set_setting *p_seting, int size);
int unregister_vdec_clk_setting(void);
#ifdef INCLUDE_FROM_ARCH_CLK_MGR
static struct chip_vdec_clk_s vdec_clk_mgr __initdata = {
.clock_init = vdec_clock_init,
.clock_set = vdec_clock_set,
.clock_on = vdec_clock_on,
.clock_off = vdec_clock_off,
.clock_get = vdec_clock_get,
};
#ifdef VDEC_HAS_VDEC2
static struct chip_vdec_clk_s vdec2_clk_mgr __initdata = {
.clock_set = vdec2_clock_set,
.clock_on = vdec2_clock_on,
.clock_off = vdec2_clock_off,
.clock_get = vdec_clock_get,
};
#endif
#ifdef VDEC_HAS_HEVC
static struct chip_vdec_clk_s vdec_hevc_clk_mgr __initdata = {
.clock_init = hevc_clock_init,
.clock_set = hevc_clock_set,
.clock_on = hevc_clock_on,
.clock_off = hevc_clock_off,
.clock_get = vdec_clock_get,
};
static struct chip_vdec_clk_s vdec_hevc_back_clk_mgr __initdata = {
.clock_init = hevc_back_clock_init,
.clock_set = hevc_back_clock_set,
.clock_on = hevc_back_clock_on,
.clock_off = hevc_back_clock_off,
.clock_get = vdec_clock_get,
};
#endif
#ifdef VDEC_HAS_VDEC_HCODEC
static struct chip_vdec_clk_s vdec_hcodec_clk_mgr __initdata = {
.clock_set = hcodec_clock_set,
.clock_on = hcodec_clock_on,
.clock_off = hcodec_clock_off,
.clock_get = vdec_clock_get,
};
#endif
static int __init vdec_init_clk(void)
{
int cpus[] = CLK_FOR_CPU;
register_vdec_clk_mgr(cpus, VDEC_1, &vdec_clk_mgr);
#ifdef VDEC_HAS_VDEC2
register_vdec_clk_mgr(cpus, VDEC_2, &vdec2_clk_mgr);
#endif
#ifdef VDEC_HAS_HEVC
register_vdec_clk_mgr(cpus, VDEC_HEVC, &vdec_hevc_clk_mgr);
if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_G12A)
register_vdec_clk_mgr(cpus, VDEC_HEVCB, &vdec_hevc_back_clk_mgr);
#endif
#ifdef VDEC_HAS_VDEC_HCODEC
register_vdec_clk_mgr(cpus, VDEC_HCODEC, &vdec_hcodec_clk_mgr);
#endif
#ifdef VDEC_HAS_CLK_SETTINGS
register_vdec_clk_setting(cpus,
clks_for_formats, sizeof(clks_for_formats));
#endif
return 0;
}
static void __exit vdec_clk_exit(void)
{
unregister_vdec_clk_mgr(VDEC_1);
#ifdef VDEC_HAS_VDEC2
unregister_vdec_clk_mgr(VDEC_2);
#endif
#ifdef VDEC_HAS_HEVC
unregister_vdec_clk_mgr(VDEC_HEVC);
#endif
#ifdef VDEC_HAS_VDEC_HCODEC
unregister_vdec_clk_mgr(VDEC_HCODEC);
#endif
#ifdef VDEC_HAS_CLK_SETTINGS
unregister_vdec_clk_setting();
#endif
pr_info("media clock exit.\n");
}
#define ARCH_VDEC_CLK_INIT()\
module_init(vdec_init_clk)
#define ARCH_VDEC_CLK_EXIT()\
module_exit(vdec_clk_exit)
MODULE_DESCRIPTION("AMLOGIC clk Driver");
MODULE_LICENSE("GPL");
#endif
#endif