|
26 | 26 | #include <linux/i2c.h>
|
27 | 27 | #include <linux/media-bus-format.h>
|
28 | 28 | #include <linux/module.h>
|
| 29 | +#include <linux/of_device.h> |
29 | 30 | #include <linux/of_platform.h>
|
30 | 31 | #include <linux/platform_device.h>
|
31 | 32 | #include <linux/pm_runtime.h>
|
@@ -136,6 +137,14 @@ struct panel_desc {
|
136 | 137 | int connector_type;
|
137 | 138 | };
|
138 | 139 |
|
| 140 | +struct panel_desc_dsi { |
| 141 | + struct panel_desc desc; |
| 142 | + |
| 143 | + unsigned long flags; |
| 144 | + enum mipi_dsi_pixel_format format; |
| 145 | + unsigned int lanes; |
| 146 | +}; |
| 147 | + |
139 | 148 | struct panel_simple {
|
140 | 149 | struct drm_panel base;
|
141 | 150 |
|
@@ -567,15 +576,49 @@ static int panel_simple_override_nondefault_lvds_datamapping(struct device *dev,
|
567 | 576 | return 0;
|
568 | 577 | }
|
569 | 578 |
|
570 |
| -static struct panel_simple *panel_simple_probe(struct device *dev, const struct panel_desc *desc) |
| 579 | +static const struct panel_desc *panel_simple_get_desc(struct device *dev) |
| 580 | +{ |
| 581 | + if (IS_ENABLED(CONFIG_DRM_MIPI_DSI) && |
| 582 | + dev_is_mipi_dsi(dev)) { |
| 583 | + const struct panel_desc_dsi *dsi_desc; |
| 584 | + |
| 585 | + dsi_desc = of_device_get_match_data(dev); |
| 586 | + if (!dsi_desc) |
| 587 | + return ERR_PTR(-ENODEV); |
| 588 | + |
| 589 | + return &dsi_desc->desc; |
| 590 | + } |
| 591 | + |
| 592 | + if (dev_is_platform(dev)) { |
| 593 | + const struct panel_desc *desc; |
| 594 | + |
| 595 | + desc = of_device_get_match_data(dev); |
| 596 | + if (!desc) |
| 597 | + return ERR_PTR(-ENODEV); |
| 598 | + |
| 599 | + if (desc == &panel_dpi) |
| 600 | + return panel_dpi_probe(dev); |
| 601 | + |
| 602 | + return desc; |
| 603 | + } |
| 604 | + |
| 605 | + return ERR_PTR(-ENODEV); |
| 606 | +} |
| 607 | + |
| 608 | +static struct panel_simple *panel_simple_probe(struct device *dev) |
571 | 609 | {
|
| 610 | + const struct panel_desc *desc; |
572 | 611 | struct panel_simple *panel;
|
573 | 612 | struct display_timing dt;
|
574 | 613 | struct device_node *ddc;
|
575 | 614 | int connector_type;
|
576 | 615 | u32 bus_flags;
|
577 | 616 | int err;
|
578 | 617 |
|
| 618 | + desc = panel_simple_get_desc(dev); |
| 619 | + if (IS_ERR(desc)) |
| 620 | + return ERR_CAST(desc); |
| 621 | + |
579 | 622 | panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
|
580 | 623 | &panel_simple_funcs, desc->connector_type);
|
581 | 624 | if (IS_ERR(panel))
|
@@ -608,19 +651,9 @@ static struct panel_simple *panel_simple_probe(struct device *dev, const struct
|
608 | 651 | return ERR_PTR(-EPROBE_DEFER);
|
609 | 652 | }
|
610 | 653 |
|
611 |
| - if (desc == &panel_dpi) { |
612 |
| - /* Handle the generic panel-dpi binding */ |
613 |
| - desc = panel_dpi_probe(dev); |
614 |
| - if (IS_ERR(desc)) { |
615 |
| - err = PTR_ERR(desc); |
616 |
| - goto free_ddc; |
617 |
| - } |
618 |
| - |
619 |
| - panel->desc = desc; |
620 |
| - } else { |
621 |
| - if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) |
622 |
| - panel_simple_parse_panel_timing_node(dev, panel, &dt); |
623 |
| - } |
| 654 | + if ((desc != &panel_dpi) && |
| 655 | + !of_get_display_timing(dev->of_node, "panel-timing", &dt)) |
| 656 | + panel_simple_parse_panel_timing_node(dev, panel, &dt); |
624 | 657 |
|
625 | 658 | if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
|
626 | 659 | /* Optional data-mapping property for overriding bus format */
|
@@ -5376,14 +5409,9 @@ MODULE_DEVICE_TABLE(of, platform_of_match);
|
5376 | 5409 |
|
5377 | 5410 | static int panel_simple_platform_probe(struct platform_device *pdev)
|
5378 | 5411 | {
|
5379 |
| - const struct panel_desc *desc; |
5380 | 5412 | struct panel_simple *panel;
|
5381 | 5413 |
|
5382 |
| - desc = of_device_get_match_data(&pdev->dev); |
5383 |
| - if (!desc) |
5384 |
| - return -ENODEV; |
5385 |
| - |
5386 |
| - panel = panel_simple_probe(&pdev->dev, desc); |
| 5414 | + panel = panel_simple_probe(&pdev->dev); |
5387 | 5415 | if (IS_ERR(panel))
|
5388 | 5416 | return PTR_ERR(panel);
|
5389 | 5417 |
|
@@ -5417,14 +5445,6 @@ static struct platform_driver panel_simple_platform_driver = {
|
5417 | 5445 | .shutdown = panel_simple_platform_shutdown,
|
5418 | 5446 | };
|
5419 | 5447 |
|
5420 |
| -struct panel_desc_dsi { |
5421 |
| - struct panel_desc desc; |
5422 |
| - |
5423 |
| - unsigned long flags; |
5424 |
| - enum mipi_dsi_pixel_format format; |
5425 |
| - unsigned int lanes; |
5426 |
| -}; |
5427 |
| - |
5428 | 5448 | static const struct drm_display_mode auo_b080uan01_mode = {
|
5429 | 5449 | .clock = 154500,
|
5430 | 5450 | .hdisplay = 1200,
|
@@ -5661,11 +5681,7 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
|
5661 | 5681 | struct panel_simple *panel;
|
5662 | 5682 | int err;
|
5663 | 5683 |
|
5664 |
| - desc = of_device_get_match_data(&dsi->dev); |
5665 |
| - if (!desc) |
5666 |
| - return -ENODEV; |
5667 |
| - |
5668 |
| - panel = panel_simple_probe(&dsi->dev, &desc->desc); |
| 5684 | + panel = panel_simple_probe(&dsi->dev); |
5669 | 5685 | if (IS_ERR(panel))
|
5670 | 5686 | return PTR_ERR(panel);
|
5671 | 5687 |
|
|
0 commit comments