162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * Copyright © 2018-2020 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __KMB_DRV_H__
762306a36Sopenharmony_ci#define __KMB_DRV_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <drm/drm_device.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "kmb_plane.h"
1262306a36Sopenharmony_ci#include "kmb_regs.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define KMB_MAX_WIDTH			1920 /*Max width in pixels */
1562306a36Sopenharmony_ci#define KMB_MAX_HEIGHT			1080 /*Max height in pixels */
1662306a36Sopenharmony_ci#define KMB_MIN_WIDTH                   1920 /*Max width in pixels */
1762306a36Sopenharmony_ci#define KMB_MIN_HEIGHT                  1080 /*Max height in pixels */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define DRIVER_DATE			"20210223"
2062306a36Sopenharmony_ci#define DRIVER_MAJOR			1
2162306a36Sopenharmony_ci#define DRIVER_MINOR			1
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* Platform definitions */
2462306a36Sopenharmony_ci#define KMB_CRTC_MIN_VFP		4
2562306a36Sopenharmony_ci#define KMB_CRTC_MAX_WIDTH		1920 /* max width in pixels */
2662306a36Sopenharmony_ci#define KMB_CRTC_MAX_HEIGHT		1080 /* max height in pixels */
2762306a36Sopenharmony_ci#define KMB_CRTC_MIN_WIDTH		1920
2862306a36Sopenharmony_ci#define KMB_CRTC_MIN_HEIGHT		1080
2962306a36Sopenharmony_ci#define KMB_FB_MAX_WIDTH		1920
3062306a36Sopenharmony_ci#define KMB_FB_MAX_HEIGHT		1080
3162306a36Sopenharmony_ci#define KMB_FB_MIN_WIDTH		1
3262306a36Sopenharmony_ci#define KMB_FB_MIN_HEIGHT		1
3362306a36Sopenharmony_ci#define KMB_MIN_VREFRESH		59    /*vertical refresh in Hz */
3462306a36Sopenharmony_ci#define KMB_MAX_VREFRESH		60    /*vertical refresh in Hz */
3562306a36Sopenharmony_ci#define KMB_LCD_DEFAULT_CLK		200000000
3662306a36Sopenharmony_ci#define KMB_SYS_CLK_MHZ			500
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define ICAM_MMIO		0x3b100000
3962306a36Sopenharmony_ci#define ICAM_LCD_OFFSET		0x1080
4062306a36Sopenharmony_ci#define ICAM_MMIO_SIZE		0x2000
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct kmb_dsi;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct kmb_clock {
4562306a36Sopenharmony_ci	struct clk *clk_lcd;
4662306a36Sopenharmony_ci	struct clk *clk_pll0;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct kmb_drm_private {
5062306a36Sopenharmony_ci	struct drm_device		drm;
5162306a36Sopenharmony_ci	struct kmb_dsi			*kmb_dsi;
5262306a36Sopenharmony_ci	void __iomem			*lcd_mmio;
5362306a36Sopenharmony_ci	struct kmb_clock		kmb_clk;
5462306a36Sopenharmony_ci	struct drm_crtc			crtc;
5562306a36Sopenharmony_ci	struct kmb_plane		*plane;
5662306a36Sopenharmony_ci	struct drm_atomic_state		*state;
5762306a36Sopenharmony_ci	spinlock_t			irq_lock;
5862306a36Sopenharmony_ci	int				irq_lcd;
5962306a36Sopenharmony_ci	int				sys_clk_mhz;
6062306a36Sopenharmony_ci	struct disp_cfg			init_disp_cfg[KMB_MAX_PLANES];
6162306a36Sopenharmony_ci	struct layer_status		plane_status[KMB_MAX_PLANES];
6262306a36Sopenharmony_ci	int				kmb_under_flow;
6362306a36Sopenharmony_ci	int				kmb_flush_done;
6462306a36Sopenharmony_ci	int				layer_no;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline struct kmb_drm_private *to_kmb(const struct drm_device *dev)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	return container_of(dev, struct kmb_drm_private, drm);
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline struct kmb_drm_private *crtc_to_kmb_priv(const struct drm_crtc *x)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	return container_of(x, struct kmb_drm_private, crtc);
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic inline void kmb_write_lcd(struct kmb_drm_private *dev_p,
7862306a36Sopenharmony_ci				 unsigned int reg, u32 value)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	writel(value, (dev_p->lcd_mmio + reg));
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic inline u32 kmb_read_lcd(struct kmb_drm_private *dev_p, unsigned int reg)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	return readl(dev_p->lcd_mmio + reg);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline void kmb_set_bitmask_lcd(struct kmb_drm_private *dev_p,
8962306a36Sopenharmony_ci				       unsigned int reg, u32 mask)
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	u32 reg_val = kmb_read_lcd(dev_p, reg);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	kmb_write_lcd(dev_p, reg, (reg_val | mask));
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic inline void kmb_clr_bitmask_lcd(struct kmb_drm_private *dev_p,
9762306a36Sopenharmony_ci				       unsigned int reg, u32 mask)
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	u32 reg_val = kmb_read_lcd(dev_p, reg);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	kmb_write_lcd(dev_p, reg, (reg_val & (~mask)));
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciint kmb_setup_crtc(struct drm_device *dev);
10562306a36Sopenharmony_civoid kmb_set_scanout(struct kmb_drm_private *lcd);
10662306a36Sopenharmony_ci#endif /* __KMB_DRV_H__ */
107