mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 23:51:37 +00:00
drm/imx: fixes and cleanups
Remove unused functions and empty callbacks, let the dw_hdmi-imx driver reuse imx_drm_encoder_parse_of() instead of reimplementing it, replace the custom register spinlock with the regmap default spinlock and remove redundant tracking of enabled state in imx-tve, drop the explicit drm_mode_config_cleanup() call in imx-drm-core, reduce the scope of edid length variables that are not otherwise used in imx-ldb and parallel-display, fix a memory leak in the parallel-display bind error path, and drop an extraneous type qualifier from of_get_tve_mode(). -----BEGIN PGP SIGNATURE----- iI0EABYIADUWIQRRO6F6WdpH1R0vGibVhaclGDdiwAUCX5xDnhcccC56YWJlbEBw ZW5ndXRyb25peC5kZQAKCRDVhaclGDdiwOK0AQCSa4gpezUXK3bp+zkpkbUarBfp eXBEfQoLyjVlp67F6AEAzi70TmVnVUymXhZc2eL7OzQZ7c9MUN0REoIkTaZP3Qo= =7Uwo -----END PGP SIGNATURE----- Merge tag 'imx-drm-next-2020-10-30' of git://git.pengutronix.de/git/pza/linux into drm-fixes drm/imx: fixes and cleanups Remove unused functions and empty callbacks, let the dw_hdmi-imx driver reuse imx_drm_encoder_parse_of() instead of reimplementing it, replace the custom register spinlock with the regmap default spinlock and remove redundant tracking of enabled state in imx-tve, drop the explicit drm_mode_config_cleanup() call in imx-drm-core, reduce the scope of edid length variables that are not otherwise used in imx-ldb and parallel-display, fix a memory leak in the parallel-display bind error path, and drop an extraneous type qualifier from of_get_tve_mode(). Signed-off-by: Dave Airlie <airlied@redhat.com> From: Philipp Zabel <p.zabel@pengutronix.de> Link: https://patchwork.freedesktop.org/patch/msgid/7e4af582027bbec269364b95f6978d061b48271a.camel@pengutronix.de
This commit is contained in:
commit
53aa37fb8d
@ -111,10 +111,6 @@ static int dw_hdmi_imx_parse_dt(struct imx_hdmi *hdmi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dw_hdmi_imx_encoder_disable(struct drm_encoder *encoder)
|
||||
{
|
||||
}
|
||||
|
||||
static void dw_hdmi_imx_encoder_enable(struct drm_encoder *encoder)
|
||||
{
|
||||
struct imx_hdmi *hdmi = enc_to_imx_hdmi(encoder);
|
||||
@ -140,7 +136,6 @@ static int dw_hdmi_imx_atomic_check(struct drm_encoder *encoder,
|
||||
|
||||
static const struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs = {
|
||||
.enable = dw_hdmi_imx_encoder_enable,
|
||||
.disable = dw_hdmi_imx_encoder_disable,
|
||||
.atomic_check = dw_hdmi_imx_atomic_check,
|
||||
};
|
||||
|
||||
@ -219,15 +214,9 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
|
||||
hdmi->dev = &pdev->dev;
|
||||
encoder = &hdmi->encoder;
|
||||
|
||||
encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);
|
||||
/*
|
||||
* If we failed to find the CRTC(s) which this encoder is
|
||||
* supposed to be connected to, it's because the CRTC has
|
||||
* not been registered yet. Defer probing, and hope that
|
||||
* the required CRTC is added later.
|
||||
*/
|
||||
if (encoder->possible_crtcs == 0)
|
||||
return -EPROBE_DEFER;
|
||||
ret = imx_drm_encoder_parse_of(drm, encoder, dev->of_node);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dw_hdmi_imx_parse_dt(hdmi);
|
||||
if (ret < 0)
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_managed.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_plane_helper.h>
|
||||
#include <drm/drm_probe_helper.h>
|
||||
@ -212,7 +213,9 @@ static int imx_drm_bind(struct device *dev)
|
||||
drm->mode_config.allow_fb_modifiers = true;
|
||||
drm->mode_config.normalize_zpos = true;
|
||||
|
||||
drm_mode_config_init(drm);
|
||||
ret = drmm_mode_config_init(drm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = drm_vblank_init(drm, MAX_CRTC);
|
||||
if (ret)
|
||||
@ -251,7 +254,6 @@ err_poll_fini:
|
||||
drm_kms_helper_poll_fini(drm);
|
||||
component_unbind_all(drm->dev, drm);
|
||||
err_kms:
|
||||
drm_mode_config_cleanup(drm);
|
||||
drm_dev_put(drm);
|
||||
|
||||
return ret;
|
||||
@ -267,11 +269,9 @@ static void imx_drm_unbind(struct device *dev)
|
||||
|
||||
component_unbind_all(drm->dev, drm);
|
||||
|
||||
drm_mode_config_cleanup(drm);
|
||||
drm_dev_put(drm);
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
||||
drm_dev_put(drm);
|
||||
}
|
||||
|
||||
static const struct component_master_ops imx_drm_ops = {
|
||||
|
@ -62,7 +62,6 @@ struct imx_ldb_channel {
|
||||
struct i2c_adapter *ddc;
|
||||
int chno;
|
||||
void *edid;
|
||||
int edid_len;
|
||||
struct drm_display_mode mode;
|
||||
int mode_valid;
|
||||
u32 bus_format;
|
||||
@ -536,15 +535,14 @@ static int imx_ldb_panel_ddc(struct device *dev,
|
||||
}
|
||||
|
||||
if (!channel->ddc) {
|
||||
int edid_len;
|
||||
|
||||
/* if no DDC available, fallback to hardcoded EDID */
|
||||
dev_dbg(dev, "no ddc available\n");
|
||||
|
||||
edidp = of_get_property(child, "edid",
|
||||
&channel->edid_len);
|
||||
edidp = of_get_property(child, "edid", &edid_len);
|
||||
if (edidp) {
|
||||
channel->edid = kmemdup(edidp,
|
||||
channel->edid_len,
|
||||
GFP_KERNEL);
|
||||
channel->edid = kmemdup(edidp, edid_len, GFP_KERNEL);
|
||||
} else if (!channel->panel) {
|
||||
/* fallback to display-timings node */
|
||||
ret = of_get_drm_display_mode(child,
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
#include <video/imx-ipu-v3.h>
|
||||
@ -104,8 +103,6 @@ struct imx_tve {
|
||||
struct drm_connector connector;
|
||||
struct drm_encoder encoder;
|
||||
struct device *dev;
|
||||
spinlock_t lock; /* register lock */
|
||||
bool enabled;
|
||||
int mode;
|
||||
int di_hsync_pin;
|
||||
int di_vsync_pin;
|
||||
@ -129,30 +126,10 @@ static inline struct imx_tve *enc_to_tve(struct drm_encoder *e)
|
||||
return container_of(e, struct imx_tve, encoder);
|
||||
}
|
||||
|
||||
static void tve_lock(void *__tve)
|
||||
__acquires(&tve->lock)
|
||||
{
|
||||
struct imx_tve *tve = __tve;
|
||||
|
||||
spin_lock(&tve->lock);
|
||||
}
|
||||
|
||||
static void tve_unlock(void *__tve)
|
||||
__releases(&tve->lock)
|
||||
{
|
||||
struct imx_tve *tve = __tve;
|
||||
|
||||
spin_unlock(&tve->lock);
|
||||
}
|
||||
|
||||
static void tve_enable(struct imx_tve *tve)
|
||||
{
|
||||
if (!tve->enabled) {
|
||||
tve->enabled = true;
|
||||
clk_prepare_enable(tve->clk);
|
||||
regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
|
||||
TVE_EN, TVE_EN);
|
||||
}
|
||||
clk_prepare_enable(tve->clk);
|
||||
regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, TVE_EN, TVE_EN);
|
||||
|
||||
/* clear interrupt status register */
|
||||
regmap_write(tve->regmap, TVE_STAT_REG, 0xffffffff);
|
||||
@ -169,11 +146,8 @@ static void tve_enable(struct imx_tve *tve)
|
||||
|
||||
static void tve_disable(struct imx_tve *tve)
|
||||
{
|
||||
if (tve->enabled) {
|
||||
tve->enabled = false;
|
||||
regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, TVE_EN, 0);
|
||||
clk_disable_unprepare(tve->clk);
|
||||
}
|
||||
regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, TVE_EN, 0);
|
||||
clk_disable_unprepare(tve->clk);
|
||||
}
|
||||
|
||||
static int tve_setup_tvout(struct imx_tve *tve)
|
||||
@ -500,8 +474,7 @@ static struct regmap_config tve_regmap_config = {
|
||||
|
||||
.readable_reg = imx_tve_readable_reg,
|
||||
|
||||
.lock = tve_lock,
|
||||
.unlock = tve_unlock,
|
||||
.fast_io = true,
|
||||
|
||||
.max_register = 0xdc,
|
||||
};
|
||||
@ -511,7 +484,7 @@ static const char * const imx_tve_modes[] = {
|
||||
[TVE_MODE_VGA] = "vga",
|
||||
};
|
||||
|
||||
static const int of_get_tve_mode(struct device_node *np)
|
||||
static int of_get_tve_mode(struct device_node *np)
|
||||
{
|
||||
const char *bm;
|
||||
int ret, i;
|
||||
@ -544,7 +517,6 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
|
||||
memset(tve, 0, sizeof(*tve));
|
||||
|
||||
tve->dev = dev;
|
||||
spin_lock_init(&tve->lock);
|
||||
|
||||
ddc_node = of_parse_phandle(np, "ddc-i2c-bus", 0);
|
||||
if (ddc_node) {
|
||||
|
@ -28,7 +28,6 @@ struct imx_parallel_display {
|
||||
struct drm_bridge bridge;
|
||||
struct device *dev;
|
||||
void *edid;
|
||||
int edid_len;
|
||||
u32 bus_format;
|
||||
u32 bus_flags;
|
||||
struct drm_display_mode mode;
|
||||
@ -41,11 +40,6 @@ static inline struct imx_parallel_display *con_to_imxpd(struct drm_connector *c)
|
||||
return container_of(c, struct imx_parallel_display, connector);
|
||||
}
|
||||
|
||||
static inline struct imx_parallel_display *enc_to_imxpd(struct drm_encoder *e)
|
||||
{
|
||||
return container_of(e, struct imx_parallel_display, encoder);
|
||||
}
|
||||
|
||||
static inline struct imx_parallel_display *bridge_to_imxpd(struct drm_bridge *b)
|
||||
{
|
||||
return container_of(b, struct imx_parallel_display, bridge);
|
||||
@ -310,6 +304,7 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
|
||||
struct device_node *np = dev->of_node;
|
||||
const u8 *edidp;
|
||||
struct imx_parallel_display *imxpd;
|
||||
int edid_len;
|
||||
int ret;
|
||||
u32 bus_format = 0;
|
||||
const char *fmt;
|
||||
@ -323,9 +318,9 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
|
||||
if (ret && ret != -ENODEV)
|
||||
return ret;
|
||||
|
||||
edidp = of_get_property(np, "edid", &imxpd->edid_len);
|
||||
edidp = of_get_property(np, "edid", &edid_len);
|
||||
if (edidp)
|
||||
imxpd->edid = kmemdup(edidp, imxpd->edid_len, GFP_KERNEL);
|
||||
imxpd->edid = devm_kmemdup(dev, edidp, edid_len, GFP_KERNEL);
|
||||
|
||||
ret = of_property_read_string(np, "interface-pix-fmt", &fmt);
|
||||
if (!ret) {
|
||||
@ -349,17 +344,8 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void imx_pd_unbind(struct device *dev, struct device *master,
|
||||
void *data)
|
||||
{
|
||||
struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
|
||||
|
||||
kfree(imxpd->edid);
|
||||
}
|
||||
|
||||
static const struct component_ops imx_pd_ops = {
|
||||
.bind = imx_pd_bind,
|
||||
.unbind = imx_pd_unbind,
|
||||
};
|
||||
|
||||
static int imx_pd_probe(struct platform_device *pdev)
|
||||
|
@ -133,73 +133,6 @@ enum ipu_color_space ipu_pixelformat_to_colorspace(u32 pixelformat)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_pixelformat_to_colorspace);
|
||||
|
||||
bool ipu_pixelformat_is_planar(u32 pixelformat)
|
||||
{
|
||||
switch (pixelformat) {
|
||||
case V4L2_PIX_FMT_YUV420:
|
||||
case V4L2_PIX_FMT_YVU420:
|
||||
case V4L2_PIX_FMT_YUV422P:
|
||||
case V4L2_PIX_FMT_NV12:
|
||||
case V4L2_PIX_FMT_NV21:
|
||||
case V4L2_PIX_FMT_NV16:
|
||||
case V4L2_PIX_FMT_NV61:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_pixelformat_is_planar);
|
||||
|
||||
enum ipu_color_space ipu_mbus_code_to_colorspace(u32 mbus_code)
|
||||
{
|
||||
switch (mbus_code & 0xf000) {
|
||||
case 0x1000:
|
||||
return IPUV3_COLORSPACE_RGB;
|
||||
case 0x2000:
|
||||
return IPUV3_COLORSPACE_YUV;
|
||||
default:
|
||||
return IPUV3_COLORSPACE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_mbus_code_to_colorspace);
|
||||
|
||||
int ipu_stride_to_bytes(u32 pixel_stride, u32 pixelformat)
|
||||
{
|
||||
switch (pixelformat) {
|
||||
case V4L2_PIX_FMT_YUV420:
|
||||
case V4L2_PIX_FMT_YVU420:
|
||||
case V4L2_PIX_FMT_YUV422P:
|
||||
case V4L2_PIX_FMT_NV12:
|
||||
case V4L2_PIX_FMT_NV21:
|
||||
case V4L2_PIX_FMT_NV16:
|
||||
case V4L2_PIX_FMT_NV61:
|
||||
/*
|
||||
* for the planar YUV formats, the stride passed to
|
||||
* cpmem must be the stride in bytes of the Y plane.
|
||||
* And all the planar YUV formats have an 8-bit
|
||||
* Y component.
|
||||
*/
|
||||
return (8 * pixel_stride) >> 3;
|
||||
case V4L2_PIX_FMT_RGB565:
|
||||
case V4L2_PIX_FMT_YUYV:
|
||||
case V4L2_PIX_FMT_UYVY:
|
||||
return (16 * pixel_stride) >> 3;
|
||||
case V4L2_PIX_FMT_BGR24:
|
||||
case V4L2_PIX_FMT_RGB24:
|
||||
return (24 * pixel_stride) >> 3;
|
||||
case V4L2_PIX_FMT_BGR32:
|
||||
case V4L2_PIX_FMT_RGB32:
|
||||
case V4L2_PIX_FMT_XBGR32:
|
||||
case V4L2_PIX_FMT_XRGB32:
|
||||
return (32 * pixel_stride) >> 3;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_stride_to_bytes);
|
||||
|
||||
int ipu_degrees_to_rot_mode(enum ipu_rotate_mode *mode, int degrees,
|
||||
bool hflip, bool vflip)
|
||||
{
|
||||
|
@ -484,9 +484,6 @@ int ipu_smfc_set_watermark(struct ipu_smfc *smfc, u32 set_level, u32 clr_level);
|
||||
|
||||
enum ipu_color_space ipu_drm_fourcc_to_colorspace(u32 drm_fourcc);
|
||||
enum ipu_color_space ipu_pixelformat_to_colorspace(u32 pixelformat);
|
||||
enum ipu_color_space ipu_mbus_code_to_colorspace(u32 mbus_code);
|
||||
int ipu_stride_to_bytes(u32 pixel_stride, u32 pixelformat);
|
||||
bool ipu_pixelformat_is_planar(u32 pixelformat);
|
||||
int ipu_degrees_to_rot_mode(enum ipu_rotate_mode *mode, int degrees,
|
||||
bool hflip, bool vflip);
|
||||
int ipu_rot_mode_to_degrees(int *degrees, enum ipu_rotate_mode mode,
|
||||
|
Loading…
Reference in New Issue
Block a user