From: Sunyun Yang <[email protected]>

The LT7911EXC is an I2C-controlled bridge that receives eDP1.4
and output mipi dsi. This series introduces:

- A device tree binding YAML file describing the hardware
- A new DRM bridge driver implementing the basic functionality

Signed-off-by: Sunyun Yang<[email protected]>
---
Change in v13:
- dt-binding:
- drm/bridge:
 1. [High] Dangling pointer created during MIPI DSI host detach if the 
downstream                           [sashiko-bot]
           device is a bridge rather than a panel. - fixed
 2. [High] Firmware upgrade CRC mismatch due to unpadded partial page writes. 
           - hardware erases the entire flash area into a default state of 
0xff. When doing
             a partial page short write,the total unwritten residual bytes on 
the physical
             flash sector inherently retain their 0xff state. Therefore, no 
modification is required.
 3. [High] Firmware upgrade workqueue accesses `bridge.dev` without ensuring 
the DRM device is alive,
           leading to a Use-After-Free. - fixed
 4. [High] Regmap page selector cache desynchronization after device reset 
causes firmware upgrade
           commands to be routed to the wrong register page. - fixed
- Link to v12: 
https://lore.kernel.org/lkml/[email protected]/

Change in v12:
- dt-binding:
- drm/bridge:
 1. Move the cleanup work of drm_panel_bridge_remove() forward into 
lt7911exc_dsi_host_detach().                        [sashiko-bot]
 2. Do not hold any lock during lt7911exc_reset().
- Link to v11: 
https://lore.kernel.org/lkml/[email protected]/

Change in v11:
- dt-binding:
- drm/bridge:
 1. Removed Reviewed-by, we would appreciate it if the maintainer could help 
review this.
 2. Use devm_gpiod_get(,, GPIOD_OUT_HIGH) to fix the reset GPIO backpowering 
issue.                                       [sashiko-bot]
 3. Fixed Use-After-Free vulnerability due to dynamic DRM bridge removal in DSI 
detach callback.
 4. Fixed Use-After-Free of regmap during DRM teardown because firmware upgrade 
worker defeats removal safeguard.
 5. Fixed firmware upgrade performs a hardware reset, causing silent loss of 
DRM state and a blank screen.
 6. Use of kmalloc for a 64KB software buffer is susceptible to memory 
fragmentation failures - Fix by using kvmalloc
 7. Use the 'lt7911exc->ocm_lock' mutex and the 'lt7911exc->upgrade' flag to 
resolve the race condition between
    DRM atomic modeset and firmware upgrade.
 8. Use the 'lt7911exc->upgrade_lock' mutex to prevent redundant upgrades.
 9. Use the 'lt7911exc->removed' flag to prevent the driver from being 
triggered to upgrade during the unload process.
- Link to v10: 
https://lore.kernel.org/lkml/[email protected]/

Change in v10:
- dt-binding:
- drm/bridge:
 1. Fixed the firmware upgrade error paths to always clear the upgrade
    flag before returning, including firmware size validation failures
    and allocation failures.                                                    
            [sashiko-bot]
 2. Added proper locking in lt7911exc_atomic_pre_enable() and
    lt7911exc_atomic_post_disable() to serialize register accesses with the
    firmware upgrade flow and avoid concurrent I2C transactions.
 3. Added an exclusivity check in lt7911exc_dsi_host_attach() to reject multiple
    downstream attachments and prevent repeated drm_bridge_add() calls and 
panel bridge leaks.
 4. Reworked lt7911exc_firmware_store() to use mutex_trylock() so concurrent 
sysfs writers
    immediately return -EBUSY instead of blocking behind an active firmware 
upgrade.
 5. Updated the remove path to prevent new firmware upgrade work from being 
queued after
    device removal by setting the upgrade state before cancelling the worker.
- Link to v9: 
https://lore.kernel.org/lkml/[email protected]/

Change in v9:
- dt-binding:
- drm/bridge:
 1. DSI transfer callback returns success for reads without populating          
              [sashiko-bot]
    the receive buffer, leaking uninitialized memory. - fixed it by
    implementing  a strict whitelist mechanism.
 2. DSI transfer callback polls for eDP video readiness before the
    upstream encoder is enabled, guaranteeing a timeout. - removed
 3. The driver attempts I2C transfers while the hardware is held in
    physical reset. - fixed
 4. Missing DRM_MIPI_DSI Kconfig dependency causes linker errors. - fixed
 5. request_firmware is called while holding the hardware lock and
    halting the MCU, risking a system pipeline stall. - fixed
 6. Sleeping functions are called from atomic context in the DRM bridge 
