Search
SailfishOS Open Build Service
>
Projects
>
home:mike7b4
:
bbb
>
kernel-adaptation-bbb-v3.12
> 0061-tilcdc-Slave-panel-settings-read-from-DT-now.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File 0061-tilcdc-Slave-panel-settings-read-from-DT-now.patch of Package kernel-adaptation-bbb-v3.12
From f8b28d0592092b6107a550c87a51a9dfbc143aa5 Mon Sep 17 00:00:00 2001 From: Pantelis Antoniou <panto@antoniou-consulting.com> Date: Thu, 6 Jun 2013 11:45:28 +0300 Subject: [PATCH 61/96] tilcdc: Slave panel settings read from DT now Turns out that we really need those panel settings. Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com> --- drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 55 +++++++++++++++++++++++++++++++++++ drivers/gpu/drm/tilcdc/tilcdc_drv.h | 3 ++ drivers/gpu/drm/tilcdc/tilcdc_panel.c | 49 +------------------------------ drivers/gpu/drm/tilcdc/tilcdc_slave.c | 44 ++++++++++++++++------------ 4 files changed, 85 insertions(+), 66 deletions(-) diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c index fec32a6..2153292 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c @@ -687,3 +687,58 @@ fail: tilcdc_crtc_destroy(crtc); return NULL; } + +struct tilcdc_panel_info *tilcdc_of_get_panel_info(struct device_node *np) +{ + struct device_node *info_np; + struct tilcdc_panel_info *info; + int ret = 0; + + if (!np) + return NULL; + + info_np = of_get_child_by_name(np, "panel-info"); + if (!info_np) { + pr_err("%s: could not find panel-info node\n", + of_node_full_name(np)); + return NULL; + } + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + pr_err("%s: allocation failed\n", + of_node_full_name(np)); + goto err_no_mem; + } + + ret |= of_property_read_u32(info_np, "ac-bias", &info->ac_bias); + ret |= of_property_read_u32(info_np, "ac-bias-intrpt", &info->ac_bias_intrpt); + ret |= of_property_read_u32(info_np, "dma-burst-sz", &info->dma_burst_sz); + ret |= of_property_read_u32(info_np, "bpp", &info->bpp); + ret |= of_property_read_u32(info_np, "fdd", &info->fdd); + ret |= of_property_read_u32(info_np, "sync-edge", &info->sync_edge); + ret |= of_property_read_u32(info_np, "sync-ctrl", &info->sync_ctrl); + ret |= of_property_read_u32(info_np, "raster-order", &info->raster_order); + ret |= of_property_read_u32(info_np, "fifo-th", &info->fifo_th); + + /* optional: */ + info->tft_alt_mode = of_property_read_bool(info_np, "tft-alt-mode"); + info->invert_pxl_clk = of_property_read_bool(info_np, "invert-pxl-clk"); + + if (ret) { + pr_err("%s: error reading panel-info properties\n", + of_node_full_name(info_np)); + goto err_bad_prop; + } + + /* release ref */ + of_node_put(info_np); + + return info; + +err_bad_prop: + kfree(info); +err_no_mem: + of_node_put(info_np); + return NULL; +} diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_drv.h index 0938036..479c0aa 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h @@ -170,4 +170,7 @@ void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode); int tilcdc_crtc_max_width(struct drm_crtc *crtc); +/* OF helper for reading panel info */ +struct tilcdc_panel_info *tilcdc_of_get_panel_info(struct device_node *np); + #endif /* __TILCDC_DRV_H__ */ diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 86c6732..284c9ee 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -304,53 +304,6 @@ static const struct tilcdc_module_ops panel_module_ops = { * Device: */ -/* maybe move this somewhere common if it is needed by other outputs? */ -static struct tilcdc_panel_info *of_get_panel_info(struct device_node *np) -{ - struct device_node *info_np; - struct tilcdc_panel_info *info; - int ret = 0; - - if (!np) { - pr_err("%s: no devicenode given\n", __func__); - return NULL; - } - - info_np = of_get_child_by_name(np, "panel-info"); - if (!info_np) { - pr_err("%s: could not find panel-info node\n", __func__); - return NULL; - } - - info = kzalloc(sizeof(*info), GFP_KERNEL); - if (!info) { - pr_err("%s: allocation failed\n", __func__); - return NULL; - } - - ret |= of_property_read_u32(info_np, "ac-bias", &info->ac_bias); - ret |= of_property_read_u32(info_np, "ac-bias-intrpt", &info->ac_bias_intrpt); - ret |= of_property_read_u32(info_np, "dma-burst-sz", &info->dma_burst_sz); - ret |= of_property_read_u32(info_np, "bpp", &info->bpp); - ret |= of_property_read_u32(info_np, "fdd", &info->fdd); - ret |= of_property_read_u32(info_np, "sync-edge", &info->sync_edge); - ret |= of_property_read_u32(info_np, "sync-ctrl", &info->sync_ctrl); - ret |= of_property_read_u32(info_np, "raster-order", &info->raster_order); - ret |= of_property_read_u32(info_np, "fifo-th", &info->fifo_th); - - /* optional: */ - info->tft_alt_mode = of_property_read_bool(info_np, "tft-alt-mode"); - info->invert_pxl_clk = of_property_read_bool(info_np, "invert-pxl-clk"); - - if (ret) { - pr_err("%s: error reading panel-info properties\n", __func__); - kfree(info); - return NULL; - } - - return info; -} - static struct of_device_id panel_of_match[]; static int panel_probe(struct platform_device *pdev) @@ -387,7 +340,7 @@ static int panel_probe(struct platform_device *pdev) goto fail; } - panel_mod->info = of_get_panel_info(node); + panel_mod->info = tilcdc_of_get_panel_info(node); if (!panel_mod->info) { dev_err(&pdev->dev, "could not get panel info\n"); goto fail; diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c index 595068b..6259c56 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c @@ -24,23 +24,11 @@ struct slave_module { struct tilcdc_module base; + struct tilcdc_panel_info *info; struct i2c_adapter *i2c; }; #define to_slave_module(x) container_of(x, struct slave_module, base) -static const struct tilcdc_panel_info slave_info = { - .bpp = 16, - .ac_bias = 255, - .ac_bias_intrpt = 0, - .dma_burst_sz = 16, - .fdd = 0x80, - .tft_alt_mode = 0, - .sync_edge = 0, - .sync_ctrl = 1, - .raster_order = 0, -}; - - /* * Encoder: */ @@ -68,8 +56,10 @@ static void slave_encoder_destroy(struct drm_encoder *encoder) static void slave_encoder_prepare(struct drm_encoder *encoder) { + struct slave_encoder *slave_encoder = to_slave_encoder(encoder); + drm_i2c_encoder_prepare(encoder); - tilcdc_crtc_set_panel_info(encoder->crtc, &slave_info); + tilcdc_crtc_set_panel_info(encoder->crtc, slave_encoder->mod->info); } static bool slave_encoder_fixup(struct drm_encoder *encoder, @@ -300,6 +290,7 @@ static void slave_destroy(struct tilcdc_module *mod) struct slave_module *slave_mod = to_slave_module(mod); tilcdc_module_cleanup(mod); + kfree(slave_mod->info); kfree(slave_mod); } @@ -354,13 +345,25 @@ static int slave_probe(struct platform_device *pdev) return ret; } - slave_mod = kzalloc(sizeof(*slave_mod), GFP_KERNEL); - if (!slave_mod) - return -ENOMEM; + slave_mod = devm_kzalloc(&pdev->dev, sizeof(*slave_mod), GFP_KERNEL); + if (!slave_mod) { + tilcdc_slave_probedefer(false); + dev_err(&pdev->dev, "could not allocate slave_mod\n"); + return -ENOMEM; + } + + platform_set_drvdata(pdev, slave_mod); + + slave_mod->info = tilcdc_of_get_panel_info(node); + if (!slave_mod->info) { + tilcdc_slave_probedefer(false); + dev_err(&pdev->dev, "could not get panel info\n"); + return ret; + } mod = &slave_mod->base; - mod->preferred_bpp = slave_info.bpp; + mod->preferred_bpp = slave_mod->info->bpp; slave_mod->i2c = slavei2c; @@ -377,6 +380,11 @@ static int slave_probe(struct platform_device *pdev) static int slave_remove(struct platform_device *pdev) { + struct slave_module *slave_mod = platform_get_drvdata(pdev); + + put_device(&slave_mod->i2c->dev); + kfree(slave_mod->info); + return 0; } -- 1.9.1