1e559355aSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2bed41005STom Cooksey /* 3bed41005STom Cooksey * 4bed41005STom Cooksey * (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved. 5bed41005STom Cooksey * 6bed41005STom Cooksey * Parts of this file were based on sources as follows: 7bed41005STom Cooksey * 8bed41005STom Cooksey * Copyright (c) 2006-2008 Intel Corporation 9bed41005STom Cooksey * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 10bed41005STom Cooksey * Copyright (C) 2011 Texas Instruments 11bed41005STom Cooksey */ 12bed41005STom Cooksey 13bed41005STom Cooksey #ifndef _PL111_DRM_H_ 14bed41005STom Cooksey #define _PL111_DRM_H_ 15bed41005STom Cooksey 16032838f9SEric Anholt #include <linux/clk-provider.h> 17ad86ebe7SLinus Walleij #include <linux/interrupt.h> 18bed41005STom Cooksey 1909a56fbeSSam Ravnborg #include <drm/drm_bridge.h> 2009a56fbeSSam Ravnborg #include <drm/drm_connector.h> 2109a56fbeSSam Ravnborg #include <drm/drm_encoder.h> 2209a56fbeSSam Ravnborg #include <drm/drm_gem.h> 2309a56fbeSSam Ravnborg #include <drm/drm_panel.h> 2409a56fbeSSam Ravnborg #include <drm/drm_simple_kms_helper.h> 2509a56fbeSSam Ravnborg 26bed41005STom Cooksey #define CLCD_IRQ_NEXTBASE_UPDATE BIT(2) 27bed41005STom Cooksey 28141518d2SEric Anholt struct drm_minor; 29141518d2SEric Anholt 30fa83306cSLinus Walleij /** 31fa83306cSLinus Walleij * struct pl111_variant_data - encodes IP differences 32fa83306cSLinus Walleij * @name: the name of this variant 33fa83306cSLinus Walleij * @is_pl110: this is the early PL110 variant 34e08015e7SLinus Walleij * @is_lcdc: this is the ST Microelectronics Nomadik LCDC variant 353d95f76aSLinus Walleij * @external_bgr: this is the Versatile Pl110 variant with external 363d95f76aSLinus Walleij * BGR/RGB routing 37eedd6033SLinus Walleij * @broken_clockdivider: the clock divider is broken and we need to 38eedd6033SLinus Walleij * use the supplied clock directly 3908e32112SLinus Walleij * @broken_vblank: the vblank IRQ is broken on this variant 40e08015e7SLinus Walleij * @st_bitmux_control: this variant is using the ST Micro bitmux 41e08015e7SLinus Walleij * extensions to the control register 42fa83306cSLinus Walleij * @formats: array of supported pixel formats on this variant 43fa83306cSLinus Walleij * @nformats: the length of the array of supported pixel formats 449f8d4fe9SLinus Walleij * @fb_bpp: desired bits per pixel on the default framebuffer 45fa83306cSLinus Walleij */ 46fa83306cSLinus Walleij struct pl111_variant_data { 47fa83306cSLinus Walleij const char *name; 48fa83306cSLinus Walleij bool is_pl110; 49e08015e7SLinus Walleij bool is_lcdc; 503d95f76aSLinus Walleij bool external_bgr; 51eedd6033SLinus Walleij bool broken_clockdivider; 5208e32112SLinus Walleij bool broken_vblank; 53e08015e7SLinus Walleij bool st_bitmux_control; 54fa83306cSLinus Walleij const u32 *formats; 55fa83306cSLinus Walleij unsigned int nformats; 569f8d4fe9SLinus Walleij unsigned int fb_bpp; 57fa83306cSLinus Walleij }; 58fa83306cSLinus Walleij 59bed41005STom Cooksey struct pl111_drm_dev_private { 60bed41005STom Cooksey struct drm_device *drm; 61bed41005STom Cooksey 62001485d5SLinus Walleij struct drm_connector *connector; 63001485d5SLinus Walleij struct drm_panel *panel; 64001485d5SLinus Walleij struct drm_bridge *bridge; 65bed41005STom Cooksey struct drm_simple_display_pipe pipe; 66bed41005STom Cooksey 67bed41005STom Cooksey void *regs; 68df99dd92SLinus Walleij u32 memory_bw; 69fa83306cSLinus Walleij u32 ienb; 70fa83306cSLinus Walleij u32 ctrl; 71032838f9SEric Anholt /* The pixel clock (a reference to our clock divider off of CLCDCLK). */ 72bed41005STom Cooksey struct clk *clk; 73032838f9SEric Anholt /* pl111's internal clock divider. */ 74032838f9SEric Anholt struct clk_hw clk_div; 75032838f9SEric Anholt /* Lock to sync access to CLCD_TIM2 between the common clock 76032838f9SEric Anholt * subsystem and pl111_display_enable(). 77032838f9SEric Anholt */ 78032838f9SEric Anholt spinlock_t tim2_lock; 79fa83306cSLinus Walleij const struct pl111_variant_data *variant; 80ad86ebe7SLinus Walleij void (*variant_display_enable) (struct drm_device *drm, u32 format); 81ad86ebe7SLinus Walleij void (*variant_display_disable) (struct drm_device *drm); 8257450671SLinus Walleij bool use_device_memory; 83bed41005STom Cooksey }; 84bed41005STom Cooksey 85bed41005STom Cooksey int pl111_display_init(struct drm_device *dev); 86bed41005STom Cooksey irqreturn_t pl111_irq(int irq, void *data); 87141518d2SEric Anholt int pl111_debugfs_init(struct drm_minor *minor); 88bed41005STom Cooksey 89bed41005STom Cooksey #endif /* _PL111_DRM_H_ */ 90