Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
  3 *
  4 * This program is free software; you can redistribute it and/or modify
  5 * it under the terms of the GNU General Public License version 2 and
  6 * only version 2 as published by the Free Software Foundation.
  7 *
  8 * This program is distributed in the hope that it will be useful,
  9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 11 * GNU General Public License for more details.
 12 */
 13
 14#ifndef __DSI_PLL_H__
 15#define __DSI_PLL_H__
 16
 17#include <linux/clk.h>
 18#include <linux/clk-provider.h>
 19
 20#include "dsi.h"
 21
 22#define NUM_DSI_CLOCKS_MAX	6
 23#define MAX_DSI_PLL_EN_SEQS	10
 24
 25struct msm_dsi_pll {
 26	enum msm_dsi_phy_type type;
 27
 28	struct clk_hw	clk_hw;
 29	bool		pll_on;
 30	bool		state_saved;
 31
 32	unsigned long	min_rate;
 33	unsigned long	max_rate;
 34	u32		en_seq_cnt;
 35
 36	int (*enable_seqs[MAX_DSI_PLL_EN_SEQS])(struct msm_dsi_pll *pll);
 37	void (*disable_seq)(struct msm_dsi_pll *pll);
 38	int (*get_provider)(struct msm_dsi_pll *pll,
 39			struct clk **byte_clk_provider,
 40			struct clk **pixel_clk_provider);
 41	void (*destroy)(struct msm_dsi_pll *pll);
 42	void (*save_state)(struct msm_dsi_pll *pll);
 43	int (*restore_state)(struct msm_dsi_pll *pll);
 44};
 45
 46#define hw_clk_to_pll(x) container_of(x, struct msm_dsi_pll, clk_hw)
 47
 48static inline void pll_write(void __iomem *reg, u32 data)
 49{
 50	msm_writel(data, reg);
 51}
 52
 53static inline u32 pll_read(const void __iomem *reg)
 54{
 55	return msm_readl(reg);
 56}
 57
 58static inline void pll_write_udelay(void __iomem *reg, u32 data, u32 delay_us)
 59{
 60	pll_write(reg, data);
 61	udelay(delay_us);
 62}
 63
 64static inline void pll_write_ndelay(void __iomem *reg, u32 data, u32 delay_ns)
 65{
 66	pll_write((reg), data);
 67	ndelay(delay_ns);
 68}
 69
 70/*
 71 * DSI PLL Helper functions
 72 */
 73
 74/* clock callbacks */
 75long msm_dsi_pll_helper_clk_round_rate(struct clk_hw *hw,
 76		unsigned long rate, unsigned long *parent_rate);
 77int msm_dsi_pll_helper_clk_prepare(struct clk_hw *hw);
 78void msm_dsi_pll_helper_clk_unprepare(struct clk_hw *hw);
 79/* misc */
 80void msm_dsi_pll_helper_unregister_clks(struct platform_device *pdev,
 81					struct clk **clks, u32 num_clks);
 82
 83/*
 84 * Initialization for Each PLL Type
 85 */
 86#ifdef CONFIG_DRM_MSM_DSI_28NM_PHY
 87struct msm_dsi_pll *msm_dsi_pll_28nm_init(struct platform_device *pdev,
 88					enum msm_dsi_phy_type type, int id);
 89#else
 90static inline struct msm_dsi_pll *msm_dsi_pll_28nm_init(
 91	struct platform_device *pdev, enum msm_dsi_phy_type type, int id)
 92{
 93	return ERR_PTR(-ENODEV);
 94}
 95#endif
 96#ifdef CONFIG_DRM_MSM_DSI_28NM_8960_PHY
 97struct msm_dsi_pll *msm_dsi_pll_28nm_8960_init(struct platform_device *pdev,
 98					       int id);
 99#else
100static inline struct msm_dsi_pll *msm_dsi_pll_28nm_8960_init(
101	struct platform_device *pdev, int id)
102{
103	return ERR_PTR(-ENODEV);
104}
105#endif
106
107#endif /* __DSI_PLL_H__ */
108