Skip to content

Commit

Permalink
Merge branch 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/daeinki/drm-exynos into drm-fixes

  Summary:
   - fix compilation warnings on ARM64bit.
   - fix mic driver initialization.
     . MIC is a part of KMS so it converts it to use component framework
       like other KMS drivers did.
   - fix wrong driver state and disable clock order on DECON driver.
   - fix incorrect use of dma_mmap_attrs function.

* 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos:
  drm/exynos/decon: fix disable clocks order
  drm/exynos: fix incorrect cpu address for dma_mmap_attrs()
  drm/exynos: exynos5433_decon: fix wrong state in decon_vblank_enable
  drm/exynos: exynos5433_decon: fix wrong state assignment in decon_enable
  drm/exynos: dsi: restore support for drm bridge
  drm/exynos: mic: make all functions static
  drm/exynos: mic: convert to component framework
  drm/exynos: mic: use devm_clk interface
  drm/exynos: fix types for compilation on 64bit architectures
  drm/exynos: ipp: fix incorrect format specifiers in debug messages
  drm/exynos: depend on ARCH_EXYNOS for DRM_EXYNOS
  • Loading branch information
Dave Airlie committed Feb 17, 2016
2 parents 8ae22cb + 00780f3 commit e8f051e
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 63 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/Kconfig
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
config DRM_EXYNOS
tristate "DRM Support for Samsung SoC EXYNOS Series"
depends on OF && DRM && (PLAT_SAMSUNG || ARCH_MULTIPLATFORM)
depends on OF && DRM && (ARCH_S3C64XX || ARCH_EXYNOS || ARCH_MULTIPLATFORM)
select DRM_KMS_HELPER
select DRM_KMS_FB_HELPER
select FB_CFB_FILLRECT
Expand Down
8 changes: 3 additions & 5 deletions drivers/gpu/drm/exynos/exynos5433_drm_decon.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
if (test_bit(BIT_SUSPENDED, &ctx->flags))
return -EPERM;

if (test_and_set_bit(BIT_IRQS_ENABLED, &ctx->flags)) {
if (!test_and_set_bit(BIT_IRQS_ENABLED, &ctx->flags)) {
val = VIDINTCON0_INTEN;
if (ctx->out_type == IFTYPE_I80)
val |= VIDINTCON0_FRAMEDONE;
Expand Down Expand Up @@ -402,8 +402,6 @@ static void decon_enable(struct exynos_drm_crtc *crtc)
decon_enable_vblank(ctx->crtc);

decon_commit(ctx->crtc);

set_bit(BIT_SUSPENDED, &ctx->flags);
}

static void decon_disable(struct exynos_drm_crtc *crtc)
Expand Down Expand Up @@ -582,9 +580,9 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id)
static int exynos5433_decon_suspend(struct device *dev)
{
struct decon_context *ctx = dev_get_drvdata(dev);
int i;
int i = ARRAY_SIZE(decon_clks_name);

for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++)
while (--i >= 0)
clk_disable_unprepare(ctx->clks[i]);

return 0;
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/exynos/exynos_drm_dsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1782,6 +1782,7 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,

