Skip to content

Commit

Permalink
drm/komeda: Add DT parsing
Browse files Browse the repository at this point in the history
Parse DT and initialize corresponding dev/pipeline attributes.

Changes in v4:
- Rebase.

Changes in v3:
- Fixed style problem found by checkpatch.pl --strict.

Changes in v2:
- Unified abbreviation of "pipeline" to "pipe".

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
  • Loading branch information
james qian wang (Arm Technology China) authored and Liviu Dudau committed Jan 14, 2019
1 parent 26bd43a commit 29e56ae
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 0 deletions.
76 changes: 76 additions & 0 deletions drivers/gpu/drm/arm/display/komeda/komeda_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,76 @@
#include <linux/of_graph.h>
#include "komeda_dev.h"

static int komeda_parse_pipe_dt(struct komeda_dev *mdev, struct device_node *np)
{
struct komeda_pipeline *pipe;
struct clk *clk;
u32 pipe_id;
int ret = 0;

ret = of_property_read_u32(np, "reg", &pipe_id);
if (ret != 0 || pipe_id >= mdev->n_pipelines)
return -EINVAL;

pipe = mdev->pipelines[pipe_id];

clk = of_clk_get_by_name(np, "aclk");
if (IS_ERR(clk)) {
DRM_ERROR("get aclk for pipeline %d failed!\n", pipe_id);
return PTR_ERR(clk);
}
pipe->aclk = clk;

clk = of_clk_get_by_name(np, "pxclk");
if (IS_ERR(clk)) {
DRM_ERROR("get pxclk for pipeline %d failed!\n", pipe_id);
return PTR_ERR(clk);
}
pipe->pxlclk = clk;

/* enum ports */
pipe->of_output_dev =
of_graph_get_remote_node(np, KOMEDA_OF_PORT_OUTPUT, 0);
pipe->of_output_port =
of_graph_get_port_by_id(np, KOMEDA_OF_PORT_OUTPUT);

pipe->of_node = np;

return 0;
}

static int komeda_parse_dt(struct device *dev, struct komeda_dev *mdev)
{
struct platform_device *pdev = to_platform_device(dev);
struct device_node *child, *np = dev->of_node;
struct clk *clk;
int ret;

clk = devm_clk_get(dev, "mclk");
if (IS_ERR(clk))
return PTR_ERR(clk);

mdev->mclk = clk;
mdev->irq = platform_get_irq(pdev, 0);
if (mdev->irq < 0) {
DRM_ERROR("could not get IRQ number.\n");
return mdev->irq;
}

for_each_available_child_of_node(np, child) {
if (of_node_cmp(child->name, "pipeline") == 0) {
ret = komeda_parse_pipe_dt(mdev, child);
if (ret) {
DRM_ERROR("parse pipeline dt error!\n");
of_node_put(child);
break;
}
}
}

return ret;
}

struct komeda_dev *komeda_dev_create(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
Expand Down Expand Up @@ -71,6 +141,12 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
goto err_cleanup;
}

err = komeda_parse_dt(dev, mdev);
if (err) {
DRM_ERROR("parse device tree failed.\n");
goto err_cleanup;
}

return mdev;

err_cleanup:
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/arm/display/komeda/komeda_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ struct komeda_dev {
/** @mck: HW main engine clk */
struct clk *mclk;

/** @irq: irq number */
u32 irq;

int n_pipelines;
struct komeda_pipeline *pipelines[KOMEDA_MAX_PIPELINES];

Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ void komeda_pipeline_destroy(struct komeda_dev *mdev,
clk_put(pipe->pxlclk);
clk_put(pipe->aclk);

of_node_put(pipe->of_output_dev);
of_node_put(pipe->of_output_port);
of_node_put(pipe->of_node);

devm_kfree(mdev->dev, pipe);
}

Expand Down
7 changes: 7 additions & 0 deletions drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,13 @@ struct komeda_pipeline {
struct komeda_improc *improc;
struct komeda_timing_ctrlr *ctrlr;
struct komeda_pipeline_funcs *funcs; /* private pipeline functions */

/** @of_node: pipeline dt node */
struct device_node *of_node;
/** @of_output_port: pipeline output port */
struct device_node *of_output_port;
/** @of_output_dev: output connector device node */
struct device_node *of_output_dev;
};

/**
Expand Down

0 comments on commit 29e56ae

Please sign in to comment.