diff options
author | Scott Williams <scwilliams@nvidia.com> | 2012-01-26 13:41:49 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:02:32 -0400 |
commit | 976e1c9a5d2b1840d667960d7d305314f3cbc711 (patch) | |
tree | d8926e38b2ee5421b74b715d520ef9f00db969e5 /drivers/video/tegra/dc/dsi.c | |
parent | a4859d8474f830cea793a468bca85db5352c71bd (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.c | 152 |
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 | ||
297 | const 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 | |||
297 | inline unsigned long tegra_dsi_readl(struct tegra_dc_dsi_data *dsi, u32 reg) | 307 | inline 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); | 1635 | static 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); | 1664 | static 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 | ||
1630 | static void tegra_dsi_panelB_enable(void) | 1694 | static 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 | ||
1639 | static int tegra_dsi_init_hw(struct tegra_dc *dc, | 1716 | static 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); |