linux/drivers/gpu/drm/msm/dsi/dsi.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 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_CONNECTOR_H__
  15#define __DSI_CONNECTOR_H__
  16
  17#include <linux/of_platform.h>
  18#include <linux/platform_device.h>
  19
  20#include "drm_crtc.h"
  21#include "drm_mipi_dsi.h"
  22#include "drm_panel.h"
  23
  24#include "msm_drv.h"
  25
  26#define DSI_0   0
  27#define DSI_1   1
  28#define DSI_MAX 2
  29
  30enum msm_dsi_phy_type {
  31        MSM_DSI_PHY_28NM_HPM,
  32        MSM_DSI_PHY_28NM_LP,
  33        MSM_DSI_PHY_20NM,
  34        MSM_DSI_PHY_28NM_8960,
  35        MSM_DSI_PHY_MAX
  36};
  37
  38#define DSI_DEV_REGULATOR_MAX   8
  39#define DSI_BUS_CLK_MAX         4
  40
  41/* Regulators for DSI devices */
  42struct dsi_reg_entry {
  43        char name[32];
  44        int min_voltage;
  45        int max_voltage;
  46        int enable_load;
  47        int disable_load;
  48};
  49
  50struct dsi_reg_config {
  51        int num;
  52        struct dsi_reg_entry regs[DSI_DEV_REGULATOR_MAX];
  53};
  54
  55struct msm_dsi {
  56        struct drm_device *dev;
  57        struct platform_device *pdev;
  58
  59        /* connector managed by us when we're connected to a drm_panel */
  60        struct drm_connector *connector;
  61        /* internal dsi bridge attached to MDP interface */
  62        struct drm_bridge *bridge;
  63
  64        struct mipi_dsi_host *host;
  65        struct msm_dsi_phy *phy;
  66
  67        /*
  68         * panel/external_bridge connected to dsi bridge output, only one of the
  69         * two can be valid at a time
  70         */
  71        struct drm_panel *panel;
  72        struct drm_bridge *external_bridge;
  73        unsigned long device_flags;
  74
  75        struct device *phy_dev;
  76        bool phy_enabled;
  77
  78        /* the encoders we are hooked to (outside of dsi block) */
  79        struct drm_encoder *encoders[MSM_DSI_ENCODER_NUM];
  80
  81        int id;
  82};
  83
  84/* dsi manager */
  85struct drm_bridge *msm_dsi_manager_bridge_init(u8 id);
  86void msm_dsi_manager_bridge_destroy(struct drm_bridge *bridge);
  87struct drm_connector *msm_dsi_manager_connector_init(u8 id);
  88struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id);
  89int msm_dsi_manager_phy_enable(int id,
  90                const unsigned long bit_rate, const unsigned long esc_rate,
  91                u32 *clk_pre, u32 *clk_post);
  92void msm_dsi_manager_phy_disable(int id);
  93int msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg);
  94bool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len);
  95int msm_dsi_manager_register(struct msm_dsi *msm_dsi);
  96void msm_dsi_manager_unregister(struct msm_dsi *msm_dsi);
  97
  98/* msm dsi */
  99static inline bool msm_dsi_device_connected(struct msm_dsi *msm_dsi)
 100{
 101        return msm_dsi->panel || msm_dsi->external_bridge;
 102}
 103
 104struct drm_encoder *msm_dsi_get_encoder(struct msm_dsi *msm_dsi);
 105
 106/* dsi pll */
 107struct msm_dsi_pll;
 108#ifdef CONFIG_DRM_MSM_DSI_PLL
 109struct msm_dsi_pll *msm_dsi_pll_init(struct platform_device *pdev,
 110                        enum msm_dsi_phy_type type, int dsi_id);
 111void msm_dsi_pll_destroy(struct msm_dsi_pll *pll);
 112int msm_dsi_pll_get_clk_provider(struct msm_dsi_pll *pll,
 113        struct clk **byte_clk_provider, struct clk **pixel_clk_provider);
 114void msm_dsi_pll_save_state(struct msm_dsi_pll *pll);
 115int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll);
 116#else
 117static inline struct msm_dsi_pll *msm_dsi_pll_init(struct platform_device *pdev,
 118                         enum msm_dsi_phy_type type, int id) {
 119        return ERR_PTR(-ENODEV);
 120}
 121static inline void msm_dsi_pll_destroy(struct msm_dsi_pll *pll)
 122{
 123}
 124static inline int msm_dsi_pll_get_clk_provider(struct msm_dsi_pll *pll,
 125        struct clk **byte_clk_provider, struct clk **pixel_clk_provider)
 126{
 127        return -ENODEV;
 128}
 129static inline void msm_dsi_pll_save_state(struct msm_dsi_pll *pll)
 130{
 131}
 132static inline int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll)
 133{
 134        return 0;
 135}
 136#endif
 137
 138/* dsi host */
 139int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
 140                                        const struct mipi_dsi_msg *msg);
 141void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
 142                                        const struct mipi_dsi_msg *msg);
 143int msm_dsi_host_cmd_tx(struct mipi_dsi_host *host,
 144                                        const struct mipi_dsi_msg *msg);
 145int msm_dsi_host_cmd_rx(struct mipi_dsi_host *host,
 146                                        const struct mipi_dsi_msg *msg);
 147void msm_dsi_host_cmd_xfer_commit(struct mipi_dsi_host *host,
 148                                        u32 dma_base, u32 len);
 149int msm_dsi_host_enable(struct mipi_dsi_host *host);
 150int msm_dsi_host_disable(struct mipi_dsi_host *host);
 151int msm_dsi_host_power_on(struct mipi_dsi_host *host);
 152int msm_dsi_host_power_off(struct mipi_dsi_host *host);
 153int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host,
 154                                        struct drm_display_mode *mode);
 155struct drm_panel *msm_dsi_host_get_panel(struct mipi_dsi_host *host,
 156                                        unsigned long *panel_flags);
 157struct drm_bridge *msm_dsi_host_get_bridge(struct mipi_dsi_host *host);
 158int msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer);
 159void msm_dsi_host_unregister(struct mipi_dsi_host *host);
 160int msm_dsi_host_set_src_pll(struct mipi_dsi_host *host,
 161                        struct msm_dsi_pll *src_pll);
 162void msm_dsi_host_destroy(struct mipi_dsi_host *host);
 163int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
 164                                        struct drm_device *dev);
 165int msm_dsi_host_init(struct msm_dsi *msm_dsi);
 166
 167/* dsi phy */
 168struct msm_dsi_phy;
 169void msm_dsi_phy_driver_register(void);
 170void msm_dsi_phy_driver_unregister(void);
 171int msm_dsi_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
 172        const unsigned long bit_rate, const unsigned long esc_rate);
 173void msm_dsi_phy_disable(struct msm_dsi_phy *phy);
 174void msm_dsi_phy_get_clk_pre_post(struct msm_dsi_phy *phy,
 175                                        u32 *clk_pre, u32 *clk_post);
 176struct msm_dsi_pll *msm_dsi_phy_get_pll(struct msm_dsi_phy *phy);
 177
 178#endif /* __DSI_CONNECTOR_H__ */
 179
 180