callbacks. - fixed
 7. lt7911exc_dsi_host_transfer bypasses the required MCU hardware halt 
sequence. - fixed by
    internal firmware controls the panel initialization sequence and handles 
all MIPI
    DSI command transmission.
- Link to v8: 
https://lore.kernel.org/lkml/[email protected]/

Change in v8:
- dt-binding:
- drm/bridge:
 1. Protect firmware upgrade and DRM bridge callback paths with ocm_lock.       
   [sashiko-bot]
 2. Remove the hardware reset from the remove callback, and ensure that
    all hardware reset operations are protected by ocm_lock.
 3. crc reconstruction explicitly casts each byte to u32 before shifting
 4. The display configuration is handled by the firmware, and the MIPI
    DSI host registration issue has been fixed.
 5. The batch register read/write operations have already been updated
    to include return value checking.
 6. The dev_err_probe() used outside of probe context has been fixed.
- Link to v7: 
https://lore.kernel.org/lkml/[email protected]/

Change in v7:
- dt-binding:
 1. fix commit message typos(Receiver、signal)                            
[sashiko-bot]
 2. remove the ambiguity caused by "signal/dual".
- drm/bridge:
 1. using devm_regulator_get_enable avoids power leaks.                   
[sashiko-bot]
 2. set reset gpio is low after cutting off power in lt7911exc_remove function, 
avoid backpowering.
 3. synchronous request_firmware() call cause a permanent probe failure if the 
driver is built-in,
    probe executes before the root filesystem is mounted, which would cause 
this to fail with -ENOENT,
    we have removed this functionality. Use trigger to upgrade.
 4. add `depends on I2C` and `select REGMAP_I2C` in Kconfig.
 5. add return value of `devm_drm_bridge_add()` in `probe()`.
 6. add directly header files (linux/slab.h, linux/delay.h, 
linux/regulator/consumer.h)
- Link to v6: 
https://lore.kernel.org/lkml/[email protected]/

Change in v6:
- dt-binding:
- drm/bridge:
 1. use #define FW_FILE  "Lontium/lt7911exc_fw.bin" to match linux-firmware
- Link to v5: 
https://lore.kernel.org/lkml/[email protected]/

Change in v5:
- dt-binding:
- drm/bridge:
 1. Change "mipi" to "mipi dsi" in the commit message.     [Dmitry]
 2. Change "eDP/MIPI" to "eDP/MIPI DSI" in Kconfig.
- Link to v4: 
https://lore.kernel.org/lkml/[email protected]/

Change in v4:
- dt-binding:
 1. Fix the missing spaces on the "subject".             [Krzysztof]
 2. Fix the error descriptions for port@0 and port@1.
- drm/bridge:
- Link to v3: 
https://lore.kernel.org/lkml/[email protected]/

Change in v3:
- dt-binding:
- drm/bridge:
 1. already submit lt7911exc_fw.bin to linux-firmware.  [Dmitry]
 2. remove lt7911exc_remove function.
 3. drop  the "lontium, "  in lt7911exc_i2c_table.
- Link to v2: 
https://lore.kernel.org/lkml/[email protected]/

Change in v2:
- dt-binding:
 1. reset pins use active low.                        [Dmitry]
- drm/bridge:
 1. use atomic_* callbacks.                           [Quentin]
 2. fix the incorrect formatting and spaces.
 3. add the required header files.                    [Dmitry]
 4. remove "enabled" flag.
 5. remove *fw from the lt7911exc struct.
 6. .max_register and .range_max use actual range.
 7. regulator use bulk interface.
 8. use dev_err_probe, devm_mutex_init and devm_drm_bridge_add.
 9. Replace GPL v2 with GPL.
- Link to v1: 
https://lore.kernel.org/lkml/[email protected]/

---
Sunyun Yang (2):
  dt-bindings: bridge: Add Lontium LT7911EXC eDP to MIPI DSI bridge
  drm/bridge: Add Lontium LT7911EXC eDP to MIPI DSI bridge

 .../display/bridge/lontium,lt7911exc.yaml     |  89 ++
 drivers/gpu/drm/bridge/Kconfig                |  16 +
 drivers/gpu/drm/bridge/Makefile               |   1 +
 drivers/gpu/drm/bridge/lontium-lt7911exc.c    | 808 ++++++++++++++++++
 4 files changed, 914 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/display/bridge/lontium,lt7911exc.yaml
 create mode 100644 drivers/gpu/drm/bridge/lontium-lt7911exc.c

-- 
2.34.1

Reply via email to