diff options
Diffstat (limited to 'drivers/video/omap2/dss/sdi.c')
-rw-r--r-- | drivers/video/omap2/dss/sdi.c | 62 |
1 files changed, 24 insertions, 38 deletions
diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c index b64adf7dfc8..54a53e64818 100644 --- a/drivers/video/omap2/dss/sdi.c +++ b/drivers/video/omap2/dss/sdi.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include "dss.h" | 30 | #include "dss.h" |
31 | 31 | ||
32 | static struct { | 32 | static struct { |
33 | bool skip_init; | ||
34 | bool update_enabled; | 33 | bool update_enabled; |
35 | struct regulator *vdds_sdi_reg; | 34 | struct regulator *vdds_sdi_reg; |
36 | } sdi; | 35 | } sdi; |
@@ -68,9 +67,7 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) | |||
68 | if (r) | 67 | if (r) |
69 | goto err1; | 68 | goto err1; |
70 | 69 | ||
71 | /* In case of skip_init sdi_init has already enabled the clocks */ | 70 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); |
72 | if (!sdi.skip_init) | ||
73 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | ||
74 | 71 | ||
75 | sdi_basic_init(dssdev); | 72 | sdi_basic_init(dssdev); |
76 | 73 | ||
@@ -80,14 +77,8 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) | |||
80 | dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config, | 77 | dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config, |
81 | dssdev->panel.acbi, dssdev->panel.acb); | 78 | dssdev->panel.acbi, dssdev->panel.acb); |
82 | 79 | ||
83 | if (!sdi.skip_init) { | 80 | r = dss_calc_clock_div(1, t->pixel_clock * 1000, |
84 | r = dss_calc_clock_div(1, t->pixel_clock * 1000, | 81 | &dss_cinfo, &dispc_cinfo); |
85 | &dss_cinfo, &dispc_cinfo); | ||
86 | } else { | ||
87 | r = dss_get_clock_div(&dss_cinfo); | ||
88 | r = dispc_get_clock_div(dssdev->manager->id, &dispc_cinfo); | ||
89 | } | ||
90 | |||
91 | if (r) | 82 | if (r) |
92 | goto err2; | 83 | goto err2; |
93 | 84 | ||
@@ -116,21 +107,17 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) | |||
116 | if (r) | 107 | if (r) |
117 | goto err2; | 108 | goto err2; |
118 | 109 | ||
119 | if (!sdi.skip_init) { | 110 | dss_sdi_init(dssdev->phy.sdi.datapairs); |
120 | dss_sdi_init(dssdev->phy.sdi.datapairs); | 111 | r = dss_sdi_enable(); |
121 | r = dss_sdi_enable(); | 112 | if (r) |
122 | if (r) | 113 | goto err1; |
123 | goto err1; | 114 | mdelay(2); |
124 | mdelay(2); | ||
125 | } | ||
126 | 115 | ||
127 | dssdev->manager->enable(dssdev->manager); | 116 | dssdev->manager->enable(dssdev->manager); |
128 | 117 | ||
129 | sdi.skip_init = 0; | ||
130 | |||
131 | return 0; | 118 | return 0; |
132 | err2: | 119 | err2: |
133 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 120 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); |
134 | regulator_disable(sdi.vdds_sdi_reg); | 121 | regulator_disable(sdi.vdds_sdi_reg); |
135 | err1: | 122 | err1: |
136 | omap_dss_stop_device(dssdev); | 123 | omap_dss_stop_device(dssdev); |
@@ -145,7 +132,7 @@ void omapdss_sdi_display_disable(struct omap_dss_device *dssdev) | |||
145 | 132 | ||
146 | dss_sdi_disable(); | 133 | dss_sdi_disable(); |
147 | 134 | ||
148 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 135 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); |
149 | 136 | ||
150 | regulator_disable(sdi.vdds_sdi_reg); | 137 | regulator_disable(sdi.vdds_sdi_reg); |
151 | 138 | ||
@@ -157,25 +144,24 @@ int sdi_init_display(struct omap_dss_device *dssdev) | |||
157 | { | 144 | { |
158 | DSSDBG("SDI init\n"); | 145 | DSSDBG("SDI init\n"); |
159 | 146 | ||
147 | if (sdi.vdds_sdi_reg == NULL) { | ||
148 | struct regulator *vdds_sdi; | ||
149 | |||
150 | vdds_sdi = dss_get_vdds_sdi(); | ||
151 | |||
152 | if (IS_ERR(vdds_sdi)) { | ||
153 | DSSERR("can't get VDDS_SDI regulator\n"); | ||
154 | return PTR_ERR(vdds_sdi); | ||
155 | } | ||
156 | |||
157 | sdi.vdds_sdi_reg = vdds_sdi; | ||
158 | } | ||
159 | |||
160 | return 0; | 160 | return 0; |
161 | } | 161 | } |
162 | 162 | ||
163 | int sdi_init(bool skip_init) | 163 | int sdi_init(void) |
164 | { | 164 | { |
165 | /* we store this for first display enable, then clear it */ | ||
166 | sdi.skip_init = skip_init; | ||
167 | |||
168 | sdi.vdds_sdi_reg = dss_get_vdds_sdi(); | ||
169 | if (IS_ERR(sdi.vdds_sdi_reg)) { | ||
170 | DSSERR("can't get VDDS_SDI regulator\n"); | ||
171 | return PTR_ERR(sdi.vdds_sdi_reg); | ||
172 | } | ||
173 | /* | ||
174 | * Enable clocks already here, otherwise there would be a toggle | ||
175 | * of them until sdi_display_enable is called. | ||
176 | */ | ||
177 | if (skip_init) | ||
178 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | ||
179 | return 0; | 165 | return 0; |
180 | } | 166 | } |
181 | 167 | ||