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

Merge tag 'fbdev-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux

Pull fbdev changes from Tomi Valkeinen:
- Improvements to da8xx-fb to make it support v2 of the LCDC IP, used
eg in BeagleBone
- Himax HX8369 controller support
- Various small fixes and cleanups

* tag 'fbdev-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux: (42 commits)
video: da8xx-fb: fix the polarities of the hsync/vsync pulse
video: da8xx-fb: support lcdc v2 timing register expansion
video: da8xx-fb: fixing timing off by one errors
video: da8xx-fb fixing incorrect porch mappings
video: xilinxfb: replace devm_request_and_ioremap by devm_ioremap_resource
fbmem: move EXPORT_SYMBOL annotation next to symbol declarations
drivers: video: fbcmap: remove the redundency and incorrect checkings
video: mxsfb: simplify use of devm_ioremap_resource
Release efifb's colormap in efifb_destroy()
at91/avr32/atmel_lcdfb: prepare clk before calling enable
video: exynos: Ensure definitions match prototypes
OMAPDSS: fix WARN_ON in 'alpha_blending_enabled' sysfs file
OMAPDSS: HDMI: Fix possible NULL reference
video: da8xx-fb: adding am33xx as dependency
video: da8xx-fb: let compiler decide what to inline
video: da8xx-fb: make clock naming consistent
video: da8xx-fb: set upstream clock rate (if reqd)
video: da8xx-fb: reorganize panel detection
video: da8xx-fb: ensure non-null cfg in pdata
video: da8xx-fb: use devres
...

