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

Merge tag 'drm-misc-next-2023-05-24' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

drm-misc-next for v6.5:

UAPI Changes:

Cross-subsystem Changes:

* fbdev: Move framebuffer I/O helpers to <asm/fb.h>, fix naming

* firmware: Init sysfb as early as possible

Core Changes:

* DRM scheduler: Rename interfaces

* ttm: Store ttm_device_funcs in .rodata

* Replace strlcpy() with strscpy() in various places

* Cleanups

Driver Changes:

* bridge: analogix: Fix endless probe loop; samsung-dsim: Support
swapping clock/data polarity; tc358767: Use devm_ Cleanups;

* gma500: Fix I/O-memory access

* panel: boe-tv101wum-nl6: Improve initialization; sharp-ls043t1le001:
Mode fixes; simple: Add BOE EV121WXM-N10-1850 plus DT bindings;
AddS6D7AA0 plus DT bindings; Cleanups

* ssd1307x: Style fixes

* sun4i: Release clocks

* msm: Fix I/O-memory access

* nouveau: Cleanups

* shmobile: Support Renesas; Enable framebuffer console; Various fixes

* vkms: Fix RGB565 conversion

Signed-off-by: Dave Airlie <airlied@redhat.com>

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCAAdFiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAmRuBXEACgkQaA3BHVML
# eiPLkwgAqCa7IuSDQhFMWVOI0EJpPPEHtHM8SCT1Pp8aniXk23Ru+E16c5zck53O
# uf4tB+zoFrwD9npy60LIvX1OZmXS1KI4+ZO8itYFk6GSjxqbTWbjNFREBeWFdIpa
# OG54nEqjFQZzEXY+gJYDpu5zqLy3xLN07ZgQkcMyfW3O/Krj4LLzfQTDl+jP5wkO
# 7/v5Eu5CG5QjupMxIjb4e+ruUflp73pynur5bhZsfS1bPNGFTnxHlwg7NWnBXU7o
# Hg23UYfCuZZWPmuO26EeUDlN33rCoaycmVgtpdZft2eznca5Mg74Loz1Qc3GQfjw
# LLvKsAIlBcZvEIhElkzhtXitBoe7LQ==
# =/9zV
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed 24 May 2023 22:39:13 AEST
# gpg: using RSA key 7217FBAC8CE9CF6344A168E5680DC11D530B7A23
# gpg: Can't check signature: No public key

# Conflicts:
# MAINTAINERS
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20230524124237.GA25416@linux-uq9g

