162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2012 Russell King
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef ARMADA_DRM_H
662306a36Sopenharmony_ci#define ARMADA_DRM_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/kfifo.h>
962306a36Sopenharmony_ci#include <linux/io.h>
1062306a36Sopenharmony_ci#include <linux/workqueue.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <drm/drm_device.h>
1362306a36Sopenharmony_ci#include <drm/drm_mm.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct armada_crtc;
1662306a36Sopenharmony_cistruct armada_gem_object;
1762306a36Sopenharmony_cistruct clk;
1862306a36Sopenharmony_cistruct drm_display_mode;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic inline void
2162306a36Sopenharmony_ciarmada_updatel(uint32_t val, uint32_t mask, void __iomem *ptr)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	uint32_t ov, v;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	ov = v = readl_relaxed(ptr);
2662306a36Sopenharmony_ci	v = (v & ~mask) | val;
2762306a36Sopenharmony_ci	if (ov != v)
2862306a36Sopenharmony_ci		writel_relaxed(v, ptr);
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic inline uint32_t armada_pitch(uint32_t width, uint32_t bpp)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	uint32_t pitch = bpp != 4 ? width * ((bpp + 7) / 8) : width / 2;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/* 88AP510 spec recommends pitch be a multiple of 128 */
3662306a36Sopenharmony_ci	return ALIGN(pitch, 128);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct armada_private;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct armada_variant {
4362306a36Sopenharmony_ci	bool has_spu_adv_reg;
4462306a36Sopenharmony_ci	int (*init)(struct armada_crtc *, struct device *);
4562306a36Sopenharmony_ci	int (*compute_clock)(struct armada_crtc *,
4662306a36Sopenharmony_ci			     const struct drm_display_mode *,
4762306a36Sopenharmony_ci			     uint32_t *);
4862306a36Sopenharmony_ci	void (*disable)(struct armada_crtc *);
4962306a36Sopenharmony_ci	void (*enable)(struct armada_crtc *, const struct drm_display_mode *);
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* Variant ops */
5362306a36Sopenharmony_ciextern const struct armada_variant armada510_ops;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct armada_private {
5662306a36Sopenharmony_ci	struct drm_device	drm;
5762306a36Sopenharmony_ci	struct armada_crtc	*dcrtc[2];
5862306a36Sopenharmony_ci	struct drm_mm		linear; /* protected by linear_lock */
5962306a36Sopenharmony_ci	struct mutex		linear_lock;
6062306a36Sopenharmony_ci	struct drm_property	*colorkey_prop;
6162306a36Sopenharmony_ci	struct drm_property	*colorkey_min_prop;
6262306a36Sopenharmony_ci	struct drm_property	*colorkey_max_prop;
6362306a36Sopenharmony_ci	struct drm_property	*colorkey_val_prop;
6462306a36Sopenharmony_ci	struct drm_property	*colorkey_alpha_prop;
6562306a36Sopenharmony_ci	struct drm_property	*colorkey_mode_prop;
6662306a36Sopenharmony_ci	struct drm_property	*brightness_prop;
6762306a36Sopenharmony_ci	struct drm_property	*contrast_prop;
6862306a36Sopenharmony_ci	struct drm_property	*saturation_prop;
6962306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
7062306a36Sopenharmony_ci	struct dentry		*de;
7162306a36Sopenharmony_ci#endif
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define drm_to_armada_dev(dev) container_of(dev, struct armada_private, drm)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#if defined(CONFIG_DRM_FBDEV_EMULATION)
7762306a36Sopenharmony_civoid armada_fbdev_setup(struct drm_device *dev);
7862306a36Sopenharmony_ci#else
7962306a36Sopenharmony_cistatic inline void armada_fbdev_setup(struct drm_device *dev)
8062306a36Sopenharmony_ci{ }
8162306a36Sopenharmony_ci#endif
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciint armada_overlay_plane_create(struct drm_device *, unsigned long);
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_civoid armada_drm_crtc_debugfs_init(struct armada_crtc *dcrtc);
8662306a36Sopenharmony_ciint armada_drm_debugfs_init(struct drm_minor *);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#endif
89