bridge = of_drm_find_bridge(dsi->bridge_node);
if (bridge) {
encoder->bridge = bridge;
drm_bridge_attach(drm_dev, bridge);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static int exynos_drm_fb_mmap(struct fb_info *info,
if (vm_size > exynos_gem->size)
return -EINVAL;

ret = dma_mmap_attrs(helper->dev->dev, vma, exynos_gem->pages,
ret = dma_mmap_attrs(helper->dev->dev, vma, exynos_gem->cookie,
exynos_gem->dma_addr, exynos_gem->size,
&exynos_gem->dma_attrs);
if (ret < 0) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_fimc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,7 @@ static int fimc_probe(struct platform_device *pdev)
goto err_put_clk;
}

DRM_DEBUG_KMS("id[%d]ippdrv[0x%x]\n", ctx->id, (int)ippdrv);
DRM_DEBUG_KMS("id[%d]ippdrv[%p]\n", ctx->id, ippdrv);

spin_lock_init(&ctx->lock);
platform_set_drvdata(pdev, ctx);
Expand Down
5 changes: 3 additions & 2 deletions drivers/gpu/drm/exynos/exynos_drm_g2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -1166,7 +1166,7 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
goto err_free_event;
}

cmd = (struct drm_exynos_g2d_cmd *)(uint32_t)req->cmd;
cmd = (struct drm_exynos_g2d_cmd *)(unsigned long)req->cmd;

if (copy_from_user(cmdlist->data + cmdlist->last,
(void __user *)cmd,
Expand All @@ -1184,7 +1184,8 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
if (req->cmd_buf_nr) {
struct drm_exynos_g2d_cmd *cmd_buf;

cmd_buf = (struct drm_exynos_g2d_cmd *)(uint32_t)req->cmd_buf;
cmd_buf = (struct drm_exynos_g2d_cmd *)
(unsigned long)req->cmd_buf;

if (copy_from_user(cmdlist->data + cmdlist->last,
(void __user *)cmd_buf,
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/exynos/exynos_drm_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ static struct exynos_drm_gem *exynos_drm_gem_init(struct drm_device *dev,
return ERR_PTR(ret);
}

DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
DRM_DEBUG_KMS("created file object = %p\n", obj->filp);

return exynos_gem;
}
Expand Down Expand Up @@ -335,7 +335,7 @@ static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem *exynos_gem,
if (vm_size > exynos_gem->size)
return -EINVAL;

ret = dma_mmap_attrs(drm_dev->dev, vma, exynos_gem->pages,
ret = dma_mmap_attrs(drm_dev->dev, vma, exynos_gem->cookie,
exynos_gem->dma_addr, exynos_gem->size,
&exynos_gem->dma_attrs);
if (ret < 0) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_gsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,7 @@ static int gsc_probe(struct platform_device *pdev)
return ret;
}

DRM_DEBUG_KMS("id[%d]ippdrv[0x%x]\n", ctx->id, (int)ippdrv);
DRM_DEBUG_KMS("id[%d]ippdrv[%p]\n", ctx->id, ippdrv);

mutex_init(&ctx->lock);
platform_set_drvdata(pdev, ctx);
Expand Down
32 changes: 16 additions & 16 deletions drivers/gpu/drm/exynos/exynos_drm_ipp.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ static struct exynos_drm_ippdrv *ipp_find_drv_by_handle(u32 prop_id)
* e.g PAUSE state, queue buf, command control.
*/
list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
DRM_DEBUG_KMS("count[%d]ippdrv[0x%x]\n", count++, (int)ippdrv);
DRM_DEBUG_KMS("count[%d]ippdrv[%p]\n", count++, ippdrv);

mutex_lock(&ippdrv->cmd_lock);
list_for_each_entry(c_node, &ippdrv->cmd_list, list) {
Expand Down Expand Up @@ -388,8 +388,8 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
}
property->prop_id = ret;

DRM_DEBUG_KMS("created prop_id[%d]cmd[%d]ippdrv[0x%x]\n",
property->prop_id, property->cmd, (int)ippdrv);
DRM_DEBUG_KMS("created prop_id[%d]cmd[%d]ippdrv[%p]\n",
property->prop_id, property->cmd, ippdrv);

/* stored property information and ippdrv in private data */
c_node->property = *property;
Expand Down Expand Up @@ -518,7 +518,7 @@ static int ipp_put_mem_node(struct drm_device *drm_dev,
{
int i;

DRM_DEBUG_KMS("node[0x%x]\n", (int)m_node);
DRM_DEBUG_KMS("node[%p]\n", m_node);

if (!m_node) {
DRM_ERROR("invalid dequeue node.\n");
Expand Down Expand Up @@ -562,7 +562,7 @@ static struct drm_exynos_ipp_mem_node
m_node->buf_id = qbuf->buf_id;
INIT_LIST_HEAD(&m_node->list);

DRM_DEBUG_KMS("m_node[0x%x]ops_id[%d]\n", (int)m_node, qbuf->ops_id);
DRM_DEBUG_KMS("m_node[%p]ops_id[%d]\n", m_node, qbuf->ops_id);
DRM_DEBUG_KMS("prop_id[%d]buf_id[%d]\n", qbuf->prop_id, m_node->buf_id);

for_each_ipp_planar(i) {
Expand All @@ -582,8 +582,8 @@ static struct drm_exynos_ipp_mem_node

buf_info->handles[i] = qbuf->handle[i];
buf_info->base[i] = *addr;
DRM_DEBUG_KMS("i[%d]base[0x%x]hd[0x%lx]\n", i,
buf_info->base[i], buf_info->handles[i]);
DRM_DEBUG_KMS("i[%d]base[%pad]hd[0x%lx]\n", i,
&buf_info->base[i], buf_info->handles[i]);
}
}

Expand Down Expand Up @@ -664,7 +664,7 @@ static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node,

mutex_lock(&c_node->event_lock);
list_for_each_entry_safe(e, te, &c_node->event_list, base.link) {
DRM_DEBUG_KMS("count[%d]e[0x%x]\n", count++, (int)e);
DRM_DEBUG_KMS("count[%d]e[%p]\n", count++, e);

/*
* qbuf == NULL condition means all event deletion.
Expand Down Expand Up @@ -755,7 +755,7 @@ static struct drm_exynos_ipp_mem_node

/* find memory node from memory list */
list_for_each_entry(m_node, head, list) {
DRM_DEBUG_KMS("count[%d]m_node[0x%x]\n", count++, (int)m_node);
DRM_DEBUG_KMS("count[%d]m_node[%p]\n", count++, m_node);

/* compare buffer id */
if (m_node->buf_id == qbuf->buf_id)
Expand All @@ -772,7 +772,7 @@ static int ipp_set_mem_node(struct exynos_drm_ippdrv *ippdrv,
struct exynos_drm_ipp_ops *ops = NULL;
int ret = 0;

DRM_DEBUG_KMS("node[0x%x]\n", (int)m_node);
DRM_DEBUG_KMS("node[%p]\n", m_node);

if (!m_node) {
DRM_ERROR("invalid queue node.\n");
Expand Down Expand Up @@ -1237,7 +1237,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,
m_node = list_first_entry(head,
struct drm_exynos_ipp_mem_node, list);

DRM_DEBUG_KMS("m_node[0x%x]\n", (int)m_node);
DRM_DEBUG_KMS("m_node[%p]\n", m_node);

ret = ipp_set_mem_node(ippdrv, c_node, m_node);
if (ret) {
Expand Down Expand Up @@ -1610,8 +1610,8 @@ static int ipp_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
}
ippdrv->prop_list.ipp_id = ret;

DRM_DEBUG_KMS("count[%d]ippdrv[0x%x]ipp_id[%d]\n",
count++, (int)ippdrv, ret);
DRM_DEBUG_KMS("count[%d]ippdrv[%p]ipp_id[%d]\n",
count++, ippdrv, ret);

/* store parent device for node */
ippdrv->parent_dev = dev;
Expand Down Expand Up @@ -1668,7 +1668,7 @@ static int ipp_subdrv_open(struct drm_device *drm_dev, struct device *dev,

file_priv->ipp_dev = dev;

DRM_DEBUG_KMS("done priv[0x%x]\n", (int)dev);
DRM_DEBUG_KMS("done priv[%p]\n", dev);

return 0;
}
Expand All @@ -1685,8 +1685,8 @@ static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev,
mutex_lock(&ippdrv->cmd_lock);
list_for_each_entry_safe(c_node, tc_node,
&ippdrv->cmd_list, list) {
DRM_DEBUG_KMS("count[%d]ippdrv[0x%x]\n",
count++, (int)ippdrv);
DRM_DEBUG_KMS("count[%d]ippdrv[%p]\n",
count++, ippdrv);

if (c_node->filp == file) {
/*
Expand Down
72 changes: 42 additions & 30 deletions drivers/gpu/drm/exynos/exynos_drm_mic.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/clk.h>
#include <linux/component.h>
#include <drm/drmP.h>
#include <linux/mfd/syscon.h>
#include <linux/regmap.h>
Expand Down Expand Up @@ -306,9 +307,9 @@ static int parse_dt(struct exynos_mic *mic)
return ret;
}

void mic_disable(struct drm_bridge *bridge) { }
static void mic_disable(struct drm_bridge *bridge) { }

void mic_post_disable(struct drm_bridge *bridge)
static void mic_post_disable(struct drm_bridge *bridge)
{
struct exynos_mic *mic = bridge->driver_private;
int i;
Expand All @@ -328,7 +329,7 @@ void mic_post_disable(struct drm_bridge *bridge)
mutex_unlock(&mic_mutex);
}

void mic_pre_enable(struct drm_bridge *bridge)
static void mic_pre_enable(struct drm_bridge *bridge)
{
struct exynos_mic *mic = bridge->driver_private;
int ret, i;
Expand Down Expand Up @@ -371,11 +372,35 @@ void mic_pre_enable(struct drm_bridge *bridge)
mutex_unlock(&mic_mutex);
}

void mic_enable(struct drm_bridge *bridge) { }
static void mic_enable(struct drm_bridge *bridge) { }

void mic_destroy(struct drm_bridge *bridge)
static const struct drm_bridge_funcs mic_bridge_funcs = {
.disable = mic_disable,
.post_disable = mic_post_disable,
.pre_enable = mic_pre_enable,
.enable = mic_enable,
};

static int exynos_mic_bind(struct device *dev, struct device *master,
void *data)
{
struct exynos_mic *mic = bridge->driver_private;
struct exynos_mic *mic = dev_get_drvdata(dev);
int ret;

mic->bridge.funcs = &mic_bridge_funcs;
mic->bridge.of_node = dev->of_node;
mic->bridge.driver_private = mic;
ret = drm_bridge_add(&mic->bridge);
if (ret)
DRM_ERROR("mic: Failed to add MIC to the global bridge list\n");

return ret;
}

static void exynos_mic_unbind(struct device *dev, struct device *master,
void *data)
{
struct exynos_mic *mic = dev_get_drvdata(dev);
int i;

mutex_lock(&mic_mutex);
Expand All @@ -387,16 +412,16 @@ void mic_destroy(struct drm_bridge *bridge)

already_disabled:
mutex_unlock(&mic_mutex);

drm_bridge_remove(&mic->bridge);
}

static const struct drm_bridge_funcs mic_bridge_funcs = {
.disable = mic_disable,
.post_disable = mic_post_disable,
.pre_enable = mic_pre_enable,
.enable = mic_enable,
static const struct component_ops exynos_mic_component_ops = {
.bind = exynos_mic_bind,
.unbind = exynos_mic_unbind,
};

int exynos_mic_probe(struct platform_device *pdev)
static int exynos_mic_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct exynos_mic *mic;
Expand Down Expand Up @@ -435,17 +460,8 @@ int exynos_mic_probe(struct platform_device *pdev)
goto err;
}

mic->bridge.funcs = &mic_bridge_funcs;
mic->bridge.of_node = dev->of_node;
mic->bridge.driver_private = mic;
ret = drm_bridge_add(&mic->bridge);
if (ret) {
DRM_ERROR("mic: Failed to add MIC to the global bridge list\n");
goto err;
}

for (i = 0; i < NUM_CLKS; i++) {
mic->clks[i] = of_clk_get_by_name(dev->of_node, clk_names[i]);
mic->clks[i] = devm_clk_get(dev, clk_names[i]);
if (IS_ERR(mic->clks[i])) {
DRM_ERROR("mic: Failed to get clock (%s)\n",
clk_names[i]);
Expand All @@ -454,22 +470,18 @@ int exynos_mic_probe(struct platform_device *pdev)
}
}

platform_set_drvdata(pdev, mic);

DRM_DEBUG_KMS("MIC has been probed\n");
return component_add(dev, &exynos_mic_component_ops);

err:
return ret;
}

static int exynos_mic_remove(struct platform_device *pdev)
{
struct exynos_mic *mic = platform_get_drvdata(pdev);
int i;

drm_bridge_remove(&mic->bridge);

for (i = NUM_CLKS - 1; i > -1; i--)
clk_put(mic->clks[i]);

component_del(&pdev->dev, &exynos_mic_component_ops);
return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_rotator.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,7 +754,7 @@ static int rotator_probe(struct platform_device *pdev)
goto err_ippdrv_register;
}

DRM_DEBUG_KMS("ippdrv[0x%x]\n", (int)ippdrv);
DRM_DEBUG_KMS("ippdrv[%p]\n", ippdrv);

platform_set_drvdata(pdev, rot);

Expand Down
Loading

0 comments on commit e8f051e

Please sign in to comment.