diff options
-rw-r--r-- | arch/arm/mach-shmobile/board-ag5evm.c | 198 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/board-mackerel.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/mach-ap325rxa/setup.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/mach-ecovec24/setup.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/mach-kfr2r09/lcd_wqvga.c | 16 | ||||
-rw-r--r-- | arch/sh/boards/mach-kfr2r09/setup.c | 7 | ||||
-rw-r--r-- | arch/sh/include/mach-kfr2r09/mach/kfr2r09.h | 6 | ||||
-rw-r--r-- | drivers/video/sh_mipi_dsi.c | 69 | ||||
-rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 74 | ||||
-rw-r--r-- | drivers/video/sh_mobile_lcdcfb.h | 1 | ||||
-rw-r--r-- | include/video/sh_mipi_dsi.h | 4 | ||||
-rw-r--r-- | include/video/sh_mobile_lcdc.h | 1 |
13 files changed, 192 insertions, 206 deletions
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 25eb88a923e6..032d10817e79 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -213,95 +213,6 @@ static struct platform_device irda_device = { | |||
213 | .num_resources = ARRAY_SIZE(irda_resources), | 213 | .num_resources = ARRAY_SIZE(irda_resources), |
214 | }; | 214 | }; |
215 | 215 | ||
216 | static unsigned char lcd_backlight_seq[3][2] = { | ||
217 | { 0x04, 0x07 }, | ||
218 | { 0x23, 0x80 }, | ||
219 | { 0x03, 0x01 }, | ||
220 | }; | ||
221 | |||
222 | static void lcd_backlight_on(void) | ||
223 | { | ||
224 | struct i2c_adapter *a; | ||
225 | struct i2c_msg msg; | ||
226 | int k; | ||
227 | |||
228 | a = i2c_get_adapter(1); | ||
229 | for (k = 0; a && k < 3; k++) { | ||
230 | msg.addr = 0x6d; | ||
231 | msg.buf = &lcd_backlight_seq[k][0]; | ||
232 | msg.len = 2; | ||
233 | msg.flags = 0; | ||
234 | if (i2c_transfer(a, &msg, 1) != 1) | ||
235 | break; | ||
236 | } | ||
237 | } | ||
238 | |||
239 | static void lcd_backlight_reset(void) | ||
240 | { | ||
241 | gpio_set_value(GPIO_PORT235, 0); | ||
242 | mdelay(24); | ||
243 | gpio_set_value(GPIO_PORT235, 1); | ||
244 | } | ||
245 | |||
246 | /* LCDC0 */ | ||
247 | static const struct fb_videomode lcdc0_modes[] = { | ||
248 | { | ||
249 | .name = "R63302(QHD)", | ||
250 | .xres = 544, | ||
251 | .yres = 961, | ||
252 | .left_margin = 72, | ||
253 | .right_margin = 600, | ||
254 | .hsync_len = 16, | ||
255 | .upper_margin = 8, | ||
256 | .lower_margin = 8, | ||
257 | .vsync_len = 2, | ||
258 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
259 | }, | ||
260 | }; | ||
261 | |||
262 | static struct sh_mobile_lcdc_info lcdc0_info = { | ||
263 | .clock_source = LCDC_CLK_PERIPHERAL, | ||
264 | .ch[0] = { | ||
265 | .chan = LCDC_CHAN_MAINLCD, | ||
266 | .interface_type = RGB24, | ||
267 | .clock_divider = 1, | ||
268 | .flags = LCDC_FLAGS_DWPOL, | ||
269 | .fourcc = V4L2_PIX_FMT_RGB565, | ||
270 | .lcd_modes = lcdc0_modes, | ||
271 | .num_modes = ARRAY_SIZE(lcdc0_modes), | ||
272 | .panel_cfg = { | ||
273 | .width = 44, | ||
274 | .height = 79, | ||
275 | .display_on = lcd_backlight_on, | ||
276 | .display_off = lcd_backlight_reset, | ||
277 | }, | ||
278 | } | ||
279 | }; | ||
280 | |||
281 | static struct resource lcdc0_resources[] = { | ||
282 | [0] = { | ||
283 | .name = "LCDC0", | ||
284 | .start = 0xfe940000, /* P4-only space */ | ||
285 | .end = 0xfe943fff, | ||
286 | .flags = IORESOURCE_MEM, | ||
287 | }, | ||
288 | [1] = { | ||
289 | .start = intcs_evt2irq(0x580), | ||
290 | .flags = IORESOURCE_IRQ, | ||
291 | }, | ||
292 | }; | ||
293 | |||
294 | static struct platform_device lcdc0_device = { | ||
295 | .name = "sh_mobile_lcdc_fb", | ||
296 | .num_resources = ARRAY_SIZE(lcdc0_resources), | ||
297 | .resource = lcdc0_resources, | ||
298 | .id = 0, | ||
299 | .dev = { | ||
300 | .platform_data = &lcdc0_info, | ||
301 | .coherent_dma_mask = ~0, | ||
302 | }, | ||
303 | }; | ||
304 | |||
305 | /* MIPI-DSI */ | 216 | /* MIPI-DSI */ |
306 | static struct resource mipidsi0_resources[] = { | 217 | static struct resource mipidsi0_resources[] = { |
307 | [0] = { | 218 | [0] = { |
@@ -358,7 +269,7 @@ sh_mipi_set_dot_clock_pck_err: | |||
358 | 269 | ||
359 | static struct sh_mipi_dsi_info mipidsi0_info = { | 270 | static struct sh_mipi_dsi_info mipidsi0_info = { |
360 | .data_format = MIPI_RGB888, | 271 | .data_format = MIPI_RGB888, |
361 | .lcd_chan = &lcdc0_info.ch[0], | 272 | .channel = LCDC_CHAN_MAINLCD, |
362 | .lane = 2, | 273 | .lane = 2, |
363 | .vsynw_offset = 20, | 274 | .vsynw_offset = 20, |
364 | .clksrc = 1, | 275 | .clksrc = 1, |
@@ -378,6 +289,109 @@ static struct platform_device mipidsi0_device = { | |||
378 | }, | 289 | }, |
379 | }; | 290 | }; |
380 | 291 | ||
292 | static unsigned char lcd_backlight_seq[3][2] = { | ||
293 | { 0x04, 0x07 }, | ||
294 | { 0x23, 0x80 }, | ||
295 | { 0x03, 0x01 }, | ||
296 | }; | ||
297 | |||
298 | static int lcd_backlight_set_brightness(int brightness) | ||
299 | { | ||
300 | struct i2c_adapter *adap; | ||
301 | struct i2c_msg msg; | ||
302 | unsigned int i; | ||
303 | int ret; | ||
304 | |||
305 | if (brightness == 0) { | ||
306 | /* Reset the chip */ | ||
307 | gpio_set_value(GPIO_PORT235, 0); | ||
308 | mdelay(24); | ||
309 | gpio_set_value(GPIO_PORT235, 1); | ||
310 | return 0; | ||
311 | } | ||
312 | |||
313 | adap = i2c_get_adapter(1); | ||
314 | if (adap == NULL) | ||
315 | return -ENODEV; | ||
316 | |||
317 | for (i = 0; i < ARRAY_SIZE(lcd_backlight_seq); i++) { | ||
318 | msg.addr = 0x6d; | ||
319 | msg.buf = &lcd_backlight_seq[i][0]; | ||
320 | msg.len = 2; | ||
321 | msg.flags = 0; | ||
322 | |||
323 | ret = i2c_transfer(adap, &msg, 1); | ||
324 | if (ret < 0) | ||
325 | break; | ||
326 | } | ||
327 | |||
328 | i2c_put_adapter(adap); | ||
329 | return ret < 0 ? ret : 0; | ||
330 | } | ||
331 | |||
332 | /* LCDC0 */ | ||
333 | static const struct fb_videomode lcdc0_modes[] = { | ||
334 | { | ||
335 | .name = "R63302(QHD)", | ||
336 | .xres = 544, | ||
337 | .yres = 961, | ||
338 | .left_margin = 72, | ||
339 | .right_margin = 600, | ||
340 | .hsync_len = 16, | ||
341 | .upper_margin = 8, | ||
342 | .lower_margin = 8, | ||
343 | .vsync_len = 2, | ||
344 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
345 | }, | ||
346 | }; | ||
347 | |||
348 | static struct sh_mobile_lcdc_info lcdc0_info = { | ||
349 | .clock_source = LCDC_CLK_PERIPHERAL, | ||
350 | .ch[0] = { | ||
351 | .chan = LCDC_CHAN_MAINLCD, | ||
352 | .interface_type = RGB24, | ||
353 | .clock_divider = 1, | ||
354 | .flags = LCDC_FLAGS_DWPOL, | ||
355 | .fourcc = V4L2_PIX_FMT_RGB565, | ||
356 | .lcd_modes = lcdc0_modes, | ||
357 | .num_modes = ARRAY_SIZE(lcdc0_modes), | ||
358 | .panel_cfg = { | ||
359 | .width = 44, | ||
360 | .height = 79, | ||
361 | }, | ||
362 | .bl_info = { | ||
363 | .name = "sh_mobile_lcdc_bl", | ||
364 | .max_brightness = 1, | ||
365 | .set_brightness = lcd_backlight_set_brightness, | ||
366 | }, | ||
367 | .tx_dev = &mipidsi0_device, | ||
368 | } | ||
369 | }; | ||
370 | |||
371 | static struct resource lcdc0_resources[] = { | ||
372 | [0] = { | ||
373 | .name = "LCDC0", | ||
374 | .start = 0xfe940000, /* P4-only space */ | ||
375 | .end = 0xfe943fff, | ||
376 | .flags = IORESOURCE_MEM, | ||
377 | }, | ||
378 | [1] = { | ||
379 | .start = intcs_evt2irq(0x580), | ||
380 | .flags = IORESOURCE_IRQ, | ||
381 | }, | ||
382 | }; | ||
383 | |||
384 | static struct platform_device lcdc0_device = { | ||
385 | .name = "sh_mobile_lcdc_fb", | ||
386 | .num_resources = ARRAY_SIZE(lcdc0_resources), | ||
387 | .resource = lcdc0_resources, | ||
388 | .id = 0, | ||
389 | .dev = { | ||
390 | .platform_data = &lcdc0_info, | ||
391 | .coherent_dma_mask = ~0, | ||
392 | }, | ||
393 | }; | ||
394 | |||
381 | /* Fixed 2.8V regulators to be used by SDHI0 */ | 395 | /* Fixed 2.8V regulators to be used by SDHI0 */ |
382 | static struct regulator_consumer_supply fixed2v8_power_consumers[] = | 396 | static struct regulator_consumer_supply fixed2v8_power_consumers[] = |
383 | { | 397 | { |
@@ -531,8 +545,8 @@ static struct platform_device *ag5evm_devices[] __initdata = { | |||
531 | &fsi_device, | 545 | &fsi_device, |
532 | &mmc_device, | 546 | &mmc_device, |
533 | &irda_device, | 547 | &irda_device, |
534 | &lcdc0_device, | ||
535 | &mipidsi0_device, | 548 | &mipidsi0_device, |
549 | &lcdc0_device, | ||
536 | &sdhi0_device, | 550 | &sdhi0_device, |
537 | &sdhi1_device, | 551 | &sdhi1_device, |
538 | }; | 552 | }; |
@@ -621,7 +635,7 @@ static void __init ag5evm_init(void) | |||
621 | /* LCD backlight controller */ | 635 | /* LCD backlight controller */ |
622 | gpio_request(GPIO_PORT235, NULL); /* RESET */ | 636 | gpio_request(GPIO_PORT235, NULL); /* RESET */ |
623 | gpio_direction_output(GPIO_PORT235, 0); | 637 | gpio_direction_output(GPIO_PORT235, 0); |
624 | lcd_backlight_reset(); | 638 | lcd_backlight_set_brightness(0); |
625 | 639 | ||
626 | /* enable SDHI0 on CN15 [SD I/F] */ | 640 | /* enable SDHI0 on CN15 [SD I/F] */ |
627 | gpio_request(GPIO_FN_SDHIWP0, NULL); | 641 | gpio_request(GPIO_FN_SDHIWP0, NULL); |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 790dc68c4312..728ed4d026c7 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
@@ -552,11 +552,9 @@ static struct resource mipidsi0_resources[] = { | |||
552 | }, | 552 | }, |
553 | }; | 553 | }; |
554 | 554 | ||
555 | static struct sh_mobile_lcdc_info lcdc_info; | ||
556 | |||
557 | static struct sh_mipi_dsi_info mipidsi0_info = { | 555 | static struct sh_mipi_dsi_info mipidsi0_info = { |
558 | .data_format = MIPI_RGB888, | 556 | .data_format = MIPI_RGB888, |
559 | .lcd_chan = &lcdc_info.ch[0], | 557 | .channel = LCDC_CHAN_MAINLCD, |
560 | .lane = 2, | 558 | .lane = 2, |
561 | .vsynw_offset = 17, | 559 | .vsynw_offset = 17, |
562 | .phyctrl = 0x6 << 8, | 560 | .phyctrl = 0x6 << 8, |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 0c27c810cf99..bfd2dc83d995 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -370,11 +370,6 @@ static int mackerel_set_brightness(int brightness) | |||
370 | return 0; | 370 | return 0; |
371 | } | 371 | } |
372 | 372 | ||
373 | static int mackerel_get_brightness(void) | ||
374 | { | ||
375 | return gpio_get_value(GPIO_PORT31); | ||
376 | } | ||
377 | |||
378 | static const struct sh_mobile_meram_cfg lcd_meram_cfg = { | 373 | static const struct sh_mobile_meram_cfg lcd_meram_cfg = { |
379 | .icb[0] = { | 374 | .icb[0] = { |
380 | .meram_size = 0x40, | 375 | .meram_size = 0x40, |
@@ -403,7 +398,6 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
403 | .name = "sh_mobile_lcdc_bl", | 398 | .name = "sh_mobile_lcdc_bl", |
404 | .max_brightness = 1, | 399 | .max_brightness = 1, |
405 | .set_brightness = mackerel_set_brightness, | 400 | .set_brightness = mackerel_set_brightness, |
406 | .get_brightness = mackerel_get_brightness, | ||
407 | }, | 401 | }, |
408 | .meram_cfg = &lcd_meram_cfg, | 402 | .meram_cfg = &lcd_meram_cfg, |
409 | } | 403 | } |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 9e963c1d1447..5620e33c18a0 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
@@ -179,11 +179,6 @@ static int ap320_wvga_set_brightness(int brightness) | |||
179 | return 0; | 179 | return 0; |
180 | } | 180 | } |
181 | 181 | ||
182 | static int ap320_wvga_get_brightness(void) | ||
183 | { | ||
184 | return gpio_get_value(GPIO_PTS3); | ||
185 | } | ||
186 | |||
187 | static void ap320_wvga_power_on(void) | 182 | static void ap320_wvga_power_on(void) |
188 | { | 183 | { |
189 | msleep(100); | 184 | msleep(100); |
@@ -232,7 +227,6 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
232 | .name = "sh_mobile_lcdc_bl", | 227 | .name = "sh_mobile_lcdc_bl", |
233 | .max_brightness = 1, | 228 | .max_brightness = 1, |
234 | .set_brightness = ap320_wvga_set_brightness, | 229 | .set_brightness = ap320_wvga_set_brightness, |
235 | .get_brightness = ap320_wvga_get_brightness, | ||
236 | }, | 230 | }, |
237 | } | 231 | } |
238 | }; | 232 | }; |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 64559e8af14b..3fede4556c91 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -329,11 +329,6 @@ static int ecovec24_set_brightness(int brightness) | |||
329 | return 0; | 329 | return 0; |
330 | } | 330 | } |
331 | 331 | ||
332 | static int ecovec24_get_brightness(void) | ||
333 | { | ||
334 | return gpio_get_value(GPIO_PTR1); | ||
335 | } | ||
336 | |||
337 | static struct sh_mobile_lcdc_info lcdc_info = { | 332 | static struct sh_mobile_lcdc_info lcdc_info = { |
338 | .ch[0] = { | 333 | .ch[0] = { |
339 | .interface_type = RGB18, | 334 | .interface_type = RGB18, |
@@ -347,7 +342,6 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
347 | .name = "sh_mobile_lcdc_bl", | 342 | .name = "sh_mobile_lcdc_bl", |
348 | .max_brightness = 1, | 343 | .max_brightness = 1, |
349 | .set_brightness = ecovec24_set_brightness, | 344 | .set_brightness = ecovec24_set_brightness, |
350 | .get_brightness = ecovec24_get_brightness, | ||
351 | }, | 345 | }, |
352 | } | 346 | } |
353 | }; | 347 | }; |
diff --git a/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c b/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c index c148b36ecb65..c62050332629 100644 --- a/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c +++ b/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c | |||
@@ -283,7 +283,7 @@ void kfr2r09_lcd_start(void *sohandle, struct sh_mobile_lcdc_sys_bus_ops *so) | |||
283 | #define MAIN_MLED4 0x40 | 283 | #define MAIN_MLED4 0x40 |
284 | #define MAIN_MSW 0x80 | 284 | #define MAIN_MSW 0x80 |
285 | 285 | ||
286 | static int kfr2r09_lcd_backlight(int on) | 286 | int kfr2r09_lcd_set_brightness(int brightness) |
287 | { | 287 | { |
288 | struct i2c_adapter *a; | 288 | struct i2c_adapter *a; |
289 | struct i2c_msg msg; | 289 | struct i2c_msg msg; |
@@ -295,7 +295,7 @@ static int kfr2r09_lcd_backlight(int on) | |||
295 | return -ENODEV; | 295 | return -ENODEV; |
296 | 296 | ||
297 | buf[0] = 0x00; | 297 | buf[0] = 0x00; |
298 | if (on) | 298 | if (brightness) |
299 | buf[1] = CTRL_CPSW | CTRL_C10 | CTRL_CKSW; | 299 | buf[1] = CTRL_CPSW | CTRL_C10 | CTRL_CKSW; |
300 | else | 300 | else |
301 | buf[1] = 0; | 301 | buf[1] = 0; |
@@ -309,7 +309,7 @@ static int kfr2r09_lcd_backlight(int on) | |||
309 | return -ENODEV; | 309 | return -ENODEV; |
310 | 310 | ||
311 | buf[0] = 0x01; | 311 | buf[0] = 0x01; |
312 | if (on) | 312 | if (brightness) |
313 | buf[1] = MAIN_MSW | MAIN_MLED4 | 0x0c; | 313 | buf[1] = MAIN_MSW | MAIN_MLED4 | 0x0c; |
314 | else | 314 | else |
315 | buf[1] = 0; | 315 | buf[1] = 0; |
@@ -324,13 +324,3 @@ static int kfr2r09_lcd_backlight(int on) | |||
324 | 324 | ||
325 | return 0; | 325 | return 0; |
326 | } | 326 | } |
327 | |||
328 | void kfr2r09_lcd_on(void) | ||
329 | { | ||
330 | kfr2r09_lcd_backlight(1); | ||
331 | } | ||
332 | |||
333 | void kfr2r09_lcd_off(void) | ||
334 | { | ||
335 | kfr2r09_lcd_backlight(0); | ||
336 | } | ||
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index f2a4304fbe23..ab502f12ef57 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
@@ -158,8 +158,11 @@ static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = { | |||
158 | .height = 58, | 158 | .height = 58, |
159 | .setup_sys = kfr2r09_lcd_setup, | 159 | .setup_sys = kfr2r09_lcd_setup, |
160 | .start_transfer = kfr2r09_lcd_start, | 160 | .start_transfer = kfr2r09_lcd_start, |
161 | .display_on = kfr2r09_lcd_on, | 161 | }, |
162 | .display_off = kfr2r09_lcd_off, | 162 | .bl_info = { |
163 | .name = "sh_mobile_lcdc_bl", | ||
164 | .max_brightness = 1, | ||
165 | .set_brightness = kfr2r09_lcd_set_brightness, | ||
163 | }, | 166 | }, |
164 | .sys_bus_cfg = { | 167 | .sys_bus_cfg = { |
165 | .ldmt2r = 0x07010904, | 168 | .ldmt2r = 0x07010904, |
diff --git a/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h b/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h index ba3d93d333f8..c20c9e5f5eab 100644 --- a/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h +++ b/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h | |||
@@ -4,15 +4,13 @@ | |||
4 | #include <video/sh_mobile_lcdc.h> | 4 | #include <video/sh_mobile_lcdc.h> |
5 | 5 | ||
6 | #if defined(CONFIG_FB_SH_MOBILE_LCDC) || defined(CONFIG_FB_SH_MOBILE_LCDC_MODULE) | 6 | #if defined(CONFIG_FB_SH_MOBILE_LCDC) || defined(CONFIG_FB_SH_MOBILE_LCDC_MODULE) |
7 | void kfr2r09_lcd_on(void); | 7 | int kfr2r09_lcd_set_brightness(int brightness); |
8 | void kfr2r09_lcd_off(void); | ||
9 | int kfr2r09_lcd_setup(void *sys_ops_handle, | 8 | int kfr2r09_lcd_setup(void *sys_ops_handle, |
10 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); | 9 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); |
11 | void kfr2r09_lcd_start(void *sys_ops_handle, | 10 | void kfr2r09_lcd_start(void *sys_ops_handle, |
12 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); | 11 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); |
13 | #else | 12 | #else |
14 | static void kfr2r09_lcd_on(void) {} | 13 | static int kfr2r09_lcd_set_brightness(int brightness) {} |
15 | static void kfr2r09_lcd_off(void) {} | ||
16 | static int kfr2r09_lcd_setup(void *sys_ops_handle, | 14 | static int kfr2r09_lcd_setup(void *sys_ops_handle, |
17 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops) | 15 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops) |
18 | { | 16 | { |
diff --git a/drivers/video/sh_mipi_dsi.c b/drivers/video/sh_mipi_dsi.c index 3951fdae5f68..f4962292792c 100644 --- a/drivers/video/sh_mipi_dsi.c +++ b/drivers/video/sh_mipi_dsi.c | |||
@@ -127,13 +127,12 @@ static void sh_mipi_shutdown(struct platform_device *pdev) | |||
127 | sh_mipi_dsi_enable(mipi, false); | 127 | sh_mipi_dsi_enable(mipi, false); |
128 | } | 128 | } |
129 | 129 | ||
130 | static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | 130 | static int sh_mipi_setup(struct sh_mipi *mipi, const struct fb_videomode *mode) |
131 | { | 131 | { |
132 | void __iomem *base = mipi->base; | 132 | void __iomem *base = mipi->base; |
133 | struct sh_mobile_lcdc_chan_cfg *ch = pdata->lcd_chan; | 133 | struct sh_mipi_dsi_info *pdata = mipi->pdev->dev.platform_data; |
134 | u32 pctype, datatype, pixfmt, linelength, vmctr2; | 134 | u32 pctype, datatype, pixfmt, linelength, vmctr2; |
135 | u32 tmp, top, bottom, delay, div; | 135 | u32 tmp, top, bottom, delay, div; |
136 | bool yuv; | ||
137 | int bpp; | 136 | int bpp; |
138 | 137 | ||
139 | /* | 138 | /* |
@@ -146,95 +145,79 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
146 | pctype = 0; | 145 | pctype = 0; |
147 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; | 146 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; |
148 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 147 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
149 | linelength = ch->lcd_modes[0].xres * 3; | 148 | linelength = mode->xres * 3; |
150 | yuv = false; | ||
151 | break; | 149 | break; |
152 | case MIPI_RGB565: | 150 | case MIPI_RGB565: |
153 | pctype = 1; | 151 | pctype = 1; |
154 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; | 152 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; |
155 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 153 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
156 | linelength = ch->lcd_modes[0].xres * 2; | 154 | linelength = mode->xres * 2; |
157 | yuv = false; | ||
158 | break; | 155 | break; |
159 | case MIPI_RGB666_LP: | 156 | case MIPI_RGB666_LP: |
160 | pctype = 2; | 157 | pctype = 2; |
161 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; | 158 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; |
162 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 159 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
163 | linelength = ch->lcd_modes[0].xres * 3; | 160 | linelength = mode->xres * 3; |
164 | yuv = false; | ||
165 | break; | 161 | break; |
166 | case MIPI_RGB666: | 162 | case MIPI_RGB666: |
167 | pctype = 3; | 163 | pctype = 3; |
168 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; | 164 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; |
169 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; | 165 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; |
170 | linelength = (ch->lcd_modes[0].xres * 18 + 7) / 8; | 166 | linelength = (mode->xres * 18 + 7) / 8; |
171 | yuv = false; | ||
172 | break; | 167 | break; |
173 | case MIPI_BGR888: | 168 | case MIPI_BGR888: |
174 | pctype = 8; | 169 | pctype = 8; |
175 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; | 170 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; |
176 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 171 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
177 | linelength = ch->lcd_modes[0].xres * 3; | 172 | linelength = mode->xres * 3; |
178 | yuv = false; | ||
179 | break; | 173 | break; |
180 | case MIPI_BGR565: | 174 | case MIPI_BGR565: |
181 | pctype = 9; | 175 | pctype = 9; |
182 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; | 176 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; |
183 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 177 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
184 | linelength = ch->lcd_modes[0].xres * 2; | 178 | linelength = mode->xres * 2; |
185 | yuv = false; | ||
186 | break; | 179 | break; |
187 | case MIPI_BGR666_LP: | 180 | case MIPI_BGR666_LP: |
188 | pctype = 0xa; | 181 | pctype = 0xa; |
189 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; | 182 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; |
190 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 183 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
191 | linelength = ch->lcd_modes[0].xres * 3; | 184 | linelength = mode->xres * 3; |
192 | yuv = false; | ||
193 | break; | 185 | break; |
194 | case MIPI_BGR666: | 186 | case MIPI_BGR666: |
195 | pctype = 0xb; | 187 | pctype = 0xb; |
196 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; | 188 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; |
197 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; | 189 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; |
198 | linelength = (ch->lcd_modes[0].xres * 18 + 7) / 8; | 190 | linelength = (mode->xres * 18 + 7) / 8; |
199 | yuv = false; | ||
200 | break; | 191 | break; |
201 | case MIPI_YUYV: | 192 | case MIPI_YUYV: |
202 | pctype = 4; | 193 | pctype = 4; |
203 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; | 194 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; |
204 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 195 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
205 | linelength = ch->lcd_modes[0].xres * 2; | 196 | linelength = mode->xres * 2; |
206 | yuv = true; | ||
207 | break; | 197 | break; |
208 | case MIPI_UYVY: | 198 | case MIPI_UYVY: |
209 | pctype = 5; | 199 | pctype = 5; |
210 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; | 200 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; |
211 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 201 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
212 | linelength = ch->lcd_modes[0].xres * 2; | 202 | linelength = mode->xres * 2; |
213 | yuv = true; | ||
214 | break; | 203 | break; |
215 | case MIPI_YUV420_L: | 204 | case MIPI_YUV420_L: |
216 | pctype = 6; | 205 | pctype = 6; |
217 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; | 206 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; |
218 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; | 207 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; |
219 | linelength = (ch->lcd_modes[0].xres * 12 + 7) / 8; | 208 | linelength = (mode->xres * 12 + 7) / 8; |
220 | yuv = true; | ||
221 | break; | 209 | break; |
222 | case MIPI_YUV420: | 210 | case MIPI_YUV420: |
223 | pctype = 7; | 211 | pctype = 7; |
224 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; | 212 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; |
225 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; | 213 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; |
226 | /* Length of U/V line */ | 214 | /* Length of U/V line */ |
227 | linelength = (ch->lcd_modes[0].xres + 1) / 2; | 215 | linelength = (mode->xres + 1) / 2; |
228 | yuv = true; | ||
229 | break; | 216 | break; |
230 | default: | 217 | default: |
231 | return -EINVAL; | 218 | return -EINVAL; |
232 | } | 219 | } |
233 | 220 | ||
234 | if ((yuv && ch->interface_type != YUV422) || | ||
235 | (!yuv && ch->interface_type != RGB24)) | ||
236 | return -EINVAL; | ||
237 | |||
238 | if (!pdata->lane) | 221 | if (!pdata->lane) |
239 | return -EINVAL; | 222 | return -EINVAL; |
240 | 223 | ||
@@ -293,7 +276,7 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
293 | */ | 276 | */ |
294 | iowrite32(0x00000006, mipi->linkbase + DTCTR); | 277 | iowrite32(0x00000006, mipi->linkbase + DTCTR); |
295 | /* VSYNC width = 2 (<< 17) */ | 278 | /* VSYNC width = 2 (<< 17) */ |
296 | iowrite32((ch->lcd_modes[0].vsync_len << pdata->vsynw_offset) | | 279 | iowrite32((mode->vsync_len << pdata->vsynw_offset) | |
297 | (pdata->clksrc << 16) | (pctype << 12) | datatype, | 280 | (pdata->clksrc << 16) | (pctype << 12) | datatype, |
298 | mipi->linkbase + VMCTR1); | 281 | mipi->linkbase + VMCTR1); |
299 | 282 | ||
@@ -327,7 +310,7 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
327 | top = linelength << 16; /* RGBLEN */ | 310 | top = linelength << 16; /* RGBLEN */ |
328 | bottom = 0x00000001; | 311 | bottom = 0x00000001; |
329 | if (pdata->flags & SH_MIPI_DSI_HSABM) /* HSALEN */ | 312 | if (pdata->flags & SH_MIPI_DSI_HSABM) /* HSALEN */ |
330 | bottom = (pdata->lane * ch->lcd_modes[0].hsync_len) - 10; | 313 | bottom = (pdata->lane * mode->hsync_len) - 10; |
331 | iowrite32(top | bottom , mipi->linkbase + VMLEN1); | 314 | iowrite32(top | bottom , mipi->linkbase + VMLEN1); |
332 | 315 | ||
333 | /* | 316 | /* |
@@ -347,18 +330,18 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
347 | div = 2; | 330 | div = 2; |
348 | 331 | ||
349 | if (pdata->flags & SH_MIPI_DSI_HFPBM) { /* HBPLEN */ | 332 | if (pdata->flags & SH_MIPI_DSI_HFPBM) { /* HBPLEN */ |
350 | top = ch->lcd_modes[0].hsync_len + ch->lcd_modes[0].left_margin; | 333 | top = mode->hsync_len + mode->left_margin; |
351 | top = ((pdata->lane * top / div) - 10) << 16; | 334 | top = ((pdata->lane * top / div) - 10) << 16; |
352 | } | 335 | } |
353 | if (pdata->flags & SH_MIPI_DSI_HBPBM) { /* HFPLEN */ | 336 | if (pdata->flags & SH_MIPI_DSI_HBPBM) { /* HFPLEN */ |
354 | bottom = ch->lcd_modes[0].right_margin; | 337 | bottom = mode->right_margin; |
355 | bottom = (pdata->lane * bottom / div) - 12; | 338 | bottom = (pdata->lane * bottom / div) - 12; |
356 | } | 339 | } |
357 | 340 | ||
358 | bpp = linelength / ch->lcd_modes[0].xres; /* byte / pixel */ | 341 | bpp = linelength / mode->xres; /* byte / pixel */ |
359 | if ((pdata->lane / div) > bpp) { | 342 | if ((pdata->lane / div) > bpp) { |
360 | tmp = ch->lcd_modes[0].xres / bpp; /* output cycle */ | 343 | tmp = mode->xres / bpp; /* output cycle */ |
361 | tmp = ch->lcd_modes[0].xres - tmp; /* (input - output) cycle */ | 344 | tmp = mode->xres - tmp; /* (input - output) cycle */ |
362 | delay = (pdata->lane * tmp); | 345 | delay = (pdata->lane * tmp); |
363 | } | 346 | } |
364 | 347 | ||
@@ -369,7 +352,7 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
369 | /* setup LCD panel */ | 352 | /* setup LCD panel */ |
370 | 353 | ||
371 | /* cf. drivers/video/omap/lcd_mipid.c */ | 354 | /* cf. drivers/video/omap/lcd_mipid.c */ |
372 | sh_mipi_dcs(ch->chan, MIPI_DCS_EXIT_SLEEP_MODE); | 355 | sh_mipi_dcs(pdata->channel, MIPI_DCS_EXIT_SLEEP_MODE); |
373 | msleep(120); | 356 | msleep(120); |
374 | /* | 357 | /* |
375 | * [7] - Page Address Mode | 358 | * [7] - Page Address Mode |
@@ -381,11 +364,11 @@ static int sh_mipi_setup(struct sh_mipi *mipi, struct sh_mipi_dsi_info *pdata) | |||
381 | * [1] - Flip Horizontal | 364 | * [1] - Flip Horizontal |
382 | * [0] - Flip Vertical | 365 | * [0] - Flip Vertical |
383 | */ | 366 | */ |
384 | sh_mipi_dcs_param(ch->chan, MIPI_DCS_SET_ADDRESS_MODE, 0x00); | 367 | sh_mipi_dcs_param(pdata->channel, MIPI_DCS_SET_ADDRESS_MODE, 0x00); |
385 | /* cf. set_data_lines() */ | 368 | /* cf. set_data_lines() */ |
386 | sh_mipi_dcs_param(ch->chan, MIPI_DCS_SET_PIXEL_FORMAT, | 369 | sh_mipi_dcs_param(pdata->channel, MIPI_DCS_SET_PIXEL_FORMAT, |
387 | pixfmt << 4); | 370 | pixfmt << 4); |
388 | sh_mipi_dcs(ch->chan, MIPI_DCS_SET_DISPLAY_ON); | 371 | sh_mipi_dcs(pdata->channel, MIPI_DCS_SET_DISPLAY_ON); |
389 | 372 | ||
390 | /* Enable timeout counters */ | 373 | /* Enable timeout counters */ |
391 | iowrite32(0x00000f00, base + DSICTRL); | 374 | iowrite32(0x00000f00, base + DSICTRL); |
@@ -405,7 +388,7 @@ static int mipi_display_on(struct sh_mobile_lcdc_entity *entity) | |||
405 | if (ret < 0) | 388 | if (ret < 0) |
406 | goto mipi_display_on_fail1; | 389 | goto mipi_display_on_fail1; |
407 | 390 | ||
408 | ret = sh_mipi_setup(mipi, pdata); | 391 | ret = sh_mipi_setup(mipi, &entity->def_mode); |
409 | if (ret < 0) | 392 | if (ret < 0) |
410 | goto mipi_display_on_fail2; | 393 | goto mipi_display_on_fail2; |
411 | 394 | ||
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index 699487c287b2..e78fe4bc1524 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -438,7 +438,7 @@ static unsigned long lcdc_sys_read_data(void *handle) | |||
438 | return lcdc_read(ch->lcdc, _LDDRDR) & LDDRDR_DRD_MASK; | 438 | return lcdc_read(ch->lcdc, _LDDRDR) & LDDRDR_DRD_MASK; |
439 | } | 439 | } |
440 | 440 | ||
441 | struct sh_mobile_lcdc_sys_bus_ops sh_mobile_lcdc_sys_bus_ops = { | 441 | static struct sh_mobile_lcdc_sys_bus_ops sh_mobile_lcdc_sys_bus_ops = { |
442 | lcdc_sys_write_index, | 442 | lcdc_sys_write_index, |
443 | lcdc_sys_write_data, | 443 | lcdc_sys_write_data, |
444 | lcdc_sys_read_data, | 444 | lcdc_sys_read_data, |
@@ -586,8 +586,8 @@ static int sh_mobile_lcdc_display_notify(struct sh_mobile_lcdc_chan *ch, | |||
586 | * Just turn on, if we run a resume here, the | 586 | * Just turn on, if we run a resume here, the |
587 | * logo disappears. | 587 | * logo disappears. |
588 | */ | 588 | */ |
589 | info->var.width = monspec->max_x * 10; | 589 | info->var.width = ch->display.width; |
590 | info->var.height = monspec->max_y * 10; | 590 | info->var.height = ch->display.height; |
591 | sh_mobile_lcdc_display_on(ch); | 591 | sh_mobile_lcdc_display_on(ch); |
592 | } else { | 592 | } else { |
593 | /* New monitor or have to wake up */ | 593 | /* New monitor or have to wake up */ |
@@ -1614,6 +1614,15 @@ static int sh_mobile_lcdc_overlay_blank(int blank, struct fb_info *info) | |||
1614 | return 1; | 1614 | return 1; |
1615 | } | 1615 | } |
1616 | 1616 | ||
1617 | static int | ||
1618 | sh_mobile_lcdc_overlay_mmap(struct fb_info *info, struct vm_area_struct *vma) | ||
1619 | { | ||
1620 | struct sh_mobile_lcdc_overlay *ovl = info->par; | ||
1621 | |||
1622 | return dma_mmap_coherent(ovl->channel->lcdc->dev, vma, ovl->fb_mem, | ||
1623 | ovl->dma_handle, ovl->fb_size); | ||
1624 | } | ||
1625 | |||
1617 | static struct fb_ops sh_mobile_lcdc_overlay_ops = { | 1626 | static struct fb_ops sh_mobile_lcdc_overlay_ops = { |
1618 | .owner = THIS_MODULE, | 1627 | .owner = THIS_MODULE, |
1619 | .fb_read = fb_sys_read, | 1628 | .fb_read = fb_sys_read, |
@@ -1626,6 +1635,7 @@ static struct fb_ops sh_mobile_lcdc_overlay_ops = { | |||
1626 | .fb_ioctl = sh_mobile_lcdc_overlay_ioctl, | 1635 | .fb_ioctl = sh_mobile_lcdc_overlay_ioctl, |
1627 | .fb_check_var = sh_mobile_lcdc_overlay_check_var, | 1636 | .fb_check_var = sh_mobile_lcdc_overlay_check_var, |
1628 | .fb_set_par = sh_mobile_lcdc_overlay_set_par, | 1637 | .fb_set_par = sh_mobile_lcdc_overlay_set_par, |
1638 | .fb_mmap = sh_mobile_lcdc_overlay_mmap, | ||
1629 | }; | 1639 | }; |
1630 | 1640 | ||
1631 | static void | 1641 | static void |
@@ -2093,6 +2103,15 @@ static int sh_mobile_lcdc_blank(int blank, struct fb_info *info) | |||
2093 | return 0; | 2103 | return 0; |
2094 | } | 2104 | } |
2095 | 2105 | ||
2106 | static int | ||
2107 | sh_mobile_lcdc_mmap(struct fb_info *info, struct vm_area_struct *vma) | ||
2108 | { | ||
2109 | struct sh_mobile_lcdc_chan *ch = info->par; | ||
2110 | |||
2111 | return dma_mmap_coherent(ch->lcdc->dev, vma, ch->fb_mem, | ||
2112 | ch->dma_handle, ch->fb_size); | ||
2113 | } | ||
2114 | |||
2096 | static struct fb_ops sh_mobile_lcdc_ops = { | 2115 | static struct fb_ops sh_mobile_lcdc_ops = { |
2097 | .owner = THIS_MODULE, | 2116 | .owner = THIS_MODULE, |
2098 | .fb_setcolreg = sh_mobile_lcdc_setcolreg, | 2117 | .fb_setcolreg = sh_mobile_lcdc_setcolreg, |
@@ -2108,6 +2127,7 @@ static struct fb_ops sh_mobile_lcdc_ops = { | |||
2108 | .fb_release = sh_mobile_lcdc_release, | 2127 | .fb_release = sh_mobile_lcdc_release, |
2109 | .fb_check_var = sh_mobile_lcdc_check_var, | 2128 | .fb_check_var = sh_mobile_lcdc_check_var, |
2110 | .fb_set_par = sh_mobile_lcdc_set_par, | 2129 | .fb_set_par = sh_mobile_lcdc_set_par, |
2130 | .fb_mmap = sh_mobile_lcdc_mmap, | ||
2111 | }; | 2131 | }; |
2112 | 2132 | ||
2113 | static void | 2133 | static void |
@@ -2167,7 +2187,7 @@ sh_mobile_lcdc_channel_fb_cleanup(struct sh_mobile_lcdc_chan *ch) | |||
2167 | 2187 | ||
2168 | static int __devinit | 2188 | static int __devinit |
2169 | sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch, | 2189 | sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch, |
2170 | const struct fb_videomode *mode, | 2190 | const struct fb_videomode *modes, |
2171 | unsigned int num_modes) | 2191 | unsigned int num_modes) |
2172 | { | 2192 | { |
2173 | struct sh_mobile_lcdc_priv *priv = ch->lcdc; | 2193 | struct sh_mobile_lcdc_priv *priv = ch->lcdc; |
@@ -2193,7 +2213,7 @@ sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch, | |||
2193 | info->pseudo_palette = &ch->pseudo_palette; | 2213 | info->pseudo_palette = &ch->pseudo_palette; |
2194 | info->par = ch; | 2214 | info->par = ch; |
2195 | 2215 | ||
2196 | fb_videomode_to_modelist(mode, num_modes, &info->modelist); | 2216 | fb_videomode_to_modelist(modes, num_modes, &info->modelist); |
2197 | 2217 | ||
2198 | ret = fb_alloc_cmap(&info->cmap, PALETTE_NR, 0); | 2218 | ret = fb_alloc_cmap(&info->cmap, PALETTE_NR, 0); |
2199 | if (ret < 0) { | 2219 | if (ret < 0) { |
@@ -2227,9 +2247,9 @@ sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch, | |||
2227 | * default. | 2247 | * default. |
2228 | */ | 2248 | */ |
2229 | var = &info->var; | 2249 | var = &info->var; |
2230 | fb_videomode_to_var(var, mode); | 2250 | fb_videomode_to_var(var, modes); |
2231 | var->width = ch->cfg->panel_cfg.width; | 2251 | var->width = ch->display.width; |
2232 | var->height = ch->cfg->panel_cfg.height; | 2252 | var->height = ch->display.height; |
2233 | var->xres_virtual = ch->xres_virtual; | 2253 | var->xres_virtual = ch->xres_virtual; |
2234 | var->yres_virtual = ch->yres_virtual; | 2254 | var->yres_virtual = ch->yres_virtual; |
2235 | var->activate = FB_ACTIVATE_NOW; | 2255 | var->activate = FB_ACTIVATE_NOW; |
@@ -2262,6 +2282,7 @@ static int sh_mobile_lcdc_update_bl(struct backlight_device *bdev) | |||
2262 | bdev->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK)) | 2282 | bdev->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK)) |
2263 | brightness = 0; | 2283 | brightness = 0; |
2264 | 2284 | ||
2285 | ch->bl_brightness = brightness; | ||
2265 | return ch->cfg->bl_info.set_brightness(brightness); | 2286 | return ch->cfg->bl_info.set_brightness(brightness); |
2266 | } | 2287 | } |
2267 | 2288 | ||
@@ -2269,7 +2290,7 @@ static int sh_mobile_lcdc_get_brightness(struct backlight_device *bdev) | |||
2269 | { | 2290 | { |
2270 | struct sh_mobile_lcdc_chan *ch = bl_get_data(bdev); | 2291 | struct sh_mobile_lcdc_chan *ch = bl_get_data(bdev); |
2271 | 2292 | ||
2272 | return ch->cfg->bl_info.get_brightness(); | 2293 | return ch->bl_brightness; |
2273 | } | 2294 | } |
2274 | 2295 | ||
2275 | static int sh_mobile_lcdc_check_fb(struct backlight_device *bdev, | 2296 | static int sh_mobile_lcdc_check_fb(struct backlight_device *bdev, |
@@ -2516,10 +2537,10 @@ static int __devinit sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan * | |||
2516 | } | 2537 | } |
2517 | 2538 | ||
2518 | static int __devinit | 2539 | static int __devinit |
2519 | sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_priv *priv, | 2540 | sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_overlay *ovl) |
2520 | struct sh_mobile_lcdc_overlay *ovl) | ||
2521 | { | 2541 | { |
2522 | const struct sh_mobile_lcdc_format_info *format; | 2542 | const struct sh_mobile_lcdc_format_info *format; |
2543 | struct device *dev = ovl->channel->lcdc->dev; | ||
2523 | int ret; | 2544 | int ret; |
2524 | 2545 | ||
2525 | if (ovl->cfg->fourcc == 0) | 2546 | if (ovl->cfg->fourcc == 0) |
@@ -2528,7 +2549,7 @@ sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_priv *priv, | |||
2528 | /* Validate the format. */ | 2549 | /* Validate the format. */ |
2529 | format = sh_mobile_format_info(ovl->cfg->fourcc); | 2550 | format = sh_mobile_format_info(ovl->cfg->fourcc); |
2530 | if (format == NULL) { | 2551 | if (format == NULL) { |
2531 | dev_err(priv->dev, "Invalid FOURCC %08x\n", ovl->cfg->fourcc); | 2552 | dev_err(dev, "Invalid FOURCC %08x\n", ovl->cfg->fourcc); |
2532 | return -EINVAL; | 2553 | return -EINVAL; |
2533 | } | 2554 | } |
2534 | 2555 | ||
@@ -2556,10 +2577,10 @@ sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_priv *priv, | |||
2556 | /* Allocate frame buffer memory. */ | 2577 | /* Allocate frame buffer memory. */ |
2557 | ovl->fb_size = ovl->cfg->max_xres * ovl->cfg->max_yres | 2578 | ovl->fb_size = ovl->cfg->max_xres * ovl->cfg->max_yres |
2558 | * format->bpp / 8 * 2; | 2579 | * format->bpp / 8 * 2; |
2559 | ovl->fb_mem = dma_alloc_coherent(priv->dev, ovl->fb_size, | 2580 | ovl->fb_mem = dma_alloc_coherent(dev, ovl->fb_size, &ovl->dma_handle, |
2560 | &ovl->dma_handle, GFP_KERNEL); | 2581 | GFP_KERNEL); |
2561 | if (!ovl->fb_mem) { | 2582 | if (!ovl->fb_mem) { |
2562 | dev_err(priv->dev, "unable to allocate buffer\n"); | 2583 | dev_err(dev, "unable to allocate buffer\n"); |
2563 | return -ENOMEM; | 2584 | return -ENOMEM; |
2564 | } | 2585 | } |
2565 | 2586 | ||
@@ -2571,11 +2592,11 @@ sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_priv *priv, | |||
2571 | } | 2592 | } |
2572 | 2593 | ||
2573 | static int __devinit | 2594 | static int __devinit |
2574 | sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | 2595 | sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_chan *ch) |
2575 | struct sh_mobile_lcdc_chan *ch) | ||
2576 | { | 2596 | { |
2577 | const struct sh_mobile_lcdc_format_info *format; | 2597 | const struct sh_mobile_lcdc_format_info *format; |
2578 | const struct sh_mobile_lcdc_chan_cfg *cfg = ch->cfg; | 2598 | const struct sh_mobile_lcdc_chan_cfg *cfg = ch->cfg; |
2599 | struct device *dev = ch->lcdc->dev; | ||
2579 | const struct fb_videomode *max_mode; | 2600 | const struct fb_videomode *max_mode; |
2580 | const struct fb_videomode *mode; | 2601 | const struct fb_videomode *mode; |
2581 | unsigned int num_modes; | 2602 | unsigned int num_modes; |
@@ -2588,7 +2609,7 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | |||
2588 | /* Validate the format. */ | 2609 | /* Validate the format. */ |
2589 | format = sh_mobile_format_info(cfg->fourcc); | 2610 | format = sh_mobile_format_info(cfg->fourcc); |
2590 | if (format == NULL) { | 2611 | if (format == NULL) { |
2591 | dev_err(priv->dev, "Invalid FOURCC %08x.\n", cfg->fourcc); | 2612 | dev_err(dev, "Invalid FOURCC %08x.\n", cfg->fourcc); |
2592 | return -EINVAL; | 2613 | return -EINVAL; |
2593 | } | 2614 | } |
2594 | 2615 | ||
@@ -2604,7 +2625,7 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | |||
2604 | /* NV12/NV21 buffers must have even number of lines */ | 2625 | /* NV12/NV21 buffers must have even number of lines */ |
2605 | if ((cfg->fourcc == V4L2_PIX_FMT_NV12 || | 2626 | if ((cfg->fourcc == V4L2_PIX_FMT_NV12 || |
2606 | cfg->fourcc == V4L2_PIX_FMT_NV21) && (mode->yres & 0x1)) { | 2627 | cfg->fourcc == V4L2_PIX_FMT_NV21) && (mode->yres & 0x1)) { |
2607 | dev_err(priv->dev, "yres must be multiple of 2 for " | 2628 | dev_err(dev, "yres must be multiple of 2 for " |
2608 | "YCbCr420 mode.\n"); | 2629 | "YCbCr420 mode.\n"); |
2609 | return -EINVAL; | 2630 | return -EINVAL; |
2610 | } | 2631 | } |
@@ -2618,7 +2639,7 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | |||
2618 | if (!max_size) | 2639 | if (!max_size) |
2619 | max_size = MAX_XRES * MAX_YRES; | 2640 | max_size = MAX_XRES * MAX_YRES; |
2620 | else | 2641 | else |
2621 | dev_dbg(priv->dev, "Found largest videomode %ux%u\n", | 2642 | dev_dbg(dev, "Found largest videomode %ux%u\n", |
2622 | max_mode->xres, max_mode->yres); | 2643 | max_mode->xres, max_mode->yres); |
2623 | 2644 | ||
2624 | if (cfg->lcd_modes == NULL) { | 2645 | if (cfg->lcd_modes == NULL) { |
@@ -2652,10 +2673,10 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | |||
2652 | 2673 | ||
2653 | /* Allocate frame buffer memory. */ | 2674 | /* Allocate frame buffer memory. */ |
2654 | ch->fb_size = max_size * format->bpp / 8 * 2; | 2675 | ch->fb_size = max_size * format->bpp / 8 * 2; |
2655 | ch->fb_mem = dma_alloc_coherent(priv->dev, ch->fb_size, &ch->dma_handle, | 2676 | ch->fb_mem = dma_alloc_coherent(dev, ch->fb_size, &ch->dma_handle, |
2656 | GFP_KERNEL); | 2677 | GFP_KERNEL); |
2657 | if (ch->fb_mem == NULL) { | 2678 | if (ch->fb_mem == NULL) { |
2658 | dev_err(priv->dev, "unable to allocate buffer\n"); | 2679 | dev_err(dev, "unable to allocate buffer\n"); |
2659 | return -ENOMEM; | 2680 | return -ENOMEM; |
2660 | } | 2681 | } |
2661 | 2682 | ||
@@ -2663,8 +2684,7 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_priv *priv, | |||
2663 | if (cfg->tx_dev) { | 2684 | if (cfg->tx_dev) { |
2664 | if (!cfg->tx_dev->dev.driver || | 2685 | if (!cfg->tx_dev->dev.driver || |
2665 | !try_module_get(cfg->tx_dev->dev.driver->owner)) { | 2686 | !try_module_get(cfg->tx_dev->dev.driver->owner)) { |
2666 | dev_warn(priv->dev, | 2687 | dev_warn(dev, "unable to get transmitter device\n"); |
2667 | "unable to get transmitter device\n"); | ||
2668 | return -EINVAL; | 2688 | return -EINVAL; |
2669 | } | 2689 | } |
2670 | ch->tx_dev = platform_get_drvdata(cfg->tx_dev); | 2690 | ch->tx_dev = platform_get_drvdata(cfg->tx_dev); |
@@ -2772,9 +2792,9 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
2772 | pm_runtime_enable(&pdev->dev); | 2792 | pm_runtime_enable(&pdev->dev); |
2773 | 2793 | ||
2774 | for (i = 0; i < num_channels; i++) { | 2794 | for (i = 0; i < num_channels; i++) { |
2775 | struct sh_mobile_lcdc_chan *ch = priv->ch + i; | 2795 | struct sh_mobile_lcdc_chan *ch = &priv->ch[i]; |
2776 | 2796 | ||
2777 | error = sh_mobile_lcdc_channel_init(priv, ch); | 2797 | error = sh_mobile_lcdc_channel_init(ch); |
2778 | if (error) | 2798 | if (error) |
2779 | goto err1; | 2799 | goto err1; |
2780 | } | 2800 | } |
@@ -2785,7 +2805,7 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
2785 | ovl->cfg = &pdata->overlays[i]; | 2805 | ovl->cfg = &pdata->overlays[i]; |
2786 | ovl->channel = &priv->ch[0]; | 2806 | ovl->channel = &priv->ch[0]; |
2787 | 2807 | ||
2788 | error = sh_mobile_lcdc_overlay_init(priv, ovl); | 2808 | error = sh_mobile_lcdc_overlay_init(ovl); |
2789 | if (error) | 2809 | if (error) |
2790 | goto err1; | 2810 | goto err1; |
2791 | } | 2811 | } |
diff --git a/drivers/video/sh_mobile_lcdcfb.h b/drivers/video/sh_mobile_lcdcfb.h index 0f92f6544b94..f839adef1d90 100644 --- a/drivers/video/sh_mobile_lcdcfb.h +++ b/drivers/video/sh_mobile_lcdcfb.h | |||
@@ -94,6 +94,7 @@ struct sh_mobile_lcdc_chan { | |||
94 | 94 | ||
95 | /* Backlight */ | 95 | /* Backlight */ |
96 | struct backlight_device *bl; | 96 | struct backlight_device *bl; |
97 | unsigned int bl_brightness; | ||
97 | 98 | ||
98 | /* FB */ | 99 | /* FB */ |
99 | struct fb_info *info; | 100 | struct fb_info *info; |
diff --git a/include/video/sh_mipi_dsi.h b/include/video/sh_mipi_dsi.h index 06c67fbc4eee..a01f197e6ac1 100644 --- a/include/video/sh_mipi_dsi.h +++ b/include/video/sh_mipi_dsi.h | |||
@@ -25,8 +25,6 @@ enum sh_mipi_dsi_data_fmt { | |||
25 | MIPI_YUV420, | 25 | MIPI_YUV420, |
26 | }; | 26 | }; |
27 | 27 | ||
28 | struct sh_mobile_lcdc_chan_cfg; | ||
29 | |||
30 | #define SH_MIPI_DSI_HSABM (1 << 0) | 28 | #define SH_MIPI_DSI_HSABM (1 << 0) |
31 | #define SH_MIPI_DSI_HBPBM (1 << 1) | 29 | #define SH_MIPI_DSI_HBPBM (1 << 1) |
32 | #define SH_MIPI_DSI_HFPBM (1 << 2) | 30 | #define SH_MIPI_DSI_HFPBM (1 << 2) |
@@ -47,7 +45,7 @@ struct sh_mobile_lcdc_chan_cfg; | |||
47 | 45 | ||
48 | struct sh_mipi_dsi_info { | 46 | struct sh_mipi_dsi_info { |
49 | enum sh_mipi_dsi_data_fmt data_format; | 47 | enum sh_mipi_dsi_data_fmt data_format; |
50 | struct sh_mobile_lcdc_chan_cfg *lcd_chan; | 48 | int channel; |
51 | int lane; | 49 | int lane; |
52 | unsigned long flags; | 50 | unsigned long flags; |
53 | u32 clksrc; | 51 | u32 clksrc; |
diff --git a/include/video/sh_mobile_lcdc.h b/include/video/sh_mobile_lcdc.h index ff43ffc1aab2..2605fa8adb9c 100644 --- a/include/video/sh_mobile_lcdc.h +++ b/include/video/sh_mobile_lcdc.h | |||
@@ -163,7 +163,6 @@ struct sh_mobile_lcdc_bl_info { | |||
163 | const char *name; | 163 | const char *name; |
164 | int max_brightness; | 164 | int max_brightness; |
165 | int (*set_brightness)(int brightness); | 165 | int (*set_brightness)(int brightness); |
166 | int (*get_brightness)(void); | ||
167 | }; | 166 | }; |
168 | 167 | ||
169 | struct sh_mobile_lcdc_overlay_cfg { | 168 | struct sh_mobile_lcdc_overlay_cfg { |