mx53ppd_video.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2017 General Electric Company
  4. *
  5. * Based on board/freescale/mx53loco/mx53loco_video.c:
  6. *
  7. * Copyright (C) 2012 Freescale Semiconductor, Inc.
  8. * Fabio Estevam <fabio.estevam@freescale.com>
  9. */
  10. #include <common.h>
  11. #include <dm.h>
  12. #include <linux/list.h>
  13. #include <asm/arch/iomux-mx53.h>
  14. #include <asm/mach-imx/video.h>
  15. #include <linux/fb.h>
  16. #include <ipu_pixfmt.h>
  17. #include <asm/arch/crm_regs.h>
  18. #include <asm/arch/imx-regs.h>
  19. #include <asm/io.h>
  20. #include <panel.h>
  21. static int detect_lcd(struct display_info_t const *dev)
  22. {
  23. return 1;
  24. }
  25. static void lcd_enable(void)
  26. {
  27. struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
  28. struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
  29. /* Set LDB_DI0 as clock source for IPU_DI0 */
  30. clrsetbits_le32(&mxc_ccm->cscmr2,
  31. MXC_CCM_CSCMR2_DI0_CLK_SEL_MASK,
  32. MXC_CCM_CSCMR2_DI0_CLK_SEL(
  33. MXC_CCM_CSCMR2_DI0_CLK_SEL_LDB_DI0_CLK));
  34. /* Turn on IPU LDB DI0 clocks */
  35. setbits_le32(&mxc_ccm->CCGR6, MXC_CCM_CCGR6_LDB_DI0(3));
  36. /* Turn on IPU DI0 clocks */
  37. setbits_le32(&mxc_ccm->CCGR6, MXC_CCM_CCGR6_IPU_DI0(3));
  38. /* Configure LDB */
  39. writel(IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
  40. IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT |
  41. IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0,
  42. &iomux->gpr[2]);
  43. }
  44. static void do_enable_backlight(struct display_info_t const *dev)
  45. {
  46. struct udevice *panel;
  47. int ret;
  48. lcd_enable();
  49. ret = uclass_get_device(UCLASS_PANEL, 0, &panel);
  50. if (ret) {
  51. printf("Could not find panel: %d\n", ret);
  52. return;
  53. }
  54. panel_set_backlight(panel, 100);
  55. panel_enable_backlight(panel);
  56. }
  57. struct display_info_t const displays[] = {
  58. {
  59. .bus = -1,
  60. .addr = -1,
  61. .pixfmt = IPU_PIX_FMT_RGB24,
  62. .detect = detect_lcd,
  63. .enable = do_enable_backlight,
  64. .mode = {
  65. .name = "NV-SPWGRGB888",
  66. .refresh = 60,
  67. .xres = 800,
  68. .yres = 480,
  69. .pixclock = 15384,
  70. .left_margin = 16,
  71. .right_margin = 210,
  72. .upper_margin = 10,
  73. .lower_margin = 22,
  74. .hsync_len = 30,
  75. .vsync_len = 13,
  76. .sync = FB_SYNC_EXT,
  77. .vmode = FB_VMODE_NONINTERLACED
  78. }
  79. }
  80. };
  81. size_t display_count = ARRAY_SIZE(displays);