mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-15 09:27:35 +00:00
2c7396cb1a
EXYNOS SoC platform has MIPI-DSI controller and MIPI-DSI based LCD Panel could be used with it. This patch supports MIPI-DSI driver based Samsung SoC chip. LCD panel driver based MIPI-DSI should be registered to MIPI-DSI driver at board file and LCD panel driver specific function registered to mipi_dsim_ddi structure at lcd panel init function called system init. In the MIPI-DSI driver, find lcd panel driver by using registered lcd panel name, and then initialize lcd panel driver. Signed-off-by: Donghwa Lee <dh09.lee@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com> Acked-by: Anatolij Gustschin <agust@denx.de>
652 lines
18 KiB
C
652 lines
18 KiB
C
/*
|
|
* Copyright (C) 2012 Samsung Electronics
|
|
*
|
|
* Author: InKi Dae <inki.dae@samsung.com>
|
|
* Author: Donghwa Lee <dh09.lee@samsung.com>
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/arch/dsim.h>
|
|
#include <asm/arch/mipi_dsim.h>
|
|
#include <asm/arch/power.h>
|
|
#include <asm/arch/cpu.h>
|
|
|
|
#include "exynos_mipi_dsi_lowlevel.h"
|
|
#include "exynos_mipi_dsi_common.h"
|
|
|
|
void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim)
|
|
{
|
|
unsigned int reg;
|
|
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = readl(&mipi_dsim->swrst);
|
|
|
|
reg |= DSIM_FUNCRST;
|
|
|
|
writel(reg, &mipi_dsim->swrst);
|
|
}
|
|
|
|
void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim)
|
|
{
|
|
unsigned int reg = 0;
|
|
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = readl(&mipi_dsim->swrst);
|
|
|
|
reg |= DSIM_SWRST;
|
|
reg |= DSIM_FUNCRST;
|
|
|
|
writel(reg, &mipi_dsim->swrst);
|
|
}
|
|
|
|
void exynos_mipi_dsi_sw_release(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->intsrc);
|
|
|
|
reg |= INTSRC_SWRST_RELEASE;
|
|
|
|
writel(reg, &mipi_dsim->intsrc);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
|
|
unsigned int mode, unsigned int mask)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->intmsk);
|
|
|
|
if (mask)
|
|
reg |= mode;
|
|
else
|
|
reg &= ~mode;
|
|
|
|
writel(reg, &mipi_dsim->intmsk);
|
|
}
|
|
|
|
void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
|
|
unsigned int cfg)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = readl(&mipi_dsim->fifoctrl);
|
|
|
|
writel(reg & ~(cfg), &mipi_dsim->fifoctrl);
|
|
udelay(10 * 1000);
|
|
reg |= cfg;
|
|
|
|
writel(reg, &mipi_dsim->fifoctrl);
|
|
}
|
|
|
|
/*
|
|
* this function set PLL P, M and S value in D-PHY
|
|
*/
|
|
void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
|
|
unsigned int value)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
writel(DSIM_AFC_CTL(value), &mipi_dsim->phyacchr);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
|
|
unsigned int width_resol, unsigned int height_resol)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
/* standby should be set after configuration so set to not ready*/
|
|
reg = (readl(&mipi_dsim->mdresol)) & ~(DSIM_MAIN_STAND_BY);
|
|
writel(reg, &mipi_dsim->mdresol);
|
|
|
|
/* reset resolution */
|
|
reg &= ~(DSIM_MAIN_VRESOL(0x7ff) | DSIM_MAIN_HRESOL(0x7ff));
|
|
reg |= DSIM_MAIN_VRESOL(height_resol) | DSIM_MAIN_HRESOL(width_resol);
|
|
|
|
reg |= DSIM_MAIN_STAND_BY;
|
|
writel(reg, &mipi_dsim->mdresol);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
|
|
unsigned int cmd_allow, unsigned int vfront, unsigned int vback)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = (readl(&mipi_dsim->mvporch)) &
|
|
~((DSIM_CMD_ALLOW_MASK) | (DSIM_STABLE_VFP_MASK) |
|
|
(DSIM_MAIN_VBP_MASK));
|
|
|
|
reg |= ((cmd_allow & 0xf) << DSIM_CMD_ALLOW_SHIFT) |
|
|
((vfront & 0x7ff) << DSIM_STABLE_VFP_SHIFT) |
|
|
((vback & 0x7ff) << DSIM_MAIN_VBP_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->mvporch);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
|
|
unsigned int front, unsigned int back)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = (readl(&mipi_dsim->mhporch)) &
|
|
~((DSIM_MAIN_HFP_MASK) | (DSIM_MAIN_HBP_MASK));
|
|
|
|
reg |= (front << DSIM_MAIN_HFP_SHIFT) | (back << DSIM_MAIN_HBP_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->mhporch);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
|
|
unsigned int vert, unsigned int hori)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = (readl(&mipi_dsim->msync)) &
|
|
~((DSIM_MAIN_VSA_MASK) | (DSIM_MAIN_HSA_MASK));
|
|
|
|
reg |= ((vert & 0x3ff) << DSIM_MAIN_VSA_SHIFT) |
|
|
(hori << DSIM_MAIN_HSA_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->msync);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
|
|
unsigned int vert, unsigned int hori)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = (readl(&mipi_dsim->sdresol)) &
|
|
~(DSIM_SUB_STANDY_MASK);
|
|
|
|
writel(reg, &mipi_dsim->sdresol);
|
|
|
|
reg &= ~(DSIM_SUB_VRESOL_MASK) | ~(DSIM_SUB_HRESOL_MASK);
|
|
reg |= ((vert & 0x7ff) << DSIM_SUB_VRESOL_SHIFT) |
|
|
((hori & 0x7ff) << DSIM_SUB_HRESOL_SHIFT);
|
|
writel(reg, &mipi_dsim->sdresol);
|
|
|
|
/* DSIM STANDBY */
|
|
reg |= (1 << DSIM_SUB_STANDY_SHIFT);
|
|
writel(reg, &mipi_dsim->sdresol);
|
|
}
|
|
|
|
void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct mipi_dsim_config *dsim_config = dsim->dsim_config;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int cfg = (readl(&mipi_dsim->config)) &
|
|
~((1 << DSIM_EOT_PACKET_SHIFT) |
|
|
(0x1f << DSIM_HSA_MODE_SHIFT) |
|
|
(0x3 << DSIM_NUM_OF_DATALANE_SHIFT));
|
|
|
|
cfg |= (dsim_config->auto_flush << DSIM_AUTO_FLUSH_SHIFT) |
|
|
(dsim_config->eot_disable << DSIM_EOT_PACKET_SHIFT) |
|
|
(dsim_config->auto_vertical_cnt << DSIM_AUTO_MODE_SHIFT) |
|
|
(dsim_config->hse << DSIM_HSE_MODE_SHIFT) |
|
|
(dsim_config->hfp << DSIM_HFP_MODE_SHIFT) |
|
|
(dsim_config->hbp << DSIM_HBP_MODE_SHIFT) |
|
|
(dsim_config->hsa << DSIM_HSA_MODE_SHIFT) |
|
|
(dsim_config->e_no_data_lane << DSIM_NUM_OF_DATALANE_SHIFT);
|
|
|
|
writel(cfg, &mipi_dsim->config);
|
|
}
|
|
|
|
void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
|
|
struct mipi_dsim_config *dsim_config)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
u32 reg = (readl(&mipi_dsim->config)) &
|
|
~((0x3 << DSIM_BURST_MODE_SHIFT) | (1 << DSIM_VIDEO_MODE_SHIFT)
|
|
| (0x3 << DSIM_MAINVC_SHIFT) | (0x7 << DSIM_MAINPIX_SHIFT)
|
|
| (0x3 << DSIM_SUBVC_SHIFT) | (0x7 << DSIM_SUBPIX_SHIFT));
|
|
|
|
if (dsim_config->e_interface == DSIM_VIDEO)
|
|
reg |= (1 << DSIM_VIDEO_MODE_SHIFT);
|
|
else if (dsim_config->e_interface == DSIM_COMMAND)
|
|
reg &= ~(1 << DSIM_VIDEO_MODE_SHIFT);
|
|
else {
|
|
printf("unknown lcd type.\n");
|
|
return;
|
|
}
|
|
|
|
/* main lcd */
|
|
reg |= ((u8) (dsim_config->e_burst_mode) & 0x3) << DSIM_BURST_MODE_SHIFT
|
|
| ((u8) (dsim_config->e_virtual_ch) & 0x3) << DSIM_MAINVC_SHIFT
|
|
| ((u8) (dsim_config->e_pixel_format) & 0x7) << DSIM_MAINPIX_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->config);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim,
|
|
unsigned int lane, unsigned int enable)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = readl(&mipi_dsim->config);
|
|
|
|
if (enable)
|
|
reg |= DSIM_LANE_ENx(lane);
|
|
else
|
|
reg &= ~DSIM_LANE_ENx(lane);
|
|
|
|
writel(reg, &mipi_dsim->config);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
|
|
unsigned int count)
|
|
{
|
|
unsigned int cfg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
/* get the data lane number. */
|
|
cfg = DSIM_NUM_OF_DATA_LANE(count);
|
|
|
|
writel(cfg, &mipi_dsim->config);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim,
|
|
unsigned int enable, unsigned int afc_code)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->phyacchr);
|
|
|
|
reg = 0;
|
|
|
|
if (enable) {
|
|
reg |= DSIM_AFC_EN;
|
|
reg &= ~(0x7 << DSIM_AFC_CTL_SHIFT);
|
|
reg |= DSIM_AFC_CTL(afc_code);
|
|
} else
|
|
reg &= ~DSIM_AFC_EN;
|
|
|
|
writel(reg, &mipi_dsim->phyacchr);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
|
|
unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
|
|
~(DSIM_PLL_BYPASS_EXTERNAL);
|
|
|
|
reg |= enable << DSIM_PLL_BYPASS_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
|
|
unsigned int freq_band)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
|
|
~(0x1f << DSIM_FREQ_BAND_SHIFT);
|
|
|
|
reg |= ((freq_band & 0x1f) << DSIM_FREQ_BAND_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->pllctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
|
|
unsigned int pre_divider, unsigned int main_divider,
|
|
unsigned int scaler)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
|
|
~(0x7ffff << 1);
|
|
|
|
reg |= ((pre_divider & 0x3f) << DSIM_PREDIV_SHIFT) |
|
|
((main_divider & 0x1ff) << DSIM_MAIN_SHIFT) |
|
|
((scaler & 0x7) << DSIM_SCALER_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->pllctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
|
|
unsigned int lock_time)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
writel(lock_time, &mipi_dsim->plltmr);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim,
|
|
unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
|
|
~(0x1 << DSIM_PLL_EN_SHIFT);
|
|
|
|
reg |= ((enable & 0x1) << DSIM_PLL_EN_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->pllctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
|
|
unsigned int src)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
|
|
~(0x3 << DSIM_BYTE_CLK_SRC_SHIFT);
|
|
|
|
reg |= ((unsigned int) src) << DSIM_BYTE_CLK_SRC_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
|
|
unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
|
|
~(1 << DSIM_BYTE_CLKEN_SHIFT);
|
|
|
|
reg |= enable << DSIM_BYTE_CLKEN_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
|
|
unsigned int enable, unsigned int prs_val)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
|
|
~((1 << DSIM_ESC_CLKEN_SHIFT) | (0xffff));
|
|
|
|
reg |= enable << DSIM_ESC_CLKEN_SHIFT;
|
|
if (enable)
|
|
reg |= prs_val;
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
|
|
unsigned int lane_sel, unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->clkctrl);
|
|
|
|
if (enable)
|
|
reg |= DSIM_LANE_ESC_CLKEN(lane_sel);
|
|
else
|
|
reg &= ~DSIM_LANE_ESC_CLKEN(lane_sel);
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
|
|
unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->escmode)) &
|
|
~(0x1 << DSIM_FORCE_STOP_STATE_SHIFT);
|
|
|
|
reg |= ((enable & 0x1) << DSIM_FORCE_STOP_STATE_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->escmode);
|
|
}
|
|
|
|
unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->status);
|
|
|
|
/**
|
|
* check clock and data lane states.
|
|
* if MIPI-DSI controller was enabled at bootloader then
|
|
* TX_READY_HS_CLK is enabled otherwise STOP_STATE_CLK.
|
|
* so it should be checked for two case.
|
|
*/
|
|
if ((reg & DSIM_STOP_STATE_DAT(0xf)) &&
|
|
((reg & DSIM_STOP_STATE_CLK) ||
|
|
(reg & DSIM_TX_READY_HS_CLK)))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
|
|
unsigned int cnt_val)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->escmode)) &
|
|
~(0x7ff << DSIM_STOP_STATE_CNT_SHIFT);
|
|
|
|
reg |= ((cnt_val & 0x7ff) << DSIM_STOP_STATE_CNT_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->escmode);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
|
|
unsigned int timeout)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->timeout)) &
|
|
~(0xff << DSIM_BTA_TOUT_SHIFT);
|
|
|
|
reg |= (timeout << DSIM_BTA_TOUT_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->timeout);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
|
|
unsigned int timeout)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->timeout)) &
|
|
~(0xffff << DSIM_LPDR_TOUT_SHIFT);
|
|
|
|
reg |= (timeout << DSIM_LPDR_TOUT_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->timeout);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
|
|
unsigned int lp)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->escmode);
|
|
|
|
reg &= ~DSIM_CMD_LPDT_LP;
|
|
|
|
if (lp)
|
|
reg |= DSIM_CMD_LPDT_LP;
|
|
|
|
writel(reg, &mipi_dsim->escmode);
|
|
}
|
|
|
|
void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
|
|
unsigned int lp)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->escmode);
|
|
|
|
reg &= ~DSIM_TX_LPDT_LP;
|
|
|
|
if (lp)
|
|
reg |= DSIM_TX_LPDT_LP;
|
|
|
|
writel(reg, &mipi_dsim->escmode);
|
|
}
|
|
|
|
void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
|
|
unsigned int enable)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
|
|
~(1 << DSIM_TX_REQUEST_HSCLK_SHIFT);
|
|
|
|
reg |= enable << DSIM_TX_REQUEST_HSCLK_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->clkctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
|
|
unsigned int swap_en)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->phyacchr1);
|
|
|
|
reg &= ~(0x3 << DSIM_DPDN_SWAP_DATA_SHIFT);
|
|
reg |= (swap_en & 0x3) << DSIM_DPDN_SWAP_DATA_SHIFT;
|
|
|
|
writel(reg, &mipi_dsim->phyacchr1);
|
|
}
|
|
|
|
void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
|
|
unsigned int hs_zero)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
|
|
~(0xf << DSIM_ZEROCTRL_SHIFT);
|
|
|
|
reg |= ((hs_zero & 0xf) << DSIM_ZEROCTRL_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->pllctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim, unsigned int prep)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
|
|
~(0x7 << DSIM_PRECTRL_SHIFT);
|
|
|
|
reg |= ((prep & 0x7) << DSIM_PRECTRL_SHIFT);
|
|
|
|
writel(reg, &mipi_dsim->pllctrl);
|
|
}
|
|
|
|
void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->intsrc);
|
|
|
|
reg |= INTSRC_PLL_STABLE;
|
|
|
|
writel(reg, &mipi_dsim->intsrc);
|
|
}
|
|
|
|
void exynos_mipi_dsi_clear_all_interrupt(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
writel(0xffffffff, &mipi_dsim->intsrc);
|
|
}
|
|
|
|
unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim)
|
|
{
|
|
unsigned int reg;
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
reg = readl(&mipi_dsim->status);
|
|
|
|
return reg & DSIM_PLL_STABLE ? 1 : 0;
|
|
}
|
|
|
|
unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
return readl(&mipi_dsim->fifoctrl) & ~(0x1f);
|
|
}
|
|
|
|
void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
|
|
unsigned int di, unsigned int data0, unsigned int data1)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = (DSIM_PKTHDR_DAT1(data1) | DSIM_PKTHDR_DAT0(data0) |
|
|
DSIM_PKTHDR_DI(di));
|
|
|
|
writel(reg, &mipi_dsim->pkthdr);
|
|
}
|
|
|
|
unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device
|
|
*dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->intsrc);
|
|
|
|
return (reg & INTSRC_FRAME_DONE) ? 1 : 0;
|
|
}
|
|
|
|
void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
unsigned int reg = readl(&mipi_dsim->intsrc);
|
|
|
|
writel(reg | INTSRC_FRAME_DONE, &mipi_dsim->intsrc);
|
|
}
|
|
|
|
void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
|
|
unsigned int tx_data)
|
|
{
|
|
struct exynos_mipi_dsim *mipi_dsim =
|
|
(struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
|
|
|
|
writel(tx_data, &mipi_dsim->payload);
|
|
}
|