Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: (140 commits)
MAINTAINERS: de-orphan fbdev.
MAINTAINERS: Add file pattern for fb dt bindings.
video: Move sm501fb devicetree binding documentation to a better place.
fbcon: fix situation where fbcon gets deinitialised and can't reinit.
video, sm501: add OF binding to support SM501
video, sm501: add edid and commandline support
video, sm501: add I/O functions for use on powerpc
video: Fix EDID macros H_SYNC_WIDTH and H_SYNC_OFFSET
fbcon: Bugfix soft cursor detection in Tile Blitting
video: add missing framebuffer_release in error path
video: metronomefb: add __devexit_p around reference to metronomefb_remove
video: hecubafb: add __devexit_p around reference to hecubafb_remove
drivers:video:aty:radeon_base Fix typo occationally to occasionally
atmel_lcdfb: add fb_blank function
atmel_lcdfb: implement inverted contrast pwm
video: s3c-fb: return proper error if clk_get fails
uvesafb,vesafb: create WC or WB PAT-entries
video: ffb: fix ffb_probe error path
radeonfb: Let hwmon driver probe the "monid" I2C bus
fbdev: sh_mobile_lcdc: checking NULL instead of IS_ERR()
...

+6503 -2029
+4
.mailmap
··· 20 20 Andrew Morton <akpm@osdl.org> 21 21 Andrew Vasquez <andrew.vasquez@qlogic.com> 22 22 Andy Adamson <andros@citi.umich.edu> 23 + Archit Taneja <archit@ti.com> 23 24 Arnaud Patard <arnaud.patard@rtp-net.org> 24 25 Arnd Bergmann <arnd@arndb.de> 25 26 Axel Dyks <xl@xlsigned.net> ··· 71 70 Linas Vepstas <linas@austin.ibm.com> 72 71 Mark Brown <broonie@sirena.org.uk> 73 72 Matthieu CASTET <castet.matthieu@free.fr> 73 + Mayuresh Janorkar <mayur@ti.com> 74 74 Michael Buesch <mb@bu3sch.de> 75 75 Michael Buesch <mbuesch@freenet.de> 76 76 Michel Dänzer <michel@tungstengraphics.com> ··· 80 78 Morten Welinder <welinder@anemone.rentec.com> 81 79 Morten Welinder <welinder@darter.rentec.com> 82 80 Morten Welinder <welinder@troll.com> 81 + Mythri P K <mythripk@ti.com> 83 82 Nguyen Anh Quynh <aquynh@gmail.com> 84 83 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> 85 84 Patrick Mochel <mochel@digitalimplant.org> ··· 101 98 Simon Kelley <simon@thekelleys.org.uk> 102 99 Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> 103 100 Stephen Hemminger <shemminger@osdl.org> 101 + Sumit Semwal <sumit.semwal@ti.com> 104 102 Tejun Heo <htejun@gmail.com> 105 103 Thomas Graf <tgraf@suug.ch> 106 104 Tony Luck <tony.luck@intel.com>
+34
Documentation/devicetree/bindings/fb/sm501fb.txt
··· 1 + * SM SM501 2 + 3 + The SM SM501 is a LCD controller, with proper hardware, it can also 4 + drive DVI monitors. 5 + 6 + Required properties: 7 + - compatible : should be "smi,sm501". 8 + - reg : contain two entries: 9 + - First entry: System Configuration register 10 + - Second entry: IO space (Display Controller register) 11 + - interrupts : SMI interrupt to the cpu should be described here. 12 + - interrupt-parent : the phandle for the interrupt controller that 13 + services interrupts for this device. 14 + 15 + Optional properties: 16 + - mode : select a video mode: 17 + <xres>x<yres>[-<bpp>][@<refresh>] 18 + - edid : verbatim EDID data block describing attached display. 19 + Data from the detailed timing descriptor will be used to 20 + program the display controller. 21 + - little-endian: availiable on big endian systems, to 22 + set different foreign endian. 23 + - big-endian: availiable on little endian systems, to 24 + set different foreign endian. 25 + 26 + Example for MPC5200: 27 + display@1,0 { 28 + compatible = "smi,sm501"; 29 + reg = <1 0x00000000 0x00800000 30 + 1 0x03e00000 0x00200000>; 31 + interrupts = <1 1 3>; 32 + mode = "640x480-32@60"; 33 + edid = [edid-data]; 34 + };
+10
Documentation/fb/sm501.txt
··· 1 + Configuration: 2 + 3 + You can pass the following kernel command line options to sm501 videoframebuffer: 4 + 5 + sm501fb.bpp= SM501 Display driver: 6 + Specifiy bits-per-pixel if not specified by 'mode' 7 + 8 + sm501fb.mode= SM501 Display driver: 9 + Specify resolution as 10 + "<xres>x<yres>[-<bpp>][@<refresh>]"
+5 -3
MAINTAINERS
··· 2631 2631 F: drivers/net/wan/sdla.c 2632 2632 2633 2633 FRAMEBUFFER LAYER 2634 + M: Paul Mundt <lethal@linux-sh.org> 2634 2635 L: linux-fbdev@vger.kernel.org 2635 2636 W: http://linux-fbdev.sourceforge.net/ 2636 2637 Q: http://patchwork.kernel.org/project/linux-fbdev/list/ 2637 2638 T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6.git 2638 - S: Orphan 2639 + S: Maintained 2639 2640 F: Documentation/fb/ 2641 + F: Documentation/devicetree/bindings/fb/ 2640 2642 F: drivers/video/ 2641 2643 F: include/video/ 2642 2644 F: include/linux/fb.h ··· 4537 4535 F: sound/soc/omap/ 4538 4536 4539 4537 OMAP FRAMEBUFFER SUPPORT 4540 - M: Tomi Valkeinen <tomi.valkeinen@nokia.com> 4538 + M: Tomi Valkeinen <tomi.valkeinen@ti.com> 4541 4539 L: linux-fbdev@vger.kernel.org 4542 4540 L: linux-omap@vger.kernel.org 4543 4541 S: Maintained 4544 4542 F: drivers/video/omap/ 4545 4543 4546 4544 OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2) 4547 - M: Tomi Valkeinen <tomi.valkeinen@nokia.com> 4545 + M: Tomi Valkeinen <tomi.valkeinen@ti.com> 4548 4546 L: linux-omap@vger.kernel.org 4549 4547 L: linux-fbdev@vger.kernel.org 4550 4548 S: Maintained
+11
arch/arm/configs/omap2plus_defconfig
··· 193 193 CONFIG_FB_MODE_HELPERS=y 194 194 CONFIG_FB_TILEBLITTING=y 195 195 CONFIG_FB_OMAP_LCD_VGA=y 196 + CONFIG_OMAP2_DSS=m 197 + CONFIG_OMAP2_DSS_RFBI=y 198 + CONFIG_OMAP2_DSS_SDI=y 199 + CONFIG_OMAP2_DSS_DSI=y 200 + CONFIG_FB_OMAP2=m 201 + CONFIG_PANEL_GENERIC_DPI=m 202 + CONFIG_PANEL_SHARP_LS037V7DW01=m 203 + CONFIG_PANEL_NEC_NL8048HL11_01B=m 204 + CONFIG_PANEL_TAAL=m 205 + CONFIG_PANEL_TPO_TD043MTEA1=m 206 + CONFIG_PANEL_ACX565AKM=m 196 207 CONFIG_BACKLIGHT_LCD_SUPPORT=y 197 208 CONFIG_LCD_CLASS_DEVICE=y 198 209 CONFIG_LCD_PLATFORM=y
+2 -4
arch/arm/mach-omap2/board-3430sdp.c
··· 307 307 .default_device = &sdp3430_lcd_device, 308 308 }; 309 309 310 - static struct regulator_consumer_supply sdp3430_vdda_dac_supply = 311 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 312 - 313 310 static struct omap_board_config_kernel sdp3430_config[] __initdata = { 314 311 }; 315 312 ··· 395 398 }; 396 399 397 400 static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = { 398 - REGULATOR_SUPPLY("vdda_dac", "omapdss"), 401 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"), 399 402 }; 400 403 401 404 /* VPLL2 for digital video outputs */ 402 405 static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = { 403 406 REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 407 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 404 408 }; 405 409 406 410 static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = {
+75
arch/arm/mach-omap2/board-4430sdp.c
··· 36 36 #include <plat/usb.h> 37 37 #include <plat/mmc.h> 38 38 #include <plat/omap4-keypad.h> 39 + #include <plat/display.h> 39 40 40 41 #include "mux.h" 41 42 #include "hsmmc.h" ··· 48 47 #define ETH_KS8851_QUART 138 49 48 #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184 50 49 #define OMAP4_SFH7741_ENABLE_GPIO 188 50 + #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ 51 + #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ 51 52 52 53 static const int sdp4430_keymap[] = { 53 54 KEY(0, 0, KEY_E), ··· 624 621 } 625 622 } 626 623 624 + static void sdp4430_hdmi_mux_init(void) 625 + { 626 + /* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ 627 + omap_mux_init_signal("hdmi_hpd", 628 + OMAP_PIN_INPUT_PULLUP); 629 + omap_mux_init_signal("hdmi_cec", 630 + OMAP_PIN_INPUT_PULLUP); 631 + /* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */ 632 + omap_mux_init_signal("hdmi_ddc_scl", 633 + OMAP_PIN_INPUT_PULLUP); 634 + omap_mux_init_signal("hdmi_ddc_sda", 635 + OMAP_PIN_INPUT_PULLUP); 636 + } 637 + 638 + static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) 639 + { 640 + int status; 641 + 642 + status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, 643 + "hdmi_gpio_hpd"); 644 + if (status) { 645 + pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); 646 + return status; 647 + } 648 + status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, 649 + "hdmi_gpio_ls_oe"); 650 + if (status) { 651 + pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); 652 + goto error1; 653 + } 654 + 655 + return 0; 656 + 657 + error1: 658 + gpio_free(HDMI_GPIO_HPD); 659 + 660 + return status; 661 + } 662 + 663 + static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev) 664 + { 665 + gpio_free(HDMI_GPIO_LS_OE); 666 + gpio_free(HDMI_GPIO_HPD); 667 + } 668 + 669 + static struct omap_dss_device sdp4430_hdmi_device = { 670 + .name = "hdmi", 671 + .driver_name = "hdmi_panel", 672 + .type = OMAP_DISPLAY_TYPE_HDMI, 673 + .platform_enable = sdp4430_panel_enable_hdmi, 674 + .platform_disable = sdp4430_panel_disable_hdmi, 675 + .channel = OMAP_DSS_CHANNEL_DIGIT, 676 + }; 677 + 678 + static struct omap_dss_device *sdp4430_dss_devices[] = { 679 + &sdp4430_hdmi_device, 680 + }; 681 + 682 + static struct omap_dss_board_info sdp4430_dss_data = { 683 + .num_devices = ARRAY_SIZE(sdp4430_dss_devices), 684 + .devices = sdp4430_dss_devices, 685 + .default_device = &sdp4430_hdmi_device, 686 + }; 687 + 688 + void omap_4430sdp_display_init(void) 689 + { 690 + sdp4430_hdmi_mux_init(); 691 + omap_display_init(&sdp4430_dss_data); 692 + } 693 + 627 694 #ifdef CONFIG_OMAP_MUX 628 695 static struct omap_board_mux board_mux[] __initdata = { 629 696 OMAP4_MUX(USBB2_ULPITLL_CLK, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), ··· 802 729 status = omap4_keyboard_init(&sdp4430_keypad_data); 803 730 if (status) 804 731 pr_err("Keypad initialization failed: %d\n", status); 732 + 733 + omap_4430sdp_display_init(); 805 734 } 806 735 807 736 static void __init omap_4430sdp_map_io(void)
+1 -1
arch/arm/mach-omap2/board-cm-t35.c
··· 488 488 }; 489 489 490 490 static struct regulator_consumer_supply cm_t35_vdac_supply = 491 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 491 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 492 492 493 493 static struct regulator_consumer_supply cm_t35_vdvi_supply = 494 494 REGULATOR_SUPPLY("vdvi", "omapdss");
+7 -5
arch/arm/mach-omap2/board-devkit8000.c
··· 196 196 }; 197 197 198 198 static struct regulator_consumer_supply devkit8000_vdda_dac_supply = 199 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 199 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 200 200 201 201 static uint32_t board_keymap[] = { 202 202 KEY(0, 0, KEY_1), ··· 277 277 .setup = devkit8000_twl_gpio_setup, 278 278 }; 279 279 280 - static struct regulator_consumer_supply devkit8000_vpll1_supply = 281 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 280 + static struct regulator_consumer_supply devkit8000_vpll1_supplies[] = { 281 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 282 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 283 + }; 282 284 283 285 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ 284 286 static struct regulator_init_data devkit8000_vmmc1 = { ··· 321 319 .valid_ops_mask = REGULATOR_CHANGE_MODE 322 320 | REGULATOR_CHANGE_STATUS, 323 321 }, 324 - .num_consumer_supplies = 1, 325 - .consumer_supplies = &devkit8000_vpll1_supply, 322 + .num_consumer_supplies = ARRAY_SIZE(devkit8000_vpll1_supplies), 323 + .consumer_supplies = devkit8000_vpll1_supplies, 326 324 }; 327 325 328 326 /* VAUX4 for ads7846 and nubs */
+6 -4
arch/arm/mach-omap2/board-igep0020.c
··· 485 485 .default_device = &igep2_dvi_device, 486 486 }; 487 487 488 - static struct regulator_consumer_supply igep2_vpll2_supply = 489 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 488 + static struct regulator_consumer_supply igep2_vpll2_supplies[] = { 489 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 490 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 491 + }; 490 492 491 493 static struct regulator_init_data igep2_vpll2 = { 492 494 .constraints = { ··· 501 499 .valid_ops_mask = REGULATOR_CHANGE_MODE 502 500 | REGULATOR_CHANGE_STATUS, 503 501 }, 504 - .num_consumer_supplies = 1, 505 - .consumer_supplies = &igep2_vpll2_supply, 502 + .num_consumer_supplies = ARRAY_SIZE(igep2_vpll2_supplies), 503 + .consumer_supplies = igep2_vpll2_supplies, 506 504 }; 507 505 508 506 static void __init igep2_display_init(void)
+7 -5
arch/arm/mach-omap2/board-omap3beagle.c
··· 232 232 }; 233 233 234 234 static struct regulator_consumer_supply beagle_vdac_supply = 235 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 235 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 236 236 237 - static struct regulator_consumer_supply beagle_vdvi_supply = 238 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 237 + static struct regulator_consumer_supply beagle_vdvi_supplies[] = { 238 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 239 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 240 + }; 239 241 240 242 static void __init beagle_display_init(void) 241 243 { ··· 424 422 .valid_ops_mask = REGULATOR_CHANGE_MODE 425 423 | REGULATOR_CHANGE_STATUS, 426 424 }, 427 - .num_consumer_supplies = 1, 428 - .consumer_supplies = &beagle_vdvi_supply, 425 + .num_consumer_supplies = ARRAY_SIZE(beagle_vdvi_supplies), 426 + .consumer_supplies = beagle_vdvi_supplies, 429 427 }; 430 428 431 429 static struct twl4030_usb_data beagle_usb_data = {
+7 -5
arch/arm/mach-omap2/board-omap3evm.c
··· 542 542 }; 543 543 544 544 static struct regulator_consumer_supply omap3_evm_vdda_dac_supply = 545 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 545 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 546 546 547 547 /* VDAC for DSS driving S-Video */ 548 548 static struct regulator_init_data omap3_evm_vdac = { ··· 560 560 }; 561 561 562 562 /* VPLL2 for digital video outputs */ 563 - static struct regulator_consumer_supply omap3_evm_vpll2_supply = 564 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 563 + static struct regulator_consumer_supply omap3_evm_vpll2_supplies[] = { 564 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 565 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 566 + }; 565 567 566 568 static struct regulator_init_data omap3_evm_vpll2 = { 567 569 .constraints = { ··· 575 573 .valid_ops_mask = REGULATOR_CHANGE_MODE 576 574 | REGULATOR_CHANGE_STATUS, 577 575 }, 578 - .num_consumer_supplies = 1, 579 - .consumer_supplies = &omap3_evm_vpll2_supply, 576 + .num_consumer_supplies = ARRAY_SIZE(omap3_evm_vpll2_supplies), 577 + .consumer_supplies = omap3_evm_vpll2_supplies, 580 578 }; 581 579 582 580 /* ads7846 on SPI */
+2 -1
arch/arm/mach-omap2/board-omap3pandora.c
··· 342 342 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"); 343 343 344 344 static struct regulator_consumer_supply pandora_vdda_dac_supply = 345 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 345 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 346 346 347 347 static struct regulator_consumer_supply pandora_vdds_supplies[] = { 348 348 REGULATOR_SUPPLY("vdds_sdi", "omapdss"), 349 349 REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 350 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 350 351 }; 351 352 352 353 static struct regulator_consumer_supply pandora_vcc_lcd_supply =
+7 -5
arch/arm/mach-omap2/board-omap3stalker.c
··· 439 439 }; 440 440 441 441 static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply = 442 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 442 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 443 443 444 444 /* VDAC for DSS driving S-Video */ 445 445 static struct regulator_init_data omap3_stalker_vdac = { ··· 457 457 }; 458 458 459 459 /* VPLL2 for digital video outputs */ 460 - static struct regulator_consumer_supply omap3_stalker_vpll2_supply = 461 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 460 + static struct regulator_consumer_supply omap3_stalker_vpll2_supplies[] = { 461 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 462 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 463 + }; 462 464 463 465 static struct regulator_init_data omap3_stalker_vpll2 = { 464 466 .constraints = { ··· 473 471 .valid_ops_mask = REGULATOR_CHANGE_MODE 474 472 | REGULATOR_CHANGE_STATUS, 475 473 }, 476 - .num_consumer_supplies = 1, 477 - .consumer_supplies = &omap3_stalker_vpll2_supply, 474 + .num_consumer_supplies = ARRAY_SIZE(omap3_stalker_vpll2_supplies), 475 + .consumer_supplies = omap3_stalker_vpll2_supplies, 478 476 }; 479 477 480 478 static struct twl4030_platform_data omap3stalker_twldata = {
+202 -1
arch/arm/mach-omap2/board-omap4panda.c
··· 34 34 #include <asm/mach-types.h> 35 35 #include <asm/mach/arch.h> 36 36 #include <asm/mach/map.h> 37 + #include <plat/display.h> 37 38 38 39 #include <plat/board.h> 39 40 #include <plat/common.h> 40 41 #include <plat/usb.h> 41 42 #include <plat/mmc.h> 43 + #include <plat/panel-generic-dpi.h> 42 44 #include "timer-gp.h" 43 45 44 46 #include "hsmmc.h" ··· 51 49 #define GPIO_HUB_NRESET 62 52 50 #define GPIO_WIFI_PMENA 43 53 51 #define GPIO_WIFI_IRQ 53 52 + #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ 53 + #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ 54 54 55 55 /* wl127x BT, FM, GPS connectivity chip */ 56 56 static int wl1271_gpios[] = {46, -1, -1}; ··· 437 433 .platform_data = &omap4_panda_twldata, 438 434 }, 439 435 }; 436 + 437 + /* 438 + * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM 439 + * is connected as I2C slave device, and can be accessed at address 0x50 440 + */ 441 + static struct i2c_board_info __initdata panda_i2c_eeprom[] = { 442 + { 443 + I2C_BOARD_INFO("eeprom", 0x50), 444 + }, 445 + }; 446 + 440 447 static int __init omap4_panda_i2c_init(void) 441 448 { 442 449 /* ··· 457 442 omap_register_i2c_bus(1, 400, omap4_panda_i2c_boardinfo, 458 443 ARRAY_SIZE(omap4_panda_i2c_boardinfo)); 459 444 omap_register_i2c_bus(2, 400, NULL, 0); 460 - omap_register_i2c_bus(3, 400, NULL, 0); 445 + /* 446 + * Bus 3 is attached to the DVI port where devices like the pico DLP 447 + * projector don't work reliably with 400kHz 448 + */ 449 + omap_register_i2c_bus(3, 100, panda_i2c_eeprom, 450 + ARRAY_SIZE(panda_i2c_eeprom)); 461 451 omap_register_i2c_bus(4, 400, NULL, 0); 462 452 return 0; 463 453 } ··· 482 462 OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), 483 463 OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), 484 464 OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), 465 + /* gpio 0 - TFP410 PD */ 466 + OMAP4_MUX(KPD_COL1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3), 467 + /* dispc2_data23 */ 468 + OMAP4_MUX(USBB2_ULPITLL_STP, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 469 + /* dispc2_data22 */ 470 + OMAP4_MUX(USBB2_ULPITLL_DIR, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 471 + /* dispc2_data21 */ 472 + OMAP4_MUX(USBB2_ULPITLL_NXT, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 473 + /* dispc2_data20 */ 474 + OMAP4_MUX(USBB2_ULPITLL_DAT0, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 475 + /* dispc2_data19 */ 476 + OMAP4_MUX(USBB2_ULPITLL_DAT1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 477 + /* dispc2_data18 */ 478 + OMAP4_MUX(USBB2_ULPITLL_DAT2, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 479 + /* dispc2_data15 */ 480 + OMAP4_MUX(USBB2_ULPITLL_DAT3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 481 + /* dispc2_data14 */ 482 + OMAP4_MUX(USBB2_ULPITLL_DAT4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 483 + /* dispc2_data13 */ 484 + OMAP4_MUX(USBB2_ULPITLL_DAT5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 485 + /* dispc2_data12 */ 486 + OMAP4_MUX(USBB2_ULPITLL_DAT6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 487 + /* dispc2_data11 */ 488 + OMAP4_MUX(USBB2_ULPITLL_DAT7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 489 + /* dispc2_data10 */ 490 + OMAP4_MUX(DPM_EMU3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 491 + /* dispc2_data9 */ 492 + OMAP4_MUX(DPM_EMU4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 493 + /* dispc2_data16 */ 494 + OMAP4_MUX(DPM_EMU5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 495 + /* dispc2_data17 */ 496 + OMAP4_MUX(DPM_EMU6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 497 + /* dispc2_hsync */ 498 + OMAP4_MUX(DPM_EMU7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 499 + /* dispc2_pclk */ 500 + OMAP4_MUX(DPM_EMU8, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 501 + /* dispc2_vsync */ 502 + OMAP4_MUX(DPM_EMU9, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 503 + /* dispc2_de */ 504 + OMAP4_MUX(DPM_EMU10, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 505 + /* dispc2_data8 */ 506 + OMAP4_MUX(DPM_EMU11, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 507 + /* dispc2_data7 */ 508 + OMAP4_MUX(DPM_EMU12, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 509 + /* dispc2_data6 */ 510 + OMAP4_MUX(DPM_EMU13, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 511 + /* dispc2_data5 */ 512 + OMAP4_MUX(DPM_EMU14, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 513 + /* dispc2_data4 */ 514 + OMAP4_MUX(DPM_EMU15, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 515 + /* dispc2_data3 */ 516 + OMAP4_MUX(DPM_EMU16, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 517 + /* dispc2_data2 */ 518 + OMAP4_MUX(DPM_EMU17, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 519 + /* dispc2_data1 */ 520 + OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 521 + /* dispc2_data0 */ 522 + OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), 485 523 { .reg_offset = OMAP_MUX_TERMINATOR }, 486 524 }; 487 525 ··· 613 535 } 614 536 #endif 615 537 538 + /* Display DVI */ 539 + #define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0 540 + 541 + static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev) 542 + { 543 + gpio_set_value(dssdev->reset_gpio, 1); 544 + return 0; 545 + } 546 + 547 + static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev) 548 + { 549 + gpio_set_value(dssdev->reset_gpio, 0); 550 + } 551 + 552 + /* Using generic display panel */ 553 + static struct panel_generic_dpi_data omap4_dvi_panel = { 554 + .name = "generic", 555 + .platform_enable = omap4_panda_enable_dvi, 556 + .platform_disable = omap4_panda_disable_dvi, 557 + }; 558 + 559 + struct omap_dss_device omap4_panda_dvi_device = { 560 + .type = OMAP_DISPLAY_TYPE_DPI, 561 + .name = "dvi", 562 + .driver_name = "generic_dpi_panel", 563 + .data = &omap4_dvi_panel, 564 + .phy.dpi.data_lines = 24, 565 + .reset_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO, 566 + .channel = OMAP_DSS_CHANNEL_LCD2, 567 + }; 568 + 569 + int __init omap4_panda_dvi_init(void) 570 + { 571 + int r; 572 + 573 + /* Requesting TFP410 DVI GPIO and disabling it, at bootup */ 574 + r = gpio_request_one(omap4_panda_dvi_device.reset_gpio, 575 + GPIOF_OUT_INIT_LOW, "DVI PD"); 576 + if (r) 577 + pr_err("Failed to get DVI powerdown GPIO\n"); 578 + 579 + return r; 580 + } 581 + 582 + 583 + static void omap4_panda_hdmi_mux_init(void) 584 + { 585 + /* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ 586 + omap_mux_init_signal("hdmi_hpd", 587 + OMAP_PIN_INPUT_PULLUP); 588 + omap_mux_init_signal("hdmi_cec", 589 + OMAP_PIN_INPUT_PULLUP); 590 + /* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */ 591 + omap_mux_init_signal("hdmi_ddc_scl", 592 + OMAP_PIN_INPUT_PULLUP); 593 + omap_mux_init_signal("hdmi_ddc_sda", 594 + OMAP_PIN_INPUT_PULLUP); 595 + } 596 + 597 + static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) 598 + { 599 + int status; 600 + 601 + status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, 602 + "hdmi_gpio_hpd"); 603 + if (status) { 604 + pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); 605 + return status; 606 + } 607 + status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, 608 + "hdmi_gpio_ls_oe"); 609 + if (status) { 610 + pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); 611 + goto error1; 612 + } 613 + 614 + return 0; 615 + 616 + error1: 617 + gpio_free(HDMI_GPIO_HPD); 618 + 619 + return status; 620 + } 621 + 622 + static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev) 623 + { 624 + gpio_free(HDMI_GPIO_LS_OE); 625 + gpio_free(HDMI_GPIO_HPD); 626 + } 627 + 628 + static struct omap_dss_device omap4_panda_hdmi_device = { 629 + .name = "hdmi", 630 + .driver_name = "hdmi_panel", 631 + .type = OMAP_DISPLAY_TYPE_HDMI, 632 + .platform_enable = omap4_panda_panel_enable_hdmi, 633 + .platform_disable = omap4_panda_panel_disable_hdmi, 634 + .channel = OMAP_DSS_CHANNEL_DIGIT, 635 + }; 636 + 637 + static struct omap_dss_device *omap4_panda_dss_devices[] = { 638 + &omap4_panda_dvi_device, 639 + &omap4_panda_hdmi_device, 640 + }; 641 + 642 + static struct omap_dss_board_info omap4_panda_dss_data = { 643 + .num_devices = ARRAY_SIZE(omap4_panda_dss_devices), 644 + .devices = omap4_panda_dss_devices, 645 + .default_device = &omap4_panda_dvi_device, 646 + }; 647 + 648 + void omap4_panda_display_init(void) 649 + { 650 + int r; 651 + 652 + r = omap4_panda_dvi_init(); 653 + if (r) 654 + pr_err("error initializing panda DVI\n"); 655 + 656 + omap4_panda_hdmi_mux_init(); 657 + omap_display_init(&omap4_panda_dss_data); 658 + } 659 + 616 660 static void __init omap4_panda_init(void) 617 661 { 618 662 int package = OMAP_PACKAGE_CBS; ··· 753 553 omap4_twl6030_hsmmc_init(mmc); 754 554 omap4_ehci_init(); 755 555 usb_musb_init(&musb_board_data); 556 + omap4_panda_display_init(); 756 557 } 757 558 758 559 static void __init omap4_panda_map_io(void)
+323 -34
arch/arm/mach-omap2/board-overo.c
··· 28 28 #include <linux/platform_device.h> 29 29 #include <linux/i2c/twl.h> 30 30 #include <linux/regulator/machine.h> 31 + #include <linux/regulator/fixed.h> 32 + #include <linux/spi/spi.h> 31 33 32 34 #include <linux/mtd/mtd.h> 33 35 #include <linux/mtd/nand.h> ··· 43 41 44 42 #include <plat/board.h> 45 43 #include <plat/common.h> 44 + #include <plat/display.h> 45 + #include <plat/panel-generic-dpi.h> 46 46 #include <mach/gpio.h> 47 47 #include <plat/gpmc.h> 48 48 #include <mach/hardware.h> 49 49 #include <plat/nand.h> 50 + #include <plat/mcspi.h> 51 + #include <plat/mux.h> 50 52 #include <plat/usb.h> 51 53 52 54 #include "mux.h" ··· 74 68 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ 75 69 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) 76 70 77 - #include <plat/mcspi.h> 78 - #include <linux/spi/spi.h> 79 71 #include <linux/spi/ads7846.h> 80 72 81 73 static struct omap2_mcspi_device_config ads7846_mcspi_config = { ··· 98 94 .keep_vref_on = 1, 99 95 }; 100 96 101 - static struct spi_board_info overo_spi_board_info[] __initdata = { 102 - { 103 - .modalias = "ads7846", 104 - .bus_num = 1, 105 - .chip_select = 0, 106 - .max_speed_hz = 1500000, 107 - .controller_data = &ads7846_mcspi_config, 108 - .irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN), 109 - .platform_data = &ads7846_config, 110 - } 97 + /* fixed regulator for ads7846 */ 98 + static struct regulator_consumer_supply ads7846_supply = 99 + REGULATOR_SUPPLY("vcc", "spi1.0"); 100 + 101 + static struct regulator_init_data vads7846_regulator = { 102 + .constraints = { 103 + .valid_ops_mask = REGULATOR_CHANGE_STATUS, 104 + }, 105 + .num_consumer_supplies = 1, 106 + .consumer_supplies = &ads7846_supply, 107 + }; 108 + 109 + static struct fixed_voltage_config vads7846 = { 110 + .supply_name = "vads7846", 111 + .microvolts = 3300000, /* 3.3V */ 112 + .gpio = -EINVAL, 113 + .startup_delay = 0, 114 + .init_data = &vads7846_regulator, 115 + }; 116 + 117 + static struct platform_device vads7846_device = { 118 + .name = "reg-fixed-voltage", 119 + .id = 1, 120 + .dev = { 121 + .platform_data = &vads7846, 122 + }, 111 123 }; 112 124 113 125 static void __init overo_ads7846_init(void) ··· 136 116 return; 137 117 } 138 118 139 - spi_register_board_info(overo_spi_board_info, 140 - ARRAY_SIZE(overo_spi_board_info)); 119 + platform_device_register(&vads7846_device); 141 120 } 142 121 143 122 #else ··· 252 233 static inline void __init overo_init_smsc911x(void) { return; } 253 234 #endif 254 235 236 + /* DSS */ 237 + static int lcd_enabled; 238 + static int dvi_enabled; 239 + 240 + #define OVERO_GPIO_LCD_EN 144 241 + #define OVERO_GPIO_LCD_BL 145 242 + 243 + static void __init overo_display_init(void) 244 + { 245 + if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) && 246 + (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0)) 247 + gpio_export(OVERO_GPIO_LCD_EN, 0); 248 + else 249 + printk(KERN_ERR "could not obtain gpio for " 250 + "OVERO_GPIO_LCD_EN\n"); 251 + 252 + if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) && 253 + (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0)) 254 + gpio_export(OVERO_GPIO_LCD_BL, 0); 255 + else 256 + printk(KERN_ERR "could not obtain gpio for " 257 + "OVERO_GPIO_LCD_BL\n"); 258 + } 259 + 260 + static int overo_panel_enable_dvi(struct omap_dss_device *dssdev) 261 + { 262 + if (lcd_enabled) { 263 + printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); 264 + return -EINVAL; 265 + } 266 + dvi_enabled = 1; 267 + 268 + return 0; 269 + } 270 + 271 + static void overo_panel_disable_dvi(struct omap_dss_device *dssdev) 272 + { 273 + dvi_enabled = 0; 274 + } 275 + 276 + static struct panel_generic_dpi_data dvi_panel = { 277 + .name = "generic", 278 + .platform_enable = overo_panel_enable_dvi, 279 + .platform_disable = overo_panel_disable_dvi, 280 + }; 281 + 282 + static struct omap_dss_device overo_dvi_device = { 283 + .name = "dvi", 284 + .type = OMAP_DISPLAY_TYPE_DPI, 285 + .driver_name = "generic_dpi_panel", 286 + .data = &dvi_panel, 287 + .phy.dpi.data_lines = 24, 288 + }; 289 + 290 + static struct omap_dss_device overo_tv_device = { 291 + .name = "tv", 292 + .driver_name = "venc", 293 + .type = OMAP_DISPLAY_TYPE_VENC, 294 + .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, 295 + }; 296 + 297 + static int overo_panel_enable_lcd(struct omap_dss_device *dssdev) 298 + { 299 + if (dvi_enabled) { 300 + printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); 301 + return -EINVAL; 302 + } 303 + 304 + gpio_set_value(OVERO_GPIO_LCD_EN, 1); 305 + gpio_set_value(OVERO_GPIO_LCD_BL, 1); 306 + lcd_enabled = 1; 307 + return 0; 308 + } 309 + 310 + static void overo_panel_disable_lcd(struct omap_dss_device *dssdev) 311 + { 312 + gpio_set_value(OVERO_GPIO_LCD_EN, 0); 313 + gpio_set_value(OVERO_GPIO_LCD_BL, 0); 314 + lcd_enabled = 0; 315 + } 316 + 317 + static struct panel_generic_dpi_data lcd43_panel = { 318 + .name = "samsung_lte430wq_f0c", 319 + .platform_enable = overo_panel_enable_lcd, 320 + .platform_disable = overo_panel_disable_lcd, 321 + }; 322 + 323 + static struct omap_dss_device overo_lcd43_device = { 324 + .name = "lcd43", 325 + .type = OMAP_DISPLAY_TYPE_DPI, 326 + .driver_name = "generic_dpi_panel", 327 + .data = &lcd43_panel, 328 + .phy.dpi.data_lines = 24, 329 + }; 330 + 331 + #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ 332 + defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) 333 + static struct omap_dss_device overo_lcd35_device = { 334 + .type = OMAP_DISPLAY_TYPE_DPI, 335 + .name = "lcd35", 336 + .driver_name = "lgphilips_lb035q02_panel", 337 + .phy.dpi.data_lines = 24, 338 + .platform_enable = overo_panel_enable_lcd, 339 + .platform_disable = overo_panel_disable_lcd, 340 + }; 341 + #endif 342 + 343 + static struct omap_dss_device *overo_dss_devices[] = { 344 + &overo_dvi_device, 345 + &overo_tv_device, 346 + #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ 347 + defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) 348 + &overo_lcd35_device, 349 + #endif 350 + &overo_lcd43_device, 351 + }; 352 + 353 + static struct omap_dss_board_info overo_dss_data = { 354 + .num_devices = ARRAY_SIZE(overo_dss_devices), 355 + .devices = overo_dss_devices, 356 + .default_device = &overo_dvi_device, 357 + }; 358 + 359 + static struct regulator_consumer_supply overo_vdda_dac_supply = 360 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 361 + 362 + static struct regulator_consumer_supply overo_vdds_dsi_supply[] = { 363 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 364 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 365 + }; 366 + 255 367 static struct mtd_partition overo_nand_partitions[] = { 256 368 { 257 369 .name = "xloader", ··· 473 323 .supply = "vmmc", 474 324 }; 475 325 326 + #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 327 + #include <linux/leds.h> 328 + 329 + static struct gpio_led gpio_leds[] = { 330 + { 331 + .name = "overo:red:gpio21", 332 + .default_trigger = "heartbeat", 333 + .gpio = 21, 334 + .active_low = true, 335 + }, 336 + { 337 + .name = "overo:blue:gpio22", 338 + .default_trigger = "none", 339 + .gpio = 22, 340 + .active_low = true, 341 + }, 342 + { 343 + .name = "overo:blue:COM", 344 + .default_trigger = "mmc0", 345 + .gpio = -EINVAL, /* gets replaced */ 346 + .active_low = true, 347 + }, 348 + }; 349 + 350 + static struct gpio_led_platform_data gpio_leds_pdata = { 351 + .leds = gpio_leds, 352 + .num_leds = ARRAY_SIZE(gpio_leds), 353 + }; 354 + 355 + static struct platform_device gpio_leds_device = { 356 + .name = "leds-gpio", 357 + .id = -1, 358 + .dev = { 359 + .platform_data = &gpio_leds_pdata, 360 + }, 361 + }; 362 + 363 + static void __init overo_init_led(void) 364 + { 365 + platform_device_register(&gpio_leds_device); 366 + } 367 + 368 + #else 369 + static inline void __init overo_init_led(void) { return; } 370 + #endif 371 + 372 + #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 373 + #include <linux/input.h> 374 + #include <linux/gpio_keys.h> 375 + 376 + static struct gpio_keys_button gpio_buttons[] = { 377 + { 378 + .code = BTN_0, 379 + .gpio = 23, 380 + .desc = "button0", 381 + .wakeup = 1, 382 + }, 383 + { 384 + .code = BTN_1, 385 + .gpio = 14, 386 + .desc = "button1", 387 + .wakeup = 1, 388 + }, 389 + }; 390 + 391 + static struct gpio_keys_platform_data gpio_keys_pdata = { 392 + .buttons = gpio_buttons, 393 + .nbuttons = ARRAY_SIZE(gpio_buttons), 394 + }; 395 + 396 + static struct platform_device gpio_keys_device = { 397 + .name = "gpio-keys", 398 + .id = -1, 399 + .dev = { 400 + .platform_data = &gpio_keys_pdata, 401 + }, 402 + }; 403 + 404 + static void __init overo_init_keys(void) 405 + { 406 + platform_device_register(&gpio_keys_device); 407 + } 408 + 409 + #else 410 + static inline void __init overo_init_keys(void) { return; } 411 + #endif 412 + 476 413 static int overo_twl_gpio_setup(struct device *dev, 477 414 unsigned gpio, unsigned ngpio) 478 415 { 479 416 omap2_hsmmc_init(mmc); 480 417 481 418 overo_vmmc1_supply.dev = mmc[0].dev; 419 + 420 + #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 421 + /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ 422 + gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; 423 + #endif 482 424 483 425 return 0; 484 426 } ··· 579 337 .gpio_base = OMAP_MAX_GPIO_LINES, 580 338 .irq_base = TWL4030_GPIO_IRQ_BASE, 581 339 .irq_end = TWL4030_GPIO_IRQ_END, 340 + .use_leds = true, 582 341 .setup = overo_twl_gpio_setup, 583 342 }; 584 343 ··· 601 358 .consumer_supplies = &overo_vmmc1_supply, 602 359 }; 603 360 361 + /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ 362 + static struct regulator_init_data overo_vdac = { 363 + .constraints = { 364 + .min_uV = 1800000, 365 + .max_uV = 1800000, 366 + .valid_modes_mask = REGULATOR_MODE_NORMAL 367 + | REGULATOR_MODE_STANDBY, 368 + .valid_ops_mask = REGULATOR_CHANGE_MODE 369 + | REGULATOR_CHANGE_STATUS, 370 + }, 371 + .num_consumer_supplies = 1, 372 + .consumer_supplies = &overo_vdda_dac_supply, 373 + }; 374 + 375 + /* VPLL2 for digital video outputs */ 376 + static struct regulator_init_data overo_vpll2 = { 377 + .constraints = { 378 + .name = "VDVI", 379 + .min_uV = 1800000, 380 + .max_uV = 1800000, 381 + .valid_modes_mask = REGULATOR_MODE_NORMAL 382 + | REGULATOR_MODE_STANDBY, 383 + .valid_ops_mask = REGULATOR_CHANGE_MODE 384 + | REGULATOR_CHANGE_STATUS, 385 + }, 386 + .num_consumer_supplies = ARRAY_SIZE(overo_vdds_dsi_supply), 387 + .consumer_supplies = overo_vdds_dsi_supply, 388 + }; 389 + 604 390 static struct twl4030_codec_audio_data overo_audio_data; 605 391 606 392 static struct twl4030_codec_data overo_codec_data = { 607 393 .audio_mclk = 26000000, 608 394 .audio = &overo_audio_data, 609 395 }; 610 - 611 - /* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */ 612 396 613 397 static struct twl4030_platform_data overo_twldata = { 614 398 .irq_base = TWL4030_IRQ_BASE, ··· 644 374 .usb = &overo_usb_data, 645 375 .codec = &overo_codec_data, 646 376 .vmmc1 = &overo_vmmc1, 377 + .vdac = &overo_vdac, 378 + .vpll2 = &overo_vpll2, 647 379 }; 648 380 649 381 static struct i2c_board_info __initdata overo_i2c_boardinfo[] = { ··· 666 394 return 0; 667 395 } 668 396 669 - static struct platform_device overo_lcd_device = { 670 - .name = "overo_lcd", 671 - .id = -1, 397 + static struct spi_board_info overo_spi_board_info[] __initdata = { 398 + #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ 399 + defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) 400 + { 401 + .modalias = "ads7846", 402 + .bus_num = 1, 403 + .chip_select = 0, 404 + .max_speed_hz = 1500000, 405 + .controller_data = &ads7846_mcspi_config, 406 + .irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN), 407 + .platform_data = &ads7846_config, 408 + }, 409 + #endif 410 + #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ 411 + defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) 412 + { 413 + .modalias = "lgphilips_lb035q02_panel-spi", 414 + .bus_num = 1, 415 + .chip_select = 1, 416 + .max_speed_hz = 500000, 417 + .mode = SPI_MODE_3, 418 + }, 419 + #endif 672 420 }; 673 421 674 - static struct omap_lcd_config overo_lcd_config __initdata = { 675 - .ctrl_name = "internal", 676 - }; 677 - 678 - static struct omap_board_config_kernel overo_config[] __initdata = { 679 - { OMAP_TAG_LCD, &overo_lcd_config }, 680 - }; 422 + static int __init overo_spi_init(void) 423 + { 424 + overo_ads7846_init(); 425 + spi_register_board_info(overo_spi_board_info, 426 + ARRAY_SIZE(overo_spi_board_info)); 427 + return 0; 428 + } 681 429 682 430 static void __init overo_init_early(void) 683 431 { ··· 706 414 mt46h32m32lf6_sdrc_params); 707 415 } 708 416 709 - static struct platform_device *overo_devices[] __initdata = { 710 - &overo_lcd_device, 711 - }; 712 - 713 417 static const struct usbhs_omap_board_data usbhs_bdata __initconst = { 714 418 .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, 715 419 .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 716 420 .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, 717 - 718 421 .phy_reset = true, 719 422 .reset_gpio_port[0] = -EINVAL, 720 423 .reset_gpio_port[1] = OVERO_GPIO_USBH_NRESET, ··· 731 444 static void __init overo_init(void) 732 445 { 733 446 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 734 - omap_board_config = overo_config; 735 - omap_board_config_size = ARRAY_SIZE(overo_config); 736 447 overo_i2c_init(); 737 - platform_add_devices(overo_devices, ARRAY_SIZE(overo_devices)); 448 + omap_display_init(&overo_dss_data); 738 449 omap_serial_init(); 739 450 overo_flash_init(); 740 451 usb_musb_init(&musb_board_data); 741 452 usbhs_init(&usbhs_bdata); 453 + overo_spi_init(); 742 454 overo_ads7846_init(); 743 455 overo_init_smsc911x(); 456 + overo_display_init(); 457 + overo_init_led(); 458 + overo_init_keys(); 744 459 745 460 /* Ensure SDRC pins are mux'd for self-refresh */ 746 461 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
+1 -1
arch/arm/mach-omap2/board-rx51-peripherals.c
··· 372 372 }; 373 373 374 374 static struct regulator_consumer_supply rx51_vdac_supply[] = { 375 - REGULATOR_SUPPLY("vdda_dac", "omapdss"), 375 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"), 376 376 }; 377 377 378 378 static struct regulator_init_data rx51_vaux1 = {
+7 -5
arch/arm/mach-omap2/board-zoom-peripherals.c
··· 226 226 {} /* Terminator */ 227 227 }; 228 228 229 - static struct regulator_consumer_supply zoom_vpll2_supply = 230 - REGULATOR_SUPPLY("vdds_dsi", "omapdss"); 229 + static struct regulator_consumer_supply zoom_vpll2_supplies[] = { 230 + REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 231 + REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), 232 + }; 231 233 232 234 static struct regulator_consumer_supply zoom_vdda_dac_supply = 233 - REGULATOR_SUPPLY("vdda_dac", "omapdss"); 235 + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); 234 236 235 237 static struct regulator_init_data zoom_vpll2 = { 236 238 .constraints = { ··· 243 241 .valid_ops_mask = REGULATOR_CHANGE_MODE 244 242 | REGULATOR_CHANGE_STATUS, 245 243 }, 246 - .num_consumer_supplies = 1, 247 - .consumer_supplies = &zoom_vpll2_supply, 244 + .num_consumer_supplies = ARRAY_SIZE(zoom_vpll2_supplies), 245 + .consumer_supplies = zoom_vpll2_supplies, 248 246 }; 249 247 250 248 static struct regulator_init_data zoom_vdac = {
+4 -4
arch/arm/mach-omap2/clock2420_data.c
··· 1804 1804 CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_242X), 1805 1805 CLK(NULL, "gfx_ick", &gfx_ick, CK_242X), 1806 1806 /* DSS domain clocks */ 1807 - CLK("omapdss", "ick", &dss_ick, CK_242X), 1808 - CLK("omapdss", "dss1_fck", &dss1_fck, CK_242X), 1809 - CLK("omapdss", "dss2_fck", &dss2_fck, CK_242X), 1810 - CLK("omapdss", "tv_fck", &dss_54m_fck, CK_242X), 1807 + CLK("omapdss_dss", "ick", &dss_ick, CK_242X), 1808 + CLK("omapdss_dss", "fck", &dss1_fck, CK_242X), 1809 + CLK("omapdss_dss", "sys_clk", &dss2_fck, CK_242X), 1810 + CLK("omapdss_dss", "tv_clk", &dss_54m_fck, CK_242X), 1811 1811 /* L3 domain clocks */ 1812 1812 CLK(NULL, "core_l3_ck", &core_l3_ck, CK_242X), 1813 1813 CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_242X),
+4 -4
arch/arm/mach-omap2/clock2430_data.c
··· 1894 1894 CLK(NULL, "mdm_ick", &mdm_ick, CK_243X), 1895 1895 CLK(NULL, "mdm_osc_ck", &mdm_osc_ck, CK_243X), 1896 1896 /* DSS domain clocks */ 1897 - CLK("omapdss", "ick", &dss_ick, CK_243X), 1898 - CLK("omapdss", "dss1_fck", &dss1_fck, CK_243X), 1899 - CLK("omapdss", "dss2_fck", &dss2_fck, CK_243X), 1900 - CLK("omapdss", "tv_fck", &dss_54m_fck, CK_243X), 1897 + CLK("omapdss_dss", "ick", &dss_ick, CK_243X), 1898 + CLK("omapdss_dss", "fck", &dss1_fck, CK_243X), 1899 + CLK("omapdss_dss", "sys_clk", &dss2_fck, CK_243X), 1900 + CLK("omapdss_dss", "tv_clk", &dss_54m_fck, CK_243X), 1901 1901 /* L3 domain clocks */ 1902 1902 CLK(NULL, "core_l3_ck", &core_l3_ck, CK_243X), 1903 1903 CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_243X),
+7 -7
arch/arm/mach-omap2/clock3xxx_data.c
··· 3356 3356 CLK("omap_rng", "ick", &rng_ick, CK_34XX | CK_36XX), 3357 3357 CLK(NULL, "sha11_ick", &sha11_ick, CK_34XX | CK_36XX), 3358 3358 CLK(NULL, "des1_ick", &des1_ick, CK_34XX | CK_36XX), 3359 - CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1), 3360 - CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2PLUS | CK_AM35XX | CK_36XX), 3361 - CLK("omapdss", "tv_fck", &dss_tv_fck, CK_3XXX), 3362 - CLK("omapdss", "video_fck", &dss_96m_fck, CK_3XXX), 3363 - CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_3XXX), 3364 - CLK("omapdss", "ick", &dss_ick_3430es1, CK_3430ES1), 3365 - CLK("omapdss", "ick", &dss_ick_3430es2, CK_3430ES2PLUS | CK_AM35XX | CK_36XX), 3359 + CLK("omapdss_dss", "fck", &dss1_alwon_fck_3430es1, CK_3430ES1), 3360 + CLK("omapdss_dss", "fck", &dss1_alwon_fck_3430es2, CK_3430ES2PLUS | CK_AM35XX | CK_36XX), 3361 + CLK("omapdss_dss", "tv_clk", &dss_tv_fck, CK_3XXX), 3362 + CLK("omapdss_dss", "video_clk", &dss_96m_fck, CK_3XXX), 3363 + CLK("omapdss_dss", "sys_clk", &dss2_alwon_fck, CK_3XXX), 3364 + CLK("omapdss_dss", "ick", &dss_ick_3430es1, CK_3430ES1), 3365 + CLK("omapdss_dss", "ick", &dss_ick_3430es2, CK_3430ES2PLUS | CK_AM35XX | CK_36XX), 3366 3366 CLK(NULL, "cam_mclk", &cam_mclk, CK_34XX | CK_36XX), 3367 3367 CLK(NULL, "cam_ick", &cam_ick, CK_34XX | CK_36XX), 3368 3368 CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_34XX | CK_36XX),
+10 -5
arch/arm/mach-omap2/clock44xx_data.c
··· 3114 3114 CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X), 3115 3115 CLK(NULL, "dmic_fck", &dmic_fck, CK_443X), 3116 3116 CLK(NULL, "dsp_fck", &dsp_fck, CK_443X), 3117 - CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X), 3118 - CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X), 3119 - CLK(NULL, "dss_dss_clk", &dss_dss_clk, CK_443X), 3120 - CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X), 3121 - CLK(NULL, "dss_fck", &dss_fck, CK_443X), 3117 + CLK("omapdss_dss", "sys_clk", &dss_sys_clk, CK_443X), 3118 + CLK("omapdss_dss", "tv_clk", &dss_tv_clk, CK_443X), 3119 + CLK("omapdss_dss", "dss_clk", &dss_dss_clk, CK_443X), 3120 + CLK("omapdss_dss", "video_clk", &dss_48mhz_clk, CK_443X), 3121 + CLK("omapdss_dss", "fck", &dss_fck, CK_443X), 3122 + /* 3123 + * On OMAP4, DSS ick is a dummy clock; this is needed for compatibility 3124 + * with OMAP2/3. 3125 + */ 3126 + CLK("omapdss_dss", "ick", &dummy_ck, CK_443X), 3122 3127 CLK(NULL, "efuse_ctrl_cust_fck", &efuse_ctrl_cust_fck, CK_443X), 3123 3128 CLK(NULL, "emif1_fck", &emif1_fck, CK_443X), 3124 3129 CLK(NULL, "emif2_fck", &emif2_fck, CK_443X),
+80
arch/arm/mach-omap2/display.c
··· 23 23 #include <linux/err.h> 24 24 25 25 #include <plat/display.h> 26 + #include <plat/omap_hwmod.h> 27 + #include <plat/omap_device.h> 26 28 27 29 static struct platform_device omap_display_device = { 28 30 .name = "omapdss", ··· 34 32 }, 35 33 }; 36 34 35 + static struct omap_device_pm_latency omap_dss_latency[] = { 36 + [0] = { 37 + .deactivate_func = omap_device_idle_hwmods, 38 + .activate_func = omap_device_enable_hwmods, 39 + .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, 40 + }, 41 + }; 42 + 43 + /* oh_core is used for getting opt-clocks */ 44 + static struct omap_hwmod *oh_core; 45 + 46 + static bool opt_clock_available(const char *clk_role) 47 + { 48 + int i; 49 + 50 + for (i = 0; i < oh_core->opt_clks_cnt; i++) { 51 + if (!strcmp(oh_core->opt_clks[i].role, clk_role)) 52 + return true; 53 + } 54 + return false; 55 + } 56 + 37 57 int __init omap_display_init(struct omap_dss_board_info *board_data) 38 58 { 39 59 int r = 0; 60 + struct omap_hwmod *oh; 61 + struct omap_device *od; 62 + int i; 63 + struct omap_display_platform_data pdata; 64 + 65 + /* 66 + * omap: valid DSS hwmod names 67 + * omap2,3,4: dss_core, dss_dispc, dss_rfbi, dss_venc 68 + * omap3,4: dss_dsi1 69 + * omap4: dss_dsi2, dss_hdmi 70 + */ 71 + char *oh_name[] = { "dss_core", "dss_dispc", "dss_rfbi", "dss_venc", 72 + "dss_dsi1", "dss_dsi2", "dss_hdmi" }; 73 + char *dev_name[] = { "omapdss_dss", "omapdss_dispc", "omapdss_rfbi", 74 + "omapdss_venc", "omapdss_dsi1", "omapdss_dsi2", 75 + "omapdss_hdmi" }; 76 + int oh_count; 77 + 78 + memset(&pdata, 0, sizeof(pdata)); 79 + 80 + if (cpu_is_omap24xx()) 81 + oh_count = ARRAY_SIZE(oh_name) - 3; 82 + /* last 3 hwmod dev in oh_name are not available for omap2 */ 83 + else if (cpu_is_omap44xx()) 84 + oh_count = ARRAY_SIZE(oh_name); 85 + else 86 + oh_count = ARRAY_SIZE(oh_name) - 2; 87 + /* last 2 hwmod dev in oh_name are not available for omap3 */ 88 + 89 + /* opt_clks are always associated with dss hwmod */ 90 + oh_core = omap_hwmod_lookup("dss_core"); 91 + if (!oh_core) { 92 + pr_err("Could not look up dss_core.\n"); 93 + return -ENODEV; 94 + } 95 + 96 + pdata.board_data = board_data; 97 + pdata.board_data->get_last_off_on_transaction_id = NULL; 98 + pdata.opt_clock_available = opt_clock_available; 99 + 100 + for (i = 0; i < oh_count; i++) { 101 + oh = omap_hwmod_lookup(oh_name[i]); 102 + if (!oh) { 103 + pr_err("Could not look up %s\n", oh_name[i]); 104 + return -ENODEV; 105 + } 106 + 107 + od = omap_device_build(dev_name[i], -1, oh, &pdata, 108 + sizeof(struct omap_display_platform_data), 109 + omap_dss_latency, 110 + ARRAY_SIZE(omap_dss_latency), 0); 111 + 112 + if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", 113 + oh_name[i])) 114 + return -ENODEV; 115 + } 40 116 omap_display_device.dev.platform_data = board_data; 41 117 42 118 r = platform_device_register(&omap_display_device);
+6 -7
arch/arm/mach-omap2/omap_hwmod_2420_data.c
··· 1168 1168 .sysc = &omap2420_dss_sysc, 1169 1169 }; 1170 1170 1171 - /* dss */ 1172 - static struct omap_hwmod_irq_info omap2420_dss_irqs[] = { 1173 - { .irq = 25 }, 1174 - }; 1175 - 1176 1171 static struct omap_hwmod_dma_info omap2420_dss_sdma_chs[] = { 1177 1172 { .name = "dispc", .dma_req = 5 }, 1178 1173 }; ··· 1216 1221 .name = "dss_core", 1217 1222 .class = &omap2420_dss_hwmod_class, 1218 1223 .main_clk = "dss1_fck", /* instead of dss_fck */ 1219 - .mpu_irqs = omap2420_dss_irqs, 1220 - .mpu_irqs_cnt = ARRAY_SIZE(omap2420_dss_irqs), 1221 1224 .sdma_reqs = omap2420_dss_sdma_chs, 1222 1225 .sdma_reqs_cnt = ARRAY_SIZE(omap2420_dss_sdma_chs), 1223 1226 .prcm = { ··· 1258 1265 .sysc = &omap2420_dispc_sysc, 1259 1266 }; 1260 1267 1268 + static struct omap_hwmod_irq_info omap2420_dispc_irqs[] = { 1269 + { .irq = 25 }, 1270 + }; 1271 + 1261 1272 static struct omap_hwmod_addr_space omap2420_dss_dispc_addrs[] = { 1262 1273 { 1263 1274 .pa_start = 0x48050400, ··· 1294 1297 static struct omap_hwmod omap2420_dss_dispc_hwmod = { 1295 1298 .name = "dss_dispc", 1296 1299 .class = &omap2420_dispc_hwmod_class, 1300 + .mpu_irqs = omap2420_dispc_irqs, 1301 + .mpu_irqs_cnt = ARRAY_SIZE(omap2420_dispc_irqs), 1297 1302 .main_clk = "dss1_fck", 1298 1303 .prcm = { 1299 1304 .omap2 = {
+6 -6
arch/arm/mach-omap2/omap_hwmod_2430_data.c
··· 1268 1268 .sysc = &omap2430_dss_sysc, 1269 1269 }; 1270 1270 1271 - /* dss */ 1272 - static struct omap_hwmod_irq_info omap2430_dss_irqs[] = { 1273 - { .irq = 25 }, 1274 - }; 1275 1271 static struct omap_hwmod_dma_info omap2430_dss_sdma_chs[] = { 1276 1272 { .name = "dispc", .dma_req = 5 }, 1277 1273 }; ··· 1310 1314 .name = "dss_core", 1311 1315 .class = &omap2430_dss_hwmod_class, 1312 1316 .main_clk = "dss1_fck", /* instead of dss_fck */ 1313 - .mpu_irqs = omap2430_dss_irqs, 1314 - .mpu_irqs_cnt = ARRAY_SIZE(omap2430_dss_irqs), 1315 1317 .sdma_reqs = omap2430_dss_sdma_chs, 1316 1318 .sdma_reqs_cnt = ARRAY_SIZE(omap2430_dss_sdma_chs), 1317 1319 .prcm = { ··· 1352 1358 .sysc = &omap2430_dispc_sysc, 1353 1359 }; 1354 1360 1361 + static struct omap_hwmod_irq_info omap2430_dispc_irqs[] = { 1362 + { .irq = 25 }, 1363 + }; 1364 + 1355 1365 static struct omap_hwmod_addr_space omap2430_dss_dispc_addrs[] = { 1356 1366 { 1357 1367 .pa_start = 0x48050400, ··· 1382 1384 static struct omap_hwmod omap2430_dss_dispc_hwmod = { 1383 1385 .name = "dss_dispc", 1384 1386 .class = &omap2430_dispc_hwmod_class, 1387 + .mpu_irqs = omap2430_dispc_irqs, 1388 + .mpu_irqs_cnt = ARRAY_SIZE(omap2430_dispc_irqs), 1385 1389 .main_clk = "dss1_fck", 1386 1390 .prcm = { 1387 1391 .omap2 = {
+13 -10
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
··· 1480 1480 .sysc = &omap3xxx_dss_sysc, 1481 1481 }; 1482 1482 1483 - /* dss */ 1484 - static struct omap_hwmod_irq_info omap3xxx_dss_irqs[] = { 1485 - { .irq = 25 }, 1486 - }; 1487 - 1488 1483 static struct omap_hwmod_dma_info omap3xxx_dss_sdma_chs[] = { 1489 1484 { .name = "dispc", .dma_req = 5 }, 1490 1485 { .name = "dsi1", .dma_req = 74 }, ··· 1543 1548 1544 1549 static struct omap_hwmod_opt_clk dss_opt_clks[] = { 1545 1550 { .role = "tv_clk", .clk = "dss_tv_fck" }, 1546 - { .role = "dssclk", .clk = "dss_96m_fck" }, 1551 + { .role = "video_clk", .clk = "dss_96m_fck" }, 1547 1552 { .role = "sys_clk", .clk = "dss2_alwon_fck" }, 1548 1553 }; 1549 1554 ··· 1551 1556 .name = "dss_core", 1552 1557 .class = &omap3xxx_dss_hwmod_class, 1553 1558 .main_clk = "dss1_alwon_fck", /* instead of dss_fck */ 1554 - .mpu_irqs = omap3xxx_dss_irqs, 1555 - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_dss_irqs), 1556 1559 .sdma_reqs = omap3xxx_dss_sdma_chs, 1557 1560 .sdma_reqs_cnt = ARRAY_SIZE(omap3xxx_dss_sdma_chs), 1558 1561 ··· 1577 1584 .name = "dss_core", 1578 1585 .class = &omap3xxx_dss_hwmod_class, 1579 1586 .main_clk = "dss1_alwon_fck", /* instead of dss_fck */ 1580 - .mpu_irqs = omap3xxx_dss_irqs, 1581 - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_dss_irqs), 1582 1587 .sdma_reqs = omap3xxx_dss_sdma_chs, 1583 1588 .sdma_reqs_cnt = ARRAY_SIZE(omap3xxx_dss_sdma_chs), 1584 1589 ··· 1622 1631 .sysc = &omap3xxx_dispc_sysc, 1623 1632 }; 1624 1633 1634 + static struct omap_hwmod_irq_info omap3xxx_dispc_irqs[] = { 1635 + { .irq = 25 }, 1636 + }; 1637 + 1625 1638 static struct omap_hwmod_addr_space omap3xxx_dss_dispc_addrs[] = { 1626 1639 { 1627 1640 .pa_start = 0x48050400, ··· 1659 1664 static struct omap_hwmod omap3xxx_dss_dispc_hwmod = { 1660 1665 .name = "dss_dispc", 1661 1666 .class = &omap3xxx_dispc_hwmod_class, 1667 + .mpu_irqs = omap3xxx_dispc_irqs, 1668 + .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_dispc_irqs), 1662 1669 .main_clk = "dss1_alwon_fck", 1663 1670 .prcm = { 1664 1671 .omap2 = { ··· 1684 1687 1685 1688 static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { 1686 1689 .name = "dsi", 1690 + }; 1691 + 1692 + static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = { 1693 + { .irq = 25 }, 1687 1694 }; 1688 1695 1689 1696 /* dss_dsi1 */ ··· 1723 1722 static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = { 1724 1723 .name = "dss_dsi1", 1725 1724 .class = &omap3xxx_dsi_hwmod_class, 1725 + .mpu_irqs = omap3xxx_dsi1_irqs, 1726 + .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_dsi1_irqs), 1726 1727 .main_clk = "dss1_alwon_fck", 1727 1728 .prcm = { 1728 1729 .omap2 = {
+13 -2
arch/arm/plat-omap/include/plat/display.h
··· 58 58 OMAP_DISPLAY_TYPE_SDI = 1 << 2, 59 59 OMAP_DISPLAY_TYPE_DSI = 1 << 3, 60 60 OMAP_DISPLAY_TYPE_VENC = 1 << 4, 61 + OMAP_DISPLAY_TYPE_HDMI = 1 << 5, 61 62 }; 62 63 63 64 enum omap_plane { ··· 238 237 } 239 238 #endif 240 239 240 + struct omap_display_platform_data { 241 + struct omap_dss_board_info *board_data; 242 + /* TODO: Additional members to be added when PM is considered */ 243 + 244 + bool (*opt_clock_available)(const char *clk_role); 245 + }; 246 + 241 247 struct omap_video_timings { 242 248 /* Unit: pixels */ 243 249 u16 x_res; ··· 404 396 struct { 405 397 u16 regn; 406 398 u16 regm; 407 - u16 regm3; 408 - u16 regm4; 399 + u16 regm_dispc; 400 + u16 regm_dsi; 409 401 410 402 u16 lp_clk_div; 411 403 ··· 563 555 int channel, 564 556 u16 x, u16 y, u16 w, u16 h, 565 557 void (*callback)(int, void *), void *data); 558 + int omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel); 559 + int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id); 560 + void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel); 566 561 567 562 int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); 568 563 void omapdss_dsi_display_disable(struct omap_dss_device *dssdev);
+1 -1
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
··· 889 889 } 890 890 891 891 if (rdev->flags & RADEON_IS_MOBILITY) { 892 - /* A temporal workaround for the occational blanking on certain laptop panels. 892 + /* A temporal workaround for the occasional blanking on certain laptop panels. 893 893 This appears to related to the PLL divider registers (fail to lock?). 894 894 It occurs even when all dividers are the same with their old settings. 895 895 In this case we really don't need to fiddle with PLL registers.
+71 -63
drivers/mfd/sm501.c
··· 133 133 134 134 static void sm501_dump_clk(struct sm501_devdata *sm) 135 135 { 136 - unsigned long misct = readl(sm->regs + SM501_MISC_TIMING); 137 - unsigned long pm0 = readl(sm->regs + SM501_POWER_MODE_0_CLOCK); 138 - unsigned long pm1 = readl(sm->regs + SM501_POWER_MODE_1_CLOCK); 139 - unsigned long pmc = readl(sm->regs + SM501_POWER_MODE_CONTROL); 136 + unsigned long misct = smc501_readl(sm->regs + SM501_MISC_TIMING); 137 + unsigned long pm0 = smc501_readl(sm->regs + SM501_POWER_MODE_0_CLOCK); 138 + unsigned long pm1 = smc501_readl(sm->regs + SM501_POWER_MODE_1_CLOCK); 139 + unsigned long pmc = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL); 140 140 unsigned long sdclk0, sdclk1; 141 141 unsigned long pll2 = 0; 142 142 ··· 193 193 void __iomem *regs = sm->regs; 194 194 195 195 dev_info(sm->dev, "System Control %08x\n", 196 - readl(regs + SM501_SYSTEM_CONTROL)); 196 + smc501_readl(regs + SM501_SYSTEM_CONTROL)); 197 197 dev_info(sm->dev, "Misc Control %08x\n", 198 - readl(regs + SM501_MISC_CONTROL)); 198 + smc501_readl(regs + SM501_MISC_CONTROL)); 199 199 dev_info(sm->dev, "GPIO Control Low %08x\n", 200 - readl(regs + SM501_GPIO31_0_CONTROL)); 200 + smc501_readl(regs + SM501_GPIO31_0_CONTROL)); 201 201 dev_info(sm->dev, "GPIO Control Hi %08x\n", 202 - readl(regs + SM501_GPIO63_32_CONTROL)); 202 + smc501_readl(regs + SM501_GPIO63_32_CONTROL)); 203 203 dev_info(sm->dev, "DRAM Control %08x\n", 204 - readl(regs + SM501_DRAM_CONTROL)); 204 + smc501_readl(regs + SM501_DRAM_CONTROL)); 205 205 dev_info(sm->dev, "Arbitration Ctrl %08x\n", 206 - readl(regs + SM501_ARBTRTN_CONTROL)); 206 + smc501_readl(regs + SM501_ARBTRTN_CONTROL)); 207 207 dev_info(sm->dev, "Misc Timing %08x\n", 208 - readl(regs + SM501_MISC_TIMING)); 208 + smc501_readl(regs + SM501_MISC_TIMING)); 209 209 } 210 210 211 211 static void sm501_dump_gate(struct sm501_devdata *sm) 212 212 { 213 213 dev_info(sm->dev, "CurrentGate %08x\n", 214 - readl(sm->regs + SM501_CURRENT_GATE)); 214 + smc501_readl(sm->regs + SM501_CURRENT_GATE)); 215 215 dev_info(sm->dev, "CurrentClock %08x\n", 216 - readl(sm->regs + SM501_CURRENT_CLOCK)); 216 + smc501_readl(sm->regs + SM501_CURRENT_CLOCK)); 217 217 dev_info(sm->dev, "PowerModeControl %08x\n", 218 - readl(sm->regs + SM501_POWER_MODE_CONTROL)); 218 + smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL)); 219 219 } 220 220 221 221 #else ··· 231 231 232 232 static void sm501_sync_regs(struct sm501_devdata *sm) 233 233 { 234 - readl(sm->regs); 234 + smc501_readl(sm->regs); 235 235 } 236 236 237 237 static inline void sm501_mdelay(struct sm501_devdata *sm, unsigned int delay) ··· 261 261 262 262 spin_lock_irqsave(&sm->reg_lock, save); 263 263 264 - misc = readl(sm->regs + SM501_MISC_CONTROL); 264 + misc = smc501_readl(sm->regs + SM501_MISC_CONTROL); 265 265 to = (misc & ~clear) | set; 266 266 267 267 if (to != misc) { 268 - writel(to, sm->regs + SM501_MISC_CONTROL); 268 + smc501_writel(to, sm->regs + SM501_MISC_CONTROL); 269 269 sm501_sync_regs(sm); 270 270 271 271 dev_dbg(sm->dev, "MISC_CONTROL %08lx\n", misc); ··· 294 294 295 295 spin_lock_irqsave(&sm->reg_lock, save); 296 296 297 - data = readl(sm->regs + reg); 297 + data = smc501_readl(sm->regs + reg); 298 298 data |= set; 299 299 data &= ~clear; 300 300 301 - writel(data, sm->regs + reg); 301 + smc501_writel(data, sm->regs + reg); 302 302 sm501_sync_regs(sm); 303 303 304 304 spin_unlock_irqrestore(&sm->reg_lock, save); ··· 322 322 323 323 mutex_lock(&sm->clock_lock); 324 324 325 - mode = readl(sm->regs + SM501_POWER_MODE_CONTROL); 326 - gate = readl(sm->regs + SM501_CURRENT_GATE); 327 - clock = readl(sm->regs + SM501_CURRENT_CLOCK); 325 + mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL); 326 + gate = smc501_readl(sm->regs + SM501_CURRENT_GATE); 327 + clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK); 328 328 329 329 mode &= 3; /* get current power mode */ 330 330 ··· 356 356 357 357 switch (mode) { 358 358 case 1: 359 - writel(gate, sm->regs + SM501_POWER_MODE_0_GATE); 360 - writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK); 359 + smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE); 360 + smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK); 361 361 mode = 0; 362 362 break; 363 363 case 2: 364 364 case 0: 365 - writel(gate, sm->regs + SM501_POWER_MODE_1_GATE); 366 - writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK); 365 + smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE); 366 + smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK); 367 367 mode = 1; 368 368 break; 369 369 ··· 372 372 goto already; 373 373 } 374 374 375 - writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); 375 + smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); 376 376 sm501_sync_regs(sm); 377 377 378 378 dev_dbg(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n", ··· 519 519 unsigned long req_freq) 520 520 { 521 521 struct sm501_devdata *sm = dev_get_drvdata(dev); 522 - unsigned long mode = readl(sm->regs + SM501_POWER_MODE_CONTROL); 523 - unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE); 524 - unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK); 522 + unsigned long mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL); 523 + unsigned long gate = smc501_readl(sm->regs + SM501_CURRENT_GATE); 524 + unsigned long clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK); 525 525 unsigned char reg; 526 526 unsigned int pll_reg = 0; 527 527 unsigned long sm501_freq; /* the actual frequency achieved */ ··· 592 592 593 593 mutex_lock(&sm->clock_lock); 594 594 595 - mode = readl(sm->regs + SM501_POWER_MODE_CONTROL); 596 - gate = readl(sm->regs + SM501_CURRENT_GATE); 597 - clock = readl(sm->regs + SM501_CURRENT_CLOCK); 595 + mode = smc501_readl(sm->regs + SM501_POWER_MODE_CONTROL); 596 + gate = smc501_readl(sm->regs + SM501_CURRENT_GATE); 597 + clock = smc501_readl(sm->regs + SM501_CURRENT_CLOCK); 598 598 599 599 clock = clock & ~(0xFF << clksrc); 600 600 clock |= reg<<clksrc; ··· 603 603 604 604 switch (mode) { 605 605 case 1: 606 - writel(gate, sm->regs + SM501_POWER_MODE_0_GATE); 607 - writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK); 606 + smc501_writel(gate, sm->regs + SM501_POWER_MODE_0_GATE); 607 + smc501_writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK); 608 608 mode = 0; 609 609 break; 610 610 case 2: 611 611 case 0: 612 - writel(gate, sm->regs + SM501_POWER_MODE_1_GATE); 613 - writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK); 612 + smc501_writel(gate, sm->regs + SM501_POWER_MODE_1_GATE); 613 + smc501_writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK); 614 614 mode = 1; 615 615 break; 616 616 ··· 619 619 return -1; 620 620 } 621 621 622 - writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); 622 + smc501_writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); 623 623 624 624 if (pll_reg) 625 - writel(pll_reg, sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL); 625 + smc501_writel(pll_reg, 626 + sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL); 626 627 627 628 sm501_sync_regs(sm); 628 629 ··· 903 902 struct sm501_gpio_chip *smgpio = to_sm501_gpio(chip); 904 903 unsigned long result; 905 904 906 - result = readl(smgpio->regbase + SM501_GPIO_DATA_LOW); 905 + result = smc501_readl(smgpio->regbase + SM501_GPIO_DATA_LOW); 907 906 result >>= offset; 908 907 909 908 return result & 1UL; ··· 916 915 917 916 /* check and modify if this pin is not set as gpio. */ 918 917 919 - if (readl(smchip->control) & bit) { 918 + if (smc501_readl(smchip->control) & bit) { 920 919 dev_info(sm501_gpio_to_dev(smchip->ourgpio)->dev, 921 920 "changing mode of gpio, bit %08lx\n", bit); 922 921 923 - ctrl = readl(smchip->control); 922 + ctrl = smc501_readl(smchip->control); 924 923 ctrl &= ~bit; 925 - writel(ctrl, smchip->control); 924 + smc501_writel(ctrl, smchip->control); 926 925 927 926 sm501_sync_regs(sm501_gpio_to_dev(smchip->ourgpio)); 928 927 } ··· 943 942 944 943 spin_lock_irqsave(&smgpio->lock, save); 945 944 946 - val = readl(regs + SM501_GPIO_DATA_LOW) & ~bit; 945 + val = smc501_readl(regs + SM501_GPIO_DATA_LOW) & ~bit; 947 946 if (value) 948 947 val |= bit; 949 - writel(val, regs); 948 + smc501_writel(val, regs); 950 949 951 950 sm501_sync_regs(sm501_gpio_to_dev(smgpio)); 952 951 sm501_gpio_ensure_gpio(smchip, bit); ··· 968 967 969 968 spin_lock_irqsave(&smgpio->lock, save); 970 969 971 - ddr = readl(regs + SM501_GPIO_DDR_LOW); 972 - writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW); 970 + ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW); 971 + smc501_writel(ddr & ~bit, regs + SM501_GPIO_DDR_LOW); 973 972 974 973 sm501_sync_regs(sm501_gpio_to_dev(smgpio)); 975 974 sm501_gpio_ensure_gpio(smchip, bit); ··· 995 994 996 995 spin_lock_irqsave(&smgpio->lock, save); 997 996 998 - val = readl(regs + SM501_GPIO_DATA_LOW); 997 + val = smc501_readl(regs + SM501_GPIO_DATA_LOW); 999 998 if (value) 1000 999 val |= bit; 1001 1000 else 1002 1001 val &= ~bit; 1003 - writel(val, regs); 1002 + smc501_writel(val, regs); 1004 1003 1005 - ddr = readl(regs + SM501_GPIO_DDR_LOW); 1006 - writel(ddr | bit, regs + SM501_GPIO_DDR_LOW); 1004 + ddr = smc501_readl(regs + SM501_GPIO_DDR_LOW); 1005 + smc501_writel(ddr | bit, regs + SM501_GPIO_DDR_LOW); 1007 1006 1008 1007 sm501_sync_regs(sm501_gpio_to_dev(smgpio)); 1009 - writel(val, regs + SM501_GPIO_DATA_LOW); 1008 + smc501_writel(val, regs + SM501_GPIO_DATA_LOW); 1010 1009 1011 1010 sm501_sync_regs(sm501_gpio_to_dev(smgpio)); 1012 1011 spin_unlock_irqrestore(&smgpio->lock, save); ··· 1232 1231 1233 1232 for (reg = 0x00; reg < 0x70; reg += 4) { 1234 1233 ret = sprintf(ptr, "%08x = %08x\n", 1235 - reg, readl(sm->regs + reg)); 1234 + reg, smc501_readl(sm->regs + reg)); 1236 1235 ptr += ret; 1237 1236 } 1238 1237 ··· 1256 1255 { 1257 1256 unsigned long tmp; 1258 1257 1259 - tmp = readl(sm->regs + reg); 1258 + tmp = smc501_readl(sm->regs + reg); 1260 1259 tmp &= ~r->mask; 1261 1260 tmp |= r->set; 1262 - writel(tmp, sm->regs + reg); 1261 + smc501_writel(tmp, sm->regs + reg); 1263 1262 } 1264 1263 1265 1264 /* sm501_init_regs ··· 1300 1299 1301 1300 static int sm501_check_clocks(struct sm501_devdata *sm) 1302 1301 { 1303 - unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK); 1302 + unsigned long pwrmode = smc501_readl(sm->regs + SM501_CURRENT_CLOCK); 1304 1303 unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC); 1305 1304 unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC); 1306 1305 ··· 1335 1334 1336 1335 INIT_LIST_HEAD(&sm->devices); 1337 1336 1338 - devid = readl(sm->regs + SM501_DEVICEID); 1337 + devid = smc501_readl(sm->regs + SM501_DEVICEID); 1339 1338 1340 1339 if ((devid & SM501_DEVICEID_IDMASK) != SM501_DEVICEID_SM501) { 1341 1340 dev_err(sm->dev, "incorrect device id %08lx\n", devid); ··· 1343 1342 } 1344 1343 1345 1344 /* disable irqs */ 1346 - writel(0, sm->regs + SM501_IRQ_MASK); 1345 + smc501_writel(0, sm->regs + SM501_IRQ_MASK); 1347 1346 1348 - dramctrl = readl(sm->regs + SM501_DRAM_CONTROL); 1347 + dramctrl = smc501_readl(sm->regs + SM501_DRAM_CONTROL); 1349 1348 mem_avail = sm501_mem_local[(dramctrl >> 13) & 0x7]; 1350 1349 1351 1350 dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n", ··· 1377 1376 sm501_register_gpio(sm); 1378 1377 } 1379 1378 1380 - if (pdata->gpio_i2c != NULL && pdata->gpio_i2c_nr > 0) { 1379 + if (pdata && pdata->gpio_i2c != NULL && pdata->gpio_i2c_nr > 0) { 1381 1380 if (!sm501_gpio_isregistered(sm)) 1382 1381 dev_err(sm->dev, "no gpio available for i2c gpio.\n"); 1383 1382 else ··· 1422 1421 1423 1422 sm->io_res = platform_get_resource(dev, IORESOURCE_MEM, 1); 1424 1423 sm->mem_res = platform_get_resource(dev, IORESOURCE_MEM, 0); 1424 + 1425 1425 if (sm->io_res == NULL || sm->mem_res == NULL) { 1426 1426 dev_err(&dev->dev, "failed to get IO resource\n"); 1427 1427 ret = -ENOENT; ··· 1491 1489 struct sm501_devdata *sm = platform_get_drvdata(pdev); 1492 1490 1493 1491 sm->in_suspend = 1; 1494 - sm->pm_misc = readl(sm->regs + SM501_MISC_CONTROL); 1492 + sm->pm_misc = smc501_readl(sm->regs + SM501_MISC_CONTROL); 1495 1493 1496 1494 sm501_dump_regs(sm); 1497 1495 ··· 1515 1513 1516 1514 /* check to see if we are in the same state as when suspended */ 1517 1515 1518 - if (readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) { 1516 + if (smc501_readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) { 1519 1517 dev_info(sm->dev, "SM501_MISC_CONTROL changed over sleep\n"); 1520 - writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL); 1518 + smc501_writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL); 1521 1519 1522 1520 /* our suspend causes the controller state to change, 1523 1521 * either by something attempting setup, power loss, ··· 1736 1734 1737 1735 MODULE_ALIAS("platform:sm501"); 1738 1736 1737 + static struct of_device_id __devinitdata of_sm501_match_tbl[] = { 1738 + { .compatible = "smi,sm501", }, 1739 + { /* end */ } 1740 + }; 1741 + 1739 1742 static struct platform_driver sm501_plat_driver = { 1740 1743 .driver = { 1741 1744 .name = "sm501", 1742 1745 .owner = THIS_MODULE, 1746 + .of_match_table = of_sm501_match_tbl, 1743 1747 }, 1744 1748 .probe = sm501_plat_probe, 1745 1749 .remove = sm501_plat_remove,
+96 -64
drivers/video/arkfb.c
··· 158 158 } 159 159 } 160 160 161 + static void arkfb_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor) 162 + { 163 + struct arkfb_info *par = info->par; 164 + 165 + svga_tilecursor(par->state.vgabase, info, cursor); 166 + } 167 + 161 168 static struct fb_tile_ops arkfb_tile_ops = { 162 169 .fb_settile = arkfb_settile, 163 170 .fb_tilecopy = svga_tilecopy, 164 171 .fb_tilefill = svga_tilefill, 165 172 .fb_tileblit = svga_tileblit, 166 - .fb_tilecursor = svga_tilecursor, 173 + .fb_tilecursor = arkfb_tilecursor, 167 174 .fb_get_tilemax = svga_get_tilemax, 168 175 }; 169 176 ··· 473 466 474 467 static void ark_dac_read_regs(void *data, u8 *code, int count) 475 468 { 476 - u8 regval = vga_rseq(NULL, 0x1C); 469 + struct fb_info *info = data; 470 + struct arkfb_info *par; 471 + u8 regval; 477 472 473 + par = info->par; 474 + regval = vga_rseq(par->state.vgabase, 0x1C); 478 475 while (count != 0) 479 476 { 480 - vga_wseq(NULL, 0x1C, regval | (code[0] & 4 ? 0x80 : 0)); 481 - code[1] = vga_r(NULL, dac_regs[code[0] & 3]); 477 + vga_wseq(par->state.vgabase, 0x1C, regval | (code[0] & 4 ? 0x80 : 0)); 478 + code[1] = vga_r(par->state.vgabase, dac_regs[code[0] & 3]); 482 479 count--; 483 480 code += 2; 484 481 } 485 482 486 - vga_wseq(NULL, 0x1C, regval); 483 + vga_wseq(par->state.vgabase, 0x1C, regval); 487 484 } 488 485 489 486 static void ark_dac_write_regs(void *data, u8 *code, int count) 490 487 { 491 - u8 regval = vga_rseq(NULL, 0x1C); 488 + struct fb_info *info = data; 489 + struct arkfb_info *par; 490 + u8 regval; 492 491 492 + par = info->par; 493 + regval = vga_rseq(par->state.vgabase, 0x1C); 493 494 while (count != 0) 494 495 { 495 - vga_wseq(NULL, 0x1C, regval | (code[0] & 4 ? 0x80 : 0)); 496 - vga_w(NULL, dac_regs[code[0] & 3], code[1]); 496 + vga_wseq(par->state.vgabase, 0x1C, regval | (code[0] & 4 ? 0x80 : 0)); 497 + vga_w(par->state.vgabase, dac_regs[code[0] & 3], code[1]); 497 498 count--; 498 499 code += 2; 499 500 } 500 501 501 - vga_wseq(NULL, 0x1C, regval); 502 + vga_wseq(par->state.vgabase, 0x1C, regval); 502 503 } 503 504 504 505 ··· 522 507 } 523 508 524 509 /* Set VGA misc register */ 525 - regval = vga_r(NULL, VGA_MIS_R); 526 - vga_w(NULL, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 510 + regval = vga_r(par->state.vgabase, VGA_MIS_R); 511 + vga_w(par->state.vgabase, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 527 512 } 528 513 529 514 ··· 535 520 536 521 mutex_lock(&(par->open_lock)); 537 522 if (par->ref_count == 0) { 523 + void __iomem *vgabase = par->state.vgabase; 524 + 538 525 memset(&(par->state), 0, sizeof(struct vgastate)); 526 + par->state.vgabase = vgabase; 539 527 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP; 540 528 par->state.num_crtc = 0x60; 541 529 par->state.num_seq = 0x30; ··· 664 646 info->var.activate = FB_ACTIVATE_NOW; 665 647 666 648 /* Unlock registers */ 667 - svga_wcrt_mask(0x11, 0x00, 0x80); 649 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x00, 0x80); 668 650 669 651 /* Blank screen and turn off sync */ 670 - svga_wseq_mask(0x01, 0x20, 0x20); 671 - svga_wcrt_mask(0x17, 0x00, 0x80); 652 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 653 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x00, 0x80); 672 654 673 655 /* Set default values */ 674 - svga_set_default_gfx_regs(); 675 - svga_set_default_atc_regs(); 676 - svga_set_default_seq_regs(); 677 - svga_set_default_crt_regs(); 678 - svga_wcrt_multi(ark_line_compare_regs, 0xFFFFFFFF); 679 - svga_wcrt_multi(ark_start_address_regs, 0); 656 + svga_set_default_gfx_regs(par->state.vgabase); 657 + svga_set_default_atc_regs(par->state.vgabase); 658 + svga_set_default_seq_regs(par->state.vgabase); 659 + svga_set_default_crt_regs(par->state.vgabase); 660 + svga_wcrt_multi(par->state.vgabase, ark_line_compare_regs, 0xFFFFFFFF); 661 + svga_wcrt_multi(par->state.vgabase, ark_start_address_regs, 0); 680 662 681 663 /* ARK specific initialization */ 682 - svga_wseq_mask(0x10, 0x1F, 0x1F); /* enable linear framebuffer and full memory access */ 683 - svga_wseq_mask(0x12, 0x03, 0x03); /* 4 MB linear framebuffer size */ 664 + svga_wseq_mask(par->state.vgabase, 0x10, 0x1F, 0x1F); /* enable linear framebuffer and full memory access */ 665 + svga_wseq_mask(par->state.vgabase, 0x12, 0x03, 0x03); /* 4 MB linear framebuffer size */ 684 666 685 - vga_wseq(NULL, 0x13, info->fix.smem_start >> 16); 686 - vga_wseq(NULL, 0x14, info->fix.smem_start >> 24); 687 - vga_wseq(NULL, 0x15, 0); 688 - vga_wseq(NULL, 0x16, 0); 667 + vga_wseq(par->state.vgabase, 0x13, info->fix.smem_start >> 16); 668 + vga_wseq(par->state.vgabase, 0x14, info->fix.smem_start >> 24); 669 + vga_wseq(par->state.vgabase, 0x15, 0); 670 + vga_wseq(par->state.vgabase, 0x16, 0); 689 671 690 672 /* Set the FIFO threshold register */ 691 673 /* It is fascinating way to store 5-bit value in 8-bit register */ 692 674 regval = 0x10 | ((threshold & 0x0E) >> 1) | (threshold & 0x01) << 7 | (threshold & 0x10) << 1; 693 - vga_wseq(NULL, 0x18, regval); 675 + vga_wseq(par->state.vgabase, 0x18, regval); 694 676 695 677 /* Set the offset register */ 696 678 pr_debug("fb%d: offset register : %d\n", info->node, offset_value); 697 - svga_wcrt_multi(ark_offset_regs, offset_value); 679 + svga_wcrt_multi(par->state.vgabase, ark_offset_regs, offset_value); 698 680 699 681 /* fix for hi-res textmode */ 700 - svga_wcrt_mask(0x40, 0x08, 0x08); 682 + svga_wcrt_mask(par->state.vgabase, 0x40, 0x08, 0x08); 701 683 702 684 if (info->var.vmode & FB_VMODE_DOUBLE) 703 - svga_wcrt_mask(0x09, 0x80, 0x80); 685 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x80, 0x80); 704 686 else 705 - svga_wcrt_mask(0x09, 0x00, 0x80); 687 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x00, 0x80); 706 688 707 689 if (info->var.vmode & FB_VMODE_INTERLACED) 708 - svga_wcrt_mask(0x44, 0x04, 0x04); 690 + svga_wcrt_mask(par->state.vgabase, 0x44, 0x04, 0x04); 709 691 else 710 - svga_wcrt_mask(0x44, 0x00, 0x04); 692 + svga_wcrt_mask(par->state.vgabase, 0x44, 0x00, 0x04); 711 693 712 694 hmul = 1; 713 695 hdiv = 1; ··· 717 699 switch (mode) { 718 700 case 0: 719 701 pr_debug("fb%d: text mode\n", info->node); 720 - svga_set_textmode_vga_regs(); 702 + svga_set_textmode_vga_regs(par->state.vgabase); 721 703 722 - vga_wseq(NULL, 0x11, 0x10); /* basic VGA mode */ 723 - svga_wcrt_mask(0x46, 0x00, 0x04); /* 8bit pixel path */ 704 + vga_wseq(par->state.vgabase, 0x11, 0x10); /* basic VGA mode */ 705 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x00, 0x04); /* 8bit pixel path */ 724 706 dac_set_mode(par->dac, DAC_PSEUDO8_8); 725 707 726 708 break; 727 709 case 1: 728 710 pr_debug("fb%d: 4 bit pseudocolor\n", info->node); 729 - vga_wgfx(NULL, VGA_GFX_MODE, 0x40); 711 + vga_wgfx(par->state.vgabase, VGA_GFX_MODE, 0x40); 730 712 731 - vga_wseq(NULL, 0x11, 0x10); /* basic VGA mode */ 732 - svga_wcrt_mask(0x46, 0x00, 0x04); /* 8bit pixel path */ 713 + vga_wseq(par->state.vgabase, 0x11, 0x10); /* basic VGA mode */ 714 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x00, 0x04); /* 8bit pixel path */ 733 715 dac_set_mode(par->dac, DAC_PSEUDO8_8); 734 716 break; 735 717 case 2: 736 718 pr_debug("fb%d: 4 bit pseudocolor, planar\n", info->node); 737 719 738 - vga_wseq(NULL, 0x11, 0x10); /* basic VGA mode */ 739 - svga_wcrt_mask(0x46, 0x00, 0x04); /* 8bit pixel path */ 720 + vga_wseq(par->state.vgabase, 0x11, 0x10); /* basic VGA mode */ 721 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x00, 0x04); /* 8bit pixel path */ 740 722 dac_set_mode(par->dac, DAC_PSEUDO8_8); 741 723 break; 742 724 case 3: 743 725 pr_debug("fb%d: 8 bit pseudocolor\n", info->node); 744 726 745 - vga_wseq(NULL, 0x11, 0x16); /* 8bpp accel mode */ 727 + vga_wseq(par->state.vgabase, 0x11, 0x16); /* 8bpp accel mode */ 746 728 747 729 if (info->var.pixclock > 20000) { 748 730 pr_debug("fb%d: not using multiplex\n", info->node); 749 - svga_wcrt_mask(0x46, 0x00, 0x04); /* 8bit pixel path */ 731 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x00, 0x04); /* 8bit pixel path */ 750 732 dac_set_mode(par->dac, DAC_PSEUDO8_8); 751 733 } else { 752 734 pr_debug("fb%d: using multiplex\n", info->node); 753 - svga_wcrt_mask(0x46, 0x04, 0x04); /* 16bit pixel path */ 735 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x04, 0x04); /* 16bit pixel path */ 754 736 dac_set_mode(par->dac, DAC_PSEUDO8_16); 755 737 hdiv = 2; 756 738 } ··· 758 740 case 4: 759 741 pr_debug("fb%d: 5/5/5 truecolor\n", info->node); 760 742 761 - vga_wseq(NULL, 0x11, 0x1A); /* 16bpp accel mode */ 762 - svga_wcrt_mask(0x46, 0x04, 0x04); /* 16bit pixel path */ 743 + vga_wseq(par->state.vgabase, 0x11, 0x1A); /* 16bpp accel mode */ 744 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x04, 0x04); /* 16bit pixel path */ 763 745 dac_set_mode(par->dac, DAC_RGB1555_16); 764 746 break; 765 747 case 5: 766 748 pr_debug("fb%d: 5/6/5 truecolor\n", info->node); 767 749 768 - vga_wseq(NULL, 0x11, 0x1A); /* 16bpp accel mode */ 769 - svga_wcrt_mask(0x46, 0x04, 0x04); /* 16bit pixel path */ 750 + vga_wseq(par->state.vgabase, 0x11, 0x1A); /* 16bpp accel mode */ 751 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x04, 0x04); /* 16bit pixel path */ 770 752 dac_set_mode(par->dac, DAC_RGB0565_16); 771 753 break; 772 754 case 6: 773 755 pr_debug("fb%d: 8/8/8 truecolor\n", info->node); 774 756 775 - vga_wseq(NULL, 0x11, 0x16); /* 8bpp accel mode ??? */ 776 - svga_wcrt_mask(0x46, 0x04, 0x04); /* 16bit pixel path */ 757 + vga_wseq(par->state.vgabase, 0x11, 0x16); /* 8bpp accel mode ??? */ 758 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x04, 0x04); /* 16bit pixel path */ 777 759 dac_set_mode(par->dac, DAC_RGB0888_16); 778 760 hmul = 3; 779 761 hdiv = 2; ··· 781 763 case 7: 782 764 pr_debug("fb%d: 8/8/8/8 truecolor\n", info->node); 783 765 784 - vga_wseq(NULL, 0x11, 0x1E); /* 32bpp accel mode */ 785 - svga_wcrt_mask(0x46, 0x04, 0x04); /* 16bit pixel path */ 766 + vga_wseq(par->state.vgabase, 0x11, 0x1E); /* 32bpp accel mode */ 767 + svga_wcrt_mask(par->state.vgabase, 0x46, 0x04, 0x04); /* 16bit pixel path */ 786 768 dac_set_mode(par->dac, DAC_RGB8888_16); 787 769 hmul = 2; 788 770 break; ··· 792 774 } 793 775 794 776 ark_set_pixclock(info, (hdiv * info->var.pixclock) / hmul); 795 - svga_set_timings(&ark_timing_regs, &(info->var), hmul, hdiv, 777 + svga_set_timings(par->state.vgabase, &ark_timing_regs, &(info->var), hmul, hdiv, 796 778 (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 797 779 (info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1, 798 780 hmul, info->node); ··· 800 782 /* Set interlaced mode start/end register */ 801 783 value = info->var.xres + info->var.left_margin + info->var.right_margin + info->var.hsync_len; 802 784 value = ((value * hmul / hdiv) / 8) - 5; 803 - vga_wcrt(NULL, 0x42, (value + 1) / 2); 785 + vga_wcrt(par->state.vgabase, 0x42, (value + 1) / 2); 804 786 805 787 memset_io(info->screen_base, 0x00, screen_size); 806 788 /* Device and screen back on */ 807 - svga_wcrt_mask(0x17, 0x80, 0x80); 808 - svga_wseq_mask(0x01, 0x00, 0x20); 789 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); 790 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 809 791 810 792 return 0; 811 793 } ··· 875 857 876 858 static int arkfb_blank(int blank_mode, struct fb_info *info) 877 859 { 860 + struct arkfb_info *par = info->par; 861 + 878 862 switch (blank_mode) { 879 863 case FB_BLANK_UNBLANK: 880 864 pr_debug("fb%d: unblank\n", info->node); 881 - svga_wseq_mask(0x01, 0x00, 0x20); 882 - svga_wcrt_mask(0x17, 0x80, 0x80); 865 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 866 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); 883 867 break; 884 868 case FB_BLANK_NORMAL: 885 869 pr_debug("fb%d: blank\n", info->node); 886 - svga_wseq_mask(0x01, 0x20, 0x20); 887 - svga_wcrt_mask(0x17, 0x80, 0x80); 870 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 871 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); 888 872 break; 889 873 case FB_BLANK_POWERDOWN: 890 874 case FB_BLANK_HSYNC_SUSPEND: 891 875 case FB_BLANK_VSYNC_SUSPEND: 892 876 pr_debug("fb%d: sync down\n", info->node); 893 - svga_wseq_mask(0x01, 0x20, 0x20); 894 - svga_wcrt_mask(0x17, 0x00, 0x80); 877 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 878 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x00, 0x80); 895 879 break; 896 880 } 897 881 return 0; ··· 904 884 905 885 static int arkfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) 906 886 { 887 + struct arkfb_info *par = info->par; 907 888 unsigned int offset; 908 889 909 890 /* Calculate the offset */ ··· 918 897 } 919 898 920 899 /* Set the offset */ 921 - svga_wcrt_multi(ark_start_address_regs, offset); 900 + svga_wcrt_multi(par->state.vgabase, ark_start_address_regs, offset); 922 901 923 902 return 0; 924 903 } ··· 951 930 /* PCI probe */ 952 931 static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) 953 932 { 933 + struct pci_bus_region bus_reg; 934 + struct resource vga_res; 954 935 struct fb_info *info; 955 936 struct arkfb_info *par; 956 937 int rc; ··· 1008 985 goto err_iomap; 1009 986 } 1010 987 988 + bus_reg.start = 0; 989 + bus_reg.end = 64 * 1024; 990 + 991 + vga_res.flags = IORESOURCE_IO; 992 + 993 + pcibios_bus_to_resource(dev, &vga_res, &bus_reg); 994 + 995 + par->state.vgabase = (void __iomem *) vga_res.start; 996 + 1011 997 /* FIXME get memsize */ 1012 - regval = vga_rseq(NULL, 0x10); 998 + regval = vga_rseq(par->state.vgabase, 0x10); 1013 999 info->screen_size = (1 << (regval >> 6)) << 20; 1014 1000 info->fix.smem_len = info->screen_size; 1015 1001
+30 -1
drivers/video/atmel_lcdfb.c
··· 68 68 } 69 69 #endif 70 70 71 - static const u32 contrast_ctr = ATMEL_LCDC_PS_DIV8 71 + static u32 contrast_ctr = ATMEL_LCDC_PS_DIV8 72 72 | ATMEL_LCDC_POL_POSITIVE 73 73 | ATMEL_LCDC_ENA_PWMENABLE; 74 74 ··· 164 164 165 165 static void init_contrast(struct atmel_lcdfb_info *sinfo) 166 166 { 167 + /* contrast pwm can be 'inverted' */ 168 + if (sinfo->lcdcon_pol_negative) 169 + contrast_ctr &= ~(ATMEL_LCDC_POL_POSITIVE); 170 + 167 171 /* have some default contrast/backlight settings */ 168 172 lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); 169 173 lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); ··· 715 711 return 0; 716 712 } 717 713 714 + static int atmel_lcdfb_blank(int blank_mode, struct fb_info *info) 715 + { 716 + struct atmel_lcdfb_info *sinfo = info->par; 717 + 718 + switch (blank_mode) { 719 + case FB_BLANK_UNBLANK: 720 + case FB_BLANK_NORMAL: 721 + atmel_lcdfb_start(sinfo); 722 + break; 723 + case FB_BLANK_VSYNC_SUSPEND: 724 + case FB_BLANK_HSYNC_SUSPEND: 725 + break; 726 + case FB_BLANK_POWERDOWN: 727 + atmel_lcdfb_stop(sinfo); 728 + break; 729 + default: 730 + return -EINVAL; 731 + } 732 + 733 + /* let fbcon do a soft blank for us */ 734 + return ((blank_mode == FB_BLANK_NORMAL) ? 1 : 0); 735 + } 736 + 718 737 static struct fb_ops atmel_lcdfb_ops = { 719 738 .owner = THIS_MODULE, 720 739 .fb_check_var = atmel_lcdfb_check_var, 721 740 .fb_set_par = atmel_lcdfb_set_par, 722 741 .fb_setcolreg = atmel_lcdfb_setcolreg, 742 + .fb_blank = atmel_lcdfb_blank, 723 743 .fb_pan_display = atmel_lcdfb_pan_display, 724 744 .fb_fillrect = cfb_fillrect, 725 745 .fb_copyarea = cfb_copyarea, ··· 845 817 sinfo->guard_time = pdata_sinfo->guard_time; 846 818 sinfo->smem_len = pdata_sinfo->smem_len; 847 819 sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; 820 + sinfo->lcdcon_pol_negative = pdata_sinfo->lcdcon_pol_negative; 848 821 sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; 849 822 } else { 850 823 dev_err(dev, "cannot get default configuration\n");
+1 -1
drivers/video/aty/radeon_base.c
··· 1248 1248 1249 1249 /* Workaround from XFree */ 1250 1250 if (rinfo->is_mobility) { 1251 - /* A temporal workaround for the occational blanking on certain laptop 1251 + /* A temporal workaround for the occasional blanking on certain laptop 1252 1252 * panels. This appears to related to the PLL divider registers 1253 1253 * (fail to lock?). It occurs even when all dividers are the same 1254 1254 * with their old settings. In this case we really don't need to
+3
drivers/video/aty/radeon_i2c.c
··· 100 100 { 101 101 rinfo->i2c[0].rinfo = rinfo; 102 102 rinfo->i2c[0].ddc_reg = GPIO_MONID; 103 + #ifndef CONFIG_PPC 104 + rinfo->i2c[0].adapter.class = I2C_CLASS_HWMON; 105 + #endif 103 106 radeon_setup_i2c_bus(&rinfo->i2c[0], "monid"); 104 107 105 108 rinfo->i2c[1].rinfo = rinfo;
+1
drivers/video/cg14.c
··· 565 565 566 566 out_unmap_regs: 567 567 cg14_unmap_regs(op, info, par); 568 + framebuffer_release(info); 568 569 569 570 out_err: 570 571 return err;
+1
drivers/video/cg6.c
··· 821 821 822 822 out_unmap_regs: 823 823 cg6_unmap_regs(op, info, par); 824 + framebuffer_release(info); 824 825 825 826 out_err: 826 827 return err;
+2 -2
drivers/video/console/fbcon.c
··· 823 823 if (oldidx == newidx) 824 824 return 0; 825 825 826 - if (!info || fbcon_has_exited) 826 + if (!info) 827 827 return -EINVAL; 828 828 829 - if (!err && !search_for_mapped_con()) { 829 + if (!search_for_mapped_con() || !con_is_bound(&fb_con)) { 830 830 info_idx = newidx; 831 831 return fbcon_takeover(0); 832 832 }
+1 -1
drivers/video/console/tileblit.c
··· 83 83 int softback_lines, int fg, int bg) 84 84 { 85 85 struct fb_tilecursor cursor; 86 - int use_sw = (vc->vc_cursor_type & 0x01); 86 + int use_sw = (vc->vc_cursor_type & 0x10); 87 87 88 88 cursor.sx = vc->vc_x; 89 89 cursor.sy = vc->vc_y;
+2 -2
drivers/video/edid.h
··· 101 101 #define V_SYNC_WIDTH COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO ) 102 102 #define V_SYNC_OFFSET COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO ) 103 103 104 - #define H_SYNC_WIDTH COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO ) 105 - #define H_SYNC_OFFSET COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO ) 104 + #define H_SYNC_WIDTH COMBINE_HI_8LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO ) 105 + #define H_SYNC_OFFSET COMBINE_HI_8LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO ) 106 106 107 107 #define H_SIZE_LO (unsigned)block[ 12 ] 108 108 #define V_SIZE_LO (unsigned)block[ 13 ]
+1 -1
drivers/video/ffb.c
··· 1010 1010 fb_dealloc_cmap(&info->cmap); 1011 1011 1012 1012 out_unmap_dac: 1013 - of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc)); 1013 + of_iounmap(&op->resource[1], par->dac, sizeof(struct ffb_dac)); 1014 1014 1015 1015 out_unmap_fbc: 1016 1016 of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
+1 -1
drivers/video/hecubafb.c
··· 299 299 300 300 static struct platform_driver hecubafb_driver = { 301 301 .probe = hecubafb_probe, 302 - .remove = hecubafb_remove, 302 + .remove = __devexit_p(hecubafb_remove), 303 303 .driver = { 304 304 .owner = THIS_MODULE, 305 305 .name = "hecubafb",
+3 -3
drivers/video/hpfb.c
··· 321 321 unsigned long paddr, vaddr; 322 322 323 323 paddr = d->resource.start; 324 - if (!request_mem_region(d->resource.start, d->resource.end - d->resource.start, d->name)) 324 + if (!request_mem_region(d->resource.start, resource_size(&d->resource), d->name)) 325 325 return -EBUSY; 326 326 327 327 if (d->scode >= DIOII_SCBASE) { 328 - vaddr = (unsigned long)ioremap(paddr, d->resource.end - d->resource.start); 328 + vaddr = (unsigned long)ioremap(paddr, resource_size(&d->resource)); 329 329 } else { 330 330 vaddr = paddr + DIO_VIRADDRBASE; 331 331 } ··· 344 344 unregister_framebuffer(&fb_info); 345 345 if (d->scode >= DIOII_SCBASE) 346 346 iounmap((void *)fb_regs); 347 - release_mem_region(d->resource.start, d->resource.end - d->resource.start); 347 + release_mem_region(d->resource.start, resource_size(&d->resource)); 348 348 } 349 349 350 350 static struct dio_device_id hpfb_dio_tbl[] = {
+1 -1
drivers/video/metronomefb.c
··· 765 765 766 766 static struct platform_driver metronomefb_driver = { 767 767 .probe = metronomefb_probe, 768 - .remove = metronomefb_remove, 768 + .remove = __devexit_p(metronomefb_remove), 769 769 .driver = { 770 770 .owner = THIS_MODULE, 771 771 .name = "metronomefb",
+6 -1
drivers/video/omap/Kconfig
··· 5 5 select FB_CFB_FILLRECT 6 6 select FB_CFB_COPYAREA 7 7 select FB_CFB_IMAGEBLIT 8 + select TWL4030_CORE if MACH_OMAP_2430SDP 8 9 help 9 10 Frame buffer driver for OMAP based boards. 10 11 11 12 config FB_OMAP_LCD_VGA 12 13 bool "Use LCD in VGA mode" 13 14 depends on MACH_OMAP_3430SDP || MACH_OMAP_LDP 14 - 15 + help 16 + Set LCD resolution as VGA (640 X 480). 17 + Default resolution without this option is QVGA(320 X 240). 18 + Please take a look at drivers/video/omap/lcd_ldp.c file 19 + for lcd driver code. 15 20 choice 16 21 depends on FB_OMAP && MACH_OVERO 17 22 prompt "Screen resolution"
+1 -2
drivers/video/omap/blizzard.c
··· 397 397 398 398 spin_lock_irqsave(&blizzard.req_lock, flags); 399 399 400 - list_del(&req->entry); 401 - list_add(&req->entry, &blizzard.free_req_list); 400 + list_move(&req->entry, &blizzard.free_req_list); 402 401 if (!(req->flags & REQ_FROM_IRQ_POOL)) 403 402 up(&blizzard.req_sema); 404 403
+1 -2
drivers/video/omap/hwa742.c
··· 269 269 270 270 spin_lock_irqsave(&hwa742.req_lock, flags); 271 271 272 - list_del(&req->entry); 273 - list_add(&req->entry, &hwa742.free_req_list); 272 + list_move(&req->entry, &hwa742.free_req_list); 274 273 if (!(req->flags & REQ_FROM_IRQ_POOL)) 275 274 up(&hwa742.req_sema); 276 275
+6
drivers/video/omap2/displays/Kconfig
··· 9 9 Supports LCD Panel used in TI SDP3430 and EVM boards, 10 10 OMAP3517 EVM boards and CM-T35. 11 11 12 + config PANEL_LGPHILIPS_LB035Q02 13 + tristate "LG.Philips LB035Q02 LCD Panel" 14 + depends on OMAP2_DSS && SPI 15 + help 16 + LCD Panel used on the Gumstix Overo Palo35 17 + 12 18 config PANEL_SHARP_LS037V7DW01 13 19 tristate "Sharp LS037V7DW01 LCD Panel" 14 20 depends on OMAP2_DSS
+1
drivers/video/omap2/displays/Makefile
··· 1 1 obj-$(CONFIG_PANEL_GENERIC_DPI) += panel-generic-dpi.o 2 + obj-$(CONFIG_PANEL_LGPHILIPS_LB035Q02) += panel-lgphilips-lb035q02.o 2 3 obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o 3 4 obj-$(CONFIG_PANEL_NEC_NL8048HL11_01B) += panel-nec-nl8048hl11-01b.o 4 5
+25
drivers/video/omap2/displays/panel-generic-dpi.c
··· 156 156 .power_off_delay = 0, 157 157 .name = "toppoly_tdo35s", 158 158 }, 159 + 160 + /* Samsung LTE430WQ-F0C */ 161 + { 162 + { 163 + .x_res = 480, 164 + .y_res = 272, 165 + 166 + .pixel_clock = 9200, 167 + 168 + .hfp = 8, 169 + .hsw = 41, 170 + .hbp = 45 - 41, 171 + 172 + .vfp = 4, 173 + .vsw = 10, 174 + .vbp = 12 - 10, 175 + }, 176 + .acbi = 0x0, 177 + .acb = 0x0, 178 + .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | 179 + OMAP_DSS_LCD_IHS, 180 + .power_on_delay = 0, 181 + .power_off_delay = 0, 182 + .name = "samsung_lte430wq_f0c", 183 + }, 159 184 }; 160 185 161 186 struct panel_drv_data {
+279
drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
··· 1 + /* 2 + * LCD panel driver for LG.Philips LB035Q02 3 + * 4 + * Author: Steve Sakoman <steve@sakoman.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License version 2 as published by 8 + * the Free Software Foundation. 9 + * 10 + * This program is distributed in the hope that it will be useful, but WITHOUT 11 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 + * more details. 14 + * 15 + * You should have received a copy of the GNU General Public License along with 16 + * this program. If not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + #include <linux/module.h> 20 + #include <linux/delay.h> 21 + #include <linux/spi/spi.h> 22 + #include <linux/mutex.h> 23 + 24 + #include <plat/display.h> 25 + 26 + struct lb035q02_data { 27 + struct mutex lock; 28 + }; 29 + 30 + static struct omap_video_timings lb035q02_timings = { 31 + .x_res = 320, 32 + .y_res = 240, 33 + 34 + .pixel_clock = 6500, 35 + 36 + .hsw = 2, 37 + .hfp = 20, 38 + .hbp = 68, 39 + 40 + .vsw = 2, 41 + .vfp = 4, 42 + .vbp = 18, 43 + }; 44 + 45 + static int lb035q02_panel_power_on(struct omap_dss_device *dssdev) 46 + { 47 + int r; 48 + 49 + if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) 50 + return 0; 51 + 52 + r = omapdss_dpi_display_enable(dssdev); 53 + if (r) 54 + goto err0; 55 + 56 + if (dssdev->platform_enable) { 57 + r = dssdev->platform_enable(dssdev); 58 + if (r) 59 + goto err1; 60 + } 61 + 62 + return 0; 63 + err1: 64 + omapdss_dpi_display_disable(dssdev); 65 + err0: 66 + return r; 67 + } 68 + 69 + static void lb035q02_panel_power_off(struct omap_dss_device *dssdev) 70 + { 71 + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 72 + return; 73 + 74 + if (dssdev->platform_disable) 75 + dssdev->platform_disable(dssdev); 76 + 77 + omapdss_dpi_display_disable(dssdev); 78 + } 79 + 80 + static int lb035q02_panel_probe(struct omap_dss_device *dssdev) 81 + { 82 + struct lb035q02_data *ld; 83 + int r; 84 + 85 + dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | 86 + OMAP_DSS_LCD_IHS; 87 + dssdev->panel.timings = lb035q02_timings; 88 + 89 + ld = kzalloc(sizeof(*ld), GFP_KERNEL); 90 + if (!ld) { 91 + r = -ENOMEM; 92 + goto err; 93 + } 94 + mutex_init(&ld->lock); 95 + dev_set_drvdata(&dssdev->dev, ld); 96 + return 0; 97 + err: 98 + return r; 99 + } 100 + 101 + static void lb035q02_panel_remove(struct omap_dss_device *dssdev) 102 + { 103 + struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev); 104 + 105 + kfree(ld); 106 + } 107 + 108 + static int lb035q02_panel_enable(struct omap_dss_device *dssdev) 109 + { 110 + struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev); 111 + int r; 112 + 113 + mutex_lock(&ld->lock); 114 + 115 + r = lb035q02_panel_power_on(dssdev); 116 + if (r) 117 + goto err; 118 + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 119 + 120 + mutex_unlock(&ld->lock); 121 + return 0; 122 + err: 123 + mutex_unlock(&ld->lock); 124 + return r; 125 + } 126 + 127 + static void lb035q02_panel_disable(struct omap_dss_device *dssdev) 128 + { 129 + struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev); 130 + 131 + mutex_lock(&ld->lock); 132 + 133 + lb035q02_panel_power_off(dssdev); 134 + dssdev->state = OMAP_DSS_DISPLAY_DISABLED; 135 + 136 + mutex_unlock(&ld->lock); 137 + } 138 + 139 + static int lb035q02_panel_suspend(struct omap_dss_device *dssdev) 140 + { 141 + struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev); 142 + 143 + mutex_lock(&ld->lock); 144 + 145 + lb035q02_panel_power_off(dssdev); 146 + dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; 147 + 148 + mutex_unlock(&ld->lock); 149 + return 0; 150 + } 151 + 152 + static int lb035q02_panel_resume(struct omap_dss_device *dssdev) 153 + { 154 + struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev); 155 + int r; 156 + 157 + mutex_lock(&ld->lock); 158 + 159 + r = lb035q02_panel_power_on(dssdev); 160 + if (r) 161 + goto err; 162 + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 163 + 164 + mutex_unlock(&ld->lock); 165 + return 0; 166 + err: 167 + mutex_unlock(&ld->lock); 168 + return r; 169 + } 170 + 171 + static struct omap_dss_driver lb035q02_driver = { 172 + .probe = lb035q02_panel_probe, 173 + .remove = lb035q02_panel_remove, 174 + 175 + .enable = lb035q02_panel_enable, 176 + .disable = lb035q02_panel_disable, 177 + .suspend = lb035q02_panel_suspend, 178 + .resume = lb035q02_panel_resume, 179 + 180 + .driver = { 181 + .name = "lgphilips_lb035q02_panel", 182 + .owner = THIS_MODULE, 183 + }, 184 + }; 185 + 186 + static int lb035q02_write_reg(struct spi_device *spi, u8 reg, u16 val) 187 + { 188 + struct spi_message msg; 189 + struct spi_transfer index_xfer = { 190 + .len = 3, 191 + .cs_change = 1, 192 + }; 193 + struct spi_transfer value_xfer = { 194 + .len = 3, 195 + }; 196 + u8 buffer[16]; 197 + 198 + spi_message_init(&msg); 199 + 200 + /* register index */ 201 + buffer[0] = 0x70; 202 + buffer[1] = 0x00; 203 + buffer[2] = reg & 0x7f; 204 + index_xfer.tx_buf = buffer; 205 + spi_message_add_tail(&index_xfer, &msg); 206 + 207 + /* register value */ 208 + buffer[4] = 0x72; 209 + buffer[5] = val >> 8; 210 + buffer[6] = val; 211 + value_xfer.tx_buf = buffer + 4; 212 + spi_message_add_tail(&value_xfer, &msg); 213 + 214 + return spi_sync(spi, &msg); 215 + } 216 + 217 + static void init_lb035q02_panel(struct spi_device *spi) 218 + { 219 + /* Init sequence from page 28 of the lb035q02 spec */ 220 + lb035q02_write_reg(spi, 0x01, 0x6300); 221 + lb035q02_write_reg(spi, 0x02, 0x0200); 222 + lb035q02_write_reg(spi, 0x03, 0x0177); 223 + lb035q02_write_reg(spi, 0x04, 0x04c7); 224 + lb035q02_write_reg(spi, 0x05, 0xffc0); 225 + lb035q02_write_reg(spi, 0x06, 0xe806); 226 + lb035q02_write_reg(spi, 0x0a, 0x4008); 227 + lb035q02_write_reg(spi, 0x0b, 0x0000); 228 + lb035q02_write_reg(spi, 0x0d, 0x0030); 229 + lb035q02_write_reg(spi, 0x0e, 0x2800); 230 + lb035q02_write_reg(spi, 0x0f, 0x0000); 231 + lb035q02_write_reg(spi, 0x16, 0x9f80); 232 + lb035q02_write_reg(spi, 0x17, 0x0a0f); 233 + lb035q02_write_reg(spi, 0x1e, 0x00c1); 234 + lb035q02_write_reg(spi, 0x30, 0x0300); 235 + lb035q02_write_reg(spi, 0x31, 0x0007); 236 + lb035q02_write_reg(spi, 0x32, 0x0000); 237 + lb035q02_write_reg(spi, 0x33, 0x0000); 238 + lb035q02_write_reg(spi, 0x34, 0x0707); 239 + lb035q02_write_reg(spi, 0x35, 0x0004); 240 + lb035q02_write_reg(spi, 0x36, 0x0302); 241 + lb035q02_write_reg(spi, 0x37, 0x0202); 242 + lb035q02_write_reg(spi, 0x3a, 0x0a0d); 243 + lb035q02_write_reg(spi, 0x3b, 0x0806); 244 + } 245 + 246 + static int __devinit lb035q02_panel_spi_probe(struct spi_device *spi) 247 + { 248 + init_lb035q02_panel(spi); 249 + return omap_dss_register_driver(&lb035q02_driver); 250 + } 251 + 252 + static int __devexit lb035q02_panel_spi_remove(struct spi_device *spi) 253 + { 254 + omap_dss_unregister_driver(&lb035q02_driver); 255 + return 0; 256 + } 257 + 258 + static struct spi_driver lb035q02_spi_driver = { 259 + .driver = { 260 + .name = "lgphilips_lb035q02_panel-spi", 261 + .owner = THIS_MODULE, 262 + }, 263 + .probe = lb035q02_panel_spi_probe, 264 + .remove = __devexit_p(lb035q02_panel_spi_remove), 265 + }; 266 + 267 + static int __init lb035q02_panel_drv_init(void) 268 + { 269 + return spi_register_driver(&lb035q02_spi_driver); 270 + } 271 + 272 + static void __exit lb035q02_panel_drv_exit(void) 273 + { 274 + spi_unregister_driver(&lb035q02_spi_driver); 275 + } 276 + 277 + module_init(lb035q02_panel_drv_init); 278 + module_exit(lb035q02_panel_drv_exit); 279 + MODULE_LICENSE("GPL");
+71 -52
drivers/video/omap2/displays/panel-taal.c
··· 218 218 u16 w; 219 219 u16 h; 220 220 } update_region; 221 + int channel; 222 + 221 223 struct delayed_work te_timeout_work; 222 224 223 225 bool use_dsi_bl; ··· 259 257 } 260 258 } 261 259 262 - static int taal_dcs_read_1(u8 dcs_cmd, u8 *data) 260 + static int taal_dcs_read_1(struct taal_data *td, u8 dcs_cmd, u8 *data) 263 261 { 264 262 int r; 265 263 u8 buf[1]; 266 264 267 - r = dsi_vc_dcs_read(TCH, dcs_cmd, buf, 1); 265 + r = dsi_vc_dcs_read(td->channel, dcs_cmd, buf, 1); 268 266 269 267 if (r < 0) 270 268 return r; ··· 274 272 return 0; 275 273 } 276 274 277 - static int taal_dcs_write_0(u8 dcs_cmd) 275 + static int taal_dcs_write_0(struct taal_data *td, u8 dcs_cmd) 278 276 { 279 - return dsi_vc_dcs_write(TCH, &dcs_cmd, 1); 277 + return dsi_vc_dcs_write(td->channel, &dcs_cmd, 1); 280 278 } 281 279 282 - static int taal_dcs_write_1(u8 dcs_cmd, u8 param) 280 + static int taal_dcs_write_1(struct taal_data *td, u8 dcs_cmd, u8 param) 283 281 { 284 282 u8 buf[2]; 285 283 buf[0] = dcs_cmd; 286 284 buf[1] = param; 287 - return dsi_vc_dcs_write(TCH, buf, 2); 285 + return dsi_vc_dcs_write(td->channel, buf, 2); 288 286 } 289 287 290 288 static int taal_sleep_in(struct taal_data *td) ··· 296 294 hw_guard_wait(td); 297 295 298 296 cmd = DCS_SLEEP_IN; 299 - r = dsi_vc_dcs_write_nosync(TCH, &cmd, 1); 297 + r = dsi_vc_dcs_write_nosync(td->channel, &cmd, 1); 300 298 if (r) 301 299 return r; 302 300 ··· 314 312 315 313 hw_guard_wait(td); 316 314 317 - r = taal_dcs_write_0(DCS_SLEEP_OUT); 315 + r = taal_dcs_write_0(td, DCS_SLEEP_OUT); 318 316 if (r) 319 317 return r; 320 318 ··· 326 324 return 0; 327 325 } 328 326 329 - static int taal_get_id(u8 *id1, u8 *id2, u8 *id3) 327 + static int taal_get_id(struct taal_data *td, u8 *id1, u8 *id2, u8 *id3) 330 328 { 331 329 int r; 332 330 333 - r = taal_dcs_read_1(DCS_GET_ID1, id1); 331 + r = taal_dcs_read_1(td, DCS_GET_ID1, id1); 334 332 if (r) 335 333 return r; 336 - r = taal_dcs_read_1(DCS_GET_ID2, id2); 334 + r = taal_dcs_read_1(td, DCS_GET_ID2, id2); 337 335 if (r) 338 336 return r; 339 - r = taal_dcs_read_1(DCS_GET_ID3, id3); 337 + r = taal_dcs_read_1(td, DCS_GET_ID3, id3); 340 338 if (r) 341 339 return r; 342 340 343 341 return 0; 344 342 } 345 343 346 - static int taal_set_addr_mode(u8 rotate, bool mirror) 344 + static int taal_set_addr_mode(struct taal_data *td, u8 rotate, bool mirror) 347 345 { 348 346 int r; 349 347 u8 mode; 350 348 int b5, b6, b7; 351 349 352 - r = taal_dcs_read_1(DCS_READ_MADCTL, &mode); 350 + r = taal_dcs_read_1(td, DCS_READ_MADCTL, &mode); 353 351 if (r) 354 352 return r; 355 353 ··· 383 381 mode &= ~((1<<7) | (1<<6) | (1<<5)); 384 382 mode |= (b7 << 7) | (b6 << 6) | (b5 << 5); 385 383 386 - return taal_dcs_write_1(DCS_MEM_ACC_CTRL, mode); 384 + return taal_dcs_write_1(td, DCS_MEM_ACC_CTRL, mode); 387 385 } 388 386 389 - static int taal_set_update_window(u16 x, u16 y, u16 w, u16 h) 387 + static int taal_set_update_window(struct taal_data *td, 388 + u16 x, u16 y, u16 w, u16 h) 390 389 { 391 390 int r; 392 391 u16 x1 = x; ··· 402 399 buf[3] = (x2 >> 8) & 0xff; 403 400 buf[4] = (x2 >> 0) & 0xff; 404 401 405 - r = dsi_vc_dcs_write_nosync(TCH, buf, sizeof(buf)); 402 + r = dsi_vc_dcs_write_nosync(td->channel, buf, sizeof(buf)); 406 403 if (r) 407 404 return r; 408 405 ··· 412 409 buf[3] = (y2 >> 8) & 0xff; 413 410 buf[4] = (y2 >> 0) & 0xff; 414 411 415 - r = dsi_vc_dcs_write_nosync(TCH, buf, sizeof(buf)); 412 + r = dsi_vc_dcs_write_nosync(td->channel, buf, sizeof(buf)); 416 413 if (r) 417 414 return r; 418 415 419 - dsi_vc_send_bta_sync(TCH); 416 + dsi_vc_send_bta_sync(td->channel); 420 417 421 418 return r; 422 419 } ··· 442 439 if (td->use_dsi_bl) { 443 440 if (td->enabled) { 444 441 dsi_bus_lock(); 445 - r = taal_dcs_write_1(DCS_BRIGHTNESS, level); 442 + r = taal_dcs_write_1(td, DCS_BRIGHTNESS, level); 446 443 dsi_bus_unlock(); 447 444 } else { 448 445 r = 0; ··· 505 502 506 503 if (td->enabled) { 507 504 dsi_bus_lock(); 508 - r = taal_dcs_read_1(DCS_READ_NUM_ERRORS, &errors); 505 + r = taal_dcs_read_1(td, DCS_READ_NUM_ERRORS, &errors); 509 506 dsi_bus_unlock(); 510 507 } else { 511 508 r = -ENODEV; ··· 531 528 532 529 if (td->enabled) { 533 530 dsi_bus_lock(); 534 - r = taal_get_id(&id1, &id2, &id3); 531 + r = taal_get_id(td, &id1, &id2, &id3); 535 532 dsi_bus_unlock(); 536 533 } else { 537 534 r = -ENODEV; ··· 593 590 if (td->enabled) { 594 591 dsi_bus_lock(); 595 592 if (!td->cabc_broken) 596 - taal_dcs_write_1(DCS_WRITE_CABC, i); 593 + taal_dcs_write_1(td, DCS_WRITE_CABC, i); 597 594 dsi_bus_unlock(); 598 595 } 599 596 ··· 779 776 dev_dbg(&dssdev->dev, "Using GPIO TE\n"); 780 777 } 781 778 779 + r = omap_dsi_request_vc(dssdev, &td->channel); 780 + if (r) { 781 + dev_err(&dssdev->dev, "failed to get virtual channel\n"); 782 + goto err_req_vc; 783 + } 784 + 785 + r = omap_dsi_set_vc_id(dssdev, td->channel, TCH); 786 + if (r) { 787 + dev_err(&dssdev->dev, "failed to set VC_ID\n"); 788 + goto err_vc_id; 789 + } 790 + 782 791 r = sysfs_create_group(&dssdev->dev.kobj, &taal_attr_group); 783 792 if (r) { 784 793 dev_err(&dssdev->dev, "failed to create sysfs files\n"); 785 - goto err_sysfs; 794 + goto err_vc_id; 786 795 } 787 796 788 797 return 0; 789 - err_sysfs: 798 + 799 + err_vc_id: 800 + omap_dsi_release_vc(dssdev, td->channel); 801 + err_req_vc: 790 802 if (panel_data->use_ext_te) 791 803 free_irq(gpio_to_irq(panel_data->ext_te_gpio), dssdev); 792 804 err_irq: ··· 828 810 dev_dbg(&dssdev->dev, "remove\n"); 829 811 830 812 sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group); 813 + omap_dsi_release_vc(dssdev, td->channel); 831 814 832 815 if (panel_data->use_ext_te) { 833 816 int gpio = panel_data->ext_te_gpio; ··· 867 848 868 849 taal_hw_reset(dssdev); 869 850 870 - omapdss_dsi_vc_enable_hs(TCH, false); 851 + omapdss_dsi_vc_enable_hs(td->channel, false); 871 852 872 853 r = taal_sleep_out(td); 873 854 if (r) 874 855 goto err; 875 856 876 - r = taal_get_id(&id1, &id2, &id3); 857 + r = taal_get_id(td, &id1, &id2, &id3); 877 858 if (r) 878 859 goto err; 879 860 ··· 882 863 (id2 == 0x00 || id2 == 0xff || id2 == 0x81)) 883 864 td->cabc_broken = true; 884 865 885 - r = taal_dcs_write_1(DCS_BRIGHTNESS, 0xff); 866 + r = taal_dcs_write_1(td, DCS_BRIGHTNESS, 0xff); 886 867 if (r) 887 868 goto err; 888 869 889 - r = taal_dcs_write_1(DCS_CTRL_DISPLAY, 870 + r = taal_dcs_write_1(td, DCS_CTRL_DISPLAY, 890 871 (1<<2) | (1<<5)); /* BL | BCTRL */ 891 872 if (r) 892 873 goto err; 893 874 894 - r = taal_dcs_write_1(DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */ 875 + r = taal_dcs_write_1(td, DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */ 895 876 if (r) 896 877 goto err; 897 878 898 - r = taal_set_addr_mode(td->rotate, td->mirror); 879 + r = taal_set_addr_mode(td, td->rotate, td->mirror); 899 880 if (r) 900 881 goto err; 901 882 902 883 if (!td->cabc_broken) { 903 - r = taal_dcs_write_1(DCS_WRITE_CABC, td->cabc_mode); 884 + r = taal_dcs_write_1(td, DCS_WRITE_CABC, td->cabc_mode); 904 885 if (r) 905 886 goto err; 906 887 } 907 888 908 - r = taal_dcs_write_0(DCS_DISPLAY_ON); 889 + r = taal_dcs_write_0(td, DCS_DISPLAY_ON); 909 890 if (r) 910 891 goto err; 911 892 ··· 924 905 td->intro_printed = true; 925 906 } 926 907 927 - omapdss_dsi_vc_enable_hs(TCH, true); 908 + omapdss_dsi_vc_enable_hs(td->channel, true); 928 909 929 910 return 0; 930 911 err: ··· 942 923 struct taal_data *td = dev_get_drvdata(&dssdev->dev); 943 924 int r; 944 925 945 - r = taal_dcs_write_0(DCS_DISPLAY_OFF); 926 + r = taal_dcs_write_0(td, DCS_DISPLAY_OFF); 946 927 if (!r) { 947 928 r = taal_sleep_in(td); 948 929 /* HACK: wait a bit so that the message goes through */ ··· 1110 1091 if (old) { 1111 1092 cancel_delayed_work(&td->te_timeout_work); 1112 1093 1113 - r = omap_dsi_update(dssdev, TCH, 1094 + r = omap_dsi_update(dssdev, td->channel, 1114 1095 td->update_region.x, 1115 1096 td->update_region.y, 1116 1097 td->update_region.w, ··· 1160 1141 if (r) 1161 1142 goto err; 1162 1143 1163 - r = taal_set_update_window(x, y, w, h); 1144 + r = taal_set_update_window(td, x, y, w, h); 1164 1145 if (r) 1165 1146 goto err; 1166 1147 ··· 1174 1155 msecs_to_jiffies(250)); 1175 1156 atomic_set(&td->do_update, 1); 1176 1157 } else { 1177 - r = omap_dsi_update(dssdev, TCH, x, y, w, h, 1158 + r = omap_dsi_update(dssdev, td->channel, x, y, w, h, 1178 1159 taal_framedone_cb, dssdev); 1179 1160 if (r) 1180 1161 goto err; ··· 1212 1193 int r; 1213 1194 1214 1195 if (enable) 1215 - r = taal_dcs_write_1(DCS_TEAR_ON, 0); 1196 + r = taal_dcs_write_1(td, DCS_TEAR_ON, 0); 1216 1197 else 1217 - r = taal_dcs_write_0(DCS_TEAR_OFF); 1198 + r = taal_dcs_write_0(td, DCS_TEAR_OFF); 1218 1199 1219 1200 if (!panel_data->use_ext_te) 1220 1201 omapdss_dsi_enable_te(dssdev, enable); ··· 1284 1265 dsi_bus_lock(); 1285 1266 1286 1267 if (td->enabled) { 1287 - r = taal_set_addr_mode(rotate, td->mirror); 1268 + r = taal_set_addr_mode(td, rotate, td->mirror); 1288 1269 if (r) 1289 1270 goto err; 1290 1271 } ··· 1327 1308 1328 1309 dsi_bus_lock(); 1329 1310 if (td->enabled) { 1330 - r = taal_set_addr_mode(td->rotate, enable); 1311 + r = taal_set_addr_mode(td, td->rotate, enable); 1331 1312 if (r) 1332 1313 goto err; 1333 1314 } ··· 1371 1352 1372 1353 dsi_bus_lock(); 1373 1354 1374 - r = taal_dcs_read_1(DCS_GET_ID1, &id1); 1355 + r = taal_dcs_read_1(td, DCS_GET_ID1, &id1); 1375 1356 if (r) 1376 1357 goto err2; 1377 - r = taal_dcs_read_1(DCS_GET_ID2, &id2); 1358 + r = taal_dcs_read_1(td, DCS_GET_ID2, &id2); 1378 1359 if (r) 1379 1360 goto err2; 1380 - r = taal_dcs_read_1(DCS_GET_ID3, &id3); 1361 + r = taal_dcs_read_1(td, DCS_GET_ID3, &id3); 1381 1362 if (r) 1382 1363 goto err2; 1383 1364 ··· 1425 1406 else 1426 1407 plen = 2; 1427 1408 1428 - taal_set_update_window(x, y, w, h); 1409 + taal_set_update_window(td, x, y, w, h); 1429 1410 1430 - r = dsi_vc_set_max_rx_packet_size(TCH, plen); 1411 + r = dsi_vc_set_max_rx_packet_size(td->channel, plen); 1431 1412 if (r) 1432 1413 goto err2; 1433 1414 ··· 1435 1416 u8 dcs_cmd = first ? 0x2e : 0x3e; 1436 1417 first = 0; 1437 1418 1438 - r = dsi_vc_dcs_read(TCH, dcs_cmd, 1419 + r = dsi_vc_dcs_read(td->channel, dcs_cmd, 1439 1420 buf + buf_used, size - buf_used); 1440 1421 1441 1422 if (r < 0) { ··· 1461 1442 r = buf_used; 1462 1443 1463 1444 err3: 1464 - dsi_vc_set_max_rx_packet_size(TCH, 1); 1445 + dsi_vc_set_max_rx_packet_size(td->channel, 1); 1465 1446 err2: 1466 1447 dsi_bus_unlock(); 1467 1448 err1: ··· 1487 1468 1488 1469 dsi_bus_lock(); 1489 1470 1490 - r = taal_dcs_read_1(DCS_RDDSDR, &state1); 1471 + r = taal_dcs_read_1(td, DCS_RDDSDR, &state1); 1491 1472 if (r) { 1492 1473 dev_err(&dssdev->dev, "failed to read Taal status\n"); 1493 1474 goto err; ··· 1500 1481 goto err; 1501 1482 } 1502 1483 1503 - r = taal_dcs_read_1(DCS_RDDSDR, &state2); 1484 + r = taal_dcs_read_1(td, DCS_RDDSDR, &state2); 1504 1485 if (r) { 1505 1486 dev_err(&dssdev->dev, "failed to read Taal status\n"); 1506 1487 goto err; ··· 1516 1497 /* Self-diagnostics result is also shown on TE GPIO line. We need 1517 1498 * to re-enable TE after self diagnostics */ 1518 1499 if (td->te_enabled && panel_data->use_ext_te) { 1519 - r = taal_dcs_write_1(DCS_TEAR_ON, 0); 1500 + r = taal_dcs_write_1(td, DCS_TEAR_ON, 0); 1520 1501 if (r) 1521 1502 goto err; 1522 1503 }
+11 -3
drivers/video/omap2/dss/Kconfig
··· 1 1 menuconfig OMAP2_DSS 2 - tristate "OMAP2/3 Display Subsystem support (EXPERIMENTAL)" 3 - depends on ARCH_OMAP2 || ARCH_OMAP3 2 + tristate "OMAP2+ Display Subsystem support (EXPERIMENTAL)" 3 + depends on ARCH_OMAP2PLUS 4 4 help 5 - OMAP2/3 Display Subsystem support. 5 + OMAP2+ Display Subsystem support. 6 6 7 7 if OMAP2_DSS 8 8 ··· 59 59 default y 60 60 help 61 61 OMAP Video Encoder support for S-Video and composite TV-out. 62 + 63 + config OMAP4_DSS_HDMI 64 + bool "HDMI support" 65 + depends on ARCH_OMAP4 66 + default y 67 + help 68 + HDMI Interface. This adds the High Definition Multimedia Interface. 69 + See http://www.hdmi.org/ for HDMI specification. 62 70 63 71 config OMAP2_DSS_SDI 64 72 bool "SDI support"
+2
drivers/video/omap2/dss/Makefile
··· 5 5 omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o 6 6 omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o 7 7 omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o 8 + omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi.o \ 9 + hdmi_omap4_panel.o
+35 -445
drivers/video/omap2/dss/core.c
··· 34 34 #include <linux/regulator/consumer.h> 35 35 36 36 #include <plat/display.h> 37 - #include <plat/clock.h> 38 37 39 38 #include "dss.h" 40 39 #include "dss_features.h" 41 40 42 41 static struct { 43 42 struct platform_device *pdev; 44 - int ctx_id; 45 - 46 - struct clk *dss_ick; 47 - struct clk *dss1_fck; 48 - struct clk *dss2_fck; 49 - struct clk *dss_54m_fck; 50 - struct clk *dss_96m_fck; 51 - unsigned num_clks_enabled; 52 43 53 44 struct regulator *vdds_dsi_reg; 54 45 struct regulator *vdds_sdi_reg; 55 - struct regulator *vdda_dac_reg; 56 46 } core; 57 - 58 - static void dss_clk_enable_all_no_ctx(void); 59 - static void dss_clk_disable_all_no_ctx(void); 60 - static void dss_clk_enable_no_ctx(enum dss_clock clks); 61 - static void dss_clk_disable_no_ctx(enum dss_clock clks); 62 47 63 48 static char *def_disp_name; 64 49 module_param_named(def_disp, def_disp_name, charp, 0); 65 - MODULE_PARM_DESC(def_disp_name, "default display name"); 50 + MODULE_PARM_DESC(def_disp, "default display name"); 66 51 67 52 #ifdef DEBUG 68 53 unsigned int dss_debug; 69 54 module_param_named(debug, dss_debug, bool, 0644); 70 55 #endif 71 - 72 - /* CONTEXT */ 73 - static int dss_get_ctx_id(void) 74 - { 75 - struct omap_dss_board_info *pdata = core.pdev->dev.platform_data; 76 - int r; 77 - 78 - if (!pdata->get_last_off_on_transaction_id) 79 - return 0; 80 - r = pdata->get_last_off_on_transaction_id(&core.pdev->dev); 81 - if (r < 0) { 82 - dev_err(&core.pdev->dev, "getting transaction ID failed, " 83 - "will force context restore\n"); 84 - r = -1; 85 - } 86 - return r; 87 - } 88 - 89 - int dss_need_ctx_restore(void) 90 - { 91 - int id = dss_get_ctx_id(); 92 - 93 - if (id < 0 || id != core.ctx_id) { 94 - DSSDBG("ctx id %d -> id %d\n", 95 - core.ctx_id, id); 96 - core.ctx_id = id; 97 - return 1; 98 - } else { 99 - return 0; 100 - } 101 - } 102 - 103 - static void save_all_ctx(void) 104 - { 105 - DSSDBG("save context\n"); 106 - 107 - dss_clk_enable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); 108 - 109 - dss_save_context(); 110 - dispc_save_context(); 111 - #ifdef CONFIG_OMAP2_DSS_DSI 112 - dsi_save_context(); 113 - #endif 114 - 115 - dss_clk_disable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK1); 116 - } 117 - 118 - static void restore_all_ctx(void) 119 - { 120 - DSSDBG("restore context\n"); 121 - 122 - dss_clk_enable_all_no_ctx(); 123 - 124 - dss_restore_context(); 125 - dispc_restore_context(); 126 - #ifdef CONFIG_OMAP2_DSS_DSI 127 - dsi_restore_context(); 128 - #endif 129 - 130 - dss_clk_disable_all_no_ctx(); 131 - } 132 - 133 - #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 134 - /* CLOCKS */ 135 - static void core_dump_clocks(struct seq_file *s) 136 - { 137 - int i; 138 - struct clk *clocks[5] = { 139 - core.dss_ick, 140 - core.dss1_fck, 141 - core.dss2_fck, 142 - core.dss_54m_fck, 143 - core.dss_96m_fck 144 - }; 145 - 146 - seq_printf(s, "- CORE -\n"); 147 - 148 - seq_printf(s, "internal clk count\t\t%u\n", core.num_clks_enabled); 149 - 150 - for (i = 0; i < 5; i++) { 151 - if (!clocks[i]) 152 - continue; 153 - seq_printf(s, "%-15s\t%lu\t%d\n", 154 - clocks[i]->name, 155 - clk_get_rate(clocks[i]), 156 - clocks[i]->usecount); 157 - } 158 - } 159 - #endif /* defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) */ 160 - 161 - static int dss_get_clock(struct clk **clock, const char *clk_name) 162 - { 163 - struct clk *clk; 164 - 165 - clk = clk_get(&core.pdev->dev, clk_name); 166 - 167 - if (IS_ERR(clk)) { 168 - DSSERR("can't get clock %s", clk_name); 169 - return PTR_ERR(clk); 170 - } 171 - 172 - *clock = clk; 173 - 174 - DSSDBG("clk %s, rate %ld\n", clk_name, clk_get_rate(clk)); 175 - 176 - return 0; 177 - } 178 - 179 - static int dss_get_clocks(void) 180 - { 181 - int r; 182 - 183 - core.dss_ick = NULL; 184 - core.dss1_fck = NULL; 185 - core.dss2_fck = NULL; 186 - core.dss_54m_fck = NULL; 187 - core.dss_96m_fck = NULL; 188 - 189 - r = dss_get_clock(&core.dss_ick, "ick"); 190 - if (r) 191 - goto err; 192 - 193 - r = dss_get_clock(&core.dss1_fck, "dss1_fck"); 194 - if (r) 195 - goto err; 196 - 197 - r = dss_get_clock(&core.dss2_fck, "dss2_fck"); 198 - if (r) 199 - goto err; 200 - 201 - r = dss_get_clock(&core.dss_54m_fck, "tv_fck"); 202 - if (r) 203 - goto err; 204 - 205 - r = dss_get_clock(&core.dss_96m_fck, "video_fck"); 206 - if (r) 207 - goto err; 208 - 209 - return 0; 210 - 211 - err: 212 - if (core.dss_ick) 213 - clk_put(core.dss_ick); 214 - if (core.dss1_fck) 215 - clk_put(core.dss1_fck); 216 - if (core.dss2_fck) 217 - clk_put(core.dss2_fck); 218 - if (core.dss_54m_fck) 219 - clk_put(core.dss_54m_fck); 220 - if (core.dss_96m_fck) 221 - clk_put(core.dss_96m_fck); 222 - 223 - return r; 224 - } 225 - 226 - static void dss_put_clocks(void) 227 - { 228 - if (core.dss_96m_fck) 229 - clk_put(core.dss_96m_fck); 230 - clk_put(core.dss_54m_fck); 231 - clk_put(core.dss1_fck); 232 - clk_put(core.dss2_fck); 233 - clk_put(core.dss_ick); 234 - } 235 - 236 - unsigned long dss_clk_get_rate(enum dss_clock clk) 237 - { 238 - switch (clk) { 239 - case DSS_CLK_ICK: 240 - return clk_get_rate(core.dss_ick); 241 - case DSS_CLK_FCK1: 242 - return clk_get_rate(core.dss1_fck); 243 - case DSS_CLK_FCK2: 244 - return clk_get_rate(core.dss2_fck); 245 - case DSS_CLK_54M: 246 - return clk_get_rate(core.dss_54m_fck); 247 - case DSS_CLK_96M: 248 - return clk_get_rate(core.dss_96m_fck); 249 - } 250 - 251 - BUG(); 252 - return 0; 253 - } 254 - 255 - static unsigned count_clk_bits(enum dss_clock clks) 256 - { 257 - unsigned num_clks = 0; 258 - 259 - if (clks & DSS_CLK_ICK) 260 - ++num_clks; 261 - if (clks & DSS_CLK_FCK1) 262 - ++num_clks; 263 - if (clks & DSS_CLK_FCK2) 264 - ++num_clks; 265 - if (clks & DSS_CLK_54M) 266 - ++num_clks; 267 - if (clks & DSS_CLK_96M) 268 - ++num_clks; 269 - 270 - return num_clks; 271 - } 272 - 273 - static void dss_clk_enable_no_ctx(enum dss_clock clks) 274 - { 275 - unsigned num_clks = count_clk_bits(clks); 276 - 277 - if (clks & DSS_CLK_ICK) 278 - clk_enable(core.dss_ick); 279 - if (clks & DSS_CLK_FCK1) 280 - clk_enable(core.dss1_fck); 281 - if (clks & DSS_CLK_FCK2) 282 - clk_enable(core.dss2_fck); 283 - if (clks & DSS_CLK_54M) 284 - clk_enable(core.dss_54m_fck); 285 - if (clks & DSS_CLK_96M) 286 - clk_enable(core.dss_96m_fck); 287 - 288 - core.num_clks_enabled += num_clks; 289 - } 290 - 291 - void dss_clk_enable(enum dss_clock clks) 292 - { 293 - bool check_ctx = core.num_clks_enabled == 0; 294 - 295 - dss_clk_enable_no_ctx(clks); 296 - 297 - if (check_ctx && cpu_is_omap34xx() && dss_need_ctx_restore()) 298 - restore_all_ctx(); 299 - } 300 - 301 - static void dss_clk_disable_no_ctx(enum dss_clock clks) 302 - { 303 - unsigned num_clks = count_clk_bits(clks); 304 - 305 - if (clks & DSS_CLK_ICK) 306 - clk_disable(core.dss_ick); 307 - if (clks & DSS_CLK_FCK1) 308 - clk_disable(core.dss1_fck); 309 - if (clks & DSS_CLK_FCK2) 310 - clk_disable(core.dss2_fck); 311 - if (clks & DSS_CLK_54M) 312 - clk_disable(core.dss_54m_fck); 313 - if (clks & DSS_CLK_96M) 314 - clk_disable(core.dss_96m_fck); 315 - 316 - core.num_clks_enabled -= num_clks; 317 - } 318 - 319 - void dss_clk_disable(enum dss_clock clks) 320 - { 321 - if (cpu_is_omap34xx()) { 322 - unsigned num_clks = count_clk_bits(clks); 323 - 324 - BUG_ON(core.num_clks_enabled < num_clks); 325 - 326 - if (core.num_clks_enabled == num_clks) 327 - save_all_ctx(); 328 - } 329 - 330 - dss_clk_disable_no_ctx(clks); 331 - } 332 - 333 - static void dss_clk_enable_all_no_ctx(void) 334 - { 335 - enum dss_clock clks; 336 - 337 - clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; 338 - if (cpu_is_omap34xx()) 339 - clks |= DSS_CLK_96M; 340 - dss_clk_enable_no_ctx(clks); 341 - } 342 - 343 - static void dss_clk_disable_all_no_ctx(void) 344 - { 345 - enum dss_clock clks; 346 - 347 - clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; 348 - if (cpu_is_omap34xx()) 349 - clks |= DSS_CLK_96M; 350 - dss_clk_disable_no_ctx(clks); 351 - } 352 - 353 - static void dss_clk_disable_all(void) 354 - { 355 - enum dss_clock clks; 356 - 357 - clks = DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_FCK2 | DSS_CLK_54M; 358 - if (cpu_is_omap34xx()) 359 - clks |= DSS_CLK_96M; 360 - dss_clk_disable(clks); 361 - } 362 56 363 57 /* REGULATORS */ 364 58 ··· 84 390 return reg; 85 391 } 86 392 87 - struct regulator *dss_get_vdda_dac(void) 88 - { 89 - struct regulator *reg; 90 - 91 - if (core.vdda_dac_reg != NULL) 92 - return core.vdda_dac_reg; 93 - 94 - reg = regulator_get(&core.pdev->dev, "vdda_dac"); 95 - if (!IS_ERR(reg)) 96 - core.vdda_dac_reg = reg; 97 - 98 - return reg; 99 - } 100 - 101 - /* DEBUGFS */ 102 393 #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 103 - static void dss_debug_dump_clocks(struct seq_file *s) 104 - { 105 - core_dump_clocks(s); 106 - dss_dump_clocks(s); 107 - dispc_dump_clocks(s); 108 - #ifdef CONFIG_OMAP2_DSS_DSI 109 - dsi_dump_clocks(s); 110 - #endif 111 - } 112 - 113 394 static int dss_debug_show(struct seq_file *s, void *unused) 114 395 { 115 396 void (*func)(struct seq_file *) = s->private; ··· 166 497 static int omap_dss_probe(struct platform_device *pdev) 167 498 { 168 499 struct omap_dss_board_info *pdata = pdev->dev.platform_data; 169 - int skip_init = 0; 170 500 int r; 171 501 int i; 172 502 ··· 176 508 dss_init_overlay_managers(pdev); 177 509 dss_init_overlays(pdev); 178 510 179 - r = dss_get_clocks(); 180 - if (r) 181 - goto err_clocks; 182 - 183 - dss_clk_enable_all_no_ctx(); 184 - 185 - core.ctx_id = dss_get_ctx_id(); 186 - DSSDBG("initial ctx id %u\n", core.ctx_id); 187 - 188 - #ifdef CONFIG_FB_OMAP_BOOTLOADER_INIT 189 - /* DISPC_CONTROL */ 190 - if (omap_readl(0x48050440) & 1) /* LCD enabled? */ 191 - skip_init = 1; 192 - #endif 193 - 194 - r = dss_init(skip_init); 511 + r = dss_init_platform_driver(); 195 512 if (r) { 196 - DSSERR("Failed to initialize DSS\n"); 513 + DSSERR("Failed to initialize DSS platform driver\n"); 197 514 goto err_dss; 198 515 } 199 516 200 - r = rfbi_init(); 517 + /* keep clocks enabled to prevent context saves/restores during init */ 518 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 519 + 520 + r = rfbi_init_platform_driver(); 201 521 if (r) { 202 - DSSERR("Failed to initialize rfbi\n"); 522 + DSSERR("Failed to initialize rfbi platform driver\n"); 203 523 goto err_rfbi; 204 524 } 205 525 206 - r = dpi_init(pdev); 526 + r = dispc_init_platform_driver(); 207 527 if (r) { 208 - DSSERR("Failed to initialize dpi\n"); 209 - goto err_dpi; 210 - } 211 - 212 - r = dispc_init(); 213 - if (r) { 214 - DSSERR("Failed to initialize dispc\n"); 528 + DSSERR("Failed to initialize dispc platform driver\n"); 215 529 goto err_dispc; 216 530 } 217 531 218 - r = venc_init(pdev); 532 + r = venc_init_platform_driver(); 219 533 if (r) { 220 - DSSERR("Failed to initialize venc\n"); 534 + DSSERR("Failed to initialize venc platform driver\n"); 221 535 goto err_venc; 222 536 } 223 537 224 - if (cpu_is_omap34xx()) { 225 - r = sdi_init(skip_init); 226 - if (r) { 227 - DSSERR("Failed to initialize SDI\n"); 228 - goto err_sdi; 229 - } 538 + r = dsi_init_platform_driver(); 539 + if (r) { 540 + DSSERR("Failed to initialize DSI platform driver\n"); 541 + goto err_dsi; 542 + } 230 543 231 - r = dsi_init(pdev); 232 - if (r) { 233 - DSSERR("Failed to initialize DSI\n"); 234 - goto err_dsi; 235 - } 544 + r = hdmi_init_platform_driver(); 545 + if (r) { 546 + DSSERR("Failed to initialize hdmi\n"); 547 + goto err_hdmi; 236 548 } 237 549 238 550 r = dss_initialize_debugfs(); ··· 237 589 pdata->default_device = dssdev; 238 590 } 239 591 240 - dss_clk_disable_all(); 592 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 241 593 242 594 return 0; 243 595 244 596 err_register: 245 597 dss_uninitialize_debugfs(); 246 598 err_debugfs: 247 - if (cpu_is_omap34xx()) 248 - dsi_exit(); 599 + hdmi_uninit_platform_driver(); 600 + err_hdmi: 601 + dsi_uninit_platform_driver(); 249 602 err_dsi: 250 - if (cpu_is_omap34xx()) 251 - sdi_exit(); 252 - err_sdi: 253 - venc_exit(); 603 + venc_uninit_platform_driver(); 254 604 err_venc: 255 - dispc_exit(); 605 + dispc_uninit_platform_driver(); 256 606 err_dispc: 257 - dpi_exit(); 258 - err_dpi: 259 - rfbi_exit(); 607 + rfbi_uninit_platform_driver(); 260 608 err_rfbi: 261 - dss_exit(); 609 + dss_uninit_platform_driver(); 262 610 err_dss: 263 - dss_clk_disable_all_no_ctx(); 264 - dss_put_clocks(); 265 - err_clocks: 266 611 267 612 return r; 268 613 } ··· 264 623 { 265 624 struct omap_dss_board_info *pdata = pdev->dev.platform_data; 266 625 int i; 267 - int c; 268 626 269 627 dss_uninitialize_debugfs(); 270 628 271 - venc_exit(); 272 - dispc_exit(); 273 - dpi_exit(); 274 - rfbi_exit(); 275 - if (cpu_is_omap34xx()) { 276 - dsi_exit(); 277 - sdi_exit(); 278 - } 279 - 280 - dss_exit(); 281 - 282 - /* these should be removed at some point */ 283 - c = core.dss_ick->usecount; 284 - if (c > 0) { 285 - DSSERR("warning: dss_ick usecount %d, disabling\n", c); 286 - while (c-- > 0) 287 - clk_disable(core.dss_ick); 288 - } 289 - 290 - c = core.dss1_fck->usecount; 291 - if (c > 0) { 292 - DSSERR("warning: dss1_fck usecount %d, disabling\n", c); 293 - while (c-- > 0) 294 - clk_disable(core.dss1_fck); 295 - } 296 - 297 - c = core.dss2_fck->usecount; 298 - if (c > 0) { 299 - DSSERR("warning: dss2_fck usecount %d, disabling\n", c); 300 - while (c-- > 0) 301 - clk_disable(core.dss2_fck); 302 - } 303 - 304 - c = core.dss_54m_fck->usecount; 305 - if (c > 0) { 306 - DSSERR("warning: dss_54m_fck usecount %d, disabling\n", c); 307 - while (c-- > 0) 308 - clk_disable(core.dss_54m_fck); 309 - } 310 - 311 - if (core.dss_96m_fck) { 312 - c = core.dss_96m_fck->usecount; 313 - if (c > 0) { 314 - DSSERR("warning: dss_96m_fck usecount %d, disabling\n", 315 - c); 316 - while (c-- > 0) 317 - clk_disable(core.dss_96m_fck); 318 - } 319 - } 320 - 321 - dss_put_clocks(); 629 + venc_uninit_platform_driver(); 630 + dispc_uninit_platform_driver(); 631 + rfbi_uninit_platform_driver(); 632 + dsi_uninit_platform_driver(); 633 + hdmi_uninit_platform_driver(); 634 + dss_uninit_platform_driver(); 322 635 323 636 dss_uninit_overlays(pdev); 324 637 dss_uninit_overlay_managers(pdev); ··· 558 963 if (core.vdds_sdi_reg != NULL) { 559 964 regulator_put(core.vdds_sdi_reg); 560 965 core.vdds_sdi_reg = NULL; 561 - } 562 - 563 - if (core.vdda_dac_reg != NULL) { 564 - regulator_put(core.vdda_dac_reg); 565 - core.vdda_dac_reg = NULL; 566 966 } 567 967 568 968 platform_driver_unregister(&omap_dss_driver);
+243 -94
drivers/video/omap2/dss/dispc.c
··· 32 32 #include <linux/delay.h> 33 33 #include <linux/workqueue.h> 34 34 #include <linux/hardirq.h> 35 + #include <linux/interrupt.h> 35 36 36 37 #include <plat/sram.h> 37 38 #include <plat/clock.h> ··· 43 42 #include "dss_features.h" 44 43 45 44 /* DISPC */ 46 - #define DISPC_BASE 0x48050400 47 - 48 45 #define DISPC_SZ_REGS SZ_4K 49 46 50 47 struct dispc_reg { u16 idx; }; ··· 73 74 #define DISPC_TIMING_H(ch) DISPC_REG(ch != 2 ? 0x0064 : 0x0400) 74 75 #define DISPC_TIMING_V(ch) DISPC_REG(ch != 2 ? 0x0068 : 0x0404) 75 76 #define DISPC_POL_FREQ(ch) DISPC_REG(ch != 2 ? 0x006C : 0x0408) 76 - #define DISPC_DIVISOR(ch) DISPC_REG(ch != 2 ? 0x0070 : 0x040C) 77 + #define DISPC_DIVISORo(ch) DISPC_REG(ch != 2 ? 0x0070 : 0x040C) 77 78 #define DISPC_GLOBAL_ALPHA DISPC_REG(0x0074) 78 79 #define DISPC_SIZE_DIG DISPC_REG(0x0078) 79 80 #define DISPC_SIZE_LCD(ch) DISPC_REG(ch != 2 ? 0x007C : 0x03CC) ··· 128 129 129 130 #define DISPC_VID_PRELOAD(n) DISPC_REG(0x230 + (n)*0x04) 130 131 132 + #define DISPC_DIVISOR DISPC_REG(0x0804) 131 133 132 134 #define DISPC_IRQ_MASK_ERROR (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \ 133 135 DISPC_IRQ_OCP_ERR | \ ··· 178 178 }; 179 179 180 180 static struct { 181 + struct platform_device *pdev; 181 182 void __iomem *base; 183 + int irq; 182 184 183 185 u32 fifo_size[3]; 184 186 ··· 232 230 SR(TIMING_H(0)); 233 231 SR(TIMING_V(0)); 234 232 SR(POL_FREQ(0)); 235 - SR(DIVISOR(0)); 233 + SR(DIVISORo(0)); 236 234 SR(GLOBAL_ALPHA); 237 235 SR(SIZE_DIG); 238 236 SR(SIZE_LCD(0)); ··· 244 242 SR(TIMING_H(2)); 245 243 SR(TIMING_V(2)); 246 244 SR(POL_FREQ(2)); 247 - SR(DIVISOR(2)); 245 + SR(DIVISORo(2)); 248 246 SR(CONFIG2); 249 247 } 250 248 ··· 375 373 SR(VID_FIR_COEF_V(1, 7)); 376 374 377 375 SR(VID_PRELOAD(1)); 376 + 377 + if (dss_has_feature(FEAT_CORE_CLK_DIV)) 378 + SR(DIVISOR); 378 379 } 379 380 380 381 void dispc_restore_context(void) ··· 394 389 RR(TIMING_H(0)); 395 390 RR(TIMING_V(0)); 396 391 RR(POL_FREQ(0)); 397 - RR(DIVISOR(0)); 392 + RR(DIVISORo(0)); 398 393 RR(GLOBAL_ALPHA); 399 394 RR(SIZE_DIG); 400 395 RR(SIZE_LCD(0)); ··· 405 400 RR(TIMING_H(2)); 406 401 RR(TIMING_V(2)); 407 402 RR(POL_FREQ(2)); 408 - RR(DIVISOR(2)); 403 + RR(DIVISORo(2)); 409 404 RR(CONFIG2); 410 405 } 411 406 ··· 537 532 538 533 RR(VID_PRELOAD(1)); 539 534 535 + if (dss_has_feature(FEAT_CORE_CLK_DIV)) 536 + RR(DIVISOR); 537 + 540 538 /* enable last, because LCD & DIGIT enable are here */ 541 539 RR(CONTROL); 542 540 if (dss_has_feature(FEAT_MGR_LCD2)) ··· 560 552 static inline void enable_clocks(bool enable) 561 553 { 562 554 if (enable) 563 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 555 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 564 556 else 565 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 557 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 566 558 } 567 559 568 560 bool dispc_go_busy(enum omap_channel channel) ··· 1008 1000 enable_clocks(0); 1009 1001 } 1010 1002 1003 + void dispc_enable_gamma_table(bool enable) 1004 + { 1005 + /* 1006 + * This is partially implemented to support only disabling of 1007 + * the gamma table. 1008 + */ 1009 + if (enable) { 1010 + DSSWARN("Gamma table enabling for TV not yet supported"); 1011 + return; 1012 + } 1013 + 1014 + REG_FLD_MOD(DISPC_CONFIG, enable, 9, 9); 1015 + } 1016 + 1011 1017 static void _dispc_set_vid_color_conv(enum omap_plane plane, bool enable) 1012 1018 { 1013 1019 u32 val; ··· 1151 1129 u32 val; 1152 1130 const struct dispc_reg ac0_reg[] = { DISPC_VID_ACCU0(0), 1153 1131 DISPC_VID_ACCU0(1) }; 1132 + u8 hor_start, hor_end, vert_start, vert_end; 1154 1133 1155 1134 BUG_ON(plane == OMAP_DSS_GFX); 1156 1135 1157 - val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); 1136 + dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 1137 + dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 1138 + 1139 + val = FLD_VAL(vaccu, vert_start, vert_end) | 1140 + FLD_VAL(haccu, hor_start, hor_end); 1141 + 1158 1142 dispc_write_reg(ac0_reg[plane-1], val); 1159 1143 } 1160 1144 ··· 1169 1141 u32 val; 1170 1142 const struct dispc_reg ac1_reg[] = { DISPC_VID_ACCU1(0), 1171 1143 DISPC_VID_ACCU1(1) }; 1144 + u8 hor_start, hor_end, vert_start, vert_end; 1172 1145 1173 1146 BUG_ON(plane == OMAP_DSS_GFX); 1174 1147 1175 - val = FLD_VAL(vaccu, 25, 16) | FLD_VAL(haccu, 9, 0); 1148 + dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 1149 + dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 1150 + 1151 + val = FLD_VAL(vaccu, vert_start, vert_end) | 1152 + FLD_VAL(haccu, hor_start, hor_end); 1153 + 1176 1154 dispc_write_reg(ac1_reg[plane-1], val); 1177 1155 } 1178 1156 ··· 1216 1182 _dispc_set_fir(plane, fir_hinc, fir_vinc); 1217 1183 1218 1184 l = dispc_read_reg(dispc_reg_att[plane]); 1219 - l &= ~((0x0f << 5) | (0x3 << 21)); 1220 1185 1186 + /* RESIZEENABLE and VERTICALTAPS */ 1187 + l &= ~((0x3 << 5) | (0x1 << 21)); 1221 1188 l |= fir_hinc ? (1 << 5) : 0; 1222 1189 l |= fir_vinc ? (1 << 6) : 0; 1223 - 1224 - l |= hscaleup ? 0 : (1 << 7); 1225 - l |= vscaleup ? 0 : (1 << 8); 1226 - 1227 1190 l |= five_taps ? (1 << 21) : 0; 1228 - l |= five_taps ? (1 << 22) : 0; 1191 + 1192 + /* VRESIZECONF and HRESIZECONF */ 1193 + if (dss_has_feature(FEAT_RESIZECONF)) { 1194 + l &= ~(0x3 << 7); 1195 + l |= hscaleup ? 0 : (1 << 7); 1196 + l |= vscaleup ? 0 : (1 << 8); 1197 + } 1198 + 1199 + /* LINEBUFFERSPLIT */ 1200 + if (dss_has_feature(FEAT_LINEBUFFERSPLIT)) { 1201 + l &= ~(0x1 << 22); 1202 + l |= five_taps ? (1 << 22) : 0; 1203 + } 1229 1204 1230 1205 dispc_write_reg(dispc_reg_att[plane], l); 1231 1206 ··· 1258 1215 static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation, 1259 1216 bool mirroring, enum omap_color_mode color_mode) 1260 1217 { 1218 + bool row_repeat = false; 1219 + int vidrot = 0; 1220 + 1261 1221 if (color_mode == OMAP_DSS_COLOR_YUV2 || 1262 1222 color_mode == OMAP_DSS_COLOR_UYVY) { 1263 - int vidrot = 0; 1264 1223 1265 1224 if (mirroring) { 1266 1225 switch (rotation) { ··· 1296 1251 } 1297 1252 } 1298 1253 1299 - REG_FLD_MOD(dispc_reg_att[plane], vidrot, 13, 12); 1300 - 1301 1254 if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270) 1302 - REG_FLD_MOD(dispc_reg_att[plane], 0x1, 18, 18); 1255 + row_repeat = true; 1303 1256 else 1304 - REG_FLD_MOD(dispc_reg_att[plane], 0x0, 18, 18); 1305 - } else { 1306 - REG_FLD_MOD(dispc_reg_att[plane], 0, 13, 12); 1307 - REG_FLD_MOD(dispc_reg_att[plane], 0, 18, 18); 1257 + row_repeat = false; 1308 1258 } 1259 + 1260 + REG_FLD_MOD(dispc_reg_att[plane], vidrot, 13, 12); 1261 + if (dss_has_feature(FEAT_ROWREPEATENABLE)) 1262 + REG_FLD_MOD(dispc_reg_att[plane], row_repeat ? 1 : 0, 18, 18); 1309 1263 } 1310 1264 1311 1265 static int color_mode_to_bpp(enum omap_color_mode color_mode) ··· 2337 2293 BUG_ON(pck_div < 2); 2338 2294 2339 2295 enable_clocks(1); 2340 - dispc_write_reg(DISPC_DIVISOR(channel), 2296 + dispc_write_reg(DISPC_DIVISORo(channel), 2341 2297 FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0)); 2342 2298 enable_clocks(0); 2343 2299 } ··· 2346 2302 int *pck_div) 2347 2303 { 2348 2304 u32 l; 2349 - l = dispc_read_reg(DISPC_DIVISOR(channel)); 2305 + l = dispc_read_reg(DISPC_DIVISORo(channel)); 2350 2306 *lck_div = FLD_GET(l, 23, 16); 2351 2307 *pck_div = FLD_GET(l, 7, 0); 2352 2308 } ··· 2355 2311 { 2356 2312 unsigned long r = 0; 2357 2313 2358 - if (dss_get_dispc_clk_source() == DSS_SRC_DSS1_ALWON_FCLK) 2359 - r = dss_clk_get_rate(DSS_CLK_FCK1); 2360 - else 2361 - #ifdef CONFIG_OMAP2_DSS_DSI 2362 - r = dsi_get_dsi1_pll_rate(); 2363 - #else 2364 - BUG(); 2365 - #endif 2314 + switch (dss_get_dispc_clk_source()) { 2315 + case DSS_CLK_SRC_FCK: 2316 + r = dss_clk_get_rate(DSS_CLK_FCK); 2317 + break; 2318 + case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2319 + r = dsi_get_pll_hsdiv_dispc_rate(); 2320 + break; 2321 + default: 2322 + BUG(); 2323 + } 2324 + 2366 2325 return r; 2367 2326 } 2368 2327 ··· 2375 2328 unsigned long r; 2376 2329 u32 l; 2377 2330 2378 - l = dispc_read_reg(DISPC_DIVISOR(channel)); 2331 + l = dispc_read_reg(DISPC_DIVISORo(channel)); 2379 2332 2380 2333 lcd = FLD_GET(l, 23, 16); 2381 2334 2382 - r = dispc_fclk_rate(); 2335 + switch (dss_get_lcd_clk_source(channel)) { 2336 + case DSS_CLK_SRC_FCK: 2337 + r = dss_clk_get_rate(DSS_CLK_FCK); 2338 + break; 2339 + case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2340 + r = dsi_get_pll_hsdiv_dispc_rate(); 2341 + break; 2342 + default: 2343 + BUG(); 2344 + } 2383 2345 2384 2346 return r / lcd; 2385 2347 } 2386 2348 2387 2349 unsigned long dispc_pclk_rate(enum omap_channel channel) 2388 2350 { 2389 - int lcd, pcd; 2351 + int pcd; 2390 2352 unsigned long r; 2391 2353 u32 l; 2392 2354 2393 - l = dispc_read_reg(DISPC_DIVISOR(channel)); 2355 + l = dispc_read_reg(DISPC_DIVISORo(channel)); 2394 2356 2395 - lcd = FLD_GET(l, 23, 16); 2396 2357 pcd = FLD_GET(l, 7, 0); 2397 2358 2398 - r = dispc_fclk_rate(); 2359 + r = dispc_lclk_rate(channel); 2399 2360 2400 - return r / lcd / pcd; 2361 + return r / pcd; 2401 2362 } 2402 2363 2403 2364 void dispc_dump_clocks(struct seq_file *s) 2404 2365 { 2405 2366 int lcd, pcd; 2367 + u32 l; 2368 + enum dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(); 2369 + enum dss_clk_source lcd_clk_src; 2406 2370 2407 2371 enable_clocks(1); 2408 2372 2409 2373 seq_printf(s, "- DISPC -\n"); 2410 2374 2411 - seq_printf(s, "dispc fclk source = %s\n", 2412 - dss_get_dispc_clk_source() == DSS_SRC_DSS1_ALWON_FCLK ? 2413 - "dss1_alwon_fclk" : "dsi1_pll_fclk"); 2375 + seq_printf(s, "dispc fclk source = %s (%s)\n", 2376 + dss_get_generic_clk_source_name(dispc_clk_src), 2377 + dss_feat_get_clk_source_name(dispc_clk_src)); 2414 2378 2415 2379 seq_printf(s, "fck\t\t%-16lu\n", dispc_fclk_rate()); 2416 2380 2381 + if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 2382 + seq_printf(s, "- DISPC-CORE-CLK -\n"); 2383 + l = dispc_read_reg(DISPC_DIVISOR); 2384 + lcd = FLD_GET(l, 23, 16); 2385 + 2386 + seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 2387 + (dispc_fclk_rate()/lcd), lcd); 2388 + } 2417 2389 seq_printf(s, "- LCD1 -\n"); 2390 + 2391 + lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD); 2392 + 2393 + seq_printf(s, "lcd1_clk source = %s (%s)\n", 2394 + dss_get_generic_clk_source_name(lcd_clk_src), 2395 + dss_feat_get_clk_source_name(lcd_clk_src)); 2418 2396 2419 2397 dispc_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD, &lcd, &pcd); 2420 2398 ··· 2449 2377 dispc_pclk_rate(OMAP_DSS_CHANNEL_LCD), pcd); 2450 2378 if (dss_has_feature(FEAT_MGR_LCD2)) { 2451 2379 seq_printf(s, "- LCD2 -\n"); 2380 + 2381 + lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD2); 2382 + 2383 + seq_printf(s, "lcd2_clk source = %s (%s)\n", 2384 + dss_get_generic_clk_source_name(lcd_clk_src), 2385 + dss_feat_get_clk_source_name(lcd_clk_src)); 2452 2386 2453 2387 dispc_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD2, &lcd, &pcd); 2454 2388 ··· 2518 2440 { 2519 2441 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dispc_read_reg(r)) 2520 2442 2521 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 2443 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 2522 2444 2523 2445 DUMPREG(DISPC_REVISION); 2524 2446 DUMPREG(DISPC_SYSCONFIG); ··· 2537 2459 DUMPREG(DISPC_TIMING_H(0)); 2538 2460 DUMPREG(DISPC_TIMING_V(0)); 2539 2461 DUMPREG(DISPC_POL_FREQ(0)); 2540 - DUMPREG(DISPC_DIVISOR(0)); 2462 + DUMPREG(DISPC_DIVISORo(0)); 2541 2463 DUMPREG(DISPC_GLOBAL_ALPHA); 2542 2464 DUMPREG(DISPC_SIZE_DIG); 2543 2465 DUMPREG(DISPC_SIZE_LCD(0)); ··· 2549 2471 DUMPREG(DISPC_TIMING_H(2)); 2550 2472 DUMPREG(DISPC_TIMING_V(2)); 2551 2473 DUMPREG(DISPC_POL_FREQ(2)); 2552 - DUMPREG(DISPC_DIVISOR(2)); 2474 + DUMPREG(DISPC_DIVISORo(2)); 2553 2475 DUMPREG(DISPC_SIZE_LCD(2)); 2554 2476 } 2555 2477 ··· 2675 2597 DUMPREG(DISPC_VID_PRELOAD(0)); 2676 2598 DUMPREG(DISPC_VID_PRELOAD(1)); 2677 2599 2678 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 2600 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 2679 2601 #undef DUMPREG 2680 2602 } 2681 2603 ··· 2791 2713 2792 2714 fck = dispc_fclk_rate(); 2793 2715 2794 - cinfo->lck_div = REG_GET(DISPC_DIVISOR(channel), 23, 16); 2795 - cinfo->pck_div = REG_GET(DISPC_DIVISOR(channel), 7, 0); 2716 + cinfo->lck_div = REG_GET(DISPC_DIVISORo(channel), 23, 16); 2717 + cinfo->pck_div = REG_GET(DISPC_DIVISORo(channel), 7, 0); 2796 2718 2797 2719 cinfo->lck = fck / cinfo->lck_div; 2798 2720 cinfo->pck = cinfo->lck / cinfo->pck_div; ··· 2869 2791 break; 2870 2792 } 2871 2793 2794 + if (ret) 2795 + goto err; 2796 + 2872 2797 _omap_dispc_set_irqs(); 2873 2798 2874 2799 spin_unlock_irqrestore(&dispc.irq_lock, flags); ··· 2947 2866 * but we presume they are on because we got an IRQ. However, 2948 2867 * an irq handler may turn the clocks off, so we may not have 2949 2868 * clock later in the function. */ 2950 - void dispc_irq_handler(void) 2869 + static irqreturn_t omap_dispc_irq_handler(int irq, void *arg) 2951 2870 { 2952 2871 int i; 2953 - u32 irqstatus; 2872 + u32 irqstatus, irqenable; 2954 2873 u32 handledirqs = 0; 2955 2874 u32 unhandled_errors; 2956 2875 struct omap_dispc_isr_data *isr_data; ··· 2959 2878 spin_lock(&dispc.irq_lock); 2960 2879 2961 2880 irqstatus = dispc_read_reg(DISPC_IRQSTATUS); 2881 + irqenable = dispc_read_reg(DISPC_IRQENABLE); 2882 + 2883 + /* IRQ is not for us */ 2884 + if (!(irqstatus & irqenable)) { 2885 + spin_unlock(&dispc.irq_lock); 2886 + return IRQ_NONE; 2887 + } 2962 2888 2963 2889 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 2964 2890 spin_lock(&dispc.irq_stats_lock); ··· 3017 2929 } 3018 2930 3019 2931 spin_unlock(&dispc.irq_lock); 2932 + 2933 + return IRQ_HANDLED; 3020 2934 } 3021 2935 3022 2936 static void dispc_error_worker(struct work_struct *work) ··· 3343 3253 l = FLD_MOD(l, 1, 0, 0); /* AUTOIDLE */ 3344 3254 dispc_write_reg(DISPC_SYSCONFIG, l); 3345 3255 3256 + /* Exclusively enable DISPC_CORE_CLK and set divider to 1 */ 3257 + if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 3258 + l = dispc_read_reg(DISPC_DIVISOR); 3259 + /* Use DISPC_DIVISOR.LCD, instead of DISPC_DIVISOR1.LCD */ 3260 + l = FLD_MOD(l, 1, 0, 0); 3261 + l = FLD_MOD(l, 1, 23, 16); 3262 + dispc_write_reg(DISPC_DIVISOR, l); 3263 + } 3264 + 3346 3265 /* FUNCGATED */ 3347 3266 if (dss_has_feature(FEAT_FUNCGATED)) 3348 3267 REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9); ··· 3366 3267 dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY); 3367 3268 3368 3269 dispc_read_plane_fifo_sizes(); 3369 - } 3370 - 3371 - int dispc_init(void) 3372 - { 3373 - u32 rev; 3374 - 3375 - spin_lock_init(&dispc.irq_lock); 3376 - 3377 - #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 3378 - spin_lock_init(&dispc.irq_stats_lock); 3379 - dispc.irq_stats.last_reset = jiffies; 3380 - #endif 3381 - 3382 - INIT_WORK(&dispc.error_work, dispc_error_worker); 3383 - 3384 - dispc.base = ioremap(DISPC_BASE, DISPC_SZ_REGS); 3385 - if (!dispc.base) { 3386 - DSSERR("can't ioremap DISPC\n"); 3387 - return -ENOMEM; 3388 - } 3389 - 3390 - enable_clocks(1); 3391 - 3392 - _omap_dispc_initial_config(); 3393 - 3394 - _omap_dispc_initialize_irq(); 3395 - 3396 - dispc_save_context(); 3397 - 3398 - rev = dispc_read_reg(DISPC_REVISION); 3399 - printk(KERN_INFO "OMAP DISPC rev %d.%d\n", 3400 - FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 3401 - 3402 - enable_clocks(0); 3403 - 3404 - return 0; 3405 - } 3406 - 3407 - void dispc_exit(void) 3408 - { 3409 - iounmap(dispc.base); 3410 3270 } 3411 3271 3412 3272 int dispc_enable_plane(enum omap_plane plane, bool enable) ··· 3416 3358 enable_clocks(0); 3417 3359 3418 3360 return r; 3361 + } 3362 + 3363 + /* DISPC HW IP initialisation */ 3364 + static int omap_dispchw_probe(struct platform_device *pdev) 3365 + { 3366 + u32 rev; 3367 + int r = 0; 3368 + struct resource *dispc_mem; 3369 + 3370 + dispc.pdev = pdev; 3371 + 3372 + spin_lock_init(&dispc.irq_lock); 3373 + 3374 + #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 3375 + spin_lock_init(&dispc.irq_stats_lock); 3376 + dispc.irq_stats.last_reset = jiffies; 3377 + #endif 3378 + 3379 + INIT_WORK(&dispc.error_work, dispc_error_worker); 3380 + 3381 + dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0); 3382 + if (!dispc_mem) { 3383 + DSSERR("can't get IORESOURCE_MEM DISPC\n"); 3384 + r = -EINVAL; 3385 + goto fail0; 3386 + } 3387 + dispc.base = ioremap(dispc_mem->start, resource_size(dispc_mem)); 3388 + if (!dispc.base) { 3389 + DSSERR("can't ioremap DISPC\n"); 3390 + r = -ENOMEM; 3391 + goto fail0; 3392 + } 3393 + dispc.irq = platform_get_irq(dispc.pdev, 0); 3394 + if (dispc.irq < 0) { 3395 + DSSERR("platform_get_irq failed\n"); 3396 + r = -ENODEV; 3397 + goto fail1; 3398 + } 3399 + 3400 + r = request_irq(dispc.irq, omap_dispc_irq_handler, IRQF_SHARED, 3401 + "OMAP DISPC", dispc.pdev); 3402 + if (r < 0) { 3403 + DSSERR("request_irq failed\n"); 3404 + goto fail1; 3405 + } 3406 + 3407 + enable_clocks(1); 3408 + 3409 + _omap_dispc_initial_config(); 3410 + 3411 + _omap_dispc_initialize_irq(); 3412 + 3413 + dispc_save_context(); 3414 + 3415 + rev = dispc_read_reg(DISPC_REVISION); 3416 + dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n", 3417 + FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 3418 + 3419 + enable_clocks(0); 3420 + 3421 + return 0; 3422 + fail1: 3423 + iounmap(dispc.base); 3424 + fail0: 3425 + return r; 3426 + } 3427 + 3428 + static int omap_dispchw_remove(struct platform_device *pdev) 3429 + { 3430 + free_irq(dispc.irq, dispc.pdev); 3431 + iounmap(dispc.base); 3432 + return 0; 3433 + } 3434 + 3435 + static struct platform_driver omap_dispchw_driver = { 3436 + .probe = omap_dispchw_probe, 3437 + .remove = omap_dispchw_remove, 3438 + .driver = { 3439 + .name = "omapdss_dispc", 3440 + .owner = THIS_MODULE, 3441 + }, 3442 + }; 3443 + 3444 + int dispc_init_platform_driver(void) 3445 + { 3446 + return platform_driver_register(&omap_dispchw_driver); 3447 + } 3448 + 3449 + void dispc_uninit_platform_driver(void) 3450 + { 3451 + return platform_driver_unregister(&omap_dispchw_driver); 3419 3452 }
+8 -27
drivers/video/omap2/dss/display.c
··· 25 25 #include <linux/kernel.h> 26 26 #include <linux/module.h> 27 27 #include <linux/jiffies.h> 28 - #include <linux/list.h> 29 28 #include <linux/platform_device.h> 30 29 31 30 #include <plat/display.h> 32 31 #include "dss.h" 33 - 34 - static LIST_HEAD(display_list); 35 32 36 33 static ssize_t display_enabled_show(struct device *dev, 37 34 struct device_attribute *attr, char *buf) ··· 342 345 return 16; 343 346 case OMAP_DISPLAY_TYPE_VENC: 344 347 case OMAP_DISPLAY_TYPE_SDI: 348 + case OMAP_DISPLAY_TYPE_HDMI: 345 349 return 24; 346 350 default: 347 351 BUG(); ··· 369 371 case OMAP_DISPLAY_TYPE_DPI: 370 372 bpp = dssdev->phy.dpi.data_lines; 371 373 break; 374 + case OMAP_DISPLAY_TYPE_HDMI: 372 375 case OMAP_DISPLAY_TYPE_VENC: 373 376 case OMAP_DISPLAY_TYPE_SDI: 374 377 bpp = 24; ··· 391 392 struct device_attribute *attr; 392 393 int i; 393 394 int r; 394 - 395 - switch (dssdev->type) { 396 - #ifdef CONFIG_OMAP2_DSS_DPI 397 - case OMAP_DISPLAY_TYPE_DPI: 398 - #endif 399 - #ifdef CONFIG_OMAP2_DSS_RFBI 400 - case OMAP_DISPLAY_TYPE_DBI: 401 - #endif 402 - #ifdef CONFIG_OMAP2_DSS_SDI 403 - case OMAP_DISPLAY_TYPE_SDI: 404 - #endif 405 - #ifdef CONFIG_OMAP2_DSS_DSI 406 - case OMAP_DISPLAY_TYPE_DSI: 407 - #endif 408 - #ifdef CONFIG_OMAP2_DSS_VENC 409 - case OMAP_DISPLAY_TYPE_VENC: 410 - #endif 411 - break; 412 - default: 413 - DSSERR("Support for display '%s' not compiled in.\n", 414 - dssdev->name); 415 - return; 416 - } 417 395 418 396 switch (dssdev->type) { 419 397 #ifdef CONFIG_OMAP2_DSS_DPI ··· 418 442 r = dsi_init_display(dssdev); 419 443 break; 420 444 #endif 445 + case OMAP_DISPLAY_TYPE_HDMI: 446 + r = hdmi_init_display(dssdev); 447 + break; 421 448 default: 422 - BUG(); 449 + DSSERR("Support for display '%s' not compiled in.\n", 450 + dssdev->name); 451 + return; 423 452 } 424 453 425 454 if (r) {
+26 -21
drivers/video/omap2/dss/dpi.c
··· 57 57 if (r) 58 58 return r; 59 59 60 - dss_select_dispc_clk_source(DSS_SRC_DSI1_PLL_FCLK); 60 + dss_select_dispc_clk_source(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC); 61 61 62 62 r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo); 63 63 if (r) 64 64 return r; 65 65 66 - *fck = dsi_cinfo.dsi1_pll_fclk; 66 + *fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk; 67 67 *lck_div = dispc_cinfo.lck_div; 68 68 *pck_div = dispc_cinfo.pck_div; 69 69 ··· 107 107 bool is_tft; 108 108 int r = 0; 109 109 110 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 110 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 111 111 112 112 dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config, 113 113 dssdev->panel.acbi, dssdev->panel.acb); ··· 137 137 dispc_set_lcd_timings(dssdev->manager->id, t); 138 138 139 139 err0: 140 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 140 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 141 141 return r; 142 142 } 143 143 ··· 173 173 goto err1; 174 174 } 175 175 176 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 176 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 177 177 178 178 r = dpi_basic_init(dssdev); 179 179 if (r) 180 180 goto err2; 181 181 182 182 #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL 183 - dss_clk_enable(DSS_CLK_FCK2); 183 + dss_clk_enable(DSS_CLK_SYSCK); 184 184 r = dsi_pll_init(dssdev, 0, 1); 185 185 if (r) 186 186 goto err3; ··· 199 199 #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL 200 200 dsi_pll_uninit(); 201 201 err3: 202 - dss_clk_disable(DSS_CLK_FCK2); 202 + dss_clk_disable(DSS_CLK_SYSCK); 203 203 #endif 204 204 err2: 205 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 205 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 206 206 if (cpu_is_omap34xx()) 207 207 regulator_disable(dpi.vdds_dsi_reg); 208 208 err1: ··· 217 217 dssdev->manager->disable(dssdev->manager); 218 218 219 219 #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL 220 - dss_select_dispc_clk_source(DSS_SRC_DSS1_ALWON_FCLK); 220 + dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); 221 221 dsi_pll_uninit(); 222 - dss_clk_disable(DSS_CLK_FCK2); 222 + dss_clk_disable(DSS_CLK_SYSCK); 223 223 #endif 224 224 225 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 225 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 226 226 227 227 if (cpu_is_omap34xx()) 228 228 regulator_disable(dpi.vdds_dsi_reg); ··· 271 271 if (r) 272 272 return r; 273 273 274 - fck = dsi_cinfo.dsi1_pll_fclk; 274 + fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk; 275 275 lck_div = dispc_cinfo.lck_div; 276 276 pck_div = dispc_cinfo.pck_div; 277 277 } ··· 303 303 { 304 304 DSSDBG("init_display\n"); 305 305 306 + if (cpu_is_omap34xx() && dpi.vdds_dsi_reg == NULL) { 307 + struct regulator *vdds_dsi; 308 + 309 + vdds_dsi = dss_get_vdds_dsi(); 310 + 311 + if (IS_ERR(vdds_dsi)) { 312 + DSSERR("can't get VDDS_DSI regulator\n"); 313 + return PTR_ERR(vdds_dsi); 314 + } 315 + 316 + dpi.vdds_dsi_reg = vdds_dsi; 317 + } 318 + 306 319 return 0; 307 320 } 308 321 309 - int dpi_init(struct platform_device *pdev) 322 + int dpi_init(void) 310 323 { 311 - if (cpu_is_omap34xx()) { 312 - dpi.vdds_dsi_reg = dss_get_vdds_dsi(); 313 - if (IS_ERR(dpi.vdds_dsi_reg)) { 314 - DSSERR("can't get VDDS_DSI regulator\n"); 315 - return PTR_ERR(dpi.vdds_dsi_reg); 316 - } 317 - } 318 - 319 324 return 0; 320 325 } 321 326
+727 -250
drivers/video/omap2/dss/dsi.c
··· 38 38 #include <plat/clock.h> 39 39 40 40 #include "dss.h" 41 + #include "dss_features.h" 41 42 42 43 /*#define VERBOSE_IRQ*/ 43 44 #define DSI_CATCH_MISSING_TE 44 - 45 - #define DSI_BASE 0x4804FC00 46 45 47 46 struct dsi_reg { u16 idx; }; 48 47 ··· 185 186 #define DSI_DT_RX_SHORT_READ_1 0x21 186 187 #define DSI_DT_RX_SHORT_READ_2 0x22 187 188 188 - #define FINT_MAX 2100000 189 - #define FINT_MIN 750000 190 - #define REGN_MAX (1 << 7) 191 - #define REGM_MAX ((1 << 11) - 1) 192 - #define REGM3_MAX (1 << 4) 193 - #define REGM4_MAX (1 << 4) 194 - #define LP_DIV_MAX ((1 << 13) - 1) 189 + typedef void (*omap_dsi_isr_t) (void *arg, u32 mask); 190 + 191 + #define DSI_MAX_NR_ISRS 2 192 + 193 + struct dsi_isr_data { 194 + omap_dsi_isr_t isr; 195 + void *arg; 196 + u32 mask; 197 + }; 195 198 196 199 enum fifo_size { 197 200 DSI_FIFO_SIZE_0 = 0, ··· 221 220 unsigned cio_irqs[32]; 222 221 }; 223 222 223 + struct dsi_isr_tables { 224 + struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS]; 225 + struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS]; 226 + struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS]; 227 + }; 228 + 224 229 static struct 225 230 { 231 + struct platform_device *pdev; 226 232 void __iomem *base; 233 + int irq; 227 234 228 235 struct dsi_clock_info current_cinfo; 229 236 ··· 241 232 enum dsi_vc_mode mode; 242 233 struct omap_dss_device *dssdev; 243 234 enum fifo_size fifo_size; 235 + int vc_id; 244 236 } vc[4]; 245 237 246 238 struct mutex lock; ··· 249 239 250 240 unsigned pll_locked; 251 241 252 - struct completion bta_completion; 253 - void (*bta_callback)(void); 242 + spinlock_t irq_lock; 243 + struct dsi_isr_tables isr_tables; 244 + /* space for a copy used by the interrupt handler */ 245 + struct dsi_isr_tables isr_tables_copy; 254 246 255 247 int update_channel; 256 248 struct dsi_update_region update_region; ··· 287 275 spinlock_t irq_stats_lock; 288 276 struct dsi_irq_stats irq_stats; 289 277 #endif 278 + /* DSI PLL Parameter Ranges */ 279 + unsigned long regm_max, regn_max; 280 + unsigned long regm_dispc_max, regm_dsi_max; 281 + unsigned long fint_min, fint_max; 282 + unsigned long lpdiv_max; 290 283 } dsi; 291 284 292 285 #ifdef DEBUG ··· 333 316 static bool dsi_bus_is_locked(void) 334 317 { 335 318 return dsi.bus_lock.count == 0; 319 + } 320 + 321 + static void dsi_completion_handler(void *data, u32 mask) 322 + { 323 + complete((struct completion *)data); 336 324 } 337 325 338 326 static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum, ··· 409 387 410 388 static void print_irq_status(u32 status) 411 389 { 390 + if (status == 0) 391 + return; 392 + 412 393 #ifndef VERBOSE_IRQ 413 394 if ((status & ~DSI_IRQ_CHANNEL_MASK) == 0) 414 395 return; ··· 447 422 448 423 static void print_irq_status_vc(int channel, u32 status) 449 424 { 425 + if (status == 0) 426 + return; 427 + 450 428 #ifndef VERBOSE_IRQ 451 429 if ((status & ~DSI_VC_IRQ_PACKET_SENT) == 0) 452 430 return; ··· 476 448 477 449 static void print_irq_status_cio(u32 status) 478 450 { 451 + if (status == 0) 452 + return; 453 + 479 454 printk(KERN_DEBUG "DSI CIO IRQ 0x%x: ", status); 480 455 481 456 #define PIS(x) \ ··· 509 478 printk("\n"); 510 479 } 511 480 512 - static int debug_irq; 513 - 514 - /* called from dss */ 515 - void dsi_irq_handler(void) 481 + #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 482 + static void dsi_collect_irq_stats(u32 irqstatus, u32 *vcstatus, u32 ciostatus) 516 483 { 517 - u32 irqstatus, vcstatus, ciostatus; 518 484 int i; 519 485 520 - irqstatus = dsi_read_reg(DSI_IRQSTATUS); 521 - 522 - #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 523 486 spin_lock(&dsi.irq_stats_lock); 487 + 524 488 dsi.irq_stats.irq_count++; 525 489 dss_collect_irq_stats(irqstatus, dsi.irq_stats.dsi_irqs); 490 + 491 + for (i = 0; i < 4; ++i) 492 + dss_collect_irq_stats(vcstatus[i], dsi.irq_stats.vc_irqs[i]); 493 + 494 + dss_collect_irq_stats(ciostatus, dsi.irq_stats.cio_irqs); 495 + 496 + spin_unlock(&dsi.irq_stats_lock); 497 + } 498 + #else 499 + #define dsi_collect_irq_stats(irqstatus, vcstatus, ciostatus) 526 500 #endif 501 + 502 + static int debug_irq; 503 + 504 + static void dsi_handle_irq_errors(u32 irqstatus, u32 *vcstatus, u32 ciostatus) 505 + { 506 + int i; 527 507 528 508 if (irqstatus & DSI_IRQ_ERROR_MASK) { 529 509 DSSERR("DSI error, irqstatus %x\n", irqstatus); ··· 546 504 print_irq_status(irqstatus); 547 505 } 548 506 549 - #ifdef DSI_CATCH_MISSING_TE 550 - if (irqstatus & DSI_IRQ_TE_TRIGGER) 551 - del_timer(&dsi.te_timer); 552 - #endif 507 + for (i = 0; i < 4; ++i) { 508 + if (vcstatus[i] & DSI_VC_IRQ_ERROR_MASK) { 509 + DSSERR("DSI VC(%d) error, vc irqstatus %x\n", 510 + i, vcstatus[i]); 511 + print_irq_status_vc(i, vcstatus[i]); 512 + } else if (debug_irq) { 513 + print_irq_status_vc(i, vcstatus[i]); 514 + } 515 + } 516 + 517 + if (ciostatus & DSI_CIO_IRQ_ERROR_MASK) { 518 + DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus); 519 + print_irq_status_cio(ciostatus); 520 + } else if (debug_irq) { 521 + print_irq_status_cio(ciostatus); 522 + } 523 + } 524 + 525 + static void dsi_call_isrs(struct dsi_isr_data *isr_array, 526 + unsigned isr_array_size, u32 irqstatus) 527 + { 528 + struct dsi_isr_data *isr_data; 529 + int i; 530 + 531 + for (i = 0; i < isr_array_size; i++) { 532 + isr_data = &isr_array[i]; 533 + if (isr_data->isr && isr_data->mask & irqstatus) 534 + isr_data->isr(isr_data->arg, irqstatus); 535 + } 536 + } 537 + 538 + static void dsi_handle_isrs(struct dsi_isr_tables *isr_tables, 539 + u32 irqstatus, u32 *vcstatus, u32 ciostatus) 540 + { 541 + int i; 542 + 543 + dsi_call_isrs(isr_tables->isr_table, 544 + ARRAY_SIZE(isr_tables->isr_table), 545 + irqstatus); 553 546 554 547 for (i = 0; i < 4; ++i) { 555 - if ((irqstatus & (1<<i)) == 0) 548 + if (vcstatus[i] == 0) 556 549 continue; 550 + dsi_call_isrs(isr_tables->isr_table_vc[i], 551 + ARRAY_SIZE(isr_tables->isr_table_vc[i]), 552 + vcstatus[i]); 553 + } 557 554 558 - vcstatus = dsi_read_reg(DSI_VC_IRQSTATUS(i)); 555 + if (ciostatus != 0) 556 + dsi_call_isrs(isr_tables->isr_table_cio, 557 + ARRAY_SIZE(isr_tables->isr_table_cio), 558 + ciostatus); 559 + } 559 560 560 - #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 561 - dss_collect_irq_stats(vcstatus, dsi.irq_stats.vc_irqs[i]); 562 - #endif 561 + static irqreturn_t omap_dsi_irq_handler(int irq, void *arg) 562 + { 563 + u32 irqstatus, vcstatus[4], ciostatus; 564 + int i; 563 565 564 - if (vcstatus & DSI_VC_IRQ_BTA) { 565 - complete(&dsi.bta_completion); 566 + spin_lock(&dsi.irq_lock); 566 567 567 - if (dsi.bta_callback) 568 - dsi.bta_callback(); 568 + irqstatus = dsi_read_reg(DSI_IRQSTATUS); 569 + 570 + /* IRQ is not for us */ 571 + if (!irqstatus) { 572 + spin_unlock(&dsi.irq_lock); 573 + return IRQ_NONE; 574 + } 575 + 576 + dsi_write_reg(DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK); 577 + /* flush posted write */ 578 + dsi_read_reg(DSI_IRQSTATUS); 579 + 580 + for (i = 0; i < 4; ++i) { 581 + if ((irqstatus & (1 << i)) == 0) { 582 + vcstatus[i] = 0; 583 + continue; 569 584 } 570 585 571 - if (vcstatus & DSI_VC_IRQ_ERROR_MASK) { 572 - DSSERR("DSI VC(%d) error, vc irqstatus %x\n", 573 - i, vcstatus); 574 - print_irq_status_vc(i, vcstatus); 575 - } else if (debug_irq) { 576 - print_irq_status_vc(i, vcstatus); 577 - } 586 + vcstatus[i] = dsi_read_reg(DSI_VC_IRQSTATUS(i)); 578 587 579 - dsi_write_reg(DSI_VC_IRQSTATUS(i), vcstatus); 588 + dsi_write_reg(DSI_VC_IRQSTATUS(i), vcstatus[i]); 580 589 /* flush posted write */ 581 590 dsi_read_reg(DSI_VC_IRQSTATUS(i)); 582 591 } ··· 635 542 if (irqstatus & DSI_IRQ_COMPLEXIO_ERR) { 636 543 ciostatus = dsi_read_reg(DSI_COMPLEXIO_IRQ_STATUS); 637 544 638 - #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 639 - dss_collect_irq_stats(ciostatus, dsi.irq_stats.cio_irqs); 640 - #endif 641 - 642 545 dsi_write_reg(DSI_COMPLEXIO_IRQ_STATUS, ciostatus); 643 546 /* flush posted write */ 644 547 dsi_read_reg(DSI_COMPLEXIO_IRQ_STATUS); 645 - 646 - if (ciostatus & DSI_CIO_IRQ_ERROR_MASK) { 647 - DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus); 648 - print_irq_status_cio(ciostatus); 649 - } else if (debug_irq) { 650 - print_irq_status_cio(ciostatus); 651 - } 548 + } else { 549 + ciostatus = 0; 652 550 } 653 551 654 - dsi_write_reg(DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK); 655 - /* flush posted write */ 656 - dsi_read_reg(DSI_IRQSTATUS); 657 - 658 - #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 659 - spin_unlock(&dsi.irq_stats_lock); 552 + #ifdef DSI_CATCH_MISSING_TE 553 + if (irqstatus & DSI_IRQ_TE_TRIGGER) 554 + del_timer(&dsi.te_timer); 660 555 #endif 556 + 557 + /* make a copy and unlock, so that isrs can unregister 558 + * themselves */ 559 + memcpy(&dsi.isr_tables_copy, &dsi.isr_tables, sizeof(dsi.isr_tables)); 560 + 561 + spin_unlock(&dsi.irq_lock); 562 + 563 + dsi_handle_isrs(&dsi.isr_tables_copy, irqstatus, vcstatus, ciostatus); 564 + 565 + dsi_handle_irq_errors(irqstatus, vcstatus, ciostatus); 566 + 567 + dsi_collect_irq_stats(irqstatus, vcstatus, ciostatus); 568 + 569 + return IRQ_HANDLED; 661 570 } 662 571 572 + /* dsi.irq_lock has to be locked by the caller */ 573 + static void _omap_dsi_configure_irqs(struct dsi_isr_data *isr_array, 574 + unsigned isr_array_size, u32 default_mask, 575 + const struct dsi_reg enable_reg, 576 + const struct dsi_reg status_reg) 577 + { 578 + struct dsi_isr_data *isr_data; 579 + u32 mask; 580 + u32 old_mask; 581 + int i; 582 + 583 + mask = default_mask; 584 + 585 + for (i = 0; i < isr_array_size; i++) { 586 + isr_data = &isr_array[i]; 587 + 588 + if (isr_data->isr == NULL) 589 + continue; 590 + 591 + mask |= isr_data->mask; 592 + } 593 + 594 + old_mask = dsi_read_reg(enable_reg); 595 + /* clear the irqstatus for newly enabled irqs */ 596 + dsi_write_reg(status_reg, (mask ^ old_mask) & mask); 597 + dsi_write_reg(enable_reg, mask); 598 + 599 + /* flush posted writes */ 600 + dsi_read_reg(enable_reg); 601 + dsi_read_reg(status_reg); 602 + } 603 + 604 + /* dsi.irq_lock has to be locked by the caller */ 605 + static void _omap_dsi_set_irqs(void) 606 + { 607 + u32 mask = DSI_IRQ_ERROR_MASK; 608 + #ifdef DSI_CATCH_MISSING_TE 609 + mask |= DSI_IRQ_TE_TRIGGER; 610 + #endif 611 + _omap_dsi_configure_irqs(dsi.isr_tables.isr_table, 612 + ARRAY_SIZE(dsi.isr_tables.isr_table), mask, 613 + DSI_IRQENABLE, DSI_IRQSTATUS); 614 + } 615 + 616 + /* dsi.irq_lock has to be locked by the caller */ 617 + static void _omap_dsi_set_irqs_vc(int vc) 618 + { 619 + _omap_dsi_configure_irqs(dsi.isr_tables.isr_table_vc[vc], 620 + ARRAY_SIZE(dsi.isr_tables.isr_table_vc[vc]), 621 + DSI_VC_IRQ_ERROR_MASK, 622 + DSI_VC_IRQENABLE(vc), DSI_VC_IRQSTATUS(vc)); 623 + } 624 + 625 + /* dsi.irq_lock has to be locked by the caller */ 626 + static void _omap_dsi_set_irqs_cio(void) 627 + { 628 + _omap_dsi_configure_irqs(dsi.isr_tables.isr_table_cio, 629 + ARRAY_SIZE(dsi.isr_tables.isr_table_cio), 630 + DSI_CIO_IRQ_ERROR_MASK, 631 + DSI_COMPLEXIO_IRQ_ENABLE, DSI_COMPLEXIO_IRQ_STATUS); 632 + } 663 633 664 634 static void _dsi_initialize_irq(void) 665 635 { 666 - u32 l; 636 + unsigned long flags; 637 + int vc; 638 + 639 + spin_lock_irqsave(&dsi.irq_lock, flags); 640 + 641 + memset(&dsi.isr_tables, 0, sizeof(dsi.isr_tables)); 642 + 643 + _omap_dsi_set_irqs(); 644 + for (vc = 0; vc < 4; ++vc) 645 + _omap_dsi_set_irqs_vc(vc); 646 + _omap_dsi_set_irqs_cio(); 647 + 648 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 649 + } 650 + 651 + static int _dsi_register_isr(omap_dsi_isr_t isr, void *arg, u32 mask, 652 + struct dsi_isr_data *isr_array, unsigned isr_array_size) 653 + { 654 + struct dsi_isr_data *isr_data; 655 + int free_idx; 667 656 int i; 668 657 669 - /* disable all interrupts */ 670 - dsi_write_reg(DSI_IRQENABLE, 0); 671 - for (i = 0; i < 4; ++i) 672 - dsi_write_reg(DSI_VC_IRQENABLE(i), 0); 673 - dsi_write_reg(DSI_COMPLEXIO_IRQ_ENABLE, 0); 658 + BUG_ON(isr == NULL); 674 659 675 - /* clear interrupt status */ 676 - l = dsi_read_reg(DSI_IRQSTATUS); 677 - dsi_write_reg(DSI_IRQSTATUS, l & ~DSI_IRQ_CHANNEL_MASK); 660 + /* check for duplicate entry and find a free slot */ 661 + free_idx = -1; 662 + for (i = 0; i < isr_array_size; i++) { 663 + isr_data = &isr_array[i]; 678 664 679 - for (i = 0; i < 4; ++i) { 680 - l = dsi_read_reg(DSI_VC_IRQSTATUS(i)); 681 - dsi_write_reg(DSI_VC_IRQSTATUS(i), l); 665 + if (isr_data->isr == isr && isr_data->arg == arg && 666 + isr_data->mask == mask) { 667 + return -EINVAL; 668 + } 669 + 670 + if (isr_data->isr == NULL && free_idx == -1) 671 + free_idx = i; 682 672 } 683 673 684 - l = dsi_read_reg(DSI_COMPLEXIO_IRQ_STATUS); 685 - dsi_write_reg(DSI_COMPLEXIO_IRQ_STATUS, l); 674 + if (free_idx == -1) 675 + return -EBUSY; 686 676 687 - /* enable error irqs */ 688 - l = DSI_IRQ_ERROR_MASK; 689 - #ifdef DSI_CATCH_MISSING_TE 690 - l |= DSI_IRQ_TE_TRIGGER; 691 - #endif 692 - dsi_write_reg(DSI_IRQENABLE, l); 677 + isr_data = &isr_array[free_idx]; 678 + isr_data->isr = isr; 679 + isr_data->arg = arg; 680 + isr_data->mask = mask; 693 681 694 - l = DSI_VC_IRQ_ERROR_MASK; 695 - for (i = 0; i < 4; ++i) 696 - dsi_write_reg(DSI_VC_IRQENABLE(i), l); 682 + return 0; 683 + } 697 684 698 - l = DSI_CIO_IRQ_ERROR_MASK; 699 - dsi_write_reg(DSI_COMPLEXIO_IRQ_ENABLE, l); 685 + static int _dsi_unregister_isr(omap_dsi_isr_t isr, void *arg, u32 mask, 686 + struct dsi_isr_data *isr_array, unsigned isr_array_size) 687 + { 688 + struct dsi_isr_data *isr_data; 689 + int i; 690 + 691 + for (i = 0; i < isr_array_size; i++) { 692 + isr_data = &isr_array[i]; 693 + if (isr_data->isr != isr || isr_data->arg != arg || 694 + isr_data->mask != mask) 695 + continue; 696 + 697 + isr_data->isr = NULL; 698 + isr_data->arg = NULL; 699 + isr_data->mask = 0; 700 + 701 + return 0; 702 + } 703 + 704 + return -EINVAL; 705 + } 706 + 707 + static int dsi_register_isr(omap_dsi_isr_t isr, void *arg, u32 mask) 708 + { 709 + unsigned long flags; 710 + int r; 711 + 712 + spin_lock_irqsave(&dsi.irq_lock, flags); 713 + 714 + r = _dsi_register_isr(isr, arg, mask, dsi.isr_tables.isr_table, 715 + ARRAY_SIZE(dsi.isr_tables.isr_table)); 716 + 717 + if (r == 0) 718 + _omap_dsi_set_irqs(); 719 + 720 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 721 + 722 + return r; 723 + } 724 + 725 + static int dsi_unregister_isr(omap_dsi_isr_t isr, void *arg, u32 mask) 726 + { 727 + unsigned long flags; 728 + int r; 729 + 730 + spin_lock_irqsave(&dsi.irq_lock, flags); 731 + 732 + r = _dsi_unregister_isr(isr, arg, mask, dsi.isr_tables.isr_table, 733 + ARRAY_SIZE(dsi.isr_tables.isr_table)); 734 + 735 + if (r == 0) 736 + _omap_dsi_set_irqs(); 737 + 738 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 739 + 740 + return r; 741 + } 742 + 743 + static int dsi_register_isr_vc(int channel, omap_dsi_isr_t isr, void *arg, 744 + u32 mask) 745 + { 746 + unsigned long flags; 747 + int r; 748 + 749 + spin_lock_irqsave(&dsi.irq_lock, flags); 750 + 751 + r = _dsi_register_isr(isr, arg, mask, 752 + dsi.isr_tables.isr_table_vc[channel], 753 + ARRAY_SIZE(dsi.isr_tables.isr_table_vc[channel])); 754 + 755 + if (r == 0) 756 + _omap_dsi_set_irqs_vc(channel); 757 + 758 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 759 + 760 + return r; 761 + } 762 + 763 + static int dsi_unregister_isr_vc(int channel, omap_dsi_isr_t isr, void *arg, 764 + u32 mask) 765 + { 766 + unsigned long flags; 767 + int r; 768 + 769 + spin_lock_irqsave(&dsi.irq_lock, flags); 770 + 771 + r = _dsi_unregister_isr(isr, arg, mask, 772 + dsi.isr_tables.isr_table_vc[channel], 773 + ARRAY_SIZE(dsi.isr_tables.isr_table_vc[channel])); 774 + 775 + if (r == 0) 776 + _omap_dsi_set_irqs_vc(channel); 777 + 778 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 779 + 780 + return r; 781 + } 782 + 783 + static int dsi_register_isr_cio(omap_dsi_isr_t isr, void *arg, u32 mask) 784 + { 785 + unsigned long flags; 786 + int r; 787 + 788 + spin_lock_irqsave(&dsi.irq_lock, flags); 789 + 790 + r = _dsi_register_isr(isr, arg, mask, dsi.isr_tables.isr_table_cio, 791 + ARRAY_SIZE(dsi.isr_tables.isr_table_cio)); 792 + 793 + if (r == 0) 794 + _omap_dsi_set_irqs_cio(); 795 + 796 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 797 + 798 + return r; 799 + } 800 + 801 + static int dsi_unregister_isr_cio(omap_dsi_isr_t isr, void *arg, u32 mask) 802 + { 803 + unsigned long flags; 804 + int r; 805 + 806 + spin_lock_irqsave(&dsi.irq_lock, flags); 807 + 808 + r = _dsi_unregister_isr(isr, arg, mask, dsi.isr_tables.isr_table_cio, 809 + ARRAY_SIZE(dsi.isr_tables.isr_table_cio)); 810 + 811 + if (r == 0) 812 + _omap_dsi_set_irqs_cio(); 813 + 814 + spin_unlock_irqrestore(&dsi.irq_lock, flags); 815 + 816 + return r; 700 817 } 701 818 702 819 static u32 dsi_get_errors(void) ··· 920 617 return e; 921 618 } 922 619 923 - static void dsi_vc_enable_bta_irq(int channel) 924 - { 925 - u32 l; 926 - 927 - dsi_write_reg(DSI_VC_IRQSTATUS(channel), DSI_VC_IRQ_BTA); 928 - 929 - l = dsi_read_reg(DSI_VC_IRQENABLE(channel)); 930 - l |= DSI_VC_IRQ_BTA; 931 - dsi_write_reg(DSI_VC_IRQENABLE(channel), l); 932 - } 933 - 934 - static void dsi_vc_disable_bta_irq(int channel) 935 - { 936 - u32 l; 937 - 938 - l = dsi_read_reg(DSI_VC_IRQENABLE(channel)); 939 - l &= ~DSI_VC_IRQ_BTA; 940 - dsi_write_reg(DSI_VC_IRQENABLE(channel), l); 941 - } 942 - 943 - /* DSI func clock. this could also be DSI2_PLL_FCLK */ 620 + /* DSI func clock. this could also be dsi_pll_hsdiv_dsi_clk */ 944 621 static inline void enable_clocks(bool enable) 945 622 { 946 623 if (enable) 947 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 624 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 948 625 else 949 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 626 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 950 627 } 951 628 952 629 /* source clock for DSI PLL. this could also be PCLKFREE */ 953 630 static inline void dsi_enable_pll_clock(bool enable) 954 631 { 955 632 if (enable) 956 - dss_clk_enable(DSS_CLK_FCK2); 633 + dss_clk_enable(DSS_CLK_SYSCK); 957 634 else 958 - dss_clk_disable(DSS_CLK_FCK2); 635 + dss_clk_disable(DSS_CLK_SYSCK); 959 636 960 637 if (enable && dsi.pll_locked) { 961 638 if (wait_for_bit_change(DSI_PLL_STATUS, 1, 1) != 1) ··· 990 707 return 0; 991 708 } 992 709 993 - unsigned long dsi_get_dsi1_pll_rate(void) 710 + unsigned long dsi_get_pll_hsdiv_dispc_rate(void) 994 711 { 995 - return dsi.current_cinfo.dsi1_pll_fclk; 712 + return dsi.current_cinfo.dsi_pll_hsdiv_dispc_clk; 996 713 } 997 714 998 - static unsigned long dsi_get_dsi2_pll_rate(void) 715 + static unsigned long dsi_get_pll_hsdiv_dsi_rate(void) 999 716 { 1000 - return dsi.current_cinfo.dsi2_pll_fclk; 717 + return dsi.current_cinfo.dsi_pll_hsdiv_dsi_clk; 1001 718 } 1002 719 1003 720 static unsigned long dsi_get_txbyteclkhs(void) ··· 1009 726 { 1010 727 unsigned long r; 1011 728 1012 - if (dss_get_dsi_clk_source() == DSS_SRC_DSS1_ALWON_FCLK) { 1013 - /* DSI FCLK source is DSS1_ALWON_FCK, which is dss1_fck */ 1014 - r = dss_clk_get_rate(DSS_CLK_FCK1); 729 + if (dss_get_dsi_clk_source() == DSS_CLK_SRC_FCK) { 730 + /* DSI FCLK source is DSS_CLK_FCK */ 731 + r = dss_clk_get_rate(DSS_CLK_FCK); 1015 732 } else { 1016 - /* DSI FCLK source is DSI2_PLL_FCLK */ 1017 - r = dsi_get_dsi2_pll_rate(); 733 + /* DSI FCLK source is dsi_pll_hsdiv_dsi_clk */ 734 + r = dsi_get_pll_hsdiv_dsi_rate(); 1018 735 } 1019 736 1020 737 return r; ··· 1028 745 1029 746 lp_clk_div = dssdev->phy.dsi.div.lp_clk_div; 1030 747 1031 - if (lp_clk_div == 0 || lp_clk_div > LP_DIV_MAX) 748 + if (lp_clk_div == 0 || lp_clk_div > dsi.lpdiv_max) 1032 749 return -EINVAL; 1033 750 1034 751 dsi_fclk = dsi_fclk_rate(); ··· 1078 795 static int dsi_calc_clock_rates(struct omap_dss_device *dssdev, 1079 796 struct dsi_clock_info *cinfo) 1080 797 { 1081 - if (cinfo->regn == 0 || cinfo->regn > REGN_MAX) 798 + if (cinfo->regn == 0 || cinfo->regn > dsi.regn_max) 1082 799 return -EINVAL; 1083 800 1084 - if (cinfo->regm == 0 || cinfo->regm > REGM_MAX) 801 + if (cinfo->regm == 0 || cinfo->regm > dsi.regm_max) 1085 802 return -EINVAL; 1086 803 1087 - if (cinfo->regm3 > REGM3_MAX) 804 + if (cinfo->regm_dispc > dsi.regm_dispc_max) 1088 805 return -EINVAL; 1089 806 1090 - if (cinfo->regm4 > REGM4_MAX) 807 + if (cinfo->regm_dsi > dsi.regm_dsi_max) 1091 808 return -EINVAL; 1092 809 1093 - if (cinfo->use_dss2_fck) { 1094 - cinfo->clkin = dss_clk_get_rate(DSS_CLK_FCK2); 810 + if (cinfo->use_sys_clk) { 811 + cinfo->clkin = dss_clk_get_rate(DSS_CLK_SYSCK); 1095 812 /* XXX it is unclear if highfreq should be used 1096 - * with DSS2_FCK source also */ 813 + * with DSS_SYS_CLK source also */ 1097 814 cinfo->highfreq = 0; 1098 815 } else { 1099 816 cinfo->clkin = dispc_pclk_rate(dssdev->manager->id); ··· 1106 823 1107 824 cinfo->fint = cinfo->clkin / (cinfo->regn * (cinfo->highfreq ? 2 : 1)); 1108 825 1109 - if (cinfo->fint > FINT_MAX || cinfo->fint < FINT_MIN) 826 + if (cinfo->fint > dsi.fint_max || cinfo->fint < dsi.fint_min) 1110 827 return -EINVAL; 1111 828 1112 829 cinfo->clkin4ddr = 2 * cinfo->regm * cinfo->fint; ··· 1114 831 if (cinfo->clkin4ddr > 1800 * 1000 * 1000) 1115 832 return -EINVAL; 1116 833 1117 - if (cinfo->regm3 > 0) 1118 - cinfo->dsi1_pll_fclk = cinfo->clkin4ddr / cinfo->regm3; 834 + if (cinfo->regm_dispc > 0) 835 + cinfo->dsi_pll_hsdiv_dispc_clk = 836 + cinfo->clkin4ddr / cinfo->regm_dispc; 1119 837 else 1120 - cinfo->dsi1_pll_fclk = 0; 838 + cinfo->dsi_pll_hsdiv_dispc_clk = 0; 1121 839 1122 - if (cinfo->regm4 > 0) 1123 - cinfo->dsi2_pll_fclk = cinfo->clkin4ddr / cinfo->regm4; 840 + if (cinfo->regm_dsi > 0) 841 + cinfo->dsi_pll_hsdiv_dsi_clk = 842 + cinfo->clkin4ddr / cinfo->regm_dsi; 1124 843 else 1125 - cinfo->dsi2_pll_fclk = 0; 844 + cinfo->dsi_pll_hsdiv_dsi_clk = 0; 1126 845 1127 846 return 0; 1128 847 } ··· 1137 852 struct dispc_clock_info best_dispc; 1138 853 int min_fck_per_pck; 1139 854 int match = 0; 1140 - unsigned long dss_clk_fck2; 855 + unsigned long dss_sys_clk, max_dss_fck; 1141 856 1142 - dss_clk_fck2 = dss_clk_get_rate(DSS_CLK_FCK2); 857 + dss_sys_clk = dss_clk_get_rate(DSS_CLK_SYSCK); 858 + 859 + max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK); 1143 860 1144 861 if (req_pck == dsi.cache_req_pck && 1145 - dsi.cache_cinfo.clkin == dss_clk_fck2) { 862 + dsi.cache_cinfo.clkin == dss_sys_clk) { 1146 863 DSSDBG("DSI clock info found from cache\n"); 1147 864 *dsi_cinfo = dsi.cache_cinfo; 1148 - dispc_find_clk_divs(is_tft, req_pck, dsi_cinfo->dsi1_pll_fclk, 1149 - dispc_cinfo); 865 + dispc_find_clk_divs(is_tft, req_pck, 866 + dsi_cinfo->dsi_pll_hsdiv_dispc_clk, dispc_cinfo); 1150 867 return 0; 1151 868 } 1152 869 1153 870 min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; 1154 871 1155 872 if (min_fck_per_pck && 1156 - req_pck * min_fck_per_pck > DISPC_MAX_FCK) { 873 + req_pck * min_fck_per_pck > max_dss_fck) { 1157 874 DSSERR("Requested pixel clock not possible with the current " 1158 875 "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " 1159 876 "the constraint off.\n"); ··· 1169 882 memset(&best_dispc, 0, sizeof(best_dispc)); 1170 883 1171 884 memset(&cur, 0, sizeof(cur)); 1172 - cur.clkin = dss_clk_fck2; 1173 - cur.use_dss2_fck = 1; 885 + cur.clkin = dss_sys_clk; 886 + cur.use_sys_clk = 1; 1174 887 cur.highfreq = 0; 1175 888 1176 889 /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ 1177 890 /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ 1178 891 /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ 1179 - for (cur.regn = 1; cur.regn < REGN_MAX; ++cur.regn) { 892 + for (cur.regn = 1; cur.regn < dsi.regn_max; ++cur.regn) { 1180 893 if (cur.highfreq == 0) 1181 894 cur.fint = cur.clkin / cur.regn; 1182 895 else 1183 896 cur.fint = cur.clkin / (2 * cur.regn); 1184 897 1185 - if (cur.fint > FINT_MAX || cur.fint < FINT_MIN) 898 + if (cur.fint > dsi.fint_max || cur.fint < dsi.fint_min) 1186 899 continue; 1187 900 1188 901 /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ 1189 - for (cur.regm = 1; cur.regm < REGM_MAX; ++cur.regm) { 902 + for (cur.regm = 1; cur.regm < dsi.regm_max; ++cur.regm) { 1190 903 unsigned long a, b; 1191 904 1192 905 a = 2 * cur.regm * (cur.clkin/1000); ··· 1196 909 if (cur.clkin4ddr > 1800 * 1000 * 1000) 1197 910 break; 1198 911 1199 - /* DSI1_PLL_FCLK(MHz) = DSIPHY(MHz) / regm3 < 173MHz */ 1200 - for (cur.regm3 = 1; cur.regm3 < REGM3_MAX; 1201 - ++cur.regm3) { 912 + /* dsi_pll_hsdiv_dispc_clk(MHz) = 913 + * DSIPHY(MHz) / regm_dispc < 173MHz/186Mhz */ 914 + for (cur.regm_dispc = 1; cur.regm_dispc < dsi.regm_dispc_max; 915 + ++cur.regm_dispc) { 1202 916 struct dispc_clock_info cur_dispc; 1203 - cur.dsi1_pll_fclk = cur.clkin4ddr / cur.regm3; 917 + cur.dsi_pll_hsdiv_dispc_clk = 918 + cur.clkin4ddr / cur.regm_dispc; 1204 919 1205 920 /* this will narrow down the search a bit, 1206 921 * but still give pixclocks below what was 1207 922 * requested */ 1208 - if (cur.dsi1_pll_fclk < req_pck) 923 + if (cur.dsi_pll_hsdiv_dispc_clk < req_pck) 1209 924 break; 1210 925 1211 - if (cur.dsi1_pll_fclk > DISPC_MAX_FCK) 926 + if (cur.dsi_pll_hsdiv_dispc_clk > max_dss_fck) 1212 927 continue; 1213 928 1214 929 if (min_fck_per_pck && 1215 - cur.dsi1_pll_fclk < 930 + cur.dsi_pll_hsdiv_dispc_clk < 1216 931 req_pck * min_fck_per_pck) 1217 932 continue; 1218 933 1219 934 match = 1; 1220 935 1221 936 dispc_find_clk_divs(is_tft, req_pck, 1222 - cur.dsi1_pll_fclk, 937 + cur.dsi_pll_hsdiv_dispc_clk, 1223 938 &cur_dispc); 1224 939 1225 940 if (abs(cur_dispc.pck - req_pck) < ··· 1250 961 return -EINVAL; 1251 962 } 1252 963 1253 - /* DSI2_PLL_FCLK (regm4) is not used */ 1254 - best.regm4 = 0; 1255 - best.dsi2_pll_fclk = 0; 964 + /* dsi_pll_hsdiv_dsi_clk (regm_dsi) is not used */ 965 + best.regm_dsi = 0; 966 + best.dsi_pll_hsdiv_dsi_clk = 0; 1256 967 1257 968 if (dsi_cinfo) 1258 969 *dsi_cinfo = best; ··· 1271 982 int r = 0; 1272 983 u32 l; 1273 984 int f; 985 + u8 regn_start, regn_end, regm_start, regm_end; 986 + u8 regm_dispc_start, regm_dispc_end, regm_dsi_start, regm_dsi_end; 1274 987 1275 988 DSSDBGF(); 1276 989 1277 990 dsi.current_cinfo.fint = cinfo->fint; 1278 991 dsi.current_cinfo.clkin4ddr = cinfo->clkin4ddr; 1279 - dsi.current_cinfo.dsi1_pll_fclk = cinfo->dsi1_pll_fclk; 1280 - dsi.current_cinfo.dsi2_pll_fclk = cinfo->dsi2_pll_fclk; 992 + dsi.current_cinfo.dsi_pll_hsdiv_dispc_clk = 993 + cinfo->dsi_pll_hsdiv_dispc_clk; 994 + dsi.current_cinfo.dsi_pll_hsdiv_dsi_clk = 995 + cinfo->dsi_pll_hsdiv_dsi_clk; 1281 996 1282 997 dsi.current_cinfo.regn = cinfo->regn; 1283 998 dsi.current_cinfo.regm = cinfo->regm; 1284 - dsi.current_cinfo.regm3 = cinfo->regm3; 1285 - dsi.current_cinfo.regm4 = cinfo->regm4; 999 + dsi.current_cinfo.regm_dispc = cinfo->regm_dispc; 1000 + dsi.current_cinfo.regm_dsi = cinfo->regm_dsi; 1286 1001 1287 1002 DSSDBG("DSI Fint %ld\n", cinfo->fint); 1288 1003 1289 1004 DSSDBG("clkin (%s) rate %ld, highfreq %d\n", 1290 - cinfo->use_dss2_fck ? "dss2_fck" : "pclkfree", 1005 + cinfo->use_sys_clk ? "dss_sys_clk" : "pclkfree", 1291 1006 cinfo->clkin, 1292 1007 cinfo->highfreq); 1293 1008 ··· 1308 1015 1309 1016 DSSDBG("Clock lane freq %ld Hz\n", cinfo->clkin4ddr / 4); 1310 1017 1311 - DSSDBG("regm3 = %d, dsi1_pll_fclk = %lu\n", 1312 - cinfo->regm3, cinfo->dsi1_pll_fclk); 1313 - DSSDBG("regm4 = %d, dsi2_pll_fclk = %lu\n", 1314 - cinfo->regm4, cinfo->dsi2_pll_fclk); 1018 + DSSDBG("regm_dispc = %d, %s (%s) = %lu\n", cinfo->regm_dispc, 1019 + dss_get_generic_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 1020 + dss_feat_get_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 1021 + cinfo->dsi_pll_hsdiv_dispc_clk); 1022 + DSSDBG("regm_dsi = %d, %s (%s) = %lu\n", cinfo->regm_dsi, 1023 + dss_get_generic_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 1024 + dss_feat_get_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 1025 + cinfo->dsi_pll_hsdiv_dsi_clk); 1026 + 1027 + dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGN, &regn_start, &regn_end); 1028 + dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM, &regm_start, &regm_end); 1029 + dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DISPC, &regm_dispc_start, 1030 + &regm_dispc_end); 1031 + dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DSI, &regm_dsi_start, 1032 + &regm_dsi_end); 1315 1033 1316 1034 REG_FLD_MOD(DSI_PLL_CONTROL, 0, 0, 0); /* DSI_PLL_AUTOMODE = manual */ 1317 1035 1318 1036 l = dsi_read_reg(DSI_PLL_CONFIGURATION1); 1319 1037 l = FLD_MOD(l, 1, 0, 0); /* DSI_PLL_STOPMODE */ 1320 - l = FLD_MOD(l, cinfo->regn - 1, 7, 1); /* DSI_PLL_REGN */ 1321 - l = FLD_MOD(l, cinfo->regm, 18, 8); /* DSI_PLL_REGM */ 1322 - l = FLD_MOD(l, cinfo->regm3 > 0 ? cinfo->regm3 - 1 : 0, 1323 - 22, 19); /* DSI_CLOCK_DIV */ 1324 - l = FLD_MOD(l, cinfo->regm4 > 0 ? cinfo->regm4 - 1 : 0, 1325 - 26, 23); /* DSIPROTO_CLOCK_DIV */ 1038 + /* DSI_PLL_REGN */ 1039 + l = FLD_MOD(l, cinfo->regn - 1, regn_start, regn_end); 1040 + /* DSI_PLL_REGM */ 1041 + l = FLD_MOD(l, cinfo->regm, regm_start, regm_end); 1042 + /* DSI_CLOCK_DIV */ 1043 + l = FLD_MOD(l, cinfo->regm_dispc > 0 ? cinfo->regm_dispc - 1 : 0, 1044 + regm_dispc_start, regm_dispc_end); 1045 + /* DSIPROTO_CLOCK_DIV */ 1046 + l = FLD_MOD(l, cinfo->regm_dsi > 0 ? cinfo->regm_dsi - 1 : 0, 1047 + regm_dsi_start, regm_dsi_end); 1326 1048 dsi_write_reg(DSI_PLL_CONFIGURATION1, l); 1327 1049 1328 - BUG_ON(cinfo->fint < 750000 || cinfo->fint > 2100000); 1050 + BUG_ON(cinfo->fint < dsi.fint_min || cinfo->fint > dsi.fint_max); 1329 1051 if (cinfo->fint < 1000000) 1330 1052 f = 0x3; 1331 1053 else if (cinfo->fint < 1250000) ··· 1354 1046 1355 1047 l = dsi_read_reg(DSI_PLL_CONFIGURATION2); 1356 1048 l = FLD_MOD(l, f, 4, 1); /* DSI_PLL_FREQSEL */ 1357 - l = FLD_MOD(l, cinfo->use_dss2_fck ? 0 : 1, 1049 + l = FLD_MOD(l, cinfo->use_sys_clk ? 0 : 1, 1358 1050 11, 11); /* DSI_PLL_CLKSEL */ 1359 1051 l = FLD_MOD(l, cinfo->highfreq, 1360 1052 12, 12); /* DSI_PLL_HIGHFREQ */ ··· 1408 1100 enum dsi_pll_power_state pwstate; 1409 1101 1410 1102 DSSDBG("PLL init\n"); 1103 + 1104 + #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL 1105 + /* 1106 + * HACK: this is just a quick hack to get the USE_DSI_PLL 1107 + * option working. USE_DSI_PLL is itself a big hack, and 1108 + * should be removed. 1109 + */ 1110 + if (dsi.vdds_dsi_reg == NULL) { 1111 + struct regulator *vdds_dsi; 1112 + 1113 + vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi"); 1114 + 1115 + if (IS_ERR(vdds_dsi)) { 1116 + DSSERR("can't get VDDS_DSI regulator\n"); 1117 + return PTR_ERR(vdds_dsi); 1118 + } 1119 + 1120 + dsi.vdds_dsi_reg = vdds_dsi; 1121 + } 1122 + #endif 1411 1123 1412 1124 enable_clocks(1); 1413 1125 dsi_enable_pll_clock(1); ··· 1490 1162 { 1491 1163 int clksel; 1492 1164 struct dsi_clock_info *cinfo = &dsi.current_cinfo; 1165 + enum dss_clk_source dispc_clk_src, dsi_clk_src; 1166 + 1167 + dispc_clk_src = dss_get_dispc_clk_source(); 1168 + dsi_clk_src = dss_get_dsi_clk_source(); 1493 1169 1494 1170 enable_clocks(1); 1495 1171 ··· 1503 1171 1504 1172 seq_printf(s, "dsi pll source = %s\n", 1505 1173 clksel == 0 ? 1506 - "dss2_alwon_fclk" : "pclkfree"); 1174 + "dss_sys_clk" : "pclkfree"); 1507 1175 1508 1176 seq_printf(s, "Fint\t\t%-16luregn %u\n", cinfo->fint, cinfo->regn); 1509 1177 1510 1178 seq_printf(s, "CLKIN4DDR\t%-16luregm %u\n", 1511 1179 cinfo->clkin4ddr, cinfo->regm); 1512 1180 1513 - seq_printf(s, "dsi1_pll_fck\t%-16luregm3 %u\t(%s)\n", 1514 - cinfo->dsi1_pll_fclk, 1515 - cinfo->regm3, 1516 - dss_get_dispc_clk_source() == DSS_SRC_DSS1_ALWON_FCLK ? 1181 + seq_printf(s, "%s (%s)\t%-16luregm_dispc %u\t(%s)\n", 1182 + dss_get_generic_clk_source_name(dispc_clk_src), 1183 + dss_feat_get_clk_source_name(dispc_clk_src), 1184 + cinfo->dsi_pll_hsdiv_dispc_clk, 1185 + cinfo->regm_dispc, 1186 + dispc_clk_src == DSS_CLK_SRC_FCK ? 1517 1187 "off" : "on"); 1518 1188 1519 - seq_printf(s, "dsi2_pll_fck\t%-16luregm4 %u\t(%s)\n", 1520 - cinfo->dsi2_pll_fclk, 1521 - cinfo->regm4, 1522 - dss_get_dsi_clk_source() == DSS_SRC_DSS1_ALWON_FCLK ? 1189 + seq_printf(s, "%s (%s)\t%-16luregm_dsi %u\t(%s)\n", 1190 + dss_get_generic_clk_source_name(dsi_clk_src), 1191 + dss_feat_get_clk_source_name(dsi_clk_src), 1192 + cinfo->dsi_pll_hsdiv_dsi_clk, 1193 + cinfo->regm_dsi, 1194 + dsi_clk_src == DSS_CLK_SRC_FCK ? 1523 1195 "off" : "on"); 1524 1196 1525 1197 seq_printf(s, "- DSI -\n"); 1526 1198 1527 - seq_printf(s, "dsi fclk source = %s\n", 1528 - dss_get_dsi_clk_source() == DSS_SRC_DSS1_ALWON_FCLK ? 1529 - "dss1_alwon_fclk" : "dsi2_pll_fclk"); 1199 + seq_printf(s, "dsi fclk source = %s (%s)\n", 1200 + dss_get_generic_clk_source_name(dsi_clk_src), 1201 + dss_feat_get_clk_source_name(dsi_clk_src)); 1530 1202 1531 1203 seq_printf(s, "DSI_FCLK\t%lu\n", dsi_fclk_rate()); 1532 1204 ··· 1642 1306 { 1643 1307 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(r)) 1644 1308 1645 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 1309 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 1646 1310 1647 1311 DUMPREG(DSI_REVISION); 1648 1312 DUMPREG(DSI_SYSCONFIG); ··· 1714 1378 DUMPREG(DSI_PLL_CONFIGURATION1); 1715 1379 DUMPREG(DSI_PLL_CONFIGURATION2); 1716 1380 1717 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 1381 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 1718 1382 #undef DUMPREG 1719 1383 } 1720 1384 ··· 1958 1622 return _dsi_wait_reset(); 1959 1623 } 1960 1624 1961 - static void dsi_reset_tx_fifo(int channel) 1962 - { 1963 - u32 mask; 1964 - u32 l; 1965 - 1966 - /* set fifosize of the channel to 0, then return the old size */ 1967 - l = dsi_read_reg(DSI_TX_FIFO_VC_SIZE); 1968 - 1969 - mask = FLD_MASK((8 * channel) + 7, (8 * channel) + 4); 1970 - dsi_write_reg(DSI_TX_FIFO_VC_SIZE, l & ~mask); 1971 - 1972 - dsi_write_reg(DSI_TX_FIFO_VC_SIZE, l); 1973 - } 1974 - 1975 1625 static void dsi_config_tx_fifo(enum fifo_size size1, enum fifo_size size2, 1976 1626 enum fifo_size size3, enum fifo_size size4) 1977 1627 { ··· 2075 1753 r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ 2076 1754 2077 1755 dsi_write_reg(DSI_VC_CTRL(channel), r); 2078 - 2079 - dsi.vc[channel].mode = DSI_VC_MODE_L4; 2080 1756 } 2081 1757 2082 1758 static int dsi_vc_config_l4(int channel) ··· 2242 1922 2243 1923 int dsi_vc_send_bta_sync(int channel) 2244 1924 { 1925 + DECLARE_COMPLETION_ONSTACK(completion); 2245 1926 int r = 0; 2246 1927 u32 err; 2247 1928 2248 - INIT_COMPLETION(dsi.bta_completion); 1929 + r = dsi_register_isr_vc(channel, dsi_completion_handler, 1930 + &completion, DSI_VC_IRQ_BTA); 1931 + if (r) 1932 + goto err0; 2249 1933 2250 - dsi_vc_enable_bta_irq(channel); 1934 + r = dsi_register_isr(dsi_completion_handler, &completion, 1935 + DSI_IRQ_ERROR_MASK); 1936 + if (r) 1937 + goto err1; 2251 1938 2252 1939 r = dsi_vc_send_bta(channel); 2253 1940 if (r) 2254 - goto err; 1941 + goto err2; 2255 1942 2256 - if (wait_for_completion_timeout(&dsi.bta_completion, 1943 + if (wait_for_completion_timeout(&completion, 2257 1944 msecs_to_jiffies(500)) == 0) { 2258 1945 DSSERR("Failed to receive BTA\n"); 2259 1946 r = -EIO; 2260 - goto err; 1947 + goto err2; 2261 1948 } 2262 1949 2263 1950 err = dsi_get_errors(); 2264 1951 if (err) { 2265 1952 DSSERR("Error while sending BTA: %x\n", err); 2266 1953 r = -EIO; 2267 - goto err; 1954 + goto err2; 2268 1955 } 2269 - err: 2270 - dsi_vc_disable_bta_irq(channel); 2271 - 1956 + err2: 1957 + dsi_unregister_isr(dsi_completion_handler, &completion, 1958 + DSI_IRQ_ERROR_MASK); 1959 + err1: 1960 + dsi_unregister_isr_vc(channel, dsi_completion_handler, 1961 + &completion, DSI_VC_IRQ_BTA); 1962 + err0: 2272 1963 return r; 2273 1964 } 2274 1965 EXPORT_SYMBOL(dsi_vc_send_bta_sync); ··· 2292 1961 2293 1962 WARN_ON(!dsi_bus_is_locked()); 2294 1963 2295 - data_id = data_type | channel << 6; 1964 + data_id = data_type | dsi.vc[channel].vc_id << 6; 2296 1965 2297 1966 val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) | 2298 1967 FLD_VAL(ecc, 31, 24); ··· 2395 2064 return -EINVAL; 2396 2065 } 2397 2066 2398 - data_id = data_type | channel << 6; 2067 + data_id = data_type | dsi.vc[channel].vc_id << 6; 2399 2068 2400 2069 r = (data_id << 0) | (data << 8) | (ecc << 24); 2401 2070 ··· 3093 2762 } 3094 2763 #endif 3095 2764 2765 + static void dsi_framedone_bta_callback(void *data, u32 mask); 2766 + 3096 2767 static void dsi_handle_framedone(int error) 3097 2768 { 3098 2769 const int channel = dsi.update_channel; 3099 2770 3100 - cancel_delayed_work(&dsi.framedone_timeout_work); 2771 + dsi_unregister_isr_vc(channel, dsi_framedone_bta_callback, 2772 + NULL, DSI_VC_IRQ_BTA); 3101 2773 3102 - dsi_vc_disable_bta_irq(channel); 2774 + cancel_delayed_work(&dsi.framedone_timeout_work); 3103 2775 3104 2776 /* SIDLEMODE back to smart-idle */ 3105 2777 dispc_enable_sidle(); 3106 - 3107 - dsi.bta_callback = NULL; 3108 2778 3109 2779 if (dsi.te_enabled) { 3110 2780 /* enable LP_RX_TO again after the TE */ ··· 3140 2808 dsi_handle_framedone(-ETIMEDOUT); 3141 2809 } 3142 2810 3143 - static void dsi_framedone_bta_callback(void) 2811 + static void dsi_framedone_bta_callback(void *data, u32 mask) 3144 2812 { 3145 2813 dsi_handle_framedone(0); 3146 2814 ··· 3180 2848 * asynchronously. 3181 2849 * */ 3182 2850 3183 - dsi.bta_callback = dsi_framedone_bta_callback; 3184 - 3185 - barrier(); 3186 - 3187 - dsi_vc_enable_bta_irq(channel); 2851 + r = dsi_register_isr_vc(channel, dsi_framedone_bta_callback, 2852 + NULL, DSI_VC_IRQ_BTA); 2853 + if (r) { 2854 + DSSERR("Failed to register BTA ISR\n"); 2855 + dsi_handle_framedone(-EIO); 2856 + return; 2857 + } 3188 2858 3189 2859 r = dsi_vc_send_bta(channel); 3190 2860 if (r) { 3191 2861 DSSERR("BTA after framedone failed\n"); 2862 + dsi_unregister_isr_vc(channel, dsi_framedone_bta_callback, 2863 + NULL, DSI_VC_IRQ_BTA); 3192 2864 dsi_handle_framedone(-EIO); 3193 2865 } 3194 2866 } ··· 3320 2984 struct dsi_clock_info cinfo; 3321 2985 int r; 3322 2986 3323 - /* we always use DSS2_FCK as input clock */ 3324 - cinfo.use_dss2_fck = true; 2987 + /* we always use DSS_CLK_SYSCK as input clock */ 2988 + cinfo.use_sys_clk = true; 3325 2989 cinfo.regn = dssdev->phy.dsi.div.regn; 3326 2990 cinfo.regm = dssdev->phy.dsi.div.regm; 3327 - cinfo.regm3 = dssdev->phy.dsi.div.regm3; 3328 - cinfo.regm4 = dssdev->phy.dsi.div.regm4; 2991 + cinfo.regm_dispc = dssdev->phy.dsi.div.regm_dispc; 2992 + cinfo.regm_dsi = dssdev->phy.dsi.div.regm_dsi; 3329 2993 r = dsi_calc_clock_rates(dssdev, &cinfo); 3330 2994 if (r) { 3331 2995 DSSERR("Failed to calc dsi clocks\n"); ··· 3347 3011 int r; 3348 3012 unsigned long long fck; 3349 3013 3350 - fck = dsi_get_dsi1_pll_rate(); 3014 + fck = dsi_get_pll_hsdiv_dispc_rate(); 3351 3015 3352 3016 dispc_cinfo.lck_div = dssdev->phy.dsi.div.lck_div; 3353 3017 dispc_cinfo.pck_div = dssdev->phy.dsi.div.pck_div; ··· 3381 3045 if (r) 3382 3046 goto err1; 3383 3047 3384 - dss_select_dispc_clk_source(DSS_SRC_DSI1_PLL_FCLK); 3385 - dss_select_dsi_clk_source(DSS_SRC_DSI2_PLL_FCLK); 3048 + dss_select_dispc_clk_source(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC); 3049 + dss_select_dsi_clk_source(DSS_CLK_SRC_DSI_PLL_HSDIV_DSI); 3386 3050 3387 3051 DSSDBG("PLL OK\n"); 3388 3052 ··· 3418 3082 err3: 3419 3083 dsi_complexio_uninit(); 3420 3084 err2: 3421 - dss_select_dispc_clk_source(DSS_SRC_DSS1_ALWON_FCLK); 3422 - dss_select_dsi_clk_source(DSS_SRC_DSS1_ALWON_FCLK); 3085 + dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); 3086 + dss_select_dsi_clk_source(DSS_CLK_SRC_FCK); 3423 3087 err1: 3424 3088 dsi_pll_uninit(); 3425 3089 err0: ··· 3435 3099 dsi_vc_enable(2, 0); 3436 3100 dsi_vc_enable(3, 0); 3437 3101 3438 - dss_select_dispc_clk_source(DSS_SRC_DSS1_ALWON_FCLK); 3439 - dss_select_dsi_clk_source(DSS_SRC_DSS1_ALWON_FCLK); 3102 + dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); 3103 + dss_select_dsi_clk_source(DSS_CLK_SRC_FCK); 3440 3104 dsi_complexio_uninit(); 3441 3105 dsi_pll_uninit(); 3442 3106 } ··· 3556 3220 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | 3557 3221 OMAP_DSS_DISPLAY_CAP_TEAR_ELIM; 3558 3222 3559 - dsi.vc[0].dssdev = dssdev; 3560 - dsi.vc[1].dssdev = dssdev; 3223 + if (dsi.vdds_dsi_reg == NULL) { 3224 + struct regulator *vdds_dsi; 3225 + 3226 + vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi"); 3227 + 3228 + if (IS_ERR(vdds_dsi)) { 3229 + DSSERR("can't get VDDS_DSI regulator\n"); 3230 + return PTR_ERR(vdds_dsi); 3231 + } 3232 + 3233 + dsi.vdds_dsi_reg = vdds_dsi; 3234 + } 3561 3235 3562 3236 return 0; 3563 3237 } 3564 3238 3565 - void dsi_wait_dsi1_pll_active(void) 3239 + int omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel) 3240 + { 3241 + int i; 3242 + 3243 + for (i = 0; i < ARRAY_SIZE(dsi.vc); i++) { 3244 + if (!dsi.vc[i].dssdev) { 3245 + dsi.vc[i].dssdev = dssdev; 3246 + *channel = i; 3247 + return 0; 3248 + } 3249 + } 3250 + 3251 + DSSERR("cannot get VC for display %s", dssdev->name); 3252 + return -ENOSPC; 3253 + } 3254 + EXPORT_SYMBOL(omap_dsi_request_vc); 3255 + 3256 + int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id) 3257 + { 3258 + if (vc_id < 0 || vc_id > 3) { 3259 + DSSERR("VC ID out of range\n"); 3260 + return -EINVAL; 3261 + } 3262 + 3263 + if (channel < 0 || channel > 3) { 3264 + DSSERR("Virtual Channel out of range\n"); 3265 + return -EINVAL; 3266 + } 3267 + 3268 + if (dsi.vc[channel].dssdev != dssdev) { 3269 + DSSERR("Virtual Channel not allocated to display %s\n", 3270 + dssdev->name); 3271 + return -EINVAL; 3272 + } 3273 + 3274 + dsi.vc[channel].vc_id = vc_id; 3275 + 3276 + return 0; 3277 + } 3278 + EXPORT_SYMBOL(omap_dsi_set_vc_id); 3279 + 3280 + void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel) 3281 + { 3282 + if ((channel >= 0 && channel <= 3) && 3283 + dsi.vc[channel].dssdev == dssdev) { 3284 + dsi.vc[channel].dssdev = NULL; 3285 + dsi.vc[channel].vc_id = 0; 3286 + } 3287 + } 3288 + EXPORT_SYMBOL(omap_dsi_release_vc); 3289 + 3290 + void dsi_wait_pll_hsdiv_dispc_active(void) 3566 3291 { 3567 3292 if (wait_for_bit_change(DSI_PLL_STATUS, 7, 1) != 1) 3568 - DSSERR("DSI1 PLL clock not active\n"); 3293 + DSSERR("%s (%s) not active\n", 3294 + dss_get_generic_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 3295 + dss_feat_get_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC)); 3569 3296 } 3570 3297 3571 - void dsi_wait_dsi2_pll_active(void) 3298 + void dsi_wait_pll_hsdiv_dsi_active(void) 3572 3299 { 3573 3300 if (wait_for_bit_change(DSI_PLL_STATUS, 8, 1) != 1) 3574 - DSSERR("DSI2 PLL clock not active\n"); 3301 + DSSERR("%s (%s) not active\n", 3302 + dss_get_generic_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 3303 + dss_feat_get_clk_source_name(DSS_CLK_SRC_DSI_PLL_HSDIV_DSI)); 3575 3304 } 3576 3305 3577 - int dsi_init(struct platform_device *pdev) 3306 + static void dsi_calc_clock_param_ranges(void) 3307 + { 3308 + dsi.regn_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGN); 3309 + dsi.regm_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM); 3310 + dsi.regm_dispc_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DISPC); 3311 + dsi.regm_dsi_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DSI); 3312 + dsi.fint_min = dss_feat_get_param_min(FEAT_PARAM_DSIPLL_FINT); 3313 + dsi.fint_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_FINT); 3314 + dsi.lpdiv_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_LPDIV); 3315 + } 3316 + 3317 + static int dsi_init(struct platform_device *pdev) 3578 3318 { 3579 3319 u32 rev; 3580 - int r; 3320 + int r, i; 3321 + struct resource *dsi_mem; 3581 3322 3323 + spin_lock_init(&dsi.irq_lock); 3582 3324 spin_lock_init(&dsi.errors_lock); 3583 3325 dsi.errors = 0; 3584 3326 ··· 3664 3250 spin_lock_init(&dsi.irq_stats_lock); 3665 3251 dsi.irq_stats.last_reset = jiffies; 3666 3252 #endif 3667 - 3668 - init_completion(&dsi.bta_completion); 3669 3253 3670 3254 mutex_init(&dsi.lock); 3671 3255 sema_init(&dsi.bus_lock, 1); ··· 3680 3268 dsi.te_timer.function = dsi_te_timeout; 3681 3269 dsi.te_timer.data = 0; 3682 3270 #endif 3683 - dsi.base = ioremap(DSI_BASE, DSI_SZ_REGS); 3271 + dsi_mem = platform_get_resource(dsi.pdev, IORESOURCE_MEM, 0); 3272 + if (!dsi_mem) { 3273 + DSSERR("can't get IORESOURCE_MEM DSI\n"); 3274 + r = -EINVAL; 3275 + goto err1; 3276 + } 3277 + dsi.base = ioremap(dsi_mem->start, resource_size(dsi_mem)); 3684 3278 if (!dsi.base) { 3685 3279 DSSERR("can't ioremap DSI\n"); 3686 3280 r = -ENOMEM; 3687 3281 goto err1; 3688 3282 } 3689 - 3690 - dsi.vdds_dsi_reg = dss_get_vdds_dsi(); 3691 - if (IS_ERR(dsi.vdds_dsi_reg)) { 3692 - DSSERR("can't get VDDS_DSI regulator\n"); 3693 - r = PTR_ERR(dsi.vdds_dsi_reg); 3283 + dsi.irq = platform_get_irq(dsi.pdev, 0); 3284 + if (dsi.irq < 0) { 3285 + DSSERR("platform_get_irq failed\n"); 3286 + r = -ENODEV; 3694 3287 goto err2; 3695 3288 } 3289 + 3290 + r = request_irq(dsi.irq, omap_dsi_irq_handler, IRQF_SHARED, 3291 + "OMAP DSI1", dsi.pdev); 3292 + if (r < 0) { 3293 + DSSERR("request_irq failed\n"); 3294 + goto err2; 3295 + } 3296 + 3297 + /* DSI VCs initialization */ 3298 + for (i = 0; i < ARRAY_SIZE(dsi.vc); i++) { 3299 + dsi.vc[i].mode = DSI_VC_MODE_L4; 3300 + dsi.vc[i].dssdev = NULL; 3301 + dsi.vc[i].vc_id = 0; 3302 + } 3303 + 3304 + dsi_calc_clock_param_ranges(); 3696 3305 3697 3306 enable_clocks(1); 3698 3307 3699 3308 rev = dsi_read_reg(DSI_REVISION); 3700 - printk(KERN_INFO "OMAP DSI rev %d.%d\n", 3309 + dev_dbg(&pdev->dev, "OMAP DSI rev %d.%d\n", 3701 3310 FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 3702 3311 3703 3312 enable_clocks(0); ··· 3731 3298 return r; 3732 3299 } 3733 3300 3734 - void dsi_exit(void) 3301 + static void dsi_exit(void) 3735 3302 { 3303 + if (dsi.vdds_dsi_reg != NULL) { 3304 + regulator_put(dsi.vdds_dsi_reg); 3305 + dsi.vdds_dsi_reg = NULL; 3306 + } 3307 + 3308 + free_irq(dsi.irq, dsi.pdev); 3736 3309 iounmap(dsi.base); 3737 3310 3738 3311 destroy_workqueue(dsi.workqueue); ··· 3746 3307 DSSDBG("omap_dsi_exit\n"); 3747 3308 } 3748 3309 3310 + /* DSI1 HW IP initialisation */ 3311 + static int omap_dsi1hw_probe(struct platform_device *pdev) 3312 + { 3313 + int r; 3314 + dsi.pdev = pdev; 3315 + r = dsi_init(pdev); 3316 + if (r) { 3317 + DSSERR("Failed to initialize DSI\n"); 3318 + goto err_dsi; 3319 + } 3320 + err_dsi: 3321 + return r; 3322 + } 3323 + 3324 + static int omap_dsi1hw_remove(struct platform_device *pdev) 3325 + { 3326 + dsi_exit(); 3327 + return 0; 3328 + } 3329 + 3330 + static struct platform_driver omap_dsi1hw_driver = { 3331 + .probe = omap_dsi1hw_probe, 3332 + .remove = omap_dsi1hw_remove, 3333 + .driver = { 3334 + .name = "omapdss_dsi1", 3335 + .owner = THIS_MODULE, 3336 + }, 3337 + }; 3338 + 3339 + int dsi_init_platform_driver(void) 3340 + { 3341 + return platform_driver_register(&omap_dsi1hw_driver); 3342 + } 3343 + 3344 + void dsi_uninit_platform_driver(void) 3345 + { 3346 + return platform_driver_unregister(&omap_dsi1hw_driver); 3347 + }
+624 -137
drivers/video/omap2/dss/dss.c
··· 26 26 #include <linux/io.h> 27 27 #include <linux/err.h> 28 28 #include <linux/delay.h> 29 - #include <linux/interrupt.h> 30 29 #include <linux/seq_file.h> 31 30 #include <linux/clk.h> 32 31 33 32 #include <plat/display.h> 33 + #include <plat/clock.h> 34 34 #include "dss.h" 35 - 36 - #define DSS_BASE 0x48050000 35 + #include "dss_features.h" 37 36 38 37 #define DSS_SZ_REGS SZ_512 39 38 ··· 58 59 dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) 59 60 60 61 static struct { 62 + struct platform_device *pdev; 61 63 void __iomem *base; 64 + int ctx_id; 62 65 63 66 struct clk *dpll4_m4_ck; 67 + struct clk *dss_ick; 68 + struct clk *dss_fck; 69 + struct clk *dss_sys_clk; 70 + struct clk *dss_tv_fck; 71 + struct clk *dss_video_fck; 72 + unsigned num_clks_enabled; 64 73 65 74 unsigned long cache_req_pck; 66 75 unsigned long cache_prate; ··· 77 70 78 71 enum dss_clk_source dsi_clk_source; 79 72 enum dss_clk_source dispc_clk_source; 73 + enum dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS]; 80 74 81 75 u32 ctx[DSS_SZ_REGS / sizeof(u32)]; 82 76 } dss; 77 + 78 + static const char * const dss_generic_clk_source_names[] = { 79 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC", 80 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI", 81 + [DSS_CLK_SRC_FCK] = "DSS_FCK", 82 + }; 83 + 84 + static void dss_clk_enable_all_no_ctx(void); 85 + static void dss_clk_disable_all_no_ctx(void); 86 + static void dss_clk_enable_no_ctx(enum dss_clock clks); 87 + static void dss_clk_disable_no_ctx(enum dss_clock clks); 83 88 84 89 static int _omap_dss_wait_reset(void); 85 90 ··· 118 99 SR(SYSCONFIG); 119 100 SR(CONTROL); 120 101 121 - #ifdef CONFIG_OMAP2_DSS_SDI 122 - SR(SDI_CONTROL); 123 - SR(PLL_CONTROL); 124 - #endif 102 + if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 103 + OMAP_DISPLAY_TYPE_SDI) { 104 + SR(SDI_CONTROL); 105 + SR(PLL_CONTROL); 106 + } 125 107 } 126 108 127 109 void dss_restore_context(void) ··· 133 113 RR(SYSCONFIG); 134 114 RR(CONTROL); 135 115 136 - #ifdef CONFIG_OMAP2_DSS_SDI 137 - RR(SDI_CONTROL); 138 - RR(PLL_CONTROL); 139 - #endif 116 + if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 117 + OMAP_DISPLAY_TYPE_SDI) { 118 + RR(SDI_CONTROL); 119 + RR(PLL_CONTROL); 120 + } 140 121 } 141 122 142 123 #undef SR ··· 230 209 REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ 231 210 } 232 211 212 + const char *dss_get_generic_clk_source_name(enum dss_clk_source clk_src) 213 + { 214 + return dss_generic_clk_source_names[clk_src]; 215 + } 216 + 233 217 void dss_dump_clocks(struct seq_file *s) 234 218 { 235 219 unsigned long dpll4_ck_rate; 236 220 unsigned long dpll4_m4_ck_rate; 221 + const char *fclk_name, *fclk_real_name; 222 + unsigned long fclk_rate; 237 223 238 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 239 - 240 - dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 241 - dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck); 224 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 242 225 243 226 seq_printf(s, "- DSS -\n"); 244 227 245 - seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate); 228 + fclk_name = dss_get_generic_clk_source_name(DSS_CLK_SRC_FCK); 229 + fclk_real_name = dss_feat_get_clk_source_name(DSS_CLK_SRC_FCK); 230 + fclk_rate = dss_clk_get_rate(DSS_CLK_FCK); 246 231 247 - if (cpu_is_omap3630()) 248 - seq_printf(s, "dss1_alwon_fclk = %lu / %lu = %lu\n", 249 - dpll4_ck_rate, 250 - dpll4_ck_rate / dpll4_m4_ck_rate, 251 - dss_clk_get_rate(DSS_CLK_FCK1)); 252 - else 253 - seq_printf(s, "dss1_alwon_fclk = %lu / %lu * 2 = %lu\n", 254 - dpll4_ck_rate, 255 - dpll4_ck_rate / dpll4_m4_ck_rate, 256 - dss_clk_get_rate(DSS_CLK_FCK1)); 232 + if (dss.dpll4_m4_ck) { 233 + dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 234 + dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck); 257 235 258 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 236 + seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate); 237 + 238 + if (cpu_is_omap3630() || cpu_is_omap44xx()) 239 + seq_printf(s, "%s (%s) = %lu / %lu = %lu\n", 240 + fclk_name, fclk_real_name, 241 + dpll4_ck_rate, 242 + dpll4_ck_rate / dpll4_m4_ck_rate, 243 + fclk_rate); 244 + else 245 + seq_printf(s, "%s (%s) = %lu / %lu * 2 = %lu\n", 246 + fclk_name, fclk_real_name, 247 + dpll4_ck_rate, 248 + dpll4_ck_rate / dpll4_m4_ck_rate, 249 + fclk_rate); 250 + } else { 251 + seq_printf(s, "%s (%s) = %lu\n", 252 + fclk_name, fclk_real_name, 253 + fclk_rate); 254 + } 255 + 256 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 259 257 } 260 258 261 259 void dss_dump_regs(struct seq_file *s) 262 260 { 263 261 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) 264 262 265 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 263 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 266 264 267 265 DUMPREG(DSS_REVISION); 268 266 DUMPREG(DSS_SYSCONFIG); 269 267 DUMPREG(DSS_SYSSTATUS); 270 268 DUMPREG(DSS_IRQSTATUS); 271 269 DUMPREG(DSS_CONTROL); 272 - DUMPREG(DSS_SDI_CONTROL); 273 - DUMPREG(DSS_PLL_CONTROL); 274 - DUMPREG(DSS_SDI_STATUS); 275 270 276 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 271 + if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 272 + OMAP_DISPLAY_TYPE_SDI) { 273 + DUMPREG(DSS_SDI_CONTROL); 274 + DUMPREG(DSS_PLL_CONTROL); 275 + DUMPREG(DSS_SDI_STATUS); 276 + } 277 + 278 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 277 279 #undef DUMPREG 278 280 } 279 281 280 282 void dss_select_dispc_clk_source(enum dss_clk_source clk_src) 281 283 { 282 284 int b; 285 + u8 start, end; 283 286 284 - BUG_ON(clk_src != DSS_SRC_DSI1_PLL_FCLK && 285 - clk_src != DSS_SRC_DSS1_ALWON_FCLK); 287 + switch (clk_src) { 288 + case DSS_CLK_SRC_FCK: 289 + b = 0; 290 + break; 291 + case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 292 + b = 1; 293 + dsi_wait_pll_hsdiv_dispc_active(); 294 + break; 295 + default: 296 + BUG(); 297 + } 286 298 287 - b = clk_src == DSS_SRC_DSS1_ALWON_FCLK ? 0 : 1; 299 + dss_feat_get_reg_field(FEAT_REG_DISPC_CLK_SWITCH, &start, &end); 288 300 289 - if (clk_src == DSS_SRC_DSI1_PLL_FCLK) 290 - dsi_wait_dsi1_pll_active(); 291 - 292 - REG_FLD_MOD(DSS_CONTROL, b, 0, 0); /* DISPC_CLK_SWITCH */ 301 + REG_FLD_MOD(DSS_CONTROL, b, start, end); /* DISPC_CLK_SWITCH */ 293 302 294 303 dss.dispc_clk_source = clk_src; 295 304 } ··· 328 277 { 329 278 int b; 330 279 331 - BUG_ON(clk_src != DSS_SRC_DSI2_PLL_FCLK && 332 - clk_src != DSS_SRC_DSS1_ALWON_FCLK); 333 - 334 - b = clk_src == DSS_SRC_DSS1_ALWON_FCLK ? 0 : 1; 335 - 336 - if (clk_src == DSS_SRC_DSI2_PLL_FCLK) 337 - dsi_wait_dsi2_pll_active(); 280 + switch (clk_src) { 281 + case DSS_CLK_SRC_FCK: 282 + b = 0; 283 + break; 284 + case DSS_CLK_SRC_DSI_PLL_HSDIV_DSI: 285 + b = 1; 286 + dsi_wait_pll_hsdiv_dsi_active(); 287 + break; 288 + default: 289 + BUG(); 290 + } 338 291 339 292 REG_FLD_MOD(DSS_CONTROL, b, 1, 1); /* DSI_CLK_SWITCH */ 340 293 341 294 dss.dsi_clk_source = clk_src; 295 + } 296 + 297 + void dss_select_lcd_clk_source(enum omap_channel channel, 298 + enum dss_clk_source clk_src) 299 + { 300 + int b, ix, pos; 301 + 302 + if (!dss_has_feature(FEAT_LCD_CLK_SRC)) 303 + return; 304 + 305 + switch (clk_src) { 306 + case DSS_CLK_SRC_FCK: 307 + b = 0; 308 + break; 309 + case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 310 + BUG_ON(channel != OMAP_DSS_CHANNEL_LCD); 311 + b = 1; 312 + dsi_wait_pll_hsdiv_dispc_active(); 313 + break; 314 + default: 315 + BUG(); 316 + } 317 + 318 + pos = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 12; 319 + REG_FLD_MOD(DSS_CONTROL, b, pos, pos); /* LCDx_CLK_SWITCH */ 320 + 321 + ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1; 322 + dss.lcd_clk_source[ix] = clk_src; 342 323 } 343 324 344 325 enum dss_clk_source dss_get_dispc_clk_source(void) ··· 383 300 return dss.dsi_clk_source; 384 301 } 385 302 303 + enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) 304 + { 305 + int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1; 306 + return dss.lcd_clk_source[ix]; 307 + } 308 + 386 309 /* calculate clock rates using dividers in cinfo */ 387 310 int dss_calc_clock_rates(struct dss_clock_info *cinfo) 388 311 { 389 - unsigned long prate; 312 + if (dss.dpll4_m4_ck) { 313 + unsigned long prate; 314 + u16 fck_div_max = 16; 390 315 391 - if (cinfo->fck_div > (cpu_is_omap3630() ? 32 : 16) || 392 - cinfo->fck_div == 0) 393 - return -EINVAL; 316 + if (cpu_is_omap3630() || cpu_is_omap44xx()) 317 + fck_div_max = 32; 394 318 395 - prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 319 + if (cinfo->fck_div > fck_div_max || cinfo->fck_div == 0) 320 + return -EINVAL; 396 321 397 - cinfo->fck = prate / cinfo->fck_div; 322 + prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 323 + 324 + cinfo->fck = prate / cinfo->fck_div; 325 + } else { 326 + if (cinfo->fck_div != 0) 327 + return -EINVAL; 328 + cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK); 329 + } 398 330 399 331 return 0; 400 332 } 401 333 402 334 int dss_set_clock_div(struct dss_clock_info *cinfo) 403 335 { 404 - unsigned long prate; 405 - int r; 336 + if (dss.dpll4_m4_ck) { 337 + unsigned long prate; 338 + int r; 406 339 407 - if (cpu_is_omap34xx()) { 408 340 prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 409 341 DSSDBG("dpll4_m4 = %ld\n", prate); 410 342 411 343 r = clk_set_rate(dss.dpll4_m4_ck, prate / cinfo->fck_div); 412 344 if (r) 413 345 return r; 346 + } else { 347 + if (cinfo->fck_div != 0) 348 + return -EINVAL; 414 349 } 415 350 416 351 DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div); ··· 438 337 439 338 int dss_get_clock_div(struct dss_clock_info *cinfo) 440 339 { 441 - cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK1); 340 + cinfo->fck = dss_clk_get_rate(DSS_CLK_FCK); 442 341 443 - if (cpu_is_omap34xx()) { 342 + if (dss.dpll4_m4_ck) { 444 343 unsigned long prate; 344 + 445 345 prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 446 - if (cpu_is_omap3630()) 346 + 347 + if (cpu_is_omap3630() || cpu_is_omap44xx()) 447 348 cinfo->fck_div = prate / (cinfo->fck); 448 349 else 449 350 cinfo->fck_div = prate / (cinfo->fck / 2); ··· 458 355 459 356 unsigned long dss_get_dpll4_rate(void) 460 357 { 461 - if (cpu_is_omap34xx()) 358 + if (dss.dpll4_m4_ck) 462 359 return clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 463 360 else 464 361 return 0; ··· 472 369 struct dss_clock_info best_dss; 473 370 struct dispc_clock_info best_dispc; 474 371 475 - unsigned long fck; 372 + unsigned long fck, max_dss_fck; 476 373 477 - u16 fck_div; 374 + u16 fck_div, fck_div_max = 16; 478 375 479 376 int match = 0; 480 377 int min_fck_per_pck; 481 378 482 379 prate = dss_get_dpll4_rate(); 483 380 484 - fck = dss_clk_get_rate(DSS_CLK_FCK1); 381 + max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK); 382 + 383 + fck = dss_clk_get_rate(DSS_CLK_FCK); 485 384 if (req_pck == dss.cache_req_pck && 486 385 ((cpu_is_omap34xx() && prate == dss.cache_prate) || 487 386 dss.cache_dss_cinfo.fck == fck)) { ··· 496 391 min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; 497 392 498 393 if (min_fck_per_pck && 499 - req_pck * min_fck_per_pck > DISPC_MAX_FCK) { 394 + req_pck * min_fck_per_pck > max_dss_fck) { 500 395 DSSERR("Requested pixel clock not possible with the current " 501 396 "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " 502 397 "the constraint off.\n"); ··· 507 402 memset(&best_dss, 0, sizeof(best_dss)); 508 403 memset(&best_dispc, 0, sizeof(best_dispc)); 509 404 510 - if (cpu_is_omap24xx()) { 405 + if (dss.dpll4_m4_ck == NULL) { 511 406 struct dispc_clock_info cur_dispc; 512 407 /* XXX can we change the clock on omap2? */ 513 - fck = dss_clk_get_rate(DSS_CLK_FCK1); 408 + fck = dss_clk_get_rate(DSS_CLK_FCK); 514 409 fck_div = 1; 515 410 516 411 dispc_find_clk_divs(is_tft, req_pck, fck, &cur_dispc); ··· 522 417 best_dispc = cur_dispc; 523 418 524 419 goto found; 525 - } else if (cpu_is_omap34xx()) { 526 - for (fck_div = (cpu_is_omap3630() ? 32 : 16); 527 - fck_div > 0; --fck_div) { 420 + } else { 421 + if (cpu_is_omap3630() || cpu_is_omap44xx()) 422 + fck_div_max = 32; 423 + 424 + for (fck_div = fck_div_max; fck_div > 0; --fck_div) { 528 425 struct dispc_clock_info cur_dispc; 529 426 530 - if (cpu_is_omap3630()) 427 + if (fck_div_max == 32) 531 428 fck = prate / fck_div; 532 429 else 533 430 fck = prate / fck_div * 2; 534 431 535 - if (fck > DISPC_MAX_FCK) 432 + if (fck > max_dss_fck) 536 433 continue; 537 434 538 435 if (min_fck_per_pck && ··· 557 450 goto found; 558 451 } 559 452 } 560 - } else { 561 - BUG(); 562 453 } 563 454 564 455 found: ··· 585 480 dss.cache_dispc_cinfo = best_dispc; 586 481 587 482 return 0; 588 - } 589 - 590 - 591 - 592 - static irqreturn_t dss_irq_handler_omap2(int irq, void *arg) 593 - { 594 - dispc_irq_handler(); 595 - 596 - return IRQ_HANDLED; 597 - } 598 - 599 - static irqreturn_t dss_irq_handler_omap3(int irq, void *arg) 600 - { 601 - u32 irqstatus; 602 - 603 - irqstatus = dss_read_reg(DSS_IRQSTATUS); 604 - 605 - if (irqstatus & (1<<0)) /* DISPC_IRQ */ 606 - dispc_irq_handler(); 607 - #ifdef CONFIG_OMAP2_DSS_DSI 608 - if (irqstatus & (1<<1)) /* DSI_IRQ */ 609 - dsi_irq_handler(); 610 - #endif 611 - 612 - return IRQ_HANDLED; 613 483 } 614 484 615 485 static int _omap_dss_wait_reset(void) ··· 629 549 REG_FLD_MOD(DSS_CONTROL, enable, 5, 5); /* DAC Power-Down Control */ 630 550 } 631 551 632 - int dss_init(bool skip_init) 552 + void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select hdmi) 553 + { 554 + REG_FLD_MOD(DSS_CONTROL, hdmi, 15, 15); /* VENC_HDMI_SWITCH */ 555 + } 556 + 557 + static int dss_init(void) 633 558 { 634 559 int r; 635 560 u32 rev; 561 + struct resource *dss_mem; 562 + struct clk *dpll4_m4_ck; 636 563 637 - dss.base = ioremap(DSS_BASE, DSS_SZ_REGS); 564 + dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0); 565 + if (!dss_mem) { 566 + DSSERR("can't get IORESOURCE_MEM DSS\n"); 567 + r = -EINVAL; 568 + goto fail0; 569 + } 570 + dss.base = ioremap(dss_mem->start, resource_size(dss_mem)); 638 571 if (!dss.base) { 639 572 DSSERR("can't ioremap DSS\n"); 640 573 r = -ENOMEM; 641 574 goto fail0; 642 575 } 643 576 644 - if (!skip_init) { 645 - /* disable LCD and DIGIT output. This seems to fix the synclost 646 - * problem that we get, if the bootloader starts the DSS and 647 - * the kernel resets it */ 648 - omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440); 577 + /* disable LCD and DIGIT output. This seems to fix the synclost 578 + * problem that we get, if the bootloader starts the DSS and 579 + * the kernel resets it */ 580 + omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440); 649 581 650 - /* We need to wait here a bit, otherwise we sometimes start to 651 - * get synclost errors, and after that only power cycle will 652 - * restore DSS functionality. I have no idea why this happens. 653 - * And we have to wait _before_ resetting the DSS, but after 654 - * enabling clocks. 655 - */ 656 - msleep(50); 582 + /* We need to wait here a bit, otherwise we sometimes start to 583 + * get synclost errors, and after that only power cycle will 584 + * restore DSS functionality. I have no idea why this happens. 585 + * And we have to wait _before_ resetting the DSS, but after 586 + * enabling clocks. 587 + */ 588 + msleep(50); 657 589 658 - _omap_dss_reset(); 659 - } 590 + _omap_dss_reset(); 660 591 661 592 /* autoidle */ 662 593 REG_FLD_MOD(DSS_SYSCONFIG, 1, 0, 0); ··· 680 589 REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ 681 590 REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ 682 591 #endif 683 - 684 - r = request_irq(INT_24XX_DSS_IRQ, 685 - cpu_is_omap24xx() 686 - ? dss_irq_handler_omap2 687 - : dss_irq_handler_omap3, 688 - 0, "OMAP DSS", NULL); 689 - 690 - if (r < 0) { 691 - DSSERR("omap2 dss: request_irq failed\n"); 692 - goto fail1; 693 - } 694 - 695 592 if (cpu_is_omap34xx()) { 696 - dss.dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck"); 697 - if (IS_ERR(dss.dpll4_m4_ck)) { 593 + dpll4_m4_ck = clk_get(NULL, "dpll4_m4_ck"); 594 + if (IS_ERR(dpll4_m4_ck)) { 698 595 DSSERR("Failed to get dpll4_m4_ck\n"); 699 - r = PTR_ERR(dss.dpll4_m4_ck); 700 - goto fail2; 596 + r = PTR_ERR(dpll4_m4_ck); 597 + goto fail1; 701 598 } 599 + } else if (cpu_is_omap44xx()) { 600 + dpll4_m4_ck = clk_get(NULL, "dpll_per_m5x2_ck"); 601 + if (IS_ERR(dpll4_m4_ck)) { 602 + DSSERR("Failed to get dpll4_m4_ck\n"); 603 + r = PTR_ERR(dpll4_m4_ck); 604 + goto fail1; 605 + } 606 + } else { /* omap24xx */ 607 + dpll4_m4_ck = NULL; 702 608 } 703 609 704 - dss.dsi_clk_source = DSS_SRC_DSS1_ALWON_FCLK; 705 - dss.dispc_clk_source = DSS_SRC_DSS1_ALWON_FCLK; 610 + dss.dpll4_m4_ck = dpll4_m4_ck; 611 + 612 + dss.dsi_clk_source = DSS_CLK_SRC_FCK; 613 + dss.dispc_clk_source = DSS_CLK_SRC_FCK; 614 + dss.lcd_clk_source[0] = DSS_CLK_SRC_FCK; 615 + dss.lcd_clk_source[1] = DSS_CLK_SRC_FCK; 706 616 707 617 dss_save_context(); 708 618 ··· 713 621 714 622 return 0; 715 623 716 - fail2: 717 - free_irq(INT_24XX_DSS_IRQ, NULL); 718 624 fail1: 719 625 iounmap(dss.base); 720 626 fail0: 721 627 return r; 722 628 } 723 629 724 - void dss_exit(void) 630 + static void dss_exit(void) 725 631 { 726 - if (cpu_is_omap34xx()) 632 + if (dss.dpll4_m4_ck) 727 633 clk_put(dss.dpll4_m4_ck); 728 - 729 - free_irq(INT_24XX_DSS_IRQ, NULL); 730 634 731 635 iounmap(dss.base); 732 636 } 733 637 638 + /* CONTEXT */ 639 + static int dss_get_ctx_id(void) 640 + { 641 + struct omap_display_platform_data *pdata = dss.pdev->dev.platform_data; 642 + int r; 643 + 644 + if (!pdata->board_data->get_last_off_on_transaction_id) 645 + return 0; 646 + r = pdata->board_data->get_last_off_on_transaction_id(&dss.pdev->dev); 647 + if (r < 0) { 648 + dev_err(&dss.pdev->dev, "getting transaction ID failed, " 649 + "will force context restore\n"); 650 + r = -1; 651 + } 652 + return r; 653 + } 654 + 655 + int dss_need_ctx_restore(void) 656 + { 657 + int id = dss_get_ctx_id(); 658 + 659 + if (id < 0 || id != dss.ctx_id) { 660 + DSSDBG("ctx id %d -> id %d\n", 661 + dss.ctx_id, id); 662 + dss.ctx_id = id; 663 + return 1; 664 + } else { 665 + return 0; 666 + } 667 + } 668 + 669 + static void save_all_ctx(void) 670 + { 671 + DSSDBG("save context\n"); 672 + 673 + dss_clk_enable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK); 674 + 675 + dss_save_context(); 676 + dispc_save_context(); 677 + #ifdef CONFIG_OMAP2_DSS_DSI 678 + dsi_save_context(); 679 + #endif 680 + 681 + dss_clk_disable_no_ctx(DSS_CLK_ICK | DSS_CLK_FCK); 682 + } 683 + 684 + static void restore_all_ctx(void) 685 + { 686 + DSSDBG("restore context\n"); 687 + 688 + dss_clk_enable_all_no_ctx(); 689 + 690 + dss_restore_context(); 691 + dispc_restore_context(); 692 + #ifdef CONFIG_OMAP2_DSS_DSI 693 + dsi_restore_context(); 694 + #endif 695 + 696 + dss_clk_disable_all_no_ctx(); 697 + } 698 + 699 + static int dss_get_clock(struct clk **clock, const char *clk_name) 700 + { 701 + struct clk *clk; 702 + 703 + clk = clk_get(&dss.pdev->dev, clk_name); 704 + 705 + if (IS_ERR(clk)) { 706 + DSSERR("can't get clock %s", clk_name); 707 + return PTR_ERR(clk); 708 + } 709 + 710 + *clock = clk; 711 + 712 + DSSDBG("clk %s, rate %ld\n", clk_name, clk_get_rate(clk)); 713 + 714 + return 0; 715 + } 716 + 717 + static int dss_get_clocks(void) 718 + { 719 + int r; 720 + struct omap_display_platform_data *pdata = dss.pdev->dev.platform_data; 721 + 722 + dss.dss_ick = NULL; 723 + dss.dss_fck = NULL; 724 + dss.dss_sys_clk = NULL; 725 + dss.dss_tv_fck = NULL; 726 + dss.dss_video_fck = NULL; 727 + 728 + r = dss_get_clock(&dss.dss_ick, "ick"); 729 + if (r) 730 + goto err; 731 + 732 + r = dss_get_clock(&dss.dss_fck, "fck"); 733 + if (r) 734 + goto err; 735 + 736 + if (!pdata->opt_clock_available) { 737 + r = -ENODEV; 738 + goto err; 739 + } 740 + 741 + if (pdata->opt_clock_available("sys_clk")) { 742 + r = dss_get_clock(&dss.dss_sys_clk, "sys_clk"); 743 + if (r) 744 + goto err; 745 + } 746 + 747 + if (pdata->opt_clock_available("tv_clk")) { 748 + r = dss_get_clock(&dss.dss_tv_fck, "tv_clk"); 749 + if (r) 750 + goto err; 751 + } 752 + 753 + if (pdata->opt_clock_available("video_clk")) { 754 + r = dss_get_clock(&dss.dss_video_fck, "video_clk"); 755 + if (r) 756 + goto err; 757 + } 758 + 759 + return 0; 760 + 761 + err: 762 + if (dss.dss_ick) 763 + clk_put(dss.dss_ick); 764 + if (dss.dss_fck) 765 + clk_put(dss.dss_fck); 766 + if (dss.dss_sys_clk) 767 + clk_put(dss.dss_sys_clk); 768 + if (dss.dss_tv_fck) 769 + clk_put(dss.dss_tv_fck); 770 + if (dss.dss_video_fck) 771 + clk_put(dss.dss_video_fck); 772 + 773 + return r; 774 + } 775 + 776 + static void dss_put_clocks(void) 777 + { 778 + if (dss.dss_video_fck) 779 + clk_put(dss.dss_video_fck); 780 + if (dss.dss_tv_fck) 781 + clk_put(dss.dss_tv_fck); 782 + if (dss.dss_sys_clk) 783 + clk_put(dss.dss_sys_clk); 784 + clk_put(dss.dss_fck); 785 + clk_put(dss.dss_ick); 786 + } 787 + 788 + unsigned long dss_clk_get_rate(enum dss_clock clk) 789 + { 790 + switch (clk) { 791 + case DSS_CLK_ICK: 792 + return clk_get_rate(dss.dss_ick); 793 + case DSS_CLK_FCK: 794 + return clk_get_rate(dss.dss_fck); 795 + case DSS_CLK_SYSCK: 796 + return clk_get_rate(dss.dss_sys_clk); 797 + case DSS_CLK_TVFCK: 798 + return clk_get_rate(dss.dss_tv_fck); 799 + case DSS_CLK_VIDFCK: 800 + return clk_get_rate(dss.dss_video_fck); 801 + } 802 + 803 + BUG(); 804 + return 0; 805 + } 806 + 807 + static unsigned count_clk_bits(enum dss_clock clks) 808 + { 809 + unsigned num_clks = 0; 810 + 811 + if (clks & DSS_CLK_ICK) 812 + ++num_clks; 813 + if (clks & DSS_CLK_FCK) 814 + ++num_clks; 815 + if (clks & DSS_CLK_SYSCK) 816 + ++num_clks; 817 + if (clks & DSS_CLK_TVFCK) 818 + ++num_clks; 819 + if (clks & DSS_CLK_VIDFCK) 820 + ++num_clks; 821 + 822 + return num_clks; 823 + } 824 + 825 + static void dss_clk_enable_no_ctx(enum dss_clock clks) 826 + { 827 + unsigned num_clks = count_clk_bits(clks); 828 + 829 + if (clks & DSS_CLK_ICK) 830 + clk_enable(dss.dss_ick); 831 + if (clks & DSS_CLK_FCK) 832 + clk_enable(dss.dss_fck); 833 + if ((clks & DSS_CLK_SYSCK) && dss.dss_sys_clk) 834 + clk_enable(dss.dss_sys_clk); 835 + if ((clks & DSS_CLK_TVFCK) && dss.dss_tv_fck) 836 + clk_enable(dss.dss_tv_fck); 837 + if ((clks & DSS_CLK_VIDFCK) && dss.dss_video_fck) 838 + clk_enable(dss.dss_video_fck); 839 + 840 + dss.num_clks_enabled += num_clks; 841 + } 842 + 843 + void dss_clk_enable(enum dss_clock clks) 844 + { 845 + bool check_ctx = dss.num_clks_enabled == 0; 846 + 847 + dss_clk_enable_no_ctx(clks); 848 + 849 + /* 850 + * HACK: On omap4 the registers may not be accessible right after 851 + * enabling the clocks. At some point this will be handled by 852 + * pm_runtime, but for the time begin this should make things work. 853 + */ 854 + if (cpu_is_omap44xx() && check_ctx) 855 + udelay(10); 856 + 857 + if (check_ctx && cpu_is_omap34xx() && dss_need_ctx_restore()) 858 + restore_all_ctx(); 859 + } 860 + 861 + static void dss_clk_disable_no_ctx(enum dss_clock clks) 862 + { 863 + unsigned num_clks = count_clk_bits(clks); 864 + 865 + if (clks & DSS_CLK_ICK) 866 + clk_disable(dss.dss_ick); 867 + if (clks & DSS_CLK_FCK) 868 + clk_disable(dss.dss_fck); 869 + if ((clks & DSS_CLK_SYSCK) && dss.dss_sys_clk) 870 + clk_disable(dss.dss_sys_clk); 871 + if ((clks & DSS_CLK_TVFCK) && dss.dss_tv_fck) 872 + clk_disable(dss.dss_tv_fck); 873 + if ((clks & DSS_CLK_VIDFCK) && dss.dss_video_fck) 874 + clk_disable(dss.dss_video_fck); 875 + 876 + dss.num_clks_enabled -= num_clks; 877 + } 878 + 879 + void dss_clk_disable(enum dss_clock clks) 880 + { 881 + if (cpu_is_omap34xx()) { 882 + unsigned num_clks = count_clk_bits(clks); 883 + 884 + BUG_ON(dss.num_clks_enabled < num_clks); 885 + 886 + if (dss.num_clks_enabled == num_clks) 887 + save_all_ctx(); 888 + } 889 + 890 + dss_clk_disable_no_ctx(clks); 891 + } 892 + 893 + static void dss_clk_enable_all_no_ctx(void) 894 + { 895 + enum dss_clock clks; 896 + 897 + clks = DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_SYSCK | DSS_CLK_TVFCK; 898 + if (cpu_is_omap34xx()) 899 + clks |= DSS_CLK_VIDFCK; 900 + dss_clk_enable_no_ctx(clks); 901 + } 902 + 903 + static void dss_clk_disable_all_no_ctx(void) 904 + { 905 + enum dss_clock clks; 906 + 907 + clks = DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_SYSCK | DSS_CLK_TVFCK; 908 + if (cpu_is_omap34xx()) 909 + clks |= DSS_CLK_VIDFCK; 910 + dss_clk_disable_no_ctx(clks); 911 + } 912 + 913 + #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 914 + /* CLOCKS */ 915 + static void core_dump_clocks(struct seq_file *s) 916 + { 917 + int i; 918 + struct clk *clocks[5] = { 919 + dss.dss_ick, 920 + dss.dss_fck, 921 + dss.dss_sys_clk, 922 + dss.dss_tv_fck, 923 + dss.dss_video_fck 924 + }; 925 + 926 + seq_printf(s, "- CORE -\n"); 927 + 928 + seq_printf(s, "internal clk count\t\t%u\n", dss.num_clks_enabled); 929 + 930 + for (i = 0; i < 5; i++) { 931 + if (!clocks[i]) 932 + continue; 933 + seq_printf(s, "%-15s\t%lu\t%d\n", 934 + clocks[i]->name, 935 + clk_get_rate(clocks[i]), 936 + clocks[i]->usecount); 937 + } 938 + } 939 + #endif /* defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) */ 940 + 941 + /* DEBUGFS */ 942 + #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 943 + void dss_debug_dump_clocks(struct seq_file *s) 944 + { 945 + core_dump_clocks(s); 946 + dss_dump_clocks(s); 947 + dispc_dump_clocks(s); 948 + #ifdef CONFIG_OMAP2_DSS_DSI 949 + dsi_dump_clocks(s); 950 + #endif 951 + } 952 + #endif 953 + 954 + 955 + /* DSS HW IP initialisation */ 956 + static int omap_dsshw_probe(struct platform_device *pdev) 957 + { 958 + int r; 959 + 960 + dss.pdev = pdev; 961 + 962 + r = dss_get_clocks(); 963 + if (r) 964 + goto err_clocks; 965 + 966 + dss_clk_enable_all_no_ctx(); 967 + 968 + dss.ctx_id = dss_get_ctx_id(); 969 + DSSDBG("initial ctx id %u\n", dss.ctx_id); 970 + 971 + r = dss_init(); 972 + if (r) { 973 + DSSERR("Failed to initialize DSS\n"); 974 + goto err_dss; 975 + } 976 + 977 + r = dpi_init(); 978 + if (r) { 979 + DSSERR("Failed to initialize DPI\n"); 980 + goto err_dpi; 981 + } 982 + 983 + r = sdi_init(); 984 + if (r) { 985 + DSSERR("Failed to initialize SDI\n"); 986 + goto err_sdi; 987 + } 988 + 989 + dss_clk_disable_all_no_ctx(); 990 + return 0; 991 + err_sdi: 992 + dpi_exit(); 993 + err_dpi: 994 + dss_exit(); 995 + err_dss: 996 + dss_clk_disable_all_no_ctx(); 997 + dss_put_clocks(); 998 + err_clocks: 999 + return r; 1000 + } 1001 + 1002 + static int omap_dsshw_remove(struct platform_device *pdev) 1003 + { 1004 + 1005 + dss_exit(); 1006 + 1007 + /* 1008 + * As part of hwmod changes, DSS is not the only controller of dss 1009 + * clocks; hwmod framework itself will also enable clocks during hwmod 1010 + * init for dss, and autoidle is set in h/w for DSS. Hence, there's no 1011 + * need to disable clocks if their usecounts > 1. 1012 + */ 1013 + WARN_ON(dss.num_clks_enabled > 0); 1014 + 1015 + dss_put_clocks(); 1016 + return 0; 1017 + } 1018 + 1019 + static struct platform_driver omap_dsshw_driver = { 1020 + .probe = omap_dsshw_probe, 1021 + .remove = omap_dsshw_remove, 1022 + .driver = { 1023 + .name = "omapdss_dss", 1024 + .owner = THIS_MODULE, 1025 + }, 1026 + }; 1027 + 1028 + int dss_init_platform_driver(void) 1029 + { 1030 + return platform_driver_register(&omap_dsshw_driver); 1031 + } 1032 + 1033 + void dss_uninit_platform_driver(void) 1034 + { 1035 + return platform_driver_unregister(&omap_dsshw_driver); 1036 + }
+105 -48
drivers/video/omap2/dss/dss.h
··· 97 97 #define FLD_MOD(orig, val, start, end) \ 98 98 (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) 99 99 100 - #define DISPC_MAX_FCK 173000000 101 - 102 100 enum omap_burst_size { 103 101 OMAP_DSS_BURST_4x32 = 0, 104 102 OMAP_DSS_BURST_8x32 = 1, ··· 110 112 }; 111 113 112 114 enum dss_clock { 113 - DSS_CLK_ICK = 1 << 0, 114 - DSS_CLK_FCK1 = 1 << 1, 115 - DSS_CLK_FCK2 = 1 << 2, 116 - DSS_CLK_54M = 1 << 3, 117 - DSS_CLK_96M = 1 << 4, 115 + DSS_CLK_ICK = 1 << 0, /* DSS_L3_ICLK and DSS_L4_ICLK */ 116 + DSS_CLK_FCK = 1 << 1, /* DSS1_ALWON_FCLK */ 117 + DSS_CLK_SYSCK = 1 << 2, /* DSS2_ALWON_FCLK */ 118 + DSS_CLK_TVFCK = 1 << 3, /* DSS_TV_FCLK */ 119 + DSS_CLK_VIDFCK = 1 << 4, /* DSS_96M_FCLK*/ 118 120 }; 119 121 120 122 enum dss_clk_source { 121 - DSS_SRC_DSI1_PLL_FCLK, 122 - DSS_SRC_DSI2_PLL_FCLK, 123 - DSS_SRC_DSS1_ALWON_FCLK, 123 + DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC, /* OMAP3: DSI1_PLL_FCLK 124 + * OMAP4: PLL1_CLK1 */ 125 + DSS_CLK_SRC_DSI_PLL_HSDIV_DSI, /* OMAP3: DSI2_PLL_FCLK 126 + * OMAP4: PLL1_CLK2 */ 127 + DSS_CLK_SRC_FCK, /* OMAP2/3: DSS1_ALWON_FCLK 128 + * OMAP4: DSS_FCLK */ 129 + }; 130 + 131 + enum dss_hdmi_venc_clk_source_select { 132 + DSS_VENC_TV_CLK = 0, 133 + DSS_HDMI_M_PCLK = 1, 124 134 }; 125 135 126 136 struct dss_clock_info { ··· 154 148 unsigned long fint; 155 149 unsigned long clkin4ddr; 156 150 unsigned long clkin; 157 - unsigned long dsi1_pll_fclk; 158 - unsigned long dsi2_pll_fclk; 159 - 151 + unsigned long dsi_pll_hsdiv_dispc_clk; /* OMAP3: DSI1_PLL_CLK 152 + * OMAP4: PLLx_CLK1 */ 153 + unsigned long dsi_pll_hsdiv_dsi_clk; /* OMAP3: DSI2_PLL_CLK 154 + * OMAP4: PLLx_CLK2 */ 160 155 unsigned long lp_clk; 161 156 162 157 /* dividers */ 163 158 u16 regn; 164 159 u16 regm; 165 - u16 regm3; 166 - u16 regm4; 167 - 160 + u16 regm_dispc; /* OMAP3: REGM3 161 + * OMAP4: REGM4 */ 162 + u16 regm_dsi; /* OMAP3: REGM4 163 + * OMAP4: REGM5 */ 168 164 u16 lp_clk_div; 169 165 170 166 u8 highfreq; 171 - bool use_dss2_fck; 167 + bool use_sys_clk; 168 + }; 169 + 170 + /* HDMI PLL structure */ 171 + struct hdmi_pll_info { 172 + u16 regn; 173 + u16 regm; 174 + u32 regmf; 175 + u16 regm2; 176 + u16 regsd; 177 + u16 dcofreq; 172 178 }; 173 179 174 180 struct seq_file; 175 181 struct platform_device; 176 182 177 183 /* core */ 178 - void dss_clk_enable(enum dss_clock clks); 179 - void dss_clk_disable(enum dss_clock clks); 180 - unsigned long dss_clk_get_rate(enum dss_clock clk); 181 - int dss_need_ctx_restore(void); 182 - void dss_dump_clocks(struct seq_file *s); 183 184 struct bus_type *dss_get_bus(void); 184 185 struct regulator *dss_get_vdds_dsi(void); 185 186 struct regulator *dss_get_vdds_sdi(void); 186 - struct regulator *dss_get_vdda_dac(void); 187 187 188 188 /* display */ 189 189 int dss_suspend_all_devices(void); ··· 226 214 void dss_recheck_connections(struct omap_dss_device *dssdev, bool force); 227 215 228 216 /* DSS */ 229 - int dss_init(bool skip_init); 230 - void dss_exit(void); 217 + int dss_init_platform_driver(void); 218 + void dss_uninit_platform_driver(void); 231 219 220 + void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select); 232 221 void dss_save_context(void); 233 222 void dss_restore_context(void); 223 + void dss_clk_enable(enum dss_clock clks); 224 + void dss_clk_disable(enum dss_clock clks); 225 + unsigned long dss_clk_get_rate(enum dss_clock clk); 226 + int dss_need_ctx_restore(void); 227 + const char *dss_get_generic_clk_source_name(enum dss_clk_source clk_src); 228 + void dss_dump_clocks(struct seq_file *s); 234 229 235 230 void dss_dump_regs(struct seq_file *s); 231 + #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 232 + void dss_debug_dump_clocks(struct seq_file *s); 233 + #endif 236 234 237 235 void dss_sdi_init(u8 datapairs); 238 236 int dss_sdi_enable(void); ··· 250 228 251 229 void dss_select_dispc_clk_source(enum dss_clk_source clk_src); 252 230 void dss_select_dsi_clk_source(enum dss_clk_source clk_src); 231 + void dss_select_lcd_clk_source(enum omap_channel channel, 232 + enum dss_clk_source clk_src); 253 233 enum dss_clk_source dss_get_dispc_clk_source(void); 254 234 enum dss_clk_source dss_get_dsi_clk_source(void); 235 + enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel); 255 236 256 237 void dss_set_venc_output(enum omap_dss_venc_type type); 257 238 void dss_set_dac_pwrdn_bgz(bool enable); ··· 269 244 270 245 /* SDI */ 271 246 #ifdef CONFIG_OMAP2_DSS_SDI 272 - int sdi_init(bool skip_init); 247 + int sdi_init(void); 273 248 void sdi_exit(void); 274 249 int sdi_init_display(struct omap_dss_device *display); 275 250 #else 276 - static inline int sdi_init(bool skip_init) 251 + static inline int sdi_init(void) 277 252 { 278 253 return 0; 279 254 } ··· 284 259 285 260 /* DSI */ 286 261 #ifdef CONFIG_OMAP2_DSS_DSI 287 - int dsi_init(struct platform_device *pdev); 288 - void dsi_exit(void); 262 + int dsi_init_platform_driver(void); 263 + void dsi_uninit_platform_driver(void); 289 264 290 265 void dsi_dump_clocks(struct seq_file *s); 291 266 void dsi_dump_irqs(struct seq_file *s); ··· 296 271 297 272 int dsi_init_display(struct omap_dss_device *display); 298 273 void dsi_irq_handler(void); 299 - unsigned long dsi_get_dsi1_pll_rate(void); 274 + unsigned long dsi_get_pll_hsdiv_dispc_rate(void); 300 275 int dsi_pll_set_clock_div(struct dsi_clock_info *cinfo); 301 276 int dsi_pll_calc_clock_div_pck(bool is_tft, unsigned long req_pck, 302 277 struct dsi_clock_info *cinfo, ··· 307 282 void dsi_get_overlay_fifo_thresholds(enum omap_plane plane, 308 283 u32 fifo_size, enum omap_burst_size *burst_size, 309 284 u32 *fifo_low, u32 *fifo_high); 310 - void dsi_wait_dsi1_pll_active(void); 311 - void dsi_wait_dsi2_pll_active(void); 285 + void dsi_wait_pll_hsdiv_dispc_active(void); 286 + void dsi_wait_pll_hsdiv_dsi_active(void); 312 287 #else 313 - static inline int dsi_init(struct platform_device *pdev) 288 + static inline int dsi_init_platform_driver(void) 314 289 { 315 290 return 0; 316 291 } 317 - static inline void dsi_exit(void) 292 + static inline void dsi_uninit_platform_driver(void) 318 293 { 319 294 } 320 - static inline void dsi_wait_dsi1_pll_active(void) 295 + static inline unsigned long dsi_get_pll_hsdiv_dispc_rate(void) 296 + { 297 + WARN("%s: DSI not compiled in, returning rate as 0\n", __func__); 298 + return 0; 299 + } 300 + static inline void dsi_wait_pll_hsdiv_dispc_active(void) 321 301 { 322 302 } 323 - static inline void dsi_wait_dsi2_pll_active(void) 303 + static inline void dsi_wait_pll_hsdiv_dsi_active(void) 324 304 { 325 305 } 326 306 #endif 327 307 328 308 /* DPI */ 329 309 #ifdef CONFIG_OMAP2_DSS_DPI 330 - int dpi_init(struct platform_device *pdev); 310 + int dpi_init(void); 331 311 void dpi_exit(void); 332 312 int dpi_init_display(struct omap_dss_device *dssdev); 333 313 #else 334 - static inline int dpi_init(struct platform_device *pdev) 314 + static inline int dpi_init(void) 335 315 { 336 316 return 0; 337 317 } ··· 346 316 #endif 347 317 348 318 /* DISPC */ 349 - int dispc_init(void); 350 - void dispc_exit(void); 319 + int dispc_init_platform_driver(void); 320 + void dispc_uninit_platform_driver(void); 351 321 void dispc_dump_clocks(struct seq_file *s); 352 322 void dispc_dump_irqs(struct seq_file *s); 353 323 void dispc_dump_regs(struct seq_file *s); ··· 380 350 void dispc_set_channel_out(enum omap_plane plane, 381 351 enum omap_channel channel_out); 382 352 353 + void dispc_enable_gamma_table(bool enable); 383 354 int dispc_setup_plane(enum omap_plane plane, 384 355 u32 paddr, u16 screen_width, 385 356 u16 pos_x, u16 pos_y, ··· 440 409 441 410 /* VENC */ 442 411 #ifdef CONFIG_OMAP2_DSS_VENC 443 - int venc_init(struct platform_device *pdev); 444 - void venc_exit(void); 412 + int venc_init_platform_driver(void); 413 + void venc_uninit_platform_driver(void); 445 414 void venc_dump_regs(struct seq_file *s); 446 415 int venc_init_display(struct omap_dss_device *display); 447 416 #else 448 - static inline int venc_init(struct platform_device *pdev) 417 + static inline int venc_init_platform_driver(void) 449 418 { 450 419 return 0; 451 420 } 452 - static inline void venc_exit(void) 421 + static inline void venc_uninit_platform_driver(void) 453 422 { 454 423 } 455 424 #endif 456 425 426 + /* HDMI */ 427 + #ifdef CONFIG_OMAP4_DSS_HDMI 428 + int hdmi_init_platform_driver(void); 429 + void hdmi_uninit_platform_driver(void); 430 + int hdmi_init_display(struct omap_dss_device *dssdev); 431 + #else 432 + static inline int hdmi_init_display(struct omap_dss_device *dssdev) 433 + { 434 + return 0; 435 + } 436 + static inline int hdmi_init_platform_driver(void) 437 + { 438 + return 0; 439 + } 440 + static inline void hdmi_uninit_platform_driver(void) 441 + { 442 + } 443 + #endif 444 + int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev); 445 + void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev); 446 + void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev); 447 + int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, 448 + struct omap_video_timings *timings); 449 + int hdmi_panel_init(void); 450 + void hdmi_panel_exit(void); 451 + 457 452 /* RFBI */ 458 453 #ifdef CONFIG_OMAP2_DSS_RFBI 459 - int rfbi_init(void); 460 - void rfbi_exit(void); 454 + int rfbi_init_platform_driver(void); 455 + void rfbi_uninit_platform_driver(void); 461 456 void rfbi_dump_regs(struct seq_file *s); 462 457 463 458 int rfbi_configure(int rfbi_module, int bpp, int lines); ··· 494 437 unsigned long rfbi_get_max_tx_rate(void); 495 438 int rfbi_init_display(struct omap_dss_device *display); 496 439 #else 497 - static inline int rfbi_init(void) 440 + static inline int rfbi_init_platform_driver(void) 498 441 { 499 442 return 0; 500 443 } 501 - static inline void rfbi_exit(void) 444 + static inline void rfbi_uninit_platform_driver(void) 502 445 { 503 446 } 504 447 #endif
+141 -22
drivers/video/omap2/dss/dss_features.c
··· 25 25 #include <plat/display.h> 26 26 #include <plat/cpu.h> 27 27 28 + #include "dss.h" 28 29 #include "dss_features.h" 29 30 30 31 /* Defines a generic omap register field */ 31 32 struct dss_reg_field { 32 - enum dss_feat_reg_field id; 33 33 u8 start, end; 34 + }; 35 + 36 + struct dss_param_range { 37 + int min, max; 34 38 }; 35 39 36 40 struct omap_dss_features { ··· 47 43 const int num_ovls; 48 44 const enum omap_display_type *supported_displays; 49 45 const enum omap_color_mode *supported_color_modes; 46 + const char * const *clksrc_names; 47 + const struct dss_param_range *dss_params; 50 48 }; 51 49 52 50 /* This struct is assigned to one of the below during initialization */ 53 51 static struct omap_dss_features *omap_current_dss_features; 54 52 55 53 static const struct dss_reg_field omap2_dss_reg_fields[] = { 56 - { FEAT_REG_FIRHINC, 11, 0 }, 57 - { FEAT_REG_FIRVINC, 27, 16 }, 58 - { FEAT_REG_FIFOLOWTHRESHOLD, 8, 0 }, 59 - { FEAT_REG_FIFOHIGHTHRESHOLD, 24, 16 }, 60 - { FEAT_REG_FIFOSIZE, 8, 0 }, 54 + [FEAT_REG_FIRHINC] = { 11, 0 }, 55 + [FEAT_REG_FIRVINC] = { 27, 16 }, 56 + [FEAT_REG_FIFOLOWTHRESHOLD] = { 8, 0 }, 57 + [FEAT_REG_FIFOHIGHTHRESHOLD] = { 24, 16 }, 58 + [FEAT_REG_FIFOSIZE] = { 8, 0 }, 59 + [FEAT_REG_HORIZONTALACCU] = { 9, 0 }, 60 + [FEAT_REG_VERTICALACCU] = { 25, 16 }, 61 + [FEAT_REG_DISPC_CLK_SWITCH] = { 0, 0 }, 62 + [FEAT_REG_DSIPLL_REGN] = { 0, 0 }, 63 + [FEAT_REG_DSIPLL_REGM] = { 0, 0 }, 64 + [FEAT_REG_DSIPLL_REGM_DISPC] = { 0, 0 }, 65 + [FEAT_REG_DSIPLL_REGM_DSI] = { 0, 0 }, 61 66 }; 62 67 63 68 static const struct dss_reg_field omap3_dss_reg_fields[] = { 64 - { FEAT_REG_FIRHINC, 12, 0 }, 65 - { FEAT_REG_FIRVINC, 28, 16 }, 66 - { FEAT_REG_FIFOLOWTHRESHOLD, 11, 0 }, 67 - { FEAT_REG_FIFOHIGHTHRESHOLD, 27, 16 }, 68 - { FEAT_REG_FIFOSIZE, 10, 0 }, 69 + [FEAT_REG_FIRHINC] = { 12, 0 }, 70 + [FEAT_REG_FIRVINC] = { 28, 16 }, 71 + [FEAT_REG_FIFOLOWTHRESHOLD] = { 11, 0 }, 72 + [FEAT_REG_FIFOHIGHTHRESHOLD] = { 27, 16 }, 73 + [FEAT_REG_FIFOSIZE] = { 10, 0 }, 74 + [FEAT_REG_HORIZONTALACCU] = { 9, 0 }, 75 + [FEAT_REG_VERTICALACCU] = { 25, 16 }, 76 + [FEAT_REG_DISPC_CLK_SWITCH] = { 0, 0 }, 77 + [FEAT_REG_DSIPLL_REGN] = { 7, 1 }, 78 + [FEAT_REG_DSIPLL_REGM] = { 18, 8 }, 79 + [FEAT_REG_DSIPLL_REGM_DISPC] = { 22, 19 }, 80 + [FEAT_REG_DSIPLL_REGM_DSI] = { 26, 23 }, 81 + }; 82 + 83 + static const struct dss_reg_field omap4_dss_reg_fields[] = { 84 + [FEAT_REG_FIRHINC] = { 12, 0 }, 85 + [FEAT_REG_FIRVINC] = { 28, 16 }, 86 + [FEAT_REG_FIFOLOWTHRESHOLD] = { 15, 0 }, 87 + [FEAT_REG_FIFOHIGHTHRESHOLD] = { 31, 16 }, 88 + [FEAT_REG_FIFOSIZE] = { 15, 0 }, 89 + [FEAT_REG_HORIZONTALACCU] = { 10, 0 }, 90 + [FEAT_REG_VERTICALACCU] = { 26, 16 }, 91 + [FEAT_REG_DISPC_CLK_SWITCH] = { 9, 8 }, 92 + [FEAT_REG_DSIPLL_REGN] = { 8, 1 }, 93 + [FEAT_REG_DSIPLL_REGM] = { 20, 9 }, 94 + [FEAT_REG_DSIPLL_REGM_DISPC] = { 25, 21 }, 95 + [FEAT_REG_DSIPLL_REGM_DSI] = { 30, 26 }, 69 96 }; 70 97 71 98 static const enum omap_display_type omap2_dss_supported_displays[] = { 99 + /* OMAP_DSS_CHANNEL_LCD */ 100 + OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI, 101 + 102 + /* OMAP_DSS_CHANNEL_DIGIT */ 103 + OMAP_DISPLAY_TYPE_VENC, 104 + }; 105 + 106 + static const enum omap_display_type omap3430_dss_supported_displays[] = { 72 107 /* OMAP_DSS_CHANNEL_LCD */ 73 108 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | 74 109 OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI, ··· 116 73 OMAP_DISPLAY_TYPE_VENC, 117 74 }; 118 75 119 - static const enum omap_display_type omap3_dss_supported_displays[] = { 76 + static const enum omap_display_type omap3630_dss_supported_displays[] = { 120 77 /* OMAP_DSS_CHANNEL_LCD */ 121 78 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | 122 - OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI, 79 + OMAP_DISPLAY_TYPE_DSI, 123 80 124 81 /* OMAP_DSS_CHANNEL_DIGIT */ 125 82 OMAP_DISPLAY_TYPE_VENC, ··· 130 87 OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI, 131 88 132 89 /* OMAP_DSS_CHANNEL_DIGIT */ 133 - OMAP_DISPLAY_TYPE_VENC, 90 + OMAP_DISPLAY_TYPE_VENC | OMAP_DISPLAY_TYPE_HDMI, 134 91 135 92 /* OMAP_DSS_CHANNEL_LCD2 */ 136 93 OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | ··· 177 134 OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, 178 135 }; 179 136 137 + static const char * const omap2_dss_clk_source_names[] = { 138 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "N/A", 139 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "N/A", 140 + [DSS_CLK_SRC_FCK] = "DSS_FCLK1", 141 + }; 142 + 143 + static const char * const omap3_dss_clk_source_names[] = { 144 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI1_PLL_FCLK", 145 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI2_PLL_FCLK", 146 + [DSS_CLK_SRC_FCK] = "DSS1_ALWON_FCLK", 147 + }; 148 + 149 + static const char * const omap4_dss_clk_source_names[] = { 150 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "PLL1_CLK1", 151 + [DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "PLL1_CLK2", 152 + [DSS_CLK_SRC_FCK] = "DSS_FCLK", 153 + }; 154 + 155 + static const struct dss_param_range omap2_dss_param_range[] = { 156 + [FEAT_PARAM_DSS_FCK] = { 0, 173000000 }, 157 + [FEAT_PARAM_DSIPLL_REGN] = { 0, 0 }, 158 + [FEAT_PARAM_DSIPLL_REGM] = { 0, 0 }, 159 + [FEAT_PARAM_DSIPLL_REGM_DISPC] = { 0, 0 }, 160 + [FEAT_PARAM_DSIPLL_REGM_DSI] = { 0, 0 }, 161 + [FEAT_PARAM_DSIPLL_FINT] = { 0, 0 }, 162 + [FEAT_PARAM_DSIPLL_LPDIV] = { 0, 0 }, 163 + }; 164 + 165 + static const struct dss_param_range omap3_dss_param_range[] = { 166 + [FEAT_PARAM_DSS_FCK] = { 0, 173000000 }, 167 + [FEAT_PARAM_DSIPLL_REGN] = { 0, (1 << 7) - 1 }, 168 + [FEAT_PARAM_DSIPLL_REGM] = { 0, (1 << 11) - 1 }, 169 + [FEAT_PARAM_DSIPLL_REGM_DISPC] = { 0, (1 << 4) - 1 }, 170 + [FEAT_PARAM_DSIPLL_REGM_DSI] = { 0, (1 << 4) - 1 }, 171 + [FEAT_PARAM_DSIPLL_FINT] = { 750000, 2100000 }, 172 + [FEAT_PARAM_DSIPLL_LPDIV] = { 1, (1 << 13) - 1}, 173 + }; 174 + 175 + static const struct dss_param_range omap4_dss_param_range[] = { 176 + [FEAT_PARAM_DSS_FCK] = { 0, 186000000 }, 177 + [FEAT_PARAM_DSIPLL_REGN] = { 0, (1 << 8) - 1 }, 178 + [FEAT_PARAM_DSIPLL_REGM] = { 0, (1 << 12) - 1 }, 179 + [FEAT_PARAM_DSIPLL_REGM_DISPC] = { 0, (1 << 5) - 1 }, 180 + [FEAT_PARAM_DSIPLL_REGM_DSI] = { 0, (1 << 5) - 1 }, 181 + [FEAT_PARAM_DSIPLL_FINT] = { 500000, 2500000 }, 182 + [FEAT_PARAM_DSIPLL_LPDIV] = { 0, (1 << 13) - 1 }, 183 + }; 184 + 180 185 /* OMAP2 DSS Features */ 181 186 static struct omap_dss_features omap2_dss_features = { 182 187 .reg_fields = omap2_dss_reg_fields, ··· 232 141 233 142 .has_feature = 234 143 FEAT_LCDENABLEPOL | FEAT_LCDENABLESIGNAL | 235 - FEAT_PCKFREEENABLE | FEAT_FUNCGATED, 144 + FEAT_PCKFREEENABLE | FEAT_FUNCGATED | 145 + FEAT_ROWREPEATENABLE | FEAT_RESIZECONF, 236 146 237 147 .num_mgrs = 2, 238 148 .num_ovls = 3, 239 149 .supported_displays = omap2_dss_supported_displays, 240 150 .supported_color_modes = omap2_dss_supported_color_modes, 151 + .clksrc_names = omap2_dss_clk_source_names, 152 + .dss_params = omap2_dss_param_range, 241 153 }; 242 154 243 155 /* OMAP3 DSS Features */ ··· 251 157 .has_feature = 252 158 FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | 253 159 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | 254 - FEAT_FUNCGATED, 160 + FEAT_FUNCGATED | FEAT_ROWREPEATENABLE | 161 + FEAT_LINEBUFFERSPLIT | FEAT_RESIZECONF, 255 162 256 163 .num_mgrs = 2, 257 164 .num_ovls = 3, 258 - .supported_displays = omap3_dss_supported_displays, 165 + .supported_displays = omap3430_dss_supported_displays, 259 166 .supported_color_modes = omap3_dss_supported_color_modes, 167 + .clksrc_names = omap3_dss_clk_source_names, 168 + .dss_params = omap3_dss_param_range, 260 169 }; 261 170 262 171 static struct omap_dss_features omap3630_dss_features = { ··· 269 172 .has_feature = 270 173 FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | 271 174 FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | 272 - FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED, 175 + FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED | 176 + FEAT_ROWREPEATENABLE | FEAT_LINEBUFFERSPLIT | 177 + FEAT_RESIZECONF, 273 178 274 179 .num_mgrs = 2, 275 180 .num_ovls = 3, 276 - .supported_displays = omap3_dss_supported_displays, 181 + .supported_displays = omap3630_dss_supported_displays, 277 182 .supported_color_modes = omap3_dss_supported_color_modes, 183 + .clksrc_names = omap3_dss_clk_source_names, 184 + .dss_params = omap3_dss_param_range, 278 185 }; 279 186 280 187 /* OMAP4 DSS Features */ 281 188 static struct omap_dss_features omap4_dss_features = { 282 - .reg_fields = omap3_dss_reg_fields, 283 - .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), 189 + .reg_fields = omap4_dss_reg_fields, 190 + .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields), 284 191 285 192 .has_feature = 286 193 FEAT_GLOBAL_ALPHA | FEAT_PRE_MULT_ALPHA | 287 - FEAT_MGR_LCD2, 194 + FEAT_MGR_LCD2 | FEAT_GLOBAL_ALPHA_VID1 | 195 + FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC, 288 196 289 197 .num_mgrs = 3, 290 198 .num_ovls = 3, 291 199 .supported_displays = omap4_dss_supported_displays, 292 200 .supported_color_modes = omap3_dss_supported_color_modes, 201 + .clksrc_names = omap4_dss_clk_source_names, 202 + .dss_params = omap4_dss_param_range, 293 203 }; 294 204 295 205 /* Functions returning values related to a DSS feature */ ··· 308 204 int dss_feat_get_num_ovls(void) 309 205 { 310 206 return omap_current_dss_features->num_ovls; 207 + } 208 + 209 + unsigned long dss_feat_get_param_min(enum dss_range_param param) 210 + { 211 + return omap_current_dss_features->dss_params[param].min; 212 + } 213 + 214 + unsigned long dss_feat_get_param_max(enum dss_range_param param) 215 + { 216 + return omap_current_dss_features->dss_params[param].max; 311 217 } 312 218 313 219 enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel) ··· 335 221 { 336 222 return omap_current_dss_features->supported_color_modes[plane] & 337 223 color_mode; 224 + } 225 + 226 + const char *dss_feat_get_clk_source_name(enum dss_clk_source id) 227 + { 228 + return omap_current_dss_features->clksrc_names[id]; 338 229 } 339 230 340 231 /* DSS has_feature check */
+27
drivers/video/omap2/dss/dss_features.h
··· 22 22 23 23 #define MAX_DSS_MANAGERS 3 24 24 #define MAX_DSS_OVERLAYS 3 25 + #define MAX_DSS_LCD_MANAGERS 2 25 26 26 27 /* DSS has feature id */ 27 28 enum dss_feat_id { ··· 34 33 FEAT_PCKFREEENABLE = 1 << 5, 35 34 FEAT_FUNCGATED = 1 << 6, 36 35 FEAT_MGR_LCD2 = 1 << 7, 36 + FEAT_LINEBUFFERSPLIT = 1 << 8, 37 + FEAT_ROWREPEATENABLE = 1 << 9, 38 + FEAT_RESIZECONF = 1 << 10, 39 + /* Independent core clk divider */ 40 + FEAT_CORE_CLK_DIV = 1 << 11, 41 + FEAT_LCD_CLK_SRC = 1 << 12, 37 42 }; 38 43 39 44 /* DSS register field id */ ··· 49 42 FEAT_REG_FIFOHIGHTHRESHOLD, 50 43 FEAT_REG_FIFOLOWTHRESHOLD, 51 44 FEAT_REG_FIFOSIZE, 45 + FEAT_REG_HORIZONTALACCU, 46 + FEAT_REG_VERTICALACCU, 47 + FEAT_REG_DISPC_CLK_SWITCH, 48 + FEAT_REG_DSIPLL_REGN, 49 + FEAT_REG_DSIPLL_REGM, 50 + FEAT_REG_DSIPLL_REGM_DISPC, 51 + FEAT_REG_DSIPLL_REGM_DSI, 52 + }; 53 + 54 + enum dss_range_param { 55 + FEAT_PARAM_DSS_FCK, 56 + FEAT_PARAM_DSIPLL_REGN, 57 + FEAT_PARAM_DSIPLL_REGM, 58 + FEAT_PARAM_DSIPLL_REGM_DISPC, 59 + FEAT_PARAM_DSIPLL_REGM_DSI, 60 + FEAT_PARAM_DSIPLL_FINT, 61 + FEAT_PARAM_DSIPLL_LPDIV, 52 62 }; 53 63 54 64 /* DSS Feature Functions */ 55 65 int dss_feat_get_num_mgrs(void); 56 66 int dss_feat_get_num_ovls(void); 67 + unsigned long dss_feat_get_param_min(enum dss_range_param param); 68 + unsigned long dss_feat_get_param_max(enum dss_range_param param); 57 69 enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel); 58 70 enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); 59 71 bool dss_feat_color_mode_supported(enum omap_plane plane, 60 72 enum omap_color_mode color_mode); 73 + const char *dss_feat_get_clk_source_name(enum dss_clk_source id); 61 74 62 75 bool dss_has_feature(enum dss_feat_id id); 63 76 void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end);
+1332
drivers/video/omap2/dss/hdmi.c
··· 1 + /* 2 + * hdmi.c 3 + * 4 + * HDMI interface DSS driver setting for TI's OMAP4 family of processor. 5 + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/ 6 + * Authors: Yong Zhi 7 + * Mythri pk <mythripk@ti.com> 8 + * 9 + * This program is free software; you can redistribute it and/or modify it 10 + * under the terms of the GNU General Public License version 2 as published by 11 + * the Free Software Foundation. 12 + * 13 + * This program is distributed in the hope that it will be useful, but WITHOUT 14 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 + * more details. 17 + * 18 + * You should have received a copy of the GNU General Public License along with 19 + * this program. If not, see <http://www.gnu.org/licenses/>. 20 + */ 21 + 22 + #define DSS_SUBSYS_NAME "HDMI" 23 + 24 + #include <linux/kernel.h> 25 + #include <linux/module.h> 26 + #include <linux/err.h> 27 + #include <linux/io.h> 28 + #include <linux/interrupt.h> 29 + #include <linux/mutex.h> 30 + #include <linux/delay.h> 31 + #include <linux/string.h> 32 + #include <plat/display.h> 33 + 34 + #include "dss.h" 35 + #include "hdmi.h" 36 + 37 + static struct { 38 + struct mutex lock; 39 + struct omap_display_platform_data *pdata; 40 + struct platform_device *pdev; 41 + void __iomem *base_wp; /* HDMI wrapper */ 42 + int code; 43 + int mode; 44 + u8 edid[HDMI_EDID_MAX_LENGTH]; 45 + u8 edid_set; 46 + bool custom_set; 47 + struct hdmi_config cfg; 48 + } hdmi; 49 + 50 + /* 51 + * Logic for the below structure : 52 + * user enters the CEA or VESA timings by specifying the HDMI/DVI code. 53 + * There is a correspondence between CEA/VESA timing and code, please 54 + * refer to section 6.3 in HDMI 1.3 specification for timing code. 55 + * 56 + * In the below structure, cea_vesa_timings corresponds to all OMAP4 57 + * supported CEA and VESA timing values.code_cea corresponds to the CEA 58 + * code, It is used to get the timing from cea_vesa_timing array.Similarly 59 + * with code_vesa. Code_index is used for back mapping, that is once EDID 60 + * is read from the TV, EDID is parsed to find the timing values and then 61 + * map it to corresponding CEA or VESA index. 62 + */ 63 + 64 + static const struct hdmi_timings cea_vesa_timings[OMAP_HDMI_TIMINGS_NB] = { 65 + { {640, 480, 25200, 96, 16, 48, 2, 10, 33} , 0 , 0}, 66 + { {1280, 720, 74250, 40, 440, 220, 5, 5, 20}, 1, 1}, 67 + { {1280, 720, 74250, 40, 110, 220, 5, 5, 20}, 1, 1}, 68 + { {720, 480, 27027, 62, 16, 60, 6, 9, 30}, 0, 0}, 69 + { {2880, 576, 108000, 256, 48, 272, 5, 5, 39}, 0, 0}, 70 + { {1440, 240, 27027, 124, 38, 114, 3, 4, 15}, 0, 0}, 71 + { {1440, 288, 27000, 126, 24, 138, 3, 2, 19}, 0, 0}, 72 + { {1920, 540, 74250, 44, 528, 148, 5, 2, 15}, 1, 1}, 73 + { {1920, 540, 74250, 44, 88, 148, 5, 2, 15}, 1, 1}, 74 + { {1920, 1080, 148500, 44, 88, 148, 5, 4, 36}, 1, 1}, 75 + { {720, 576, 27000, 64, 12, 68, 5, 5, 39}, 0, 0}, 76 + { {1440, 576, 54000, 128, 24, 136, 5, 5, 39}, 0, 0}, 77 + { {1920, 1080, 148500, 44, 528, 148, 5, 4, 36}, 1, 1}, 78 + { {2880, 480, 108108, 248, 64, 240, 6, 9, 30}, 0, 0}, 79 + { {1920, 1080, 74250, 44, 638, 148, 5, 4, 36}, 1, 1}, 80 + /* VESA From Here */ 81 + { {640, 480, 25175, 96, 16, 48, 2 , 11, 31}, 0, 0}, 82 + { {800, 600, 40000, 128, 40, 88, 4 , 1, 23}, 1, 1}, 83 + { {848, 480, 33750, 112, 16, 112, 8 , 6, 23}, 1, 1}, 84 + { {1280, 768, 79500, 128, 64, 192, 7 , 3, 20}, 1, 0}, 85 + { {1280, 800, 83500, 128, 72, 200, 6 , 3, 22}, 1, 0}, 86 + { {1360, 768, 85500, 112, 64, 256, 6 , 3, 18}, 1, 1}, 87 + { {1280, 960, 108000, 112, 96, 312, 3 , 1, 36}, 1, 1}, 88 + { {1280, 1024, 108000, 112, 48, 248, 3 , 1, 38}, 1, 1}, 89 + { {1024, 768, 65000, 136, 24, 160, 6, 3, 29}, 0, 0}, 90 + { {1400, 1050, 121750, 144, 88, 232, 4, 3, 32}, 1, 0}, 91 + { {1440, 900, 106500, 152, 80, 232, 6, 3, 25}, 1, 0}, 92 + { {1680, 1050, 146250, 176 , 104, 280, 6, 3, 30}, 1, 0}, 93 + { {1366, 768, 85500, 143, 70, 213, 3, 3, 24}, 1, 1}, 94 + { {1920, 1080, 148500, 44, 148, 80, 5, 4, 36}, 1, 1}, 95 + { {1280, 768, 68250, 32, 48, 80, 7, 3, 12}, 0, 1}, 96 + { {1400, 1050, 101000, 32, 48, 80, 4, 3, 23}, 0, 1}, 97 + { {1680, 1050, 119000, 32, 48, 80, 6, 3, 21}, 0, 1}, 98 + { {1280, 800, 79500, 32, 48, 80, 6, 3, 14}, 0, 1}, 99 + { {1280, 720, 74250, 40, 110, 220, 5, 5, 20}, 1, 1} 100 + }; 101 + 102 + /* 103 + * This is a static mapping array which maps the timing values 104 + * with corresponding CEA / VESA code 105 + */ 106 + static const int code_index[OMAP_HDMI_TIMINGS_NB] = { 107 + 1, 19, 4, 2, 37, 6, 21, 20, 5, 16, 17, 29, 31, 35, 32, 108 + /* <--15 CEA 17--> vesa*/ 109 + 4, 9, 0xE, 0x17, 0x1C, 0x27, 0x20, 0x23, 0x10, 0x2A, 110 + 0X2F, 0x3A, 0X51, 0X52, 0x16, 0x29, 0x39, 0x1B 111 + }; 112 + 113 + /* 114 + * This is reverse static mapping which maps the CEA / VESA code 115 + * to the corresponding timing values 116 + */ 117 + static const int code_cea[39] = { 118 + -1, 0, 3, 3, 2, 8, 5, 5, -1, -1, 119 + -1, -1, -1, -1, -1, -1, 9, 10, 10, 1, 120 + 7, 6, 6, -1, -1, -1, -1, -1, -1, 11, 121 + 11, 12, 14, -1, -1, 13, 13, 4, 4 122 + }; 123 + 124 + static const int code_vesa[85] = { 125 + -1, -1, -1, -1, 15, -1, -1, -1, -1, 16, 126 + -1, -1, -1, -1, 17, -1, 23, -1, -1, -1, 127 + -1, -1, 29, 18, -1, -1, -1, 32, 19, -1, 128 + -1, -1, 21, -1, -1, 22, -1, -1, -1, 20, 129 + -1, 30, 24, -1, -1, -1, -1, 25, -1, -1, 130 + -1, -1, -1, -1, -1, -1, -1, 31, 26, -1, 131 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 132 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133 + -1, 27, 28, -1, 33}; 134 + 135 + static const u8 edid_header[8] = {0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0}; 136 + 137 + static inline void hdmi_write_reg(const struct hdmi_reg idx, u32 val) 138 + { 139 + __raw_writel(val, hdmi.base_wp + idx.idx); 140 + } 141 + 142 + static inline u32 hdmi_read_reg(const struct hdmi_reg idx) 143 + { 144 + return __raw_readl(hdmi.base_wp + idx.idx); 145 + } 146 + 147 + static inline int hdmi_wait_for_bit_change(const struct hdmi_reg idx, 148 + int b2, int b1, u32 val) 149 + { 150 + u32 t = 0; 151 + while (val != REG_GET(idx, b2, b1)) { 152 + udelay(1); 153 + if (t++ > 10000) 154 + return !val; 155 + } 156 + return val; 157 + } 158 + 159 + int hdmi_init_display(struct omap_dss_device *dssdev) 160 + { 161 + DSSDBG("init_display\n"); 162 + 163 + return 0; 164 + } 165 + 166 + static int hdmi_pll_init(enum hdmi_clk_refsel refsel, int dcofreq, 167 + struct hdmi_pll_info *fmt, u16 sd) 168 + { 169 + u32 r; 170 + 171 + /* PLL start always use manual mode */ 172 + REG_FLD_MOD(PLLCTRL_PLL_CONTROL, 0x0, 0, 0); 173 + 174 + r = hdmi_read_reg(PLLCTRL_CFG1); 175 + r = FLD_MOD(r, fmt->regm, 20, 9); /* CFG1_PLL_REGM */ 176 + r = FLD_MOD(r, fmt->regn, 8, 1); /* CFG1_PLL_REGN */ 177 + 178 + hdmi_write_reg(PLLCTRL_CFG1, r); 179 + 180 + r = hdmi_read_reg(PLLCTRL_CFG2); 181 + 182 + r = FLD_MOD(r, 0x0, 12, 12); /* PLL_HIGHFREQ divide by 2 */ 183 + r = FLD_MOD(r, 0x1, 13, 13); /* PLL_REFEN */ 184 + r = FLD_MOD(r, 0x0, 14, 14); /* PHY_CLKINEN de-assert during locking */ 185 + 186 + if (dcofreq) { 187 + /* divider programming for frequency beyond 1000Mhz */ 188 + REG_FLD_MOD(PLLCTRL_CFG3, sd, 17, 10); 189 + r = FLD_MOD(r, 0x4, 3, 1); /* 1000MHz and 2000MHz */ 190 + } else { 191 + r = FLD_MOD(r, 0x2, 3, 1); /* 500MHz and 1000MHz */ 192 + } 193 + 194 + hdmi_write_reg(PLLCTRL_CFG2, r); 195 + 196 + r = hdmi_read_reg(PLLCTRL_CFG4); 197 + r = FLD_MOD(r, fmt->regm2, 24, 18); 198 + r = FLD_MOD(r, fmt->regmf, 17, 0); 199 + 200 + hdmi_write_reg(PLLCTRL_CFG4, r); 201 + 202 + /* go now */ 203 + REG_FLD_MOD(PLLCTRL_PLL_GO, 0x1, 0, 0); 204 + 205 + /* wait for bit change */ 206 + if (hdmi_wait_for_bit_change(PLLCTRL_PLL_GO, 0, 0, 1) != 1) { 207 + DSSERR("PLL GO bit not set\n"); 208 + return -ETIMEDOUT; 209 + } 210 + 211 + /* Wait till the lock bit is set in PLL status */ 212 + if (hdmi_wait_for_bit_change(PLLCTRL_PLL_STATUS, 1, 1, 1) != 1) { 213 + DSSWARN("cannot lock PLL\n"); 214 + DSSWARN("CFG1 0x%x\n", 215 + hdmi_read_reg(PLLCTRL_CFG1)); 216 + DSSWARN("CFG2 0x%x\n", 217 + hdmi_read_reg(PLLCTRL_CFG2)); 218 + DSSWARN("CFG4 0x%x\n", 219 + hdmi_read_reg(PLLCTRL_CFG4)); 220 + return -ETIMEDOUT; 221 + } 222 + 223 + DSSDBG("PLL locked!\n"); 224 + 225 + return 0; 226 + } 227 + 228 + /* PHY_PWR_CMD */ 229 + static int hdmi_set_phy_pwr(enum hdmi_phy_pwr val) 230 + { 231 + /* Command for power control of HDMI PHY */ 232 + REG_FLD_MOD(HDMI_WP_PWR_CTRL, val, 7, 6); 233 + 234 + /* Status of the power control of HDMI PHY */ 235 + if (hdmi_wait_for_bit_change(HDMI_WP_PWR_CTRL, 5, 4, val) != val) { 236 + DSSERR("Failed to set PHY power mode to %d\n", val); 237 + return -ETIMEDOUT; 238 + } 239 + 240 + return 0; 241 + } 242 + 243 + /* PLL_PWR_CMD */ 244 + static int hdmi_set_pll_pwr(enum hdmi_pll_pwr val) 245 + { 246 + /* Command for power control of HDMI PLL */ 247 + REG_FLD_MOD(HDMI_WP_PWR_CTRL, val, 3, 2); 248 + 249 + /* wait till PHY_PWR_STATUS is set */ 250 + if (hdmi_wait_for_bit_change(HDMI_WP_PWR_CTRL, 1, 0, val) != val) { 251 + DSSERR("Failed to set PHY_PWR_STATUS\n"); 252 + return -ETIMEDOUT; 253 + } 254 + 255 + return 0; 256 + } 257 + 258 + static int hdmi_pll_reset(void) 259 + { 260 + /* SYSRESET controlled by power FSM */ 261 + REG_FLD_MOD(PLLCTRL_PLL_CONTROL, 0x0, 3, 3); 262 + 263 + /* READ 0x0 reset is in progress */ 264 + if (hdmi_wait_for_bit_change(PLLCTRL_PLL_STATUS, 0, 0, 1) != 1) { 265 + DSSERR("Failed to sysreset PLL\n"); 266 + return -ETIMEDOUT; 267 + } 268 + 269 + return 0; 270 + } 271 + 272 + static int hdmi_phy_init(void) 273 + { 274 + u16 r = 0; 275 + 276 + r = hdmi_set_phy_pwr(HDMI_PHYPWRCMD_LDOON); 277 + if (r) 278 + return r; 279 + 280 + r = hdmi_set_phy_pwr(HDMI_PHYPWRCMD_TXON); 281 + if (r) 282 + return r; 283 + 284 + /* 285 + * Read address 0 in order to get the SCP reset done completed 286 + * Dummy access performed to make sure reset is done 287 + */ 288 + hdmi_read_reg(HDMI_TXPHY_TX_CTRL); 289 + 290 + /* 291 + * Write to phy address 0 to configure the clock 292 + * use HFBITCLK write HDMI_TXPHY_TX_CONTROL_FREQOUT field 293 + */ 294 + REG_FLD_MOD(HDMI_TXPHY_TX_CTRL, 0x1, 31, 30); 295 + 296 + /* Write to phy address 1 to start HDMI line (TXVALID and TMDSCLKEN) */ 297 + hdmi_write_reg(HDMI_TXPHY_DIGITAL_CTRL, 0xF0000000); 298 + 299 + /* Setup max LDO voltage */ 300 + REG_FLD_MOD(HDMI_TXPHY_POWER_CTRL, 0xB, 3, 0); 301 + 302 + /* Write to phy address 3 to change the polarity control */ 303 + REG_FLD_MOD(HDMI_TXPHY_PAD_CFG_CTRL, 0x1, 27, 27); 304 + 305 + return 0; 306 + } 307 + 308 + static int hdmi_wait_softreset(void) 309 + { 310 + /* reset W1 */ 311 + REG_FLD_MOD(HDMI_WP_SYSCONFIG, 0x1, 0, 0); 312 + 313 + /* wait till SOFTRESET == 0 */ 314 + if (hdmi_wait_for_bit_change(HDMI_WP_SYSCONFIG, 0, 0, 0) != 0) { 315 + DSSERR("sysconfig reset failed\n"); 316 + return -ETIMEDOUT; 317 + } 318 + 319 + return 0; 320 + } 321 + 322 + static int hdmi_pll_program(struct hdmi_pll_info *fmt) 323 + { 324 + u16 r = 0; 325 + enum hdmi_clk_refsel refsel; 326 + 327 + /* wait for wrapper reset */ 328 + r = hdmi_wait_softreset(); 329 + if (r) 330 + return r; 331 + 332 + r = hdmi_set_pll_pwr(HDMI_PLLPWRCMD_ALLOFF); 333 + if (r) 334 + return r; 335 + 336 + r = hdmi_set_pll_pwr(HDMI_PLLPWRCMD_BOTHON_ALLCLKS); 337 + if (r) 338 + return r; 339 + 340 + r = hdmi_pll_reset(); 341 + if (r) 342 + return r; 343 + 344 + refsel = HDMI_REFSEL_SYSCLK; 345 + 346 + r = hdmi_pll_init(refsel, fmt->dcofreq, fmt, fmt->regsd); 347 + if (r) 348 + return r; 349 + 350 + return 0; 351 + } 352 + 353 + static void hdmi_phy_off(void) 354 + { 355 + hdmi_set_phy_pwr(HDMI_PHYPWRCMD_OFF); 356 + } 357 + 358 + static int hdmi_core_ddc_edid(u8 *pedid, int ext) 359 + { 360 + u32 i, j; 361 + char checksum = 0; 362 + u32 offset = 0; 363 + 364 + /* Turn on CLK for DDC */ 365 + REG_FLD_MOD(HDMI_CORE_AV_DPD, 0x7, 2, 0); 366 + 367 + /* 368 + * SW HACK : Without the Delay DDC(i2c bus) reads 0 values / 369 + * right shifted values( The behavior is not consistent and seen only 370 + * with some TV's) 371 + */ 372 + usleep_range(800, 1000); 373 + 374 + if (!ext) { 375 + /* Clk SCL Devices */ 376 + REG_FLD_MOD(HDMI_CORE_DDC_CMD, 0xA, 3, 0); 377 + 378 + /* HDMI_CORE_DDC_STATUS_IN_PROG */ 379 + if (hdmi_wait_for_bit_change(HDMI_CORE_DDC_STATUS, 380 + 4, 4, 0) != 0) { 381 + DSSERR("Failed to program DDC\n"); 382 + return -ETIMEDOUT; 383 + } 384 + 385 + /* Clear FIFO */ 386 + REG_FLD_MOD(HDMI_CORE_DDC_CMD, 0x9, 3, 0); 387 + 388 + /* HDMI_CORE_DDC_STATUS_IN_PROG */ 389 + if (hdmi_wait_for_bit_change(HDMI_CORE_DDC_STATUS, 390 + 4, 4, 0) != 0) { 391 + DSSERR("Failed to program DDC\n"); 392 + return -ETIMEDOUT; 393 + } 394 + 395 + } else { 396 + if (ext % 2 != 0) 397 + offset = 0x80; 398 + } 399 + 400 + /* Load Segment Address Register */ 401 + REG_FLD_MOD(HDMI_CORE_DDC_SEGM, ext/2, 7, 0); 402 + 403 + /* Load Slave Address Register */ 404 + REG_FLD_MOD(HDMI_CORE_DDC_ADDR, 0xA0 >> 1, 7, 1); 405 + 406 + /* Load Offset Address Register */ 407 + REG_FLD_MOD(HDMI_CORE_DDC_OFFSET, offset, 7, 0); 408 + 409 + /* Load Byte Count */ 410 + REG_FLD_MOD(HDMI_CORE_DDC_COUNT1, 0x80, 7, 0); 411 + REG_FLD_MOD(HDMI_CORE_DDC_COUNT2, 0x0, 1, 0); 412 + 413 + /* Set DDC_CMD */ 414 + if (ext) 415 + REG_FLD_MOD(HDMI_CORE_DDC_CMD, 0x4, 3, 0); 416 + else 417 + REG_FLD_MOD(HDMI_CORE_DDC_CMD, 0x2, 3, 0); 418 + 419 + /* HDMI_CORE_DDC_STATUS_BUS_LOW */ 420 + if (REG_GET(HDMI_CORE_DDC_STATUS, 6, 6) == 1) { 421 + DSSWARN("I2C Bus Low?\n"); 422 + return -EIO; 423 + } 424 + /* HDMI_CORE_DDC_STATUS_NO_ACK */ 425 + if (REG_GET(HDMI_CORE_DDC_STATUS, 5, 5) == 1) { 426 + DSSWARN("I2C No Ack\n"); 427 + return -EIO; 428 + } 429 + 430 + i = ext * 128; 431 + j = 0; 432 + while (((REG_GET(HDMI_CORE_DDC_STATUS, 4, 4) == 1) || 433 + (REG_GET(HDMI_CORE_DDC_STATUS, 2, 2) == 0)) && 434 + j < 128) { 435 + 436 + if (REG_GET(HDMI_CORE_DDC_STATUS, 2, 2) == 0) { 437 + /* FIFO not empty */ 438 + pedid[i++] = REG_GET(HDMI_CORE_DDC_DATA, 7, 0); 439 + j++; 440 + } 441 + } 442 + 443 + for (j = 0; j < 128; j++) 444 + checksum += pedid[j]; 445 + 446 + if (checksum != 0) { 447 + DSSERR("E-EDID checksum failed!!\n"); 448 + return -EIO; 449 + } 450 + 451 + return 0; 452 + } 453 + 454 + static int read_edid(u8 *pedid, u16 max_length) 455 + { 456 + int r = 0, n = 0, i = 0; 457 + int max_ext_blocks = (max_length / 128) - 1; 458 + 459 + r = hdmi_core_ddc_edid(pedid, 0); 460 + if (r) { 461 + return r; 462 + } else { 463 + n = pedid[0x7e]; 464 + 465 + /* 466 + * README: need to comply with max_length set by the caller. 467 + * Better implementation should be to allocate necessary 468 + * memory to store EDID according to nb_block field found 469 + * in first block 470 + */ 471 + if (n > max_ext_blocks) 472 + n = max_ext_blocks; 473 + 474 + for (i = 1; i <= n; i++) { 475 + r = hdmi_core_ddc_edid(pedid, i); 476 + if (r) 477 + return r; 478 + } 479 + } 480 + return 0; 481 + } 482 + 483 + static int get_timings_index(void) 484 + { 485 + int code; 486 + 487 + if (hdmi.mode == 0) 488 + code = code_vesa[hdmi.code]; 489 + else 490 + code = code_cea[hdmi.code]; 491 + 492 + if (code == -1) { 493 + /* HDMI code 4 corresponds to 640 * 480 VGA */ 494 + hdmi.code = 4; 495 + /* DVI mode 1 corresponds to HDMI 0 to DVI */ 496 + hdmi.mode = HDMI_DVI; 497 + 498 + code = code_vesa[hdmi.code]; 499 + } 500 + return code; 501 + } 502 + 503 + static struct hdmi_cm hdmi_get_code(struct omap_video_timings *timing) 504 + { 505 + int i = 0, code = -1, temp_vsync = 0, temp_hsync = 0; 506 + int timing_vsync = 0, timing_hsync = 0; 507 + struct omap_video_timings temp; 508 + struct hdmi_cm cm = {-1}; 509 + DSSDBG("hdmi_get_code\n"); 510 + 511 + for (i = 0; i < OMAP_HDMI_TIMINGS_NB; i++) { 512 + temp = cea_vesa_timings[i].timings; 513 + if ((temp.pixel_clock == timing->pixel_clock) && 514 + (temp.x_res == timing->x_res) && 515 + (temp.y_res == timing->y_res)) { 516 + 517 + temp_hsync = temp.hfp + temp.hsw + temp.hbp; 518 + timing_hsync = timing->hfp + timing->hsw + timing->hbp; 519 + temp_vsync = temp.vfp + temp.vsw + temp.vbp; 520 + timing_vsync = timing->vfp + timing->vsw + timing->vbp; 521 + 522 + DSSDBG("temp_hsync = %d , temp_vsync = %d" 523 + "timing_hsync = %d, timing_vsync = %d\n", 524 + temp_hsync, temp_hsync, 525 + timing_hsync, timing_vsync); 526 + 527 + if ((temp_hsync == timing_hsync) && 528 + (temp_vsync == timing_vsync)) { 529 + code = i; 530 + cm.code = code_index[i]; 531 + if (code < 14) 532 + cm.mode = HDMI_HDMI; 533 + else 534 + cm.mode = HDMI_DVI; 535 + DSSDBG("Hdmi_code = %d mode = %d\n", 536 + cm.code, cm.mode); 537 + break; 538 + } 539 + } 540 + } 541 + 542 + return cm; 543 + } 544 + 545 + static void get_horz_vert_timing_info(int current_descriptor_addrs, u8 *edid , 546 + struct omap_video_timings *timings) 547 + { 548 + /* X and Y resolution */ 549 + timings->x_res = (((edid[current_descriptor_addrs + 4] & 0xF0) << 4) | 550 + edid[current_descriptor_addrs + 2]); 551 + timings->y_res = (((edid[current_descriptor_addrs + 7] & 0xF0) << 4) | 552 + edid[current_descriptor_addrs + 5]); 553 + 554 + timings->pixel_clock = ((edid[current_descriptor_addrs + 1] << 8) | 555 + edid[current_descriptor_addrs]); 556 + 557 + timings->pixel_clock = 10 * timings->pixel_clock; 558 + 559 + /* HORIZONTAL FRONT PORCH */ 560 + timings->hfp = edid[current_descriptor_addrs + 8] | 561 + ((edid[current_descriptor_addrs + 11] & 0xc0) << 2); 562 + /* HORIZONTAL SYNC WIDTH */ 563 + timings->hsw = edid[current_descriptor_addrs + 9] | 564 + ((edid[current_descriptor_addrs + 11] & 0x30) << 4); 565 + /* HORIZONTAL BACK PORCH */ 566 + timings->hbp = (((edid[current_descriptor_addrs + 4] & 0x0F) << 8) | 567 + edid[current_descriptor_addrs + 3]) - 568 + (timings->hfp + timings->hsw); 569 + /* VERTICAL FRONT PORCH */ 570 + timings->vfp = ((edid[current_descriptor_addrs + 10] & 0xF0) >> 4) | 571 + ((edid[current_descriptor_addrs + 11] & 0x0f) << 2); 572 + /* VERTICAL SYNC WIDTH */ 573 + timings->vsw = (edid[current_descriptor_addrs + 10] & 0x0F) | 574 + ((edid[current_descriptor_addrs + 11] & 0x03) << 4); 575 + /* VERTICAL BACK PORCH */ 576 + timings->vbp = (((edid[current_descriptor_addrs + 7] & 0x0F) << 8) | 577 + edid[current_descriptor_addrs + 6]) - 578 + (timings->vfp + timings->vsw); 579 + 580 + } 581 + 582 + /* Description : This function gets the resolution information from EDID */ 583 + static void get_edid_timing_data(u8 *edid) 584 + { 585 + u8 count; 586 + u16 current_descriptor_addrs; 587 + struct hdmi_cm cm; 588 + struct omap_video_timings edid_timings; 589 + 590 + /* seach block 0, there are 4 DTDs arranged in priority order */ 591 + for (count = 0; count < EDID_SIZE_BLOCK0_TIMING_DESCRIPTOR; count++) { 592 + current_descriptor_addrs = 593 + EDID_DESCRIPTOR_BLOCK0_ADDRESS + 594 + count * EDID_TIMING_DESCRIPTOR_SIZE; 595 + get_horz_vert_timing_info(current_descriptor_addrs, 596 + edid, &edid_timings); 597 + cm = hdmi_get_code(&edid_timings); 598 + DSSDBG("Block0[%d] value matches code = %d , mode = %d\n", 599 + count, cm.code, cm.mode); 600 + if (cm.code == -1) { 601 + continue; 602 + } else { 603 + hdmi.code = cm.code; 604 + hdmi.mode = cm.mode; 605 + DSSDBG("code = %d , mode = %d\n", 606 + hdmi.code, hdmi.mode); 607 + return; 608 + } 609 + } 610 + if (edid[0x7e] != 0x00) { 611 + for (count = 0; count < EDID_SIZE_BLOCK1_TIMING_DESCRIPTOR; 612 + count++) { 613 + current_descriptor_addrs = 614 + EDID_DESCRIPTOR_BLOCK1_ADDRESS + 615 + count * EDID_TIMING_DESCRIPTOR_SIZE; 616 + get_horz_vert_timing_info(current_descriptor_addrs, 617 + edid, &edid_timings); 618 + cm = hdmi_get_code(&edid_timings); 619 + DSSDBG("Block1[%d] value matches code = %d, mode = %d", 620 + count, cm.code, cm.mode); 621 + if (cm.code == -1) { 622 + continue; 623 + } else { 624 + hdmi.code = cm.code; 625 + hdmi.mode = cm.mode; 626 + DSSDBG("code = %d , mode = %d\n", 627 + hdmi.code, hdmi.mode); 628 + return; 629 + } 630 + } 631 + } 632 + 633 + DSSINFO("no valid timing found , falling back to VGA\n"); 634 + hdmi.code = 4; /* setting default value of 640 480 VGA */ 635 + hdmi.mode = HDMI_DVI; 636 + } 637 + 638 + static void hdmi_read_edid(struct omap_video_timings *dp) 639 + { 640 + int ret = 0, code; 641 + 642 + memset(hdmi.edid, 0, HDMI_EDID_MAX_LENGTH); 643 + 644 + if (!hdmi.edid_set) 645 + ret = read_edid(hdmi.edid, HDMI_EDID_MAX_LENGTH); 646 + 647 + if (!ret) { 648 + if (!memcmp(hdmi.edid, edid_header, sizeof(edid_header))) { 649 + /* search for timings of default resolution */ 650 + get_edid_timing_data(hdmi.edid); 651 + hdmi.edid_set = true; 652 + } 653 + } else { 654 + DSSWARN("failed to read E-EDID\n"); 655 + } 656 + 657 + if (!hdmi.edid_set) { 658 + DSSINFO("fallback to VGA\n"); 659 + hdmi.code = 4; /* setting default value of 640 480 VGA */ 660 + hdmi.mode = HDMI_DVI; 661 + } 662 + 663 + code = get_timings_index(); 664 + 665 + *dp = cea_vesa_timings[code].timings; 666 + } 667 + 668 + static void hdmi_core_init(struct hdmi_core_video_config *video_cfg, 669 + struct hdmi_core_infoframe_avi *avi_cfg, 670 + struct hdmi_core_packet_enable_repeat *repeat_cfg) 671 + { 672 + DSSDBG("Enter hdmi_core_init\n"); 673 + 674 + /* video core */ 675 + video_cfg->ip_bus_width = HDMI_INPUT_8BIT; 676 + video_cfg->op_dither_truc = HDMI_OUTPUTTRUNCATION_8BIT; 677 + video_cfg->deep_color_pkt = HDMI_DEEPCOLORPACKECTDISABLE; 678 + video_cfg->pkt_mode = HDMI_PACKETMODERESERVEDVALUE; 679 + video_cfg->hdmi_dvi = HDMI_DVI; 680 + video_cfg->tclk_sel_clkmult = HDMI_FPLL10IDCK; 681 + 682 + /* info frame */ 683 + avi_cfg->db1_format = 0; 684 + avi_cfg->db1_active_info = 0; 685 + avi_cfg->db1_bar_info_dv = 0; 686 + avi_cfg->db1_scan_info = 0; 687 + avi_cfg->db2_colorimetry = 0; 688 + avi_cfg->db2_aspect_ratio = 0; 689 + avi_cfg->db2_active_fmt_ar = 0; 690 + avi_cfg->db3_itc = 0; 691 + avi_cfg->db3_ec = 0; 692 + avi_cfg->db3_q_range = 0; 693 + avi_cfg->db3_nup_scaling = 0; 694 + avi_cfg->db4_videocode = 0; 695 + avi_cfg->db5_pixel_repeat = 0; 696 + avi_cfg->db6_7_line_eoftop = 0 ; 697 + avi_cfg->db8_9_line_sofbottom = 0; 698 + avi_cfg->db10_11_pixel_eofleft = 0; 699 + avi_cfg->db12_13_pixel_sofright = 0; 700 + 701 + /* packet enable and repeat */ 702 + repeat_cfg->audio_pkt = 0; 703 + repeat_cfg->audio_pkt_repeat = 0; 704 + repeat_cfg->avi_infoframe = 0; 705 + repeat_cfg->avi_infoframe_repeat = 0; 706 + repeat_cfg->gen_cntrl_pkt = 0; 707 + repeat_cfg->gen_cntrl_pkt_repeat = 0; 708 + repeat_cfg->generic_pkt = 0; 709 + repeat_cfg->generic_pkt_repeat = 0; 710 + } 711 + 712 + static void hdmi_core_powerdown_disable(void) 713 + { 714 + DSSDBG("Enter hdmi_core_powerdown_disable\n"); 715 + REG_FLD_MOD(HDMI_CORE_CTRL1, 0x0, 0, 0); 716 + } 717 + 718 + static void hdmi_core_swreset_release(void) 719 + { 720 + DSSDBG("Enter hdmi_core_swreset_release\n"); 721 + REG_FLD_MOD(HDMI_CORE_SYS_SRST, 0x0, 0, 0); 722 + } 723 + 724 + static void hdmi_core_swreset_assert(void) 725 + { 726 + DSSDBG("Enter hdmi_core_swreset_assert\n"); 727 + REG_FLD_MOD(HDMI_CORE_SYS_SRST, 0x1, 0, 0); 728 + } 729 + 730 + /* DSS_HDMI_CORE_VIDEO_CONFIG */ 731 + static void hdmi_core_video_config(struct hdmi_core_video_config *cfg) 732 + { 733 + u32 r = 0; 734 + 735 + /* sys_ctrl1 default configuration not tunable */ 736 + r = hdmi_read_reg(HDMI_CORE_CTRL1); 737 + r = FLD_MOD(r, HDMI_CORE_CTRL1_VEN_FOLLOWVSYNC, 5, 5); 738 + r = FLD_MOD(r, HDMI_CORE_CTRL1_HEN_FOLLOWHSYNC, 4, 4); 739 + r = FLD_MOD(r, HDMI_CORE_CTRL1_BSEL_24BITBUS, 2, 2); 740 + r = FLD_MOD(r, HDMI_CORE_CTRL1_EDGE_RISINGEDGE, 1, 1); 741 + hdmi_write_reg(HDMI_CORE_CTRL1, r); 742 + 743 + REG_FLD_MOD(HDMI_CORE_SYS_VID_ACEN, cfg->ip_bus_width, 7, 6); 744 + 745 + /* Vid_Mode */ 746 + r = hdmi_read_reg(HDMI_CORE_SYS_VID_MODE); 747 + 748 + /* dither truncation configuration */ 749 + if (cfg->op_dither_truc > HDMI_OUTPUTTRUNCATION_12BIT) { 750 + r = FLD_MOD(r, cfg->op_dither_truc - 3, 7, 6); 751 + r = FLD_MOD(r, 1, 5, 5); 752 + } else { 753 + r = FLD_MOD(r, cfg->op_dither_truc, 7, 6); 754 + r = FLD_MOD(r, 0, 5, 5); 755 + } 756 + hdmi_write_reg(HDMI_CORE_SYS_VID_MODE, r); 757 + 758 + /* HDMI_Ctrl */ 759 + r = hdmi_read_reg(HDMI_CORE_AV_HDMI_CTRL); 760 + r = FLD_MOD(r, cfg->deep_color_pkt, 6, 6); 761 + r = FLD_MOD(r, cfg->pkt_mode, 5, 3); 762 + r = FLD_MOD(r, cfg->hdmi_dvi, 0, 0); 763 + hdmi_write_reg(HDMI_CORE_AV_HDMI_CTRL, r); 764 + 765 + /* TMDS_CTRL */ 766 + REG_FLD_MOD(HDMI_CORE_SYS_TMDS_CTRL, 767 + cfg->tclk_sel_clkmult, 6, 5); 768 + } 769 + 770 + static void hdmi_core_aux_infoframe_avi_config( 771 + struct hdmi_core_infoframe_avi info_avi) 772 + { 773 + u32 val; 774 + char sum = 0, checksum = 0; 775 + 776 + sum += 0x82 + 0x002 + 0x00D; 777 + hdmi_write_reg(HDMI_CORE_AV_AVI_TYPE, 0x082); 778 + hdmi_write_reg(HDMI_CORE_AV_AVI_VERS, 0x002); 779 + hdmi_write_reg(HDMI_CORE_AV_AVI_LEN, 0x00D); 780 + 781 + val = (info_avi.db1_format << 5) | 782 + (info_avi.db1_active_info << 4) | 783 + (info_avi.db1_bar_info_dv << 2) | 784 + (info_avi.db1_scan_info); 785 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(0), val); 786 + sum += val; 787 + 788 + val = (info_avi.db2_colorimetry << 6) | 789 + (info_avi.db2_aspect_ratio << 4) | 790 + (info_avi.db2_active_fmt_ar); 791 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(1), val); 792 + sum += val; 793 + 794 + val = (info_avi.db3_itc << 7) | 795 + (info_avi.db3_ec << 4) | 796 + (info_avi.db3_q_range << 2) | 797 + (info_avi.db3_nup_scaling); 798 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(2), val); 799 + sum += val; 800 + 801 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(3), info_avi.db4_videocode); 802 + sum += info_avi.db4_videocode; 803 + 804 + val = info_avi.db5_pixel_repeat; 805 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(4), val); 806 + sum += val; 807 + 808 + val = info_avi.db6_7_line_eoftop & 0x00FF; 809 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(5), val); 810 + sum += val; 811 + 812 + val = ((info_avi.db6_7_line_eoftop >> 8) & 0x00FF); 813 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(6), val); 814 + sum += val; 815 + 816 + val = info_avi.db8_9_line_sofbottom & 0x00FF; 817 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(7), val); 818 + sum += val; 819 + 820 + val = ((info_avi.db8_9_line_sofbottom >> 8) & 0x00FF); 821 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(8), val); 822 + sum += val; 823 + 824 + val = info_avi.db10_11_pixel_eofleft & 0x00FF; 825 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(9), val); 826 + sum += val; 827 + 828 + val = ((info_avi.db10_11_pixel_eofleft >> 8) & 0x00FF); 829 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(10), val); 830 + sum += val; 831 + 832 + val = info_avi.db12_13_pixel_sofright & 0x00FF; 833 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(11), val); 834 + sum += val; 835 + 836 + val = ((info_avi.db12_13_pixel_sofright >> 8) & 0x00FF); 837 + hdmi_write_reg(HDMI_CORE_AV_AVI_DBYTE(12), val); 838 + sum += val; 839 + 840 + checksum = 0x100 - sum; 841 + hdmi_write_reg(HDMI_CORE_AV_AVI_CHSUM, checksum); 842 + } 843 + 844 + static void hdmi_core_av_packet_config( 845 + struct hdmi_core_packet_enable_repeat repeat_cfg) 846 + { 847 + /* enable/repeat the infoframe */ 848 + hdmi_write_reg(HDMI_CORE_AV_PB_CTRL1, 849 + (repeat_cfg.audio_pkt << 5) | 850 + (repeat_cfg.audio_pkt_repeat << 4) | 851 + (repeat_cfg.avi_infoframe << 1) | 852 + (repeat_cfg.avi_infoframe_repeat)); 853 + 854 + /* enable/repeat the packet */ 855 + hdmi_write_reg(HDMI_CORE_AV_PB_CTRL2, 856 + (repeat_cfg.gen_cntrl_pkt << 3) | 857 + (repeat_cfg.gen_cntrl_pkt_repeat << 2) | 858 + (repeat_cfg.generic_pkt << 1) | 859 + (repeat_cfg.generic_pkt_repeat)); 860 + } 861 + 862 + static void hdmi_wp_init(struct omap_video_timings *timings, 863 + struct hdmi_video_format *video_fmt, 864 + struct hdmi_video_interface *video_int) 865 + { 866 + DSSDBG("Enter hdmi_wp_init\n"); 867 + 868 + timings->hbp = 0; 869 + timings->hfp = 0; 870 + timings->hsw = 0; 871 + timings->vbp = 0; 872 + timings->vfp = 0; 873 + timings->vsw = 0; 874 + 875 + video_fmt->packing_mode = HDMI_PACK_10b_RGB_YUV444; 876 + video_fmt->y_res = 0; 877 + video_fmt->x_res = 0; 878 + 879 + video_int->vsp = 0; 880 + video_int->hsp = 0; 881 + 882 + video_int->interlacing = 0; 883 + video_int->tm = 0; /* HDMI_TIMING_SLAVE */ 884 + 885 + } 886 + 887 + static void hdmi_wp_video_start(bool start) 888 + { 889 + REG_FLD_MOD(HDMI_WP_VIDEO_CFG, start, 31, 31); 890 + } 891 + 892 + static void hdmi_wp_video_init_format(struct hdmi_video_format *video_fmt, 893 + struct omap_video_timings *timings, struct hdmi_config *param) 894 + { 895 + DSSDBG("Enter hdmi_wp_video_init_format\n"); 896 + 897 + video_fmt->y_res = param->timings.timings.y_res; 898 + video_fmt->x_res = param->timings.timings.x_res; 899 + 900 + timings->hbp = param->timings.timings.hbp; 901 + timings->hfp = param->timings.timings.hfp; 902 + timings->hsw = param->timings.timings.hsw; 903 + timings->vbp = param->timings.timings.vbp; 904 + timings->vfp = param->timings.timings.vfp; 905 + timings->vsw = param->timings.timings.vsw; 906 + } 907 + 908 + static void hdmi_wp_video_config_format( 909 + struct hdmi_video_format *video_fmt) 910 + { 911 + u32 l = 0; 912 + 913 + REG_FLD_MOD(HDMI_WP_VIDEO_CFG, video_fmt->packing_mode, 10, 8); 914 + 915 + l |= FLD_VAL(video_fmt->y_res, 31, 16); 916 + l |= FLD_VAL(video_fmt->x_res, 15, 0); 917 + hdmi_write_reg(HDMI_WP_VIDEO_SIZE, l); 918 + } 919 + 920 + static void hdmi_wp_video_config_interface( 921 + struct hdmi_video_interface *video_int) 922 + { 923 + u32 r; 924 + DSSDBG("Enter hdmi_wp_video_config_interface\n"); 925 + 926 + r = hdmi_read_reg(HDMI_WP_VIDEO_CFG); 927 + r = FLD_MOD(r, video_int->vsp, 7, 7); 928 + r = FLD_MOD(r, video_int->hsp, 6, 6); 929 + r = FLD_MOD(r, video_int->interlacing, 3, 3); 930 + r = FLD_MOD(r, video_int->tm, 1, 0); 931 + hdmi_write_reg(HDMI_WP_VIDEO_CFG, r); 932 + } 933 + 934 + static void hdmi_wp_video_config_timing( 935 + struct omap_video_timings *timings) 936 + { 937 + u32 timing_h = 0; 938 + u32 timing_v = 0; 939 + 940 + DSSDBG("Enter hdmi_wp_video_config_timing\n"); 941 + 942 + timing_h |= FLD_VAL(timings->hbp, 31, 20); 943 + timing_h |= FLD_VAL(timings->hfp, 19, 8); 944 + timing_h |= FLD_VAL(timings->hsw, 7, 0); 945 + hdmi_write_reg(HDMI_WP_VIDEO_TIMING_H, timing_h); 946 + 947 + timing_v |= FLD_VAL(timings->vbp, 31, 20); 948 + timing_v |= FLD_VAL(timings->vfp, 19, 8); 949 + timing_v |= FLD_VAL(timings->vsw, 7, 0); 950 + hdmi_write_reg(HDMI_WP_VIDEO_TIMING_V, timing_v); 951 + } 952 + 953 + static void hdmi_basic_configure(struct hdmi_config *cfg) 954 + { 955 + /* HDMI */ 956 + struct omap_video_timings video_timing; 957 + struct hdmi_video_format video_format; 958 + struct hdmi_video_interface video_interface; 959 + /* HDMI core */ 960 + struct hdmi_core_infoframe_avi avi_cfg; 961 + struct hdmi_core_video_config v_core_cfg; 962 + struct hdmi_core_packet_enable_repeat repeat_cfg; 963 + 964 + hdmi_wp_init(&video_timing, &video_format, 965 + &video_interface); 966 + 967 + hdmi_core_init(&v_core_cfg, 968 + &avi_cfg, 969 + &repeat_cfg); 970 + 971 + hdmi_wp_video_init_format(&video_format, 972 + &video_timing, cfg); 973 + 974 + hdmi_wp_video_config_timing(&video_timing); 975 + 976 + /* video config */ 977 + video_format.packing_mode = HDMI_PACK_24b_RGB_YUV444_YUV422; 978 + 979 + hdmi_wp_video_config_format(&video_format); 980 + 981 + video_interface.vsp = cfg->timings.vsync_pol; 982 + video_interface.hsp = cfg->timings.hsync_pol; 983 + video_interface.interlacing = cfg->interlace; 984 + video_interface.tm = 1 ; /* HDMI_TIMING_MASTER_24BIT */ 985 + 986 + hdmi_wp_video_config_interface(&video_interface); 987 + 988 + /* 989 + * configure core video part 990 + * set software reset in the core 991 + */ 992 + hdmi_core_swreset_assert(); 993 + 994 + /* power down off */ 995 + hdmi_core_powerdown_disable(); 996 + 997 + v_core_cfg.pkt_mode = HDMI_PACKETMODE24BITPERPIXEL; 998 + v_core_cfg.hdmi_dvi = cfg->cm.mode; 999 + 1000 + hdmi_core_video_config(&v_core_cfg); 1001 + 1002 + /* release software reset in the core */ 1003 + hdmi_core_swreset_release(); 1004 + 1005 + /* 1006 + * configure packet 1007 + * info frame video see doc CEA861-D page 65 1008 + */ 1009 + avi_cfg.db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB; 1010 + avi_cfg.db1_active_info = 1011 + HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF; 1012 + avi_cfg.db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO; 1013 + avi_cfg.db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0; 1014 + avi_cfg.db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO; 1015 + avi_cfg.db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO; 1016 + avi_cfg.db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME; 1017 + avi_cfg.db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO; 1018 + avi_cfg.db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601; 1019 + avi_cfg.db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT; 1020 + avi_cfg.db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO; 1021 + avi_cfg.db4_videocode = cfg->cm.code; 1022 + avi_cfg.db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO; 1023 + avi_cfg.db6_7_line_eoftop = 0; 1024 + avi_cfg.db8_9_line_sofbottom = 0; 1025 + avi_cfg.db10_11_pixel_eofleft = 0; 1026 + avi_cfg.db12_13_pixel_sofright = 0; 1027 + 1028 + hdmi_core_aux_infoframe_avi_config(avi_cfg); 1029 + 1030 + /* enable/repeat the infoframe */ 1031 + repeat_cfg.avi_infoframe = HDMI_PACKETENABLE; 1032 + repeat_cfg.avi_infoframe_repeat = HDMI_PACKETREPEATON; 1033 + /* wakeup */ 1034 + repeat_cfg.audio_pkt = HDMI_PACKETENABLE; 1035 + repeat_cfg.audio_pkt_repeat = HDMI_PACKETREPEATON; 1036 + hdmi_core_av_packet_config(repeat_cfg); 1037 + } 1038 + 1039 + static void update_hdmi_timings(struct hdmi_config *cfg, 1040 + struct omap_video_timings *timings, int code) 1041 + { 1042 + cfg->timings.timings.x_res = timings->x_res; 1043 + cfg->timings.timings.y_res = timings->y_res; 1044 + cfg->timings.timings.hbp = timings->hbp; 1045 + cfg->timings.timings.hfp = timings->hfp; 1046 + cfg->timings.timings.hsw = timings->hsw; 1047 + cfg->timings.timings.vbp = timings->vbp; 1048 + cfg->timings.timings.vfp = timings->vfp; 1049 + cfg->timings.timings.vsw = timings->vsw; 1050 + cfg->timings.timings.pixel_clock = timings->pixel_clock; 1051 + cfg->timings.vsync_pol = cea_vesa_timings[code].vsync_pol; 1052 + cfg->timings.hsync_pol = cea_vesa_timings[code].hsync_pol; 1053 + } 1054 + 1055 + static void hdmi_compute_pll(unsigned long clkin, int phy, 1056 + int n, struct hdmi_pll_info *pi) 1057 + { 1058 + unsigned long refclk; 1059 + u32 mf; 1060 + 1061 + /* 1062 + * Input clock is predivided by N + 1 1063 + * out put of which is reference clk 1064 + */ 1065 + refclk = clkin / (n + 1); 1066 + pi->regn = n; 1067 + 1068 + /* 1069 + * multiplier is pixel_clk/ref_clk 1070 + * Multiplying by 100 to avoid fractional part removal 1071 + */ 1072 + pi->regm = (phy * 100/(refclk))/100; 1073 + pi->regm2 = 1; 1074 + 1075 + /* 1076 + * fractional multiplier is remainder of the difference between 1077 + * multiplier and actual phy(required pixel clock thus should be 1078 + * multiplied by 2^18(262144) divided by the reference clock 1079 + */ 1080 + mf = (phy - pi->regm * refclk) * 262144; 1081 + pi->regmf = mf/(refclk); 1082 + 1083 + /* 1084 + * Dcofreq should be set to 1 if required pixel clock 1085 + * is greater than 1000MHz 1086 + */ 1087 + pi->dcofreq = phy > 1000 * 100; 1088 + pi->regsd = ((pi->regm * clkin / 10) / ((n + 1) * 250) + 5) / 10; 1089 + 1090 + DSSDBG("M = %d Mf = %d\n", pi->regm, pi->regmf); 1091 + DSSDBG("range = %d sd = %d\n", pi->dcofreq, pi->regsd); 1092 + } 1093 + 1094 + static void hdmi_enable_clocks(int enable) 1095 + { 1096 + if (enable) 1097 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK | 1098 + DSS_CLK_SYSCK | DSS_CLK_VIDFCK); 1099 + else 1100 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK | 1101 + DSS_CLK_SYSCK | DSS_CLK_VIDFCK); 1102 + } 1103 + 1104 + static int hdmi_power_on(struct omap_dss_device *dssdev) 1105 + { 1106 + int r, code = 0; 1107 + struct hdmi_pll_info pll_data; 1108 + struct omap_video_timings *p; 1109 + int clkin, n, phy; 1110 + 1111 + hdmi_enable_clocks(1); 1112 + 1113 + dispc_enable_channel(OMAP_DSS_CHANNEL_DIGIT, 0); 1114 + 1115 + p = &dssdev->panel.timings; 1116 + 1117 + DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", 1118 + dssdev->panel.timings.x_res, 1119 + dssdev->panel.timings.y_res); 1120 + 1121 + if (!hdmi.custom_set) { 1122 + DSSDBG("Read EDID as no EDID is not set on poweron\n"); 1123 + hdmi_read_edid(p); 1124 + } 1125 + code = get_timings_index(); 1126 + dssdev->panel.timings = cea_vesa_timings[code].timings; 1127 + update_hdmi_timings(&hdmi.cfg, p, code); 1128 + 1129 + clkin = 3840; /* 38.4 MHz */ 1130 + n = 15; /* this is a constant for our math */ 1131 + phy = p->pixel_clock; 1132 + 1133 + hdmi_compute_pll(clkin, phy, n, &pll_data); 1134 + 1135 + hdmi_wp_video_start(0); 1136 + 1137 + /* config the PLL and PHY first */ 1138 + r = hdmi_pll_program(&pll_data); 1139 + if (r) { 1140 + DSSDBG("Failed to lock PLL\n"); 1141 + goto err; 1142 + } 1143 + 1144 + r = hdmi_phy_init(); 1145 + if (r) { 1146 + DSSDBG("Failed to start PHY\n"); 1147 + goto err; 1148 + } 1149 + 1150 + hdmi.cfg.cm.mode = hdmi.mode; 1151 + hdmi.cfg.cm.code = hdmi.code; 1152 + hdmi_basic_configure(&hdmi.cfg); 1153 + 1154 + /* Make selection of HDMI in DSS */ 1155 + dss_select_hdmi_venc_clk_source(DSS_HDMI_M_PCLK); 1156 + 1157 + /* Select the dispc clock source as PRCM clock, to ensure that it is not 1158 + * DSI PLL source as the clock selected by DSI PLL might not be 1159 + * sufficient for the resolution selected / that can be changed 1160 + * dynamically by user. This can be moved to single location , say 1161 + * Boardfile. 1162 + */ 1163 + dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); 1164 + 1165 + /* bypass TV gamma table */ 1166 + dispc_enable_gamma_table(0); 1167 + 1168 + /* tv size */ 1169 + dispc_set_digit_size(dssdev->panel.timings.x_res, 1170 + dssdev->panel.timings.y_res); 1171 + 1172 + dispc_enable_channel(OMAP_DSS_CHANNEL_DIGIT, 1); 1173 + 1174 + hdmi_wp_video_start(1); 1175 + 1176 + return 0; 1177 + err: 1178 + hdmi_enable_clocks(0); 1179 + return -EIO; 1180 + } 1181 + 1182 + static void hdmi_power_off(struct omap_dss_device *dssdev) 1183 + { 1184 + dispc_enable_channel(OMAP_DSS_CHANNEL_DIGIT, 0); 1185 + 1186 + hdmi_wp_video_start(0); 1187 + hdmi_phy_off(); 1188 + hdmi_set_pll_pwr(HDMI_PLLPWRCMD_ALLOFF); 1189 + hdmi_enable_clocks(0); 1190 + 1191 + hdmi.edid_set = 0; 1192 + } 1193 + 1194 + int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, 1195 + struct omap_video_timings *timings) 1196 + { 1197 + struct hdmi_cm cm; 1198 + 1199 + cm = hdmi_get_code(timings); 1200 + if (cm.code == -1) { 1201 + DSSERR("Invalid timing entered\n"); 1202 + return -EINVAL; 1203 + } 1204 + 1205 + return 0; 1206 + 1207 + } 1208 + 1209 + void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev) 1210 + { 1211 + struct hdmi_cm cm; 1212 + 1213 + hdmi.custom_set = 1; 1214 + cm = hdmi_get_code(&dssdev->panel.timings); 1215 + hdmi.code = cm.code; 1216 + hdmi.mode = cm.mode; 1217 + omapdss_hdmi_display_enable(dssdev); 1218 + hdmi.custom_set = 0; 1219 + } 1220 + 1221 + int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev) 1222 + { 1223 + int r = 0; 1224 + 1225 + DSSDBG("ENTER hdmi_display_enable\n"); 1226 + 1227 + mutex_lock(&hdmi.lock); 1228 + 1229 + r = omap_dss_start_device(dssdev); 1230 + if (r) { 1231 + DSSERR("failed to start device\n"); 1232 + goto err0; 1233 + } 1234 + 1235 + if (dssdev->platform_enable) { 1236 + r = dssdev->platform_enable(dssdev); 1237 + if (r) { 1238 + DSSERR("failed to enable GPIO's\n"); 1239 + goto err1; 1240 + } 1241 + } 1242 + 1243 + r = hdmi_power_on(dssdev); 1244 + if (r) { 1245 + DSSERR("failed to power on device\n"); 1246 + goto err2; 1247 + } 1248 + 1249 + mutex_unlock(&hdmi.lock); 1250 + return 0; 1251 + 1252 + err2: 1253 + if (dssdev->platform_disable) 1254 + dssdev->platform_disable(dssdev); 1255 + err1: 1256 + omap_dss_stop_device(dssdev); 1257 + err0: 1258 + mutex_unlock(&hdmi.lock); 1259 + return r; 1260 + } 1261 + 1262 + void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev) 1263 + { 1264 + DSSDBG("Enter hdmi_display_disable\n"); 1265 + 1266 + mutex_lock(&hdmi.lock); 1267 + 1268 + hdmi_power_off(dssdev); 1269 + 1270 + if (dssdev->platform_disable) 1271 + dssdev->platform_disable(dssdev); 1272 + 1273 + omap_dss_stop_device(dssdev); 1274 + 1275 + mutex_unlock(&hdmi.lock); 1276 + } 1277 + 1278 + /* HDMI HW IP initialisation */ 1279 + static int omapdss_hdmihw_probe(struct platform_device *pdev) 1280 + { 1281 + struct resource *hdmi_mem; 1282 + 1283 + hdmi.pdata = pdev->dev.platform_data; 1284 + hdmi.pdev = pdev; 1285 + 1286 + mutex_init(&hdmi.lock); 1287 + 1288 + hdmi_mem = platform_get_resource(hdmi.pdev, IORESOURCE_MEM, 0); 1289 + if (!hdmi_mem) { 1290 + DSSERR("can't get IORESOURCE_MEM HDMI\n"); 1291 + return -EINVAL; 1292 + } 1293 + 1294 + /* Base address taken from platform */ 1295 + hdmi.base_wp = ioremap(hdmi_mem->start, resource_size(hdmi_mem)); 1296 + if (!hdmi.base_wp) { 1297 + DSSERR("can't ioremap WP\n"); 1298 + return -ENOMEM; 1299 + } 1300 + 1301 + hdmi_panel_init(); 1302 + 1303 + return 0; 1304 + } 1305 + 1306 + static int omapdss_hdmihw_remove(struct platform_device *pdev) 1307 + { 1308 + hdmi_panel_exit(); 1309 + 1310 + iounmap(hdmi.base_wp); 1311 + 1312 + return 0; 1313 + } 1314 + 1315 + static struct platform_driver omapdss_hdmihw_driver = { 1316 + .probe = omapdss_hdmihw_probe, 1317 + .remove = omapdss_hdmihw_remove, 1318 + .driver = { 1319 + .name = "omapdss_hdmi", 1320 + .owner = THIS_MODULE, 1321 + }, 1322 + }; 1323 + 1324 + int hdmi_init_platform_driver(void) 1325 + { 1326 + return platform_driver_register(&omapdss_hdmihw_driver); 1327 + } 1328 + 1329 + void hdmi_uninit_platform_driver(void) 1330 + { 1331 + return platform_driver_unregister(&omapdss_hdmihw_driver); 1332 + }
+415
drivers/video/omap2/dss/hdmi.h
··· 1 + /* 2 + * hdmi.h 3 + * 4 + * HDMI driver definition for TI OMAP4 processors. 5 + * 6 + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/ 7 + * 8 + * This program is free software; you can redistribute it and/or modify it 9 + * under the terms of the GNU General Public License version 2 as published by 10 + * the Free Software Foundation. 11 + * 12 + * This program is distributed in the hope that it will be useful, but WITHOUT 13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 + * more details. 16 + * 17 + * You should have received a copy of the GNU General Public License along with 18 + * this program. If not, see <http://www.gnu.org/licenses/>. 19 + */ 20 + 21 + #ifndef _OMAP4_DSS_HDMI_H_ 22 + #define _OMAP4_DSS_HDMI_H_ 23 + 24 + #include <linux/string.h> 25 + #include <plat/display.h> 26 + 27 + #define HDMI_WP 0x0 28 + #define HDMI_CORE_SYS 0x400 29 + #define HDMI_CORE_AV 0x900 30 + #define HDMI_PLLCTRL 0x200 31 + #define HDMI_PHY 0x300 32 + 33 + struct hdmi_reg { u16 idx; }; 34 + 35 + #define HDMI_REG(idx) ((const struct hdmi_reg) { idx }) 36 + 37 + /* HDMI Wrapper */ 38 + #define HDMI_WP_REG(idx) HDMI_REG(HDMI_WP + idx) 39 + 40 + #define HDMI_WP_REVISION HDMI_WP_REG(0x0) 41 + #define HDMI_WP_SYSCONFIG HDMI_WP_REG(0x10) 42 + #define HDMI_WP_IRQSTATUS_RAW HDMI_WP_REG(0x24) 43 + #define HDMI_WP_IRQSTATUS HDMI_WP_REG(0x28) 44 + #define HDMI_WP_PWR_CTRL HDMI_WP_REG(0x40) 45 + #define HDMI_WP_IRQENABLE_SET HDMI_WP_REG(0x2C) 46 + #define HDMI_WP_VIDEO_CFG HDMI_WP_REG(0x50) 47 + #define HDMI_WP_VIDEO_SIZE HDMI_WP_REG(0x60) 48 + #define HDMI_WP_VIDEO_TIMING_H HDMI_WP_REG(0x68) 49 + #define HDMI_WP_VIDEO_TIMING_V HDMI_WP_REG(0x6C) 50 + #define HDMI_WP_WP_CLK HDMI_WP_REG(0x70) 51 + 52 + /* HDMI IP Core System */ 53 + #define HDMI_CORE_SYS_REG(idx) HDMI_REG(HDMI_CORE_SYS + idx) 54 + 55 + #define HDMI_CORE_SYS_VND_IDL HDMI_CORE_SYS_REG(0x0) 56 + #define HDMI_CORE_SYS_DEV_IDL HDMI_CORE_SYS_REG(0x8) 57 + #define HDMI_CORE_SYS_DEV_IDH HDMI_CORE_SYS_REG(0xC) 58 + #define HDMI_CORE_SYS_DEV_REV HDMI_CORE_SYS_REG(0x10) 59 + #define HDMI_CORE_SYS_SRST HDMI_CORE_SYS_REG(0x14) 60 + #define HDMI_CORE_CTRL1 HDMI_CORE_SYS_REG(0x20) 61 + #define HDMI_CORE_SYS_SYS_STAT HDMI_CORE_SYS_REG(0x24) 62 + #define HDMI_CORE_SYS_VID_ACEN HDMI_CORE_SYS_REG(0x124) 63 + #define HDMI_CORE_SYS_VID_MODE HDMI_CORE_SYS_REG(0x128) 64 + #define HDMI_CORE_SYS_INTR_STATE HDMI_CORE_SYS_REG(0x1C0) 65 + #define HDMI_CORE_SYS_INTR1 HDMI_CORE_SYS_REG(0x1C4) 66 + #define HDMI_CORE_SYS_INTR2 HDMI_CORE_SYS_REG(0x1C8) 67 + #define HDMI_CORE_SYS_INTR3 HDMI_CORE_SYS_REG(0x1CC) 68 + #define HDMI_CORE_SYS_INTR4 HDMI_CORE_SYS_REG(0x1D0) 69 + #define HDMI_CORE_SYS_UMASK1 HDMI_CORE_SYS_REG(0x1D4) 70 + #define HDMI_CORE_SYS_TMDS_CTRL HDMI_CORE_SYS_REG(0x208) 71 + #define HDMI_CORE_SYS_DE_DLY HDMI_CORE_SYS_REG(0xC8) 72 + #define HDMI_CORE_SYS_DE_CTRL HDMI_CORE_SYS_REG(0xCC) 73 + #define HDMI_CORE_SYS_DE_TOP HDMI_CORE_SYS_REG(0xD0) 74 + #define HDMI_CORE_SYS_DE_CNTL HDMI_CORE_SYS_REG(0xD8) 75 + #define HDMI_CORE_SYS_DE_CNTH HDMI_CORE_SYS_REG(0xDC) 76 + #define HDMI_CORE_SYS_DE_LINL HDMI_CORE_SYS_REG(0xE0) 77 + #define HDMI_CORE_SYS_DE_LINH_1 HDMI_CORE_SYS_REG(0xE4) 78 + #define HDMI_CORE_CTRL1_VEN_FOLLOWVSYNC 0x1 79 + #define HDMI_CORE_CTRL1_HEN_FOLLOWHSYNC 0x1 80 + #define HDMI_CORE_CTRL1_BSEL_24BITBUS 0x1 81 + #define HDMI_CORE_CTRL1_EDGE_RISINGEDGE 0x1 82 + 83 + /* HDMI DDC E-DID */ 84 + #define HDMI_CORE_DDC_CMD HDMI_CORE_SYS_REG(0x3CC) 85 + #define HDMI_CORE_DDC_STATUS HDMI_CORE_SYS_REG(0x3C8) 86 + #define HDMI_CORE_DDC_ADDR HDMI_CORE_SYS_REG(0x3B4) 87 + #define HDMI_CORE_DDC_OFFSET HDMI_CORE_SYS_REG(0x3BC) 88 + #define HDMI_CORE_DDC_COUNT1 HDMI_CORE_SYS_REG(0x3C0) 89 + #define HDMI_CORE_DDC_COUNT2 HDMI_CORE_SYS_REG(0x3C4) 90 + #define HDMI_CORE_DDC_DATA HDMI_CORE_SYS_REG(0x3D0) 91 + #define HDMI_CORE_DDC_SEGM HDMI_CORE_SYS_REG(0x3B8) 92 + 93 + /* HDMI IP Core Audio Video */ 94 + #define HDMI_CORE_AV_REG(idx) HDMI_REG(HDMI_CORE_AV + idx) 95 + 96 + #define HDMI_CORE_AV_HDMI_CTRL HDMI_CORE_AV_REG(0xBC) 97 + #define HDMI_CORE_AV_DPD HDMI_CORE_AV_REG(0xF4) 98 + #define HDMI_CORE_AV_PB_CTRL1 HDMI_CORE_AV_REG(0xF8) 99 + #define HDMI_CORE_AV_PB_CTRL2 HDMI_CORE_AV_REG(0xFC) 100 + #define HDMI_CORE_AV_AVI_TYPE HDMI_CORE_AV_REG(0x100) 101 + #define HDMI_CORE_AV_AVI_VERS HDMI_CORE_AV_REG(0x104) 102 + #define HDMI_CORE_AV_AVI_LEN HDMI_CORE_AV_REG(0x108) 103 + #define HDMI_CORE_AV_AVI_CHSUM HDMI_CORE_AV_REG(0x10C) 104 + #define HDMI_CORE_AV_AVI_DBYTE(n) HDMI_CORE_AV_REG(n * 4 + 0x110) 105 + #define HDMI_CORE_AV_AVI_DBYTE_NELEMS HDMI_CORE_AV_REG(15) 106 + #define HDMI_CORE_AV_SPD_DBYTE HDMI_CORE_AV_REG(0x190) 107 + #define HDMI_CORE_AV_SPD_DBYTE_NELEMS HDMI_CORE_AV_REG(27) 108 + #define HDMI_CORE_AV_MPEG_DBYTE HDMI_CORE_AV_REG(0x290) 109 + #define HDMI_CORE_AV_MPEG_DBYTE_NELEMS HDMI_CORE_AV_REG(27) 110 + #define HDMI_CORE_AV_GEN_DBYTE HDMI_CORE_AV_REG(0x300) 111 + #define HDMI_CORE_AV_GEN_DBYTE_NELEMS HDMI_CORE_AV_REG(31) 112 + #define HDMI_CORE_AV_GEN2_DBYTE HDMI_CORE_AV_REG(0x380) 113 + #define HDMI_CORE_AV_GEN2_DBYTE_NELEMS HDMI_CORE_AV_REG(31) 114 + #define HDMI_CORE_AV_ACR_CTRL HDMI_CORE_AV_REG(0x4) 115 + #define HDMI_CORE_AV_FREQ_SVAL HDMI_CORE_AV_REG(0x8) 116 + #define HDMI_CORE_AV_N_SVAL1 HDMI_CORE_AV_REG(0xC) 117 + #define HDMI_CORE_AV_N_SVAL2 HDMI_CORE_AV_REG(0x10) 118 + #define HDMI_CORE_AV_N_SVAL3 HDMI_CORE_AV_REG(0x14) 119 + #define HDMI_CORE_AV_CTS_SVAL1 HDMI_CORE_AV_REG(0x18) 120 + #define HDMI_CORE_AV_CTS_SVAL2 HDMI_CORE_AV_REG(0x1C) 121 + #define HDMI_CORE_AV_CTS_SVAL3 HDMI_CORE_AV_REG(0x20) 122 + #define HDMI_CORE_AV_CTS_HVAL1 HDMI_CORE_AV_REG(0x24) 123 + #define HDMI_CORE_AV_CTS_HVAL2 HDMI_CORE_AV_REG(0x28) 124 + #define HDMI_CORE_AV_CTS_HVAL3 HDMI_CORE_AV_REG(0x2C) 125 + #define HDMI_CORE_AV_AUD_MODE HDMI_CORE_AV_REG(0x50) 126 + #define HDMI_CORE_AV_SPDIF_CTRL HDMI_CORE_AV_REG(0x54) 127 + #define HDMI_CORE_AV_HW_SPDIF_FS HDMI_CORE_AV_REG(0x60) 128 + #define HDMI_CORE_AV_SWAP_I2S HDMI_CORE_AV_REG(0x64) 129 + #define HDMI_CORE_AV_SPDIF_ERTH HDMI_CORE_AV_REG(0x6C) 130 + #define HDMI_CORE_AV_I2S_IN_MAP HDMI_CORE_AV_REG(0x70) 131 + #define HDMI_CORE_AV_I2S_IN_CTRL HDMI_CORE_AV_REG(0x74) 132 + #define HDMI_CORE_AV_I2S_CHST0 HDMI_CORE_AV_REG(0x78) 133 + #define HDMI_CORE_AV_I2S_CHST1 HDMI_CORE_AV_REG(0x7C) 134 + #define HDMI_CORE_AV_I2S_CHST2 HDMI_CORE_AV_REG(0x80) 135 + #define HDMI_CORE_AV_I2S_CHST4 HDMI_CORE_AV_REG(0x84) 136 + #define HDMI_CORE_AV_I2S_CHST5 HDMI_CORE_AV_REG(0x88) 137 + #define HDMI_CORE_AV_ASRC HDMI_CORE_AV_REG(0x8C) 138 + #define HDMI_CORE_AV_I2S_IN_LEN HDMI_CORE_AV_REG(0x90) 139 + #define HDMI_CORE_AV_HDMI_CTRL HDMI_CORE_AV_REG(0xBC) 140 + #define HDMI_CORE_AV_AUDO_TXSTAT HDMI_CORE_AV_REG(0xC0) 141 + #define HDMI_CORE_AV_AUD_PAR_BUSCLK_1 HDMI_CORE_AV_REG(0xCC) 142 + #define HDMI_CORE_AV_AUD_PAR_BUSCLK_2 HDMI_CORE_AV_REG(0xD0) 143 + #define HDMI_CORE_AV_AUD_PAR_BUSCLK_3 HDMI_CORE_AV_REG(0xD4) 144 + #define HDMI_CORE_AV_TEST_TXCTRL HDMI_CORE_AV_REG(0xF0) 145 + #define HDMI_CORE_AV_DPD HDMI_CORE_AV_REG(0xF4) 146 + #define HDMI_CORE_AV_PB_CTRL1 HDMI_CORE_AV_REG(0xF8) 147 + #define HDMI_CORE_AV_PB_CTRL2 HDMI_CORE_AV_REG(0xFC) 148 + #define HDMI_CORE_AV_AVI_TYPE HDMI_CORE_AV_REG(0x100) 149 + #define HDMI_CORE_AV_AVI_VERS HDMI_CORE_AV_REG(0x104) 150 + #define HDMI_CORE_AV_AVI_LEN HDMI_CORE_AV_REG(0x108) 151 + #define HDMI_CORE_AV_AVI_CHSUM HDMI_CORE_AV_REG(0x10C) 152 + #define HDMI_CORE_AV_SPD_TYPE HDMI_CORE_AV_REG(0x180) 153 + #define HDMI_CORE_AV_SPD_VERS HDMI_CORE_AV_REG(0x184) 154 + #define HDMI_CORE_AV_SPD_LEN HDMI_CORE_AV_REG(0x188) 155 + #define HDMI_CORE_AV_SPD_CHSUM HDMI_CORE_AV_REG(0x18C) 156 + #define HDMI_CORE_AV_MPEG_TYPE HDMI_CORE_AV_REG(0x280) 157 + #define HDMI_CORE_AV_MPEG_VERS HDMI_CORE_AV_REG(0x284) 158 + #define HDMI_CORE_AV_MPEG_LEN HDMI_CORE_AV_REG(0x288) 159 + #define HDMI_CORE_AV_MPEG_CHSUM HDMI_CORE_AV_REG(0x28C) 160 + #define HDMI_CORE_AV_CP_BYTE1 HDMI_CORE_AV_REG(0x37C) 161 + #define HDMI_CORE_AV_CEC_ADDR_ID HDMI_CORE_AV_REG(0x3FC) 162 + #define HDMI_CORE_AV_SPD_DBYTE_ELSIZE 0x4 163 + #define HDMI_CORE_AV_GEN2_DBYTE_ELSIZE 0x4 164 + #define HDMI_CORE_AV_MPEG_DBYTE_ELSIZE 0x4 165 + #define HDMI_CORE_AV_GEN_DBYTE_ELSIZE 0x4 166 + 167 + /* PLL */ 168 + #define HDMI_PLL_REG(idx) HDMI_REG(HDMI_PLLCTRL + idx) 169 + 170 + #define PLLCTRL_PLL_CONTROL HDMI_PLL_REG(0x0) 171 + #define PLLCTRL_PLL_STATUS HDMI_PLL_REG(0x4) 172 + #define PLLCTRL_PLL_GO HDMI_PLL_REG(0x8) 173 + #define PLLCTRL_CFG1 HDMI_PLL_REG(0xC) 174 + #define PLLCTRL_CFG2 HDMI_PLL_REG(0x10) 175 + #define PLLCTRL_CFG3 HDMI_PLL_REG(0x14) 176 + #define PLLCTRL_CFG4 HDMI_PLL_REG(0x20) 177 + 178 + /* HDMI PHY */ 179 + #define HDMI_PHY_REG(idx) HDMI_REG(HDMI_PHY + idx) 180 + 181 + #define HDMI_TXPHY_TX_CTRL HDMI_PHY_REG(0x0) 182 + #define HDMI_TXPHY_DIGITAL_CTRL HDMI_PHY_REG(0x4) 183 + #define HDMI_TXPHY_POWER_CTRL HDMI_PHY_REG(0x8) 184 + #define HDMI_TXPHY_PAD_CFG_CTRL HDMI_PHY_REG(0xC) 185 + 186 + /* HDMI EDID Length */ 187 + #define HDMI_EDID_MAX_LENGTH 256 188 + #define EDID_TIMING_DESCRIPTOR_SIZE 0x12 189 + #define EDID_DESCRIPTOR_BLOCK0_ADDRESS 0x36 190 + #define EDID_DESCRIPTOR_BLOCK1_ADDRESS 0x80 191 + #define EDID_SIZE_BLOCK0_TIMING_DESCRIPTOR 4 192 + #define EDID_SIZE_BLOCK1_TIMING_DESCRIPTOR 4 193 + 194 + #define OMAP_HDMI_TIMINGS_NB 34 195 + 196 + #define REG_FLD_MOD(idx, val, start, end) \ 197 + hdmi_write_reg(idx, FLD_MOD(hdmi_read_reg(idx), val, start, end)) 198 + #define REG_GET(idx, start, end) \ 199 + FLD_GET(hdmi_read_reg(idx), start, end) 200 + 201 + /* HDMI timing structure */ 202 + struct hdmi_timings { 203 + struct omap_video_timings timings; 204 + int vsync_pol; 205 + int hsync_pol; 206 + }; 207 + 208 + enum hdmi_phy_pwr { 209 + HDMI_PHYPWRCMD_OFF = 0, 210 + HDMI_PHYPWRCMD_LDOON = 1, 211 + HDMI_PHYPWRCMD_TXON = 2 212 + }; 213 + 214 + enum hdmi_pll_pwr { 215 + HDMI_PLLPWRCMD_ALLOFF = 0, 216 + HDMI_PLLPWRCMD_PLLONLY = 1, 217 + HDMI_PLLPWRCMD_BOTHON_ALLCLKS = 2, 218 + HDMI_PLLPWRCMD_BOTHON_NOPHYCLK = 3 219 + }; 220 + 221 + enum hdmi_clk_refsel { 222 + HDMI_REFSEL_PCLK = 0, 223 + HDMI_REFSEL_REF1 = 1, 224 + HDMI_REFSEL_REF2 = 2, 225 + HDMI_REFSEL_SYSCLK = 3 226 + }; 227 + 228 + enum hdmi_core_inputbus_width { 229 + HDMI_INPUT_8BIT = 0, 230 + HDMI_INPUT_10BIT = 1, 231 + HDMI_INPUT_12BIT = 2 232 + }; 233 + 234 + enum hdmi_core_dither_trunc { 235 + HDMI_OUTPUTTRUNCATION_8BIT = 0, 236 + HDMI_OUTPUTTRUNCATION_10BIT = 1, 237 + HDMI_OUTPUTTRUNCATION_12BIT = 2, 238 + HDMI_OUTPUTDITHER_8BIT = 3, 239 + HDMI_OUTPUTDITHER_10BIT = 4, 240 + HDMI_OUTPUTDITHER_12BIT = 5 241 + }; 242 + 243 + enum hdmi_core_deepcolor_ed { 244 + HDMI_DEEPCOLORPACKECTDISABLE = 0, 245 + HDMI_DEEPCOLORPACKECTENABLE = 1 246 + }; 247 + 248 + enum hdmi_core_packet_mode { 249 + HDMI_PACKETMODERESERVEDVALUE = 0, 250 + HDMI_PACKETMODE24BITPERPIXEL = 4, 251 + HDMI_PACKETMODE30BITPERPIXEL = 5, 252 + HDMI_PACKETMODE36BITPERPIXEL = 6, 253 + HDMI_PACKETMODE48BITPERPIXEL = 7 254 + }; 255 + 256 + enum hdmi_core_hdmi_dvi { 257 + HDMI_DVI = 0, 258 + HDMI_HDMI = 1 259 + }; 260 + 261 + enum hdmi_core_tclkselclkmult { 262 + HDMI_FPLL05IDCK = 0, 263 + HDMI_FPLL10IDCK = 1, 264 + HDMI_FPLL20IDCK = 2, 265 + HDMI_FPLL40IDCK = 3 266 + }; 267 + 268 + enum hdmi_core_packet_ctrl { 269 + HDMI_PACKETENABLE = 1, 270 + HDMI_PACKETDISABLE = 0, 271 + HDMI_PACKETREPEATON = 1, 272 + HDMI_PACKETREPEATOFF = 0 273 + }; 274 + 275 + /* INFOFRAME_AVI_ definitions */ 276 + enum hdmi_core_infoframe { 277 + HDMI_INFOFRAME_AVI_DB1Y_RGB = 0, 278 + HDMI_INFOFRAME_AVI_DB1Y_YUV422 = 1, 279 + HDMI_INFOFRAME_AVI_DB1Y_YUV444 = 2, 280 + HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF = 0, 281 + HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_ON = 1, 282 + HDMI_INFOFRAME_AVI_DB1B_NO = 0, 283 + HDMI_INFOFRAME_AVI_DB1B_VERT = 1, 284 + HDMI_INFOFRAME_AVI_DB1B_HORI = 2, 285 + HDMI_INFOFRAME_AVI_DB1B_VERTHORI = 3, 286 + HDMI_INFOFRAME_AVI_DB1S_0 = 0, 287 + HDMI_INFOFRAME_AVI_DB1S_1 = 1, 288 + HDMI_INFOFRAME_AVI_DB1S_2 = 2, 289 + HDMI_INFOFRAME_AVI_DB2C_NO = 0, 290 + HDMI_INFOFRAME_AVI_DB2C_ITU601 = 1, 291 + HDMI_INFOFRAME_AVI_DB2C_ITU709 = 2, 292 + HDMI_INFOFRAME_AVI_DB2C_EC_EXTENDED = 3, 293 + HDMI_INFOFRAME_AVI_DB2M_NO = 0, 294 + HDMI_INFOFRAME_AVI_DB2M_43 = 1, 295 + HDMI_INFOFRAME_AVI_DB2M_169 = 2, 296 + HDMI_INFOFRAME_AVI_DB2R_SAME = 8, 297 + HDMI_INFOFRAME_AVI_DB2R_43 = 9, 298 + HDMI_INFOFRAME_AVI_DB2R_169 = 10, 299 + HDMI_INFOFRAME_AVI_DB2R_149 = 11, 300 + HDMI_INFOFRAME_AVI_DB3ITC_NO = 0, 301 + HDMI_INFOFRAME_AVI_DB3ITC_YES = 1, 302 + HDMI_INFOFRAME_AVI_DB3EC_XVYUV601 = 0, 303 + HDMI_INFOFRAME_AVI_DB3EC_XVYUV709 = 1, 304 + HDMI_INFOFRAME_AVI_DB3Q_DEFAULT = 0, 305 + HDMI_INFOFRAME_AVI_DB3Q_LR = 1, 306 + HDMI_INFOFRAME_AVI_DB3Q_FR = 2, 307 + HDMI_INFOFRAME_AVI_DB3SC_NO = 0, 308 + HDMI_INFOFRAME_AVI_DB3SC_HORI = 1, 309 + HDMI_INFOFRAME_AVI_DB3SC_VERT = 2, 310 + HDMI_INFOFRAME_AVI_DB3SC_HORIVERT = 3, 311 + HDMI_INFOFRAME_AVI_DB5PR_NO = 0, 312 + HDMI_INFOFRAME_AVI_DB5PR_2 = 1, 313 + HDMI_INFOFRAME_AVI_DB5PR_3 = 2, 314 + HDMI_INFOFRAME_AVI_DB5PR_4 = 3, 315 + HDMI_INFOFRAME_AVI_DB5PR_5 = 4, 316 + HDMI_INFOFRAME_AVI_DB5PR_6 = 5, 317 + HDMI_INFOFRAME_AVI_DB5PR_7 = 6, 318 + HDMI_INFOFRAME_AVI_DB5PR_8 = 7, 319 + HDMI_INFOFRAME_AVI_DB5PR_9 = 8, 320 + HDMI_INFOFRAME_AVI_DB5PR_10 = 9 321 + }; 322 + 323 + enum hdmi_packing_mode { 324 + HDMI_PACK_10b_RGB_YUV444 = 0, 325 + HDMI_PACK_24b_RGB_YUV444_YUV422 = 1, 326 + HDMI_PACK_20b_YUV422 = 2, 327 + HDMI_PACK_ALREADYPACKED = 7 328 + }; 329 + 330 + struct hdmi_core_video_config { 331 + enum hdmi_core_inputbus_width ip_bus_width; 332 + enum hdmi_core_dither_trunc op_dither_truc; 333 + enum hdmi_core_deepcolor_ed deep_color_pkt; 334 + enum hdmi_core_packet_mode pkt_mode; 335 + enum hdmi_core_hdmi_dvi hdmi_dvi; 336 + enum hdmi_core_tclkselclkmult tclk_sel_clkmult; 337 + }; 338 + 339 + /* 340 + * Refer to section 8.2 in HDMI 1.3 specification for 341 + * details about infoframe databytes 342 + */ 343 + struct hdmi_core_infoframe_avi { 344 + u8 db1_format; 345 + /* Y0, Y1 rgb,yCbCr */ 346 + u8 db1_active_info; 347 + /* A0 Active information Present */ 348 + u8 db1_bar_info_dv; 349 + /* B0, B1 Bar info data valid */ 350 + u8 db1_scan_info; 351 + /* S0, S1 scan information */ 352 + u8 db2_colorimetry; 353 + /* C0, C1 colorimetry */ 354 + u8 db2_aspect_ratio; 355 + /* M0, M1 Aspect ratio (4:3, 16:9) */ 356 + u8 db2_active_fmt_ar; 357 + /* R0...R3 Active format aspect ratio */ 358 + u8 db3_itc; 359 + /* ITC IT content. */ 360 + u8 db3_ec; 361 + /* EC0, EC1, EC2 Extended colorimetry */ 362 + u8 db3_q_range; 363 + /* Q1, Q0 Quantization range */ 364 + u8 db3_nup_scaling; 365 + /* SC1, SC0 Non-uniform picture scaling */ 366 + u8 db4_videocode; 367 + /* VIC0..6 Video format identification */ 368 + u8 db5_pixel_repeat; 369 + /* PR0..PR3 Pixel repetition factor */ 370 + u16 db6_7_line_eoftop; 371 + /* Line number end of top bar */ 372 + u16 db8_9_line_sofbottom; 373 + /* Line number start of bottom bar */ 374 + u16 db10_11_pixel_eofleft; 375 + /* Pixel number end of left bar */ 376 + u16 db12_13_pixel_sofright; 377 + /* Pixel number start of right bar */ 378 + }; 379 + 380 + struct hdmi_core_packet_enable_repeat { 381 + u32 audio_pkt; 382 + u32 audio_pkt_repeat; 383 + u32 avi_infoframe; 384 + u32 avi_infoframe_repeat; 385 + u32 gen_cntrl_pkt; 386 + u32 gen_cntrl_pkt_repeat; 387 + u32 generic_pkt; 388 + u32 generic_pkt_repeat; 389 + }; 390 + 391 + struct hdmi_video_format { 392 + enum hdmi_packing_mode packing_mode; 393 + u32 y_res; /* Line per panel */ 394 + u32 x_res; /* pixel per line */ 395 + }; 396 + 397 + struct hdmi_video_interface { 398 + int vsp; /* Vsync polarity */ 399 + int hsp; /* Hsync polarity */ 400 + int interlacing; 401 + int tm; /* Timing mode */ 402 + }; 403 + 404 + struct hdmi_cm { 405 + int code; 406 + int mode; 407 + }; 408 + 409 + struct hdmi_config { 410 + struct hdmi_timings timings; 411 + u16 interlace; 412 + struct hdmi_cm cm; 413 + }; 414 + 415 + #endif
+222
drivers/video/omap2/dss/hdmi_omap4_panel.c
··· 1 + /* 2 + * hdmi_omap4_panel.c 3 + * 4 + * HDMI library support functions for TI OMAP4 processors. 5 + * 6 + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/ 7 + * Authors: Mythri P k <mythripk@ti.com> 8 + * 9 + * This program is free software; you can redistribute it and/or modify it 10 + * under the terms of the GNU General Public License version 2 as published by 11 + * the Free Software Foundation. 12 + * 13 + * This program is distributed in the hope that it will be useful, but WITHOUT 14 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 + * more details. 17 + * 18 + * You should have received a copy of the GNU General Public License along with 19 + * this program. If not, see <http://www.gnu.org/licenses/>. 20 + */ 21 + 22 + #include <linux/kernel.h> 23 + #include <linux/err.h> 24 + #include <linux/io.h> 25 + #include <linux/mutex.h> 26 + #include <linux/module.h> 27 + #include <plat/display.h> 28 + 29 + #include "dss.h" 30 + 31 + static struct { 32 + struct mutex hdmi_lock; 33 + } hdmi; 34 + 35 + 36 + static int hdmi_panel_probe(struct omap_dss_device *dssdev) 37 + { 38 + DSSDBG("ENTER hdmi_panel_probe\n"); 39 + 40 + dssdev->panel.config = OMAP_DSS_LCD_TFT | 41 + OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS; 42 + 43 + /* 44 + * Initialize the timings to 640 * 480 45 + * This is only for framebuffer update not for TV timing setting 46 + * Setting TV timing will be done only on enable 47 + */ 48 + dssdev->panel.timings.x_res = 640; 49 + dssdev->panel.timings.y_res = 480; 50 + 51 + DSSDBG("hdmi_panel_probe x_res= %d y_res = %d\n", 52 + dssdev->panel.timings.x_res, 53 + dssdev->panel.timings.y_res); 54 + return 0; 55 + } 56 + 57 + static void hdmi_panel_remove(struct omap_dss_device *dssdev) 58 + { 59 + 60 + } 61 + 62 + static int hdmi_panel_enable(struct omap_dss_device *dssdev) 63 + { 64 + int r = 0; 65 + DSSDBG("ENTER hdmi_panel_enable\n"); 66 + 67 + mutex_lock(&hdmi.hdmi_lock); 68 + 69 + if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) { 70 + r = -EINVAL; 71 + goto err; 72 + } 73 + 74 + r = omapdss_hdmi_display_enable(dssdev); 75 + if (r) { 76 + DSSERR("failed to power on\n"); 77 + goto err; 78 + } 79 + 80 + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 81 + 82 + err: 83 + mutex_unlock(&hdmi.hdmi_lock); 84 + 85 + return r; 86 + } 87 + 88 + static void hdmi_panel_disable(struct omap_dss_device *dssdev) 89 + { 90 + mutex_lock(&hdmi.hdmi_lock); 91 + 92 + if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) 93 + omapdss_hdmi_display_disable(dssdev); 94 + 95 + dssdev->state = OMAP_DSS_DISPLAY_DISABLED; 96 + 97 + mutex_unlock(&hdmi.hdmi_lock); 98 + } 99 + 100 + static int hdmi_panel_suspend(struct omap_dss_device *dssdev) 101 + { 102 + int r = 0; 103 + 104 + mutex_lock(&hdmi.hdmi_lock); 105 + 106 + if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) { 107 + r = -EINVAL; 108 + goto err; 109 + } 110 + 111 + dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; 112 + 113 + omapdss_hdmi_display_disable(dssdev); 114 + 115 + err: 116 + mutex_unlock(&hdmi.hdmi_lock); 117 + 118 + return r; 119 + } 120 + 121 + static int hdmi_panel_resume(struct omap_dss_device *dssdev) 122 + { 123 + int r = 0; 124 + 125 + mutex_lock(&hdmi.hdmi_lock); 126 + 127 + if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) { 128 + r = -EINVAL; 129 + goto err; 130 + } 131 + 132 + r = omapdss_hdmi_display_enable(dssdev); 133 + if (r) { 134 + DSSERR("failed to power on\n"); 135 + goto err; 136 + } 137 + 138 + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; 139 + 140 + err: 141 + mutex_unlock(&hdmi.hdmi_lock); 142 + 143 + return r; 144 + } 145 + 146 + static void hdmi_get_timings(struct omap_dss_device *dssdev, 147 + struct omap_video_timings *timings) 148 + { 149 + mutex_lock(&hdmi.hdmi_lock); 150 + 151 + *timings = dssdev->panel.timings; 152 + 153 + mutex_unlock(&hdmi.hdmi_lock); 154 + } 155 + 156 + static void hdmi_set_timings(struct omap_dss_device *dssdev, 157 + struct omap_video_timings *timings) 158 + { 159 + DSSDBG("hdmi_set_timings\n"); 160 + 161 + mutex_lock(&hdmi.hdmi_lock); 162 + 163 + dssdev->panel.timings = *timings; 164 + 165 + if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { 166 + /* turn the hdmi off and on to get new timings to use */ 167 + omapdss_hdmi_display_disable(dssdev); 168 + omapdss_hdmi_display_set_timing(dssdev); 169 + } 170 + 171 + mutex_unlock(&hdmi.hdmi_lock); 172 + } 173 + 174 + static int hdmi_check_timings(struct omap_dss_device *dssdev, 175 + struct omap_video_timings *timings) 176 + { 177 + int r = 0; 178 + 179 + DSSDBG("hdmi_check_timings\n"); 180 + 181 + mutex_lock(&hdmi.hdmi_lock); 182 + 183 + r = omapdss_hdmi_display_check_timing(dssdev, timings); 184 + if (r) { 185 + DSSERR("Timing cannot be applied\n"); 186 + goto err; 187 + } 188 + err: 189 + mutex_unlock(&hdmi.hdmi_lock); 190 + return r; 191 + } 192 + 193 + static struct omap_dss_driver hdmi_driver = { 194 + .probe = hdmi_panel_probe, 195 + .remove = hdmi_panel_remove, 196 + .enable = hdmi_panel_enable, 197 + .disable = hdmi_panel_disable, 198 + .suspend = hdmi_panel_suspend, 199 + .resume = hdmi_panel_resume, 200 + .get_timings = hdmi_get_timings, 201 + .set_timings = hdmi_set_timings, 202 + .check_timings = hdmi_check_timings, 203 + .driver = { 204 + .name = "hdmi_panel", 205 + .owner = THIS_MODULE, 206 + }, 207 + }; 208 + 209 + int hdmi_panel_init(void) 210 + { 211 + mutex_init(&hdmi.hdmi_lock); 212 + 213 + omap_dss_register_driver(&hdmi_driver); 214 + 215 + return 0; 216 + } 217 + 218 + void hdmi_panel_exit(void) 219 + { 220 + omap_dss_unregister_driver(&hdmi_driver); 221 + 222 + }
+9 -4
drivers/video/omap2/dss/manager.c
··· 515 515 516 516 if (mgr->device->type == OMAP_DISPLAY_TYPE_VENC) { 517 517 irq = DISPC_IRQ_EVSYNC_ODD; 518 + } else if (mgr->device->type == OMAP_DISPLAY_TYPE_HDMI) { 519 + irq = DISPC_IRQ_EVSYNC_EVEN; 518 520 } else { 519 521 if (mgr->id == OMAP_DSS_CHANNEL_LCD) 520 522 irq = DISPC_IRQ_VSYNC; ··· 538 536 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 539 537 return 0; 540 538 541 - if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) { 539 + if (dssdev->type == OMAP_DISPLAY_TYPE_VENC 540 + || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) { 542 541 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 543 542 } else { 544 543 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { ··· 616 613 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 617 614 return 0; 618 615 619 - if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) { 616 + if (dssdev->type == OMAP_DISPLAY_TYPE_VENC 617 + || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) { 620 618 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 621 619 } else { 622 620 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { ··· 1381 1377 case OMAP_DISPLAY_TYPE_DBI: 1382 1378 case OMAP_DISPLAY_TYPE_SDI: 1383 1379 case OMAP_DISPLAY_TYPE_VENC: 1380 + case OMAP_DISPLAY_TYPE_HDMI: 1384 1381 default_get_overlay_fifo_thresholds(ovl->id, size, 1385 1382 &oc->burst_size, &oc->fifo_low, 1386 1383 &oc->fifo_high); ··· 1399 1394 } 1400 1395 1401 1396 r = 0; 1402 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 1397 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 1403 1398 if (!dss_cache.irq_enabled) { 1404 1399 u32 mask; 1405 1400 ··· 1412 1407 dss_cache.irq_enabled = true; 1413 1408 } 1414 1409 configure_dispc(); 1415 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 1410 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 1416 1411 1417 1412 spin_unlock_irqrestore(&dss_cache.lock, flags); 1418 1413
+6 -4
drivers/video/omap2/dss/overlay.c
··· 490 490 491 491 ovl->manager = mgr; 492 492 493 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 493 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 494 494 /* XXX: on manual update display, in auto update mode, a bug happens 495 495 * here. When an overlay is first enabled on LCD, then it's disabled, 496 496 * and the manager is changed to TV, we sometimes get SYNC_LOST_DIGIT ··· 499 499 * but I don't understand how or why. */ 500 500 msleep(40); 501 501 dispc_set_channel_out(ovl->id, mgr->id); 502 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 502 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 503 503 504 504 return 0; 505 505 } ··· 679 679 lcd2_mgr->set_device(lcd2_mgr, dssdev); 680 680 mgr = lcd2_mgr; 681 681 } 682 - } else if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) { 682 + } else if (dssdev->type != OMAP_DISPLAY_TYPE_VENC 683 + && dssdev->type != OMAP_DISPLAY_TYPE_HDMI) { 683 684 if (!lcd_mgr->device || force) { 684 685 if (lcd_mgr->device) 685 686 lcd_mgr->unset_device(lcd_mgr); ··· 689 688 } 690 689 } 691 690 692 - if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) { 691 + if (dssdev->type == OMAP_DISPLAY_TYPE_VENC 692 + || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) { 693 693 if (!tv_mgr->device || force) { 694 694 if (tv_mgr->device) 695 695 tv_mgr->unset_device(tv_mgr);
+77 -51
drivers/video/omap2/dss/rfbi.c
··· 36 36 #include <plat/display.h> 37 37 #include "dss.h" 38 38 39 - #define RFBI_BASE 0x48050800 40 - 41 39 struct rfbi_reg { u16 idx; }; 42 40 43 41 #define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) ··· 98 100 static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); 99 101 100 102 static struct { 103 + struct platform_device *pdev; 101 104 void __iomem *base; 102 105 103 106 unsigned long l4_khz; ··· 141 142 static void rfbi_enable_clocks(bool enable) 142 143 { 143 144 if (enable) 144 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 145 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 145 146 else 146 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 147 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 147 148 } 148 149 149 150 void omap_rfbi_write_command(const void *buf, u32 len) ··· 496 497 }; 497 498 498 499 l4_rate = rfbi.l4_khz / 1000; 499 - dss1_rate = dss_clk_get_rate(DSS_CLK_FCK1) / 1000000; 500 + dss1_rate = dss_clk_get_rate(DSS_CLK_FCK) / 1000000; 500 501 501 502 for (i = 0; i < ARRAY_SIZE(ftab); i++) { 502 503 /* Use a window instead of an exact match, to account ··· 921 922 { 922 923 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) 923 924 924 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 925 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 925 926 926 927 DUMPREG(RFBI_REVISION); 927 928 DUMPREG(RFBI_SYSCONFIG); ··· 952 953 DUMPREG(RFBI_VSYNC_WIDTH); 953 954 DUMPREG(RFBI_HSYNC_WIDTH); 954 955 955 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 956 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 956 957 #undef DUMPREG 957 - } 958 - 959 - int rfbi_init(void) 960 - { 961 - u32 rev; 962 - u32 l; 963 - 964 - spin_lock_init(&rfbi.cmd_lock); 965 - 966 - init_completion(&rfbi.cmd_done); 967 - atomic_set(&rfbi.cmd_fifo_full, 0); 968 - atomic_set(&rfbi.cmd_pending, 0); 969 - 970 - rfbi.base = ioremap(RFBI_BASE, SZ_256); 971 - if (!rfbi.base) { 972 - DSSERR("can't ioremap RFBI\n"); 973 - return -ENOMEM; 974 - } 975 - 976 - rfbi_enable_clocks(1); 977 - 978 - msleep(10); 979 - 980 - rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; 981 - 982 - /* Enable autoidle and smart-idle */ 983 - l = rfbi_read_reg(RFBI_SYSCONFIG); 984 - l |= (1 << 0) | (2 << 3); 985 - rfbi_write_reg(RFBI_SYSCONFIG, l); 986 - 987 - rev = rfbi_read_reg(RFBI_REVISION); 988 - printk(KERN_INFO "OMAP RFBI rev %d.%d\n", 989 - FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 990 - 991 - rfbi_enable_clocks(0); 992 - 993 - return 0; 994 - } 995 - 996 - void rfbi_exit(void) 997 - { 998 - DSSDBG("rfbi_exit\n"); 999 - 1000 - iounmap(rfbi.base); 1001 958 } 1002 959 1003 960 int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) ··· 1010 1055 rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev; 1011 1056 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; 1012 1057 return 0; 1058 + } 1059 + 1060 + /* RFBI HW IP initialisation */ 1061 + static int omap_rfbihw_probe(struct platform_device *pdev) 1062 + { 1063 + u32 rev; 1064 + u32 l; 1065 + struct resource *rfbi_mem; 1066 + 1067 + rfbi.pdev = pdev; 1068 + 1069 + spin_lock_init(&rfbi.cmd_lock); 1070 + 1071 + init_completion(&rfbi.cmd_done); 1072 + atomic_set(&rfbi.cmd_fifo_full, 0); 1073 + atomic_set(&rfbi.cmd_pending, 0); 1074 + 1075 + rfbi_mem = platform_get_resource(rfbi.pdev, IORESOURCE_MEM, 0); 1076 + if (!rfbi_mem) { 1077 + DSSERR("can't get IORESOURCE_MEM RFBI\n"); 1078 + return -EINVAL; 1079 + } 1080 + rfbi.base = ioremap(rfbi_mem->start, resource_size(rfbi_mem)); 1081 + if (!rfbi.base) { 1082 + DSSERR("can't ioremap RFBI\n"); 1083 + return -ENOMEM; 1084 + } 1085 + 1086 + rfbi_enable_clocks(1); 1087 + 1088 + msleep(10); 1089 + 1090 + rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; 1091 + 1092 + /* Enable autoidle and smart-idle */ 1093 + l = rfbi_read_reg(RFBI_SYSCONFIG); 1094 + l |= (1 << 0) | (2 << 3); 1095 + rfbi_write_reg(RFBI_SYSCONFIG, l); 1096 + 1097 + rev = rfbi_read_reg(RFBI_REVISION); 1098 + dev_dbg(&pdev->dev, "OMAP RFBI rev %d.%d\n", 1099 + FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 1100 + 1101 + rfbi_enable_clocks(0); 1102 + 1103 + return 0; 1104 + } 1105 + 1106 + static int omap_rfbihw_remove(struct platform_device *pdev) 1107 + { 1108 + iounmap(rfbi.base); 1109 + return 0; 1110 + } 1111 + 1112 + static struct platform_driver omap_rfbihw_driver = { 1113 + .probe = omap_rfbihw_probe, 1114 + .remove = omap_rfbihw_remove, 1115 + .driver = { 1116 + .name = "omapdss_rfbi", 1117 + .owner = THIS_MODULE, 1118 + }, 1119 + }; 1120 + 1121 + int rfbi_init_platform_driver(void) 1122 + { 1123 + return platform_driver_register(&omap_rfbihw_driver); 1124 + } 1125 + 1126 + void rfbi_uninit_platform_driver(void) 1127 + { 1128 + return platform_driver_unregister(&omap_rfbihw_driver); 1013 1129 }
+24 -38
drivers/video/omap2/dss/sdi.c
··· 30 30 #include "dss.h" 31 31 32 32 static struct { 33 - bool skip_init; 34 33 bool update_enabled; 35 34 struct regulator *vdds_sdi_reg; 36 35 } sdi; ··· 67 68 if (r) 68 69 goto err1; 69 70 70 - /* In case of skip_init sdi_init has already enabled the clocks */ 71 - if (!sdi.skip_init) 72 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 71 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK); 73 72 74 73 sdi_basic_init(dssdev); 75 74 ··· 77 80 dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config, 78 81 dssdev->panel.acbi, dssdev->panel.acb); 79 82 80 - if (!sdi.skip_init) { 81 - r = dss_calc_clock_div(1, t->pixel_clock * 1000, 82 - &dss_cinfo, &dispc_cinfo); 83 - } else { 84 - r = dss_get_clock_div(&dss_cinfo); 85 - r = dispc_get_clock_div(dssdev->manager->id, &dispc_cinfo); 86 - } 87 - 83 + r = dss_calc_clock_div(1, t->pixel_clock * 1000, 84 + &dss_cinfo, &dispc_cinfo); 88 85 if (r) 89 86 goto err2; 90 87 ··· 107 116 if (r) 108 117 goto err2; 109 118 110 - if (!sdi.skip_init) { 111 - dss_sdi_init(dssdev->phy.sdi.datapairs); 112 - r = dss_sdi_enable(); 113 - if (r) 114 - goto err1; 115 - mdelay(2); 116 - } 119 + dss_sdi_init(dssdev->phy.sdi.datapairs); 120 + r = dss_sdi_enable(); 121 + if (r) 122 + goto err1; 123 + mdelay(2); 117 124 118 125 dssdev->manager->enable(dssdev->manager); 119 126 120 - sdi.skip_init = 0; 121 - 122 127 return 0; 123 128 err2: 124 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 129 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 125 130 regulator_disable(sdi.vdds_sdi_reg); 126 131 err1: 127 132 omap_dss_stop_device(dssdev); ··· 132 145 133 146 dss_sdi_disable(); 134 147 135 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); 148 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); 136 149 137 150 regulator_disable(sdi.vdds_sdi_reg); 138 151 ··· 144 157 { 145 158 DSSDBG("SDI init\n"); 146 159 160 + if (sdi.vdds_sdi_reg == NULL) { 161 + struct regulator *vdds_sdi; 162 + 163 + vdds_sdi = dss_get_vdds_sdi(); 164 + 165 + if (IS_ERR(vdds_sdi)) { 166 + DSSERR("can't get VDDS_SDI regulator\n"); 167 + return PTR_ERR(vdds_sdi); 168 + } 169 + 170 + sdi.vdds_sdi_reg = vdds_sdi; 171 + } 172 + 147 173 return 0; 148 174 } 149 175 150 - int sdi_init(bool skip_init) 176 + int sdi_init(void) 151 177 { 152 - /* we store this for first display enable, then clear it */ 153 - sdi.skip_init = skip_init; 154 - 155 - sdi.vdds_sdi_reg = dss_get_vdds_sdi(); 156 - if (IS_ERR(sdi.vdds_sdi_reg)) { 157 - DSSERR("can't get VDDS_SDI regulator\n"); 158 - return PTR_ERR(sdi.vdds_sdi_reg); 159 - } 160 - /* 161 - * Enable clocks already here, otherwise there would be a toggle 162 - * of them until sdi_display_enable is called. 163 - */ 164 - if (skip_init) 165 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); 166 178 return 0; 167 179 } 168 180
+88 -46
drivers/video/omap2/dss/venc.c
··· 39 39 40 40 #include "dss.h" 41 41 42 - #define VENC_BASE 0x48050C00 43 - 44 42 /* Venc registers */ 45 43 #define VENC_REV_ID 0x00 46 44 #define VENC_STATUS 0x04 ··· 287 289 EXPORT_SYMBOL(omap_dss_ntsc_timings); 288 290 289 291 static struct { 292 + struct platform_device *pdev; 290 293 void __iomem *base; 291 294 struct mutex venc_lock; 292 295 u32 wss_data; ··· 380 381 static void venc_enable_clocks(int enable) 381 382 { 382 383 if (enable) 383 - dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | 384 - DSS_CLK_96M); 384 + dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_TVFCK | 385 + DSS_CLK_VIDFCK); 385 386 else 386 - dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1 | DSS_CLK_54M | 387 - DSS_CLK_96M); 387 + dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK | DSS_CLK_TVFCK | 388 + DSS_CLK_VIDFCK); 388 389 } 389 390 390 391 static const struct venc_config *venc_timings_to_config( ··· 640 641 }; 641 642 /* driver end */ 642 643 643 - 644 - 645 - int venc_init(struct platform_device *pdev) 646 - { 647 - u8 rev_id; 648 - 649 - mutex_init(&venc.venc_lock); 650 - 651 - venc.wss_data = 0; 652 - 653 - venc.base = ioremap(VENC_BASE, SZ_1K); 654 - if (!venc.base) { 655 - DSSERR("can't ioremap VENC\n"); 656 - return -ENOMEM; 657 - } 658 - 659 - venc.vdda_dac_reg = dss_get_vdda_dac(); 660 - if (IS_ERR(venc.vdda_dac_reg)) { 661 - iounmap(venc.base); 662 - DSSERR("can't get VDDA_DAC regulator\n"); 663 - return PTR_ERR(venc.vdda_dac_reg); 664 - } 665 - 666 - venc_enable_clocks(1); 667 - 668 - rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); 669 - printk(KERN_INFO "OMAP VENC rev %d\n", rev_id); 670 - 671 - venc_enable_clocks(0); 672 - 673 - return omap_dss_register_driver(&venc_driver); 674 - } 675 - 676 - void venc_exit(void) 677 - { 678 - omap_dss_unregister_driver(&venc_driver); 679 - 680 - iounmap(venc.base); 681 - } 682 - 683 644 int venc_init_display(struct omap_dss_device *dssdev) 684 645 { 685 646 DSSDBG("init_display\n"); 647 + 648 + if (venc.vdda_dac_reg == NULL) { 649 + struct regulator *vdda_dac; 650 + 651 + vdda_dac = regulator_get(&venc.pdev->dev, "vdda_dac"); 652 + 653 + if (IS_ERR(vdda_dac)) { 654 + DSSERR("can't get VDDA_DAC regulator\n"); 655 + return PTR_ERR(vdda_dac); 656 + } 657 + 658 + venc.vdda_dac_reg = vdda_dac; 659 + } 686 660 687 661 return 0; 688 662 } ··· 711 739 venc_enable_clocks(0); 712 740 713 741 #undef DUMPREG 742 + } 743 + 744 + /* VENC HW IP initialisation */ 745 + static int omap_venchw_probe(struct platform_device *pdev) 746 + { 747 + u8 rev_id; 748 + struct resource *venc_mem; 749 + 750 + venc.pdev = pdev; 751 + 752 + mutex_init(&venc.venc_lock); 753 + 754 + venc.wss_data = 0; 755 + 756 + venc_mem = platform_get_resource(venc.pdev, IORESOURCE_MEM, 0); 757 + if (!venc_mem) { 758 + DSSERR("can't get IORESOURCE_MEM VENC\n"); 759 + return -EINVAL; 760 + } 761 + venc.base = ioremap(venc_mem->start, resource_size(venc_mem)); 762 + if (!venc.base) { 763 + DSSERR("can't ioremap VENC\n"); 764 + return -ENOMEM; 765 + } 766 + 767 + venc_enable_clocks(1); 768 + 769 + rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff); 770 + dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id); 771 + 772 + venc_enable_clocks(0); 773 + 774 + return omap_dss_register_driver(&venc_driver); 775 + } 776 + 777 + static int omap_venchw_remove(struct platform_device *pdev) 778 + { 779 + if (venc.vdda_dac_reg != NULL) { 780 + regulator_put(venc.vdda_dac_reg); 781 + venc.vdda_dac_reg = NULL; 782 + } 783 + omap_dss_unregister_driver(&venc_driver); 784 + 785 + iounmap(venc.base); 786 + return 0; 787 + } 788 + 789 + static struct platform_driver omap_venchw_driver = { 790 + .probe = omap_venchw_probe, 791 + .remove = omap_venchw_remove, 792 + .driver = { 793 + .name = "omapdss_venc", 794 + .owner = THIS_MODULE, 795 + }, 796 + }; 797 + 798 + int venc_init_platform_driver(void) 799 + { 800 + if (cpu_is_omap44xx()) 801 + return 0; 802 + 803 + return platform_driver_register(&omap_venchw_driver); 804 + } 805 + 806 + void venc_uninit_platform_driver(void) 807 + { 808 + if (cpu_is_omap44xx()) 809 + return; 810 + 811 + return platform_driver_unregister(&omap_venchw_driver); 714 812 }
+3 -3
drivers/video/omap2/omapfb/Kconfig
··· 1 1 menuconfig FB_OMAP2 2 - tristate "OMAP2/3 frame buffer support (EXPERIMENTAL)" 2 + tristate "OMAP2+ frame buffer support (EXPERIMENTAL)" 3 3 depends on FB && OMAP2_DSS 4 4 5 5 select OMAP2_VRAM ··· 8 8 select FB_CFB_COPYAREA 9 9 select FB_CFB_IMAGEBLIT 10 10 help 11 - Frame buffer driver for OMAP2/3 based boards. 11 + Frame buffer driver for OMAP2+ based boards. 12 12 13 13 config FB_OMAP2_DEBUG_SUPPORT 14 - bool "Debug support for OMAP2/3 FB" 14 + bool "Debug support for OMAP2+ FB" 15 15 default y 16 16 depends on FB_OMAP2 17 17 help
+16 -7
drivers/video/omap2/omapfb/omapfb-main.c
··· 2090 2090 { 2091 2091 int r; 2092 2092 u8 bpp; 2093 - struct omap_video_timings timings; 2093 + struct omap_video_timings timings, temp_timings; 2094 2094 2095 2095 r = omapfb_mode_to_timings(mode_str, &timings, &bpp); 2096 2096 if (r) ··· 2100 2100 fbdev->bpp_overrides[fbdev->num_bpp_overrides].bpp = bpp; 2101 2101 ++fbdev->num_bpp_overrides; 2102 2102 2103 - if (!display->driver->check_timings || !display->driver->set_timings) 2104 - return -EINVAL; 2103 + if (display->driver->check_timings) { 2104 + r = display->driver->check_timings(display, &timings); 2105 + if (r) 2106 + return r; 2107 + } else { 2108 + /* If check_timings is not present compare xres and yres */ 2109 + if (display->driver->get_timings) { 2110 + display->driver->get_timings(display, &temp_timings); 2105 2111 2106 - r = display->driver->check_timings(display, &timings); 2107 - if (r) 2108 - return r; 2112 + if (temp_timings.x_res != timings.x_res || 2113 + temp_timings.y_res != timings.y_res) 2114 + return -EINVAL; 2115 + } 2116 + } 2109 2117 2110 - display->driver->set_timings(display, &timings); 2118 + if (display->driver->set_timings) 2119 + display->driver->set_timings(display, &timings); 2111 2120 2112 2121 return 0; 2113 2122 }
+1
drivers/video/s3c-fb.c
··· 1340 1340 sfb->bus_clk = clk_get(dev, "lcd"); 1341 1341 if (IS_ERR(sfb->bus_clk)) { 1342 1342 dev_err(dev, "failed to get bus clock\n"); 1343 + ret = PTR_ERR(sfb->bus_clk); 1343 1344 goto err_sfb; 1344 1345 } 1345 1346
+211 -130
drivers/video/s3fb.c
··· 64 64 65 65 static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3, 66 66 35000, 240000, 14318}; 67 + static const struct svga_pll s3_trio3d_pll = {3, 129, 3, 31, 0, 4, 68 + 230000, 460000, 14318}; 67 69 68 70 static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512}; 69 71 ··· 74 72 "S3 Plato/PX", "S3 Aurora64VP", "S3 Virge", 75 73 "S3 Virge/VX", "S3 Virge/DX", "S3 Virge/GX", 76 74 "S3 Virge/GX2", "S3 Virge/GX2P", "S3 Virge/GX2P", 77 - "S3 Trio3D/1X", "S3 Trio3D/2X", "S3 Trio3D/2X"}; 75 + "S3 Trio3D/1X", "S3 Trio3D/2X", "S3 Trio3D/2X", 76 + "S3 Trio3D"}; 78 77 79 78 #define CHIP_UNKNOWN 0x00 80 79 #define CHIP_732_TRIO32 0x01 ··· 96 93 #define CHIP_360_TRIO3D_1X 0x10 97 94 #define CHIP_362_TRIO3D_2X 0x11 98 95 #define CHIP_368_TRIO3D_2X 0x12 96 + #define CHIP_365_TRIO3D 0x13 99 97 100 98 #define CHIP_XXX_TRIO 0x80 101 99 #define CHIP_XXX_TRIO64V2_DXGX 0x81 ··· 123 119 static const struct vga_regset s3_v_sync_end_regs[] = {{0x11, 0, 3}, VGA_REGSET_END}; 124 120 125 121 static const struct vga_regset s3_line_compare_regs[] = {{0x18, 0, 7}, {0x07, 4, 4}, {0x09, 6, 6}, {0x5E, 6, 6}, VGA_REGSET_END}; 126 - static const struct vga_regset s3_start_address_regs[] = {{0x0d, 0, 7}, {0x0c, 0, 7}, {0x31, 4, 5}, {0x51, 0, 1}, VGA_REGSET_END}; 122 + static const struct vga_regset s3_start_address_regs[] = {{0x0d, 0, 7}, {0x0c, 0, 7}, {0x69, 0, 4}, VGA_REGSET_END}; 127 123 static const struct vga_regset s3_offset_regs[] = {{0x13, 0, 7}, {0x51, 4, 5}, VGA_REGSET_END}; /* set 0x43 bit 2 to 0 */ 124 + 125 + static const struct vga_regset s3_dtpc_regs[] = {{0x3B, 0, 7}, {0x5D, 6, 6}, VGA_REGSET_END}; 128 126 129 127 static const struct svga_timing_regs s3_timing_regs = { 130 128 s3_h_total_regs, s3_h_display_regs, s3_h_blank_start_regs, ··· 194 188 } 195 189 } 196 190 191 + static void s3fb_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor) 192 + { 193 + struct s3fb_info *par = info->par; 194 + 195 + svga_tilecursor(par->state.vgabase, info, cursor); 196 + } 197 + 197 198 static struct fb_tile_ops s3fb_tile_ops = { 198 199 .fb_settile = svga_settile, 199 200 .fb_tilecopy = svga_tilecopy, 200 201 .fb_tilefill = svga_tilefill, 201 202 .fb_tileblit = svga_tileblit, 202 - .fb_tilecursor = svga_tilecursor, 203 + .fb_tilecursor = s3fb_tilecursor, 203 204 .fb_get_tilemax = svga_get_tilemax, 204 205 }; 205 206 ··· 215 202 .fb_tilecopy = svga_tilecopy, 216 203 .fb_tilefill = svga_tilefill, 217 204 .fb_tileblit = svga_tileblit, 218 - .fb_tilecursor = svga_tilecursor, 205 + .fb_tilecursor = s3fb_tilecursor, 219 206 .fb_get_tilemax = svga_get_tilemax, 220 207 }; 221 208 ··· 347 334 u8 regval; 348 335 int rv; 349 336 350 - rv = svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node); 337 + rv = svga_compute_pll((par->chip == CHIP_365_TRIO3D) ? &s3_trio3d_pll : &s3_pll, 338 + 1000000000 / pixclock, &m, &n, &r, info->node); 351 339 if (rv < 0) { 352 340 printk(KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->node); 353 341 return; 354 342 } 355 343 356 344 /* Set VGA misc register */ 357 - regval = vga_r(NULL, VGA_MIS_R); 358 - vga_w(NULL, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 345 + regval = vga_r(par->state.vgabase, VGA_MIS_R); 346 + vga_w(par->state.vgabase, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 359 347 360 348 /* Set S3 clock registers */ 361 349 if (par->chip == CHIP_360_TRIO3D_1X || 362 350 par->chip == CHIP_362_TRIO3D_2X || 363 351 par->chip == CHIP_368_TRIO3D_2X) { 364 - vga_wseq(NULL, 0x12, (n - 2) | ((r & 3) << 6)); /* n and two bits of r */ 365 - vga_wseq(NULL, 0x29, r >> 2); /* remaining highest bit of r */ 352 + vga_wseq(par->state.vgabase, 0x12, (n - 2) | ((r & 3) << 6)); /* n and two bits of r */ 353 + vga_wseq(par->state.vgabase, 0x29, r >> 2); /* remaining highest bit of r */ 366 354 } else 367 - vga_wseq(NULL, 0x12, (n - 2) | (r << 5)); 368 - vga_wseq(NULL, 0x13, m - 2); 355 + vga_wseq(par->state.vgabase, 0x12, (n - 2) | (r << 5)); 356 + vga_wseq(par->state.vgabase, 0x13, m - 2); 369 357 370 358 udelay(1000); 371 359 372 360 /* Activate clock - write 0, 1, 0 to seq/15 bit 5 */ 373 - regval = vga_rseq (NULL, 0x15); /* | 0x80; */ 374 - vga_wseq(NULL, 0x15, regval & ~(1<<5)); 375 - vga_wseq(NULL, 0x15, regval | (1<<5)); 376 - vga_wseq(NULL, 0x15, regval & ~(1<<5)); 361 + regval = vga_rseq (par->state.vgabase, 0x15); /* | 0x80; */ 362 + vga_wseq(par->state.vgabase, 0x15, regval & ~(1<<5)); 363 + vga_wseq(par->state.vgabase, 0x15, regval | (1<<5)); 364 + vga_wseq(par->state.vgabase, 0x15, regval & ~(1<<5)); 377 365 } 378 366 379 367 ··· 386 372 387 373 mutex_lock(&(par->open_lock)); 388 374 if (par->ref_count == 0) { 375 + void __iomem *vgabase = par->state.vgabase; 376 + 389 377 memset(&(par->state), 0, sizeof(struct vgastate)); 378 + par->state.vgabase = vgabase; 390 379 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP; 391 380 par->state.num_crtc = 0x70; 392 381 par->state.num_seq = 0x20; ··· 487 470 struct s3fb_info *par = info->par; 488 471 u32 value, mode, hmul, offset_value, screen_size, multiplex, dbytes; 489 472 u32 bpp = info->var.bits_per_pixel; 473 + u32 htotal, hsstart; 490 474 491 475 if (bpp != 0) { 492 476 info->fix.ypanstep = 1; ··· 522 504 info->var.activate = FB_ACTIVATE_NOW; 523 505 524 506 /* Unlock registers */ 525 - vga_wcrt(NULL, 0x38, 0x48); 526 - vga_wcrt(NULL, 0x39, 0xA5); 527 - vga_wseq(NULL, 0x08, 0x06); 528 - svga_wcrt_mask(0x11, 0x00, 0x80); 507 + vga_wcrt(par->state.vgabase, 0x38, 0x48); 508 + vga_wcrt(par->state.vgabase, 0x39, 0xA5); 509 + vga_wseq(par->state.vgabase, 0x08, 0x06); 510 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x00, 0x80); 529 511 530 512 /* Blank screen and turn off sync */ 531 - svga_wseq_mask(0x01, 0x20, 0x20); 532 - svga_wcrt_mask(0x17, 0x00, 0x80); 513 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 514 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x00, 0x80); 533 515 534 516 /* Set default values */ 535 - svga_set_default_gfx_regs(); 536 - svga_set_default_atc_regs(); 537 - svga_set_default_seq_regs(); 538 - svga_set_default_crt_regs(); 539 - svga_wcrt_multi(s3_line_compare_regs, 0xFFFFFFFF); 540 - svga_wcrt_multi(s3_start_address_regs, 0); 517 + svga_set_default_gfx_regs(par->state.vgabase); 518 + svga_set_default_atc_regs(par->state.vgabase); 519 + svga_set_default_seq_regs(par->state.vgabase); 520 + svga_set_default_crt_regs(par->state.vgabase); 521 + svga_wcrt_multi(par->state.vgabase, s3_line_compare_regs, 0xFFFFFFFF); 522 + svga_wcrt_multi(par->state.vgabase, s3_start_address_regs, 0); 541 523 542 524 /* S3 specific initialization */ 543 - svga_wcrt_mask(0x58, 0x10, 0x10); /* enable linear framebuffer */ 544 - svga_wcrt_mask(0x31, 0x08, 0x08); /* enable sequencer access to framebuffer above 256 kB */ 525 + svga_wcrt_mask(par->state.vgabase, 0x58, 0x10, 0x10); /* enable linear framebuffer */ 526 + svga_wcrt_mask(par->state.vgabase, 0x31, 0x08, 0x08); /* enable sequencer access to framebuffer above 256 kB */ 545 527 546 - /* svga_wcrt_mask(0x33, 0x08, 0x08); */ /* DDR ? */ 547 - /* svga_wcrt_mask(0x43, 0x01, 0x01); */ /* DDR ? */ 548 - svga_wcrt_mask(0x33, 0x00, 0x08); /* no DDR ? */ 549 - svga_wcrt_mask(0x43, 0x00, 0x01); /* no DDR ? */ 528 + /* svga_wcrt_mask(par->state.vgabase, 0x33, 0x08, 0x08); */ /* DDR ? */ 529 + /* svga_wcrt_mask(par->state.vgabase, 0x43, 0x01, 0x01); */ /* DDR ? */ 530 + svga_wcrt_mask(par->state.vgabase, 0x33, 0x00, 0x08); /* no DDR ? */ 531 + svga_wcrt_mask(par->state.vgabase, 0x43, 0x00, 0x01); /* no DDR ? */ 550 532 551 - svga_wcrt_mask(0x5D, 0x00, 0x28); /* Clear strange HSlen bits */ 533 + svga_wcrt_mask(par->state.vgabase, 0x5D, 0x00, 0x28); /* Clear strange HSlen bits */ 552 534 553 - /* svga_wcrt_mask(0x58, 0x03, 0x03); */ 535 + /* svga_wcrt_mask(par->state.vgabase, 0x58, 0x03, 0x03); */ 554 536 555 - /* svga_wcrt_mask(0x53, 0x12, 0x13); */ /* enable MMIO */ 556 - /* svga_wcrt_mask(0x40, 0x08, 0x08); */ /* enable write buffer */ 537 + /* svga_wcrt_mask(par->state.vgabase, 0x53, 0x12, 0x13); */ /* enable MMIO */ 538 + /* svga_wcrt_mask(par->state.vgabase, 0x40, 0x08, 0x08); */ /* enable write buffer */ 557 539 558 540 559 541 /* Set the offset register */ 560 542 pr_debug("fb%d: offset register : %d\n", info->node, offset_value); 561 - svga_wcrt_multi(s3_offset_regs, offset_value); 543 + svga_wcrt_multi(par->state.vgabase, s3_offset_regs, offset_value); 562 544 563 545 if (par->chip != CHIP_360_TRIO3D_1X && 564 546 par->chip != CHIP_362_TRIO3D_2X && 565 547 par->chip != CHIP_368_TRIO3D_2X) { 566 - vga_wcrt(NULL, 0x54, 0x18); /* M parameter */ 567 - vga_wcrt(NULL, 0x60, 0xff); /* N parameter */ 568 - vga_wcrt(NULL, 0x61, 0xff); /* L parameter */ 569 - vga_wcrt(NULL, 0x62, 0xff); /* L parameter */ 548 + vga_wcrt(par->state.vgabase, 0x54, 0x18); /* M parameter */ 549 + vga_wcrt(par->state.vgabase, 0x60, 0xff); /* N parameter */ 550 + vga_wcrt(par->state.vgabase, 0x61, 0xff); /* L parameter */ 551 + vga_wcrt(par->state.vgabase, 0x62, 0xff); /* L parameter */ 570 552 } 571 553 572 - vga_wcrt(NULL, 0x3A, 0x35); 573 - svga_wattr(0x33, 0x00); 554 + vga_wcrt(par->state.vgabase, 0x3A, 0x35); 555 + svga_wattr(par->state.vgabase, 0x33, 0x00); 574 556 575 557 if (info->var.vmode & FB_VMODE_DOUBLE) 576 - svga_wcrt_mask(0x09, 0x80, 0x80); 558 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x80, 0x80); 577 559 else 578 - svga_wcrt_mask(0x09, 0x00, 0x80); 560 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x00, 0x80); 579 561 580 562 if (info->var.vmode & FB_VMODE_INTERLACED) 581 - svga_wcrt_mask(0x42, 0x20, 0x20); 563 + svga_wcrt_mask(par->state.vgabase, 0x42, 0x20, 0x20); 582 564 else 583 - svga_wcrt_mask(0x42, 0x00, 0x20); 565 + svga_wcrt_mask(par->state.vgabase, 0x42, 0x00, 0x20); 584 566 585 567 /* Disable hardware graphics cursor */ 586 - svga_wcrt_mask(0x45, 0x00, 0x01); 568 + svga_wcrt_mask(par->state.vgabase, 0x45, 0x00, 0x01); 587 569 /* Disable Streams engine */ 588 - svga_wcrt_mask(0x67, 0x00, 0x0C); 570 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x00, 0x0C); 589 571 590 572 mode = svga_match_format(s3fb_formats, &(info->var), &(info->fix)); 591 573 592 574 /* S3 virge DX hack */ 593 575 if (par->chip == CHIP_375_VIRGE_DX) { 594 - vga_wcrt(NULL, 0x86, 0x80); 595 - vga_wcrt(NULL, 0x90, 0x00); 576 + vga_wcrt(par->state.vgabase, 0x86, 0x80); 577 + vga_wcrt(par->state.vgabase, 0x90, 0x00); 596 578 } 597 579 598 580 /* S3 virge VX hack */ 599 581 if (par->chip == CHIP_988_VIRGE_VX) { 600 - vga_wcrt(NULL, 0x50, 0x00); 601 - vga_wcrt(NULL, 0x67, 0x50); 582 + vga_wcrt(par->state.vgabase, 0x50, 0x00); 583 + vga_wcrt(par->state.vgabase, 0x67, 0x50); 602 584 603 - vga_wcrt(NULL, 0x63, (mode <= 2) ? 0x90 : 0x09); 604 - vga_wcrt(NULL, 0x66, 0x90); 585 + vga_wcrt(par->state.vgabase, 0x63, (mode <= 2) ? 0x90 : 0x09); 586 + vga_wcrt(par->state.vgabase, 0x66, 0x90); 605 587 } 606 588 607 589 if (par->chip == CHIP_360_TRIO3D_1X || 608 590 par->chip == CHIP_362_TRIO3D_2X || 609 - par->chip == CHIP_368_TRIO3D_2X) { 591 + par->chip == CHIP_368_TRIO3D_2X || 592 + par->chip == CHIP_365_TRIO3D || 593 + par->chip == CHIP_375_VIRGE_DX || 594 + par->chip == CHIP_385_VIRGE_GX) { 610 595 dbytes = info->var.xres * ((bpp+7)/8); 611 - vga_wcrt(NULL, 0x91, (dbytes + 7) / 8); 612 - vga_wcrt(NULL, 0x90, (((dbytes + 7) / 8) >> 8) | 0x80); 596 + vga_wcrt(par->state.vgabase, 0x91, (dbytes + 7) / 8); 597 + vga_wcrt(par->state.vgabase, 0x90, (((dbytes + 7) / 8) >> 8) | 0x80); 613 598 614 - vga_wcrt(NULL, 0x66, 0x81); 599 + vga_wcrt(par->state.vgabase, 0x66, 0x81); 615 600 } 616 601 617 - svga_wcrt_mask(0x31, 0x00, 0x40); 602 + if (par->chip == CHIP_356_VIRGE_GX2 || 603 + par->chip == CHIP_357_VIRGE_GX2P || 604 + par->chip == CHIP_359_VIRGE_GX2P || 605 + par->chip == CHIP_360_TRIO3D_1X || 606 + par->chip == CHIP_362_TRIO3D_2X || 607 + par->chip == CHIP_368_TRIO3D_2X) 608 + vga_wcrt(par->state.vgabase, 0x34, 0x00); 609 + else /* enable Data Transfer Position Control (DTPC) */ 610 + vga_wcrt(par->state.vgabase, 0x34, 0x10); 611 + 612 + svga_wcrt_mask(par->state.vgabase, 0x31, 0x00, 0x40); 618 613 multiplex = 0; 619 614 hmul = 1; 620 615 ··· 635 604 switch (mode) { 636 605 case 0: 637 606 pr_debug("fb%d: text mode\n", info->node); 638 - svga_set_textmode_vga_regs(); 607 + svga_set_textmode_vga_regs(par->state.vgabase); 639 608 640 609 /* Set additional registers like in 8-bit mode */ 641 - svga_wcrt_mask(0x50, 0x00, 0x30); 642 - svga_wcrt_mask(0x67, 0x00, 0xF0); 610 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x00, 0x30); 611 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x00, 0xF0); 643 612 644 613 /* Disable enhanced mode */ 645 - svga_wcrt_mask(0x3A, 0x00, 0x30); 614 + svga_wcrt_mask(par->state.vgabase, 0x3A, 0x00, 0x30); 646 615 647 616 if (fasttext) { 648 617 pr_debug("fb%d: high speed text mode set\n", info->node); 649 - svga_wcrt_mask(0x31, 0x40, 0x40); 618 + svga_wcrt_mask(par->state.vgabase, 0x31, 0x40, 0x40); 650 619 } 651 620 break; 652 621 case 1: 653 622 pr_debug("fb%d: 4 bit pseudocolor\n", info->node); 654 - vga_wgfx(NULL, VGA_GFX_MODE, 0x40); 623 + vga_wgfx(par->state.vgabase, VGA_GFX_MODE, 0x40); 655 624 656 625 /* Set additional registers like in 8-bit mode */ 657 - svga_wcrt_mask(0x50, 0x00, 0x30); 658 - svga_wcrt_mask(0x67, 0x00, 0xF0); 626 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x00, 0x30); 627 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x00, 0xF0); 659 628 660 629 /* disable enhanced mode */ 661 - svga_wcrt_mask(0x3A, 0x00, 0x30); 630 + svga_wcrt_mask(par->state.vgabase, 0x3A, 0x00, 0x30); 662 631 break; 663 632 case 2: 664 633 pr_debug("fb%d: 4 bit pseudocolor, planar\n", info->node); 665 634 666 635 /* Set additional registers like in 8-bit mode */ 667 - svga_wcrt_mask(0x50, 0x00, 0x30); 668 - svga_wcrt_mask(0x67, 0x00, 0xF0); 636 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x00, 0x30); 637 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x00, 0xF0); 669 638 670 639 /* disable enhanced mode */ 671 - svga_wcrt_mask(0x3A, 0x00, 0x30); 640 + svga_wcrt_mask(par->state.vgabase, 0x3A, 0x00, 0x30); 672 641 break; 673 642 case 3: 674 643 pr_debug("fb%d: 8 bit pseudocolor\n", info->node); 675 - svga_wcrt_mask(0x50, 0x00, 0x30); 644 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x00, 0x30); 676 645 if (info->var.pixclock > 20000 || 677 646 par->chip == CHIP_360_TRIO3D_1X || 678 647 par->chip == CHIP_362_TRIO3D_2X || 679 648 par->chip == CHIP_368_TRIO3D_2X) 680 - svga_wcrt_mask(0x67, 0x00, 0xF0); 649 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x00, 0xF0); 681 650 else { 682 - svga_wcrt_mask(0x67, 0x10, 0xF0); 651 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x10, 0xF0); 683 652 multiplex = 1; 684 653 } 685 654 break; ··· 687 656 pr_debug("fb%d: 5/5/5 truecolor\n", info->node); 688 657 if (par->chip == CHIP_988_VIRGE_VX) { 689 658 if (info->var.pixclock > 20000) 690 - svga_wcrt_mask(0x67, 0x20, 0xF0); 659 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x20, 0xF0); 691 660 else 692 - svga_wcrt_mask(0x67, 0x30, 0xF0); 661 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x30, 0xF0); 662 + } else if (par->chip == CHIP_365_TRIO3D) { 663 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 664 + if (info->var.pixclock > 8695) { 665 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x30, 0xF0); 666 + hmul = 2; 667 + } else { 668 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x20, 0xF0); 669 + multiplex = 1; 670 + } 693 671 } else { 694 - svga_wcrt_mask(0x50, 0x10, 0x30); 695 - svga_wcrt_mask(0x67, 0x30, 0xF0); 672 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 673 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x30, 0xF0); 696 674 if (par->chip != CHIP_360_TRIO3D_1X && 697 675 par->chip != CHIP_362_TRIO3D_2X && 698 676 par->chip != CHIP_368_TRIO3D_2X) ··· 712 672 pr_debug("fb%d: 5/6/5 truecolor\n", info->node); 713 673 if (par->chip == CHIP_988_VIRGE_VX) { 714 674 if (info->var.pixclock > 20000) 715 - svga_wcrt_mask(0x67, 0x40, 0xF0); 675 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x40, 0xF0); 716 676 else 717 - svga_wcrt_mask(0x67, 0x50, 0xF0); 677 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x50, 0xF0); 678 + } else if (par->chip == CHIP_365_TRIO3D) { 679 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 680 + if (info->var.pixclock > 8695) { 681 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x50, 0xF0); 682 + hmul = 2; 683 + } else { 684 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x40, 0xF0); 685 + multiplex = 1; 686 + } 718 687 } else { 719 - svga_wcrt_mask(0x50, 0x10, 0x30); 720 - svga_wcrt_mask(0x67, 0x50, 0xF0); 688 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x10, 0x30); 689 + svga_wcrt_mask(par->state.vgabase, 0x67, 0x50, 0xF0); 721 690 if (par->chip != CHIP_360_TRIO3D_1X && 722 691 par->chip != CHIP_362_TRIO3D_2X && 723 692 par->chip != CHIP_368_TRIO3D_2X) ··· 736 687 case 6: 737 688 /* VIRGE VX case */ 738 689 pr_debug("fb%d: 8/8/8 truecolor\n", info->node); 739 - svga_wcrt_mask(0x67, 0xD0, 0xF0); 690 + svga_wcrt_mask(par->state.vgabase, 0x67, 0xD0, 0xF0); 740 691 break; 741 692 case 7: 742 693 pr_debug("fb%d: 8/8/8/8 truecolor\n", info->node); 743 - svga_wcrt_mask(0x50, 0x30, 0x30); 744 - svga_wcrt_mask(0x67, 0xD0, 0xF0); 694 + svga_wcrt_mask(par->state.vgabase, 0x50, 0x30, 0x30); 695 + svga_wcrt_mask(par->state.vgabase, 0x67, 0xD0, 0xF0); 745 696 break; 746 697 default: 747 698 printk(KERN_ERR "fb%d: unsupported mode - bug\n", info->node); ··· 749 700 } 750 701 751 702 if (par->chip != CHIP_988_VIRGE_VX) { 752 - svga_wseq_mask(0x15, multiplex ? 0x10 : 0x00, 0x10); 753 - svga_wseq_mask(0x18, multiplex ? 0x80 : 0x00, 0x80); 703 + svga_wseq_mask(par->state.vgabase, 0x15, multiplex ? 0x10 : 0x00, 0x10); 704 + svga_wseq_mask(par->state.vgabase, 0x18, multiplex ? 0x80 : 0x00, 0x80); 754 705 } 755 706 756 707 s3_set_pixclock(info, info->var.pixclock); 757 - svga_set_timings(&s3_timing_regs, &(info->var), hmul, 1, 708 + svga_set_timings(par->state.vgabase, &s3_timing_regs, &(info->var), hmul, 1, 758 709 (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 759 710 (info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1, 760 711 hmul, info->node); 761 712 762 713 /* Set interlaced mode start/end register */ 763 - value = info->var.xres + info->var.left_margin + info->var.right_margin + info->var.hsync_len; 764 - value = ((value * hmul) / 8) - 5; 765 - vga_wcrt(NULL, 0x3C, (value + 1) / 2); 714 + htotal = info->var.xres + info->var.left_margin + info->var.right_margin + info->var.hsync_len; 715 + htotal = ((htotal * hmul) / 8) - 5; 716 + vga_wcrt(par->state.vgabase, 0x3C, (htotal + 1) / 2); 717 + 718 + /* Set Data Transfer Position */ 719 + hsstart = ((info->var.xres + info->var.right_margin) * hmul) / 8; 720 + value = clamp((htotal + hsstart + 1) / 2, hsstart + 4, htotal + 1); 721 + svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value); 766 722 767 723 memset_io(info->screen_base, 0x00, screen_size); 768 724 /* Device and screen back on */ 769 - svga_wcrt_mask(0x17, 0x80, 0x80); 770 - svga_wseq_mask(0x01, 0x00, 0x20); 725 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); 726 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 771 727 772 728 return 0; 773 729 } ··· 842 788 843 789 static int s3fb_blank(int blank_mode, struct fb_info *info) 844 790 { 791 + struct s3fb_info *par = info->par; 792 + 845 793 switch (blank_mode) { 846 794 case FB_BLANK_UNBLANK: 847 795 pr_debug("fb%d: unblank\n", info->node); 848 - svga_wcrt_mask(0x56, 0x00, 0x06); 849 - svga_wseq_mask(0x01, 0x00, 0x20); 796 + svga_wcrt_mask(par->state.vgabase, 0x56, 0x00, 0x06); 797 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 850 798 break; 851 799 case FB_BLANK_NORMAL: 852 800 pr_debug("fb%d: blank\n", info->node); 853 - svga_wcrt_mask(0x56, 0x00, 0x06); 854 - svga_wseq_mask(0x01, 0x20, 0x20); 801 + svga_wcrt_mask(par->state.vgabase, 0x56, 0x00, 0x06); 802 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 855 803 break; 856 804 case FB_BLANK_HSYNC_SUSPEND: 857 805 pr_debug("fb%d: hsync\n", info->node); 858 - svga_wcrt_mask(0x56, 0x02, 0x06); 859 - svga_wseq_mask(0x01, 0x20, 0x20); 806 + svga_wcrt_mask(par->state.vgabase, 0x56, 0x02, 0x06); 807 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 860 808 break; 861 809 case FB_BLANK_VSYNC_SUSPEND: 862 810 pr_debug("fb%d: vsync\n", info->node); 863 - svga_wcrt_mask(0x56, 0x04, 0x06); 864 - svga_wseq_mask(0x01, 0x20, 0x20); 811 + svga_wcrt_mask(par->state.vgabase, 0x56, 0x04, 0x06); 812 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 865 813 break; 866 814 case FB_BLANK_POWERDOWN: 867 815 pr_debug("fb%d: sync down\n", info->node); 868 - svga_wcrt_mask(0x56, 0x06, 0x06); 869 - svga_wseq_mask(0x01, 0x20, 0x20); 816 + svga_wcrt_mask(par->state.vgabase, 0x56, 0x06, 0x06); 817 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 870 818 break; 871 819 } 872 820 ··· 878 822 879 823 /* Pan the display */ 880 824 881 - static int s3fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { 882 - 825 + static int s3fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) 826 + { 827 + struct s3fb_info *par = info->par; 883 828 unsigned int offset; 884 829 885 830 /* Calculate the offset */ ··· 894 837 } 895 838 896 839 /* Set the offset */ 897 - svga_wcrt_multi(s3_start_address_regs, offset); 840 + svga_wcrt_multi(par->state.vgabase, s3_start_address_regs, offset); 898 841 899 842 return 0; 900 843 } ··· 920 863 921 864 /* ------------------------------------------------------------------------- */ 922 865 923 - static int __devinit s3_identification(int chip) 866 + static int __devinit s3_identification(struct s3fb_info *par) 924 867 { 868 + int chip = par->chip; 869 + 925 870 if (chip == CHIP_XXX_TRIO) { 926 - u8 cr30 = vga_rcrt(NULL, 0x30); 927 - u8 cr2e = vga_rcrt(NULL, 0x2e); 928 - u8 cr2f = vga_rcrt(NULL, 0x2f); 871 + u8 cr30 = vga_rcrt(par->state.vgabase, 0x30); 872 + u8 cr2e = vga_rcrt(par->state.vgabase, 0x2e); 873 + u8 cr2f = vga_rcrt(par->state.vgabase, 0x2f); 929 874 930 875 if ((cr30 == 0xE0) || (cr30 == 0xE1)) { 931 876 if (cr2e == 0x10) ··· 942 883 } 943 884 944 885 if (chip == CHIP_XXX_TRIO64V2_DXGX) { 945 - u8 cr6f = vga_rcrt(NULL, 0x6f); 886 + u8 cr6f = vga_rcrt(par->state.vgabase, 0x6f); 946 887 947 888 if (! (cr6f & 0x01)) 948 889 return CHIP_775_TRIO64V2_DX; ··· 951 892 } 952 893 953 894 if (chip == CHIP_XXX_VIRGE_DXGX) { 954 - u8 cr6f = vga_rcrt(NULL, 0x6f); 895 + u8 cr6f = vga_rcrt(par->state.vgabase, 0x6f); 955 896 956 897 if (! (cr6f & 0x01)) 957 898 return CHIP_375_VIRGE_DX; ··· 960 901 } 961 902 962 903 if (chip == CHIP_36X_TRIO3D_1X_2X) { 963 - switch (vga_rcrt(NULL, 0x2f)) { 904 + switch (vga_rcrt(par->state.vgabase, 0x2f)) { 964 905 case 0x00: 965 906 return CHIP_360_TRIO3D_1X; 966 907 case 0x01: ··· 978 919 979 920 static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) 980 921 { 922 + struct pci_bus_region bus_reg; 923 + struct resource vga_res; 981 924 struct fb_info *info; 982 925 struct s3fb_info *par; 983 926 int rc; ··· 1029 968 goto err_iomap; 1030 969 } 1031 970 971 + bus_reg.start = 0; 972 + bus_reg.end = 64 * 1024; 973 + 974 + vga_res.flags = IORESOURCE_IO; 975 + 976 + pcibios_bus_to_resource(dev, &vga_res, &bus_reg); 977 + 978 + par->state.vgabase = (void __iomem *) vga_res.start; 979 + 1032 980 /* Unlock regs */ 1033 - cr38 = vga_rcrt(NULL, 0x38); 1034 - cr39 = vga_rcrt(NULL, 0x39); 1035 - vga_wseq(NULL, 0x08, 0x06); 1036 - vga_wcrt(NULL, 0x38, 0x48); 1037 - vga_wcrt(NULL, 0x39, 0xA5); 981 + cr38 = vga_rcrt(par->state.vgabase, 0x38); 982 + cr39 = vga_rcrt(par->state.vgabase, 0x39); 983 + vga_wseq(par->state.vgabase, 0x08, 0x06); 984 + vga_wcrt(par->state.vgabase, 0x38, 0x48); 985 + vga_wcrt(par->state.vgabase, 0x39, 0xA5); 1038 986 1039 987 /* Identify chip type */ 1040 988 par->chip = id->driver_data & CHIP_MASK; 1041 - par->rev = vga_rcrt(NULL, 0x2f); 989 + par->rev = vga_rcrt(par->state.vgabase, 0x2f); 1042 990 if (par->chip & CHIP_UNDECIDED_FLAG) 1043 - par->chip = s3_identification(par->chip); 991 + par->chip = s3_identification(par); 1044 992 1045 993 /* Find how many physical memory there is on card */ 1046 994 /* 0x36 register is accessible even if other registers are locked */ 1047 - regval = vga_rcrt(NULL, 0x36); 995 + regval = vga_rcrt(par->state.vgabase, 0x36); 1048 996 if (par->chip == CHIP_360_TRIO3D_1X || 1049 997 par->chip == CHIP_362_TRIO3D_2X || 1050 - par->chip == CHIP_368_TRIO3D_2X) { 998 + par->chip == CHIP_368_TRIO3D_2X || 999 + par->chip == CHIP_365_TRIO3D) { 1051 1000 switch ((regval & 0xE0) >> 5) { 1052 1001 case 0: /* 8MB -- only 4MB usable for display */ 1053 1002 case 1: /* 4MB with 32-bit bus */ 1054 1003 case 2: /* 4MB */ 1055 1004 info->screen_size = 4 << 20; 1056 1005 break; 1006 + case 4: /* 2MB on 365 Trio3D */ 1057 1007 case 6: /* 2MB */ 1058 1008 info->screen_size = 2 << 20; 1059 1009 break; ··· 1074 1002 info->fix.smem_len = info->screen_size; 1075 1003 1076 1004 /* Find MCLK frequency */ 1077 - regval = vga_rseq(NULL, 0x10); 1078 - par->mclk_freq = ((vga_rseq(NULL, 0x11) + 2) * 14318) / ((regval & 0x1F) + 2); 1005 + regval = vga_rseq(par->state.vgabase, 0x10); 1006 + par->mclk_freq = ((vga_rseq(par->state.vgabase, 0x11) + 2) * 14318) / ((regval & 0x1F) + 2); 1079 1007 par->mclk_freq = par->mclk_freq >> (regval >> 5); 1080 1008 1081 1009 /* Restore locks */ 1082 - vga_wcrt(NULL, 0x38, cr38); 1083 - vga_wcrt(NULL, 0x39, cr39); 1010 + vga_wcrt(par->state.vgabase, 0x38, cr38); 1011 + vga_wcrt(par->state.vgabase, 0x39, cr39); 1084 1012 1085 1013 strcpy(info->fix.id, s3_names [par->chip]); 1086 1014 info->fix.mmio_start = 0; ··· 1096 1024 if (! ((rc == 1) || (rc == 2))) { 1097 1025 rc = -EINVAL; 1098 1026 dev_err(info->device, "mode %s not found\n", mode_option); 1027 + goto err_find_mode; 1028 + } 1029 + 1030 + /* maximize virtual vertical size for fast scrolling */ 1031 + info->var.yres_virtual = info->fix.smem_len * 8 / 1032 + (info->var.bits_per_pixel * info->var.xres_virtual); 1033 + if (info->var.yres_virtual < info->var.yres) { 1034 + dev_err(info->device, "virtual vertical size smaller than real\n"); 1099 1035 goto err_find_mode; 1100 1036 } 1101 1037 ··· 1124 1044 1125 1045 if (par->chip == CHIP_UNKNOWN) 1126 1046 printk(KERN_INFO "fb%d: unknown chip, CR2D=%x, CR2E=%x, CRT2F=%x, CRT30=%x\n", 1127 - info->node, vga_rcrt(NULL, 0x2d), vga_rcrt(NULL, 0x2e), 1128 - vga_rcrt(NULL, 0x2f), vga_rcrt(NULL, 0x30)); 1047 + info->node, vga_rcrt(par->state.vgabase, 0x2d), vga_rcrt(par->state.vgabase, 0x2e), 1048 + vga_rcrt(par->state.vgabase, 0x2f), vga_rcrt(par->state.vgabase, 0x30)); 1129 1049 1130 1050 /* Record a reference to the driver data */ 1131 1051 pci_set_drvdata(dev, info); ··· 1272 1192 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_357_VIRGE_GX2P}, 1273 1193 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A12), .driver_data = CHIP_359_VIRGE_GX2P}, 1274 1194 {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A13), .driver_data = CHIP_36X_TRIO3D_1X_2X}, 1195 + {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8904), .driver_data = CHIP_365_TRIO3D}, 1275 1196 1276 1197 {0, 0, 0, 0, 0, 0, 0} 1277 1198 };
+2 -2
drivers/video/sh7760fb.c
··· 459 459 } 460 460 461 461 par->ioarea = request_mem_region(res->start, 462 - (res->end - res->start), pdev->name); 462 + resource_size(res), pdev->name); 463 463 if (!par->ioarea) { 464 464 dev_err(&pdev->dev, "mmio area busy\n"); 465 465 ret = -EBUSY; 466 466 goto out_fb; 467 467 } 468 468 469 - par->base = ioremap_nocache(res->start, res->end - res->start + 1); 469 + par->base = ioremap_nocache(res->start, resource_size(res)); 470 470 if (!par->base) { 471 471 dev_err(&pdev->dev, "cannot remap\n"); 472 472 ret = -ENODEV;
+3 -2
drivers/video/sh_mobile_lcdcfb.c
··· 1088 1088 1089 1089 bl = backlight_device_register(ch->cfg.bl_info.name, parent, ch, 1090 1090 &sh_mobile_lcdc_bl_ops, NULL); 1091 - if (!bl) { 1092 - dev_err(parent, "unable to register backlight device\n"); 1091 + if (IS_ERR(bl)) { 1092 + dev_err(parent, "unable to register backlight device: %ld\n", 1093 + PTR_ERR(bl)); 1093 1094 return NULL; 1094 1095 } 1095 1096
+1
drivers/video/sis/sis.h
··· 495 495 unsigned int refresh_rate; 496 496 497 497 unsigned int chip; 498 + unsigned int chip_real_id; 498 499 u8 revision_id; 499 500 int sisvga_enabled; /* PCI device was enabled */ 500 501
+226 -89
drivers/video/sis/sis_main.c
··· 4563 4563 } 4564 4564 #endif 4565 4565 4566 + static inline int sisfb_xgi_is21(struct sis_video_info *ivideo) 4567 + { 4568 + return ivideo->chip_real_id == XGI_21; 4569 + } 4570 + 4566 4571 static void __devinit 4567 4572 sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay) 4568 4573 { ··· 4632 4627 return 1; 4633 4628 } 4634 4629 4635 - static void __devinit 4630 + static int __devinit 4636 4631 sisfb_post_xgi_ramsize(struct sis_video_info *ivideo) 4637 4632 { 4638 4633 unsigned int buswidth, ranksize, channelab, mapsize; 4639 - int i, j, k, l; 4634 + int i, j, k, l, status; 4640 4635 u8 reg, sr14; 4641 4636 static const u8 dramsr13[12 * 5] = { 4642 4637 0x02, 0x0e, 0x0b, 0x80, 0x5d, ··· 4678 4673 SiS_SetReg(SISSR, 0x13, 0x35); 4679 4674 SiS_SetReg(SISSR, 0x14, 0x41); 4680 4675 /* TODO */ 4681 - return; 4676 + return -ENOMEM; 4682 4677 } 4683 4678 4684 4679 /* Non-interleaving */ ··· 4840 4835 4841 4836 j = (ivideo->chip == XGI_20) ? 5 : 9; 4842 4837 k = (ivideo->chip == XGI_20) ? 12 : 4; 4838 + status = -EIO; 4843 4839 4844 4840 for(i = 0; i < k; i++) { 4845 4841 ··· 4874 4868 SiS_SetRegANDOR(SISSR, 0x14, 0x0f, (reg & 0xf0)); 4875 4869 sisfb_post_xgi_delay(ivideo, 1); 4876 4870 4877 - if(sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize)) 4871 + if (sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize)) { 4872 + status = 0; 4878 4873 break; 4874 + } 4879 4875 } 4880 4876 4881 4877 iounmap(ivideo->video_vbase); 4878 + 4879 + return status; 4882 4880 } 4883 4881 4884 4882 static void __devinit ··· 4939 4929 sisfb_post_xgi_delay(ivideo, 0x43); 4940 4930 sisfb_post_xgi_delay(ivideo, 0x43); 4941 4931 sisfb_post_xgi_delay(ivideo, 0x43); 4932 + } 4933 + 4934 + static void __devinit 4935 + sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo, u8 regb) 4936 + { 4937 + unsigned char *bios = ivideo->bios_abase; 4938 + u8 v1; 4939 + 4940 + SiS_SetReg(SISSR, 0x28, 0x64); 4941 + SiS_SetReg(SISSR, 0x29, 0x63); 4942 + sisfb_post_xgi_delay(ivideo, 15); 4943 + SiS_SetReg(SISSR, 0x18, 0x00); 4944 + SiS_SetReg(SISSR, 0x19, 0x20); 4945 + SiS_SetReg(SISSR, 0x16, 0x00); 4946 + SiS_SetReg(SISSR, 0x16, 0x80); 4947 + SiS_SetReg(SISSR, 0x18, 0xc5); 4948 + SiS_SetReg(SISSR, 0x19, 0x23); 4949 + SiS_SetReg(SISSR, 0x16, 0x00); 4950 + SiS_SetReg(SISSR, 0x16, 0x80); 4951 + sisfb_post_xgi_delay(ivideo, 1); 4952 + SiS_SetReg(SISCR, 0x97, 0x11); 4953 + sisfb_post_xgi_setclocks(ivideo, regb); 4954 + sisfb_post_xgi_delay(ivideo, 0x46); 4955 + SiS_SetReg(SISSR, 0x18, 0xc5); 4956 + SiS_SetReg(SISSR, 0x19, 0x23); 4957 + SiS_SetReg(SISSR, 0x16, 0x00); 4958 + SiS_SetReg(SISSR, 0x16, 0x80); 4959 + sisfb_post_xgi_delay(ivideo, 1); 4960 + SiS_SetReg(SISSR, 0x1b, 0x04); 4961 + sisfb_post_xgi_delay(ivideo, 1); 4962 + SiS_SetReg(SISSR, 0x1b, 0x00); 4963 + sisfb_post_xgi_delay(ivideo, 1); 4964 + v1 = 0x31; 4965 + if (ivideo->haveXGIROM) { 4966 + v1 = bios[0xf0]; 4967 + } 4968 + SiS_SetReg(SISSR, 0x18, v1); 4969 + SiS_SetReg(SISSR, 0x19, 0x06); 4970 + SiS_SetReg(SISSR, 0x16, 0x04); 4971 + SiS_SetReg(SISSR, 0x16, 0x84); 4972 + sisfb_post_xgi_delay(ivideo, 1); 4973 + } 4974 + 4975 + static void __devinit 4976 + sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo) 4977 + { 4978 + sisfb_post_xgi_setclocks(ivideo, 1); 4979 + 4980 + SiS_SetReg(SISCR, 0x97, 0x11); 4981 + sisfb_post_xgi_delay(ivideo, 0x46); 4982 + 4983 + SiS_SetReg(SISSR, 0x18, 0x00); /* EMRS2 */ 4984 + SiS_SetReg(SISSR, 0x19, 0x80); 4985 + SiS_SetReg(SISSR, 0x16, 0x05); 4986 + SiS_SetReg(SISSR, 0x16, 0x85); 4987 + 4988 + SiS_SetReg(SISSR, 0x18, 0x00); /* EMRS3 */ 4989 + SiS_SetReg(SISSR, 0x19, 0xc0); 4990 + SiS_SetReg(SISSR, 0x16, 0x05); 4991 + SiS_SetReg(SISSR, 0x16, 0x85); 4992 + 4993 + SiS_SetReg(SISSR, 0x18, 0x00); /* EMRS1 */ 4994 + SiS_SetReg(SISSR, 0x19, 0x40); 4995 + SiS_SetReg(SISSR, 0x16, 0x05); 4996 + SiS_SetReg(SISSR, 0x16, 0x85); 4997 + 4998 + SiS_SetReg(SISSR, 0x18, 0x42); /* MRS1 */ 4999 + SiS_SetReg(SISSR, 0x19, 0x02); 5000 + SiS_SetReg(SISSR, 0x16, 0x05); 5001 + SiS_SetReg(SISSR, 0x16, 0x85); 5002 + sisfb_post_xgi_delay(ivideo, 1); 5003 + 5004 + SiS_SetReg(SISSR, 0x1b, 0x04); 5005 + sisfb_post_xgi_delay(ivideo, 1); 5006 + 5007 + SiS_SetReg(SISSR, 0x1b, 0x00); 5008 + sisfb_post_xgi_delay(ivideo, 1); 5009 + 5010 + SiS_SetReg(SISSR, 0x18, 0x42); /* MRS1 */ 5011 + SiS_SetReg(SISSR, 0x19, 0x00); 5012 + SiS_SetReg(SISSR, 0x16, 0x05); 5013 + SiS_SetReg(SISSR, 0x16, 0x85); 5014 + sisfb_post_xgi_delay(ivideo, 1); 5015 + } 5016 + 5017 + static void __devinit 5018 + sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb) 5019 + { 5020 + unsigned char *bios = ivideo->bios_abase; 5021 + static const u8 cs158[8] = { 5022 + 0x88, 0xaa, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00 5023 + }; 5024 + static const u8 cs160[8] = { 5025 + 0x44, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00 5026 + }; 5027 + static const u8 cs168[8] = { 5028 + 0x48, 0x78, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00 5029 + }; 5030 + u8 reg; 5031 + u8 v1; 5032 + u8 v2; 5033 + u8 v3; 5034 + 5035 + SiS_SetReg(SISCR, 0xb0, 0x80); /* DDR2 dual frequency mode */ 5036 + SiS_SetReg(SISCR, 0x82, 0x77); 5037 + SiS_SetReg(SISCR, 0x86, 0x00); 5038 + reg = SiS_GetReg(SISCR, 0x86); 5039 + SiS_SetReg(SISCR, 0x86, 0x88); 5040 + reg = SiS_GetReg(SISCR, 0x86); 5041 + v1 = cs168[regb]; v2 = cs160[regb]; v3 = cs158[regb]; 5042 + if (ivideo->haveXGIROM) { 5043 + v1 = bios[regb + 0x168]; 5044 + v2 = bios[regb + 0x160]; 5045 + v3 = bios[regb + 0x158]; 5046 + } 5047 + SiS_SetReg(SISCR, 0x86, v1); 5048 + SiS_SetReg(SISCR, 0x82, 0x77); 5049 + SiS_SetReg(SISCR, 0x85, 0x00); 5050 + reg = SiS_GetReg(SISCR, 0x85); 5051 + SiS_SetReg(SISCR, 0x85, 0x88); 5052 + reg = SiS_GetReg(SISCR, 0x85); 5053 + SiS_SetReg(SISCR, 0x85, v2); 5054 + SiS_SetReg(SISCR, 0x82, v3); 5055 + SiS_SetReg(SISCR, 0x98, 0x01); 5056 + SiS_SetReg(SISCR, 0x9a, 0x02); 5057 + if (sisfb_xgi_is21(ivideo)) 5058 + sisfb_post_xgi_ddr2_mrs_xg21(ivideo); 5059 + else 5060 + sisfb_post_xgi_ddr2_mrs_default(ivideo, regb); 5061 + } 5062 + 5063 + static u8 __devinit 5064 + sisfb_post_xgi_ramtype(struct sis_video_info *ivideo) 5065 + { 5066 + unsigned char *bios = ivideo->bios_abase; 5067 + u8 ramtype; 5068 + u8 reg; 5069 + u8 v1; 5070 + 5071 + ramtype = 0x00; v1 = 0x10; 5072 + if (ivideo->haveXGIROM) { 5073 + ramtype = bios[0x62]; 5074 + v1 = bios[0x1d2]; 5075 + } 5076 + if (!(ramtype & 0x80)) { 5077 + if (sisfb_xgi_is21(ivideo)) { 5078 + SiS_SetRegAND(SISCR, 0xb4, 0xfd); /* GPIO control */ 5079 + SiS_SetRegOR(SISCR, 0x4a, 0x80); /* GPIOH EN */ 5080 + reg = SiS_GetReg(SISCR, 0x48); 5081 + SiS_SetRegOR(SISCR, 0xb4, 0x02); 5082 + ramtype = reg & 0x01; /* GPIOH */ 5083 + } else if (ivideo->chip == XGI_20) { 5084 + SiS_SetReg(SISCR, 0x97, v1); 5085 + reg = SiS_GetReg(SISCR, 0x97); 5086 + if (reg & 0x10) { 5087 + ramtype = (reg & 0x01) << 1; 5088 + } 5089 + } else { 5090 + reg = SiS_GetReg(SISSR, 0x39); 5091 + ramtype = reg & 0x02; 5092 + if (!(ramtype)) { 5093 + reg = SiS_GetReg(SISSR, 0x3a); 5094 + ramtype = (reg >> 1) & 0x01; 5095 + } 5096 + } 5097 + } 5098 + ramtype &= 0x07; 5099 + 5100 + return ramtype; 4942 5101 } 4943 5102 4944 5103 static int __devinit ··· 5392 5213 SiS_SetReg(SISCR, 0x77, v1); 5393 5214 } 5394 5215 5395 - /* RAM type */ 5396 - 5397 - regb = 0; /* ! */ 5216 + /* RAM type: 5217 + * 5218 + * 0 == DDR1, 1 == DDR2, 2..7 == reserved? 5219 + * 5220 + * The code seems to written so that regb should equal ramtype, 5221 + * however, so far it has been hardcoded to 0. Enable other values only 5222 + * on XGI Z9, as it passes the POST, and add a warning for others. 5223 + */ 5224 + ramtype = sisfb_post_xgi_ramtype(ivideo); 5225 + if (!sisfb_xgi_is21(ivideo) && ramtype) { 5226 + dev_warn(&pdev->dev, 5227 + "RAM type something else than expected: %d\n", 5228 + ramtype); 5229 + regb = 0; 5230 + } else { 5231 + regb = ramtype; 5232 + } 5398 5233 5399 5234 v1 = 0xff; 5400 5235 if(ivideo->haveXGIROM) { ··· 5560 5367 } 5561 5368 } 5562 5369 5563 - SiS_SetReg(SISSR, 0x17, 0x00); 5370 + if (regb == 1) 5371 + SiS_SetReg(SISSR, 0x17, 0x80); /* DDR2 */ 5372 + else 5373 + SiS_SetReg(SISSR, 0x17, 0x00); /* DDR1 */ 5564 5374 SiS_SetReg(SISSR, 0x1a, 0x87); 5565 5375 5566 5376 if(ivideo->chip == XGI_20) { 5567 5377 SiS_SetReg(SISSR, 0x15, 0x00); 5568 5378 SiS_SetReg(SISSR, 0x1c, 0x00); 5569 5379 } 5570 - 5571 - ramtype = 0x00; v1 = 0x10; 5572 - if(ivideo->haveXGIROM) { 5573 - ramtype = bios[0x62]; 5574 - v1 = bios[0x1d2]; 5575 - } 5576 - if(!(ramtype & 0x80)) { 5577 - if(ivideo->chip == XGI_20) { 5578 - SiS_SetReg(SISCR, 0x97, v1); 5579 - reg = SiS_GetReg(SISCR, 0x97); 5580 - if(reg & 0x10) { 5581 - ramtype = (reg & 0x01) << 1; 5582 - } 5583 - } else { 5584 - reg = SiS_GetReg(SISSR, 0x39); 5585 - ramtype = reg & 0x02; 5586 - if(!(ramtype)) { 5587 - reg = SiS_GetReg(SISSR, 0x3a); 5588 - ramtype = (reg >> 1) & 0x01; 5589 - } 5590 - } 5591 - } 5592 - ramtype &= 0x07; 5593 - 5594 - regb = 0; /* ! */ 5595 5380 5596 5381 switch(ramtype) { 5597 5382 case 0: ··· 5656 5485 SiS_SetReg(SISSR, 0x1b, 0x00); 5657 5486 break; 5658 5487 case 1: 5659 - SiS_SetReg(SISCR, 0x82, 0x77); 5660 - SiS_SetReg(SISCR, 0x86, 0x00); 5661 - reg = SiS_GetReg(SISCR, 0x86); 5662 - SiS_SetReg(SISCR, 0x86, 0x88); 5663 - reg = SiS_GetReg(SISCR, 0x86); 5664 - v1 = cs168[regb]; v2 = cs160[regb]; v3 = cs158[regb]; 5665 - if(ivideo->haveXGIROM) { 5666 - v1 = bios[regb + 0x168]; 5667 - v2 = bios[regb + 0x160]; 5668 - v3 = bios[regb + 0x158]; 5669 - } 5670 - SiS_SetReg(SISCR, 0x86, v1); 5671 - SiS_SetReg(SISCR, 0x82, 0x77); 5672 - SiS_SetReg(SISCR, 0x85, 0x00); 5673 - reg = SiS_GetReg(SISCR, 0x85); 5674 - SiS_SetReg(SISCR, 0x85, 0x88); 5675 - reg = SiS_GetReg(SISCR, 0x85); 5676 - SiS_SetReg(SISCR, 0x85, v2); 5677 - SiS_SetReg(SISCR, 0x82, v3); 5678 - SiS_SetReg(SISCR, 0x98, 0x01); 5679 - SiS_SetReg(SISCR, 0x9a, 0x02); 5680 - 5681 - SiS_SetReg(SISSR, 0x28, 0x64); 5682 - SiS_SetReg(SISSR, 0x29, 0x63); 5683 - sisfb_post_xgi_delay(ivideo, 15); 5684 - SiS_SetReg(SISSR, 0x18, 0x00); 5685 - SiS_SetReg(SISSR, 0x19, 0x20); 5686 - SiS_SetReg(SISSR, 0x16, 0x00); 5687 - SiS_SetReg(SISSR, 0x16, 0x80); 5688 - SiS_SetReg(SISSR, 0x18, 0xc5); 5689 - SiS_SetReg(SISSR, 0x19, 0x23); 5690 - SiS_SetReg(SISSR, 0x16, 0x00); 5691 - SiS_SetReg(SISSR, 0x16, 0x80); 5692 - sisfb_post_xgi_delay(ivideo, 1); 5693 - SiS_SetReg(SISCR, 0x97, 0x11); 5694 - sisfb_post_xgi_setclocks(ivideo, regb); 5695 - sisfb_post_xgi_delay(ivideo, 0x46); 5696 - SiS_SetReg(SISSR, 0x18, 0xc5); 5697 - SiS_SetReg(SISSR, 0x19, 0x23); 5698 - SiS_SetReg(SISSR, 0x16, 0x00); 5699 - SiS_SetReg(SISSR, 0x16, 0x80); 5700 - sisfb_post_xgi_delay(ivideo, 1); 5701 - SiS_SetReg(SISSR, 0x1b, 0x04); 5702 - sisfb_post_xgi_delay(ivideo, 1); 5703 - SiS_SetReg(SISSR, 0x1b, 0x00); 5704 - sisfb_post_xgi_delay(ivideo, 1); 5705 - v1 = 0x31; 5706 - if(ivideo->haveXGIROM) { 5707 - v1 = bios[0xf0]; 5708 - } 5709 - SiS_SetReg(SISSR, 0x18, v1); 5710 - SiS_SetReg(SISSR, 0x19, 0x06); 5711 - SiS_SetReg(SISSR, 0x16, 0x04); 5712 - SiS_SetReg(SISSR, 0x16, 0x84); 5713 - sisfb_post_xgi_delay(ivideo, 1); 5488 + sisfb_post_xgi_ddr2(ivideo, regb); 5714 5489 break; 5715 5490 default: 5716 5491 sisfb_post_xgi_setclocks(ivideo, regb); ··· 5765 5648 SiS_SetReg(SISSR, 0x14, bios[regb + 0xe0 + 8]); 5766 5649 5767 5650 } else { 5651 + int err; 5768 5652 5769 5653 /* Set default mode, don't clear screen */ 5770 5654 ivideo->SiS_Pr.SiS_UseOEM = false; ··· 5779 5661 5780 5662 /* Disable read-cache */ 5781 5663 SiS_SetRegAND(SISSR, 0x21, 0xdf); 5782 - sisfb_post_xgi_ramsize(ivideo); 5664 + err = sisfb_post_xgi_ramsize(ivideo); 5783 5665 /* Enable read-cache */ 5784 5666 SiS_SetRegOR(SISSR, 0x21, 0x20); 5785 5667 5668 + if (err) { 5669 + dev_err(&pdev->dev, 5670 + "%s: RAM size detection failed: %d\n", 5671 + __func__, err); 5672 + return 0; 5673 + } 5786 5674 } 5787 5675 5788 5676 #if 0 ··· 5901 5777 #endif 5902 5778 5903 5779 ivideo->chip = chipinfo->chip; 5780 + ivideo->chip_real_id = chipinfo->chip; 5904 5781 ivideo->sisvga_engine = chipinfo->vgaengine; 5905 5782 ivideo->hwcursor_size = chipinfo->hwcursor_size; 5906 5783 ivideo->CRT2_write_enable = chipinfo->CRT2_write_enable; ··· 6134 6009 if(ivideo->SiS_Pr.SiS_CustomT == CUT_NONE) { 6135 6010 sisfb_detect_custom_timing(ivideo); 6136 6011 } 6012 + 6013 + #ifdef CONFIG_FB_SIS_315 6014 + if (ivideo->chip == XGI_20) { 6015 + /* Check if our Z7 chip is actually Z9 */ 6016 + SiS_SetRegOR(SISCR, 0x4a, 0x40); /* GPIOG EN */ 6017 + reg = SiS_GetReg(SISCR, 0x48); 6018 + if (reg & 0x02) { /* GPIOG */ 6019 + ivideo->chip_real_id = XGI_21; 6020 + dev_info(&pdev->dev, "Z9 detected\n"); 6021 + } 6022 + } 6023 + #endif 6137 6024 6138 6025 /* POST card in case this has not been done by the BIOS */ 6139 6026 if( (!ivideo->sisvga_enabled)
+1
drivers/video/sis/vgatypes.h
··· 87 87 SIS_341, 88 88 SIS_342, 89 89 XGI_20 = 75, 90 + XGI_21, 90 91 XGI_40, 91 92 MAX_SIS_CHIP 92 93 } SIS_CHIP_TYPE;
+187 -88
drivers/video/sm501fb.c
··· 41 41 #include <linux/sm501.h> 42 42 #include <linux/sm501-regs.h> 43 43 44 + #include "edid.h" 45 + 46 + static char *fb_mode = "640x480-16@60"; 47 + static unsigned long default_bpp = 16; 48 + 49 + static struct fb_videomode __devinitdata sm501_default_mode = { 50 + .refresh = 60, 51 + .xres = 640, 52 + .yres = 480, 53 + .pixclock = 20833, 54 + .left_margin = 142, 55 + .right_margin = 13, 56 + .upper_margin = 21, 57 + .lower_margin = 1, 58 + .hsync_len = 69, 59 + .vsync_len = 3, 60 + .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 61 + .vmode = FB_VMODE_NONINTERLACED 62 + }; 63 + 44 64 #define NR_PALETTE 256 45 65 46 66 enum sm501_controller { ··· 97 77 void __iomem *regs2d; /* 2d remapped registers */ 98 78 void __iomem *fbmem; /* remapped framebuffer */ 99 79 size_t fbmem_len; /* length of remapped region */ 80 + u8 *edid_data; 100 81 }; 101 82 102 83 /* per-framebuffer private data */ ··· 138 117 139 118 static inline void sm501fb_sync_regs(struct sm501fb_info *info) 140 119 { 141 - readl(info->regs); 120 + smc501_readl(info->regs); 142 121 } 143 122 144 123 /* sm501_alloc_mem ··· 283 262 284 263 /* set gamma values */ 285 264 for (offset = 0; offset < 256 * 4; offset += 4) { 286 - writel(value, fbi->regs + palette + offset); 265 + smc501_writel(value, fbi->regs + palette + offset); 287 266 value += 0x010101; /* Advance RGB by 1,1,1.*/ 288 267 } 289 268 } ··· 497 476 498 477 /* set start of framebuffer to the screen */ 499 478 500 - writel(par->screen.sm_addr | SM501_ADDR_FLIP, fbi->regs + head_addr); 479 + smc501_writel(par->screen.sm_addr | SM501_ADDR_FLIP, 480 + fbi->regs + head_addr); 501 481 502 482 /* program CRT clock */ 503 483 ··· 541 519 reg = info->fix.line_length; 542 520 reg |= ((var->xres * var->bits_per_pixel)/8) << 16; 543 521 544 - writel(reg, fbi->regs + (par->head == HEAD_CRT ? 522 + smc501_writel(reg, fbi->regs + (par->head == HEAD_CRT ? 545 523 SM501_DC_CRT_FB_OFFSET : SM501_DC_PANEL_FB_OFFSET)); 546 524 547 525 /* program horizontal total */ ··· 549 527 reg = (h_total(var) - 1) << 16; 550 528 reg |= (var->xres - 1); 551 529 552 - writel(reg, base + SM501_OFF_DC_H_TOT); 530 + smc501_writel(reg, base + SM501_OFF_DC_H_TOT); 553 531 554 532 /* program horizontal sync */ 555 533 556 534 reg = var->hsync_len << 16; 557 535 reg |= var->xres + var->right_margin - 1; 558 536 559 - writel(reg, base + SM501_OFF_DC_H_SYNC); 537 + smc501_writel(reg, base + SM501_OFF_DC_H_SYNC); 560 538 561 539 /* program vertical total */ 562 540 563 541 reg = (v_total(var) - 1) << 16; 564 542 reg |= (var->yres - 1); 565 543 566 - writel(reg, base + SM501_OFF_DC_V_TOT); 544 + smc501_writel(reg, base + SM501_OFF_DC_V_TOT); 567 545 568 546 /* program vertical sync */ 569 547 reg = var->vsync_len << 16; 570 548 reg |= var->yres + var->lower_margin - 1; 571 549 572 - writel(reg, base + SM501_OFF_DC_V_SYNC); 550 + smc501_writel(reg, base + SM501_OFF_DC_V_SYNC); 573 551 } 574 552 575 553 /* sm501fb_pan_crt ··· 588 566 589 567 xoffs = var->xoffset * bytes_pixel; 590 568 591 - reg = readl(fbi->regs + SM501_DC_CRT_CONTROL); 569 + reg = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL); 592 570 593 571 reg &= ~SM501_DC_CRT_CONTROL_PIXEL_MASK; 594 572 reg |= ((xoffs & 15) / bytes_pixel) << 4; 595 - writel(reg, fbi->regs + SM501_DC_CRT_CONTROL); 573 + smc501_writel(reg, fbi->regs + SM501_DC_CRT_CONTROL); 596 574 597 575 reg = (par->screen.sm_addr + xoffs + 598 576 var->yoffset * info->fix.line_length); 599 - writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR); 577 + smc501_writel(reg | SM501_ADDR_FLIP, fbi->regs + SM501_DC_CRT_FB_ADDR); 600 578 601 579 sm501fb_sync_regs(fbi); 602 580 return 0; ··· 615 593 unsigned long reg; 616 594 617 595 reg = var->xoffset | (var->xres_virtual << 16); 618 - writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH); 596 + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_WIDTH); 619 597 620 598 reg = var->yoffset | (var->yres_virtual << 16); 621 - writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT); 599 + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_FB_HEIGHT); 622 600 623 601 sm501fb_sync_regs(fbi); 624 602 return 0; ··· 644 622 /* enable CRT DAC - note 0 is on!*/ 645 623 sm501_misc_control(fbi->dev->parent, 0, SM501_MISC_DAC_POWER); 646 624 647 - control = readl(fbi->regs + SM501_DC_CRT_CONTROL); 625 + control = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL); 648 626 649 627 control &= (SM501_DC_CRT_CONTROL_PIXEL_MASK | 650 628 SM501_DC_CRT_CONTROL_GAMMA | ··· 706 684 out_update: 707 685 dev_dbg(fbi->dev, "new control is %08lx\n", control); 708 686 709 - writel(control, fbi->regs + SM501_DC_CRT_CONTROL); 687 + smc501_writel(control, fbi->regs + SM501_DC_CRT_CONTROL); 710 688 sm501fb_sync_regs(fbi); 711 689 712 690 return 0; ··· 718 696 void __iomem *ctrl_reg = fbi->regs + SM501_DC_PANEL_CONTROL; 719 697 struct sm501_platdata_fbsub *pd = fbi->pdata->fb_pnl; 720 698 721 - control = readl(ctrl_reg); 699 + control = smc501_readl(ctrl_reg); 722 700 723 701 if (to && (control & SM501_DC_PANEL_CONTROL_VDD) == 0) { 724 702 /* enable panel power */ 725 703 726 704 control |= SM501_DC_PANEL_CONTROL_VDD; /* FPVDDEN */ 727 - writel(control, ctrl_reg); 705 + smc501_writel(control, ctrl_reg); 728 706 sm501fb_sync_regs(fbi); 729 707 mdelay(10); 730 708 731 709 control |= SM501_DC_PANEL_CONTROL_DATA; /* DATA */ 732 - writel(control, ctrl_reg); 710 + smc501_writel(control, ctrl_reg); 733 711 sm501fb_sync_regs(fbi); 734 712 mdelay(10); 735 713 ··· 741 719 else 742 720 control |= SM501_DC_PANEL_CONTROL_BIAS; 743 721 744 - writel(control, ctrl_reg); 722 + smc501_writel(control, ctrl_reg); 745 723 sm501fb_sync_regs(fbi); 746 724 mdelay(10); 747 725 } ··· 752 730 else 753 731 control |= SM501_DC_PANEL_CONTROL_FPEN; 754 732 755 - writel(control, ctrl_reg); 733 + smc501_writel(control, ctrl_reg); 756 734 sm501fb_sync_regs(fbi); 757 735 mdelay(10); 758 736 } ··· 764 742 else 765 743 control &= ~SM501_DC_PANEL_CONTROL_FPEN; 766 744 767 - writel(control, ctrl_reg); 745 + smc501_writel(control, ctrl_reg); 768 746 sm501fb_sync_regs(fbi); 769 747 mdelay(10); 770 748 } ··· 775 753 else 776 754 control &= ~SM501_DC_PANEL_CONTROL_BIAS; 777 755 778 - writel(control, ctrl_reg); 756 + smc501_writel(control, ctrl_reg); 779 757 sm501fb_sync_regs(fbi); 780 758 mdelay(10); 781 759 } 782 760 783 761 control &= ~SM501_DC_PANEL_CONTROL_DATA; 784 - writel(control, ctrl_reg); 762 + smc501_writel(control, ctrl_reg); 785 763 sm501fb_sync_regs(fbi); 786 764 mdelay(10); 787 765 788 766 control &= ~SM501_DC_PANEL_CONTROL_VDD; 789 - writel(control, ctrl_reg); 767 + smc501_writel(control, ctrl_reg); 790 768 sm501fb_sync_regs(fbi); 791 769 mdelay(10); 792 770 } ··· 821 799 822 800 /* update control register */ 823 801 824 - control = readl(fbi->regs + SM501_DC_PANEL_CONTROL); 802 + control = smc501_readl(fbi->regs + SM501_DC_PANEL_CONTROL); 825 803 control &= (SM501_DC_PANEL_CONTROL_GAMMA | 826 804 SM501_DC_PANEL_CONTROL_VDD | 827 805 SM501_DC_PANEL_CONTROL_DATA | ··· 855 833 BUG(); 856 834 } 857 835 858 - writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL); 836 + smc501_writel(0x0, fbi->regs + SM501_DC_PANEL_PANNING_CONTROL); 859 837 860 838 /* panel plane top left and bottom right location */ 861 839 862 - writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC); 840 + smc501_writel(0x00, fbi->regs + SM501_DC_PANEL_TL_LOC); 863 841 864 842 reg = var->xres - 1; 865 843 reg |= (var->yres - 1) << 16; 866 844 867 - writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC); 845 + smc501_writel(reg, fbi->regs + SM501_DC_PANEL_BR_LOC); 868 846 869 847 /* program panel control register */ 870 848 ··· 877 855 if ((var->sync & FB_SYNC_VERT_HIGH_ACT) == 0) 878 856 control |= SM501_DC_PANEL_CONTROL_VSP; 879 857 880 - writel(control, fbi->regs + SM501_DC_PANEL_CONTROL); 858 + smc501_writel(control, fbi->regs + SM501_DC_PANEL_CONTROL); 881 859 sm501fb_sync_regs(fbi); 882 860 883 861 /* ensure the panel interface is not tristated at this point */ ··· 946 924 val |= (green >> 8) << 8; 947 925 val |= blue >> 8; 948 926 949 - writel(val, base + (regno * 4)); 927 + smc501_writel(val, base + (regno * 4)); 950 928 } 951 929 952 930 break; ··· 1002 980 1003 981 dev_dbg(fbi->dev, "%s(mode=%d, %p)\n", __func__, blank_mode, info); 1004 982 1005 - ctrl = readl(fbi->regs + SM501_DC_CRT_CONTROL); 983 + ctrl = smc501_readl(fbi->regs + SM501_DC_CRT_CONTROL); 1006 984 1007 985 switch (blank_mode) { 1008 986 case FB_BLANK_POWERDOWN: ··· 1026 1004 1027 1005 } 1028 1006 1029 - writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL); 1007 + smc501_writel(ctrl, fbi->regs + SM501_DC_CRT_CONTROL); 1030 1008 sm501fb_sync_regs(fbi); 1031 1009 1032 1010 return 0; ··· 1063 1041 if (cursor->image.depth > 1) 1064 1042 return -EINVAL; 1065 1043 1066 - hwc_addr = readl(base + SM501_OFF_HWC_ADDR); 1044 + hwc_addr = smc501_readl(base + SM501_OFF_HWC_ADDR); 1067 1045 1068 1046 if (cursor->enable) 1069 - writel(hwc_addr | SM501_HWC_EN, base + SM501_OFF_HWC_ADDR); 1047 + smc501_writel(hwc_addr | SM501_HWC_EN, 1048 + base + SM501_OFF_HWC_ADDR); 1070 1049 else 1071 - writel(hwc_addr & ~SM501_HWC_EN, base + SM501_OFF_HWC_ADDR); 1050 + smc501_writel(hwc_addr & ~SM501_HWC_EN, 1051 + base + SM501_OFF_HWC_ADDR); 1072 1052 1073 1053 /* set data */ 1074 1054 if (cursor->set & FB_CUR_SETPOS) { ··· 1084 1060 1085 1061 //y += cursor->image.height; 1086 1062 1087 - writel(x | (y << 16), base + SM501_OFF_HWC_LOC); 1063 + smc501_writel(x | (y << 16), base + SM501_OFF_HWC_LOC); 1088 1064 } 1089 1065 1090 1066 if (cursor->set & FB_CUR_SETCMAP) { ··· 1104 1080 1105 1081 dev_dbg(fbi->dev, "fgcol %08lx, bgcol %08lx\n", fg, bg); 1106 1082 1107 - writel(bg, base + SM501_OFF_HWC_COLOR_1_2); 1108 - writel(fg, base + SM501_OFF_HWC_COLOR_3); 1083 + smc501_writel(bg, base + SM501_OFF_HWC_COLOR_1_2); 1084 + smc501_writel(fg, base + SM501_OFF_HWC_COLOR_3); 1109 1085 } 1110 1086 1111 1087 if (cursor->set & FB_CUR_SETSIZE || ··· 1126 1102 __func__, cursor->image.width, cursor->image.height); 1127 1103 1128 1104 for (op = 0; op < (64*64*2)/8; op+=4) 1129 - writel(0x0, dst + op); 1105 + smc501_writel(0x0, dst + op); 1130 1106 1131 1107 for (y = 0; y < cursor->image.height; y++) { 1132 1108 for (x = 0; x < cursor->image.width; x++) { ··· 1165 1141 struct sm501fb_info *info = dev_get_drvdata(dev); 1166 1142 unsigned long ctrl; 1167 1143 1168 - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL); 1144 + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL); 1169 1145 ctrl &= SM501_DC_CRT_CONTROL_SEL; 1170 1146 1171 1147 return snprintf(buf, PAGE_SIZE, "%s\n", ctrl ? "crt" : "panel"); ··· 1196 1172 1197 1173 dev_info(dev, "setting crt source to head %d\n", head); 1198 1174 1199 - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL); 1175 + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL); 1200 1176 1201 1177 if (head == HEAD_CRT) { 1202 1178 ctrl |= SM501_DC_CRT_CONTROL_SEL; ··· 1208 1184 ctrl &= ~SM501_DC_CRT_CONTROL_TE; 1209 1185 } 1210 1186 1211 - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1187 + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1212 1188 sm501fb_sync_regs(info); 1213 1189 1214 1190 return len; ··· 1229 1205 unsigned int reg; 1230 1206 1231 1207 for (reg = start; reg < (len + start); reg += 4) 1232 - ptr += sprintf(ptr, "%08x = %08x\n", reg, readl(mem + reg)); 1208 + ptr += sprintf(ptr, "%08x = %08x\n", reg, 1209 + smc501_readl(mem + reg)); 1233 1210 1234 1211 return ptr - buf; 1235 1212 } ··· 1282 1257 1283 1258 /* wait for the 2d engine to be ready */ 1284 1259 while ((count > 0) && 1285 - (readl(fbi->regs + SM501_SYSTEM_CONTROL) & 1260 + (smc501_readl(fbi->regs + SM501_SYSTEM_CONTROL) & 1286 1261 SM501_SYSCTRL_2D_ENGINE_STATUS) != 0) 1287 1262 count--; 1288 1263 ··· 1337 1312 return; 1338 1313 1339 1314 /* set the base addresses */ 1340 - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE); 1341 - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE); 1315 + smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE); 1316 + smc501_writel(par->screen.sm_addr, 1317 + fbi->regs2d + SM501_2D_DESTINATION_BASE); 1342 1318 1343 1319 /* set the window width */ 1344 - writel((info->var.xres << 16) | info->var.xres, 1320 + smc501_writel((info->var.xres << 16) | info->var.xres, 1345 1321 fbi->regs2d + SM501_2D_WINDOW_WIDTH); 1346 1322 1347 1323 /* set window stride */ 1348 - writel((info->var.xres_virtual << 16) | info->var.xres_virtual, 1324 + smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual, 1349 1325 fbi->regs2d + SM501_2D_PITCH); 1350 1326 1351 1327 /* set data format */ 1352 1328 switch (info->var.bits_per_pixel) { 1353 1329 case 8: 1354 - writel(0, fbi->regs2d + SM501_2D_STRETCH); 1330 + smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH); 1355 1331 break; 1356 1332 case 16: 1357 - writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH); 1333 + smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH); 1358 1334 break; 1359 1335 case 32: 1360 - writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH); 1336 + smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH); 1361 1337 break; 1362 1338 } 1363 1339 1364 1340 /* 2d compare mask */ 1365 - writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK); 1341 + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK); 1366 1342 1367 1343 /* 2d mask */ 1368 - writel(0xffffffff, fbi->regs2d + SM501_2D_MASK); 1344 + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK); 1369 1345 1370 1346 /* source and destination x y */ 1371 - writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE); 1372 - writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION); 1347 + smc501_writel((sx << 16) | sy, fbi->regs2d + SM501_2D_SOURCE); 1348 + smc501_writel((dx << 16) | dy, fbi->regs2d + SM501_2D_DESTINATION); 1373 1349 1374 1350 /* w/h */ 1375 - writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION); 1351 + smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION); 1376 1352 1377 1353 /* do area move */ 1378 - writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL); 1354 + smc501_writel(0x800000cc | rtl, fbi->regs2d + SM501_2D_CONTROL); 1379 1355 } 1380 1356 1381 1357 static void sm501fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) ··· 1398 1372 return; 1399 1373 1400 1374 /* set the base addresses */ 1401 - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE); 1402 - writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_DESTINATION_BASE); 1375 + smc501_writel(par->screen.sm_addr, fbi->regs2d + SM501_2D_SOURCE_BASE); 1376 + smc501_writel(par->screen.sm_addr, 1377 + fbi->regs2d + SM501_2D_DESTINATION_BASE); 1403 1378 1404 1379 /* set the window width */ 1405 - writel((info->var.xres << 16) | info->var.xres, 1380 + smc501_writel((info->var.xres << 16) | info->var.xres, 1406 1381 fbi->regs2d + SM501_2D_WINDOW_WIDTH); 1407 1382 1408 1383 /* set window stride */ 1409 - writel((info->var.xres_virtual << 16) | info->var.xres_virtual, 1384 + smc501_writel((info->var.xres_virtual << 16) | info->var.xres_virtual, 1410 1385 fbi->regs2d + SM501_2D_PITCH); 1411 1386 1412 1387 /* set data format */ 1413 1388 switch (info->var.bits_per_pixel) { 1414 1389 case 8: 1415 - writel(0, fbi->regs2d + SM501_2D_STRETCH); 1390 + smc501_writel(0, fbi->regs2d + SM501_2D_STRETCH); 1416 1391 break; 1417 1392 case 16: 1418 - writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH); 1393 + smc501_writel(0x00100000, fbi->regs2d + SM501_2D_STRETCH); 1419 1394 break; 1420 1395 case 32: 1421 - writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH); 1396 + smc501_writel(0x00200000, fbi->regs2d + SM501_2D_STRETCH); 1422 1397 break; 1423 1398 } 1424 1399 1425 1400 /* 2d compare mask */ 1426 - writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK); 1401 + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_COLOR_COMPARE_MASK); 1427 1402 1428 1403 /* 2d mask */ 1429 - writel(0xffffffff, fbi->regs2d + SM501_2D_MASK); 1404 + smc501_writel(0xffffffff, fbi->regs2d + SM501_2D_MASK); 1430 1405 1431 1406 /* colour */ 1432 - writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND); 1407 + smc501_writel(rect->color, fbi->regs2d + SM501_2D_FOREGROUND); 1433 1408 1434 1409 /* x y */ 1435 - writel((rect->dx << 16) | rect->dy, fbi->regs2d + SM501_2D_DESTINATION); 1410 + smc501_writel((rect->dx << 16) | rect->dy, 1411 + fbi->regs2d + SM501_2D_DESTINATION); 1436 1412 1437 1413 /* w/h */ 1438 - writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION); 1414 + smc501_writel((width << 16) | height, fbi->regs2d + SM501_2D_DIMENSION); 1439 1415 1440 1416 /* do rectangle fill */ 1441 - writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL); 1417 + smc501_writel(0x800100cc, fbi->regs2d + SM501_2D_CONTROL); 1442 1418 } 1443 1419 1444 1420 ··· 1498 1470 1499 1471 /* initialise the colour registers */ 1500 1472 1501 - writel(par->cursor.sm_addr, par->cursor_regs + SM501_OFF_HWC_ADDR); 1473 + smc501_writel(par->cursor.sm_addr, 1474 + par->cursor_regs + SM501_OFF_HWC_ADDR); 1502 1475 1503 - writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC); 1504 - writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2); 1505 - writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3); 1476 + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_LOC); 1477 + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_1_2); 1478 + smc501_writel(0x00, par->cursor_regs + SM501_OFF_HWC_COLOR_3); 1506 1479 sm501fb_sync_regs(info); 1507 1480 1508 1481 return 0; ··· 1610 1581 1611 1582 /* clear palette ram - undefined at power on */ 1612 1583 for (k = 0; k < (256 * 3); k++) 1613 - writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4)); 1584 + smc501_writel(0, info->regs + SM501_DC_PANEL_PALETTE + (k * 4)); 1614 1585 1615 1586 /* enable display controller */ 1616 1587 sm501_unit_power(dev->parent, SM501_GATE_DISPLAY, 1); ··· 1678 1649 switch (head) { 1679 1650 case HEAD_CRT: 1680 1651 pd = info->pdata->fb_crt; 1681 - ctrl = readl(info->regs + SM501_DC_CRT_CONTROL); 1652 + ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL); 1682 1653 enable = (ctrl & SM501_DC_CRT_CONTROL_ENABLE) ? 1 : 0; 1683 1654 1684 1655 /* ensure we set the correct source register */ 1685 1656 if (info->pdata->fb_route != SM501_FB_CRT_PANEL) { 1686 1657 ctrl |= SM501_DC_CRT_CONTROL_SEL; 1687 - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1658 + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1688 1659 } 1689 1660 1690 1661 break; 1691 1662 1692 1663 case HEAD_PANEL: 1693 1664 pd = info->pdata->fb_pnl; 1694 - ctrl = readl(info->regs + SM501_DC_PANEL_CONTROL); 1665 + ctrl = smc501_readl(info->regs + SM501_DC_PANEL_CONTROL); 1695 1666 enable = (ctrl & SM501_DC_PANEL_CONTROL_EN) ? 1 : 0; 1696 1667 break; 1697 1668 ··· 1709 1680 1710 1681 if (head == HEAD_CRT && info->pdata->fb_route == SM501_FB_CRT_PANEL) { 1711 1682 ctrl &= ~SM501_DC_CRT_CONTROL_SEL; 1712 - writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1683 + smc501_writel(ctrl, info->regs + SM501_DC_CRT_CONTROL); 1713 1684 enable = 0; 1714 1685 } 1715 1686 ··· 1729 1700 FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT | 1730 1701 FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN; 1731 1702 1703 + #if defined(CONFIG_OF) 1704 + #ifdef __BIG_ENDIAN 1705 + if (of_get_property(info->dev->parent->of_node, "little-endian", NULL)) 1706 + fb->flags |= FBINFO_FOREIGN_ENDIAN; 1707 + #else 1708 + if (of_get_property(info->dev->parent->of_node, "big-endian", NULL)) 1709 + fb->flags |= FBINFO_FOREIGN_ENDIAN; 1710 + #endif 1711 + #endif 1732 1712 /* fixed data */ 1733 1713 1734 1714 fb->fix.type = FB_TYPE_PACKED_PIXELS; ··· 1755 1717 fb->var.vmode = FB_VMODE_NONINTERLACED; 1756 1718 fb->var.bits_per_pixel = 16; 1757 1719 1720 + if (info->edid_data) { 1721 + /* Now build modedb from EDID */ 1722 + fb_edid_to_monspecs(info->edid_data, &fb->monspecs); 1723 + fb_videomode_to_modelist(fb->monspecs.modedb, 1724 + fb->monspecs.modedb_len, 1725 + &fb->modelist); 1726 + } 1727 + 1758 1728 if (enable && (pd->flags & SM501FB_FLAG_USE_INIT_MODE) && 0) { 1759 1729 /* TODO read the mode from the current display */ 1760 - 1761 1730 } else { 1762 1731 if (pd->def_mode) { 1763 1732 dev_info(info->dev, "using supplied mode\n"); ··· 1774 1729 fb->var.xres_virtual = fb->var.xres; 1775 1730 fb->var.yres_virtual = fb->var.yres; 1776 1731 } else { 1777 - ret = fb_find_mode(&fb->var, fb, 1732 + if (info->edid_data) { 1733 + ret = fb_find_mode(&fb->var, fb, fb_mode, 1734 + fb->monspecs.modedb, 1735 + fb->monspecs.modedb_len, 1736 + &sm501_default_mode, default_bpp); 1737 + /* edid_data is no longer needed, free it */ 1738 + kfree(info->edid_data); 1739 + } else { 1740 + ret = fb_find_mode(&fb->var, fb, 1778 1741 NULL, NULL, 0, NULL, 8); 1742 + } 1779 1743 1780 - if (ret == 0 || ret == 4) { 1781 - dev_err(info->dev, 1782 - "failed to get initial mode\n"); 1744 + switch (ret) { 1745 + case 1: 1746 + dev_info(info->dev, "using mode specified in " 1747 + "@mode\n"); 1748 + break; 1749 + case 2: 1750 + dev_info(info->dev, "using mode specified in " 1751 + "@mode with ignored refresh rate\n"); 1752 + break; 1753 + case 3: 1754 + dev_info(info->dev, "using mode default " 1755 + "mode\n"); 1756 + break; 1757 + case 4: 1758 + dev_info(info->dev, "using mode from list\n"); 1759 + break; 1760 + default: 1761 + dev_info(info->dev, "ret = %d\n", ret); 1762 + dev_info(info->dev, "failed to find mode\n"); 1783 1763 return -EINVAL; 1784 1764 } 1785 1765 } ··· 1945 1875 } 1946 1876 1947 1877 if (info->pdata == NULL) { 1948 - dev_info(dev, "using default configuration data\n"); 1878 + int found = 0; 1879 + #if defined(CONFIG_OF) 1880 + struct device_node *np = pdev->dev.parent->of_node; 1881 + const u8 *prop; 1882 + const char *cp; 1883 + int len; 1884 + 1949 1885 info->pdata = &sm501fb_def_pdata; 1886 + if (np) { 1887 + /* Get EDID */ 1888 + cp = of_get_property(np, "mode", &len); 1889 + if (cp) 1890 + strcpy(fb_mode, cp); 1891 + prop = of_get_property(np, "edid", &len); 1892 + if (prop && len == EDID_LENGTH) { 1893 + info->edid_data = kmemdup(prop, EDID_LENGTH, 1894 + GFP_KERNEL); 1895 + if (info->edid_data) 1896 + found = 1; 1897 + } 1898 + } 1899 + #endif 1900 + if (!found) { 1901 + dev_info(dev, "using default configuration data\n"); 1902 + info->pdata = &sm501fb_def_pdata; 1903 + } 1950 1904 } 1951 1905 1952 1906 /* probe for the presence of each panel */ ··· 2179 2085 struct sm501fb_info *info = platform_get_drvdata(pdev); 2180 2086 2181 2087 /* store crt control to resume with */ 2182 - info->pm_crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL); 2088 + info->pm_crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL); 2183 2089 2184 2090 sm501fb_suspend_fb(info, HEAD_CRT); 2185 2091 sm501fb_suspend_fb(info, HEAD_PANEL); ··· 2203 2109 2204 2110 /* restore the items we want to be saved for crt control */ 2205 2111 2206 - crt_ctrl = readl(info->regs + SM501_DC_CRT_CONTROL); 2112 + crt_ctrl = smc501_readl(info->regs + SM501_DC_CRT_CONTROL); 2207 2113 crt_ctrl &= ~SM501_CRT_CTRL_SAVE; 2208 2114 crt_ctrl |= info->pm_crt_ctrl & SM501_CRT_CTRL_SAVE; 2209 - writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL); 2115 + smc501_writel(crt_ctrl, info->regs + SM501_DC_CRT_CONTROL); 2210 2116 2211 2117 sm501fb_resume_fb(info, HEAD_CRT); 2212 2118 sm501fb_resume_fb(info, HEAD_PANEL); ··· 2243 2149 module_init(sm501fb_init); 2244 2150 module_exit(sm501fb_cleanup); 2245 2151 2152 + module_param_named(mode, fb_mode, charp, 0); 2153 + MODULE_PARM_DESC(mode, 2154 + "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); 2155 + module_param_named(bpp, default_bpp, ulong, 0); 2156 + MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode"); 2246 2157 MODULE_AUTHOR("Ben Dooks, Vincent Sanders"); 2247 2158 MODULE_DESCRIPTION("SM501 Framebuffer driver"); 2248 2159 MODULE_LICENSE("GPL v2");
+88 -87
drivers/video/svgalib.c
··· 20 20 21 21 22 22 /* Write a CRT register value spread across multiple registers */ 23 - void svga_wcrt_multi(const struct vga_regset *regset, u32 value) { 24 - 23 + void svga_wcrt_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value) 24 + { 25 25 u8 regval, bitval, bitnum; 26 26 27 27 while (regset->regnum != VGA_REGSET_END_VAL) { 28 - regval = vga_rcrt(NULL, regset->regnum); 28 + regval = vga_rcrt(regbase, regset->regnum); 29 29 bitnum = regset->lowbit; 30 30 while (bitnum <= regset->highbit) { 31 31 bitval = 1 << bitnum; ··· 34 34 bitnum ++; 35 35 value = value >> 1; 36 36 } 37 - vga_wcrt(NULL, regset->regnum, regval); 37 + vga_wcrt(regbase, regset->regnum, regval); 38 38 regset ++; 39 39 } 40 40 } 41 41 42 42 /* Write a sequencer register value spread across multiple registers */ 43 - void svga_wseq_multi(const struct vga_regset *regset, u32 value) { 44 - 43 + void svga_wseq_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value) 44 + { 45 45 u8 regval, bitval, bitnum; 46 46 47 47 while (regset->regnum != VGA_REGSET_END_VAL) { 48 - regval = vga_rseq(NULL, regset->regnum); 48 + regval = vga_rseq(regbase, regset->regnum); 49 49 bitnum = regset->lowbit; 50 50 while (bitnum <= regset->highbit) { 51 51 bitval = 1 << bitnum; ··· 54 54 bitnum ++; 55 55 value = value >> 1; 56 56 } 57 - vga_wseq(NULL, regset->regnum, regval); 57 + vga_wseq(regbase, regset->regnum, regval); 58 58 regset ++; 59 59 } 60 60 } ··· 75 75 76 76 77 77 /* Set graphics controller registers to sane values */ 78 - void svga_set_default_gfx_regs(void) 78 + void svga_set_default_gfx_regs(void __iomem *regbase) 79 79 { 80 80 /* All standard GFX registers (GR00 - GR08) */ 81 - vga_wgfx(NULL, VGA_GFX_SR_VALUE, 0x00); 82 - vga_wgfx(NULL, VGA_GFX_SR_ENABLE, 0x00); 83 - vga_wgfx(NULL, VGA_GFX_COMPARE_VALUE, 0x00); 84 - vga_wgfx(NULL, VGA_GFX_DATA_ROTATE, 0x00); 85 - vga_wgfx(NULL, VGA_GFX_PLANE_READ, 0x00); 86 - vga_wgfx(NULL, VGA_GFX_MODE, 0x00); 87 - /* vga_wgfx(NULL, VGA_GFX_MODE, 0x20); */ 88 - /* vga_wgfx(NULL, VGA_GFX_MODE, 0x40); */ 89 - vga_wgfx(NULL, VGA_GFX_MISC, 0x05); 90 - /* vga_wgfx(NULL, VGA_GFX_MISC, 0x01); */ 91 - vga_wgfx(NULL, VGA_GFX_COMPARE_MASK, 0x0F); 92 - vga_wgfx(NULL, VGA_GFX_BIT_MASK, 0xFF); 81 + vga_wgfx(regbase, VGA_GFX_SR_VALUE, 0x00); 82 + vga_wgfx(regbase, VGA_GFX_SR_ENABLE, 0x00); 83 + vga_wgfx(regbase, VGA_GFX_COMPARE_VALUE, 0x00); 84 + vga_wgfx(regbase, VGA_GFX_DATA_ROTATE, 0x00); 85 + vga_wgfx(regbase, VGA_GFX_PLANE_READ, 0x00); 86 + vga_wgfx(regbase, VGA_GFX_MODE, 0x00); 87 + /* vga_wgfx(regbase, VGA_GFX_MODE, 0x20); */ 88 + /* vga_wgfx(regbase, VGA_GFX_MODE, 0x40); */ 89 + vga_wgfx(regbase, VGA_GFX_MISC, 0x05); 90 + /* vga_wgfx(regbase, VGA_GFX_MISC, 0x01); */ 91 + vga_wgfx(regbase, VGA_GFX_COMPARE_MASK, 0x0F); 92 + vga_wgfx(regbase, VGA_GFX_BIT_MASK, 0xFF); 93 93 } 94 94 95 95 /* Set attribute controller registers to sane values */ 96 - void svga_set_default_atc_regs(void) 96 + void svga_set_default_atc_regs(void __iomem *regbase) 97 97 { 98 98 u8 count; 99 99 100 - vga_r(NULL, 0x3DA); 101 - vga_w(NULL, VGA_ATT_W, 0x00); 100 + vga_r(regbase, 0x3DA); 101 + vga_w(regbase, VGA_ATT_W, 0x00); 102 102 103 103 /* All standard ATC registers (AR00 - AR14) */ 104 104 for (count = 0; count <= 0xF; count ++) 105 - svga_wattr(count, count); 105 + svga_wattr(regbase, count, count); 106 106 107 - svga_wattr(VGA_ATC_MODE, 0x01); 108 - /* svga_wattr(VGA_ATC_MODE, 0x41); */ 109 - svga_wattr(VGA_ATC_OVERSCAN, 0x00); 110 - svga_wattr(VGA_ATC_PLANE_ENABLE, 0x0F); 111 - svga_wattr(VGA_ATC_PEL, 0x00); 112 - svga_wattr(VGA_ATC_COLOR_PAGE, 0x00); 107 + svga_wattr(regbase, VGA_ATC_MODE, 0x01); 108 + /* svga_wattr(regbase, VGA_ATC_MODE, 0x41); */ 109 + svga_wattr(regbase, VGA_ATC_OVERSCAN, 0x00); 110 + svga_wattr(regbase, VGA_ATC_PLANE_ENABLE, 0x0F); 111 + svga_wattr(regbase, VGA_ATC_PEL, 0x00); 112 + svga_wattr(regbase, VGA_ATC_COLOR_PAGE, 0x00); 113 113 114 - vga_r(NULL, 0x3DA); 115 - vga_w(NULL, VGA_ATT_W, 0x20); 114 + vga_r(regbase, 0x3DA); 115 + vga_w(regbase, VGA_ATT_W, 0x20); 116 116 } 117 117 118 118 /* Set sequencer registers to sane values */ 119 - void svga_set_default_seq_regs(void) 119 + void svga_set_default_seq_regs(void __iomem *regbase) 120 120 { 121 121 /* Standard sequencer registers (SR01 - SR04), SR00 is not set */ 122 - vga_wseq(NULL, VGA_SEQ_CLOCK_MODE, VGA_SR01_CHAR_CLK_8DOTS); 123 - vga_wseq(NULL, VGA_SEQ_PLANE_WRITE, VGA_SR02_ALL_PLANES); 124 - vga_wseq(NULL, VGA_SEQ_CHARACTER_MAP, 0x00); 125 - /* vga_wseq(NULL, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE | VGA_SR04_CHN_4M); */ 126 - vga_wseq(NULL, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE); 122 + vga_wseq(regbase, VGA_SEQ_CLOCK_MODE, VGA_SR01_CHAR_CLK_8DOTS); 123 + vga_wseq(regbase, VGA_SEQ_PLANE_WRITE, VGA_SR02_ALL_PLANES); 124 + vga_wseq(regbase, VGA_SEQ_CHARACTER_MAP, 0x00); 125 + /* vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE | VGA_SR04_CHN_4M); */ 126 + vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE); 127 127 } 128 128 129 129 /* Set CRTC registers to sane values */ 130 - void svga_set_default_crt_regs(void) 130 + void svga_set_default_crt_regs(void __iomem *regbase) 131 131 { 132 132 /* Standard CRT registers CR03 CR08 CR09 CR14 CR17 */ 133 - svga_wcrt_mask(0x03, 0x80, 0x80); /* Enable vertical retrace EVRA */ 134 - vga_wcrt(NULL, VGA_CRTC_PRESET_ROW, 0); 135 - svga_wcrt_mask(VGA_CRTC_MAX_SCAN, 0, 0x1F); 136 - vga_wcrt(NULL, VGA_CRTC_UNDERLINE, 0); 137 - vga_wcrt(NULL, VGA_CRTC_MODE, 0xE3); 133 + svga_wcrt_mask(regbase, 0x03, 0x80, 0x80); /* Enable vertical retrace EVRA */ 134 + vga_wcrt(regbase, VGA_CRTC_PRESET_ROW, 0); 135 + svga_wcrt_mask(regbase, VGA_CRTC_MAX_SCAN, 0, 0x1F); 136 + vga_wcrt(regbase, VGA_CRTC_UNDERLINE, 0); 137 + vga_wcrt(regbase, VGA_CRTC_MODE, 0xE3); 138 138 } 139 139 140 - void svga_set_textmode_vga_regs(void) 140 + void svga_set_textmode_vga_regs(void __iomem *regbase) 141 141 { 142 - /* svga_wseq_mask(0x1, 0x00, 0x01); */ /* Switch 8/9 pixel per char */ 143 - vga_wseq(NULL, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM); 144 - vga_wseq(NULL, VGA_SEQ_PLANE_WRITE, 0x03); 142 + /* svga_wseq_mask(regbase, 0x1, 0x00, 0x01); */ /* Switch 8/9 pixel per char */ 143 + vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM); 144 + vga_wseq(regbase, VGA_SEQ_PLANE_WRITE, 0x03); 145 145 146 - vga_wcrt(NULL, VGA_CRTC_MAX_SCAN, 0x0f); /* 0x4f */ 147 - vga_wcrt(NULL, VGA_CRTC_UNDERLINE, 0x1f); 148 - svga_wcrt_mask(VGA_CRTC_MODE, 0x23, 0x7f); 146 + vga_wcrt(regbase, VGA_CRTC_MAX_SCAN, 0x0f); /* 0x4f */ 147 + vga_wcrt(regbase, VGA_CRTC_UNDERLINE, 0x1f); 148 + svga_wcrt_mask(regbase, VGA_CRTC_MODE, 0x23, 0x7f); 149 149 150 - vga_wcrt(NULL, VGA_CRTC_CURSOR_START, 0x0d); 151 - vga_wcrt(NULL, VGA_CRTC_CURSOR_END, 0x0e); 152 - vga_wcrt(NULL, VGA_CRTC_CURSOR_HI, 0x00); 153 - vga_wcrt(NULL, VGA_CRTC_CURSOR_LO, 0x00); 150 + vga_wcrt(regbase, VGA_CRTC_CURSOR_START, 0x0d); 151 + vga_wcrt(regbase, VGA_CRTC_CURSOR_END, 0x0e); 152 + vga_wcrt(regbase, VGA_CRTC_CURSOR_HI, 0x00); 153 + vga_wcrt(regbase, VGA_CRTC_CURSOR_LO, 0x00); 154 154 155 - vga_wgfx(NULL, VGA_GFX_MODE, 0x10); /* Odd/even memory mode */ 156 - vga_wgfx(NULL, VGA_GFX_MISC, 0x0E); /* Misc graphics register - text mode enable */ 157 - vga_wgfx(NULL, VGA_GFX_COMPARE_MASK, 0x00); 155 + vga_wgfx(regbase, VGA_GFX_MODE, 0x10); /* Odd/even memory mode */ 156 + vga_wgfx(regbase, VGA_GFX_MISC, 0x0E); /* Misc graphics register - text mode enable */ 157 + vga_wgfx(regbase, VGA_GFX_COMPARE_MASK, 0x00); 158 158 159 - vga_r(NULL, 0x3DA); 160 - vga_w(NULL, VGA_ATT_W, 0x00); 159 + vga_r(regbase, 0x3DA); 160 + vga_w(regbase, VGA_ATT_W, 0x00); 161 161 162 - svga_wattr(0x10, 0x0C); /* Attribute Mode Control Register - text mode, blinking and line graphics */ 163 - svga_wattr(0x13, 0x08); /* Horizontal Pixel Panning Register */ 162 + svga_wattr(regbase, 0x10, 0x0C); /* Attribute Mode Control Register - text mode, blinking and line graphics */ 163 + svga_wattr(regbase, 0x13, 0x08); /* Horizontal Pixel Panning Register */ 164 164 165 - vga_r(NULL, 0x3DA); 166 - vga_w(NULL, VGA_ATT_W, 0x20); 165 + vga_r(regbase, 0x3DA); 166 + vga_w(regbase, VGA_ATT_W, 0x20); 167 167 } 168 168 169 169 #if 0 ··· 299 299 } 300 300 301 301 /* Set cursor in text (tileblit) mode */ 302 - void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor) 302 + void svga_tilecursor(void __iomem *regbase, struct fb_info *info, struct fb_tilecursor *cursor) 303 303 { 304 304 u8 cs = 0x0d; 305 305 u8 ce = 0x0e; ··· 310 310 if (! cursor -> mode) 311 311 return; 312 312 313 - svga_wcrt_mask(0x0A, 0x20, 0x20); /* disable cursor */ 313 + svga_wcrt_mask(regbase, 0x0A, 0x20, 0x20); /* disable cursor */ 314 314 315 315 if (cursor -> shape == FB_TILE_CURSOR_NONE) 316 316 return; ··· 334 334 } 335 335 336 336 /* set cursor position */ 337 - vga_wcrt(NULL, 0x0E, pos >> 8); 338 - vga_wcrt(NULL, 0x0F, pos & 0xFF); 337 + vga_wcrt(regbase, 0x0E, pos >> 8); 338 + vga_wcrt(regbase, 0x0F, pos & 0xFF); 339 339 340 - vga_wcrt(NULL, 0x0B, ce); /* set cursor end */ 341 - vga_wcrt(NULL, 0x0A, cs); /* set cursor start and enable it */ 340 + vga_wcrt(regbase, 0x0B, ce); /* set cursor end */ 341 + vga_wcrt(regbase, 0x0A, cs); /* set cursor start and enable it */ 342 342 } 343 343 344 344 int svga_get_tilemax(struct fb_info *info) ··· 507 507 } 508 508 509 509 /* Set CRT timing registers */ 510 - void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, 511 - u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node) 510 + void svga_set_timings(void __iomem *regbase, const struct svga_timing_regs *tm, 511 + struct fb_var_screeninfo *var, 512 + u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node) 512 513 { 513 514 u8 regval; 514 515 u32 value; ··· 517 516 value = var->xres + var->left_margin + var->right_margin + var->hsync_len; 518 517 value = (value * hmul) / hdiv; 519 518 pr_debug("fb%d: horizontal total : %d\n", node, value); 520 - svga_wcrt_multi(tm->h_total_regs, (value / 8) - 5); 519 + svga_wcrt_multi(regbase, tm->h_total_regs, (value / 8) - 5); 521 520 522 521 value = var->xres; 523 522 value = (value * hmul) / hdiv; 524 523 pr_debug("fb%d: horizontal display : %d\n", node, value); 525 - svga_wcrt_multi(tm->h_display_regs, (value / 8) - 1); 524 + svga_wcrt_multi(regbase, tm->h_display_regs, (value / 8) - 1); 526 525 527 526 value = var->xres; 528 527 value = (value * hmul) / hdiv; 529 528 pr_debug("fb%d: horizontal blank start: %d\n", node, value); 530 - svga_wcrt_multi(tm->h_blank_start_regs, (value / 8) - 1 + hborder); 529 + svga_wcrt_multi(regbase, tm->h_blank_start_regs, (value / 8) - 1 + hborder); 531 530 532 531 value = var->xres + var->left_margin + var->right_margin + var->hsync_len; 533 532 value = (value * hmul) / hdiv; 534 533 pr_debug("fb%d: horizontal blank end : %d\n", node, value); 535 - svga_wcrt_multi(tm->h_blank_end_regs, (value / 8) - 1 - hborder); 534 + svga_wcrt_multi(regbase, tm->h_blank_end_regs, (value / 8) - 1 - hborder); 536 535 537 536 value = var->xres + var->right_margin; 538 537 value = (value * hmul) / hdiv; 539 538 pr_debug("fb%d: horizontal sync start : %d\n", node, value); 540 - svga_wcrt_multi(tm->h_sync_start_regs, (value / 8)); 539 + svga_wcrt_multi(regbase, tm->h_sync_start_regs, (value / 8)); 541 540 542 541 value = var->xres + var->right_margin + var->hsync_len; 543 542 value = (value * hmul) / hdiv; 544 543 pr_debug("fb%d: horizontal sync end : %d\n", node, value); 545 - svga_wcrt_multi(tm->h_sync_end_regs, (value / 8)); 544 + svga_wcrt_multi(regbase, tm->h_sync_end_regs, (value / 8)); 546 545 547 546 value = var->yres + var->upper_margin + var->lower_margin + var->vsync_len; 548 547 value = (value * vmul) / vdiv; 549 548 pr_debug("fb%d: vertical total : %d\n", node, value); 550 - svga_wcrt_multi(tm->v_total_regs, value - 2); 549 + svga_wcrt_multi(regbase, tm->v_total_regs, value - 2); 551 550 552 551 value = var->yres; 553 552 value = (value * vmul) / vdiv; 554 553 pr_debug("fb%d: vertical display : %d\n", node, value); 555 - svga_wcrt_multi(tm->v_display_regs, value - 1); 554 + svga_wcrt_multi(regbase, tm->v_display_regs, value - 1); 556 555 557 556 value = var->yres; 558 557 value = (value * vmul) / vdiv; 559 558 pr_debug("fb%d: vertical blank start : %d\n", node, value); 560 - svga_wcrt_multi(tm->v_blank_start_regs, value); 559 + svga_wcrt_multi(regbase, tm->v_blank_start_regs, value); 561 560 562 561 value = var->yres + var->upper_margin + var->lower_margin + var->vsync_len; 563 562 value = (value * vmul) / vdiv; 564 563 pr_debug("fb%d: vertical blank end : %d\n", node, value); 565 - svga_wcrt_multi(tm->v_blank_end_regs, value - 2); 564 + svga_wcrt_multi(regbase, tm->v_blank_end_regs, value - 2); 566 565 567 566 value = var->yres + var->lower_margin; 568 567 value = (value * vmul) / vdiv; 569 568 pr_debug("fb%d: vertical sync start : %d\n", node, value); 570 - svga_wcrt_multi(tm->v_sync_start_regs, value); 569 + svga_wcrt_multi(regbase, tm->v_sync_start_regs, value); 571 570 572 571 value = var->yres + var->lower_margin + var->vsync_len; 573 572 value = (value * vmul) / vdiv; 574 573 pr_debug("fb%d: vertical sync end : %d\n", node, value); 575 - svga_wcrt_multi(tm->v_sync_end_regs, value); 574 + svga_wcrt_multi(regbase, tm->v_sync_end_regs, value); 576 575 577 576 /* Set horizontal and vertical sync pulse polarity in misc register */ 578 577 579 - regval = vga_r(NULL, VGA_MIS_R); 578 + regval = vga_r(regbase, VGA_MIS_R); 580 579 if (var->sync & FB_SYNC_HOR_HIGH_ACT) { 581 580 pr_debug("fb%d: positive horizontal sync\n", node); 582 581 regval = regval & ~0x80; ··· 591 590 pr_debug("fb%d: negative vertical sync\n\n", node); 592 591 regval = regval | 0x40; 593 592 } 594 - vga_w(NULL, VGA_MIS_W, regval); 593 + vga_w(regbase, VGA_MIS_W, regval); 595 594 } 596 595 597 596
+1
drivers/video/tcx.c
··· 480 480 481 481 out_unmap_regs: 482 482 tcx_unmap_regs(op, info, par); 483 + framebuffer_release(info); 483 484 484 485 out_err: 485 486 return err;
+35 -14
drivers/video/uvesafb.c
··· 1552 1552 int rc; 1553 1553 1554 1554 /* Find the largest power-of-two */ 1555 - while (temp_size & (temp_size - 1)) 1556 - temp_size &= (temp_size - 1); 1555 + temp_size = roundup_pow_of_two(temp_size); 1557 1556 1558 1557 /* Try and find a power of two to add */ 1559 1558 do { ··· 1565 1566 #endif /* CONFIG_MTRR */ 1566 1567 } 1567 1568 1569 + static void __devinit uvesafb_ioremap(struct fb_info *info) 1570 + { 1571 + #ifdef CONFIG_X86 1572 + switch (mtrr) { 1573 + case 1: /* uncachable */ 1574 + info->screen_base = ioremap_nocache(info->fix.smem_start, info->fix.smem_len); 1575 + break; 1576 + case 2: /* write-back */ 1577 + info->screen_base = ioremap_cache(info->fix.smem_start, info->fix.smem_len); 1578 + break; 1579 + case 3: /* write-combining */ 1580 + info->screen_base = ioremap_wc(info->fix.smem_start, info->fix.smem_len); 1581 + break; 1582 + case 4: /* write-through */ 1583 + default: 1584 + info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); 1585 + break; 1586 + } 1587 + #else 1588 + info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); 1589 + #endif /* CONFIG_X86 */ 1590 + } 1568 1591 1569 1592 static ssize_t uvesafb_show_vbe_ver(struct device *dev, 1570 1593 struct device_attribute *attr, char *buf) ··· 1757 1736 1758 1737 uvesafb_init_info(info, mode); 1759 1738 1739 + if (!request_region(0x3c0, 32, "uvesafb")) { 1740 + printk(KERN_ERR "uvesafb: request region 0x3c0-0x3e0 failed\n"); 1741 + err = -EIO; 1742 + goto out_mode; 1743 + } 1744 + 1760 1745 if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, 1761 1746 "uvesafb")) { 1762 1747 printk(KERN_ERR "uvesafb: cannot reserve video memory at " 1763 1748 "0x%lx\n", info->fix.smem_start); 1764 1749 err = -EIO; 1765 - goto out_mode; 1750 + goto out_reg; 1766 1751 } 1767 1752 1768 - info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); 1753 + uvesafb_init_mtrr(info); 1754 + uvesafb_ioremap(info); 1769 1755 1770 1756 if (!info->screen_base) { 1771 1757 printk(KERN_ERR ··· 1783 1755 goto out_mem; 1784 1756 } 1785 1757 1786 - if (!request_region(0x3c0, 32, "uvesafb")) { 1787 - printk(KERN_ERR "uvesafb: request region 0x3c0-0x3e0 failed\n"); 1788 - err = -EIO; 1789 - goto out_unmap; 1790 - } 1791 - 1792 - uvesafb_init_mtrr(info); 1793 1758 platform_set_drvdata(dev, info); 1794 1759 1795 1760 if (register_framebuffer(info) < 0) { 1796 1761 printk(KERN_ERR 1797 1762 "uvesafb: failed to register framebuffer device\n"); 1798 1763 err = -EINVAL; 1799 - goto out_reg; 1764 + goto out_unmap; 1800 1765 } 1801 1766 1802 1767 printk(KERN_INFO "uvesafb: framebuffer at 0x%lx, mapped to 0x%p, " ··· 1806 1785 1807 1786 return 0; 1808 1787 1809 - out_reg: 1810 - release_region(0x3c0, 32); 1811 1788 out_unmap: 1812 1789 iounmap(info->screen_base); 1813 1790 out_mem: 1814 1791 release_mem_region(info->fix.smem_start, info->fix.smem_len); 1792 + out_reg: 1793 + release_region(0x3c0, 32); 1815 1794 out_mode: 1816 1795 if (!list_empty(&info->modelist)) 1817 1796 fb_destroy_modelist(&info->modelist);
+1 -2
drivers/video/vermilion/vermilion.c
··· 891 891 int ret; 892 892 893 893 mutex_lock(&vml_mutex); 894 - list_del(&vinfo->head); 895 - list_add(&vinfo->head, (subsys) ? &global_has_mode : &global_no_mode); 894 + list_move(&vinfo->head, (subsys) ? &global_has_mode : &global_no_mode); 896 895 ret = vmlfb_set_par_locked(vinfo); 897 896 898 897 mutex_unlock(&vml_mutex);
+29 -15
drivers/video/vesafb.c
··· 303 303 info->apertures->ranges[0].base = screen_info.lfb_base; 304 304 info->apertures->ranges[0].size = size_total; 305 305 306 - info->screen_base = ioremap(vesafb_fix.smem_start, vesafb_fix.smem_len); 307 - if (!info->screen_base) { 308 - printk(KERN_ERR 309 - "vesafb: abort, cannot ioremap video memory 0x%x @ 0x%lx\n", 310 - vesafb_fix.smem_len, vesafb_fix.smem_start); 311 - err = -EIO; 312 - goto err; 313 - } 314 - 315 - printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, " 316 - "using %dk, total %dk\n", 317 - vesafb_fix.smem_start, info->screen_base, 318 - size_remap/1024, size_total/1024); 319 306 printk(KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n", 320 307 vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages); 321 308 ··· 425 438 int rc; 426 439 427 440 /* Find the largest power-of-two */ 428 - while (temp_size & (temp_size - 1)) 429 - temp_size &= (temp_size - 1); 441 + temp_size = roundup_pow_of_two(temp_size); 430 442 431 443 /* Try and find a power of two to add */ 432 444 do { ··· 437 451 } 438 452 #endif 439 453 454 + switch (mtrr) { 455 + case 1: /* uncachable */ 456 + info->screen_base = ioremap_nocache(vesafb_fix.smem_start, vesafb_fix.smem_len); 457 + break; 458 + case 2: /* write-back */ 459 + info->screen_base = ioremap_cache(vesafb_fix.smem_start, vesafb_fix.smem_len); 460 + break; 461 + case 3: /* write-combining */ 462 + info->screen_base = ioremap_wc(vesafb_fix.smem_start, vesafb_fix.smem_len); 463 + break; 464 + case 4: /* write-through */ 465 + default: 466 + info->screen_base = ioremap(vesafb_fix.smem_start, vesafb_fix.smem_len); 467 + break; 468 + } 469 + if (!info->screen_base) { 470 + printk(KERN_ERR 471 + "vesafb: abort, cannot ioremap video memory 0x%x @ 0x%lx\n", 472 + vesafb_fix.smem_len, vesafb_fix.smem_start); 473 + err = -EIO; 474 + goto err; 475 + } 476 + 477 + printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, " 478 + "using %dk, total %dk\n", 479 + vesafb_fix.smem_start, info->screen_base, 480 + size_remap/1024, size_total/1024); 481 + 440 482 info->fbops = &vesafb_ops; 441 483 info->var = vesafb_defined; 442 484 info->fix = vesafb_fix;
+91 -66
drivers/video/vt8623fb.c
··· 121 121 122 122 /* ------------------------------------------------------------------------- */ 123 123 124 + static void vt8623fb_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor) 125 + { 126 + struct vt8623fb_info *par = info->par; 127 + 128 + svga_tilecursor(par->state.vgabase, info, cursor); 129 + } 124 130 125 131 static struct fb_tile_ops vt8623fb_tile_ops = { 126 132 .fb_settile = svga_settile, 127 133 .fb_tilecopy = svga_tilecopy, 128 134 .fb_tilefill = svga_tilefill, 129 135 .fb_tileblit = svga_tileblit, 130 - .fb_tilecursor = svga_tilecursor, 136 + .fb_tilecursor = vt8623fb_tilecursor, 131 137 .fb_get_tilemax = svga_get_tilemax, 132 138 }; 133 139 ··· 259 253 260 254 static void vt8623_set_pixclock(struct fb_info *info, u32 pixclock) 261 255 { 256 + struct vt8623fb_info *par = info->par; 262 257 u16 m, n, r; 263 258 u8 regval; 264 259 int rv; ··· 271 264 } 272 265 273 266 /* Set VGA misc register */ 274 - regval = vga_r(NULL, VGA_MIS_R); 275 - vga_w(NULL, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 267 + regval = vga_r(par->state.vgabase, VGA_MIS_R); 268 + vga_w(par->state.vgabase, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD); 276 269 277 270 /* Set clock registers */ 278 - vga_wseq(NULL, 0x46, (n | (r << 6))); 279 - vga_wseq(NULL, 0x47, m); 271 + vga_wseq(par->state.vgabase, 0x46, (n | (r << 6))); 272 + vga_wseq(par->state.vgabase, 0x47, m); 280 273 281 274 udelay(1000); 282 275 283 276 /* PLL reset */ 284 - svga_wseq_mask(0x40, 0x02, 0x02); 285 - svga_wseq_mask(0x40, 0x00, 0x02); 277 + svga_wseq_mask(par->state.vgabase, 0x40, 0x02, 0x02); 278 + svga_wseq_mask(par->state.vgabase, 0x40, 0x00, 0x02); 286 279 } 287 280 288 281 ··· 292 285 293 286 mutex_lock(&(par->open_lock)); 294 287 if (par->ref_count == 0) { 288 + void __iomem *vgabase = par->state.vgabase; 289 + 295 290 memset(&(par->state), 0, sizeof(struct vgastate)); 291 + par->state.vgabase = vgabase; 296 292 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP; 297 293 par->state.num_crtc = 0xA2; 298 294 par->state.num_seq = 0x50; ··· 383 373 static int vt8623fb_set_par(struct fb_info *info) 384 374 { 385 375 u32 mode, offset_value, fetch_value, screen_size; 376 + struct vt8623fb_info *par = info->par; 386 377 u32 bpp = info->var.bits_per_pixel; 387 378 388 379 if (bpp != 0) { ··· 425 414 info->var.activate = FB_ACTIVATE_NOW; 426 415 427 416 /* Unlock registers */ 428 - svga_wseq_mask(0x10, 0x01, 0x01); 429 - svga_wcrt_mask(0x11, 0x00, 0x80); 430 - svga_wcrt_mask(0x47, 0x00, 0x01); 417 + svga_wseq_mask(par->state.vgabase, 0x10, 0x01, 0x01); 418 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x00, 0x80); 419 + svga_wcrt_mask(par->state.vgabase, 0x47, 0x00, 0x01); 431 420 432 421 /* Device, screen and sync off */ 433 - svga_wseq_mask(0x01, 0x20, 0x20); 434 - svga_wcrt_mask(0x36, 0x30, 0x30); 435 - svga_wcrt_mask(0x17, 0x00, 0x80); 422 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 423 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x30, 0x30); 424 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x00, 0x80); 436 425 437 426 /* Set default values */ 438 - svga_set_default_gfx_regs(); 439 - svga_set_default_atc_regs(); 440 - svga_set_default_seq_regs(); 441 - svga_set_default_crt_regs(); 442 - svga_wcrt_multi(vt8623_line_compare_regs, 0xFFFFFFFF); 443 - svga_wcrt_multi(vt8623_start_address_regs, 0); 427 + svga_set_default_gfx_regs(par->state.vgabase); 428 + svga_set_default_atc_regs(par->state.vgabase); 429 + svga_set_default_seq_regs(par->state.vgabase); 430 + svga_set_default_crt_regs(par->state.vgabase); 431 + svga_wcrt_multi(par->state.vgabase, vt8623_line_compare_regs, 0xFFFFFFFF); 432 + svga_wcrt_multi(par->state.vgabase, vt8623_start_address_regs, 0); 444 433 445 - svga_wcrt_multi(vt8623_offset_regs, offset_value); 446 - svga_wseq_multi(vt8623_fetch_count_regs, fetch_value); 434 + svga_wcrt_multi(par->state.vgabase, vt8623_offset_regs, offset_value); 435 + svga_wseq_multi(par->state.vgabase, vt8623_fetch_count_regs, fetch_value); 447 436 448 437 /* Clear H/V Skew */ 449 - svga_wcrt_mask(0x03, 0x00, 0x60); 450 - svga_wcrt_mask(0x05, 0x00, 0x60); 438 + svga_wcrt_mask(par->state.vgabase, 0x03, 0x00, 0x60); 439 + svga_wcrt_mask(par->state.vgabase, 0x05, 0x00, 0x60); 451 440 452 441 if (info->var.vmode & FB_VMODE_DOUBLE) 453 - svga_wcrt_mask(0x09, 0x80, 0x80); 442 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x80, 0x80); 454 443 else 455 - svga_wcrt_mask(0x09, 0x00, 0x80); 444 + svga_wcrt_mask(par->state.vgabase, 0x09, 0x00, 0x80); 456 445 457 - svga_wseq_mask(0x1E, 0xF0, 0xF0); // DI/DVP bus 458 - svga_wseq_mask(0x2A, 0x0F, 0x0F); // DI/DVP bus 459 - svga_wseq_mask(0x16, 0x08, 0xBF); // FIFO read threshold 460 - vga_wseq(NULL, 0x17, 0x1F); // FIFO depth 461 - vga_wseq(NULL, 0x18, 0x4E); 462 - svga_wseq_mask(0x1A, 0x08, 0x08); // enable MMIO ? 446 + svga_wseq_mask(par->state.vgabase, 0x1E, 0xF0, 0xF0); // DI/DVP bus 447 + svga_wseq_mask(par->state.vgabase, 0x2A, 0x0F, 0x0F); // DI/DVP bus 448 + svga_wseq_mask(par->state.vgabase, 0x16, 0x08, 0xBF); // FIFO read threshold 449 + vga_wseq(par->state.vgabase, 0x17, 0x1F); // FIFO depth 450 + vga_wseq(par->state.vgabase, 0x18, 0x4E); 451 + svga_wseq_mask(par->state.vgabase, 0x1A, 0x08, 0x08); // enable MMIO ? 463 452 464 - vga_wcrt(NULL, 0x32, 0x00); 465 - vga_wcrt(NULL, 0x34, 0x00); 466 - vga_wcrt(NULL, 0x6A, 0x80); 467 - vga_wcrt(NULL, 0x6A, 0xC0); 453 + vga_wcrt(par->state.vgabase, 0x32, 0x00); 454 + vga_wcrt(par->state.vgabase, 0x34, 0x00); 455 + vga_wcrt(par->state.vgabase, 0x6A, 0x80); 456 + vga_wcrt(par->state.vgabase, 0x6A, 0xC0); 468 457 469 - vga_wgfx(NULL, 0x20, 0x00); 470 - vga_wgfx(NULL, 0x21, 0x00); 471 - vga_wgfx(NULL, 0x22, 0x00); 458 + vga_wgfx(par->state.vgabase, 0x20, 0x00); 459 + vga_wgfx(par->state.vgabase, 0x21, 0x00); 460 + vga_wgfx(par->state.vgabase, 0x22, 0x00); 472 461 473 462 /* Set SR15 according to number of bits per pixel */ 474 463 mode = svga_match_format(vt8623fb_formats, &(info->var), &(info->fix)); 475 464 switch (mode) { 476 465 case 0: 477 466 pr_debug("fb%d: text mode\n", info->node); 478 - svga_set_textmode_vga_regs(); 479 - svga_wseq_mask(0x15, 0x00, 0xFE); 480 - svga_wcrt_mask(0x11, 0x60, 0x70); 467 + svga_set_textmode_vga_regs(par->state.vgabase); 468 + svga_wseq_mask(par->state.vgabase, 0x15, 0x00, 0xFE); 469 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x60, 0x70); 481 470 break; 482 471 case 1: 483 472 pr_debug("fb%d: 4 bit pseudocolor\n", info->node); 484 - vga_wgfx(NULL, VGA_GFX_MODE, 0x40); 485 - svga_wseq_mask(0x15, 0x20, 0xFE); 486 - svga_wcrt_mask(0x11, 0x00, 0x70); 473 + vga_wgfx(par->state.vgabase, VGA_GFX_MODE, 0x40); 474 + svga_wseq_mask(par->state.vgabase, 0x15, 0x20, 0xFE); 475 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x00, 0x70); 487 476 break; 488 477 case 2: 489 478 pr_debug("fb%d: 4 bit pseudocolor, planar\n", info->node); 490 - svga_wseq_mask(0x15, 0x00, 0xFE); 491 - svga_wcrt_mask(0x11, 0x00, 0x70); 479 + svga_wseq_mask(par->state.vgabase, 0x15, 0x00, 0xFE); 480 + svga_wcrt_mask(par->state.vgabase, 0x11, 0x00, 0x70); 492 481 break; 493 482 case 3: 494 483 pr_debug("fb%d: 8 bit pseudocolor\n", info->node); 495 - svga_wseq_mask(0x15, 0x22, 0xFE); 484 + svga_wseq_mask(par->state.vgabase, 0x15, 0x22, 0xFE); 496 485 break; 497 486 case 4: 498 487 pr_debug("fb%d: 5/6/5 truecolor\n", info->node); 499 - svga_wseq_mask(0x15, 0xB6, 0xFE); 488 + svga_wseq_mask(par->state.vgabase, 0x15, 0xB6, 0xFE); 500 489 break; 501 490 case 5: 502 491 pr_debug("fb%d: 8/8/8 truecolor\n", info->node); 503 - svga_wseq_mask(0x15, 0xAE, 0xFE); 492 + svga_wseq_mask(par->state.vgabase, 0x15, 0xAE, 0xFE); 504 493 break; 505 494 default: 506 495 printk(KERN_ERR "vt8623fb: unsupported mode - bug\n"); ··· 508 497 } 509 498 510 499 vt8623_set_pixclock(info, info->var.pixclock); 511 - svga_set_timings(&vt8623_timing_regs, &(info->var), 1, 1, 500 + svga_set_timings(par->state.vgabase, &vt8623_timing_regs, &(info->var), 1, 1, 512 501 (info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 1, 513 502 1, info->node); 514 503 515 504 memset_io(info->screen_base, 0x00, screen_size); 516 505 517 506 /* Device and screen back on */ 518 - svga_wcrt_mask(0x17, 0x80, 0x80); 519 - svga_wcrt_mask(0x36, 0x00, 0x30); 520 - svga_wseq_mask(0x01, 0x00, 0x20); 507 + svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80); 508 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x00, 0x30); 509 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 521 510 522 511 return 0; 523 512 } ··· 580 569 581 570 static int vt8623fb_blank(int blank_mode, struct fb_info *info) 582 571 { 572 + struct vt8623fb_info *par = info->par; 573 + 583 574 switch (blank_mode) { 584 575 case FB_BLANK_UNBLANK: 585 576 pr_debug("fb%d: unblank\n", info->node); 586 - svga_wcrt_mask(0x36, 0x00, 0x30); 587 - svga_wseq_mask(0x01, 0x00, 0x20); 577 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x00, 0x30); 578 + svga_wseq_mask(par->state.vgabase, 0x01, 0x00, 0x20); 588 579 break; 589 580 case FB_BLANK_NORMAL: 590 581 pr_debug("fb%d: blank\n", info->node); 591 - svga_wcrt_mask(0x36, 0x00, 0x30); 592 - svga_wseq_mask(0x01, 0x20, 0x20); 582 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x00, 0x30); 583 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 593 584 break; 594 585 case FB_BLANK_HSYNC_SUSPEND: 595 586 pr_debug("fb%d: DPMS standby (hsync off)\n", info->node); 596 - svga_wcrt_mask(0x36, 0x10, 0x30); 597 - svga_wseq_mask(0x01, 0x20, 0x20); 587 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x10, 0x30); 588 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 598 589 break; 599 590 case FB_BLANK_VSYNC_SUSPEND: 600 591 pr_debug("fb%d: DPMS suspend (vsync off)\n", info->node); 601 - svga_wcrt_mask(0x36, 0x20, 0x30); 602 - svga_wseq_mask(0x01, 0x20, 0x20); 592 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x20, 0x30); 593 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 603 594 break; 604 595 case FB_BLANK_POWERDOWN: 605 596 pr_debug("fb%d: DPMS off (no sync)\n", info->node); 606 - svga_wcrt_mask(0x36, 0x30, 0x30); 607 - svga_wseq_mask(0x01, 0x20, 0x20); 597 + svga_wcrt_mask(par->state.vgabase, 0x36, 0x30, 0x30); 598 + svga_wseq_mask(par->state.vgabase, 0x01, 0x20, 0x20); 608 599 break; 609 600 } 610 601 ··· 616 603 617 604 static int vt8623fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) 618 605 { 606 + struct vt8623fb_info *par = info->par; 619 607 unsigned int offset; 620 608 621 609 /* Calculate the offset */ ··· 630 616 } 631 617 632 618 /* Set the offset */ 633 - svga_wcrt_multi(vt8623_start_address_regs, offset); 619 + svga_wcrt_multi(par->state.vgabase, vt8623_start_address_regs, offset); 634 620 635 621 return 0; 636 622 } ··· 661 647 662 648 static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) 663 649 { 650 + struct pci_bus_region bus_reg; 651 + struct resource vga_res; 664 652 struct fb_info *info; 665 653 struct vt8623fb_info *par; 666 654 unsigned int memsize1, memsize2; ··· 721 705 goto err_iomap_2; 722 706 } 723 707 708 + bus_reg.start = 0; 709 + bus_reg.end = 64 * 1024; 710 + 711 + vga_res.flags = IORESOURCE_IO; 712 + 713 + pcibios_bus_to_resource(dev, &vga_res, &bus_reg); 714 + 715 + par->state.vgabase = (void __iomem *) vga_res.start; 716 + 724 717 /* Find how many physical memory there is on card */ 725 - memsize1 = (vga_rseq(NULL, 0x34) + 1) >> 1; 726 - memsize2 = vga_rseq(NULL, 0x39) << 2; 718 + memsize1 = (vga_rseq(par->state.vgabase, 0x34) + 1) >> 1; 719 + memsize2 = vga_rseq(par->state.vgabase, 0x39) << 2; 727 720 728 721 if ((16 <= memsize1) && (memsize1 <= 64) && (memsize1 == memsize2)) 729 722 info->screen_size = memsize1 << 20;
+8
include/linux/sm501.h
··· 172 172 struct sm501_platdata_gpio_i2c *gpio_i2c; 173 173 unsigned int gpio_i2c_nr; 174 174 }; 175 + 176 + #if defined(CONFIG_PPC32) 177 + #define smc501_readl(addr) ioread32be((addr)) 178 + #define smc501_writel(val, addr) iowrite32be((val), (addr)) 179 + #else 180 + #define smc501_readl(addr) readl(addr) 181 + #define smc501_writel(val, addr) writel(val, addr) 182 + #endif
+17 -17
include/linux/svga.h
··· 67 67 68 68 /* Write a value to the attribute register */ 69 69 70 - static inline void svga_wattr(u8 index, u8 data) 70 + static inline void svga_wattr(void __iomem *regbase, u8 index, u8 data) 71 71 { 72 - inb(0x3DA); 73 - outb(index, 0x3C0); 74 - outb(data, 0x3C0); 72 + vga_r(regbase, VGA_IS1_RC); 73 + vga_w(regbase, VGA_ATT_IW, index); 74 + vga_w(regbase, VGA_ATT_W, data); 75 75 } 76 76 77 77 /* Write a value to a sequence register with a mask */ 78 78 79 - static inline void svga_wseq_mask(u8 index, u8 data, u8 mask) 79 + static inline void svga_wseq_mask(void __iomem *regbase, u8 index, u8 data, u8 mask) 80 80 { 81 - vga_wseq(NULL, index, (data & mask) | (vga_rseq(NULL, index) & ~mask)); 81 + vga_wseq(regbase, index, (data & mask) | (vga_rseq(regbase, index) & ~mask)); 82 82 } 83 83 84 84 /* Write a value to a CRT register with a mask */ 85 85 86 - static inline void svga_wcrt_mask(u8 index, u8 data, u8 mask) 86 + static inline void svga_wcrt_mask(void __iomem *regbase, u8 index, u8 data, u8 mask) 87 87 { 88 - vga_wcrt(NULL, index, (data & mask) | (vga_rcrt(NULL, index) & ~mask)); 88 + vga_wcrt(regbase, index, (data & mask) | (vga_rcrt(regbase, index) & ~mask)); 89 89 } 90 90 91 91 static inline int svga_primary_device(struct pci_dev *dev) ··· 96 96 } 97 97 98 98 99 - void svga_wcrt_multi(const struct vga_regset *regset, u32 value); 100 - void svga_wseq_multi(const struct vga_regset *regset, u32 value); 99 + void svga_wcrt_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value); 100 + void svga_wseq_multi(void __iomem *regbase, const struct vga_regset *regset, u32 value); 101 101 102 - void svga_set_default_gfx_regs(void); 103 - void svga_set_default_atc_regs(void); 104 - void svga_set_default_seq_regs(void); 105 - void svga_set_default_crt_regs(void); 106 - void svga_set_textmode_vga_regs(void); 102 + void svga_set_default_gfx_regs(void __iomem *regbase); 103 + void svga_set_default_atc_regs(void __iomem *regbase); 104 + void svga_set_default_seq_regs(void __iomem *regbase); 105 + void svga_set_default_crt_regs(void __iomem *regbase); 106 + void svga_set_textmode_vga_regs(void __iomem *regbase); 107 107 108 108 void svga_settile(struct fb_info *info, struct fb_tilemap *map); 109 109 void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area); 110 110 void svga_tilefill(struct fb_info *info, struct fb_tilerect *rect); 111 111 void svga_tileblit(struct fb_info *info, struct fb_tileblit *blit); 112 - void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor); 112 + void svga_tilecursor(void __iomem *regbase, struct fb_info *info, struct fb_tilecursor *cursor); 113 113 int svga_get_tilemax(struct fb_info *info); 114 114 void svga_get_caps(struct fb_info *info, struct fb_blit_caps *caps, 115 115 struct fb_var_screeninfo *var); 116 116 117 117 int svga_compute_pll(const struct svga_pll *pll, u32 f_wanted, u16 *m, u16 *n, u16 *r, int node); 118 118 int svga_check_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, int node); 119 - void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node); 119 + void svga_set_timings(void __iomem *regbase, const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node); 120 120 121 121 int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix); 122 122
+1
include/video/atmel_lcdc.h
··· 52 52 u8 bl_power; 53 53 #endif 54 54 bool lcdcon_is_backlight; 55 + bool lcdcon_pol_negative; 55 56 u8 saved_lcdcon; 56 57 57 58 u8 default_bpp;