+543 -286
+1
Documentation/devicetree/bindings/video/simple-framebuffer.txt
··· 12 12 - stride: The number of bytes in each line of the framebuffer. 13 13 - format: The format of the framebuffer surface. Valid values are: 14 14 - r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b). 15 + - a8b8g8r8 (32-bit pixels, d[31:24]=a, d[23:16]=b, d[15:8]=g, d[7:0]=r). 15 16 16 17 Example: 17 18
+5 -10
drivers/video/Kconfig
··· 2100 2100 bool "Giantplus Technology GPM1040A0 320x240 Color TFT LCD" 2101 2101 depends on FB_NUC900 2102 2102 2103 - config FB_NUC900_DEBUG 2104 - bool "NUC900 lcd debug messages" 2105 - depends on FB_NUC900 2106 - help 2107 - Turn on debugging messages. Note that you can set/unset at run time 2108 - through sysfs 2109 - 2110 2103 config FB_SM501 2111 2104 tristate "Silicon Motion SM501 framebuffer support" 2112 2105 depends on FB && MFD_SM501 ··· 2221 2228 panels <= 320 pixel horizontal resolution. 2222 2229 2223 2230 config FB_DA8XX 2224 - tristate "DA8xx/OMAP-L1xx Framebuffer support" 2225 - depends on FB && ARCH_DAVINCI_DA8XX 2231 + tristate "DA8xx/OMAP-L1xx/AM335x Framebuffer support" 2232 + depends on FB && (ARCH_DAVINCI_DA8XX || SOC_AM33XX) 2226 2233 select FB_CFB_FILLRECT 2227 2234 select FB_CFB_COPYAREA 2228 2235 select FB_CFB_IMAGEBLIT 2229 2236 select FB_CFB_REV_PIXELS_IN_BYTE 2237 + select FB_MODE_HELPERS 2238 + select VIDEOMODE_HELPERS 2230 2239 ---help--- 2231 2240 This is the frame buffer device driver for the TI LCD controller 2232 - found on DA8xx/OMAP-L1xx SoCs. 2241 + found on DA8xx/OMAP-L1xx/AM335x SoCs. 2233 2242 If unsure, say N. 2234 2243 2235 2244 config FB_VIRTUAL
+4 -4
drivers/video/atmel_lcdfb.c
··· 902 902 903 903 static void atmel_lcdfb_start_clock(struct atmel_lcdfb_info *sinfo) 904 904 { 905 - clk_enable(sinfo->bus_clk); 906 - clk_enable(sinfo->lcdc_clk); 905 + clk_prepare_enable(sinfo->bus_clk); 906 + clk_prepare_enable(sinfo->lcdc_clk); 907 907 } 908 908 909 909 static void atmel_lcdfb_stop_clock(struct atmel_lcdfb_info *sinfo) 910 910 { 911 - clk_disable(sinfo->bus_clk); 912 - clk_disable(sinfo->lcdc_clk); 911 + clk_disable_unprepare(sinfo->bus_clk); 912 + clk_disable_unprepare(sinfo->lcdc_clk); 913 913 } 914 914 915 915
+234 -35
drivers/video/backlight/hx8357.c
··· 71 71 #define HX8357_SET_POWER_NORMAL 0xd2 72 72 #define HX8357_SET_PANEL_RELATED 0xe9 73 73 74 + #define HX8369_SET_DISPLAY_BRIGHTNESS 0x51 75 + #define HX8369_WRITE_CABC_DISPLAY_VALUE 0x53 76 + #define HX8369_WRITE_CABC_BRIGHT_CTRL 0x55 77 + #define HX8369_WRITE_CABC_MIN_BRIGHTNESS 0x5e 78 + #define HX8369_SET_POWER 0xb1 79 + #define HX8369_SET_DISPLAY_MODE 0xb2 80 + #define HX8369_SET_DISPLAY_WAVEFORM_CYC 0xb4 81 + #define HX8369_SET_VCOM 0xb6 82 + #define HX8369_SET_EXTENSION_COMMAND 0xb9 83 + #define HX8369_SET_GIP 0xd5 84 + #define HX8369_SET_GAMMA_CURVE_RELATED 0xe0 85 + 74 86 struct hx8357_data { 75 87 unsigned im_pins[HX8357_NUM_IM_PINS]; 76 88 unsigned reset; 77 89 struct spi_device *spi; 78 90 int state; 91 + bool use_im_pins; 79 92 }; 80 93 81 94 static u8 hx8357_seq_power[] = { ··· 154 141 HX8357_SET_DISPLAY_MODE, 155 142 HX8357_SET_DISPLAY_MODE_RGB_THROUGH | 156 143 HX8357_SET_DISPLAY_MODE_RGB_INTERFACE, 144 + }; 145 + 146 + static u8 hx8369_seq_write_CABC_min_brightness[] = { 147 + HX8369_WRITE_CABC_MIN_BRIGHTNESS, 0x00, 148 + }; 149 + 150 + static u8 hx8369_seq_write_CABC_control[] = { 151 + HX8369_WRITE_CABC_DISPLAY_VALUE, 0x24, 152 + }; 153 + 154 + static u8 hx8369_seq_set_display_brightness[] = { 155 + HX8369_SET_DISPLAY_BRIGHTNESS, 0xFF, 156 + }; 157 + 158 + static u8 hx8369_seq_write_CABC_control_setting[] = { 159 + HX8369_WRITE_CABC_BRIGHT_CTRL, 0x02, 160 + }; 161 + 162 + static u8 hx8369_seq_extension_command[] = { 163 + HX8369_SET_EXTENSION_COMMAND, 0xff, 0x83, 0x69, 164 + }; 165 + 166 + static u8 hx8369_seq_display_related[] = { 167 + HX8369_SET_DISPLAY_MODE, 0x00, 0x2b, 0x03, 0x03, 0x70, 0x00, 168 + 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x01, 169 + }; 170 + 171 + static u8 hx8369_seq_panel_waveform_cycle[] = { 172 + HX8369_SET_DISPLAY_WAVEFORM_CYC, 0x0a, 0x1d, 0x80, 0x06, 0x02, 173 + }; 174 + 175 + static u8 hx8369_seq_set_address_mode[] = { 176 + HX8357_SET_ADDRESS_MODE, 0x00, 177 + }; 178 + 179 + static u8 hx8369_seq_vcom[] = { 180 + HX8369_SET_VCOM, 0x3e, 0x3e, 181 + }; 182 + 183 + static u8 hx8369_seq_gip[] = { 184 + HX8369_SET_GIP, 0x00, 0x01, 0x03, 0x25, 0x01, 0x02, 0x28, 0x70, 185 + 0x11, 0x13, 0x00, 0x00, 0x40, 0x26, 0x51, 0x37, 0x00, 0x00, 0x71, 186 + 0x35, 0x60, 0x24, 0x07, 0x0f, 0x04, 0x04, 187 + }; 188 + 189 + static u8 hx8369_seq_power[] = { 190 + HX8369_SET_POWER, 0x01, 0x00, 0x34, 0x03, 0x00, 0x11, 0x11, 0x32, 191 + 0x2f, 0x3f, 0x3f, 0x01, 0x3a, 0x01, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 192 + }; 193 + 194 + static u8 hx8369_seq_gamma_curve_related[] = { 195 + HX8369_SET_GAMMA_CURVE_RELATED, 0x00, 0x0d, 0x19, 0x2f, 0x3b, 0x3d, 196 + 0x2e, 0x4a, 0x08, 0x0e, 0x0f, 0x14, 0x16, 0x14, 0x14, 0x14, 0x1e, 197 + 0x00, 0x0d, 0x19, 0x2f, 0x3b, 0x3d, 0x2e, 0x4a, 0x08, 0x0e, 0x0f, 198 + 0x14, 0x16, 0x14, 0x14, 0x14, 0x1e, 157 199 }; 158 200 159 201 static int hx8357_spi_write_then_read(struct lcd_device *lcdev, ··· 287 219 if (ret < 0) 288 220 return ret; 289 221 222 + /* 223 + * The controller needs 120ms when entering in sleep mode before we can 224 + * send the command to go off sleep mode 225 + */ 290 226 msleep(120); 291 227 292 228 return 0; ··· 304 232 if (ret < 0) 305 233 return ret; 306 234 235 + /* 236 + * The controller needs 120ms when exiting from sleep mode before we 237 + * can send the command to enter in sleep mode 238 + */ 307 239 msleep(120); 308 240 309 241 ret = hx8357_spi_write_byte(lcdev, HX8357_SET_DISPLAY_ON); ··· 315 239 return ret; 316 240 317 241 return 0; 242 + } 243 + 244 + static void hx8357_lcd_reset(struct lcd_device *lcdev) 245 + { 246 + struct hx8357_data *lcd = lcd_get_data(lcdev); 247 + 248 + /* Reset the screen */ 249 + gpio_set_value(lcd->reset, 1); 250 + usleep_range(10000, 12000); 251 + gpio_set_value(lcd->reset, 0); 252 + usleep_range(10000, 12000); 253 + gpio_set_value(lcd->reset, 1); 254 + 255 + /* The controller needs 120ms to recover from reset */ 256 + msleep(120); 318 257 } 319 258 320 259 static int hx8357_lcd_init(struct lcd_device *lcdev) ··· 341 250 * Set the interface selection pins to SPI mode, with three 342 251 * wires 343 252 */ 344 - gpio_set_value_cansleep(lcd->im_pins[0], 1); 345 - gpio_set_value_cansleep(lcd->im_pins[1], 0); 346 - gpio_set_value_cansleep(lcd->im_pins[2], 1); 347 - 348 - /* Reset the screen */ 349 - gpio_set_value(lcd->reset, 1); 350 - usleep_range(10000, 12000); 351 - gpio_set_value(lcd->reset, 0); 352 - usleep_range(10000, 12000); 353 - gpio_set_value(lcd->reset, 1); 354 - msleep(120); 253 + if (lcd->use_im_pins) { 254 + gpio_set_value_cansleep(lcd->im_pins[0], 1); 255 + gpio_set_value_cansleep(lcd->im_pins[1], 0); 256 + gpio_set_value_cansleep(lcd->im_pins[2], 1); 257 + } 355 258 356 259 ret = hx8357_spi_write_array(lcdev, hx8357_seq_power, 357 260 ARRAY_SIZE(hx8357_seq_power)); ··· 426 341 if (ret < 0) 427 342 return ret; 428 343 344 + /* 345 + * The controller needs 120ms to fully recover from exiting sleep mode 346 + */ 429 347 msleep(120); 430 348 431 349 ret = hx8357_spi_write_byte(lcdev, HX8357_SET_DISPLAY_ON); ··· 438 350 usleep_range(5000, 7000); 439 351 440 352 ret = hx8357_spi_write_byte(lcdev, HX8357_WRITE_MEMORY_START); 353 + if (ret < 0) 354 + return ret; 355 + 356 + return 0; 357 + } 358 + 359 + static int hx8369_lcd_init(struct lcd_device *lcdev) 360 + { 361 + int ret; 362 + 363 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_extension_command, 364 + ARRAY_SIZE(hx8369_seq_extension_command)); 365 + if (ret < 0) 366 + return ret; 367 + usleep_range(10000, 12000); 368 + 369 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_display_related, 370 + ARRAY_SIZE(hx8369_seq_display_related)); 371 + if (ret < 0) 372 + return ret; 373 + 374 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_panel_waveform_cycle, 375 + ARRAY_SIZE(hx8369_seq_panel_waveform_cycle)); 376 + if (ret < 0) 377 + return ret; 378 + 379 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_set_address_mode, 380 + ARRAY_SIZE(hx8369_seq_set_address_mode)); 381 + if (ret < 0) 382 + return ret; 383 + 384 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_vcom, 385 + ARRAY_SIZE(hx8369_seq_vcom)); 386 + if (ret < 0) 387 + return ret; 388 + 389 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_gip, 390 + ARRAY_SIZE(hx8369_seq_gip)); 391 + if (ret < 0) 392 + return ret; 393 + 394 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_power, 395 + ARRAY_SIZE(hx8369_seq_power)); 396 + if (ret < 0) 397 + return ret; 398 + 399 + ret = hx8357_spi_write_byte(lcdev, HX8357_EXIT_SLEEP_MODE); 400 + if (ret < 0) 401 + return ret; 402 + 403 + /* 404 + * The controller needs 120ms to fully recover from exiting sleep mode 405 + */ 406 + msleep(120); 407 + 408 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_gamma_curve_related, 409 + ARRAY_SIZE(hx8369_seq_gamma_curve_related)); 410 + if (ret < 0) 411 + return ret; 412 + 413 + ret = hx8357_spi_write_byte(lcdev, HX8357_EXIT_SLEEP_MODE); 414 + if (ret < 0) 415 + return ret; 416 + usleep_range(1000, 1200); 417 + 418 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_write_CABC_control, 419 + ARRAY_SIZE(hx8369_seq_write_CABC_control)); 420 + if (ret < 0) 421 + return ret; 422 + usleep_range(10000, 12000); 423 + 424 + ret = hx8357_spi_write_array(lcdev, 425 + hx8369_seq_write_CABC_control_setting, 426 + ARRAY_SIZE(hx8369_seq_write_CABC_control_setting)); 427 + if (ret < 0) 428 + return ret; 429 + 430 + ret = hx8357_spi_write_array(lcdev, 431 + hx8369_seq_write_CABC_min_brightness, 432 + ARRAY_SIZE(hx8369_seq_write_CABC_min_brightness)); 433 + if (ret < 0) 434 + return ret; 435 + usleep_range(10000, 12000); 436 + 437 + ret = hx8357_spi_write_array(lcdev, hx8369_seq_set_display_brightness, 438 + ARRAY_SIZE(hx8369_seq_set_display_brightness)); 439 + if (ret < 0) 440 + return ret; 441 + 442 + ret = hx8357_spi_write_byte(lcdev, HX8357_SET_DISPLAY_ON); 441 443 if (ret < 0) 442 444 return ret; 443 445 ··· 566 388 .get_power = hx8357_get_power, 567 389 }; 568 390 391 + static const struct of_device_id hx8357_dt_ids[] = { 392 + { 393 + .compatible = "himax,hx8357", 394 + .data = hx8357_lcd_init, 395 + }, 396 + { 397 + .compatible = "himax,hx8369", 398 + .data = hx8369_lcd_init, 399 + }, 400 + {}, 401 + }; 402 + MODULE_DEVICE_TABLE(of, hx8357_dt_ids); 403 + 569 404 static int hx8357_probe(struct spi_device *spi) 570 405 { 571 406 struct lcd_device *lcdev; 572 407 struct hx8357_data *lcd; 408 + const struct of_device_id *match; 573 409 int i, ret; 574 410 575 411 lcd = devm_kzalloc(&spi->dev, sizeof(*lcd), GFP_KERNEL); ··· 599 407 } 600 408 601 409 lcd->spi = spi; 410 + 411 + match = of_match_device(hx8357_dt_ids, &spi->dev); 412 + if (!match || !match->data) 413 + return -EINVAL; 602 414 603 415 lcd->reset = of_get_named_gpio(spi->dev.of_node, "gpios-reset", 0); 604 416 if (!gpio_is_valid(lcd->reset)) { ··· 620 424 return -EINVAL; 621 425 } 622 426 623 - for (i = 0; i < HX8357_NUM_IM_PINS; i++) { 624 - lcd->im_pins[i] = of_get_named_gpio(spi->dev.of_node, 625 - "im-gpios", i); 626 - if (lcd->im_pins[i] == -EPROBE_DEFER) { 627 - dev_info(&spi->dev, "GPIO requested is not here yet, deferring the probe\n"); 628 - return -EPROBE_DEFER; 629 - } 630 - if (!gpio_is_valid(lcd->im_pins[i])) { 631 - dev_err(&spi->dev, "Missing dt property: im-gpios\n"); 632 - return -EINVAL; 633 - } 427 + if (of_find_property(spi->dev.of_node, "im-gpios", NULL)) { 428 + lcd->use_im_pins = 1; 634 429 635 - ret = devm_gpio_request_one(&spi->dev, lcd->im_pins[i], 636 - GPIOF_OUT_INIT_LOW, "im_pins"); 637 - if (ret) { 638 - dev_err(&spi->dev, "failed to request gpio %d: %d\n", 639 - lcd->im_pins[i], ret); 640 - return -EINVAL; 430 + for (i = 0; i < HX8357_NUM_IM_PINS; i++) { 431 + lcd->im_pins[i] = of_get_named_gpio(spi->dev.of_node, 432 + "im-gpios", i); 433 + if (lcd->im_pins[i] == -EPROBE_DEFER) { 434 + dev_info(&spi->dev, "GPIO requested is not here yet, deferring the probe\n"); 435 + return -EPROBE_DEFER; 436 + } 437 + if (!gpio_is_valid(lcd->im_pins[i])) { 438 + dev_err(&spi->dev, "Missing dt property: im-gpios\n"); 439 + return -EINVAL; 440 + } 441 + 442 + ret = devm_gpio_request_one(&spi->dev, lcd->im_pins[i], 443 + GPIOF_OUT_INIT_LOW, 444 + "im_pins"); 445 + if (ret) { 446 + dev_err(&spi->dev, "failed to request gpio %d: %d\n", 447 + lcd->im_pins[i], ret); 448 + return -EINVAL; 449 + } 641 450 } 451 + } else { 452 + lcd->use_im_pins = 0; 642 453 } 643 454 644 455 lcdev = lcd_device_register("mxsfb", &spi->dev, lcd, &hx8357_ops); ··· 655 452 } 656 453 spi_set_drvdata(spi, lcdev); 657 454 658 - ret = hx8357_lcd_init(lcdev); 455 + hx8357_lcd_reset(lcdev); 456 + 457 + ret = ((int (*)(struct lcd_device *))match->data)(lcdev); 659 458 if (ret) { 660 459 dev_err(&spi->dev, "Couldn't initialize panel\n"); 661 460 goto init_error; ··· 679 474 lcd_device_unregister(lcdev); 680 475 return 0; 681 476 } 682 - 683 - static const struct of_device_id hx8357_dt_ids[] = { 684 - { .compatible = "himax,hx8357" }, 685 - {}, 686 - }; 687 - MODULE_DEVICE_TABLE(of, hx8357_dt_ids); 688 477 689 478 static struct spi_driver hx8357_driver = { 690 479 .probe = hx8357_probe,
+1 -1
drivers/video/backlight/lp855x_bl.c
··· 246 246 { 247 247 struct lp855x *lp = bl_get_data(bl); 248 248 249 - if (bl->props.state & BL_CORE_SUSPENDED) 249 + if (bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK)) 250 250 bl->props.brightness = 0; 251 251 252 252 if (lp->mode == PWM_BASED) {
+232 -157
drivers/video/da8xx-fb.c
··· 131 131 132 132 #define WSI_TIMEOUT 50 133 133 #define PALETTE_SIZE 256 134 - #define LEFT_MARGIN 64 135 - #define RIGHT_MARGIN 64 136 - #define UPPER_MARGIN 32 137 - #define LOWER_MARGIN 32 134 + 135 + #define CLK_MIN_DIV 2 136 + #define CLK_MAX_DIV 255 138 137 139 138 static void __iomem *da8xx_fb_reg_base; 140 - static struct resource *lcdc_regs; 141 139 static unsigned int lcd_revision; 142 140 static irq_handler_t lcdc_irq_handler; 143 141 static wait_queue_head_t frame_done_wq; 144 142 static int frame_done_flag; 145 143 146 - static inline unsigned int lcdc_read(unsigned int addr) 144 + static unsigned int lcdc_read(unsigned int addr) 147 145 { 148 146 return (unsigned int)__raw_readl(da8xx_fb_reg_base + (addr)); 149 147 } 150 148 151 - static inline void lcdc_write(unsigned int val, unsigned int addr) 149 + static void lcdc_write(unsigned int val, unsigned int addr) 152 150 { 153 151 __raw_writel(val, da8xx_fb_reg_base + (addr)); 154 152 } 155 153 156 154 struct da8xx_fb_par { 155 + struct device *dev; 157 156 resource_size_t p_palette_base; 158 157 unsigned char *v_palette_base; 159 158 dma_addr_t vram_phys; ··· 163 164 struct clk *lcdc_clk; 164 165 int irq; 165 166 unsigned int palette_sz; 166 - unsigned int pxl_clk; 167 167 int blank; 168 168 wait_queue_head_t vsync_wait; 169 169 int vsync_flag; ··· 176 178 unsigned int which_dma_channel_done; 177 179 #ifdef CONFIG_CPU_FREQ 178 180 struct notifier_block freq_transition; 179 - unsigned int lcd_fck_rate; 180 181 #endif 182 + unsigned int lcdc_clk_rate; 181 183 void (*panel_power_ctrl)(int); 182 184 u32 pseudo_palette[16]; 185 + struct fb_videomode mode; 186 + struct lcd_ctrl_config cfg; 183 187 }; 184 188 185 - /* Variable Screen Information */ 186 - static struct fb_var_screeninfo da8xx_fb_var = { 187 - .xoffset = 0, 188 - .yoffset = 0, 189 - .transp = {0, 0, 0}, 190 - .nonstd = 0, 191 - .activate = 0, 192 - .height = -1, 193 - .width = -1, 194 - .accel_flags = 0, 195 - .left_margin = LEFT_MARGIN, 196 - .right_margin = RIGHT_MARGIN, 197 - .upper_margin = UPPER_MARGIN, 198 - .lower_margin = LOWER_MARGIN, 199 - .sync = 0, 200 - .vmode = FB_VMODE_NONINTERLACED 201 - }; 189 + static struct fb_var_screeninfo da8xx_fb_var; 202 190 203 191 static struct fb_fix_screeninfo da8xx_fb_fix = { 204 192 .id = "DA8xx FB Drv", ··· 203 219 .name = "Sharp_LCD035Q3DG01", 204 220 .xres = 320, 205 221 .yres = 240, 206 - .pixclock = 4608000, 222 + .pixclock = KHZ2PICOS(4607), 207 223 .left_margin = 6, 208 224 .right_margin = 8, 209 225 .upper_margin = 2, ··· 218 234 .name = "Sharp_LK043T1DG01", 219 235 .xres = 480, 220 236 .yres = 272, 221 - .pixclock = 7833600, 237 + .pixclock = KHZ2PICOS(7833), 222 238 .left_margin = 2, 223 239 .right_margin = 2, 224 240 .upper_margin = 2, ··· 233 249 .name = "SP10Q010", 234 250 .xres = 320, 235 251 .yres = 240, 236 - .pixclock = 7833600, 252 + .pixclock = KHZ2PICOS(7833), 237 253 .left_margin = 10, 238 254 .right_margin = 10, 239 255 .upper_margin = 10, ··· 245 261 }, 246 262 }; 247 263 264 + static bool da8xx_fb_is_raster_enabled(void) 265 + { 266 + return !!(lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE); 267 + } 268 + 248 269 /* Enable the Raster Engine of the LCD Controller */ 249 - static inline void lcd_enable_raster(void) 270 + static void lcd_enable_raster(void) 250 271 { 251 272 u32 reg; 252 273 ··· 273 284 } 274 285 275 286 /* Disable the Raster Engine of the LCD Controller */ 276 - static inline void lcd_disable_raster(bool wait_for_frame_done) 287 + static void lcd_disable_raster(enum da8xx_frame_complete wait_for_frame_done) 277 288 { 278 289 u32 reg; 279 290 int ret; ··· 285 296 /* return if already disabled */ 286 297 return; 287 298 288 - if ((wait_for_frame_done == true) && (lcd_revision == LCD_VERSION_2)) { 299 + if ((wait_for_frame_done == DA8XX_FRAME_WAIT) && 300 + (lcd_revision == LCD_VERSION_2)) { 289 301 frame_done_flag = 0; 290 302 ret = wait_event_interruptible_timeout(frame_done_wq, 291 303 frame_done_flag != 0, ··· 321 331 reg_int = lcdc_read(LCD_INT_ENABLE_SET_REG) | 322 332 LCD_V2_END_OF_FRAME0_INT_ENA | 323 333 LCD_V2_END_OF_FRAME1_INT_ENA | 324 - LCD_FRAME_DONE; 334 + LCD_FRAME_DONE | LCD_SYNC_LOST; 325 335 lcdc_write(reg_int, LCD_INT_ENABLE_SET_REG); 326 336 } 327 337 reg_dma |= LCD_DUAL_FRAME_BUFFER_ENABLE; ··· 407 417 u32 reg; 408 418 409 419 reg = lcdc_read(LCD_RASTER_TIMING_0_REG) & 0xf; 410 - reg |= ((back_porch & 0xff) << 24) 411 - | ((front_porch & 0xff) << 16) 412 - | ((pulse_width & 0x3f) << 10); 420 + reg |= (((back_porch-1) & 0xff) << 24) 421 + | (((front_porch-1) & 0xff) << 16) 422 + | (((pulse_width-1) & 0x3f) << 10); 413 423 lcdc_write(reg, LCD_RASTER_TIMING_0_REG); 424 + 425 + /* 426 + * LCDC Version 2 adds some extra bits that increase the allowable 427 + * size of the horizontal timing registers. 428 + * remember that the registers use 0 to represent 1 so all values 429 + * that get set into register need to be decremented by 1 430 + */ 431 + if (lcd_revision == LCD_VERSION_2) { 432 + /* Mask off the bits we want to change */ 433 + reg = lcdc_read(LCD_RASTER_TIMING_2_REG) & ~0x780000ff; 434 + reg |= ((front_porch-1) & 0x300) >> 8; 435 + reg |= ((back_porch-1) & 0x300) >> 4; 436 + reg |= ((pulse_width-1) & 0x3c0) << 21; 437 + lcdc_write(reg, LCD_RASTER_TIMING_2_REG); 438 + } 414 439 } 415 440 416 441 static void lcd_cfg_vertical_sync(int back_porch, int pulse_width, ··· 436 431 reg = lcdc_read(LCD_RASTER_TIMING_1_REG) & 0x3ff; 437 432 reg |= ((back_porch & 0xff) << 24) 438 433 | ((front_porch & 0xff) << 16) 439 - | ((pulse_width & 0x3f) << 10); 434 + | (((pulse_width-1) & 0x3f) << 10); 440 435 lcdc_write(reg, LCD_RASTER_TIMING_1_REG); 441 436 } 442 437 ··· 493 488 else 494 489 reg &= ~LCD_SYNC_EDGE; 495 490 496 - if (panel->sync & FB_SYNC_HOR_HIGH_ACT) 491 + if ((panel->sync & FB_SYNC_HOR_HIGH_ACT) == 0) 497 492 reg |= LCD_INVERT_LINE_CLOCK; 498 493 else 499 494 reg &= ~LCD_INVERT_LINE_CLOCK; 500 495 501 - if (panel->sync & FB_SYNC_VERT_HIGH_ACT) 496 + if ((panel->sync & FB_SYNC_VERT_HIGH_ACT) == 0) 502 497 reg |= LCD_INVERT_FRAME_CLOCK; 503 498 else 504 499 reg &= ~LCD_INVERT_FRAME_CLOCK; ··· 570 565 break; 571 566 case 24: 572 567 reg |= LCD_V2_TFT_24BPP_MODE; 568 + break; 573 569 case 32: 570 + reg |= LCD_V2_TFT_24BPP_MODE; 574 571 reg |= LCD_V2_TFT_24BPP_UNPACK; 575 572 break; 576 - 577 573 case 8: 578 574 par->palette_sz = 256 * 2; 579 575 break; ··· 687 681 } 688 682 #undef CNVT_TOHW 689 683 690 - static void lcd_reset(struct da8xx_fb_par *par) 684 + static void da8xx_fb_lcd_reset(void) 691 685 { 692 - /* Disable the Raster if previously Enabled */ 693 - lcd_disable_raster(false); 694 - 695 686 /* DMA has to be disabled */ 696 687 lcdc_write(0, LCD_DMA_CTRL_REG); 697 688 lcdc_write(0, LCD_RASTER_CTRL_REG); ··· 701 698 } 702 699 } 703 700 704 - static void lcd_calc_clk_divider(struct da8xx_fb_par *par) 701 + static int da8xx_fb_config_clk_divider(struct da8xx_fb_par *par, 702 + unsigned lcdc_clk_div, 703 + unsigned lcdc_clk_rate) 705 704 { 706 - unsigned int lcd_clk, div; 705 + int ret; 707 706 708 - lcd_clk = clk_get_rate(par->lcdc_clk); 709 - div = lcd_clk / par->pxl_clk; 707 + if (par->lcdc_clk_rate != lcdc_clk_rate) { 708 + ret = clk_set_rate(par->lcdc_clk, lcdc_clk_rate); 709 + if (IS_ERR_VALUE(ret)) { 710 + dev_err(par->dev, 711 + "unable to set clock rate at %u\n", 712 + lcdc_clk_rate); 713 + return ret; 714 + } 715 + par->lcdc_clk_rate = clk_get_rate(par->lcdc_clk); 716 + } 710 717 711 718 /* Configure the LCD clock divisor. */ 712 - lcdc_write(LCD_CLK_DIVISOR(div) | 719 + lcdc_write(LCD_CLK_DIVISOR(lcdc_clk_div) | 713 720 (LCD_RASTER_MODE & 0x1), LCD_CTRL_REG); 714 721 715 722 if (lcd_revision == LCD_VERSION_2) 716 723 lcdc_write(LCD_V2_DMA_CLK_EN | LCD_V2_LIDD_CLK_EN | 717 724 LCD_V2_CORE_CLK_EN, LCD_CLK_ENABLE_REG); 718 725 726 + return 0; 727 + } 728 + 729 + static unsigned int da8xx_fb_calc_clk_divider(struct da8xx_fb_par *par, 730 + unsigned pixclock, 731 + unsigned *lcdc_clk_rate) 732 + { 733 + unsigned lcdc_clk_div; 734 + 735 + pixclock = PICOS2KHZ(pixclock) * 1000; 736 + 737 + *lcdc_clk_rate = par->lcdc_clk_rate; 738 + 739 + if (pixclock < (*lcdc_clk_rate / CLK_MAX_DIV)) { 740 + *lcdc_clk_rate = clk_round_rate(par->lcdc_clk, 741 + pixclock * CLK_MAX_DIV); 742 + lcdc_clk_div = CLK_MAX_DIV; 743 + } else if (pixclock > (*lcdc_clk_rate / CLK_MIN_DIV)) { 744 + *lcdc_clk_rate = clk_round_rate(par->lcdc_clk, 745 + pixclock * CLK_MIN_DIV); 746 + lcdc_clk_div = CLK_MIN_DIV; 747 + } else { 748 + lcdc_clk_div = *lcdc_clk_rate / pixclock; 749 + } 750 + 751 + return lcdc_clk_div; 752 + } 753 + 754 + static int da8xx_fb_calc_config_clk_divider(struct da8xx_fb_par *par, 755 + struct fb_videomode *mode) 756 + { 757 + unsigned lcdc_clk_rate; 758 + unsigned lcdc_clk_div = da8xx_fb_calc_clk_divider(par, mode->pixclock, 759 + &lcdc_clk_rate); 760 + 761 + return da8xx_fb_config_clk_divider(par, lcdc_clk_div, lcdc_clk_rate); 762 + } 763 + 764 + static unsigned da8xx_fb_round_clk(struct da8xx_fb_par *par, 765 + unsigned pixclock) 766 + { 767 + unsigned lcdc_clk_div, lcdc_clk_rate; 768 + 769 + lcdc_clk_div = da8xx_fb_calc_clk_divider(par, pixclock, &lcdc_clk_rate); 770 + return KHZ2PICOS(lcdc_clk_rate / (1000 * lcdc_clk_div)); 719 771 } 720 772 721 773 static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, ··· 779 721 u32 bpp; 780 722 int ret = 0; 781 723 782 - lcd_reset(par); 783 - 784 - /* Calculate the divider */ 785 - lcd_calc_clk_divider(par); 724 + ret = da8xx_fb_calc_config_clk_divider(par, panel); 725 + if (IS_ERR_VALUE(ret)) { 726 + dev_err(par->dev, "unable to configure clock\n"); 727 + return ret; 728 + } 786 729 787 730 if (panel->sync & FB_SYNC_CLK_INVERT) 788 731 lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) | ··· 798 739 return ret; 799 740 800 741 /* Configure the vertical and horizontal sync properties. */ 801 - lcd_cfg_vertical_sync(panel->lower_margin, panel->vsync_len, 802 - panel->upper_margin); 803 - lcd_cfg_horizontal_sync(panel->right_margin, panel->hsync_len, 804 - panel->left_margin); 742 + lcd_cfg_vertical_sync(panel->upper_margin, panel->vsync_len, 743 + panel->lower_margin); 744 + lcd_cfg_horizontal_sync(panel->left_margin, panel->hsync_len, 745 + panel->right_margin); 805 746 806 747 /* Configure for disply */ 807 748 ret = lcd_cfg_display(cfg, panel); ··· 832 773 u32 stat = lcdc_read(LCD_MASKED_STAT_REG); 833 774 834 775 if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) { 835 - lcd_disable_raster(false); 776 + lcd_disable_raster(DA8XX_FRAME_NOWAIT); 836 777 lcdc_write(stat, LCD_MASKED_STAT_REG); 837 778 lcd_enable_raster(); 838 779 } else if (stat & LCD_PL_LOAD_DONE) { ··· 842 783 * interrupt via the following write to the status register. If 843 784 * this is done after then one gets multiple PL done interrupts. 844 785 */ 845 - lcd_disable_raster(false); 786 + lcd_disable_raster(DA8XX_FRAME_NOWAIT); 846 787 847 788 lcdc_write(stat, LCD_MASKED_STAT_REG); 848 789 ··· 895 836 u32 reg_ras; 896 837 897 838 if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) { 898 - lcd_disable_raster(false); 839 + lcd_disable_raster(DA8XX_FRAME_NOWAIT); 899 840 lcdc_write(stat, LCD_STAT_REG); 900 841 lcd_enable_raster(); 901 842 } else if (stat & LCD_PL_LOAD_DONE) { ··· 905 846 * interrupt via the following write to the status register. If 906 847 * this is done after then one gets multiple PL done interrupts. 907 848 */ 908 - lcd_disable_raster(false); 849 + lcd_disable_raster(DA8XX_FRAME_NOWAIT); 909 850 910 851 lcdc_write(stat, LCD_STAT_REG); 911 852 ··· 947 888 struct fb_info *info) 948 889 { 949 890 int err = 0; 891 + struct da8xx_fb_par *par = info->par; 892 + int bpp = var->bits_per_pixel >> 3; 893 + unsigned long line_size = var->xres_virtual * bpp; 950 894 951 895 if (var->bits_per_pixel > 16 && lcd_revision == LCD_VERSION_1) 952 896 return -EINVAL; ··· 1017 955 var->green.msb_right = 0; 1018 956 var->blue.msb_right = 0; 1019 957 var->transp.msb_right = 0; 958 + 959 + if (line_size * var->yres_virtual > par->vram_size) 960 + var->yres_virtual = par->vram_size / line_size; 961 + 962 + if (var->yres > var->yres_virtual) 963 + var->yres = var->yres_virtual; 964 + 965 + if (var->xres > var->xres_virtual) 966 + var->xres = var->xres_virtual; 967 + 968 + if (var->xres + var->xoffset > var->xres_virtual) 969 + var->xoffset = var->xres_virtual - var->xres; 970 + if (var->yres + var->yoffset > var->yres_virtual) 971 + var->yoffset = var->yres_virtual - var->yres; 972 + 973 + var->pixclock = da8xx_fb_round_clk(par, var->pixclock); 974 + 1020 975 return err; 1021 976 } 1022 977 ··· 1045 966 1046 967 par = container_of(nb, struct da8xx_fb_par, freq_transition); 1047 968 if (val == CPUFREQ_POSTCHANGE) { 1048 - if (par->lcd_fck_rate != clk_get_rate(par->lcdc_clk)) { 1049 - par->lcd_fck_rate = clk_get_rate(par->lcdc_clk); 1050 - lcd_disable_raster(true); 1051 - lcd_calc_clk_divider(par); 969 + if (par->lcdc_clk_rate != clk_get_rate(par->lcdc_clk)) { 970 + par->lcdc_clk_rate = clk_get_rate(par->lcdc_clk); 971 + lcd_disable_raster(DA8XX_FRAME_WAIT); 972 + da8xx_fb_calc_config_clk_divider(par, &par->mode); 1052 973 if (par->blank == FB_BLANK_UNBLANK) 1053 974 lcd_enable_raster(); 1054 975 } ··· 1057 978 return 0; 1058 979 } 1059 980 1060 - static inline int lcd_da8xx_cpufreq_register(struct da8xx_fb_par *par) 981 + static int lcd_da8xx_cpufreq_register(struct da8xx_fb_par *par) 1061 982 { 1062 983 par->freq_transition.notifier_call = lcd_da8xx_cpufreq_transition; 1063 984 ··· 1065 986 CPUFREQ_TRANSITION_NOTIFIER); 1066 987 } 1067 988 1068 - static inline void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par) 989 + static void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par) 1069 990 { 1070 991 cpufreq_unregister_notifier(&par->freq_transition, 1071 992 CPUFREQ_TRANSITION_NOTIFIER); ··· 1085 1006 if (par->panel_power_ctrl) 1086 1007 par->panel_power_ctrl(0); 1087 1008 1088 - lcd_disable_raster(true); 1009 + lcd_disable_raster(DA8XX_FRAME_WAIT); 1089 1010 lcdc_write(0, LCD_RASTER_CTRL_REG); 1090 1011 1091 1012 /* disable DMA */ ··· 1097 1018 par->p_palette_base); 1098 1019 dma_free_coherent(NULL, par->vram_size, par->vram_virt, 1099 1020 par->vram_phys); 1100 - free_irq(par->irq, par); 1101 1021 pm_runtime_put_sync(&dev->dev); 1102 1022 pm_runtime_disable(&dev->dev); 1103 1023 framebuffer_release(info); 1104 - iounmap(da8xx_fb_reg_base); 1105 - release_mem_region(lcdc_regs->start, resource_size(lcdc_regs)); 1106 1024 1107 1025 } 1108 1026 return 0; ··· 1198 1122 if (par->panel_power_ctrl) 1199 1123 par->panel_power_ctrl(0); 1200 1124 1201 - lcd_disable_raster(true); 1125 + lcd_disable_raster(DA8XX_FRAME_WAIT); 1202 1126 break; 1203 1127 default: 1204 1128 ret = -EINVAL; ··· 1259 1183 return ret; 1260 1184 } 1261 1185 1186 + static int da8xxfb_set_par(struct fb_info *info) 1187 + { 1188 + struct da8xx_fb_par *par = info->par; 1189 + int ret; 1190 + bool raster = da8xx_fb_is_raster_enabled(); 1191 + 1192 + if (raster) 1193 + lcd_disable_raster(DA8XX_FRAME_WAIT); 1194 + 1195 + fb_var_to_videomode(&par->mode, &info->var); 1196 + 1197 + par->cfg.bpp = info->var.bits_per_pixel; 1198 + 1199 + info->fix.visual = (par->cfg.bpp <= 8) ? 1200 + FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; 1201 + info->fix.line_length = (par->mode.xres * par->cfg.bpp) / 8; 1202 + 1203 + ret = lcd_init(par, &par->cfg, &par->mode); 1204 + if (ret < 0) { 1205 + dev_err(par->dev, "lcd init failed\n"); 1206 + return ret; 1207 + } 1208 + 1209 + par->dma_start = info->fix.smem_start + 1210 + info->var.yoffset * info->fix.line_length + 1211 + info->var.xoffset * info->var.bits_per_pixel / 8; 1212 + par->dma_end = par->dma_start + 1213 + info->var.yres * info->fix.line_length - 1; 1214 + 1215 + lcdc_write(par->dma_start, LCD_DMA_FRM_BUF_BASE_ADDR_0_REG); 1216 + lcdc_write(par->dma_end, LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG); 1217 + lcdc_write(par->dma_start, LCD_DMA_FRM_BUF_BASE_ADDR_1_REG); 1218 + lcdc_write(par->dma_end, LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG); 1219 + 1220 + if (raster) 1221 + lcd_enable_raster(); 1222 + 1223 + return 0; 1224 + } 1225 + 1262 1226 static struct fb_ops da8xx_fb_ops = { 1263 1227 .owner = THIS_MODULE, 1264 1228 .fb_check_var = fb_check_var, 1229 + .fb_set_par = da8xxfb_set_par, 1265 1230 .fb_setcolreg = fb_setcolreg, 1266 1231 .fb_pan_display = da8xx_pan_display, 1267 1232 .fb_ioctl = fb_ioctl, ··· 1312 1195 .fb_blank = cfb_blank, 1313 1196 }; 1314 1197 1315 - /* Calculate and return pixel clock period in pico seconds */ 1316 - static unsigned int da8xxfb_pixel_clk_period(struct da8xx_fb_par *par) 1198 + static struct fb_videomode *da8xx_fb_get_videomode(struct platform_device *dev) 1317 1199 { 1318 - unsigned int lcd_clk, div; 1319 - unsigned int configured_pix_clk; 1320 - unsigned long long pix_clk_period_picosec = 1000000000000ULL; 1200 + struct da8xx_lcdc_platform_data *fb_pdata = dev->dev.platform_data; 1201 + struct fb_videomode *lcdc_info; 1202 + int i; 1321 1203 1322 - lcd_clk = clk_get_rate(par->lcdc_clk); 1323 - div = lcd_clk / par->pxl_clk; 1324 - configured_pix_clk = (lcd_clk / div); 1204 + for (i = 0, lcdc_info = known_lcd_panels; 1205 + i < ARRAY_SIZE(known_lcd_panels); i++, lcdc_info++) { 1206 + if (strcmp(fb_pdata->type, lcdc_info->name) == 0) 1207 + break; 1208 + } 1325 1209 1326 - do_div(pix_clk_period_picosec, configured_pix_clk); 1210 + if (i == ARRAY_SIZE(known_lcd_panels)) { 1211 + dev_err(&dev->dev, "no panel found\n"); 1212 + return NULL; 1213 + } 1214 + dev_info(&dev->dev, "found %s panel\n", lcdc_info->name); 1327 1215 1328 - return pix_clk_period_picosec; 1216 + return lcdc_info; 1329 1217 } 1330 1218 1331 1219 static int fb_probe(struct platform_device *device) 1332 1220 { 1333 1221 struct da8xx_lcdc_platform_data *fb_pdata = 1334 1222 device->dev.platform_data; 1223 + static struct resource *lcdc_regs; 1335 1224 struct lcd_ctrl_config *lcd_cfg; 1336 1225 struct fb_videomode *lcdc_info; 1337 1226 struct fb_info *da8xx_fb_info; 1338 - struct clk *fb_clk = NULL; 1339 1227 struct da8xx_fb_par *par; 1340 - resource_size_t len; 1341 - int ret, i; 1228 + struct clk *tmp_lcdc_clk; 1229 + int ret; 1342 1230 unsigned long ulcm; 1343 1231 1344 1232 if (fb_pdata == NULL) { ··· 1351 1229 return -ENOENT; 1352 1230 } 1353 1231 1232 + lcdc_info = da8xx_fb_get_videomode(device); 1233 + if (lcdc_info == NULL) 1234 + return -ENODEV; 1235 + 1354 1236 lcdc_regs = platform_get_resource(device, IORESOURCE_MEM, 0); 1355 - if (!lcdc_regs) { 1356 - dev_err(&device->dev, 1357 - "Can not get memory resource for LCD controller\n"); 1358 - return -ENOENT; 1359 - } 1237 + da8xx_fb_reg_base = devm_ioremap_resource(&device->dev, lcdc_regs); 1238 + if (IS_ERR(da8xx_fb_reg_base)) 1239 + return PTR_ERR(da8xx_fb_reg_base); 1360 1240 1361 - len = resource_size(lcdc_regs); 1362 - 1363 - lcdc_regs = request_mem_region(lcdc_regs->start, len, lcdc_regs->name); 1364 - if (!lcdc_regs) 1365 - return -EBUSY; 1366 - 1367 - da8xx_fb_reg_base = ioremap(lcdc_regs->start, len); 1368 - if (!da8xx_fb_reg_base) { 1369 - ret = -EBUSY; 1370 - goto err_request_mem; 1371 - } 1372 - 1373 - fb_clk = clk_get(&device->dev, "fck"); 1374 - if (IS_ERR(fb_clk)) { 1241 + tmp_lcdc_clk = devm_clk_get(&device->dev, "fck"); 1242 + if (IS_ERR(tmp_lcdc_clk)) { 1375 1243 dev_err(&device->dev, "Can not get device clock\n"); 1376 - ret = -ENODEV; 1377 - goto err_ioremap; 1244 + return PTR_ERR(tmp_lcdc_clk); 1378 1245 } 1379 1246 1380 1247 pm_runtime_enable(&device->dev); ··· 1386 1275 break; 1387 1276 } 1388 1277 1389 - for (i = 0, lcdc_info = known_lcd_panels; 1390 - i < ARRAY_SIZE(known_lcd_panels); 1391 - i++, lcdc_info++) { 1392 - if (strcmp(fb_pdata->type, lcdc_info->name) == 0) 1393 - break; 1394 - } 1395 - 1396 - if (i == ARRAY_SIZE(known_lcd_panels)) { 1397 - dev_err(&device->dev, "GLCD: No valid panel found\n"); 1398 - ret = -ENODEV; 1399 - goto err_pm_runtime_disable; 1400 - } else 1401 - dev_info(&device->dev, "GLCD: Found %s panel\n", 1402 - fb_pdata->type); 1403 - 1404 1278 lcd_cfg = (struct lcd_ctrl_config *)fb_pdata->controller_data; 1279 + 1280 + if (!lcd_cfg) { 1281 + ret = -EINVAL; 1282 + goto err_pm_runtime_disable; 1283 + } 1405 1284 1406 1285 da8xx_fb_info = framebuffer_alloc(sizeof(struct da8xx_fb_par), 1407 1286 &device->dev); ··· 1402 1301 } 1403 1302 1404 1303 par = da8xx_fb_info->par; 1405 - par->lcdc_clk = fb_clk; 1406 - #ifdef CONFIG_CPU_FREQ 1407 - par->lcd_fck_rate = clk_get_rate(fb_clk); 1408 - #endif 1409 - par->pxl_clk = lcdc_info->pixclock; 1304 + par->dev = &device->dev; 1305 + par->lcdc_clk = tmp_lcdc_clk; 1306 + par->lcdc_clk_rate = clk_get_rate(par->lcdc_clk); 1410 1307 if (fb_pdata->panel_power_ctrl) { 1411 1308 par->panel_power_ctrl = fb_pdata->panel_power_ctrl; 1412 1309 par->panel_power_ctrl(1); 1413 1310 } 1414 1311 1415 - if (lcd_init(par, lcd_cfg, lcdc_info) < 0) { 1416 - dev_err(&device->dev, "lcd_init failed\n"); 1417 - ret = -EFAULT; 1418 - goto err_release_fb; 1419 - } 1312 + fb_videomode_to_var(&da8xx_fb_var, lcdc_info); 1313 + par->cfg = *lcd_cfg; 1314 + 1315 + da8xx_fb_lcd_reset(); 1420 1316 1421 1317 /* allocate frame buffer */ 1422 1318 par->vram_size = lcdc_info->xres * lcdc_info->yres * lcd_cfg->bpp; ··· 1461 1363 goto err_release_pl_mem; 1462 1364 } 1463 1365 1464 - /* Initialize par */ 1465 - da8xx_fb_info->var.bits_per_pixel = lcd_cfg->bpp; 1466 - 1467 - da8xx_fb_var.xres = lcdc_info->xres; 1468 - da8xx_fb_var.xres_virtual = lcdc_info->xres; 1469 - 1470 - da8xx_fb_var.yres = lcdc_info->yres; 1471 - da8xx_fb_var.yres_virtual = lcdc_info->yres * LCD_NUM_BUFFERS; 1472 - 1473 1366 da8xx_fb_var.grayscale = 1474 1367 lcd_cfg->panel_shade == MONOCHROME ? 1 : 0; 1475 1368 da8xx_fb_var.bits_per_pixel = lcd_cfg->bpp; 1476 - 1477 - da8xx_fb_var.hsync_len = lcdc_info->hsync_len; 1478 - da8xx_fb_var.vsync_len = lcdc_info->vsync_len; 1479 - da8xx_fb_var.right_margin = lcdc_info->right_margin; 1480 - da8xx_fb_var.left_margin = lcdc_info->left_margin; 1481 - da8xx_fb_var.lower_margin = lcdc_info->lower_margin; 1482 - da8xx_fb_var.upper_margin = lcdc_info->upper_margin; 1483 - da8xx_fb_var.pixclock = da8xxfb_pixel_clk_period(par); 1484 1369 1485 1370 /* Initialize fbinfo */ 1486 1371 da8xx_fb_info->flags = FBINFO_FLAG_DEFAULT; ··· 1514 1433 lcdc_irq_handler = lcdc_irq_handler_rev02; 1515 1434 } 1516 1435 1517 - ret = request_irq(par->irq, lcdc_irq_handler, 0, 1518 - DRIVER_NAME, par); 1436 + ret = devm_request_irq(&device->dev, par->irq, lcdc_irq_handler, 0, 1437 + DRIVER_NAME, par); 1519 1438 if (ret) 1520 1439 goto irq_freq; 1521 1440 return 0; ··· 1543 1462 err_pm_runtime_disable: 1544 1463 pm_runtime_put_sync(&device->dev); 1545 1464 pm_runtime_disable(&device->dev); 1546 - 1547 - err_ioremap: 1548 - iounmap(da8xx_fb_reg_base); 1549 - 1550 - err_request_mem: 1551 - release_mem_region(lcdc_regs->start, len); 1552 1465 1553 1466 return ret; 1554 1467 } ··· 1621 1546 par->panel_power_ctrl(0); 1622 1547 1623 1548 fb_set_suspend(info, 1); 1624 - lcd_disable_raster(true); 1549 + lcd_disable_raster(DA8XX_FRAME_WAIT); 1625 1550 lcd_context_save(); 1626 1551 pm_runtime_put_sync(&dev->dev); 1627 1552 console_unlock();
+1
drivers/video/efifb.c
··· 72 72 if (request_mem_succeeded) 73 73 release_mem_region(info->apertures->ranges[0].base, 74 74 info->apertures->ranges[0].size); 75 + fb_dealloc_cmap(&info->cmap); 75 76 framebuffer_release(info); 76 77 } 77 78
+1
drivers/video/exynos/exynos_mipi_dsi_lowlevel.c
··· 27 27 #include <video/exynos_mipi_dsim.h> 28 28 29 29 #include "exynos_mipi_dsi_regs.h" 30 + #include "exynos_mipi_dsi_lowlevel.h" 30 31 31 32 void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim) 32 33 {
+1 -6
drivers/video/fbcmap.c
··· 285 285 rc = -ENODEV; 286 286 goto out; 287 287 } 288 - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && 289 - !info->fbops->fb_setcmap)) { 290 - rc = -EINVAL; 291 - goto out1; 292 - } 288 + 293 289 rc = fb_set_cmap(&umap, info); 294 - out1: 295 290 unlock_fb_info(info); 296 291 out: 297 292 fb_dealloc_cmap(&umap);
+13 -16
drivers/video/fbmem.c
··· 43 43 #define FBPIXMAPSIZE (1024 * 8) 44 44 45 45 static DEFINE_MUTEX(registration_lock); 46 + 46 47 struct fb_info *registered_fb[FB_MAX] __read_mostly; 48 + EXPORT_SYMBOL(registered_fb); 49 + 47 50 int num_registered_fb __read_mostly; 51 + EXPORT_SYMBOL(num_registered_fb); 48 52 49 53 static struct fb_info *get_fb_info(unsigned int idx) 50 54 { ··· 186 182 187 183 return addr; 188 184 } 185 + EXPORT_SYMBOL(fb_get_buffer_offset); 189 186 190 187 #ifdef CONFIG_LOGO 191 188 ··· 674 669 int fb_prepare_logo(struct fb_info *info, int rotate) { return 0; } 675 670 int fb_show_logo(struct fb_info *info, int rotate) { return 0; } 676 671 #endif /* CONFIG_LOGO */ 672 + EXPORT_SYMBOL(fb_show_logo); 677 673 678 674 static void *fb_seq_start(struct seq_file *m, loff_t *pos) 679 675 { ··· 915 909 info->var.vmode &= ~FB_VMODE_YWRAP; 916 910 return 0; 917 911 } 912 + EXPORT_SYMBOL(fb_pan_display); 918 913 919 914 static int fb_check_caps(struct fb_info *info, struct fb_var_screeninfo *var, 920 915 u32 activate) ··· 1049 1042 done: 1050 1043 return ret; 1051 1044 } 1045 + EXPORT_SYMBOL(fb_set_var); 1052 1046 1053 1047 int 1054 1048 fb_blank(struct fb_info *info, int blank) ··· 1081 1073 1082 1074 return ret; 1083 1075 } 1076 + EXPORT_SYMBOL(fb_blank); 1084 1077 1085 1078 static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, 1086 1079 unsigned long arg) ··· 1754 1745 1755 1746 return ret; 1756 1747 } 1748 + EXPORT_SYMBOL(register_framebuffer); 1757 1749 1758 1750 /** 1759 1751 * unregister_framebuffer - releases a frame buffer device ··· 1783 1773 1784 1774 return ret; 1785 1775 } 1776 + EXPORT_SYMBOL(unregister_framebuffer); 1786 1777 1787 1778 /** 1788 1779 * fb_set_suspend - low level driver signals suspend ··· 1807 1796 fb_notifier_call_chain(FB_EVENT_RESUME, &event); 1808 1797 } 1809 1798 } 1799 + EXPORT_SYMBOL(fb_set_suspend); 1810 1800 1811 1801 /** 1812 1802 * fbmem_init - init frame buffer subsystem ··· 1924 1912 1925 1913 return retval; 1926 1914 } 1915 + EXPORT_SYMBOL(fb_get_options); 1927 1916 1928 1917 #ifndef MODULE 1929 1918 /** ··· 1971 1958 } 1972 1959 __setup("video=", video_setup); 1973 1960 #endif 1974 - 1975 - /* 1976 - * Visible symbols for modules 1977 - */ 1978 - 1979 - EXPORT_SYMBOL(register_framebuffer); 1980 - EXPORT_SYMBOL(unregister_framebuffer); 1981 - EXPORT_SYMBOL(num_registered_fb); 1982 - EXPORT_SYMBOL(registered_fb); 1983 - EXPORT_SYMBOL(fb_show_logo); 1984 - EXPORT_SYMBOL(fb_set_var); 1985 - EXPORT_SYMBOL(fb_blank); 1986 - EXPORT_SYMBOL(fb_pan_display); 1987 - EXPORT_SYMBOL(fb_get_buffer_offset); 1988 - EXPORT_SYMBOL(fb_set_suspend); 1989 - EXPORT_SYMBOL(fb_get_options); 1990 1961 1991 1962 MODULE_LICENSE("GPL");
+1 -2
drivers/video/matrox/matroxfb_base.c
··· 2029 2029 return -1; 2030 2030 } 2031 2031 2032 - minfo = kmalloc(sizeof(*minfo), GFP_KERNEL); 2032 + minfo = kzalloc(sizeof(*minfo), GFP_KERNEL); 2033 2033 if (!minfo) 2034 2034 return -1; 2035 - memset(minfo, 0, sizeof(*minfo)); 2036 2035 2037 2036 minfo->pcidev = pdev; 2038 2037 minfo->dead = 0;
+1 -14
drivers/video/mxsfb.c
··· 46 46 #include <linux/clk.h> 47 47 #include <linux/dma-mapping.h> 48 48 #include <linux/io.h> 49 - #include <linux/pinctrl/consumer.h> 50 49 #include <linux/fb.h> 51 50 #include <linux/regulator/consumer.h> 52 51 #include <video/of_display_timing.h> ··· 850 851 struct mxsfb_info *host; 851 852 struct fb_info *fb_info; 852 853 struct fb_modelist *modelist; 853 - struct pinctrl *pinctrl; 854 854 int ret; 855 855 856 856 if (of_id) 857 857 pdev->id_entry = of_id->data; 858 - 859 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 860 - if (!res) { 861 - dev_err(&pdev->dev, "Cannot get memory IO resource\n"); 862 - return -ENODEV; 863 - } 864 858 865 859 fb_info = framebuffer_alloc(sizeof(struct mxsfb_info), &pdev->dev); 866 860 if (!fb_info) { ··· 863 871 864 872 host = to_imxfb_host(fb_info); 865 873 874 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 866 875 host->base = devm_ioremap_resource(&pdev->dev, res); 867 876 if (IS_ERR(host->base)) { 868 877 ret = PTR_ERR(host->base); ··· 874 881 platform_set_drvdata(pdev, host); 875 882 876 883 host->devdata = &mxsfb_devdata[pdev->id_entry->driver_data]; 877 - 878 - pinctrl = devm_pinctrl_get_select_default(&pdev->dev); 879 - if (IS_ERR(pinctrl)) { 880 - ret = PTR_ERR(pinctrl); 881 - goto fb_release; 882 - } 883 884 884 885 host->clk = devm_clk_get(&host->pdev->dev, NULL); 885 886 if (IS_ERR(host->clk)) {
+3 -2
drivers/video/omap2/dss/hdmi.c
··· 612 612 hdmi.ip_data.cfg.cm = cm; 613 613 614 614 t = hdmi_get_timings(); 615 - if (t != NULL) 615 + if (t != NULL) { 616 616 hdmi.ip_data.cfg = *t; 617 617 618 - dispc_set_tv_pclk(t->timings.pixel_clock * 1000); 618 + dispc_set_tv_pclk(t->timings.pixel_clock * 1000); 619 + } 619 620 620 621 mutex_unlock(&hdmi.lock); 621 622 }
+5 -3
drivers/video/omap2/dss/manager-sysfs.c
··· 285 285 { 286 286 struct omap_overlay_manager_info info; 287 287 288 - mgr->get_manager_info(mgr, &info); 288 + if(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) 289 + return -ENODEV; 289 290 290 - WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)); 291 + mgr->get_manager_info(mgr, &info); 291 292 292 293 return snprintf(buf, PAGE_SIZE, "%d\n", 293 294 info.partial_alpha_enabled); ··· 302 301 bool enable; 303 302 int r; 304 303 305 - WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)); 304 + if(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) 305 + return -ENODEV; 306 306 307 307 r = strtobool(buf, &enable); 308 308 if (r)
+20 -22
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
··· 779 779 struct omap_video_timings video_timing; 780 780 struct hdmi_video_format video_format; 781 781 /* HDMI core */ 782 - struct hdmi_core_infoframe_avi avi_cfg = ip_data->avi_cfg; 782 + struct hdmi_core_infoframe_avi *avi_cfg = &ip_data->avi_cfg; 783 783 struct hdmi_core_video_config v_core_cfg; 784 784 struct hdmi_core_packet_enable_repeat repeat_cfg; 785 785 struct hdmi_config *cfg = &ip_data->cfg; 786 786 787 787 hdmi_wp_init(&video_timing, &video_format); 788 788 789 - hdmi_core_init(&v_core_cfg, 790 - &avi_cfg, 791 - &repeat_cfg); 789 + hdmi_core_init(&v_core_cfg, avi_cfg, &repeat_cfg); 792 790 793 791 hdmi_wp_video_init_format(&video_format, &video_timing, cfg); 794 792 ··· 820 822 * configure packet 821 823 * info frame video see doc CEA861-D page 65 822 824 */ 823 - avi_cfg.db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB; 824 - avi_cfg.db1_active_info = 825 - HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF; 826 - avi_cfg.db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO; 827 - avi_cfg.db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0; 828 - avi_cfg.db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO; 829 - avi_cfg.db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO; 830 - avi_cfg.db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME; 831 - avi_cfg.db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO; 832 - avi_cfg.db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601; 833 - avi_cfg.db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT; 834 - avi_cfg.db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO; 835 - avi_cfg.db4_videocode = cfg->cm.code; 836 - avi_cfg.db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO; 837 - avi_cfg.db6_7_line_eoftop = 0; 838 - avi_cfg.db8_9_line_sofbottom = 0; 839 - avi_cfg.db10_11_pixel_eofleft = 0; 840 - avi_cfg.db12_13_pixel_sofright = 0; 825 + avi_cfg->db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB; 826 + avi_cfg->db1_active_info = 827 + HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF; 828 + avi_cfg->db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO; 829 + avi_cfg->db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0; 830 + avi_cfg->db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO; 831 + avi_cfg->db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO; 832 + avi_cfg->db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME; 833 + avi_cfg->db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO; 834 + avi_cfg->db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601; 835 + avi_cfg->db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT; 836 + avi_cfg->db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO; 837 + avi_cfg->db4_videocode = cfg->cm.code; 838 + avi_cfg->db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO; 839 + avi_cfg->db6_7_line_eoftop = 0; 840 + avi_cfg->db8_9_line_sofbottom = 0; 841 + avi_cfg->db10_11_pixel_eofleft = 0; 842 + avi_cfg->db12_13_pixel_sofright = 0; 841 843 842 844 hdmi_core_aux_infoframe_avi_config(ip_data); 843 845
+10 -10
drivers/video/output.c
··· 32 32 MODULE_LICENSE("GPL"); 33 33 MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); 34 34 35 - static ssize_t video_output_show_state(struct device *dev, 36 - struct device_attribute *attr, char *buf) 35 + static ssize_t state_show(struct device *dev, struct device_attribute *attr, 36 + char *buf) 37 37 { 38 38 ssize_t ret_size = 0; 39 39 struct output_device *od = to_output_device(dev); ··· 42 42 return ret_size; 43 43 } 44 44 45 - static ssize_t video_output_store_state(struct device *dev, 46 - struct device_attribute *attr, 47 - const char *buf,size_t count) 45 + static ssize_t state_store(struct device *dev, struct device_attribute *attr, 46 + const char *buf,size_t count) 48 47 { 49 48 char *endp; 50 49 struct output_device *od = to_output_device(dev); ··· 61 62 } 62 63 return count; 63 64 } 65 + static DEVICE_ATTR_RW(state); 64 66 65 67 static void video_output_release(struct device *dev) 66 68 { ··· 69 69 kfree(od); 70 70 } 71 71 72 - static struct device_attribute video_output_attributes[] = { 73 - __ATTR(state, 0644, video_output_show_state, video_output_store_state), 74 - __ATTR_NULL, 72 + static struct attribute *video_output_attrs[] = { 73 + &dev_attr_state.attr, 74 + NULL, 75 75 }; 76 - 76 + ATTRIBUTE_GROUPS(video_output); 77 77 78 78 static struct class video_output_class = { 79 79 .name = "video_output", 80 80 .dev_release = video_output_release, 81 - .dev_attrs = video_output_attributes, 81 + .dev_groups = video_output_groups, 82 82 }; 83 83 84 84 struct output_device *video_output_register(const char *name,
+4 -4
drivers/video/xilinxfb.c
··· 259 259 struct resource *res; 260 260 261 261 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 262 - drvdata->regs_phys = res->start; 263 - drvdata->regs = devm_request_and_ioremap(&pdev->dev, res); 264 - if (!drvdata->regs) { 265 - rc = -EADDRNOTAVAIL; 262 + drvdata->regs = devm_ioremap_resource(&pdev->dev, res); 263 + if (IS_ERR(drvdata->regs)) { 264 + rc = PTR_ERR(drvdata->regs); 266 265 goto err_region; 267 266 } 267 + drvdata->regs_phys = res->start; 268 268 } 269 269 270 270 /* Allocate the framebuffer memory */
+1
include/linux/platform_data/simplefb.h
··· 25 25 { "r8g8b8", 24, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_RGB888 }, \ 26 26 { "x8r8g8b8", 32, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_XRGB8888 }, \ 27 27 { "a8r8g8b8", 32, {16, 8}, {8, 8}, {0, 8}, {24, 8}, DRM_FORMAT_ARGB8888 }, \ 28 + { "a8b8g8r8", 32, {0, 8}, {8, 8}, {16, 8}, {24, 8}, DRM_FORMAT_ABGR8888 }, \ 28 29 { "x2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {0, 0}, DRM_FORMAT_XRGB2101010 }, \ 29 30 { "a2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {30, 2}, DRM_FORMAT_ARGB2101010 }, \ 30 31 }
+5
include/video/da8xx-fb.h
··· 23 23 LOAD_PALETTE, 24 24 }; 25 25 26 + enum da8xx_frame_complete { 27 + DA8XX_FRAME_WAIT, 28 + DA8XX_FRAME_NOWAIT, 29 + }; 30 + 26 31 struct da8xx_lcdc_platform_data { 27 32 const char manu_name[10]; 28 33 void *controller_data;