+1476 -437
+23
Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml
··· 105 105 DSI output port node to the panel or the next bridge 106 106 in the chain. 107 107 108 + properties: 109 + endpoint: 110 + $ref: /schemas/media/video-interfaces.yaml# 111 + unevaluatedProperties: false 112 + 113 + properties: 114 + data-lanes: 115 + minItems: 1 116 + maxItems: 4 117 + uniqueItems: true 118 + items: 119 + enum: [ 1, 2, 3, 4 ] 120 + 121 + lane-polarities: 122 + minItems: 1 123 + maxItems: 5 124 + description: 125 + The Samsung MIPI DSI IP requires that all the data lanes have 126 + the same polarity. 127 + 128 + dependencies: 129 + lane-polarities: [data-lanes] 130 + 108 131 required: 109 132 - clock-names 110 133 - clocks
+11 -3
Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.yaml
··· 4 4 $id: http://devicetree.org/schemas/display/bridge/toshiba,tc358767.yaml# 5 5 $schema: http://devicetree.org/meta-schemas/core.yaml# 6 6 7 - title: Toshiba TC358767 eDP bridge 7 + title: Toshiba TC358767/TC358867/TC9595 DSI/DPI/eDP bridge 8 8 9 9 maintainers: 10 10 - Andrey Gusakov <andrey.gusakov@cogentembedded.com> 11 11 12 - description: The TC358767 is bridge device which converts DSI/DPI to eDP/DP 12 + description: | 13 + The TC358767/TC358867/TC9595 is bridge device which 14 + converts DSI/DPI to eDP/DP . 13 15 14 16 properties: 15 17 compatible: 16 - const: toshiba,tc358767 18 + oneOf: 19 + - items: 20 + - enum: 21 + - toshiba,tc358867 22 + - toshiba,tc9595 23 + - const: toshiba,tc358767 24 + - const: toshiba,tc358767 17 25 18 26 reg: 19 27 enum:
+2
Documentation/devicetree/bindings/display/panel/panel-simple.yaml
··· 77 77 - auo,t215hvn01 78 78 # Shanghai AVIC Optoelectronics 7" 1024x600 color TFT-LCD panel 79 79 - avic,tm070ddh03 80 + # BOE EV121WXM-N10-1850 12.1" WXGA (1280x800) TFT LCD panel 81 + - boe,ev121wxm-n10-1850 80 82 # BOE HV070WSA-100 7.01" WSVGA TFT LCD panel 81 83 - boe,hv070wsa-100 82 84 # BOE OPTOELECTRONICS TECHNOLOGY 10.1" WXGA TFT LCD panel
+70
Documentation/devicetree/bindings/display/panel/samsung,s6d7aa0.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/display/panel/samsung,s6d7aa0.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Samsung S6D7AA0 MIPI-DSI LCD panel controller 8 + 9 + maintainers: 10 + - Artur Weber <aweber.kernel@gmail.com> 11 + 12 + allOf: 13 + - $ref: panel-common.yaml# 14 + 15 + properties: 16 + compatible: 17 + items: 18 + - enum: 19 + # 1280x800 LSL080AL02 panel 20 + - samsung,lsl080al02 21 + # 1024x768 LSL080AL03 panel 22 + - samsung,lsl080al03 23 + # 1024x768 LTL101AT01 panel 24 + - samsung,ltl101at01 25 + - const: samsung,s6d7aa0 26 + 27 + reg: true 28 + 29 + backlight: 30 + description: 31 + Backlight to use for the panel. If this property is set on panels 32 + that have DSI-based backlight control (LSL080AL03 and LTL101AT01), 33 + it overrides the DSI-based backlight. 34 + 35 + reset-gpios: 36 + description: Reset GPIO pin, usually GPIO_ACTIVE_LOW. 37 + 38 + power-supply: 39 + description: 40 + Main power supply for the panel; the exact voltage differs between 41 + panels, and is usually somewhere around 3.3-5v. 42 + 43 + vmipi-supply: 44 + description: VMIPI supply, usually 1.8v. 45 + 46 + required: 47 + - compatible 48 + - reg 49 + - reset-gpios 50 + 51 + additionalProperties: false 52 + 53 + examples: 54 + - | 55 + #include <dt-bindings/gpio/gpio.h> 56 + 57 + dsi { 58 + #address-cells = <1>; 59 + #size-cells = <0>; 60 + 61 + panel@0 { 62 + compatible = "samsung,lsl080al02", "samsung,s6d7aa0"; 63 + reg = <0>; 64 + power-supply = <&display_3v3_supply>; 65 + reset-gpios = <&gpf0 4 GPIO_ACTIVE_LOW>; 66 + backlight = <&backlight>; 67 + }; 68 + }; 69 + 70 + ...
+6
MAINTAINERS
··· 6691 6691 F: Documentation/devicetree/bindings/display/panel/samsung,s6d27a1.yaml 6692 6692 F: drivers/gpu/drm/panel/panel-samsung-s6d27a1.c 6693 6693 6694 + DRM DRIVER FOR SAMSUNG S6D7AA0 PANELS 6695 + M: Artur Weber <aweber.kernel@gmail.com> 6696 + S: Maintained 6697 + F: Documentation/devicetree/bindings/display/panel/samsung,s6d7aa0.yaml 6698 + F: drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c 6699 + 6694 6700 DRM DRIVER FOR SITRONIX ST7586 PANELS 6695 6701 M: David Lechner <david@lechnology.com> 6696 6702 S: Maintained
+20
arch/ia64/include/asm/fb.h
··· 2 2 #ifndef _ASM_FB_H_ 3 3 #define _ASM_FB_H_ 4 4 5 + #include <linux/compiler.h> 5 6 #include <linux/efi.h> 7 + #include <linux/string.h> 6 8 7 9 #include <asm/page.h> 8 10 ··· 19 17 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 20 18 } 21 19 #define fb_pgprotect fb_pgprotect 20 + 21 + static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n) 22 + { 23 + memcpy(to, (void __force *)from, n); 24 + } 25 + #define fb_memcpy_fromio fb_memcpy_fromio 26 + 27 + static inline void fb_memcpy_toio(volatile void __iomem *to, const void *from, size_t n) 28 + { 29 + memcpy((void __force *)to, from, n); 30 + } 31 + #define fb_memcpy_toio fb_memcpy_toio 32 + 33 + static inline void fb_memset_io(volatile void __iomem *addr, int c, size_t n) 34 + { 35 + memset((void __force *)addr, c, n); 36 + } 37 + #define fb_memset fb_memset_io 22 38 23 39 #include <asm-generic/fb.h> 24 40
+21
arch/loongarch/include/asm/fb.h
··· 5 5 #ifndef _ASM_FB_H_ 6 6 #define _ASM_FB_H_ 7 7 8 + #include <linux/compiler.h> 9 + #include <linux/string.h> 10 + 11 + static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n) 12 + { 13 + memcpy(to, (void __force *)from, n); 14 + } 15 + #define fb_memcpy_fromio fb_memcpy_fromio 16 + 17 + static inline void fb_memcpy_toio(volatile void __iomem *to, const void *from, size_t n) 18 + { 19 + memcpy((void __force *)to, from, n); 20 + } 21 + #define fb_memcpy_toio fb_memcpy_toio 22 + 23 + static inline void fb_memset_io(volatile void __iomem *addr, int c, size_t n) 24 + { 25 + memset((void __force *)addr, c, n); 26 + } 27 + #define fb_memset fb_memset_io 28 + 8 29 #include <asm-generic/fb.h> 9 30 10 31 #endif /* _ASM_FB_H_ */
+22
arch/mips/include/asm/fb.h
··· 12 12 } 13 13 #define fb_pgprotect fb_pgprotect 14 14 15 + /* 16 + * MIPS doesn't define __raw_ I/O macros, so the helpers 17 + * in <asm-generic/fb.h> don't generate fb_readq() and 18 + * fb_write(). We have to provide them here. 19 + * 20 + * TODO: Convert MIPS to generic I/O. The helpers below can 21 + * then be removed. 22 + */ 23 + #ifdef CONFIG_64BIT 24 + static inline u64 fb_readq(const volatile void __iomem *addr) 25 + { 26 + return __raw_readq(addr); 27 + } 28 + #define fb_readq fb_readq 29 + 30 + static inline void fb_writeq(u64 b, volatile void __iomem *addr) 31 + { 32 + __raw_writeq(b, addr); 33 + } 34 + #define fb_writeq fb_writeq 35 + #endif 36 + 15 37 #include <asm-generic/fb.h> 16 38 17 39 #endif /* _ASM_FB_H_ */
+1 -2
arch/parisc/video/fbdev.c
··· 5 5 * Copyright (C) 2001-2002 Thomas Bogendoerfer <tsbogend@alpha.franken.de> 6 6 */ 7 7 8 + #include <linux/fb.h> 8 9 #include <linux/module.h> 9 - 10 - #include <asm/fb.h> 11 10 12 11 #include <video/sticore.h> 13 12
+20
arch/sparc/include/asm/fb.h
··· 2 2 #ifndef _SPARC_FB_H_ 3 3 #define _SPARC_FB_H_ 4 4 5 + #include <linux/io.h> 6 + 5 7 struct fb_info; 6 8 struct file; 7 9 struct vm_area_struct; ··· 17 15 18 16 int fb_is_primary_device(struct fb_info *info); 19 17 #define fb_is_primary_device fb_is_primary_device 18 + 19 + static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n) 20 + { 21 + sbus_memcpy_fromio(to, from, n); 22 + } 23 + #define fb_memcpy_fromio fb_memcpy_fromio 24 + 25 + static inline void fb_memcpy_toio(volatile void __iomem *to, const void *from, size_t n) 26 + { 27 + sbus_memcpy_toio(to, from, n); 28 + } 29 + #define fb_memcpy_toio fb_memcpy_toio 30 + 31 + static inline void fb_memset_io(volatile void __iomem *addr, int c, size_t n) 32 + { 33 + sbus_memset_io(addr, c, n); 34 + } 35 + #define fb_memset fb_memset_io 20 36 21 37 #include <asm-generic/fb.h> 22 38
-1
arch/sparc/video/fbdev.c
··· 4 4 #include <linux/fb.h> 5 5 #include <linux/module.h> 6 6 7 - #include <asm/fb.h> 8 7 #include <asm/prom.h> 9 8 10 9 int fb_is_primary_device(struct fb_info *info)
-2
arch/x86/video/fbdev.c
··· 7 7 * 8 8 */ 9 9 10 - #include <asm/fb.h> 11 - 12 10 #include <linux/fb.h> 13 11 #include <linux/module.h> 14 12 #include <linux/pci.h>
+1 -1
drivers/dma-buf/sw_sync.c
··· 85 85 86 86 kref_init(&obj->kref); 87 87 obj->context = dma_fence_context_alloc(1); 88 - strlcpy(obj->name, name, sizeof(obj->name)); 88 + strscpy(obj->name, name, sizeof(obj->name)); 89 89 90 90 obj->pt_tree = RB_ROOT; 91 91 INIT_LIST_HEAD(&obj->pt_list);
+1 -1
drivers/firmware/sysfb.c
··· 128 128 } 129 129 130 130 /* must execute after PCI subsystem for EFI quirks */ 131 - device_initcall(sysfb_init); 131 + subsys_initcall_sync(sysfb_init);
+88 -40
drivers/gpu/drm/bridge/analogix/anx7625.c
··· 1686 1686 if (of_property_read_bool(np, "analogix,audio-enable")) 1687 1687 pdata->audio_en = 1; 1688 1688 1689 + return 0; 1690 + } 1691 + 1692 + static int anx7625_parse_dt_panel(struct device *dev, 1693 + struct anx7625_platform_data *pdata) 1694 + { 1695 + struct device_node *np = dev->of_node; 1696 + 1689 1697 pdata->panel_bridge = devm_drm_of_get_bridge(dev, np, 1, 0); 1690 1698 if (IS_ERR(pdata->panel_bridge)) { 1691 1699 if (PTR_ERR(pdata->panel_bridge) == -ENODEV) { ··· 2039 2031 return 0; 2040 2032 } 2041 2033 2042 - static int anx7625_attach_dsi(struct anx7625_data *ctx) 2034 + static int anx7625_setup_dsi_device(struct anx7625_data *ctx) 2043 2035 { 2044 2036 struct mipi_dsi_device *dsi; 2045 2037 struct device *dev = &ctx->client->dev; ··· 2049 2041 .channel = 0, 2050 2042 .node = NULL, 2051 2043 }; 2052 - int ret; 2053 - 2054 - DRM_DEV_DEBUG_DRIVER(dev, "attach dsi\n"); 2055 2044 2056 2045 host = of_find_mipi_dsi_host_by_node(ctx->pdata.mipi_host_node); 2057 2046 if (!host) { ··· 2069 2064 MIPI_DSI_MODE_VIDEO_HSE | 2070 2065 MIPI_DSI_HS_PKT_END_ALIGNED; 2071 2066 2072 - ret = devm_mipi_dsi_attach(dev, dsi); 2067 + ctx->dsi = dsi; 2068 + 2069 + return 0; 2070 + } 2071 + 2072 + static int anx7625_attach_dsi(struct anx7625_data *ctx) 2073 + { 2074 + struct device *dev = &ctx->client->dev; 2075 + int ret; 2076 + 2077 + DRM_DEV_DEBUG_DRIVER(dev, "attach dsi\n"); 2078 + 2079 + ret = devm_mipi_dsi_attach(dev, ctx->dsi); 2073 2080 if (ret) { 2074 2081 DRM_DEV_ERROR(dev, "fail to attach dsi to host.\n"); 2075 2082 return ret; 2076 2083 } 2077 - 2078 - ctx->dsi = dsi; 2079 2084 2080 2085 DRM_DEV_DEBUG_DRIVER(dev, "attach dsi succeeded.\n"); 2081 2086 ··· 2574 2559 pm_runtime_disable(data); 2575 2560 } 2576 2561 2562 + static int anx7625_link_bridge(struct drm_dp_aux *aux) 2563 + { 2564 + struct anx7625_data *platform = container_of(aux, struct anx7625_data, aux); 2565 + struct device *dev = aux->dev; 2566 + int ret; 2567 + 2568 + ret = anx7625_parse_dt_panel(dev, &platform->pdata); 2569 + if (ret) { 2570 + DRM_DEV_ERROR(dev, "fail to parse DT for panel : %d\n", ret); 2571 + return ret; 2572 + } 2573 + 2574 + platform->bridge.funcs = &anx7625_bridge_funcs; 2575 + platform->bridge.of_node = dev->of_node; 2576 + if (!anx7625_of_panel_on_aux_bus(dev)) 2577 + platform->bridge.ops |= DRM_BRIDGE_OP_EDID; 2578 + if (!platform->pdata.panel_bridge) 2579 + platform->bridge.ops |= DRM_BRIDGE_OP_HPD | 2580 + DRM_BRIDGE_OP_DETECT; 2581 + platform->bridge.type = platform->pdata.panel_bridge ? 2582 + DRM_MODE_CONNECTOR_eDP : 2583 + DRM_MODE_CONNECTOR_DisplayPort; 2584 + 2585 + drm_bridge_add(&platform->bridge); 2586 + 2587 + if (!platform->pdata.is_dpi) { 2588 + ret = anx7625_attach_dsi(platform); 2589 + if (ret) 2590 + drm_bridge_remove(&platform->bridge); 2591 + } 2592 + 2593 + return ret; 2594 + } 2595 + 2577 2596 static int anx7625_i2c_probe(struct i2c_client *client) 2578 2597 { 2579 2598 struct anx7625_data *platform; ··· 2682 2633 platform->aux.wait_hpd_asserted = anx7625_wait_hpd_asserted; 2683 2634 drm_dp_aux_init(&platform->aux); 2684 2635 2636 + ret = anx7625_parse_dt(dev, pdata); 2637 + if (ret) { 2638 + if (ret != -EPROBE_DEFER) 2639 + DRM_DEV_ERROR(dev, "fail to parse DT : %d\n", ret); 2640 + goto free_wq; 2641 + } 2642 + 2643 + if (!platform->pdata.is_dpi) { 2644 + ret = anx7625_setup_dsi_device(platform); 2645 + if (ret < 0) 2646 + goto free_wq; 2647 + } 2648 + 2649 + /* 2650 + * Registering the i2c devices will retrigger deferred probe, so it 2651 + * needs to be done after calls that might return EPROBE_DEFER, 2652 + * otherwise we can get an infinite loop. 2653 + */ 2685 2654 if (anx7625_register_i2c_dummy_clients(platform, client) != 0) { 2686 2655 ret = -ENOMEM; 2687 2656 DRM_DEV_ERROR(dev, "fail to reserve I2C bus.\n"); ··· 2714 2647 if (ret) 2715 2648 goto free_wq; 2716 2649 2717 - devm_of_dp_aux_populate_ep_devices(&platform->aux); 2718 - 2719 - ret = anx7625_parse_dt(dev, pdata); 2650 + /* 2651 + * Populating the aux bus will retrigger deferred probe, so it needs to 2652 + * be done after calls that might return EPROBE_DEFER, otherwise we can 2653 + * get an infinite loop. 2654 + */ 2655 + ret = devm_of_dp_aux_populate_bus(&platform->aux, anx7625_link_bridge); 2720 2656 if (ret) { 2721 - if (ret != -EPROBE_DEFER) 2722 - DRM_DEV_ERROR(dev, "fail to parse DT : %d\n", ret); 2723 - goto free_wq; 2657 + if (ret != -ENODEV) { 2658 + DRM_DEV_ERROR(dev, "failed to populate aux bus : %d\n", ret); 2659 + goto free_wq; 2660 + } 2661 + 2662 + ret = anx7625_link_bridge(&platform->aux); 2663 + if (ret) 2664 + goto free_wq; 2724 2665 } 2725 2666 2726 2667 if (!platform->pdata.low_power_mode) { ··· 2741 2666 if (platform->pdata.intp_irq) 2742 2667 queue_work(platform->workqueue, &platform->work); 2743 2668 2744 - platform->bridge.funcs = &anx7625_bridge_funcs; 2745 - platform->bridge.of_node = client->dev.of_node; 2746 - if (!anx7625_of_panel_on_aux_bus(&client->dev)) 2747 - platform->bridge.ops |= DRM_BRIDGE_OP_EDID; 2748 - if (!platform->pdata.panel_bridge) 2749 - platform->bridge.ops |= DRM_BRIDGE_OP_HPD | 2750 - DRM_BRIDGE_OP_DETECT; 2751 - platform->bridge.type = platform->pdata.panel_bridge ? 2752 - DRM_MODE_CONNECTOR_eDP : 2753 - DRM_MODE_CONNECTOR_DisplayPort; 2754 - 2755 - drm_bridge_add(&platform->bridge); 2756 - 2757 - if (!platform->pdata.is_dpi) { 2758 - ret = anx7625_attach_dsi(platform); 2759 - if (ret) { 2760 - DRM_DEV_ERROR(dev, "Fail to attach to dsi : %d\n", ret); 2761 - goto unregister_bridge; 2762 - } 2763 - } 2764 - 2765 2669 if (platform->pdata.audio_en) 2766 2670 anx7625_register_audio(dev, platform); 2767 2671 2768 2672 DRM_DEV_DEBUG_DRIVER(dev, "probe done\n"); 2769 2673 2770 2674 return 0; 2771 - 2772 - unregister_bridge: 2773 - drm_bridge_remove(&platform->bridge); 2774 - 2775 - if (!platform->pdata.low_power_mode) 2776 - pm_runtime_put_sync_suspend(&client->dev); 2777 2675 2778 2676 free_wq: 2779 2677 if (platform->workqueue)
+26 -2
drivers/gpu/drm/bridge/samsung-dsim.c
··· 183 183 #define DSIM_AFC_CTL(x) (((x) & 0x7) << 5) 184 184 185 185 /* DSIM_PLLCTRL */ 186 + #define DSIM_PLL_DPDNSWAP_CLK (1 << 25) 187 + #define DSIM_PLL_DPDNSWAP_DAT (1 << 24) 186 188 #define DSIM_FREQ_BAND(x) ((x) << 24) 187 189 #define DSIM_PLL_EN BIT(23) 188 190 #define DSIM_PLL_P(x, offset) ((x) << (offset)) ··· 623 621 624 622 reg |= DSIM_FREQ_BAND(band); 625 623 } 624 + 625 + if (dsi->swap_dn_dp_clk) 626 + reg |= DSIM_PLL_DPDNSWAP_CLK; 627 + if (dsi->swap_dn_dp_data) 628 + reg |= DSIM_PLL_DPDNSWAP_DAT; 626 629 627 630 samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); 628 631 ··· 1703 1696 { 1704 1697 struct device *dev = dsi->dev; 1705 1698 struct device_node *node = dev->of_node; 1706 - int ret; 1699 + u32 lane_polarities[5] = { 0 }; 1700 + struct device_node *endpoint; 1701 + int i, nr_lanes, ret; 1707 1702 1708 1703 ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency", 1709 1704 &dsi->pll_clk_rate); ··· 1721 1712 &dsi->esc_clk_rate); 1722 1713 if (ret < 0) 1723 1714 return ret; 1715 + 1716 + endpoint = of_graph_get_endpoint_by_regs(node, 1, -1); 1717 + nr_lanes = of_property_count_u32_elems(endpoint, "data-lanes"); 1718 + if (nr_lanes > 0 && nr_lanes <= 4) { 1719 + /* Polarity 0 is clock lane, 1..4 are data lanes. */ 1720 + of_property_read_u32_array(endpoint, "lane-polarities", 1721 + lane_polarities, nr_lanes + 1); 1722 + for (i = 1; i <= nr_lanes; i++) { 1723 + if (lane_polarities[1] != lane_polarities[i]) 1724 + DRM_DEV_ERROR(dsi->dev, "Data lanes polarities do not match"); 1725 + } 1726 + if (lane_polarities[0]) 1727 + dsi->swap_dn_dp_clk = true; 1728 + if (lane_polarities[1]) 1729 + dsi->swap_dn_dp_data = true; 1730 + } 1724 1731 1725 1732 return 0; 1726 1733 } ··· 1979 1954 .remove = samsung_dsim_remove, 1980 1955 .driver = { 1981 1956 .name = "samsung-dsim", 1982 - .owner = THIS_MODULE, 1983 1957 .pm = &samsung_dsim_pm_ops, 1984 1958 .of_match_table = samsung_dsim_of_match, 1985 1959 },
+1 -1
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
··· 533 533 adap->owner = THIS_MODULE; 534 534 adap->dev.parent = hdmi->dev; 535 535 adap->algo = &dw_hdmi_algorithm; 536 - strlcpy(adap->name, "DesignWare HDMI", sizeof(adap->name)); 536 + strscpy(adap->name, "DesignWare HDMI", sizeof(adap->name)); 537 537 i2c_set_adapdata(adap, hdmi); 538 538 539 539 ret = i2c_add_adapter(adap);
+2 -2
drivers/gpu/drm/bridge/tc358767.c
··· 1890 1890 if (dsi_lanes < 0) 1891 1891 return dsi_lanes; 1892 1892 1893 - dsi = mipi_dsi_device_register_full(host, &info); 1893 + dsi = devm_mipi_dsi_device_register_full(dev, host, &info); 1894 1894 if (IS_ERR(dsi)) 1895 1895 return dev_err_probe(dev, PTR_ERR(dsi), 1896 1896 "failed to create dsi device\n"); ··· 1901 1901 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | 1902 1902 MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS; 1903 1903 1904 - ret = mipi_dsi_attach(dsi); 1904 + ret = devm_mipi_dsi_attach(dev, dsi); 1905 1905 if (ret < 0) { 1906 1906 dev_err(dev, "failed to attach dsi to host: %d\n", ret); 1907 1907 return ret;
+1 -1
drivers/gpu/drm/bridge/tc358768.c
··· 952 952 case 24: 953 953 input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; 954 954 break; 955 - }; 955 + } 956 956 957 957 *num_input_fmts = MAX_INPUT_SEL_FORMATS; 958 958
+1 -1
drivers/gpu/drm/drm_atomic_helper.c
··· 3154 3154 EXPORT_SYMBOL(drm_atomic_helper_update_plane); 3155 3155 3156 3156 /** 3157 - * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic 3157 + * drm_atomic_helper_disable_plane - Helper for primary plane disable using atomic 3158 3158 * @plane: plane to disable 3159 3159 * @ctx: lock acquire context 3160 3160 *
+1 -1
drivers/gpu/drm/gma500/fbdev.c
··· 231 231 info->fix.mmio_start = pci_resource_start(pdev, 0); 232 232 info->fix.mmio_len = pci_resource_len(pdev, 0); 233 233 234 - memset(info->screen_base, 0, info->screen_size); 234 + fb_memset_io(info->screen_base, 0, info->screen_size); 235 235 236 236 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ 237 237
+3 -3
drivers/gpu/drm/msm/msm_fbdev.c
··· 121 121 122 122 drm_fb_helper_fill_info(fbi, helper, sizes); 123 123 124 - fbi->screen_base = msm_gem_get_vaddr(bo); 125 - if (IS_ERR(fbi->screen_base)) { 126 - ret = PTR_ERR(fbi->screen_base); 124 + fbi->screen_buffer = msm_gem_get_vaddr(bo); 125 + if (IS_ERR(fbi->screen_buffer)) { 126 + ret = PTR_ERR(fbi->screen_buffer); 127 127 goto fail; 128 128 } 129 129 fbi->screen_size = bo->size;
+1
drivers/gpu/drm/nouveau/dispnv50/disp.c
··· 64 64 #include "nouveau_connector.h" 65 65 #include "nouveau_encoder.h" 66 66 #include "nouveau_fence.h" 67 + #include "nv50_display.h" 67 68 68 69 #include <subdev/bios/dp.h> 69 70
+1 -1
drivers/gpu/drm/nouveau/nouveau_hwmon.c
··· 211 211 212 212 #define N_ATTR_GROUPS 3 213 213 214 - static const struct hwmon_channel_info *nouveau_info[] = { 214 + static const struct hwmon_channel_info * const nouveau_info[] = { 215 215 HWMON_CHANNEL_INFO(chip, 216 216 HWMON_C_UPDATE_INTERVAL), 217 217 HWMON_CHANNEL_INFO(temp,
+1 -3
drivers/gpu/drm/nouveau/nv50_display.h
··· 31 31 #include "nouveau_reg.h" 32 32 33 33 int nv50_display_create(struct drm_device *); 34 - void nv50_display_destroy(struct drm_device *); 35 - int nv50_display_init(struct drm_device *); 36 - void nv50_display_fini(struct drm_device *); 34 + 37 35 #endif /* __NV50_DISPLAY_H__ */
+1 -1
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c
··· 45 45 return 0; 46 46 } 47 47 48 - struct nvkm_gsp_fwif 48 + static struct nvkm_gsp_fwif 49 49 ga102_gsps[] = { 50 50 { -1, ga102_gsp_nofw, &ga102_gsp }, 51 51 {}
+7
drivers/gpu/drm/panel/Kconfig
··· 553 553 This panel can be found in Samsung Galaxy Ace 2 554 554 GT-I8160 mobile phone. 555 555 556 + config DRM_PANEL_SAMSUNG_S6D7AA0 557 + tristate "Samsung S6D7AA0 MIPI-DSI video mode panel controller" 558 + depends on OF 559 + depends on BACKLIGHT_CLASS_DEVICE 560 + select DRM_MIPI_DSI 561 + select VIDEOMODE_HELPERS 562 + 556 563 config DRM_PANEL_SAMSUNG_S6E3HA2 557 564 tristate "Samsung S6E3HA2 DSI video mode panel" 558 565 depends on OF
+1
drivers/gpu/drm/panel/Makefile
··· 54 54 obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o 55 55 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o 56 56 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D27A1) += panel-samsung-s6d27a1.o 57 + obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0) += panel-samsung-s6d7aa0.o 57 58 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2) += panel-samsung-s6e3ha2.o 58 59 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03) += panel-samsung-s6e63j0x03.o 59 60 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0) += panel-samsung-s6e63m0.o
+241 -163
drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
··· 36 36 const struct panel_init_cmd *init_cmds; 37 37 unsigned int lanes; 38 38 bool discharge_on_disable; 39 + bool lp11_before_reset; 39 40 }; 40 41 41 42 struct boe_panel { ··· 452 451 _INIT_DCS_CMD(0xFF, 0x20), 453 452 _INIT_DCS_CMD(0xFB, 0x01), 454 453 _INIT_DCS_CMD(0x05, 0xD1), 455 - _INIT_DCS_CMD(0x0D, 0x63), 456 - _INIT_DCS_CMD(0x07, 0x8C), 454 + _INIT_DCS_CMD(0x06, 0xC0), 455 + _INIT_DCS_CMD(0x07, 0x87), 457 456 _INIT_DCS_CMD(0x08, 0x4B), 457 + 458 + _INIT_DCS_CMD(0x0D, 0x63), 458 459 _INIT_DCS_CMD(0x0E, 0x91), 459 460 _INIT_DCS_CMD(0x0F, 0x69), 461 + _INIT_DCS_CMD(0x94, 0x00), 460 462 _INIT_DCS_CMD(0x95, 0xF5), 461 463 _INIT_DCS_CMD(0x96, 0xF5), 462 464 _INIT_DCS_CMD(0x9D, 0x00), ··· 467 463 _INIT_DCS_CMD(0x69, 0x98), 468 464 _INIT_DCS_CMD(0x75, 0xA2), 469 465 _INIT_DCS_CMD(0x77, 0xB3), 466 + 467 + _INIT_DCS_CMD(0x58, 0x43), 470 468 _INIT_DCS_CMD(0xFF, 0x24), 471 469 _INIT_DCS_CMD(0xFB, 0x01), 472 470 _INIT_DCS_CMD(0x91, 0x44), 473 - _INIT_DCS_CMD(0x92, 0x7A), 474 - _INIT_DCS_CMD(0x93, 0x1A), 475 - _INIT_DCS_CMD(0x94, 0x40), 476 - _INIT_DCS_CMD(0x9A, 0x08), 471 + _INIT_DCS_CMD(0x92, 0x4C), 472 + _INIT_DCS_CMD(0x94, 0x86), 477 473 _INIT_DCS_CMD(0x60, 0x96), 478 474 _INIT_DCS_CMD(0x61, 0xD0), 479 475 _INIT_DCS_CMD(0x63, 0x70), 480 - _INIT_DCS_CMD(0xC2, 0xCF), 481 - _INIT_DCS_CMD(0x9B, 0x0F), 482 - _INIT_DCS_CMD(0x9A, 0x08), 476 + _INIT_DCS_CMD(0xC2, 0xCA), 477 + 483 478 _INIT_DCS_CMD(0x00, 0x03), 484 479 _INIT_DCS_CMD(0x01, 0x03), 485 480 _INIT_DCS_CMD(0x02, 0x03), 486 - _INIT_DCS_CMD(0x03, 0x03), 487 - _INIT_DCS_CMD(0x04, 0x03), 488 - _INIT_DCS_CMD(0x05, 0x03), 489 - _INIT_DCS_CMD(0x06, 0x22), 490 - _INIT_DCS_CMD(0x07, 0x06), 491 - _INIT_DCS_CMD(0x08, 0x00), 492 - _INIT_DCS_CMD(0x09, 0x1D), 493 - _INIT_DCS_CMD(0x0A, 0x1C), 494 - _INIT_DCS_CMD(0x0B, 0x13), 495 - _INIT_DCS_CMD(0x0C, 0x12), 496 - _INIT_DCS_CMD(0x0D, 0x11), 497 - _INIT_DCS_CMD(0x0E, 0x10), 498 - _INIT_DCS_CMD(0x0F, 0x0F), 499 - _INIT_DCS_CMD(0x10, 0x0E), 500 - _INIT_DCS_CMD(0x11, 0x0D), 501 - _INIT_DCS_CMD(0x12, 0x0C), 481 + _INIT_DCS_CMD(0x03, 0x29), 482 + _INIT_DCS_CMD(0x04, 0x22), 483 + _INIT_DCS_CMD(0x05, 0x22), 484 + _INIT_DCS_CMD(0x06, 0x0B), 485 + _INIT_DCS_CMD(0x07, 0x1D), 486 + _INIT_DCS_CMD(0x08, 0x1C), 487 + _INIT_DCS_CMD(0x09, 0x05), 488 + _INIT_DCS_CMD(0x0A, 0x08), 489 + _INIT_DCS_CMD(0x0B, 0x09), 490 + _INIT_DCS_CMD(0x0C, 0x0A), 491 + _INIT_DCS_CMD(0x0D, 0x0C), 492 + _INIT_DCS_CMD(0x0E, 0x0D), 493 + _INIT_DCS_CMD(0x0F, 0x0E), 494 + _INIT_DCS_CMD(0x10, 0x0F), 495 + _INIT_DCS_CMD(0x11, 0x10), 496 + _INIT_DCS_CMD(0x12, 0x11), 502 497 _INIT_DCS_CMD(0x13, 0x04), 503 - _INIT_DCS_CMD(0x14, 0x03), 498 + _INIT_DCS_CMD(0x14, 0x00), 504 499 _INIT_DCS_CMD(0x15, 0x03), 505 500 _INIT_DCS_CMD(0x16, 0x03), 506 501 _INIT_DCS_CMD(0x17, 0x03), 507 502 _INIT_DCS_CMD(0x18, 0x03), 508 - _INIT_DCS_CMD(0x19, 0x03), 509 - _INIT_DCS_CMD(0x1A, 0x03), 510 - _INIT_DCS_CMD(0x1B, 0x03), 511 - _INIT_DCS_CMD(0x1C, 0x22), 512 - _INIT_DCS_CMD(0x1D, 0x06), 513 - _INIT_DCS_CMD(0x1E, 0x00), 514 - _INIT_DCS_CMD(0x1F, 0x1D), 515 - _INIT_DCS_CMD(0x20, 0x1C), 516 - _INIT_DCS_CMD(0x21, 0x13), 517 - _INIT_DCS_CMD(0x22, 0x12), 518 - _INIT_DCS_CMD(0x23, 0x11), 519 - _INIT_DCS_CMD(0x24, 0x10), 520 - _INIT_DCS_CMD(0x25, 0x0F), 521 - _INIT_DCS_CMD(0x26, 0x0E), 522 - _INIT_DCS_CMD(0x27, 0x0D), 523 - _INIT_DCS_CMD(0x28, 0x0C), 503 + _INIT_DCS_CMD(0x19, 0x29), 504 + _INIT_DCS_CMD(0x1A, 0x22), 505 + _INIT_DCS_CMD(0x1B, 0x22), 506 + _INIT_DCS_CMD(0x1C, 0x0B), 507 + _INIT_DCS_CMD(0x1D, 0x1D), 508 + _INIT_DCS_CMD(0x1E, 0x1C), 509 + _INIT_DCS_CMD(0x1F, 0x05), 510 + _INIT_DCS_CMD(0x20, 0x08), 511 + _INIT_DCS_CMD(0x21, 0x09), 512 + _INIT_DCS_CMD(0x22, 0x0A), 513 + _INIT_DCS_CMD(0x23, 0x0C), 514 + _INIT_DCS_CMD(0x24, 0x0D), 515 + _INIT_DCS_CMD(0x25, 0x0E), 516 + _INIT_DCS_CMD(0x26, 0x0F), 517 + _INIT_DCS_CMD(0x27, 0x10), 518 + _INIT_DCS_CMD(0x28, 0x11), 524 519 _INIT_DCS_CMD(0x29, 0x04), 525 - _INIT_DCS_CMD(0x2A, 0x03), 520 + _INIT_DCS_CMD(0x2A, 0x00), 526 521 _INIT_DCS_CMD(0x2B, 0x03), 527 522 528 - _INIT_DCS_CMD(0x2F, 0x05), 529 - _INIT_DCS_CMD(0x30, 0x32), 530 - _INIT_DCS_CMD(0x31, 0x43), 531 - _INIT_DCS_CMD(0x33, 0x05), 532 - _INIT_DCS_CMD(0x34, 0x32), 533 - _INIT_DCS_CMD(0x35, 0x43), 534 - _INIT_DCS_CMD(0x37, 0x44), 535 - _INIT_DCS_CMD(0x38, 0x40), 523 + _INIT_DCS_CMD(0x2F, 0x0A), 524 + _INIT_DCS_CMD(0x30, 0x35), 525 + _INIT_DCS_CMD(0x37, 0xA7), 536 526 _INIT_DCS_CMD(0x39, 0x00), 537 - _INIT_DCS_CMD(0x3A, 0x18), 538 - _INIT_DCS_CMD(0x3B, 0x00), 539 - _INIT_DCS_CMD(0x3D, 0x93), 540 - _INIT_DCS_CMD(0xAB, 0x44), 541 - _INIT_DCS_CMD(0xAC, 0x40), 527 + _INIT_DCS_CMD(0x3A, 0x46), 528 + _INIT_DCS_CMD(0x3B, 0x32), 529 + _INIT_DCS_CMD(0x3D, 0x12), 530 + 531 + _INIT_DCS_CMD(0x3F, 0x33), 532 + _INIT_DCS_CMD(0x40, 0x31), 533 + _INIT_DCS_CMD(0x41, 0x40), 534 + _INIT_DCS_CMD(0x42, 0x42), 535 + _INIT_DCS_CMD(0x47, 0x77), 536 + _INIT_DCS_CMD(0x48, 0x77), 537 + _INIT_DCS_CMD(0x4A, 0x45), 538 + _INIT_DCS_CMD(0x4B, 0x45), 539 + _INIT_DCS_CMD(0x4C, 0x14), 542 540 543 541 _INIT_DCS_CMD(0x4D, 0x21), 544 542 _INIT_DCS_CMD(0x4E, 0x43), 545 543 _INIT_DCS_CMD(0x4F, 0x65), 546 - _INIT_DCS_CMD(0x50, 0x87), 547 - _INIT_DCS_CMD(0x51, 0x78), 548 - _INIT_DCS_CMD(0x52, 0x56), 549 - _INIT_DCS_CMD(0x53, 0x34), 550 - _INIT_DCS_CMD(0x54, 0x21), 551 - _INIT_DCS_CMD(0x55, 0x83), 552 - _INIT_DCS_CMD(0x56, 0x08), 544 + _INIT_DCS_CMD(0x55, 0x06), 545 + _INIT_DCS_CMD(0x56, 0x06), 553 546 _INIT_DCS_CMD(0x58, 0x21), 554 - _INIT_DCS_CMD(0x59, 0x40), 555 - _INIT_DCS_CMD(0x5A, 0x00), 556 - _INIT_DCS_CMD(0x5B, 0x2C), 557 - _INIT_DCS_CMD(0x5E, 0x00, 0x10), 547 + _INIT_DCS_CMD(0x59, 0x70), 548 + _INIT_DCS_CMD(0x5A, 0x46), 549 + _INIT_DCS_CMD(0x5B, 0x32), 550 + _INIT_DCS_CMD(0x5C, 0x88), 551 + _INIT_DCS_CMD(0x5E, 0x00, 0x00), 558 552 _INIT_DCS_CMD(0x5F, 0x00), 559 553 560 - _INIT_DCS_CMD(0x7A, 0x00), 561 - _INIT_DCS_CMD(0x7B, 0x00), 554 + _INIT_DCS_CMD(0x7A, 0xFF), 555 + _INIT_DCS_CMD(0x7B, 0xFF), 562 556 _INIT_DCS_CMD(0x7C, 0x00), 563 557 _INIT_DCS_CMD(0x7D, 0x00), 564 558 _INIT_DCS_CMD(0x7E, 0x20), ··· 566 564 _INIT_DCS_CMD(0x82, 0x08), 567 565 _INIT_DCS_CMD(0x97, 0x02), 568 566 _INIT_DCS_CMD(0xC5, 0x10), 567 + 568 + _INIT_DCS_CMD(0xD7, 0x55), 569 + _INIT_DCS_CMD(0xD8, 0x55), 570 + _INIT_DCS_CMD(0xD9, 0x23), 569 571 _INIT_DCS_CMD(0xDA, 0x05), 570 572 _INIT_DCS_CMD(0xDB, 0x01), 571 - _INIT_DCS_CMD(0xDC, 0x7A), 573 + _INIT_DCS_CMD(0xDC, 0x65), 572 574 _INIT_DCS_CMD(0xDD, 0x55), 573 575 _INIT_DCS_CMD(0xDE, 0x27), 574 576 _INIT_DCS_CMD(0xDF, 0x01), 575 - _INIT_DCS_CMD(0xE0, 0x7A), 577 + _INIT_DCS_CMD(0xE0, 0x65), 576 578 _INIT_DCS_CMD(0xE1, 0x01), 577 - _INIT_DCS_CMD(0xE2, 0x7A), 579 + _INIT_DCS_CMD(0xE2, 0x65), 578 580 _INIT_DCS_CMD(0xE3, 0x01), 579 - _INIT_DCS_CMD(0xE4, 0x7A), 581 + _INIT_DCS_CMD(0xE4, 0x65), 580 582 _INIT_DCS_CMD(0xE5, 0x01), 581 - _INIT_DCS_CMD(0xE6, 0x7A), 583 + _INIT_DCS_CMD(0xE6, 0x65), 582 584 _INIT_DCS_CMD(0xE7, 0x00), 583 585 _INIT_DCS_CMD(0xE8, 0x00), 584 586 _INIT_DCS_CMD(0xE9, 0x01), 585 - _INIT_DCS_CMD(0xEA, 0x7A), 587 + _INIT_DCS_CMD(0xEA, 0x65), 586 588 _INIT_DCS_CMD(0xEB, 0x01), 587 - _INIT_DCS_CMD(0xEE, 0x7A), 589 + _INIT_DCS_CMD(0xEE, 0x65), 588 590 _INIT_DCS_CMD(0xEF, 0x01), 589 - _INIT_DCS_CMD(0xF0, 0x7A), 590 - 591 + _INIT_DCS_CMD(0xF0, 0x65), 591 592 _INIT_DCS_CMD(0xB6, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00), 593 + 592 594 _INIT_DCS_CMD(0xFF, 0x25), 595 + 593 596 _INIT_DCS_CMD(0xFB, 0x01), 594 - 595 597 _INIT_DCS_CMD(0x05, 0x00), 596 - 597 - _INIT_DCS_CMD(0x13, 0x02), 598 - _INIT_DCS_CMD(0x14, 0xDF), 599 598 _INIT_DCS_CMD(0xF1, 0x10), 599 + 600 600 _INIT_DCS_CMD(0x1E, 0x00), 601 - _INIT_DCS_CMD(0x1F, 0x00), 602 - _INIT_DCS_CMD(0x20, 0x2C), 601 + _INIT_DCS_CMD(0x1F, 0x46), 602 + _INIT_DCS_CMD(0x20, 0x32), 603 + 603 604 _INIT_DCS_CMD(0x25, 0x00), 604 - _INIT_DCS_CMD(0x26, 0x00), 605 - _INIT_DCS_CMD(0x27, 0x2C), 605 + _INIT_DCS_CMD(0x26, 0x46), 606 + _INIT_DCS_CMD(0x27, 0x32), 607 + 606 608 _INIT_DCS_CMD(0x3F, 0x80), 607 609 _INIT_DCS_CMD(0x40, 0x00), 608 610 _INIT_DCS_CMD(0x43, 0x00), 609 611 610 - _INIT_DCS_CMD(0x44, 0x18), 611 - _INIT_DCS_CMD(0x45, 0x00), 612 + _INIT_DCS_CMD(0x44, 0x46), 613 + _INIT_DCS_CMD(0x45, 0x46), 612 614 613 - _INIT_DCS_CMD(0x48, 0x00), 614 - _INIT_DCS_CMD(0x49, 0x2C), 615 + _INIT_DCS_CMD(0x48, 0x46), 616 + _INIT_DCS_CMD(0x49, 0x32), 617 + 615 618 _INIT_DCS_CMD(0x5B, 0x80), 619 + 616 620 _INIT_DCS_CMD(0x5C, 0x00), 617 - _INIT_DCS_CMD(0x5D, 0x00), 618 - _INIT_DCS_CMD(0x5E, 0x00), 619 - _INIT_DCS_CMD(0x61, 0x00), 620 - _INIT_DCS_CMD(0x62, 0x2C), 621 - _INIT_DCS_CMD(0x68, 0x10), 621 + _INIT_DCS_CMD(0x5D, 0x46), 622 + _INIT_DCS_CMD(0x5E, 0x32), 623 + 624 + _INIT_DCS_CMD(0x5F, 0x46), 625 + _INIT_DCS_CMD(0x60, 0x32), 626 + 627 + _INIT_DCS_CMD(0x61, 0x46), 628 + _INIT_DCS_CMD(0x62, 0x32), 629 + _INIT_DCS_CMD(0x68, 0x0C), 630 + 631 + _INIT_DCS_CMD(0x6C, 0x0D), 632 + _INIT_DCS_CMD(0x6E, 0x0D), 633 + _INIT_DCS_CMD(0x78, 0x00), 634 + _INIT_DCS_CMD(0x79, 0xC5), 635 + _INIT_DCS_CMD(0x7A, 0x0C), 636 + _INIT_DCS_CMD(0x7B, 0xB0), 637 + 622 638 _INIT_DCS_CMD(0xFF, 0x26), 623 639 _INIT_DCS_CMD(0xFB, 0x01), 624 640 625 641 _INIT_DCS_CMD(0x00, 0xA1), 626 642 _INIT_DCS_CMD(0x02, 0x31), 627 - _INIT_DCS_CMD(0x0A, 0xF2), 628 - _INIT_DCS_CMD(0x04, 0x28), 643 + _INIT_DCS_CMD(0x0A, 0xF4), 644 + _INIT_DCS_CMD(0x04, 0x50), 629 645 _INIT_DCS_CMD(0x06, 0x30), 630 646 _INIT_DCS_CMD(0x0C, 0x16), 631 647 _INIT_DCS_CMD(0x0D, 0x0D), 632 648 _INIT_DCS_CMD(0x0F, 0x00), 633 649 _INIT_DCS_CMD(0x11, 0x00), 634 650 _INIT_DCS_CMD(0x12, 0x50), 635 - _INIT_DCS_CMD(0x13, 0x56), 636 - _INIT_DCS_CMD(0x14, 0x57), 651 + _INIT_DCS_CMD(0x13, 0x40), 652 + _INIT_DCS_CMD(0x14, 0x58), 637 653 _INIT_DCS_CMD(0x15, 0x00), 638 654 _INIT_DCS_CMD(0x16, 0x10), 639 655 _INIT_DCS_CMD(0x17, 0xA0), 640 656 _INIT_DCS_CMD(0x18, 0x86), 641 657 _INIT_DCS_CMD(0x22, 0x00), 642 658 _INIT_DCS_CMD(0x23, 0x00), 643 - _INIT_DCS_CMD(0x19, 0x0D), 644 - _INIT_DCS_CMD(0x1A, 0x7F), 645 - _INIT_DCS_CMD(0x1B, 0x0C), 646 - _INIT_DCS_CMD(0x1C, 0xBF), 647 - _INIT_DCS_CMD(0x2A, 0x0D), 648 - _INIT_DCS_CMD(0x2B, 0x7F), 649 - _INIT_DCS_CMD(0x20, 0x00), 659 + 660 + _INIT_DCS_CMD(0x19, 0x0E), 661 + _INIT_DCS_CMD(0x1A, 0x31), 662 + _INIT_DCS_CMD(0x1B, 0x0D), 663 + _INIT_DCS_CMD(0x1C, 0x29), 664 + _INIT_DCS_CMD(0x2A, 0x0E), 665 + _INIT_DCS_CMD(0x2B, 0x31), 650 666 651 667 _INIT_DCS_CMD(0x1D, 0x00), 652 - _INIT_DCS_CMD(0x1E, 0x78), 653 - _INIT_DCS_CMD(0x1F, 0x78), 668 + _INIT_DCS_CMD(0x1E, 0x62), 669 + _INIT_DCS_CMD(0x1F, 0x62), 654 670 655 - _INIT_DCS_CMD(0x2F, 0x03), 656 - _INIT_DCS_CMD(0x30, 0x78), 657 - _INIT_DCS_CMD(0x33, 0x78), 658 - _INIT_DCS_CMD(0x34, 0x66), 659 - _INIT_DCS_CMD(0x35, 0x11), 671 + _INIT_DCS_CMD(0x2F, 0x06), 672 + _INIT_DCS_CMD(0x30, 0x62), 673 + _INIT_DCS_CMD(0x31, 0x06), 674 + _INIT_DCS_CMD(0x32, 0x7F), 675 + _INIT_DCS_CMD(0x33, 0x11), 676 + _INIT_DCS_CMD(0x34, 0x89), 677 + _INIT_DCS_CMD(0x35, 0x67), 660 678 661 - _INIT_DCS_CMD(0x39, 0x10), 662 - _INIT_DCS_CMD(0x3A, 0x78), 679 + _INIT_DCS_CMD(0x39, 0x0B), 680 + _INIT_DCS_CMD(0x3A, 0x62), 663 681 _INIT_DCS_CMD(0x3B, 0x06), 664 682 665 683 _INIT_DCS_CMD(0xC8, 0x04), 666 - _INIT_DCS_CMD(0xC9, 0x84), 684 + _INIT_DCS_CMD(0xC9, 0x89), 667 685 _INIT_DCS_CMD(0xCA, 0x4E), 668 686 _INIT_DCS_CMD(0xCB, 0x00), 687 + _INIT_DCS_CMD(0xA9, 0x3F), 688 + _INIT_DCS_CMD(0xAA, 0x3E), 689 + _INIT_DCS_CMD(0xAB, 0x3D), 690 + _INIT_DCS_CMD(0xAC, 0x3C), 691 + _INIT_DCS_CMD(0xAD, 0x3B), 692 + _INIT_DCS_CMD(0xAE, 0x3A), 693 + _INIT_DCS_CMD(0xAF, 0x39), 694 + _INIT_DCS_CMD(0xB0, 0x38), 669 695 670 - _INIT_DCS_CMD(0xA9, 0x50), 671 - _INIT_DCS_CMD(0xAA, 0x4F), 672 - _INIT_DCS_CMD(0xAB, 0x4D), 673 - _INIT_DCS_CMD(0xAC, 0x4A), 674 - _INIT_DCS_CMD(0xAD, 0x48), 675 - _INIT_DCS_CMD(0xAE, 0x46), 676 696 _INIT_DCS_CMD(0xFF, 0x27), 677 697 _INIT_DCS_CMD(0xFB, 0x01), 698 + 699 + _INIT_DCS_CMD(0xD0, 0x11), 700 + _INIT_DCS_CMD(0xD1, 0x54), 701 + _INIT_DCS_CMD(0xDE, 0x43), 702 + _INIT_DCS_CMD(0xDF, 0x02), 703 + 678 704 _INIT_DCS_CMD(0xC0, 0x18), 679 705 _INIT_DCS_CMD(0xC1, 0x00), 680 706 _INIT_DCS_CMD(0xC2, 0x00), 707 + _INIT_DCS_CMD(0x00, 0x00), 708 + _INIT_DCS_CMD(0xC3, 0x00), 681 709 _INIT_DCS_CMD(0x56, 0x06), 710 + 682 711 _INIT_DCS_CMD(0x58, 0x80), 683 - _INIT_DCS_CMD(0x59, 0x75), 712 + _INIT_DCS_CMD(0x59, 0x78), 684 713 _INIT_DCS_CMD(0x5A, 0x00), 685 - _INIT_DCS_CMD(0x5B, 0x02), 714 + _INIT_DCS_CMD(0x5B, 0x18), 686 715 _INIT_DCS_CMD(0x5C, 0x00), 687 - _INIT_DCS_CMD(0x5D, 0x00), 716 + _INIT_DCS_CMD(0x5D, 0x01), 688 717 _INIT_DCS_CMD(0x5E, 0x20), 689 718 _INIT_DCS_CMD(0x5F, 0x10), 690 719 _INIT_DCS_CMD(0x60, 0x00), 691 - _INIT_DCS_CMD(0x61, 0x2E), 720 + _INIT_DCS_CMD(0x61, 0x1C), 692 721 _INIT_DCS_CMD(0x62, 0x00), 693 722 _INIT_DCS_CMD(0x63, 0x01), 694 - _INIT_DCS_CMD(0x64, 0x43), 695 - _INIT_DCS_CMD(0x65, 0x2D), 723 + _INIT_DCS_CMD(0x64, 0x44), 724 + _INIT_DCS_CMD(0x65, 0x1B), 696 725 _INIT_DCS_CMD(0x66, 0x00), 697 726 _INIT_DCS_CMD(0x67, 0x01), 698 - _INIT_DCS_CMD(0x68, 0x43), 727 + _INIT_DCS_CMD(0x68, 0x44), 728 + 699 729 _INIT_DCS_CMD(0x98, 0x01), 700 730 _INIT_DCS_CMD(0xB4, 0x03), 701 - _INIT_DCS_CMD(0x9B, 0xBD), 702 - _INIT_DCS_CMD(0xA0, 0x90), 703 - _INIT_DCS_CMD(0xAB, 0x1B), 704 - _INIT_DCS_CMD(0xBC, 0x0C), 731 + _INIT_DCS_CMD(0x9B, 0xBE), 732 + 733 + _INIT_DCS_CMD(0xAB, 0x14), 734 + _INIT_DCS_CMD(0xBC, 0x08), 705 735 _INIT_DCS_CMD(0xBD, 0x28), 706 736 707 737 _INIT_DCS_CMD(0xFF, 0x2A), 708 738 _INIT_DCS_CMD(0xFB, 0x01), 709 - 710 739 _INIT_DCS_CMD(0x22, 0x2F), 711 740 _INIT_DCS_CMD(0x23, 0x08), 712 741 713 742 _INIT_DCS_CMD(0x24, 0x00), 714 - _INIT_DCS_CMD(0x25, 0x65), 743 + _INIT_DCS_CMD(0x25, 0x62), 715 744 _INIT_DCS_CMD(0x26, 0xF8), 716 745 _INIT_DCS_CMD(0x27, 0x00), 717 746 _INIT_DCS_CMD(0x28, 0x1A), ··· 752 719 _INIT_DCS_CMD(0x2D, 0x1A), 753 720 754 721 _INIT_DCS_CMD(0x64, 0x96), 755 - _INIT_DCS_CMD(0x65, 0x00), 722 + _INIT_DCS_CMD(0x65, 0x10), 756 723 _INIT_DCS_CMD(0x66, 0x00), 724 + _INIT_DCS_CMD(0x67, 0x96), 725 + _INIT_DCS_CMD(0x68, 0x10), 726 + _INIT_DCS_CMD(0x69, 0x00), 757 727 _INIT_DCS_CMD(0x6A, 0x96), 758 - _INIT_DCS_CMD(0x6B, 0x00), 728 + _INIT_DCS_CMD(0x6B, 0x10), 759 729 _INIT_DCS_CMD(0x6C, 0x00), 760 730 _INIT_DCS_CMD(0x70, 0x92), 761 - _INIT_DCS_CMD(0x71, 0x00), 731 + _INIT_DCS_CMD(0x71, 0x10), 762 732 _INIT_DCS_CMD(0x72, 0x00), 763 - _INIT_DCS_CMD(0xA2, 0x33), 733 + _INIT_DCS_CMD(0x79, 0x96), 734 + _INIT_DCS_CMD(0x7A, 0x10), 735 + _INIT_DCS_CMD(0x88, 0x96), 736 + _INIT_DCS_CMD(0x89, 0x10), 737 + 738 + _INIT_DCS_CMD(0xA2, 0x3F), 764 739 _INIT_DCS_CMD(0xA3, 0x30), 765 740 _INIT_DCS_CMD(0xA4, 0xC0), 741 + _INIT_DCS_CMD(0xA5, 0x03), 742 + 766 743 _INIT_DCS_CMD(0xE8, 0x00), 744 + 767 745 _INIT_DCS_CMD(0x97, 0x3C), 768 746 _INIT_DCS_CMD(0x98, 0x02), 769 747 _INIT_DCS_CMD(0x99, 0x95), ··· 783 739 _INIT_DCS_CMD(0x9C, 0x0B), 784 740 _INIT_DCS_CMD(0x9D, 0x0A), 785 741 _INIT_DCS_CMD(0x9E, 0x90), 742 + 743 + _INIT_DCS_CMD(0xFF, 0x25), 744 + _INIT_DCS_CMD(0x13, 0x02), 745 + _INIT_DCS_CMD(0x14, 0xD7), 746 + _INIT_DCS_CMD(0xDB, 0x02), 747 + _INIT_DCS_CMD(0xDC, 0xD7), 748 + _INIT_DCS_CMD(0x17, 0xCF), 749 + _INIT_DCS_CMD(0x19, 0x0F), 750 + _INIT_DCS_CMD(0x1B, 0x5B), 751 + 752 + _INIT_DCS_CMD(0xFF, 0x20), 753 + 754 + _INIT_DCS_CMD(0xB0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x24, 0x00, 0x38, 0x00, 0x4C, 0x00, 0x5E, 0x00, 0x6F, 0x00, 0x7E), 755 + _INIT_DCS_CMD(0xB1, 0x00, 0x8C, 0x00, 0xBE, 0x00, 0xE5, 0x01, 0x27, 0x01, 0x58, 0x01, 0xA8, 0x01, 0xE8, 0x01, 0xEA), 756 + _INIT_DCS_CMD(0xB2, 0x02, 0x28, 0x02, 0x71, 0x02, 0x9E, 0x02, 0xDA, 0x03, 0x00, 0x03, 0x31, 0x03, 0x40, 0x03, 0x51), 757 + _INIT_DCS_CMD(0xB3, 0x03, 0x62, 0x03, 0x75, 0x03, 0x89, 0x03, 0x9C, 0x03, 0xAA, 0x03, 0xB2), 758 + 759 + _INIT_DCS_CMD(0xB4, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x27, 0x00, 0x3D, 0x00, 0x52, 0x00, 0x64, 0x00, 0x75, 0x00, 0x84), 760 + _INIT_DCS_CMD(0xB5, 0x00, 0x93, 0x00, 0xC5, 0x00, 0xEC, 0x01, 0x2C, 0x01, 0x5D, 0x01, 0xAC, 0x01, 0xEC, 0x01, 0xEE), 761 + _INIT_DCS_CMD(0xB6, 0x02, 0x2B, 0x02, 0x73, 0x02, 0xA0, 0x02, 0xDB, 0x03, 0x01, 0x03, 0x31, 0x03, 0x41, 0x03, 0x51), 762 + _INIT_DCS_CMD(0xB7, 0x03, 0x63, 0x03, 0x75, 0x03, 0x89, 0x03, 0x9C, 0x03, 0xAA, 0x03, 0xB2), 763 + 764 + _INIT_DCS_CMD(0xB8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x2A, 0x00, 0x40, 0x00, 0x56, 0x00, 0x68, 0x00, 0x7A, 0x00, 0x89), 765 + _INIT_DCS_CMD(0xB9, 0x00, 0x98, 0x00, 0xC9, 0x00, 0xF1, 0x01, 0x30, 0x01, 0x61, 0x01, 0xB0, 0x01, 0xEF, 0x01, 0xF1), 766 + _INIT_DCS_CMD(0xBA, 0x02, 0x2E, 0x02, 0x76, 0x02, 0xA3, 0x02, 0xDD, 0x03, 0x02, 0x03, 0x32, 0x03, 0x42, 0x03, 0x53), 767 + _INIT_DCS_CMD(0xBB, 0x03, 0x66, 0x03, 0x75, 0x03, 0x89, 0x03, 0x9C, 0x03, 0xAA, 0x03, 0xB2), 768 + 769 + _INIT_DCS_CMD(0xFF, 0x21), 770 + _INIT_DCS_CMD(0xB0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x24, 0x00, 0x38, 0x00, 0x4C, 0x00, 0x5E, 0x00, 0x6F, 0x00, 0x7E), 771 + _INIT_DCS_CMD(0xB1, 0x00, 0x8C, 0x00, 0xBE, 0x00, 0xE5, 0x01, 0x27, 0x01, 0x58, 0x01, 0xA8, 0x01, 0xE8, 0x01, 0xEA), 772 + _INIT_DCS_CMD(0xB2, 0x02, 0x28, 0x02, 0x71, 0x02, 0x9E, 0x02, 0xDA, 0x03, 0x00, 0x03, 0x31, 0x03, 0x40, 0x03, 0x51), 773 + _INIT_DCS_CMD(0xB3, 0x03, 0x62, 0x03, 0x77, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xCA, 0x03, 0xDA), 774 + 775 + _INIT_DCS_CMD(0xB4, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x27, 0x00, 0x3D, 0x00, 0x52, 0x00, 0x64, 0x00, 0x75, 0x00, 0x84), 776 + _INIT_DCS_CMD(0xB5, 0x00, 0x93, 0x00, 0xC5, 0x00, 0xEC, 0x01, 0x2C, 0x01, 0x5D, 0x01, 0xAC, 0x01, 0xEC, 0x01, 0xEE), 777 + _INIT_DCS_CMD(0xB6, 0x02, 0x2B, 0x02, 0x73, 0x02, 0xA0, 0x02, 0xDB, 0x03, 0x01, 0x03, 0x31, 0x03, 0x41, 0x03, 0x51), 778 + _INIT_DCS_CMD(0xB7, 0x03, 0x63, 0x03, 0x77, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xCA, 0x03, 0xDA), 779 + 780 + _INIT_DCS_CMD(0xB8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x2A, 0x00, 0x40, 0x00, 0x56, 0x00, 0x68, 0x00, 0x7A, 0x00, 0x89), 781 + _INIT_DCS_CMD(0xB9, 0x00, 0x98, 0x00, 0xC9, 0x00, 0xF1, 0x01, 0x30, 0x01, 0x61, 0x01, 0xB0, 0x01, 0xEF, 0x01, 0xF1), 782 + _INIT_DCS_CMD(0xBA, 0x02, 0x2E, 0x02, 0x76, 0x02, 0xA3, 0x02, 0xDD, 0x03, 0x02, 0x03, 0x32, 0x03, 0x42, 0x03, 0x53), 783 + _INIT_DCS_CMD(0xBB, 0x03, 0x66, 0x03, 0x77, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xCA, 0x03, 0xDA), 784 + 786 785 _INIT_DCS_CMD(0xFF, 0xF0), 787 786 _INIT_DCS_CMD(0xFB, 0x01), 788 787 _INIT_DCS_CMD(0x3A, 0x08), 789 - _INIT_DCS_CMD(0xFF, 0xD0), 790 - _INIT_DCS_CMD(0xFB, 0x01), 791 - _INIT_DCS_CMD(0x00, 0x33), 792 - _INIT_DCS_CMD(0x08, 0x01), 793 - _INIT_DCS_CMD(0x09, 0xBF), 794 - _INIT_DCS_CMD(0x2F, 0x33), 795 - _INIT_DCS_CMD(0xFF, 0x23), 796 - _INIT_DCS_CMD(0xFB, 0x01), 797 - _INIT_DCS_CMD(0x00, 0x80), 798 - _INIT_DCS_CMD(0x07, 0x00), 799 - _INIT_DCS_CMD(0xFF, 0x20), 800 - _INIT_DCS_CMD(0xFB, 0x01), 801 - _INIT_DCS_CMD(0x30, 0x00), 802 - _INIT_DCS_CMD(0xFF, 0x24), 803 - _INIT_DCS_CMD(0x5C, 0x88), 804 - _INIT_DCS_CMD(0x5D, 0x08), 788 + 805 789 _INIT_DCS_CMD(0xFF, 0x10), 806 790 _INIT_DCS_CMD(0xB9, 0x01), 791 + 807 792 _INIT_DCS_CMD(0xFF, 0x20), 793 + 808 794 _INIT_DCS_CMD(0x18, 0x40), 809 795 _INIT_DCS_CMD(0xFF, 0x10), 796 + 810 797 _INIT_DCS_CMD(0xB9, 0x02), 811 798 _INIT_DCS_CMD(0xFF, 0x10), 799 + 812 800 _INIT_DCS_CMD(0xFB, 0x01), 813 - _INIT_DCS_CMD(0xBB, 0x13), 814 - _INIT_DCS_CMD(0x3B, 0x03, 0x96, 0x1A, 0x04, 0x04), 801 + _INIT_DCS_CMD(0xB0, 0x01), 815 802 _INIT_DCS_CMD(0x35, 0x00), 816 - _INIT_DCS_CMD(0x51, 0x0F, 0xFF), 817 - _INIT_DCS_CMD(0x53, 0x24), 803 + _INIT_DCS_CMD(0x3B, 0x03, 0xAE, 0x1A, 0x04, 0x04), 818 804 _INIT_DELAY_CMD(100), 819 805 _INIT_DCS_CMD(0x11), 820 806 _INIT_DELAY_CMD(200), ··· 854 780 }; 855 781 856 782 static const struct panel_init_cmd boe_init_cmd[] = { 857 - _INIT_DELAY_CMD(24), 858 783 _INIT_DCS_CMD(0xB0, 0x05), 859 784 _INIT_DCS_CMD(0xB1, 0xE5), 860 785 _INIT_DCS_CMD(0xB3, 0x52), ··· 1439 1366 1440 1367 usleep_range(10000, 11000); 1441 1368 1369 + if (boe->desc->lp11_before_reset) { 1370 + mipi_dsi_dcs_nop(boe->dsi); 1371 + usleep_range(1000, 2000); 1372 + } 1442 1373 gpiod_set_value(boe->enable_gpio, 1); 1443 1374 usleep_range(1000, 2000); 1444 1375 gpiod_set_value(boe->enable_gpio, 0); ··· 1508 1431 }; 1509 1432 1510 1433 static const struct drm_display_mode inx_hj110iz_default_mode = { 1511 - .clock = 166594, 1434 + .clock = 168432, 1512 1435 .hdisplay = 1200, 1513 1436 .hsync_start = 1200 + 40, 1514 1437 .hsync_end = 1200 + 40 + 8, 1515 1438 .htotal = 1200 + 40 + 8 + 28, 1516 1439 .vdisplay = 2000, 1517 1440 .vsync_start = 2000 + 26, 1518 - .vsync_end = 2000 + 26 + 1, 1519 - .vtotal = 2000 + 26 + 1 + 149, 1441 + .vsync_end = 2000 + 26 + 2, 1442 + .vtotal = 2000 + 26 + 2 + 172, 1520 1443 .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, 1521 1444 }; 1522 1445 ··· 1669 1592 .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | 1670 1593 MIPI_DSI_MODE_LPM, 1671 1594 .init_cmds = boe_init_cmd, 1595 + .lp11_before_reset = true, 1672 1596 }; 1673 1597 1674 1598 static const struct drm_display_mode starry_qfh032011_53g_default_mode = {
+585
drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Samsung S6D7AA0 MIPI-DSI TFT LCD controller drm_panel driver. 4 + * 5 + * Copyright (C) 2022 Artur Weber <aweber.kernel@gmail.com> 6 + */ 7 + 8 + #include <linux/backlight.h> 9 + #include <linux/delay.h> 10 + #include <linux/gpio/consumer.h> 11 + #include <linux/module.h> 12 + #include <linux/regulator/consumer.h> 13 + #include <linux/of.h> 14 + #include <linux/of_device.h> 15 + 16 + #include <video/mipi_display.h> 17 + #include <drm/drm_mipi_dsi.h> 18 + #include <drm/drm_modes.h> 19 + #include <drm/drm_panel.h> 20 + 21 + /* Manufacturer command set */ 22 + #define MCS_BL_CTL 0xc3 23 + #define MCS_OTP_RELOAD 0xd0 24 + #define MCS_PASSWD1 0xf0 25 + #define MCS_PASSWD2 0xf1 26 + #define MCS_PASSWD3 0xfc 27 + 28 + struct s6d7aa0 { 29 + struct drm_panel panel; 30 + struct mipi_dsi_device *dsi; 31 + struct gpio_desc *reset_gpio; 32 + struct regulator_bulk_data supplies[2]; 33 + const struct s6d7aa0_panel_desc *desc; 34 + }; 35 + 36 + struct s6d7aa0_panel_desc { 37 + unsigned int panel_type; 38 + int (*init_func)(struct s6d7aa0 *ctx); 39 + int (*off_func)(struct s6d7aa0 *ctx); 40 + const struct drm_display_mode *drm_mode; 41 + unsigned long mode_flags; 42 + u32 bus_flags; 43 + bool has_backlight; 44 + bool use_passwd3; 45 + }; 46 + 47 + enum s6d7aa0_panels { 48 + S6D7AA0_PANEL_LSL080AL02, 49 + S6D7AA0_PANEL_LSL080AL03, 50 + S6D7AA0_PANEL_LTL101AT01, 51 + }; 52 + 53 + static inline struct s6d7aa0 *panel_to_s6d7aa0(struct drm_panel *panel) 54 + { 55 + return container_of(panel, struct s6d7aa0, panel); 56 + } 57 + 58 + static void s6d7aa0_reset(struct s6d7aa0 *ctx) 59 + { 60 + gpiod_set_value_cansleep(ctx->reset_gpio, 1); 61 + msleep(50); 62 + gpiod_set_value_cansleep(ctx->reset_gpio, 0); 63 + msleep(50); 64 + } 65 + 66 + static int s6d7aa0_lock(struct s6d7aa0 *ctx, bool lock) 67 + { 68 + struct mipi_dsi_device *dsi = ctx->dsi; 69 + int ret = 0; 70 + 71 + if (lock) { 72 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD1, 0xa5, 0xa5); 73 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD2, 0xa5, 0xa5); 74 + if (ctx->desc->use_passwd3) 75 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD3, 0x5a, 0x5a); 76 + } else { 77 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD1, 0x5a, 0x5a); 78 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD2, 0x5a, 0x5a); 79 + if (ctx->desc->use_passwd3) 80 + mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD3, 0xa5, 0xa5); 81 + } 82 + 83 + return ret; 84 + } 85 + 86 + static int s6d7aa0_on(struct s6d7aa0 *ctx) 87 + { 88 + struct mipi_dsi_device *dsi = ctx->dsi; 89 + struct device *dev = &dsi->dev; 90 + int ret; 91 + 92 + ret = ctx->desc->init_func(ctx); 93 + if (ret < 0) { 94 + dev_err(dev, "Failed to initialize panel: %d\n", ret); 95 + gpiod_set_value_cansleep(ctx->reset_gpio, 1); 96 + return ret; 97 + } 98 + 99 + ret = mipi_dsi_dcs_set_display_on(dsi); 100 + if (ret < 0) { 101 + dev_err(dev, "Failed to set display on: %d\n", ret); 102 + return ret; 103 + } 104 + 105 + return 0; 106 + } 107 + 108 + static int s6d7aa0_off(struct s6d7aa0 *ctx) 109 + { 110 + struct mipi_dsi_device *dsi = ctx->dsi; 111 + struct device *dev = &dsi->dev; 112 + int ret; 113 + 114 + ret = ctx->desc->off_func(ctx); 115 + if (ret < 0) { 116 + dev_err(dev, "Panel-specific off function failed: %d\n", ret); 117 + return ret; 118 + } 119 + 120 + ret = mipi_dsi_dcs_set_display_off(dsi); 121 + if (ret < 0) { 122 + dev_err(dev, "Failed to set display off: %d\n", ret); 123 + return ret; 124 + } 125 + msleep(64); 126 + 127 + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 128 + if (ret < 0) { 129 + dev_err(dev, "Failed to enter sleep mode: %d\n", ret); 130 + return ret; 131 + } 132 + msleep(120); 133 + 134 + return 0; 135 + } 136 + 137 + static int s6d7aa0_prepare(struct drm_panel *panel) 138 + { 139 + struct s6d7aa0 *ctx = panel_to_s6d7aa0(panel); 140 + struct device *dev = &ctx->dsi->dev; 141 + int ret; 142 + 143 + ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies); 144 + if (ret < 0) { 145 + dev_err(dev, "Failed to enable regulators: %d\n", ret); 146 + return ret; 147 + } 148 + 149 + s6d7aa0_reset(ctx); 150 + 151 + ret = s6d7aa0_on(ctx); 152 + if (ret < 0) { 153 + dev_err(dev, "Failed to initialize panel: %d\n", ret); 154 + gpiod_set_value_cansleep(ctx->reset_gpio, 1); 155 + return ret; 156 + } 157 + 158 + return 0; 159 + } 160 + 161 + static int s6d7aa0_disable(struct drm_panel *panel) 162 + { 163 + struct s6d7aa0 *ctx = panel_to_s6d7aa0(panel); 164 + struct device *dev = &ctx->dsi->dev; 165 + int ret; 166 + 167 + ret = s6d7aa0_off(ctx); 168 + if (ret < 0) 169 + dev_err(dev, "Failed to un-initialize panel: %d\n", ret); 170 + 171 + return 0; 172 + } 173 + 174 + static int s6d7aa0_unprepare(struct drm_panel *panel) 175 + { 176 + struct s6d7aa0 *ctx = panel_to_s6d7aa0(panel); 177 + 178 + gpiod_set_value_cansleep(ctx->reset_gpio, 1); 179 + regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); 180 + 181 + return 0; 182 + } 183 + 184 + /* Backlight control code */ 185 + 186 + static int s6d7aa0_bl_update_status(struct backlight_device *bl) 187 + { 188 + struct mipi_dsi_device *dsi = bl_get_data(bl); 189 + u16 brightness = backlight_get_brightness(bl); 190 + int ret; 191 + 192 + ret = mipi_dsi_dcs_set_display_brightness(dsi, brightness); 193 + if (ret < 0) 194 + return ret; 195 + 196 + return 0; 197 + } 198 + 199 + static int s6d7aa0_bl_get_brightness(struct backlight_device *bl) 200 + { 201 + struct mipi_dsi_device *dsi = bl_get_data(bl); 202 + u16 brightness; 203 + int ret; 204 + 205 + ret = mipi_dsi_dcs_get_display_brightness(dsi, &brightness); 206 + if (ret < 0) 207 + return ret; 208 + 209 + return brightness & 0xff; 210 + } 211 + 212 + static const struct backlight_ops s6d7aa0_bl_ops = { 213 + .update_status = s6d7aa0_bl_update_status, 214 + .get_brightness = s6d7aa0_bl_get_brightness, 215 + }; 216 + 217 + static struct backlight_device * 218 + s6d7aa0_create_backlight(struct mipi_dsi_device *dsi) 219 + { 220 + struct device *dev = &dsi->dev; 221 + const struct backlight_properties props = { 222 + .type = BACKLIGHT_RAW, 223 + .brightness = 255, 224 + .max_brightness = 255, 225 + }; 226 + 227 + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, 228 + &s6d7aa0_bl_ops, &props); 229 + } 230 + 231 + /* Initialization code and structures for LSL080AL02 panel */ 232 + 233 + static int s6d7aa0_lsl080al02_init(struct s6d7aa0 *ctx) 234 + { 235 + struct mipi_dsi_device *dsi = ctx->dsi; 236 + struct device *dev = &dsi->dev; 237 + int ret; 238 + 239 + usleep_range(20000, 25000); 240 + 241 + ret = s6d7aa0_lock(ctx, false); 242 + if (ret < 0) { 243 + dev_err(dev, "Failed to unlock registers: %d\n", ret); 244 + return ret; 245 + } 246 + 247 + mipi_dsi_dcs_write_seq(dsi, MCS_OTP_RELOAD, 0x00, 0x10); 248 + usleep_range(1000, 1500); 249 + 250 + /* SEQ_B6_PARAM_8_R01 */ 251 + mipi_dsi_dcs_write_seq(dsi, 0xb6, 0x10); 252 + 253 + /* BL_CTL_ON */ 254 + mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x28); 255 + 256 + usleep_range(5000, 6000); 257 + 258 + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x04); 259 + 260 + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 261 + if (ret < 0) { 262 + dev_err(dev, "Failed to exit sleep mode: %d\n", ret); 263 + return ret; 264 + } 265 + 266 + msleep(120); 267 + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x00); 268 + 269 + ret = s6d7aa0_lock(ctx, true); 270 + if (ret < 0) { 271 + dev_err(dev, "Failed to lock registers: %d\n", ret); 272 + return ret; 273 + } 274 + 275 + ret = mipi_dsi_dcs_set_display_on(dsi); 276 + if (ret < 0) { 277 + dev_err(dev, "Failed to set display on: %d\n", ret); 278 + return ret; 279 + } 280 + 281 + return 0; 282 + } 283 + 284 + static int s6d7aa0_lsl080al02_off(struct s6d7aa0 *ctx) 285 + { 286 + struct mipi_dsi_device *dsi = ctx->dsi; 287 + 288 + /* BL_CTL_OFF */ 289 + mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x20); 290 + 291 + return 0; 292 + } 293 + 294 + static const struct drm_display_mode s6d7aa0_lsl080al02_mode = { 295 + .clock = (800 + 16 + 4 + 140) * (1280 + 8 + 4 + 4) * 60 / 1000, 296 + .hdisplay = 800, 297 + .hsync_start = 800 + 16, 298 + .hsync_end = 800 + 16 + 4, 299 + .htotal = 800 + 16 + 4 + 140, 300 + .vdisplay = 1280, 301 + .vsync_start = 1280 + 8, 302 + .vsync_end = 1280 + 8 + 4, 303 + .vtotal = 1280 + 8 + 4 + 4, 304 + .width_mm = 108, 305 + .height_mm = 173, 306 + }; 307 + 308 + static const struct s6d7aa0_panel_desc s6d7aa0_lsl080al02_desc = { 309 + .panel_type = S6D7AA0_PANEL_LSL080AL02, 310 + .init_func = s6d7aa0_lsl080al02_init, 311 + .off_func = s6d7aa0_lsl080al02_off, 312 + .drm_mode = &s6d7aa0_lsl080al02_mode, 313 + .mode_flags = MIPI_DSI_MODE_VSYNC_FLUSH | MIPI_DSI_MODE_VIDEO_NO_HFP, 314 + .bus_flags = DRM_BUS_FLAG_DE_HIGH, 315 + 316 + .has_backlight = false, 317 + .use_passwd3 = false, 318 + }; 319 + 320 + /* Initialization code and structures for LSL080AL03 panel */ 321 + 322 + static int s6d7aa0_lsl080al03_init(struct s6d7aa0 *ctx) 323 + { 324 + struct mipi_dsi_device *dsi = ctx->dsi; 325 + struct device *dev = &dsi->dev; 326 + int ret; 327 + 328 + usleep_range(20000, 25000); 329 + 330 + ret = s6d7aa0_lock(ctx, false); 331 + if (ret < 0) { 332 + dev_err(dev, "Failed to unlock registers: %d\n", ret); 333 + return ret; 334 + } 335 + 336 + if (ctx->desc->panel_type == S6D7AA0_PANEL_LSL080AL03) { 337 + mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0xc7, 0x00, 0x29); 338 + mipi_dsi_dcs_write_seq(dsi, 0xbc, 0x01, 0x4e, 0xa0); 339 + mipi_dsi_dcs_write_seq(dsi, 0xfd, 0x16, 0x10, 0x11, 0x23, 340 + 0x09); 341 + mipi_dsi_dcs_write_seq(dsi, 0xfe, 0x00, 0x02, 0x03, 0x21, 342 + 0x80, 0x78); 343 + } else if (ctx->desc->panel_type == S6D7AA0_PANEL_LTL101AT01) { 344 + mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x08); 345 + mipi_dsi_dcs_write_seq(dsi, 0xbc, 0x01, 0x4e, 0x0b); 346 + mipi_dsi_dcs_write_seq(dsi, 0xfd, 0x16, 0x10, 0x11, 0x23, 347 + 0x09); 348 + mipi_dsi_dcs_write_seq(dsi, 0xfe, 0x00, 0x02, 0x03, 0x21, 349 + 0x80, 0x68); 350 + } 351 + 352 + mipi_dsi_dcs_write_seq(dsi, 0xb3, 0x51); 353 + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); 354 + mipi_dsi_dcs_write_seq(dsi, 0xf2, 0x02, 0x08, 0x08); 355 + 356 + usleep_range(10000, 11000); 357 + 358 + mipi_dsi_dcs_write_seq(dsi, 0xc0, 0x80, 0x80, 0x30); 359 + mipi_dsi_dcs_write_seq(dsi, 0xcd, 360 + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 361 + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e); 362 + mipi_dsi_dcs_write_seq(dsi, 0xce, 363 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 364 + 0x00, 0x00, 0x00, 0x00, 0x00); 365 + mipi_dsi_dcs_write_seq(dsi, 0xc1, 0x03); 366 + 367 + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 368 + if (ret < 0) { 369 + dev_err(dev, "Failed to exit sleep mode: %d\n", ret); 370 + return ret; 371 + } 372 + 373 + ret = s6d7aa0_lock(ctx, true); 374 + if (ret < 0) { 375 + dev_err(dev, "Failed to lock registers: %d\n", ret); 376 + return ret; 377 + } 378 + 379 + ret = mipi_dsi_dcs_set_display_on(dsi); 380 + if (ret < 0) { 381 + dev_err(dev, "Failed to set display on: %d\n", ret); 382 + return ret; 383 + } 384 + 385 + return 0; 386 + } 387 + 388 + static int s6d7aa0_lsl080al03_off(struct s6d7aa0 *ctx) 389 + { 390 + struct mipi_dsi_device *dsi = ctx->dsi; 391 + 392 + mipi_dsi_dcs_write_seq(dsi, 0x22, 0x00); 393 + 394 + return 0; 395 + } 396 + 397 + static const struct drm_display_mode s6d7aa0_lsl080al03_mode = { 398 + .clock = (768 + 18 + 16 + 126) * (1024 + 8 + 2 + 6) * 60 / 1000, 399 + .hdisplay = 768, 400 + .hsync_start = 768 + 18, 401 + .hsync_end = 768 + 18 + 16, 402 + .htotal = 768 + 18 + 16 + 126, 403 + .vdisplay = 1024, 404 + .vsync_start = 1024 + 8, 405 + .vsync_end = 1024 + 8 + 2, 406 + .vtotal = 1024 + 8 + 2 + 6, 407 + .width_mm = 122, 408 + .height_mm = 163, 409 + }; 410 + 411 + static const struct s6d7aa0_panel_desc s6d7aa0_lsl080al03_desc = { 412 + .panel_type = S6D7AA0_PANEL_LSL080AL03, 413 + .init_func = s6d7aa0_lsl080al03_init, 414 + .off_func = s6d7aa0_lsl080al03_off, 415 + .drm_mode = &s6d7aa0_lsl080al03_mode, 416 + .mode_flags = MIPI_DSI_MODE_NO_EOT_PACKET, 417 + .bus_flags = 0, 418 + 419 + .has_backlight = true, 420 + .use_passwd3 = true, 421 + }; 422 + 423 + /* Initialization structures for LTL101AT01 panel */ 424 + 425 + static const struct drm_display_mode s6d7aa0_ltl101at01_mode = { 426 + .clock = (768 + 96 + 16 + 184) * (1024 + 8 + 2 + 6) * 60 / 1000, 427 + .hdisplay = 768, 428 + .hsync_start = 768 + 96, 429 + .hsync_end = 768 + 96 + 16, 430 + .htotal = 768 + 96 + 16 + 184, 431 + .vdisplay = 1024, 432 + .vsync_start = 1024 + 8, 433 + .vsync_end = 1024 + 8 + 2, 434 + .vtotal = 1024 + 8 + 2 + 6, 435 + .width_mm = 148, 436 + .height_mm = 197, 437 + }; 438 + 439 + static const struct s6d7aa0_panel_desc s6d7aa0_ltl101at01_desc = { 440 + .panel_type = S6D7AA0_PANEL_LTL101AT01, 441 + .init_func = s6d7aa0_lsl080al03_init, /* Similar init to LSL080AL03 */ 442 + .off_func = s6d7aa0_lsl080al03_off, 443 + .drm_mode = &s6d7aa0_ltl101at01_mode, 444 + .mode_flags = MIPI_DSI_MODE_NO_EOT_PACKET, 445 + .bus_flags = 0, 446 + 447 + .has_backlight = true, 448 + .use_passwd3 = true, 449 + }; 450 + 451 + static int s6d7aa0_get_modes(struct drm_panel *panel, 452 + struct drm_connector *connector) 453 + { 454 + struct drm_display_mode *mode; 455 + struct s6d7aa0 *ctx; 456 + 457 + ctx = container_of(panel, struct s6d7aa0, panel); 458 + if (!ctx) 459 + return -EINVAL; 460 + 461 + mode = drm_mode_duplicate(connector->dev, ctx->desc->drm_mode); 462 + if (!mode) 463 + return -ENOMEM; 464 + 465 + drm_mode_set_name(mode); 466 + 467 + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; 468 + connector->display_info.width_mm = mode->width_mm; 469 + connector->display_info.height_mm = mode->height_mm; 470 + connector->display_info.bus_flags = ctx->desc->bus_flags; 471 + drm_mode_probed_add(connector, mode); 472 + 473 + return 1; 474 + } 475 + 476 + static const struct drm_panel_funcs s6d7aa0_panel_funcs = { 477 + .disable = s6d7aa0_disable, 478 + .prepare = s6d7aa0_prepare, 479 + .unprepare = s6d7aa0_unprepare, 480 + .get_modes = s6d7aa0_get_modes, 481 + }; 482 + 483 + static int s6d7aa0_probe(struct mipi_dsi_device *dsi) 484 + { 485 + struct device *dev = &dsi->dev; 486 + struct s6d7aa0 *ctx; 487 + int ret; 488 + 489 + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 490 + if (!ctx) 491 + return -ENOMEM; 492 + 493 + ctx->desc = of_device_get_match_data(dev); 494 + if (!ctx->desc) 495 + return -ENODEV; 496 + 497 + ctx->supplies[0].supply = "power"; 498 + ctx->supplies[1].supply = "vmipi"; 499 + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies), 500 + ctx->supplies); 501 + if (ret < 0) 502 + return dev_err_probe(dev, ret, "Failed to get regulators\n"); 503 + 504 + ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); 505 + if (IS_ERR(ctx->reset_gpio)) 506 + return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), 507 + "Failed to get reset-gpios\n"); 508 + 509 + ctx->dsi = dsi; 510 + mipi_dsi_set_drvdata(dsi, ctx); 511 + 512 + dsi->lanes = 4; 513 + dsi->format = MIPI_DSI_FMT_RGB888; 514 + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST 515 + | ctx->desc->mode_flags; 516 + 517 + drm_panel_init(&ctx->panel, dev, &s6d7aa0_panel_funcs, 518 + DRM_MODE_CONNECTOR_DSI); 519 + ctx->panel.prepare_prev_first = true; 520 + 521 + ret = drm_panel_of_backlight(&ctx->panel); 522 + if (ret) 523 + return dev_err_probe(dev, ret, "Failed to get backlight\n"); 524 + 525 + /* Use DSI-based backlight as fallback if available */ 526 + if (ctx->desc->has_backlight && !ctx->panel.backlight) { 527 + ctx->panel.backlight = s6d7aa0_create_backlight(dsi); 528 + if (IS_ERR(ctx->panel.backlight)) 529 + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), 530 + "Failed to create backlight\n"); 531 + } 532 + 533 + drm_panel_add(&ctx->panel); 534 + 535 + ret = mipi_dsi_attach(dsi); 536 + if (ret < 0) { 537 + dev_err(dev, "Failed to attach to DSI host: %d\n", ret); 538 + drm_panel_remove(&ctx->panel); 539 + return ret; 540 + } 541 + 542 + return 0; 543 + } 544 + 545 + static void s6d7aa0_remove(struct mipi_dsi_device *dsi) 546 + { 547 + struct s6d7aa0 *ctx = mipi_dsi_get_drvdata(dsi); 548 + int ret; 549 + 550 + ret = mipi_dsi_detach(dsi); 551 + if (ret < 0) 552 + dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); 553 + 554 + drm_panel_remove(&ctx->panel); 555 + } 556 + 557 + static const struct of_device_id s6d7aa0_of_match[] = { 558 + { 559 + .compatible = "samsung,lsl080al02", 560 + .data = &s6d7aa0_lsl080al02_desc 561 + }, 562 + { 563 + .compatible = "samsung,lsl080al03", 564 + .data = &s6d7aa0_lsl080al03_desc 565 + }, 566 + { 567 + .compatible = "samsung,ltl101at01", 568 + .data = &s6d7aa0_ltl101at01_desc 569 + }, 570 + { /* sentinel */ } 571 + }; 572 + 573 + static struct mipi_dsi_driver s6d7aa0_driver = { 574 + .probe = s6d7aa0_probe, 575 + .remove = s6d7aa0_remove, 576 + .driver = { 577 + .name = "panel-samsung-s6d7aa0", 578 + .of_match_table = s6d7aa0_of_match, 579 + }, 580 + }; 581 + module_mipi_dsi_driver(s6d7aa0_driver); 582 + 583 + MODULE_AUTHOR("Artur Weber <aweber.kernel@gmail.com>"); 584 + MODULE_DESCRIPTION("Samsung S6D7AA0 MIPI-DSI LCD controller driver"); 585 + MODULE_LICENSE("GPL");
+6 -37
drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c
··· 28 28 struct gpio_desc *reset_gpio; 29 29 30 30 bool prepared; 31 - bool enabled; 32 - 33 - const struct drm_display_mode *mode; 34 31 }; 35 32 36 33 static inline struct sharp_nt_panel *to_sharp_nt_panel(struct drm_panel *panel) ··· 90 93 ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 91 94 if (ret < 0) 92 95 return ret; 93 - 94 - return 0; 95 - } 96 - 97 - 98 - static int sharp_nt_panel_disable(struct drm_panel *panel) 99 - { 100 - struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); 101 - 102 - if (!sharp_nt->enabled) 103 - return 0; 104 - 105 - sharp_nt->enabled = false; 106 96 107 97 return 0; 108 98 } ··· 163 179 return ret; 164 180 } 165 181 166 - static int sharp_nt_panel_enable(struct drm_panel *panel) 167 - { 168 - struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); 169 - 170 - if (sharp_nt->enabled) 171 - return 0; 172 - 173 - sharp_nt->enabled = true; 174 - 175 - return 0; 176 - } 177 - 178 182 static const struct drm_display_mode default_mode = { 179 - .clock = 41118, 183 + .clock = (540 + 48 + 32 + 80) * (960 + 3 + 10 + 15) * 60 / 1000, 180 184 .hdisplay = 540, 181 185 .hsync_start = 540 + 48, 182 - .hsync_end = 540 + 48 + 80, 183 - .htotal = 540 + 48 + 80 + 32, 186 + .hsync_end = 540 + 48 + 32, 187 + .htotal = 540 + 48 + 32 + 80, 184 188 .vdisplay = 960, 185 189 .vsync_start = 960 + 3, 186 - .vsync_end = 960 + 3 + 15, 187 - .vtotal = 960 + 3 + 15 + 1, 190 + .vsync_end = 960 + 3 + 10, 191 + .vtotal = 960 + 3 + 10 + 15, 188 192 }; 189 193 190 194 static int sharp_nt_panel_get_modes(struct drm_panel *panel, ··· 199 227 } 200 228 201 229 static const struct drm_panel_funcs sharp_nt_panel_funcs = { 202 - .disable = sharp_nt_panel_disable, 203 230 .unprepare = sharp_nt_panel_unprepare, 204 231 .prepare = sharp_nt_panel_prepare, 205 - .enable = sharp_nt_panel_enable, 206 232 .get_modes = sharp_nt_panel_get_modes, 207 233 }; 208 234 ··· 208 238 { 209 239 struct device *dev = &sharp_nt->dsi->dev; 210 240 int ret; 211 - 212 - sharp_nt->mode = &default_mode; 213 241 214 242 sharp_nt->supply = devm_regulator_get(dev, "avdd"); 215 243 if (IS_ERR(sharp_nt->supply)) ··· 248 280 dsi->lanes = 2; 249 281 dsi->format = MIPI_DSI_FMT_RGB888; 250 282 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | 283 + MIPI_DSI_MODE_VIDEO_SYNC_PULSE | 251 284 MIPI_DSI_MODE_VIDEO_HSE | 252 285 MIPI_DSI_CLOCK_NON_CONTINUOUS | 253 286 MIPI_DSI_MODE_NO_EOT_PACKET;
+34
drivers/gpu/drm/panel/panel-simple.c
··· 1211 1211 }, 1212 1212 }; 1213 1213 1214 + static const struct display_timing boe_ev121wxm_n10_1850_timing = { 1215 + .pixelclock = { 69922000, 71000000, 72293000 }, 1216 + .hactive = { 1280, 1280, 1280 }, 1217 + .hfront_porch = { 48, 48, 48 }, 1218 + .hback_porch = { 80, 80, 80 }, 1219 + .hsync_len = { 32, 32, 32 }, 1220 + .vactive = { 800, 800, 800 }, 1221 + .vfront_porch = { 3, 3, 3 }, 1222 + .vback_porch = { 14, 14, 14 }, 1223 + .vsync_len = { 6, 6, 6 }, 1224 + }; 1225 + 1226 + static const struct panel_desc boe_ev121wxm_n10_1850 = { 1227 + .timings = &boe_ev121wxm_n10_1850_timing, 1228 + .num_timings = 1, 1229 + .bpc = 8, 1230 + .size = { 1231 + .width = 261, 1232 + .height = 163, 1233 + }, 1234 + .delay = { 1235 + .prepare = 9, 1236 + .enable = 300, 1237 + .unprepare = 300, 1238 + .disable = 560, 1239 + }, 1240 + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, 1241 + .bus_flags = DRM_BUS_FLAG_DE_HIGH, 1242 + .connector_type = DRM_MODE_CONNECTOR_LVDS, 1243 + }; 1244 + 1214 1245 static const struct drm_display_mode boe_hv070wsa_mode = { 1215 1246 .clock = 42105, 1216 1247 .hdisplay = 1024, ··· 4047 4016 }, { 4048 4017 .compatible = "bananapi,s070wv20-ct16", 4049 4018 .data = &bananapi_s070wv20_ct16, 4019 + }, { 4020 + .compatible = "boe,ev121wxm-n10-1850", 4021 + .data = &boe_ev121wxm_n10_1850, 4050 4022 }, { 4051 4023 .compatible = "boe,hv070wsa-100", 4052 4024 .data = &boe_hv070wsa
+2 -2
drivers/gpu/drm/scheduler/sched_entity.c
··· 342 342 container_of(cb, struct drm_sched_entity, cb); 343 343 344 344 drm_sched_entity_clear_dep(f, cb); 345 - drm_sched_wakeup(entity->rq->sched); 345 + drm_sched_wakeup_if_can_queue(entity->rq->sched); 346 346 } 347 347 348 348 /** ··· 565 565 if (drm_sched_policy == DRM_SCHED_POLICY_FIFO) 566 566 drm_sched_rq_update_fifo(entity, submit_ts); 567 567 568 - drm_sched_wakeup(entity->rq->sched); 568 + drm_sched_wakeup_if_can_queue(entity->rq->sched); 569 569 } 570 570 } 571 571 EXPORT_SYMBOL(drm_sched_entity_push_job);
+7 -8
drivers/gpu/drm/scheduler/sched_main.c
··· 848 848 EXPORT_SYMBOL(drm_sched_job_cleanup); 849 849 850 850 /** 851 - * drm_sched_ready - is the scheduler ready 852 - * 851 + * drm_sched_can_queue -- Can we queue more to the hardware? 853 852 * @sched: scheduler instance 854 853 * 855 854 * Return true if we can push more jobs to the hw, otherwise false. 856 855 */ 857 - static bool drm_sched_ready(struct drm_gpu_scheduler *sched) 856 + static bool drm_sched_can_queue(struct drm_gpu_scheduler *sched) 858 857 { 859 858 return atomic_read(&sched->hw_rq_count) < 860 859 sched->hw_submission_limit; 861 860 } 862 861 863 862 /** 864 - * drm_sched_wakeup - Wake up the scheduler when it is ready 865 - * 863 + * drm_sched_wakeup_if_can_queue - Wake up the scheduler 866 864 * @sched: scheduler instance 867 865 * 866 + * Wake up the scheduler if we can queue jobs. 868 867 */ 869 - void drm_sched_wakeup(struct drm_gpu_scheduler *sched) 868 + void drm_sched_wakeup_if_can_queue(struct drm_gpu_scheduler *sched) 870 869 { 871 - if (drm_sched_ready(sched)) 870 + if (drm_sched_can_queue(sched)) 872 871 wake_up_interruptible(&sched->wake_up_worker); 873 872 } 874 873 ··· 884 885 struct drm_sched_entity *entity; 885 886 int i; 886 887 887 - if (!drm_sched_ready(sched)) 888 + if (!drm_sched_can_queue(sched)) 888 889 return NULL; 889 890 890 891 /* Kernel run queue has higher priority than normal run queue*/
+2 -2
drivers/gpu/drm/shmobile/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 config DRM_SHMOBILE 3 3 tristate "DRM Support for SH Mobile" 4 - depends on DRM && ARM 5 - depends on ARCH_SHMOBILE || COMPILE_TEST 4 + depends on DRM 5 + depends on ARCH_RENESAS || ARCH_SHMOBILE || COMPILE_TEST 6 6 select BACKLIGHT_CLASS_DEVICE 7 7 select DRM_KMS_HELPER 8 8 select DRM_GEM_DMA_HELPER
+31 -4
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
··· 18 18 #include <drm/drm_gem_dma_helper.h> 19 19 #include <drm/drm_modeset_helper.h> 20 20 #include <drm/drm_modeset_helper_vtables.h> 21 + #include <drm/drm_plane_helper.h> 21 22 #include <drm/drm_probe_helper.h> 22 23 #include <drm/drm_simple_kms_helper.h> 23 24 #include <drm/drm_vblank.h> ··· 233 232 value = LDDDSR_LS | LDDDSR_WS | LDDDSR_BS; 234 233 break; 235 234 case DRM_FORMAT_ARGB8888: 235 + case DRM_FORMAT_XRGB8888: 236 236 default: 237 237 value = LDDDSR_LS; 238 238 break; ··· 357 355 358 356 format = shmob_drm_format_info(crtc->primary->fb->format->format); 359 357 if (format == NULL) { 360 - dev_dbg(sdev->dev, "mode_set: unsupported format %08x\n", 361 - crtc->primary->fb->format->format); 358 + dev_dbg(sdev->dev, "mode_set: unsupported format %p4cc\n", 359 + &crtc->primary->fb->format->format); 362 360 return -EINVAL; 363 361 } 364 362 ··· 479 477 .disable_vblank = shmob_drm_disable_vblank, 480 478 }; 481 479 480 + static const uint32_t modeset_formats[] = { 481 + DRM_FORMAT_RGB565, 482 + DRM_FORMAT_RGB888, 483 + DRM_FORMAT_ARGB8888, 484 + DRM_FORMAT_XRGB8888, 485 + }; 486 + 487 + static const struct drm_plane_funcs primary_plane_funcs = { 488 + DRM_PLANE_NON_ATOMIC_FUNCS, 489 + }; 490 + 482 491 int shmob_drm_crtc_create(struct shmob_drm_device *sdev) 483 492 { 484 493 struct drm_crtc *crtc = &sdev->crtc.crtc; 494 + struct drm_plane *primary; 485 495 int ret; 486 496 487 497 sdev->crtc.dpms = DRM_MODE_DPMS_OFF; 488 498 489 - ret = drm_crtc_init(sdev->ddev, crtc, &crtc_funcs); 490 - if (ret < 0) 499 + primary = __drm_universal_plane_alloc(sdev->ddev, sizeof(*primary), 0, 500 + 0, &primary_plane_funcs, 501 + modeset_formats, 502 + ARRAY_SIZE(modeset_formats), 503 + NULL, DRM_PLANE_TYPE_PRIMARY, 504 + NULL); 505 + if (IS_ERR(primary)) 506 + return PTR_ERR(primary); 507 + 508 + ret = drm_crtc_init_with_planes(sdev->ddev, crtc, primary, NULL, 509 + &crtc_funcs, NULL); 510 + if (ret < 0) { 511 + drm_plane_cleanup(primary); 512 + kfree(primary); 491 513 return ret; 514 + } 492 515 493 516 drm_crtc_helper_add(crtc, &crtc_helper_funcs); 494 517
+3
drivers/gpu/drm/shmobile/shmob_drm_drv.c
··· 16 16 #include <linux/slab.h> 17 17 18 18 #include <drm/drm_drv.h> 19 + #include <drm/drm_fbdev_generic.h> 19 20 #include <drm/drm_gem_dma_helper.h> 20 21 #include <drm/drm_module.h> 21 22 #include <drm/drm_probe_helper.h> ··· 271 270 ret = drm_dev_register(ddev, 0); 272 271 if (ret < 0) 273 272 goto err_irq_uninstall; 273 + 274 + drm_fbdev_generic_setup(ddev, 16); 274 275 275 276 return 0; 276 277
+7 -2
drivers/gpu/drm/shmobile/shmob_drm_kms.c
··· 40 40 .yuv = false, 41 41 .lddfr = LDDFR_PKF_ARGB32, 42 42 }, { 43 + .fourcc = DRM_FORMAT_XRGB8888, 44 + .bpp = 32, 45 + .yuv = false, 46 + .lddfr = LDDFR_PKF_ARGB32, 47 + }, { 43 48 .fourcc = DRM_FORMAT_NV12, 44 49 .bpp = 12, 45 50 .yuv = true, ··· 101 96 102 97 format = shmob_drm_format_info(mode_cmd->pixel_format); 103 98 if (format == NULL) { 104 - dev_dbg(dev->dev, "unsupported pixel format %08x\n", 105 - mode_cmd->pixel_format); 99 + dev_dbg(dev->dev, "unsupported pixel format %p4cc\n", 100 + &mode_cmd->pixel_format); 106 101 return ERR_PTR(-EINVAL); 107 102 } 108 103
+5
drivers/gpu/drm/shmobile/shmob_drm_plane.c
··· 80 80 format |= LDBBSIFR_SWPL | LDBBSIFR_SWPW | LDBBSIFR_SWPB; 81 81 break; 82 82 case DRM_FORMAT_ARGB8888: 83 + case DRM_FORMAT_XRGB8888: 83 84 default: 84 85 format |= LDBBSIFR_SWPL; 85 86 break; ··· 95 94 break; 96 95 case DRM_FORMAT_ARGB8888: 97 96 format |= LDBBSIFR_AL_PK | LDBBSIFR_RY | LDDFR_PKF_ARGB32; 97 + break; 98 + case DRM_FORMAT_XRGB8888: 99 + format |= LDBBSIFR_AL_1 | LDBBSIFR_RY | LDDFR_PKF_ARGB32; 98 100 break; 99 101 case DRM_FORMAT_NV12: 100 102 case DRM_FORMAT_NV21: ··· 235 231 DRM_FORMAT_RGB565, 236 232 DRM_FORMAT_RGB888, 237 233 DRM_FORMAT_ARGB8888, 234 + DRM_FORMAT_XRGB8888, 238 235 DRM_FORMAT_NV12, 239 236 DRM_FORMAT_NV21, 240 237 DRM_FORMAT_NV16,
+3 -3
drivers/gpu/drm/solomon/ssd130x.h
··· 10 10 * Copyright 2012 Free Electrons 11 11 */ 12 12 13 - #ifndef __SSD1307X_H__ 14 - #define __SSD1307X_H__ 13 + #ifndef __SSD130X_H__ 14 + #define __SSD130X_H__ 15 15 16 16 #include <drm/drm_connector.h> 17 17 #include <drm/drm_crtc.h> ··· 94 94 void ssd130x_remove(struct ssd130x_device *ssd130x); 95 95 void ssd130x_shutdown(struct ssd130x_device *ssd130x); 96 96 97 - #endif /* __SSD1307X_H__ */ 97 + #endif /* __SSD130X_H__ */
+4 -15
drivers/gpu/drm/sun4i/sun4i_tcon.c
··· 784 784 static int sun4i_tcon_init_clocks(struct device *dev, 785 785 struct sun4i_tcon *tcon) 786 786 { 787 - tcon->clk = devm_clk_get(dev, "ahb"); 787 + tcon->clk = devm_clk_get_enabled(dev, "ahb"); 788 788 if (IS_ERR(tcon->clk)) { 789 789 dev_err(dev, "Couldn't get the TCON bus clock\n"); 790 790 return PTR_ERR(tcon->clk); 791 791 } 792 - clk_prepare_enable(tcon->clk); 793 792 794 793 if (tcon->quirks->has_channel_0) { 795 - tcon->sclk0 = devm_clk_get(dev, "tcon-ch0"); 794 + tcon->sclk0 = devm_clk_get_enabled(dev, "tcon-ch0"); 796 795 if (IS_ERR(tcon->sclk0)) { 797 796 dev_err(dev, "Couldn't get the TCON channel 0 clock\n"); 798 797 return PTR_ERR(tcon->sclk0); 799 798 } 800 799 } 801 - clk_prepare_enable(tcon->sclk0); 802 800 803 801 if (tcon->quirks->has_channel_1) { 804 802 tcon->sclk1 = devm_clk_get(dev, "tcon-ch1"); ··· 807 809 } 808 810 809 811 return 0; 810 - } 811 - 812 - static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon) 813 - { 814 - clk_disable_unprepare(tcon->sclk0); 815 - clk_disable_unprepare(tcon->clk); 816 812 } 817 813 818 814 static int sun4i_tcon_init_irq(struct device *dev, ··· 1221 1229 ret = sun4i_tcon_init_regmap(dev, tcon); 1222 1230 if (ret) { 1223 1231 dev_err(dev, "Couldn't init our TCON regmap\n"); 1224 - goto err_free_clocks; 1232 + goto err_assert_reset; 1225 1233 } 1226 1234 1227 1235 if (tcon->quirks->has_channel_0) { 1228 1236 ret = sun4i_dclk_create(dev, tcon); 1229 1237 if (ret) { 1230 1238 dev_err(dev, "Couldn't create our TCON dot clock\n"); 1231 - goto err_free_clocks; 1239 + goto err_assert_reset; 1232 1240 } 1233 1241 } 1234 1242 ··· 1291 1299 err_free_dclk: 1292 1300 if (tcon->quirks->has_channel_0) 1293 1301 sun4i_dclk_free(tcon); 1294 - err_free_clocks: 1295 - sun4i_tcon_free_clocks(tcon); 1296 1302 err_assert_reset: 1297 1303 reset_control_assert(tcon->lcd_rst); 1298 1304 return ret; ··· 1304 1314 list_del(&tcon->list); 1305 1315 if (tcon->quirks->has_channel_0) 1306 1316 sun4i_dclk_free(tcon); 1307 - sun4i_tcon_free_clocks(tcon); 1308 1317 } 1309 1318 1310 1319 static const struct component_ops sun4i_tcon_ops = {
+1 -1
drivers/gpu/drm/ttm/ttm_device.c
··· 189 189 * Returns: 190 190 * !0: Failure. 191 191 */ 192 - int ttm_device_init(struct ttm_device *bdev, struct ttm_device_funcs *funcs, 192 + int ttm_device_init(struct ttm_device *bdev, const struct ttm_device_funcs *funcs, 193 193 struct device *dev, struct address_space *mapping, 194 194 struct drm_vma_offset_manager *vma_manager, 195 195 bool use_dma_alloc, bool use_dma32)
+6 -6
drivers/gpu/drm/vkms/vkms_formats.c
··· 106 106 s64 fp_b = drm_int2fixp(rgb_565 & 0x1f); 107 107 108 108 out_pixel->a = (u16)0xffff; 109 - out_pixel->r = drm_fixp2int(drm_fixp_mul(fp_r, fp_rb_ratio)); 110 - out_pixel->g = drm_fixp2int(drm_fixp_mul(fp_g, fp_g_ratio)); 111 - out_pixel->b = drm_fixp2int(drm_fixp_mul(fp_b, fp_rb_ratio)); 109 + out_pixel->r = drm_fixp2int_round(drm_fixp_mul(fp_r, fp_rb_ratio)); 110 + out_pixel->g = drm_fixp2int_round(drm_fixp_mul(fp_g, fp_g_ratio)); 111 + out_pixel->b = drm_fixp2int_round(drm_fixp_mul(fp_b, fp_rb_ratio)); 112 112 } 113 113 114 114 void vkms_compose_row(struct line_buffer *stage_buffer, struct vkms_plane_state *plane, int y) ··· 232 232 s64 fp_g = drm_int2fixp(in_pixels[x].g); 233 233 s64 fp_b = drm_int2fixp(in_pixels[x].b); 234 234 235 - u16 r = drm_fixp2int(drm_fixp_div(fp_r, fp_rb_ratio)); 236 - u16 g = drm_fixp2int(drm_fixp_div(fp_g, fp_g_ratio)); 237 - u16 b = drm_fixp2int(drm_fixp_div(fp_b, fp_rb_ratio)); 235 + u16 r = drm_fixp2int_round(drm_fixp_div(fp_r, fp_rb_ratio)); 236 + u16 g = drm_fixp2int_round(drm_fixp_div(fp_g, fp_g_ratio)); 237 + u16 b = drm_fixp2int_round(drm_fixp_div(fp_b, fp_rb_ratio)); 238 238 239 239 *dst_pixels = cpu_to_le16(r << 11 | g << 5 | b); 240 240 }
+1
drivers/gpu/ipu-v3/ipu-prv.h
··· 8 8 9 9 struct ipu_soc; 10 10 11 + #include <linux/io.h> 11 12 #include <linux/types.h> 12 13 #include <linux/device.h> 13 14 #include <linux/clk.h>
+1 -1
drivers/staging/sm750fb/sm750.c
··· 16 16 #include <linux/pagemap.h> 17 17 #include <linux/screen_info.h> 18 18 #include <linux/console.h> 19 - #include <asm/fb.h> 19 + 20 20 #include "sm750.h" 21 21 #include "sm750_accel.h" 22 22 #include "sm750_cursor.h"
+1
drivers/video/fbdev/arcfb.c
··· 41 41 #include <linux/vmalloc.h> 42 42 #include <linux/delay.h> 43 43 #include <linux/interrupt.h> 44 + #include <linux/io.h> 44 45 #include <linux/fb.h> 45 46 #include <linux/init.h> 46 47 #include <linux/arcfb.h>
+2
drivers/video/fbdev/aty/atyfb.h
··· 3 3 * ATI Frame Buffer Device Driver Core Definitions 4 4 */ 5 5 6 + #include <linux/io.h> 6 7 #include <linux/spinlock.h> 7 8 #include <linux/wait.h> 9 + 8 10 /* 9 11 * Elements of the hardware specific atyfb_par structure 10 12 */
+1 -1
drivers/video/fbdev/aty/mach64_cursor.c
··· 153 153 u8 m, b; 154 154 155 155 // Clear cursor image with 1010101010... 156 - fb_memset(dst, 0xaa, 1024); 156 + fb_memset_io(dst, 0xaa, 1024); 157 157 158 158 offset = align - width*2; 159 159
+1 -1
drivers/video/fbdev/chipsfb.c
··· 332 332 333 333 static void init_chips(struct fb_info *p, unsigned long addr) 334 334 { 335 - fb_memset(p->screen_base, 0, 0x100000); 335 + fb_memset_io(p->screen_base, 0, 0x100000); 336 336 337 337 p->fix = chipsfb_fix; 338 338 p->fix.smem_start = addr;
+2 -2
drivers/video/fbdev/core/fb_io_fops.c
··· 42 42 while (count) { 43 43 c = (count > PAGE_SIZE) ? PAGE_SIZE : count; 44 44 dst = buffer; 45 - fb_memcpy_fromfb(dst, src, c); 45 + fb_memcpy_fromio(dst, src, c); 46 46 dst += c; 47 47 src += c; 48 48 ··· 117 117 } 118 118 c -= trailing; 119 119 120 - fb_memcpy_tofb(dst, src, c); 120 + fb_memcpy_toio(dst, src, c); 121 121 dst += c; 122 122 src += c; 123 123 *ppos += c;
-1
drivers/video/fbdev/core/fbcon.c
··· 75 75 #include <linux/interrupt.h> 76 76 #include <linux/crc32.h> /* For counting font checksums */ 77 77 #include <linux/uaccess.h> 78 - #include <asm/fb.h> 79 78 #include <asm/irq.h> 80 79 81 80 #include "fbcon.h"
-2
drivers/video/fbdev/core/fbmem.c
··· 37 37 #include <linux/mem_encrypt.h> 38 38 #include <linux/pci.h> 39 39 40 - #include <asm/fb.h> 41 - 42 40 #include <video/nomodeset.h> 43 41 #include <video/vga.h> 44 42
+69 -53
drivers/video/fbdev/hitfb.c
··· 42 42 .accel = FB_ACCEL_NONE, 43 43 }; 44 44 45 + static volatile void __iomem *hitfb_offset_to_addr(unsigned int offset) 46 + { 47 + return (__force volatile void __iomem *)(uintptr_t)offset; 48 + } 49 + 50 + static u16 hitfb_readw(unsigned int offset) 51 + { 52 + return fb_readw(hitfb_offset_to_addr(offset)); 53 + } 54 + 55 + static void hitfb_writew(u16 value, unsigned int offset) 56 + { 57 + fb_writew(value, hitfb_offset_to_addr(offset)); 58 + } 59 + 45 60 static inline void hitfb_accel_wait(void) 46 61 { 47 - while (fb_readw(HD64461_GRCFGR) & HD64461_GRCFGR_ACCSTATUS) ; 62 + while (hitfb_readw(HD64461_GRCFGR) & HD64461_GRCFGR_ACCSTATUS) 63 + ; 48 64 } 49 65 50 66 static inline void hitfb_accel_start(int truecolor) 51 67 { 52 68 if (truecolor) { 53 - fb_writew(6, HD64461_GRCFGR); 69 + hitfb_writew(6, HD64461_GRCFGR); 54 70 } else { 55 - fb_writew(7, HD64461_GRCFGR); 71 + hitfb_writew(7, HD64461_GRCFGR); 56 72 } 57 73 } 58 74 ··· 79 63 if (truecolor) 80 64 saddr <<= 1; 81 65 82 - fb_writew(width-1, HD64461_BBTDWR); 83 - fb_writew(height-1, HD64461_BBTDHR); 66 + hitfb_writew(width-1, HD64461_BBTDWR); 67 + hitfb_writew(height-1, HD64461_BBTDHR); 84 68 85 - fb_writew(saddr & 0xffff, HD64461_BBTDSARL); 86 - fb_writew(saddr >> 16, HD64461_BBTDSARH); 69 + hitfb_writew(saddr & 0xffff, HD64461_BBTDSARL); 70 + hitfb_writew(saddr >> 16, HD64461_BBTDSARH); 87 71 88 72 } 89 73 ··· 96 80 97 81 height--; 98 82 width--; 99 - fb_writew(rop, HD64461_BBTROPR); 83 + hitfb_writew(rop, HD64461_BBTROPR); 100 84 if ((sy < dy) || ((sy == dy) && (sx <= dx))) { 101 85 saddr = WIDTH * (sy + height) + sx + width; 102 86 daddr = WIDTH * (dy + height) + dx + width; ··· 107 91 maddr = 108 92 (((width >> 4) + 1) * (height + 1) - 1) * 2; 109 93 110 - fb_writew((1 << 5) | 1, HD64461_BBTMDR); 94 + hitfb_writew((1 << 5) | 1, HD64461_BBTMDR); 111 95 } else 112 - fb_writew(1, HD64461_BBTMDR); 96 + hitfb_writew(1, HD64461_BBTMDR); 113 97 } else { 114 98 saddr = WIDTH * sy + sx; 115 99 daddr = WIDTH * dy + dx; 116 100 if (mask_addr) { 117 - fb_writew((1 << 5), HD64461_BBTMDR); 101 + hitfb_writew((1 << 5), HD64461_BBTMDR); 118 102 } else { 119 - fb_writew(0, HD64461_BBTMDR); 103 + hitfb_writew(0, HD64461_BBTMDR); 120 104 } 121 105 } 122 106 if (truecolor) { 123 107 saddr <<= 1; 124 108 daddr <<= 1; 125 109 } 126 - fb_writew(width, HD64461_BBTDWR); 127 - fb_writew(height, HD64461_BBTDHR); 128 - fb_writew(saddr & 0xffff, HD64461_BBTSSARL); 129 - fb_writew(saddr >> 16, HD64461_BBTSSARH); 130 - fb_writew(daddr & 0xffff, HD64461_BBTDSARL); 131 - fb_writew(daddr >> 16, HD64461_BBTDSARH); 110 + hitfb_writew(width, HD64461_BBTDWR); 111 + hitfb_writew(height, HD64461_BBTDHR); 112 + hitfb_writew(saddr & 0xffff, HD64461_BBTSSARL); 113 + hitfb_writew(saddr >> 16, HD64461_BBTSSARH); 114 + hitfb_writew(daddr & 0xffff, HD64461_BBTDSARL); 115 + hitfb_writew(daddr >> 16, HD64461_BBTDSARH); 132 116 if (mask_addr) { 133 117 maddr += mask_addr; 134 - fb_writew(maddr & 0xffff, HD64461_BBTMARL); 135 - fb_writew(maddr >> 16, HD64461_BBTMARH); 118 + hitfb_writew(maddr & 0xffff, HD64461_BBTMARL); 119 + hitfb_writew(maddr >> 16, HD64461_BBTMARH); 136 120 } 137 121 hitfb_accel_start(truecolor); 138 122 } ··· 143 127 cfb_fillrect(p, rect); 144 128 else { 145 129 hitfb_accel_wait(); 146 - fb_writew(0x00f0, HD64461_BBTROPR); 147 - fb_writew(16, HD64461_BBTMDR); 130 + hitfb_writew(0x00f0, HD64461_BBTROPR); 131 + hitfb_writew(16, HD64461_BBTMDR); 148 132 149 133 if (p->var.bits_per_pixel == 16) { 150 - fb_writew(((u32 *) (p->pseudo_palette))[rect->color], 134 + hitfb_writew(((u32 *) (p->pseudo_palette))[rect->color], 151 135 HD64461_GRSCR); 152 136 hitfb_accel_set_dest(1, rect->dx, rect->dy, rect->width, 153 137 rect->height); 154 138 hitfb_accel_start(1); 155 139 } else { 156 - fb_writew(rect->color, HD64461_GRSCR); 140 + hitfb_writew(rect->color, HD64461_GRSCR); 157 141 hitfb_accel_set_dest(0, rect->dx, rect->dy, rect->width, 158 142 rect->height); 159 143 hitfb_accel_start(0); ··· 178 162 if (xoffset != 0) 179 163 return -EINVAL; 180 164 181 - fb_writew((yoffset*info->fix.line_length)>>10, HD64461_LCDCBAR); 165 + hitfb_writew((yoffset*info->fix.line_length)>>10, HD64461_LCDCBAR); 182 166 183 167 return 0; 184 168 } ··· 188 172 unsigned short v; 189 173 190 174 if (blank_mode) { 191 - v = fb_readw(HD64461_LDR1); 175 + v = hitfb_readw(HD64461_LDR1); 192 176 v &= ~HD64461_LDR1_DON; 193 - fb_writew(v, HD64461_LDR1); 177 + hitfb_writew(v, HD64461_LDR1); 194 178 195 - v = fb_readw(HD64461_LCDCCR); 179 + v = hitfb_readw(HD64461_LCDCCR); 196 180 v |= HD64461_LCDCCR_MOFF; 197 - fb_writew(v, HD64461_LCDCCR); 181 + hitfb_writew(v, HD64461_LCDCCR); 198 182 199 - v = fb_readw(HD64461_STBCR); 183 + v = hitfb_readw(HD64461_STBCR); 200 184 v |= HD64461_STBCR_SLCDST; 201 - fb_writew(v, HD64461_STBCR); 185 + hitfb_writew(v, HD64461_STBCR); 202 186 } else { 203 - v = fb_readw(HD64461_STBCR); 187 + v = hitfb_readw(HD64461_STBCR); 204 188 v &= ~HD64461_STBCR_SLCDST; 205 - fb_writew(v, HD64461_STBCR); 189 + hitfb_writew(v, HD64461_STBCR); 206 190 207 - v = fb_readw(HD64461_LCDCCR); 191 + v = hitfb_readw(HD64461_LCDCCR); 208 192 v &= ~(HD64461_LCDCCR_MOFF | HD64461_LCDCCR_STREQ); 209 - fb_writew(v, HD64461_LCDCCR); 193 + hitfb_writew(v, HD64461_LCDCCR); 210 194 211 195 do { 212 - v = fb_readw(HD64461_LCDCCR); 196 + v = hitfb_readw(HD64461_LCDCCR); 213 197 } while(v&HD64461_LCDCCR_STBACK); 214 198 215 - v = fb_readw(HD64461_LDR1); 199 + v = hitfb_readw(HD64461_LDR1); 216 200 v |= HD64461_LDR1_DON; 217 - fb_writew(v, HD64461_LDR1); 201 + hitfb_writew(v, HD64461_LDR1); 218 202 } 219 203 return 0; 220 204 } ··· 227 211 228 212 switch (info->var.bits_per_pixel) { 229 213 case 8: 230 - fb_writew(regno << 8, HD64461_CPTWAR); 231 - fb_writew(red >> 10, HD64461_CPTWDR); 232 - fb_writew(green >> 10, HD64461_CPTWDR); 233 - fb_writew(blue >> 10, HD64461_CPTWDR); 214 + hitfb_writew(regno << 8, HD64461_CPTWAR); 215 + hitfb_writew(red >> 10, HD64461_CPTWDR); 216 + hitfb_writew(green >> 10, HD64461_CPTWDR); 217 + hitfb_writew(blue >> 10, HD64461_CPTWDR); 234 218 break; 235 219 case 16: 236 220 if (regno >= 16) ··· 318 302 break; 319 303 } 320 304 321 - fb_writew(info->fix.line_length, HD64461_LCDCLOR); 322 - ldr3 = fb_readw(HD64461_LDR3); 305 + hitfb_writew(info->fix.line_length, HD64461_LCDCLOR); 306 + ldr3 = hitfb_readw(HD64461_LDR3); 323 307 ldr3 &= ~15; 324 308 ldr3 |= (info->var.bits_per_pixel == 8) ? 4 : 8; 325 - fb_writew(ldr3, HD64461_LDR3); 309 + hitfb_writew(ldr3, HD64461_LDR3); 326 310 return 0; 327 311 } 328 312 ··· 353 337 hitfb_fix.smem_start = HD64461_IO_OFFSET(0x02000000); 354 338 hitfb_fix.smem_len = 512 * 1024; 355 339 356 - lcdclor = fb_readw(HD64461_LCDCLOR); 357 - ldvndr = fb_readw(HD64461_LDVNDR); 358 - ldr3 = fb_readw(HD64461_LDR3); 340 + lcdclor = hitfb_readw(HD64461_LCDCLOR); 341 + ldvndr = hitfb_readw(HD64461_LDVNDR); 342 + ldr3 = hitfb_readw(HD64461_LDR3); 359 343 360 344 switch (ldr3 & 15) { 361 345 default: ··· 445 429 u16 v; 446 430 447 431 hitfb_blank(1,0); 448 - v = fb_readw(HD64461_STBCR); 432 + v = hitfb_readw(HD64461_STBCR); 449 433 v |= HD64461_STBCR_SLCKE_IST; 450 - fb_writew(v, HD64461_STBCR); 434 + hitfb_writew(v, HD64461_STBCR); 451 435 452 436 return 0; 453 437 } ··· 456 440 { 457 441 u16 v; 458 442 459 - v = fb_readw(HD64461_STBCR); 443 + v = hitfb_readw(HD64461_STBCR); 460 444 v &= ~HD64461_STBCR_SLCKE_OST; 461 445 msleep(100); 462 - v = fb_readw(HD64461_STBCR); 446 + v = hitfb_readw(HD64461_STBCR); 463 447 v &= ~HD64461_STBCR_SLCKE_IST; 464 - fb_writew(v, HD64461_STBCR); 448 + hitfb_writew(v, HD64461_STBCR); 465 449 hitfb_blank(0,0); 466 450 467 451 return 0;
+1 -1
drivers/video/fbdev/kyro/fbdev.c
··· 737 737 info->var.bits_per_pixel); 738 738 size *= info->var.yres_virtual; 739 739 740 - fb_memset(info->screen_base, 0, size); 740 + fb_memset_io(info->screen_base, 0, size); 741 741 742 742 if (register_framebuffer(info) < 0) 743 743 goto out_unmap;
+3 -3
drivers/video/fbdev/matrox/matroxfb_accel.c
··· 88 88 89 89 static inline void matrox_cfb4_pal(u_int32_t* pal) { 90 90 unsigned int i; 91 - 91 + 92 92 for (i = 0; i < 16; i++) { 93 93 pal[i] = i * 0x11111111U; 94 94 } ··· 96 96 97 97 static inline void matrox_cfb8_pal(u_int32_t* pal) { 98 98 unsigned int i; 99 - 99 + 100 100 for (i = 0; i < 16; i++) { 101 101 pal[i] = i * 0x01010101U; 102 102 } ··· 482 482 /* Tell... well, why bother... */ 483 483 while (height--) { 484 484 size_t i; 485 - 485 + 486 486 for (i = 0; i < step; i += 4) { 487 487 /* Hope that there are at least three readable bytes beyond the end of bitmap */ 488 488 fb_writel(get_unaligned((u_int32_t*)(chardata + i)),mmio.vaddr);
+2 -2
drivers/video/fbdev/matrox/matroxfb_base.h
··· 301 301 int (*verifymode)(void* altout_dev, u_int32_t mode); 302 302 int (*getqueryctrl)(void* altout_dev, 303 303 struct v4l2_queryctrl* ctrl); 304 - int (*getctrl)(void* altout_dev, 304 + int (*getctrl)(void *altout_dev, 305 305 struct v4l2_control* ctrl); 306 - int (*setctrl)(void* altout_dev, 306 + int (*setctrl)(void *altout_dev, 307 307 struct v4l2_control* ctrl); 308 308 }; 309 309
+1 -1
drivers/video/fbdev/pvr2fb.c
··· 801 801 goto out_err; 802 802 } 803 803 804 - fb_memset(fb_info->screen_base, 0, pvr2_fix.smem_len); 804 + fb_memset_io(fb_info->screen_base, 0, pvr2_fix.smem_len); 805 805 806 806 pvr2_fix.ypanstep = nopan ? 0 : 1; 807 807 pvr2_fix.ywrapstep = nowrap ? 0 : 1;
+1 -1
drivers/video/fbdev/sstfb.c
··· 335 335 static void sstfb_clear_screen(struct fb_info *info) 336 336 { 337 337 /* clear screen */ 338 - fb_memset(info->screen_base, 0, info->fix.smem_len); 338 + fb_memset_io(info->screen_base, 0, info->fix.smem_len); 339 339 } 340 340 341 341
+2 -2
drivers/video/fbdev/stifb.c
··· 527 527 fb->id = saved_id; 528 528 529 529 for (y = 0; y < fb->info.var.yres; ++y) 530 - fb_memset(fb->info.screen_base + y * fb->info.fix.line_length, 531 - 0xff, fb->info.var.xres * fb->info.var.bits_per_pixel/8); 530 + fb_memset_io(fb->info.screen_base + y * fb->info.fix.line_length, 531 + 0xff, fb->info.var.xres * fb->info.var.bits_per_pixel/8); 532 532 533 533 CRX24_SET_OVLY_MASK(fb); 534 534 SETUP_FB(fb);
+1 -1
drivers/video/fbdev/tdfxfb.c
··· 1116 1116 u8 *mask = (u8 *)cursor->mask; 1117 1117 int i; 1118 1118 1119 - fb_memset(cursorbase, 0, 1024); 1119 + fb_memset_io(cursorbase, 0, 1024); 1120 1120 1121 1121 for (i = 0; i < cursor->image.height; i++) { 1122 1122 int h = 0;
+2
drivers/video/fbdev/wmt_ge_rops.c
··· 9 9 10 10 #include <linux/module.h> 11 11 #include <linux/fb.h> 12 + #include <linux/io.h> 12 13 #include <linux/platform_device.h> 14 + 13 15 #include "core/fb_draw.h" 14 16 #include "wmt_ge_rops.h" 15 17
+102
include/asm-generic/fb.h
··· 7 7 * Only include this header file from your architecture's <asm/fb.h>. 8 8 */ 9 9 10 + #include <linux/io.h> 10 11 #include <linux/mm_types.h> 11 12 #include <linux/pgtable.h> 12 13 ··· 29 28 { 30 29 return 0; 31 30 } 31 + #endif 32 + 33 + /* 34 + * I/O helpers for the framebuffer. Prefer these functions over their 35 + * regular counterparts. The regular I/O functions provide in-order 36 + * access and swap bytes to/from little-endian ordering. Neither is 37 + * required for framebuffers. Instead, the helpers read and write 38 + * raw framebuffer data. Independent operations can be reordered for 39 + * improved performance. 40 + */ 41 + 42 + #ifndef fb_readb 43 + static inline u8 fb_readb(const volatile void __iomem *addr) 44 + { 45 + return __raw_readb(addr); 46 + } 47 + #define fb_readb fb_readb 48 + #endif 49 + 50 + #ifndef fb_readw 51 + static inline u16 fb_readw(const volatile void __iomem *addr) 52 + { 53 + return __raw_readw(addr); 54 + } 55 + #define fb_readw fb_readw 56 + #endif 57 + 58 + #ifndef fb_readl 59 + static inline u32 fb_readl(const volatile void __iomem *addr) 60 + { 61 + return __raw_readl(addr); 62 + } 63 + #define fb_readl fb_readl 64 + #endif 65 + 66 + #ifndef fb_readq 67 + #if defined(__raw_readq) 68 + static inline u64 fb_readq(const volatile void __iomem *addr) 69 + { 70 + return __raw_readq(addr); 71 + } 72 + #define fb_readq fb_readq 73 + #endif 74 + #endif 75 + 76 + #ifndef fb_writeb 77 + static inline void fb_writeb(u8 b, volatile void __iomem *addr) 78 + { 79 + __raw_writeb(b, addr); 80 + } 81 + #define fb_writeb fb_writeb 82 + #endif 83 + 84 + #ifndef fb_writew 85 + static inline void fb_writew(u16 b, volatile void __iomem *addr) 86 + { 87 + __raw_writew(b, addr); 88 + } 89 + #define fb_writew fb_writew 90 + #endif 91 + 92 + #ifndef fb_writel 93 + static inline void fb_writel(u32 b, volatile void __iomem *addr) 94 + { 95 + __raw_writel(b, addr); 96 + } 97 + #define fb_writel fb_writel 98 + #endif 99 + 100 + #ifndef fb_writeq 101 + #if defined(__raw_writeq) 102 + static inline void fb_writeq(u64 b, volatile void __iomem *addr) 103 + { 104 + __raw_writeq(b, addr); 105 + } 106 + #define fb_writeq fb_writeq 107 + #endif 108 + #endif 109 + 110 + #ifndef fb_memcpy_fromio 111 + static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n) 112 + { 113 + memcpy_fromio(to, from, n); 114 + } 115 + #define fb_memcpy_fromio fb_memcpy_fromio 116 + #endif 117 + 118 + #ifndef fb_memcpy_toio 119 + static inline void fb_memcpy_toio(volatile void __iomem *to, const void *from, size_t n) 120 + { 121 + memcpy_toio(to, from, n); 122 + } 123 + #define fb_memcpy_toio fb_memcpy_toio 124 + #endif 125 + 126 + #ifndef fb_memset 127 + static inline void fb_memset_io(volatile void __iomem *addr, int c, size_t n) 128 + { 129 + memset_io(addr, c, n); 130 + } 131 + #define fb_memset fb_memset_io 32 132 #endif 33 133 34 134 #endif /* __ASM_GENERIC_FB_H_ */
+2
include/drm/bridge/samsung-dsim.h
··· 95 95 u32 mode_flags; 96 96 u32 format; 97 97 98 + bool swap_dn_dp_clk; 99 + bool swap_dn_dp_data; 98 100 int state; 99 101 struct drm_property *brightness; 100 102 struct completion completed;
+6
include/drm/drm_fixed.h
··· 71 71 } 72 72 73 73 #define DRM_FIXED_POINT 32 74 + #define DRM_FIXED_POINT_HALF 16 74 75 #define DRM_FIXED_ONE (1ULL << DRM_FIXED_POINT) 75 76 #define DRM_FIXED_DECIMAL_MASK (DRM_FIXED_ONE - 1) 76 77 #define DRM_FIXED_DIGITS_MASK (~DRM_FIXED_DECIMAL_MASK) ··· 86 85 static inline int drm_fixp2int(s64 a) 87 86 { 88 87 return ((s64)a) >> DRM_FIXED_POINT; 88 + } 89 + 90 + static inline int drm_fixp2int_round(s64 a) 91 + { 92 + return drm_fixp2int(a + (1 << (DRM_FIXED_POINT_HALF - 1))); 89 93 } 90 94 91 95 static inline int drm_fixp2int_ceil(s64 a)
+1 -1
include/drm/gpu_scheduler.h
··· 549 549 unsigned int num_sched_list); 550 550 551 551 void drm_sched_job_cleanup(struct drm_sched_job *job); 552 - void drm_sched_wakeup(struct drm_gpu_scheduler *sched); 552 + void drm_sched_wakeup_if_can_queue(struct drm_gpu_scheduler *sched); 553 553 void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad); 554 554 void drm_sched_start(struct drm_gpu_scheduler *sched, bool full_recovery); 555 555 void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched);
+2 -2
include/drm/ttm/ttm_device.h
··· 223 223 * @funcs: Function table for the device. 224 224 * Constant after bo device init 225 225 */ 226 - struct ttm_device_funcs *funcs; 226 + const struct ttm_device_funcs *funcs; 227 227 228 228 /** 229 229 * @sysman: Resource manager for the system domain. ··· 287 287 bdev->man_drv[type] = manager; 288 288 } 289 289 290 - int ttm_device_init(struct ttm_device *bdev, struct ttm_device_funcs *funcs, 290 + int ttm_device_init(struct ttm_device *bdev, const struct ttm_device_funcs *funcs, 291 291 struct device *dev, struct address_space *mapping, 292 292 struct drm_vma_offset_manager *vma_manager, 293 293 bool use_dma_alloc, bool use_dma32);
+2 -53
include/linux/fb.h
··· 15 15 #include <linux/list.h> 16 16 #include <linux/backlight.h> 17 17 #include <linux/slab.h> 18 - #include <asm/io.h> 18 + 19 + #include <asm/fb.h> 19 20 20 21 struct vm_area_struct; 21 22 struct fb_info; ··· 511 510 * But for now, we leave it broken with the following define 512 511 */ 513 512 #define STUPID_ACCELF_TEXT_SHIT 514 - 515 - // This will go away 516 - #if defined(__sparc__) 517 - 518 - /* We map all of our framebuffers such that big-endian accesses 519 - * are what we want, so the following is sufficient. 520 - */ 521 - 522 - // This will go away 523 - #define fb_readb sbus_readb 524 - #define fb_readw sbus_readw 525 - #define fb_readl sbus_readl 526 - #define fb_readq sbus_readq 527 - #define fb_writeb sbus_writeb 528 - #define fb_writew sbus_writew 529 - #define fb_writel sbus_writel 530 - #define fb_writeq sbus_writeq 531 - #define fb_memset sbus_memset_io 532 - #define fb_memcpy_fromfb sbus_memcpy_fromio 533 - #define fb_memcpy_tofb sbus_memcpy_toio 534 - 535 - #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || \ 536 - defined(__hppa__) || defined(__sh__) || defined(__powerpc__) || \ 537 - defined(__arm__) || defined(__aarch64__) || defined(__mips__) 538 - 539 - #define fb_readb __raw_readb 540 - #define fb_readw __raw_readw 541 - #define fb_readl __raw_readl 542 - #define fb_readq __raw_readq 543 - #define fb_writeb __raw_writeb 544 - #define fb_writew __raw_writew 545 - #define fb_writel __raw_writel 546 - #define fb_writeq __raw_writeq 547 - #define fb_memset memset_io 548 - #define fb_memcpy_fromfb memcpy_fromio 549 - #define fb_memcpy_tofb memcpy_toio 550 - 551 - #else 552 - 553 - #define fb_readb(addr) (*(volatile u8 *) (addr)) 554 - #define fb_readw(addr) (*(volatile u16 *) (addr)) 555 - #define fb_readl(addr) (*(volatile u32 *) (addr)) 556 - #define fb_readq(addr) (*(volatile u64 *) (addr)) 557 - #define fb_writeb(b,addr) (*(volatile u8 *) (addr) = (b)) 558 - #define fb_writew(b,addr) (*(volatile u16 *) (addr) = (b)) 559 - #define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) 560 - #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) 561 - #define fb_memset memset 562 - #define fb_memcpy_fromfb memcpy 563 - #define fb_memcpy_tofb memcpy 564 - 565 - #endif 566 513 567 514 #define FB_LEFT_POS(p, bpp) (fb_be_math(p) ? (32 - (bpp)) : 0) 568 515 #define FB_SHIFT_HIGH(p, val, bits) (fb_be_math(p) ? (val) >> (bits) : \