summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dsi.c
diff options
context:
space:
mode:
authorScott Williams <scwilliams@nvidia.com>2012-01-26 13:41:49 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:02:32 -0400
commit976e1c9a5d2b1840d667960d7d305314f3cbc711 (patch)
treed8926e38b2ee5421b74b715d520ef9f00db969e5 /drivers/video/tegra/dc/dsi.c
parenta4859d8474f830cea793a468bca85db5352c71bd (diff)
video: tegra: dsi: config pad settings
Configure new pad registers for dsi controller. Bug 837129 Reviewed-on: http://git-master/r/55720 Reviewed-by: Animesh Kishore <ankishore@nvidia.com> Tested-by: Animesh Kishore <ankishore@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Reviewed-by: Jon Mayo <jmayo@nvidia.com> (cherry picked from commit 07fbe146ba58ce860fadb9ad5876f2579a16b324) Change-Id: Icf03606af8f908b6b85614209b9ff241d7ca59f3 Signed-off-by: Scott Williams <scwilliams@nvidia.com> Reviewed-on: http://git-master/r/77598 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo <jmayo@nvidia.com> Reviewed-by: Chao Xu <cxu@nvidia.com> Reviewed-by: Animesh Kishore <ankishore@nvidia.com> Reviewed-by: Mark Stadler <mastadler@nvidia.com> Rebase-Id: R4625323bf8ffe37e713c07150a02202218e8ec0d
Diffstat (limited to 'drivers/video/tegra/dc/dsi.c')
-rw-r--r--drivers/video/tegra/dc/dsi.c152
1 files changed, 114 insertions, 38 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 1dcac7cdb..14b2b6f89 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -294,6 +294,16 @@ const u32 init_reg[] = {
294 DSI_PKT_LEN_6_7, 294 DSI_PKT_LEN_6_7,
295}; 295};
296 296
297const u32 init_reg_vs1_ext[] = {
298 DSI_PAD_CONTROL_0_VS1,
299 DSI_PAD_CONTROL_CD_VS1,
300 DSI_PAD_CD_STATUS_VS1,
301 DSI_PAD_CONTROL_1_VS1,
302 DSI_PAD_CONTROL_2_VS1,
303 DSI_PAD_CONTROL_3_VS1,
304 DSI_PAD_CONTROL_4_VS1,
305};
306
297inline unsigned long tegra_dsi_readl(struct tegra_dc_dsi_data *dsi, u32 reg) 307inline unsigned long tegra_dsi_readl(struct tegra_dc_dsi_data *dsi, u32 reg)
298{ 308{
299 unsigned long ret; 309 unsigned long ret;
@@ -1595,45 +1605,112 @@ static void tegra_dsi_pad_calibration(struct tegra_dc_dsi_data *dsi)
1595{ 1605{
1596 u32 val; 1606 u32 val;
1597 1607
1598 val = DSI_PAD_CONTROL_PAD_LPUPADJ(0x1) | 1608 if (dsi->info.controller_vs == DSI_VS_1) {
1599 DSI_PAD_CONTROL_PAD_LPDNADJ(0x1) | 1609 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL_0_VS1);
1600 DSI_PAD_CONTROL_PAD_PREEMP_EN(0x1) | 1610 val &= ~(DSI_PAD_CONTROL_0_VS1_PAD_PDIO(0xf) |
1601 DSI_PAD_CONTROL_PAD_SLEWDNADJ(0x6) | 1611 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK(0x1) |
1602 DSI_PAD_CONTROL_PAD_SLEWUPADJ(0x6); 1612 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB(0xf) |
1603 if (!dsi->ulpm) { 1613 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB(0x1));
1604 val |= DSI_PAD_CONTROL_PAD_PDIO(0) | 1614 val |= DSI_PAD_CONTROL_0_VS1_PAD_PDIO(0xf) |
1605 DSI_PAD_CONTROL_PAD_PDIO_CLK(0) | 1615 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK
1606 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_DISABLE); 1616 (TEGRA_DSI_ENABLE) |
1617 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB(0xf) |
1618 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB
1619 (TEGRA_DSI_ENABLE);
1620 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL_0_VS1);
1607 } else { 1621 } else {
1608 val |= DSI_PAD_CONTROL_PAD_PDIO(0x3) | 1622 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL);
1623
1624 val &= ~(DSI_PAD_CONTROL_PAD_PDIO(0x3) |
1609 DSI_PAD_CONTROL_PAD_PDIO_CLK(0x1) | 1625 DSI_PAD_CONTROL_PAD_PDIO_CLK(0x1) |
1626 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(0x1));
1627
1628 val |= DSI_PAD_CONTROL_PAD_PDIO(0x3) |
1629 DSI_PAD_CONTROL_PAD_PDIO_CLK(TEGRA_DSI_ENABLE) |
1610 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_ENABLE); 1630 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_ENABLE);
1631 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL);
1611 } 1632 }
1612 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL); 1633}
1613
1614 val = MIPI_CAL_TERMOSA(0x4);
1615 tegra_vi_csi_writel(val, CSI_CILA_MIPI_CAL_CONFIG_0);
1616 1634
1617 val = MIPI_CAL_TERMOSB(0x4); 1635static void tegra_dsi_pad_disable(struct tegra_dc_dsi_data *dsi)
1618 tegra_vi_csi_writel(val, CSI_CILB_MIPI_CAL_CONFIG_0); 1636{
1637 u32 val;
1619 1638
1620 val = MIPI_CAL_HSPUOSD(0x3) | MIPI_CAL_HSPDOSD(0x4); 1639 if (dsi->info.controller_vs == DSI_VS_1) {
1621 tegra_vi_csi_writel(val, CSI_DSI_MIPI_CAL_CONFIG); 1640 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL_0_VS1);
1641 val &= ~(DSI_PAD_CONTROL_0_VS1_PAD_PDIO(0xf) |
1642 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK(0x1) |
1643 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB(0xf) |
1644 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB(0x1));
1645 val |= DSI_PAD_CONTROL_0_VS1_PAD_PDIO(0xf) |
1646 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK
1647 (TEGRA_DSI_ENABLE) |
1648 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB(0xf) |
1649 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB
1650 (TEGRA_DSI_ENABLE);
1651 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL_0_VS1);
1652 } else {
1653 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL);
1654 val &= ~(DSI_PAD_CONTROL_PAD_PDIO(0x3) |
1655 DSI_PAD_CONTROL_PAD_PDIO_CLK(0x1) |
1656 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(0x1));
1657 val |= DSI_PAD_CONTROL_PAD_PDIO(0x3) |
1658 DSI_PAD_CONTROL_PAD_PDIO_CLK(TEGRA_DSI_ENABLE) |
1659 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_ENABLE);
1660 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL);
1661 }
1662}
1622 1663
1623 val = PAD_DRIV_DN_REF(0x5) | PAD_DRIV_UP_REF(0x7); 1664static void tegra_dsi_pad_enable(struct tegra_dc_dsi_data *dsi)
1624 tegra_vi_csi_writel(val, CSI_MIPIBIAS_PAD_CONFIG); 1665{
1666 u32 val;
1625 1667
1626 val = PAD_CIL_PDVREG(0x0); 1668 if (dsi->info.controller_vs == DSI_VS_1) {
1627 tegra_vi_csi_writel(val, CSI_CIL_PAD_CONFIG); 1669 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL_0_VS1);
1670 val &= ~(DSI_PAD_CONTROL_0_VS1_PAD_PDIO(0xf) |
1671 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK(0x1) |
1672 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB(0xf) |
1673 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB(0x1));
1674 val |= DSI_PAD_CONTROL_0_VS1_PAD_PDIO(TEGRA_DSI_DISABLE) |
1675 DSI_PAD_CONTROL_0_VS1_PAD_PDIO_CLK
1676 (TEGRA_DSI_DISABLE) |
1677 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_ENAB
1678 (TEGRA_DSI_DISABLE) |
1679 DSI_PAD_CONTROL_0_VS1_PAD_PULLDN_CLK_ENAB
1680 (TEGRA_DSI_DISABLE);
1681 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL_0_VS1);
1682 } else {
1683 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL);
1684 val &= ~(DSI_PAD_CONTROL_PAD_PDIO(0x3) |
1685 DSI_PAD_CONTROL_PAD_PDIO_CLK(0x1) |
1686 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(0x1));
1687 val |= DSI_PAD_CONTROL_PAD_PDIO(TEGRA_DSI_DISABLE) |
1688 DSI_PAD_CONTROL_PAD_PDIO_CLK(TEGRA_DSI_DISABLE) |
1689 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_DISABLE);
1690 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL);
1691 }
1628} 1692}
1629 1693
1630static void tegra_dsi_panelB_enable(void) 1694static void tegra_dsi_config_pad(struct tegra_dc_dsi_data *dsi)
1631{ 1695{
1632 unsigned int val; 1696 u32 val;
1633 1697
1634 val = readl(IO_ADDRESS(APB_MISC_GP_MIPI_PAD_CTRL_0)); 1698 if (dsi->info.controller_vs == DSI_VS_1) {
1635 val |= DSIB_MODE_ENABLE; 1699 /* TODO: Config pad */
1636 writel(val, (IO_ADDRESS(APB_MISC_GP_MIPI_PAD_CTRL_0))); 1700 } else {
1701 val = tegra_dsi_readl(dsi, DSI_PAD_CONTROL);
1702 val &= ~(DSI_PAD_CONTROL_PAD_LPUPADJ(0x3) |
1703 DSI_PAD_CONTROL_PAD_LPDNADJ(0x3) |
1704 DSI_PAD_CONTROL_PAD_PREEMP_EN(0x1) |
1705 DSI_PAD_CONTROL_PAD_SLEWDNADJ(0x7) |
1706 DSI_PAD_CONTROL_PAD_SLEWUPADJ(0x7));
1707 val |= DSI_PAD_CONTROL_PAD_LPUPADJ(0x1) |
1708 DSI_PAD_CONTROL_PAD_LPDNADJ(0x1) |
1709 DSI_PAD_CONTROL_PAD_PREEMP_EN(0x1) |
1710 DSI_PAD_CONTROL_PAD_SLEWDNADJ(0x6) |
1711 DSI_PAD_CONTROL_PAD_SLEWUPADJ(0x6);
1712 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL);
1713 }
1637} 1714}
1638 1715
1639static int tegra_dsi_init_hw(struct tegra_dc *dc, 1716static int tegra_dsi_init_hw(struct tegra_dc *dc,
@@ -1650,6 +1727,7 @@ static int tegra_dsi_init_hw(struct tegra_dc *dc,
1650 tegra_dsi_set_dsi_clk(dc, dsi, dsi->target_lp_clk_khz); 1727 tegra_dsi_set_dsi_clk(dc, dsi, dsi->target_lp_clk_khz);
1651 if (dsi->info.dsi_instance) { 1728 if (dsi->info.dsi_instance) {
1652 tegra_dsi_panelB_enable(); 1729 tegra_dsi_panelB_enable();
1730 /* TODO:Set the misc register */
1653 } 1731 }
1654 1732
1655 /* TODO: only need to change the timing for bta */ 1733 /* TODO: only need to change the timing for bta */
@@ -1658,9 +1736,13 @@ static int tegra_dsi_init_hw(struct tegra_dc *dc,
1658 if (dsi->status.dc_stream == DSI_DC_STREAM_ENABLE) 1736 if (dsi->status.dc_stream == DSI_DC_STREAM_ENABLE)
1659 tegra_dsi_stop_dc_stream_at_frame_end(dc, dsi); 1737 tegra_dsi_stop_dc_stream_at_frame_end(dc, dsi);
1660 1738
1661 /* Initializing DSI registers */ 1739 /* Initialize DSI registers */
1662 for (i = 0; i < ARRAY_SIZE(init_reg); i++) 1740 for (i = 0; i < ARRAY_SIZE(init_reg); i++)
1663 tegra_dsi_writel(dsi, 0, init_reg[i]); 1741 tegra_dsi_writel(dsi, 0, init_reg[i]);
1742 if (dsi->info.controller_vs == DSI_VS_1) {
1743 for (i = 0; i < ARRAY_SIZE(init_reg_vs1_ext); i++)
1744 tegra_dsi_writel(dsi, 0, init_reg_vs1_ext[i]);
1745 }
1664 1746
1665 tegra_dsi_writel(dsi, dsi->dsi_control_val, DSI_CONTROL); 1747 tegra_dsi_writel(dsi, dsi->dsi_control_val, DSI_CONTROL);
1666 1748
@@ -2607,7 +2689,6 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc)
2607{ 2689{
2608 struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); 2690 struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc);
2609 int err; 2691 int err;
2610 u32 val;
2611 2692
2612 tegra_dc_io_start(dc); 2693 tegra_dc_io_start(dc);
2613 mutex_lock(&dsi->lock); 2694 mutex_lock(&dsi->lock);
@@ -2655,6 +2736,8 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc)
2655 } 2736 }
2656 2737
2657 if (dsi->ulpm) { 2738 if (dsi->ulpm) {
2739 u32 val;
2740
2658 if (tegra_dsi_enter_ulpm(dsi) < 0) { 2741 if (tegra_dsi_enter_ulpm(dsi) < 0) {
2659 dev_err(&dc->ndev->dev, 2742 dev_err(&dc->ndev->dev,
2660 "DSI failed to enter ulpm\n"); 2743 "DSI failed to enter ulpm\n");
@@ -3047,15 +3130,8 @@ static int tegra_dsi_deep_sleep(struct tegra_dc *dc,
3047 } 3130 }
3048 } 3131 }
3049 3132
3050 /* 3133 /* Suspend pad */
3051 * Suspend pad 3134 tegra_dsi_pad_disable(dsi);
3052 * It is ok to overwrite previous value of DSI_PAD_CONTROL reg
3053 * because it will be restored properly in resume sequence
3054 */
3055 val = DSI_PAD_CONTROL_PAD_PDIO(0x3) |
3056 DSI_PAD_CONTROL_PAD_PDIO_CLK(0x1) |
3057 DSI_PAD_CONTROL_PAD_PULLDN_ENAB(TEGRA_DSI_ENABLE);
3058 tegra_dsi_writel(dsi, val, DSI_PAD_CONTROL);
3059 3135
3060 /* Suspend core-logic */ 3136 /* Suspend core-logic */
3061 val = DSI_POWER_CONTROL_LEG_DSI_ENABLE(TEGRA_DSI_DISABLE); 3137 val = DSI_POWER_CONTROL_LEG_DSI_ENABLE(TEGRA_DSI_DISABLE);