Search
SailfishOS Open Build Service
>
Projects
>
home:dcthang:branches:nemo:devel:hw:ti:omap3:n900
>
kernel-adaptation-n900
> linux-2.6-OMAP3-DSS-allow-board-specific-SDI-pin-muxing.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File linux-2.6-OMAP3-DSS-allow-board-specific-SDI-pin-muxing.patch of Package kernel-adaptation-n900
From b6a5e77a9d9f7b506828809f789d203b45515dbb Mon Sep 17 00:00:00 2001 From: Kalle Jokiniemi <kalle.jokiniemi@nokia.com> Date: Mon, 18 Apr 2011 15:34:15 +0300 Subject: [PATCH] OMAP3: DSS: allow board specific SDI pin muxing The SDI block in OMAP3430 SoC leaks statically 1,6mA of current if there is power available at VSDI_CSI power rail. This can be stopped if the regulator is shut down. However, on some boards, the other blocks powered by VSDI_CSI rail cannot be shut down, hence a new mechanism is needed to allow the leakage to be blocked. This patch introduces a mechanism for boards to pass function pointers to alter the pin muxing correctly when the SDI is powered on/off to block the current leak. Loosely based on patch by Imre Deak for Nokia N900 maemo kernel. Signed-off-by: Kalle Jokiniemi <kalle.jokiniemi@nokia.com> --- arch/arm/plat-omap/include/plat/display.h | 2 ++ drivers/video/omap2/dss/core.c | 2 +- drivers/video/omap2/dss/dss.h | 4 ++-- drivers/video/omap2/dss/sdi.c | 14 +++++++++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h index 488890e..dc63994 100644 --- a/arch/arm/plat-omap/include/plat/display.h +++ b/arch/arm/plat-omap/include/plat/display.h @@ -258,6 +258,8 @@ int dsi_vc_send_bta_sync(int channel); /* Board specific data */ struct omap_dss_board_info { int (*get_last_off_on_transaction_id)(struct device *dev); + /* set pin multiplexing (pad configuration) when powering on/off */ + void (*set_mux)(int on); int num_devices; struct omap_dss_device **devices; struct omap_dss_device *default_device; diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 8e89f60..d2d12e1 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c @@ -554,7 +554,7 @@ static int omap_dss_probe(struct platform_device *pdev) } if (cpu_is_omap34xx()) { - r = sdi_init(skip_init); + r = sdi_init(pdata, skip_init); if (r) { DSSERR("Failed to initialize SDI\n"); goto err_sdi; diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 8d14d94..4049c63 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h @@ -246,11 +246,11 @@ int dss_calc_clock_div(bool is_tft, unsigned long req_pck, /* SDI */ #ifdef CONFIG_OMAP2_DSS_SDI -int sdi_init(bool skip_init); +int sdi_init(struct omap_dss_board_info *pdata, bool skip_init); void sdi_exit(void); int sdi_init_display(struct omap_dss_device *display); #else -static inline int sdi_init(bool skip_init) +static inline int sdi_init(struct omap_dss_board_info *pdata, bool skip_init) { return 0; } diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c index ee07a3c..7f2dcdf 100644 --- a/drivers/video/omap2/dss/sdi.c +++ b/drivers/video/omap2/dss/sdi.c @@ -33,8 +33,13 @@ static struct { bool skip_init; bool update_enabled; struct regulator *vdds_sdi_reg; + void (*set_mux)(int on); } sdi; +static void sdi_mux_null(int on) +{ +} + static void sdi_basic_init(void) { dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS); @@ -64,6 +69,8 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) if (r) goto err1; + sdi.set_mux(1); + /* In case of skip_init sdi_init has already enabled the clocks */ if (!sdi.skip_init) dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); @@ -143,6 +150,7 @@ void omapdss_sdi_display_disable(struct omap_dss_device *dssdev) dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); + sdi.set_mux(0); regulator_disable(sdi.vdds_sdi_reg); omap_dss_stop_device(dssdev); @@ -156,10 +164,14 @@ int sdi_init_display(struct omap_dss_device *dssdev) return 0; } -int sdi_init(bool skip_init) +int sdi_init(struct omap_dss_board_info *pdata, bool skip_init) { /* we store this for first display enable, then clear it */ sdi.skip_init = skip_init; + if (pdata->set_mux) + sdi.set_mux = pdata->set_mux; + else + sdi.set_mux = &sdi_mux_null; sdi.vdds_sdi_reg = dss_get_vdds_sdi(); if (IS_ERR(sdi.vdds_sdi_reg)) { -- 1.7.0.4