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

drm/panel: simple: restore connector_type fallback

The switch from devm_kzalloc() + drm_panel_init() to
devm_drm_panel_alloc() introduced a regression.

Several panel descriptors do not set connector_type. For those panels,
panel_simple_probe() used to compute a connector type (currently DPI as a
fallback) and pass that value to drm_panel_init(). After the conversion
to devm_drm_panel_alloc(), the call unconditionally used
desc->connector_type instead, ignoring the computed fallback and
potentially passing DRM_MODE_CONNECTOR_Unknown, which
drm_panel_bridge_add() does not allow.

Move the connector_type validation / fallback logic before the
devm_drm_panel_alloc() call and pass the computed connector_type to
devm_drm_panel_alloc(), so panels without an explicit connector_type
once again get the DPI default.

Signed-off-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Fixes: de04bb0089a9 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()")
Cc: stable@vger.kernel.org
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Link: https://lore.kernel.org/stable/20251126-lcd_panel_connector_type_fix-v2-1-c15835d1f7cb%40microchip.com
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://patch.msgid.link/20251218-lcd_panel_connector_type_fix-v3-1-ddcea6d8d7ef@microchip.com

authored by

Ludovic Desroches and committed by
Neil Armstrong
9380dc33 6ab3d435

+54 -55
+54 -55
drivers/gpu/drm/panel/panel-simple.c
··· 623 623 if (IS_ERR(desc)) 624 624 return ERR_CAST(desc); 625 625 626 + connector_type = desc->connector_type; 627 + /* Catch common mistakes for panels. */ 628 + switch (connector_type) { 629 + case 0: 630 + dev_warn(dev, "Specify missing connector_type\n"); 631 + connector_type = DRM_MODE_CONNECTOR_DPI; 632 + break; 633 + case DRM_MODE_CONNECTOR_LVDS: 634 + WARN_ON(desc->bus_flags & 635 + ~(DRM_BUS_FLAG_DE_LOW | 636 + DRM_BUS_FLAG_DE_HIGH | 637 + DRM_BUS_FLAG_DATA_MSB_TO_LSB | 638 + DRM_BUS_FLAG_DATA_LSB_TO_MSB)); 639 + WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && 640 + desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG && 641 + desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA); 642 + WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && 643 + desc->bpc != 6); 644 + WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG || 645 + desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) && 646 + desc->bpc != 8); 647 + break; 648 + case DRM_MODE_CONNECTOR_eDP: 649 + dev_warn(dev, "eDP panels moved to panel-edp\n"); 650 + return ERR_PTR(-EINVAL); 651 + case DRM_MODE_CONNECTOR_DSI: 652 + if (desc->bpc != 6 && desc->bpc != 8) 653 + dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); 654 + break; 655 + case DRM_MODE_CONNECTOR_DPI: 656 + bus_flags = DRM_BUS_FLAG_DE_LOW | 657 + DRM_BUS_FLAG_DE_HIGH | 658 + DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE | 659 + DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE | 660 + DRM_BUS_FLAG_DATA_MSB_TO_LSB | 661 + DRM_BUS_FLAG_DATA_LSB_TO_MSB | 662 + DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE | 663 + DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE; 664 + if (desc->bus_flags & ~bus_flags) 665 + dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags); 666 + if (!(desc->bus_flags & bus_flags)) 667 + dev_warn(dev, "Specify missing bus_flags\n"); 668 + if (desc->bus_format == 0) 669 + dev_warn(dev, "Specify missing bus_format\n"); 670 + if (desc->bpc != 6 && desc->bpc != 8) 671 + dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); 672 + break; 673 + default: 674 + dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type); 675 + connector_type = DRM_MODE_CONNECTOR_DPI; 676 + break; 677 + } 678 + 626 679 panel = devm_drm_panel_alloc(dev, struct panel_simple, base, 627 - &panel_simple_funcs, desc->connector_type); 680 + &panel_simple_funcs, connector_type); 628 681 if (IS_ERR(panel)) 629 682 return ERR_CAST(panel); 630 683 ··· 717 664 err = panel_simple_override_nondefault_lvds_datamapping(dev, panel); 718 665 if (err) 719 666 goto free_ddc; 720 - } 721 - 722 - connector_type = desc->connector_type; 723 - /* Catch common mistakes for panels. */ 724 - switch (connector_type) { 725 - case 0: 726 - dev_warn(dev, "Specify missing connector_type\n"); 727 - connector_type = DRM_MODE_CONNECTOR_DPI; 728 - break; 729 - case DRM_MODE_CONNECTOR_LVDS: 730 - WARN_ON(desc->bus_flags & 731 - ~(DRM_BUS_FLAG_DE_LOW | 732 - DRM_BUS_FLAG_DE_HIGH | 733 - DRM_BUS_FLAG_DATA_MSB_TO_LSB | 734 - DRM_BUS_FLAG_DATA_LSB_TO_MSB)); 735 - WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && 736 - desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG && 737 - desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA); 738 - WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && 739 - desc->bpc != 6); 740 - WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG || 741 - desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) && 742 - desc->bpc != 8); 743 - break; 744 - case DRM_MODE_CONNECTOR_eDP: 745 - dev_warn(dev, "eDP panels moved to panel-edp\n"); 746 - err = -EINVAL; 747 - goto free_ddc; 748 - case DRM_MODE_CONNECTOR_DSI: 749 - if (desc->bpc != 6 && desc->bpc != 8) 750 - dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); 751 - break; 752 - case DRM_MODE_CONNECTOR_DPI: 753 - bus_flags = DRM_BUS_FLAG_DE_LOW | 754 - DRM_BUS_FLAG_DE_HIGH | 755 - DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE | 756 - DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE | 757 - DRM_BUS_FLAG_DATA_MSB_TO_LSB | 758 - DRM_BUS_FLAG_DATA_LSB_TO_MSB | 759 - DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE | 760 - DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE; 761 - if (desc->bus_flags & ~bus_flags) 762 - dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags); 763 - if (!(desc->bus_flags & bus_flags)) 764 - dev_warn(dev, "Specify missing bus_flags\n"); 765 - if (desc->bus_format == 0) 766 - dev_warn(dev, "Specify missing bus_format\n"); 767 - if (desc->bpc != 6 && desc->bpc != 8) 768 - dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); 769 - break; 770 - default: 771 - dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type); 772 - connector_type = DRM_MODE_CONNECTOR_DPI; 773 - break; 774 667 } 775 668 776 669 dev_set_drvdata(dev, panel);