// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright © 2019-2020 Intel Corporation
*/
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/mfd/syscon.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_simple_kms_helper.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
#include "kmb_dsi.h"
#include "kmb_regs.h"
static struct mipi_dsi_host *dsi_host;
static struct mipi_dsi_device *dsi_device;
static struct drm_bridge *adv_bridge;
/* Default setting is 1080p, 4 lanes */
#define IMG_HEIGHT_LINES 1080
#define IMG_WIDTH_PX 1920
#define MIPI_TX_ACTIVE_LANES 4
static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
.width_pixels = IMG_WIDTH_PX,
.height_lines = IMG_HEIGHT_LINES,
.data_type = DSI_LP_DT_PPS_RGB888_24B,
.data_mode = MIPI_DATA_MODE1,
.dma_packed = 0
};
static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
.sections[0] = &mipi_tx_frame0_sect_cfg,
.sections[1] = NULL,
.sections[2] = NULL,
.sections[3] = NULL,
.vsync_width = 5,
.v_backporch = 36,
.v_frontporch = 4,
.hsync_width = 44,
.h_backporch = 148,
.h_frontporch = 88
};
static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
.hfp_blank_en = 0,
.eotp_en = 0,
.lpm_last_vfp_line = 0,
.lpm_first_vsa_line = 0,
.sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
.hfp_blanking = SEND_BLANK_PACKET,
.hbp_blanking = SEND_BLANK_PACKET,
.hsa_blanking = SEND_BLANK_PACKET,
.v_blanking = SEND_BLANK_PACKET,
};
static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
.active_lanes = MIPI_TX_ACTIVE_LANES,
.lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
.ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
.cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
.tx_ctrl_cfg = {
.frames[0] = &mipitx_frame0_cfg,
.frames[1] = NULL,
.frames[2] = NULL,
.frames[3] = NULL,
.tx_dsi_cfg = &mipitx_dsi_cfg,
.line_sync_pkt_en = 0,
.line_counter_active = 0,
.frame_counter_active = 0,
.tx_always_use_hact = 1,
.tx_hact_wait_stop = 1,
}
};
struct mipi_hs_freq_range_cfg {
u16 default_bit_rate_mbps;
u8 hsfreqrange_code;
};
struct vco_params {
u32 freq;
u32 range;
u32 divider;
};
static const struct vco_params vco_table[] = {
{52, 0x3f, 8},
{80, 0x39, 8},
{105, 0x2f, 4},
{160, 0x29, 4},
{210, 0x1f, 2},
{320, 0x19, 2},
{420, 0x0f, 1},
{630, 0x09, 1},
{1100, 0x03, 1},
{0xffff, 0x01, 1},
};
static const struct mipi_hs_freq_range_cfg
mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
{.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
{.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
{.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
{.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
{.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
{.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
{.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
{.default_bit_rate_mbps = 150, .hsfreqrange_code = 0x31},
{.default_bit_rate_mbps = 160, .hsfreqrange_code = 0x02},
{.default_bit_rate_mbps = 170, .hsfreqrange_code = 0x12},
{.default_bit_rate_mbps = 180, .hsfreqrange_code = 0x22},
{.default_bit_rate_mbps = 190, .hsfreqrange_code = 0x32},
{.default_bit_rate_mbps = 205, .hsfreqrange_code = 0x03},
{.default_bit_rate_mbps = 220, .hsfreqrange_code = 0x13},
{.default_bit_rate_mbps = 235, .hsfreqrange_code = 0x23},
{.default_bit_rate_mbps = 250, .hsfreqrange_code = 0x33},
{.default_bit_rate_mbps = 275, .hsfreqrange_code = 0x04},
{.default_bit_rate_mbps = 300, .hsfreqrange_code = 0x14},
{.default_bit_rate_mbps = 325, .hsfreqrange_code = 0x25},
{.default_bit_rate_mbps = 350, .hsfreqrange_code = 0x35},
{.default_bit_rate_mbps = 400, .hsfreqrange_code = 0x05},
{.default_bit_rate_mbps = 450, .hsfreqrange_code = 0x16},
{.default_bit_rate_mbps = 500, .hsfreqrange_code = 0x26},
{.default_bit_rate_mbps = 550, .hsfreqrange_code = 0x37},
{.default_bit_rate_mbps = 600, .hsfreqrange_code = 0x07},
{.default_bit_rate_mbps = 650, .hsfreqrange_code = 0x18},
{.default_bit_rate_mbps = 700, .hsfreqrange_code = 0x28},
{.default_bit_rate_mbps = 750, .hsfreqrange_code = 0x39},
{.default_bit_rate_mbps = 800, .hsfreqrange_code = 0x09},
{.default_bit_rate_mbps = 850, .hsfreqrange_code = 0x19},
{.default_bit_rate_mbps = 900, .hsfreqrange_code = 0x29},
{.default_bit_rate_mbps = 1000, .hsfreqrange_code = 0x0A},
{.default_bit_rate_mbps = 1050, .hsfreqrange_code = 0x1A},
{.default_bit_rate_mbps = 1100, .hsfreqrange_code = 0x2A},
{.default_bit_rate_mbps = 1150, .hsfreqrange_code = 0x3B},
{.default_bit_rate_mbps = 1200, .hsfreqrange_code = 0x0B},
{.default_bit_rate_mbps = 1250, .hsfreqrange_code = 0x1B},
{.default_bit_rate_mbps = 1300, .hsfreqrange_code = 0x2B},
{.default_bit_rate_mbps = 1350, .hsfreqrange_code = 0x3C},
{.default_bit_rate_mbps = 1400, .hsfreqrange_code = 0x0C},
{.default_bit_rate_mbps = 1450, .hsfreqrange_code = 0x1C},
{.default_bit_rate_mbps = 1500, .hsfreqrange_code = 0x2C},
{.default_bit_rate_mbps = 1550, .hsfreqrange_code = 0x3D},
{.default_bit_rate_mbps = 1600, .hsfreqrange_code = 0x0D},
{.default_bit_rate_mbps = 1650, .hsfreqrange_code = 0x1D},
{.default_bit_rate_mbps = 1700, .hsfreqrange_code = 0x2E},
{.default_bit_rate_mbps = 1750, .hsfreqrange_code = 0x3E},
{.default_bit_rate_mbps = 1800, .hsfreqrange_code = 0x0E},
{.default_bit_rate_mbps = 1850, .hsfreqrange_code = 0x1E},
{.default_bit_rate_mbps = 1900, .hsfreqrange_code = 0x2F},
{.default_bit_rate_mbps = 1950, .hsfreqrange_code = 0x3F},
{.default_bit_rate_mbps = 2000, .hsfreqrange_code = 0x0F},
{.default_bit_rate_mbps = 2050, .hsfreqrange_code = 0x40},
{.default_bit_rate_mbps = 2100, .hsfreqrange_code = 0x41},
{.default_bit_rate_mbps = 2150, .hsfreqrange_code = 0x42},
{.default_bit_rate_mbps = 2200,
|