mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
drm/panel: simple: Get panel-desc data from DT
Add the ability to parse panel-desc data from the devicetree if it's not hard-coded data. Change-Id: I474940282657c9aa03568b9f98916125784d9fcf Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
@@ -219,13 +219,17 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
|
|||||||
if (num == 0)
|
if (num == 0)
|
||||||
num = panel_simple_get_display_modes(panel, connector);
|
num = panel_simple_get_display_modes(panel, connector);
|
||||||
|
|
||||||
connector->display_info.bpc = panel->desc->bpc;
|
if (panel->desc->bpc)
|
||||||
connector->display_info.width_mm = panel->desc->size.width;
|
connector->display_info.bpc = panel->desc->bpc;
|
||||||
connector->display_info.height_mm = panel->desc->size.height;
|
if (panel->desc->size.width)
|
||||||
|
connector->display_info.width_mm = panel->desc->size.width;
|
||||||
|
if (panel->desc->size.height)
|
||||||
|
connector->display_info.height_mm = panel->desc->size.height;
|
||||||
if (panel->desc->bus_format)
|
if (panel->desc->bus_format)
|
||||||
drm_display_info_set_bus_formats(&connector->display_info,
|
drm_display_info_set_bus_formats(&connector->display_info,
|
||||||
&panel->desc->bus_format, 1);
|
&panel->desc->bus_format, 1);
|
||||||
connector->display_info.bus_flags = panel->desc->bus_flags;
|
if (panel->desc->bus_flags)
|
||||||
|
connector->display_info.bus_flags = panel->desc->bus_flags;
|
||||||
|
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
@@ -3902,6 +3906,9 @@ static const struct panel_desc arm_rtsm = {
|
|||||||
|
|
||||||
static const struct of_device_id platform_of_match[] = {
|
static const struct of_device_id platform_of_match[] = {
|
||||||
{
|
{
|
||||||
|
.compatible = "simple-panel",
|
||||||
|
.data = NULL,
|
||||||
|
}, {
|
||||||
.compatible = "ampire,am-1280800n3tzqw-t00h",
|
.compatible = "ampire,am-1280800n3tzqw-t00h",
|
||||||
.data = &ire_am_1280800n3tzqw_t00h,
|
.data = &ire_am_1280800n3tzqw_t00h,
|
||||||
}, {
|
}, {
|
||||||
@@ -4310,15 +4317,65 @@ static const struct of_device_id platform_of_match[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, platform_of_match);
|
MODULE_DEVICE_TABLE(of, platform_of_match);
|
||||||
|
|
||||||
|
static int panel_simple_of_get_desc_data(struct device *dev,
|
||||||
|
struct panel_desc *desc)
|
||||||
|
{
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
|
struct drm_display_mode *mode;
|
||||||
|
u32 bus_flags;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
mode = devm_kzalloc(dev, sizeof(*mode), GFP_KERNEL);
|
||||||
|
if (!mode)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
err = of_get_drm_display_mode(np, mode, &bus_flags, OF_USE_NATIVE_MODE);
|
||||||
|
if (!err) {
|
||||||
|
desc->modes = mode;
|
||||||
|
desc->num_modes = 1;
|
||||||
|
desc->bus_flags = bus_flags;
|
||||||
|
|
||||||
|
of_property_read_u32(np, "bpc", &desc->bpc);
|
||||||
|
of_property_read_u32(np, "bus-format", &desc->bus_format);
|
||||||
|
of_property_read_u32(np, "width-mm", &desc->size.width);
|
||||||
|
of_property_read_u32(np, "height-mm", &desc->size.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
of_property_read_u32(np, "prepare-delay-ms", &desc->delay.prepare);
|
||||||
|
of_property_read_u32(np, "enable-delay-ms", &desc->delay.enable);
|
||||||
|
of_property_read_u32(np, "disable-delay-ms", &desc->delay.disable);
|
||||||
|
of_property_read_u32(np, "unprepare-delay-ms", &desc->delay.unprepare);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int panel_simple_platform_probe(struct platform_device *pdev)
|
static int panel_simple_platform_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
const struct of_device_id *id;
|
const struct of_device_id *id;
|
||||||
|
const struct panel_desc *desc;
|
||||||
|
struct panel_desc *d;
|
||||||
|
int err;
|
||||||
|
|
||||||
id = of_match_node(platform_of_match, pdev->dev.of_node);
|
id = of_match_node(platform_of_match, pdev->dev.of_node);
|
||||||
if (!id)
|
if (!id)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
return panel_simple_probe(&pdev->dev, id->data);
|
if (!id->data) {
|
||||||
|
d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL);
|
||||||
|
if (!d)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
err = panel_simple_of_get_desc_data(dev, d);
|
||||||
|
if (err) {
|
||||||
|
dev_err(dev, "failed to get desc data: %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = id->data ? id->data : d;
|
||||||
|
|
||||||
|
return panel_simple_probe(&pdev->dev, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int panel_simple_platform_remove(struct platform_device *pdev)
|
static int panel_simple_platform_remove(struct platform_device *pdev)
|
||||||
@@ -4553,6 +4610,9 @@ static const struct panel_desc_dsi osd101t2045_53ts = {
|
|||||||
|
|
||||||
static const struct of_device_id dsi_of_match[] = {
|
static const struct of_device_id dsi_of_match[] = {
|
||||||
{
|
{
|
||||||
|
.compatible = "simple-panel-dsi",
|
||||||
|
.data = NULL,
|
||||||
|
}, {
|
||||||
.compatible = "auo,b080uan01",
|
.compatible = "auo,b080uan01",
|
||||||
.data = &auo_b080uan01
|
.data = &auo_b080uan01
|
||||||
}, {
|
}, {
|
||||||
@@ -4579,9 +4639,32 @@ static const struct of_device_id dsi_of_match[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, dsi_of_match);
|
MODULE_DEVICE_TABLE(of, dsi_of_match);
|
||||||
|
|
||||||
|
static int panel_simple_dsi_of_get_desc_data(struct device *dev,
|
||||||
|
struct panel_desc_dsi *desc)
|
||||||
|
{
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
|
u32 val;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = panel_simple_of_get_desc_data(dev, &desc->desc);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (!of_property_read_u32(np, "dsi,flags", &val))
|
||||||
|
desc->flags = val;
|
||||||
|
if (!of_property_read_u32(np, "dsi,format", &val))
|
||||||
|
desc->format = val;
|
||||||
|
if (!of_property_read_u32(np, "dsi,lanes", &val))
|
||||||
|
desc->lanes = val;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
|
static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
|
||||||
{
|
{
|
||||||
|
struct device *dev = &dsi->dev;
|
||||||
const struct panel_desc_dsi *desc;
|
const struct panel_desc_dsi *desc;
|
||||||
|
struct panel_desc_dsi *d;
|
||||||
const struct of_device_id *id;
|
const struct of_device_id *id;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -4589,7 +4672,19 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
|
|||||||
if (!id)
|
if (!id)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
desc = id->data;
|
if (!id->data) {
|
||||||
|
d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL);
|
||||||
|
if (!d)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
err = panel_simple_dsi_of_get_desc_data(dev, d);
|
||||||
|
if (err) {
|
||||||
|
dev_err(dev, "failed to get desc data: %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = id->data ? id->data : d;
|
||||||
|
|
||||||
err = panel_simple_probe(&dsi->dev, &desc->desc);
|
err = panel_simple_probe(&dsi->dev, &desc->desc);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user