Merge "clk: msm: clock-mmss-cobalt: Add display port pixel clocks"

This commit is contained in:
Linux Build Service Account 2016-07-13 15:45:05 -07:00 committed by Gerrit - the friendly Code Review server
commit f259f4445d
4 changed files with 90 additions and 0 deletions

View file

@ -56,6 +56,7 @@ config ARCH_QCOM
select SOC_BUS
select MSM_IRQ
select THERMAL_WRITABLE_TRIPS
select RATIONAL
help
This enables support for the ARMv8 based Qualcomm chipsets.

View file

@ -21,6 +21,7 @@
#include <linux/io.h>
#include <linux/spinlock.h>
#include <linux/delay.h>
#include <linux/rational.h>
#include <linux/clk.h>
#include <linux/clk/msm-clk-provider.h>
#include <linux/clk/msm-clk.h>
@ -1735,6 +1736,46 @@ static struct clk *edp_clk_get_parent(struct clk *c)
return freq->src_clk;
}
static int rcg_clk_set_rate_dp(struct clk *clk, unsigned long rate)
{
struct rcg_clk *rcg = to_rcg_clk(clk);
struct clk_freq_tbl *freq_tbl = rcg->current_freq;
unsigned long src_rate;
unsigned long num, den, flags;
src_rate = clk_get_rate(clk->parent);
if (src_rate <= 0) {
pr_err("Invalid RCG parent rate\n");
return -EINVAL;
}
rational_best_approximation(src_rate, rate,
(unsigned long)(1 << 16) - 1,
(unsigned long)(1 << 16) - 1, &den, &num);
if (!num || !den) {
pr_err("Invalid MN values derived for requested rate %lu\n",
rate);
return -EINVAL;
}
freq_tbl->div_src_val &= ~BM(4, 0);
if (num == den) {
freq_tbl->m_val = 0;
freq_tbl->n_val = 0;
} else {
freq_tbl->m_val = num;
freq_tbl->n_val = ~(den - num);
freq_tbl->d_val = ~den;
}
spin_lock_irqsave(&local_clock_reg_lock, flags);
if (!is_same_rcg_config(rcg, freq_tbl, true))
__set_rate_mnd(rcg, freq_tbl);
spin_unlock_irqrestore(&local_clock_reg_lock, flags);
return 0;
}
static int gate_clk_enable(struct clk *c)
{
unsigned long flags;
@ -2291,6 +2332,15 @@ struct clk_ops clk_ops_rcg_edp = {
.list_registers = rcg_hid_clk_list_registers,
};
struct clk_ops clk_ops_rcg_dp = {
.enable = rcg_clk_enable,
.disable = rcg_clk_disable,
.set_rate = rcg_clk_set_rate_dp,
.list_rate = rcg_clk_list_rate,
.handoff = pixel_rcg_handoff,
.list_registers = rcg_mnd_clk_list_registers,
};
struct clk_ops clk_ops_branch = {
.enable = branch_clk_enable,
.prepare = branch_clk_prepare,

View file

@ -1107,6 +1107,29 @@ static struct rcg_clk dp_aux_clk_src = {
},
};
static struct clk_freq_tbl ftbl_dp_pixel_clk_src[] = {
{
.div_src_val = BVAL(10, 8, ext_dp_phy_pll_vco_mm_source_val),
.src_clk = &ext_dp_phy_pll_vco.c,
},
F_END
};
static struct rcg_clk dp_pixel_clk_src = {
.cmd_rcgr_reg = MMSS_DP_PIXEL_CMD_RCGR,
.set_rate = set_rate_mnd,
.current_freq = ftbl_dp_pixel_clk_src,
.base = &virt_base,
.c = {
.dbg_name = "dp_pixel_clk_src",
.parent = &ext_dp_phy_pll_vco.c,
.ops = &clk_ops_rcg_dp,
VDD_DIG_FMAX_MAP3(LOWER, 148380000, LOW, 296740000,
NOMINAL, 593470000),
CLK_INIT(dp_pixel_clk_src.c),
},
};
static struct clk_freq_tbl ftbl_dp_link_clk_src[] = {
F_SLEW( 162000000, 324000000, ext_dp_phy_pll_link, 2, 0, 0),
F_SLEW( 270000000, 540000000, ext_dp_phy_pll_link, 2, 0, 0),
@ -2003,6 +2026,18 @@ static struct branch_clk mmss_mdss_dp_aux_clk = {
},
};
static struct branch_clk mmss_mdss_dp_pixel_clk = {
.cbcr_reg = MMSS_MDSS_DP_PIXEL_CBCR,
.has_sibling = 0,
.base = &virt_base,
.c = {
.dbg_name = "mmss_mdss_dp_pixel_clk",
.parent = &dp_pixel_clk_src.c,
.ops = &clk_ops_branch,
CLK_INIT(mmss_mdss_dp_pixel_clk.c),
},
};
static struct branch_clk mmss_mdss_dp_link_clk = {
.cbcr_reg = MMSS_MDSS_DP_LINK_CBCR,
.has_sibling = 0,
@ -2425,6 +2460,7 @@ static struct mux_clk mmss_debug_mux = {
{ &mmss_mdss_dp_link_clk.c, 0x0098 },
{ &mmss_mdss_dp_link_intf_clk.c, 0x0099 },
{ &mmss_mdss_dp_crypto_clk.c, 0x009a },
{ &mmss_mdss_dp_pixel_clk.c, 0x009b },
{ &mmss_mdss_dp_aux_clk.c, 0x009c },
{ &mmss_mdss_dp_gtc_clk.c, 0x009d },
{ &mmss_mdss_byte0_intf_clk.c, 0x00ad },
@ -2494,6 +2530,7 @@ static struct clk_lookup msm_clocks_mmss_cobalt[] = {
CLK_LIST(extpclk_clk_src),
CLK_LIST(ext_dp_phy_pll_vco),
CLK_LIST(ext_dp_phy_pll_link),
CLK_LIST(dp_pixel_clk_src),
CLK_LIST(dp_link_clk_src),
CLK_LIST(dp_crypto_clk_src),
CLK_LIST(csi0phytimer_clk_src),
@ -2576,6 +2613,7 @@ static struct clk_lookup msm_clocks_mmss_cobalt[] = {
CLK_LIST(mmss_mdss_byte1_intf_clk),
CLK_LIST(mmss_mdss_dp_aux_clk),
CLK_LIST(mmss_mdss_dp_crypto_clk),
CLK_LIST(mmss_mdss_dp_pixel_clk),
CLK_LIST(mmss_mdss_dp_link_clk),
CLK_LIST(mmss_mdss_dp_link_intf_clk),
CLK_LIST(mmss_mdss_dp_gtc_clk),

View file

@ -255,6 +255,7 @@ extern struct clk_ops clk_ops_branch_hw_ctl;
extern struct clk_ops clk_ops_vote;
extern struct clk_ops clk_ops_rcg_hdmi;
extern struct clk_ops clk_ops_rcg_edp;
extern struct clk_ops clk_ops_rcg_dp;
extern struct clk_ops clk_ops_byte;
extern struct clk_ops clk_ops_pixel;
extern struct clk_ops clk_ops_byte_multiparent;