Commit 96b2bb0b authored by Dave Airlie's avatar Dave Airlie

Merge tag 'omapdrm-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux into drm-next

omapdrm changes for 4.19

* Workaround for DRA7 errata i932
* Fix mm_list locking
* Cleanups
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

Link: https://patchwork.freedesktop.org/patch/msgid/88b2e77f-9646-d15f-645b-ba45af2a1966@ti.com
parents f29135ee f8466184
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Copyright (C) 2010 Nokia Corporation * Copyright (C) 2010 Nokia Corporation
* *
* Original Driver Author: Imre Deak <imre.deak@nokia.com> * Original Driver Author: Imre Deak <imre.deak@nokia.com>
* Based on panel-generic.c by Tomi Valkeinen <tomi.valkeinen@nokia.com> * Based on panel-generic.c by Tomi Valkeinen <tomi.valkeinen@ti.com>
* Adapted to new DSS2 framework: Roger Quadros <roger.quadros@nokia.com> * Adapted to new DSS2 framework: Roger Quadros <roger.quadros@nokia.com>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* Toppoly TD028TTEC1 panel support * Toppoly TD028TTEC1 panel support
* *
* Copyright (C) 2008 Nokia Corporation * Copyright (C) 2008 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Neo 1973 code (jbt6k74.c): * Neo 1973 code (jbt6k74.c):
* Copyright (C) 2006-2007 by OpenMoko, Inc. * Copyright (C) 2006-2007 by OpenMoko, Inc.
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
...@@ -82,7 +82,7 @@ static void __exit omap_dss_exit(void) ...@@ -82,7 +82,7 @@ static void __exit omap_dss_exit(void)
module_init(omap_dss_init); module_init(omap_dss_init);
module_exit(omap_dss_exit); module_exit(omap_dss_exit);
MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@nokia.com>"); MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ti.com>");
MODULE_DESCRIPTION("OMAP2/3 Display Subsystem"); MODULE_DESCRIPTION("OMAP2/3 Display Subsystem");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by * under the terms of the GNU General Public License version 2 as published by
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* Some code and ideas taken from drivers/video/omap/ driver * Some code and ideas taken from drivers/video/omap/ driver
* by Imre Deak. * by Imre Deak.
...@@ -180,6 +180,9 @@ struct dss_pll_hw { ...@@ -180,6 +180,9 @@ struct dss_pll_hw {
/* DRA7 errata i886: use high N & M to avoid jitter */ /* DRA7 errata i886: use high N & M to avoid jitter */
bool errata_i886; bool errata_i886;
/* DRA7 errata i932: retry pll lock on failure */
bool errata_i932;
}; };
struct dss_pll { struct dss_pll {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#define DSS_SUBSYS_NAME "PLL" #define DSS_SUBSYS_NAME "PLL"
#include <linux/delay.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -381,6 +382,22 @@ static int dss_wait_hsdiv_ack(struct dss_pll *pll, u32 hsdiv_ack_mask) ...@@ -381,6 +382,22 @@ static int dss_wait_hsdiv_ack(struct dss_pll *pll, u32 hsdiv_ack_mask)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
static bool pll_is_locked(u32 stat)
{
/*
* Required value for each bitfield listed below
*
* PLL_STATUS[6] = 0 PLL_BYPASS
* PLL_STATUS[5] = 0 PLL_HIGHJITTER
*
* PLL_STATUS[3] = 0 PLL_LOSSREF
* PLL_STATUS[2] = 0 PLL_RECAL
* PLL_STATUS[1] = 1 PLL_LOCK
* PLL_STATUS[0] = 1 PLL_CTRL_RESET_DONE
*/
return ((stat & 0x6f) == 0x3);
}
int dss_pll_write_config_type_a(struct dss_pll *pll, int dss_pll_write_config_type_a(struct dss_pll *pll,
const struct dss_pll_clock_info *cinfo) const struct dss_pll_clock_info *cinfo)
{ {
...@@ -436,6 +453,41 @@ int dss_pll_write_config_type_a(struct dss_pll *pll, ...@@ -436,6 +453,41 @@ int dss_pll_write_config_type_a(struct dss_pll *pll,
l = FLD_MOD(l, 0, 25, 25); /* M7_CLOCK_EN */ l = FLD_MOD(l, 0, 25, 25); /* M7_CLOCK_EN */
writel_relaxed(l, base + PLL_CONFIGURATION2); writel_relaxed(l, base + PLL_CONFIGURATION2);
if (hw->errata_i932) {
int cnt = 0;
u32 sleep_time;
const u32 max_lock_retries = 20;
/*
* Calculate wait time for PLL LOCK
* 1000 REFCLK cycles in us.
*/
sleep_time = DIV_ROUND_UP(1000*1000*1000, cinfo->fint);
for (cnt = 0; cnt < max_lock_retries; cnt++) {
writel_relaxed(1, base + PLL_GO); /* PLL_GO */
/**
* read the register back to ensure the write is
* flushed
*/
readl_relaxed(base + PLL_GO);
usleep_range(sleep_time, sleep_time + 5);
l = readl_relaxed(base + PLL_STATUS);
if (pll_is_locked(l) &&
!(readl_relaxed(base + PLL_GO) & 0x1))
break;
}
if (cnt == max_lock_retries) {
DSSERR("cannot lock PLL\n");
r = -EIO;
goto err;
}
} else {
writel_relaxed(1, base + PLL_GO); /* PLL_GO */ writel_relaxed(1, base + PLL_GO); /* PLL_GO */
if (wait_for_bit_change(base + PLL_GO, 0, 0) != 0) { if (wait_for_bit_change(base + PLL_GO, 0, 0) != 0) {
...@@ -449,6 +501,7 @@ int dss_pll_write_config_type_a(struct dss_pll *pll, ...@@ -449,6 +501,7 @@ int dss_pll_write_config_type_a(struct dss_pll *pll,
r = -EIO; r = -EIO;
goto err; goto err;
} }
}
l = readl_relaxed(base + PLL_CONFIGURATION2); l = readl_relaxed(base + PLL_CONFIGURATION2);
l = FLD_MOD(l, 1, 14, 14); /* PHY_CLKINEN */ l = FLD_MOD(l, 1, 14, 14); /* PHY_CLKINEN */
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by * under the terms of the GNU General Public License version 2 as published by
......
/* /*
* Copyright (C) 2009 Nokia Corporation * Copyright (C) 2009 Nokia Corporation
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
* *
* VENC settings from TI's DSS driver * VENC settings from TI's DSS driver
* *
......
...@@ -134,6 +134,7 @@ static const struct dss_pll_hw dss_dra7_video_pll_hw = { ...@@ -134,6 +134,7 @@ static const struct dss_pll_hw dss_dra7_video_pll_hw = {
.has_refsel = true, .has_refsel = true,
.errata_i886 = true, .errata_i886 = true,
.errata_i932 = true,
}; };
struct dss_pll *dss_video_pll_init(struct dss_device *dss, struct dss_pll *dss_video_pll_init(struct dss_device *dss,
......
...@@ -30,16 +30,11 @@ static int gem_show(struct seq_file *m, void *arg) ...@@ -30,16 +30,11 @@ static int gem_show(struct seq_file *m, void *arg)
struct drm_info_node *node = (struct drm_info_node *) m->private; struct drm_info_node *node = (struct drm_info_node *) m->private;
struct drm_device *dev = node->minor->dev; struct drm_device *dev = node->minor->dev;
struct omap_drm_private *priv = dev->dev_private; struct omap_drm_private *priv = dev->dev_private;
int ret;
ret = mutex_lock_interruptible(&dev->struct_mutex);
if (ret)
return ret;
seq_printf(m, "All Objects:\n"); seq_printf(m, "All Objects:\n");
mutex_lock(&priv->list_lock);
omap_gem_describe_objects(&priv->obj_list, m); omap_gem_describe_objects(&priv->obj_list, m);
mutex_unlock(&priv->list_lock);
mutex_unlock(&dev->struct_mutex);
return 0; return 0;
} }
......
...@@ -493,7 +493,7 @@ static struct drm_driver omap_drm_driver = { ...@@ -493,7 +493,7 @@ static struct drm_driver omap_drm_driver = {
.prime_fd_to_handle = drm_gem_prime_fd_to_handle, .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
.gem_prime_export = omap_gem_prime_export, .gem_prime_export = omap_gem_prime_export,
.gem_prime_import = omap_gem_prime_import, .gem_prime_import = omap_gem_prime_import,
.gem_free_object = omap_gem_free_object, .gem_free_object_unlocked = omap_gem_free_object,
.gem_vm_ops = &omap_gem_vm_ops, .gem_vm_ops = &omap_gem_vm_ops,
.dumb_create = omap_gem_dumb_create, .dumb_create = omap_gem_dumb_create,
.dumb_map_offset = omap_gem_dumb_map_offset, .dumb_map_offset = omap_gem_dumb_map_offset,
...@@ -540,7 +540,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) ...@@ -540,7 +540,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
priv->omaprev = soc ? (unsigned int)soc->data : 0; priv->omaprev = soc ? (unsigned int)soc->data : 0;
priv->wq = alloc_ordered_workqueue("omapdrm", 0); priv->wq = alloc_ordered_workqueue("omapdrm", 0);
spin_lock_init(&priv->list_lock); mutex_init(&priv->list_lock);
INIT_LIST_HEAD(&priv->obj_list); INIT_LIST_HEAD(&priv->obj_list);
/* Allocate and initialize the DRM device. */ /* Allocate and initialize the DRM device. */
......
...@@ -71,7 +71,7 @@ struct omap_drm_private { ...@@ -71,7 +71,7 @@ struct omap_drm_private {
struct workqueue_struct *wq; struct workqueue_struct *wq;
/* lock for obj_list below */ /* lock for obj_list below */
spinlock_t list_lock; struct mutex list_lock;
/* list of GEM objects: */ /* list of GEM objects: */
struct list_head obj_list; struct list_head obj_list;
......
...@@ -170,13 +170,11 @@ static int omap_fbdev_create(struct drm_fb_helper *helper, ...@@ -170,13 +170,11 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
goto fail; goto fail;
} }
mutex_lock(&dev->struct_mutex);
fbi = drm_fb_helper_alloc_fbi(helper); fbi = drm_fb_helper_alloc_fbi(helper);
if (IS_ERR(fbi)) { if (IS_ERR(fbi)) {
dev_err(dev->dev, "failed to allocate fb info\n"); dev_err(dev->dev, "failed to allocate fb info\n");
ret = PTR_ERR(fbi); ret = PTR_ERR(fbi);
goto fail_unlock; goto fail;
} }
DBG("fbi=%p, dev=%p", fbi, dev); DBG("fbi=%p, dev=%p", fbi, dev);
...@@ -212,12 +210,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper, ...@@ -212,12 +210,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
DBG("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres); DBG("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres);
DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height); DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height);
mutex_unlock(&dev->struct_mutex);
return 0; return 0;
fail_unlock:
mutex_unlock(&dev->struct_mutex);
fail: fail:
if (ret) { if (ret) {
......
This diff is collapsed.
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#define __OMAPDRM_GEM_H__ #define __OMAPDRM_GEM_H__
#include <linux/types.h> #include <linux/types.h>
#include <linux/mm_types.h>
enum dma_data_direction; enum dma_data_direction;
...@@ -80,7 +81,7 @@ struct dma_buf *omap_gem_prime_export(struct drm_device *dev, ...@@ -80,7 +81,7 @@ struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
struct dma_buf *buffer); struct dma_buf *buffer);
int omap_gem_fault(struct vm_fault *vmf); vm_fault_t omap_gem_fault(struct vm_fault *vmf);
int omap_gem_roll(struct drm_gem_object *obj, u32 roll); int omap_gem_roll(struct drm_gem_object *obj, u32 roll);
void omap_gem_cpu_sync_page(struct drm_gem_object *obj, int pgoff); void omap_gem_cpu_sync_page(struct drm_gem_object *obj, int pgoff);
void omap_gem_dma_sync_buffer(struct drm_gem_object *obj, void omap_gem_dma_sync_buffer(struct drm_gem_object *obj,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment