| // SPDX-License-Identifier: (GPL-2.0+ OR MIT) |
| /* |
| * drivers/amlogic/media/vout/vdac/vdac_config.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/platform_device.h> |
| #include <linux/of_device.h> |
| #include "vdac_dev.h" |
| |
| static struct meson_vdac_ctrl_s vdac_ctrl_enable_g12ab[] = { |
| {HHI_VDAC_CNTL0_G12A, 0, 9, 1}, |
| {HHI_VDAC_CNTL0_G12A, 1, 0, 1}, |
| {HHI_VDAC_CNTL0_G12A, 0, 16, 5}, /* vref adj */ |
| {HHI_VDAC_CNTL1_G12A, 0, 0, 3}, /*gsw */ |
| {HHI_VDAC_CNTL1_G12A, 0, 3, 1}, |
| {VDAC_REG_MAX, 0, 0, 0}, |
| }; |
| |
| static struct meson_vdac_ctrl_s vdac_ctrl_enable_tl1[] = { |
| {HHI_VDAC_CNTL0_G12A, 0, 9, 1}, |
| {HHI_VDAC_CNTL0_G12A, 1, 0, 1}, |
| {HHI_VDAC_CNTL1_G12A, 0, 3, 1}, |
| {HHI_VDAC_CNTL1_G12A, 0, 7, 1}, /* bandgap */ |
| {HHI_VDAC_CNTL0_G12A, 0, 16, 5}, /* vref adj */ |
| {HHI_VDAC_CNTL1_G12A, 0, 0, 3}, /*gsw */ |
| {HHI_VDAC_CNTL1_G12A, 1, 6, 1}, /* bypass avout */ |
| {HHI_VDAC_CNTL1_G12A, 1, 8, 1}, /* bypass avout */ |
| {VDAC_REG_MAX, 0, 0, 0}, |
| }; |
| |
| static struct meson_vdac_ctrl_s vdac_ctrl_enable_sc2[] = { |
| {ANACTRL_VDAC_CTRL0, 0, 9, 1}, |
| {ANACTRL_VDAC_CTRL0, 1, 0, 1}, |
| {ANACTRL_VDAC_CTRL0, 0, 16, 5}, /* vref adj */ |
| {ANACTRL_VDAC_CTRL1, 0, 0, 3}, /*gsw */ |
| {ANACTRL_VDAC_CTRL1, 0, 3, 1}, |
| {VDAC_REG_MAX, 0, 0, 0}, |
| }; |
| |
| static struct meson_vdac_ctrl_s vdac_ctrl_enable_t5[] = { |
| {HHI_VDAC_CNTL0_G12A, 0, 9, 1}, |
| {HHI_VDAC_CNTL0_G12A, 1, 0, 1}, |
| {HHI_VDAC_CNTL1_G12A, 0x0, 0, 7}, /*gsw t5 no verf*/ |
| {HHI_VDAC_CNTL1_G12A, 1, 7, 1}, /* cdac_pwd */ |
| {VDAC_REG_MAX, 0, 0, 0}, |
| }; |
| |
| static struct meson_vdac_ctrl_s vdac_ctrl_enable_s4[] = { |
| {ANACTRL_VDAC_CTRL0, 0, 9, 1}, |
| {ANACTRL_VDAC_CTRL0, 1, 0, 1}, |
| {ANACTRL_VDAC_CTRL1, 1, 7, 1}, /* cdac_pwd */ |
| {VDAC_REG_MAX, 0, 0, 0}, |
| }; |
| |
| /* ********************************************************* */ |
| static struct meson_vdac_data meson_g12ab_vdac_data = { |
| .cpu_id = VDAC_CPU_G12AB, |
| .name = "meson-g12ab-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_g12ab, |
| }; |
| |
| #ifndef CONFIG_AMLOGIC_REMOVE_OLD |
| static struct meson_vdac_data meson_tl1_vdac_data = { |
| .cpu_id = VDAC_CPU_TL1, |
| .name = "meson-tl1-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_tl1, |
| }; |
| #endif |
| |
| static struct meson_vdac_data meson_sm1_vdac_data = { |
| .cpu_id = VDAC_CPU_SM1, |
| .name = "meson-sm1-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_g12ab, |
| }; |
| |
| static struct meson_vdac_data meson_tm2_vdac_data = { |
| .cpu_id = VDAC_CPU_TM2, |
| .name = "meson-tm2-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_tl1, |
| }; |
| |
| static struct meson_vdac_data meson_sc2_vdac_data = { |
| .cpu_id = VDAC_CPU_SC2, |
| .name = "meson-sc2-vdac", |
| |
| .reg_cntl0 = ANACTRL_VDAC_CTRL0, |
| .reg_cntl1 = ANACTRL_VDAC_CTRL1, |
| .reg_vid_clk_ctrl2 = CLKCTRL_VID_CLK_CTRL2, |
| .reg_vid2_clk_div = CLKCTRL_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_sc2, |
| }; |
| |
| static struct meson_vdac_data meson_t5_vdac_data = { |
| .cpu_id = VDAC_CPU_T5, |
| .name = "meson-t5-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_t5, |
| }; |
| |
| static struct meson_vdac_data meson_t5d_vdac_data = { |
| .cpu_id = VDAC_CPU_T5D, |
| .name = "meson-t5d-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK_CNTL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_t5, |
| }; |
| |
| static struct meson_vdac_data meson_s4_vdac_data = { |
| .cpu_id = VDAC_CPU_S4, |
| .name = "meson-s4-vdac", |
| |
| .reg_cntl0 = ANACTRL_VDAC_CTRL0, |
| .reg_cntl1 = ANACTRL_VDAC_CTRL1, |
| .reg_vid_clk_ctrl2 = CLKCTRL_VID_CLK_CTRL2, |
| .reg_vid2_clk_div = CLKCTRL_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_s4, |
| }; |
| |
| static struct meson_vdac_data meson_t3_vdac_data = { |
| .cpu_id = VDAC_CPU_T3, |
| .name = "meson-t3-vdac", |
| |
| .reg_cntl0 = ANACTRL_VDAC_CTRL0, |
| .reg_cntl1 = ANACTRL_VDAC_CTRL1, |
| .reg_vid_clk_ctrl2 = CLKCTRL_VID_CLK_CTRL2, |
| .reg_vid2_clk_div = CLKCTRL_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_s4, |
| }; |
| |
| static struct meson_vdac_data meson_s4d_vdac_data = { |
| .cpu_id = VDAC_CPU_S4D, |
| .name = "meson-s4d-vdac", |
| |
| .reg_cntl0 = ANACTRL_VDAC_CTRL0, |
| .reg_cntl1 = ANACTRL_VDAC_CTRL1, |
| .reg_vid_clk_ctrl2 = CLKCTRL_VID_CLK_CTRL2, |
| .reg_vid2_clk_div = CLKCTRL_VIID_CLK_DIV, |
| .ctrl_table = vdac_ctrl_enable_s4, |
| }; |
| |
| static struct meson_vdac_data meson_t5w_vdac_data = { |
| .cpu_id = VDAC_CPU_T5W, |
| .name = "meson-t5w-vdac", |
| |
| .reg_cntl0 = HHI_VDAC_CNTL0_G12A, |
| .reg_cntl1 = HHI_VDAC_CNTL1_G12A, |
| .reg_vid_clk_ctrl2 = HHI_VID_CLK0_CTRL2, |
| .reg_vid2_clk_div = HHI_VIID_CLK0_DIV, |
| .ctrl_table = vdac_ctrl_enable_t5, |
| }; |
| |
| const struct of_device_id meson_vdac_dt_match[] = { |
| { |
| .compatible = "amlogic, vdac-g12a", |
| .data = &meson_g12ab_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-g12b", |
| .data = &meson_g12ab_vdac_data, |
| }, |
| #ifndef CONFIG_AMLOGIC_REMOVE_OLD |
| { |
| .compatible = "amlogic, vdac-tl1", |
| .data = &meson_tl1_vdac_data, |
| }, |
| #endif |
| { |
| .compatible = "amlogic, vdac-sm1", |
| .data = &meson_sm1_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-tm2", |
| .data = &meson_tm2_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-sc2", |
| .data = &meson_sc2_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-t5", |
| .data = &meson_t5_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-t5d", |
| .data = &meson_t5d_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-s4", |
| .data = &meson_s4_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-t3", |
| .data = &meson_t3_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-s4d", |
| .data = &meson_s4d_vdac_data, |
| }, { |
| .compatible = "amlogic, vdac-T5w", |
| .data = &meson_t5w_vdac_data, |
| }, |
| {} |
| }; |
| |
| struct meson_vdac_data *aml_vdac_config_probe(struct platform_device *pdev) |
| { |
| const struct of_device_id *match; |
| struct meson_vdac_data *data; |
| |
| match = of_match_device(meson_vdac_dt_match, &pdev->dev); |
| if (!match) { |
| pr_err("%s, no matched table\n", __func__); |
| return NULL; |
| } |
| data = (struct meson_vdac_data *)match->data; |
| if (data) { |
| pr_info("%s: cpu_id:%d, name:%s\n", __func__, |
| data->cpu_id, data->name); |
| } |
| |
| return data; |
| } |