19021c317SLaurentiu Palcu /* SPDX-License-Identifier: GPL-2.0 */ 29021c317SLaurentiu Palcu /* 39021c317SLaurentiu Palcu * Copyright 2019 NXP. 49021c317SLaurentiu Palcu */ 59021c317SLaurentiu Palcu 69021c317SLaurentiu Palcu #ifndef __DCSS_PRV_H__ 79021c317SLaurentiu Palcu #define __DCSS_PRV_H__ 89021c317SLaurentiu Palcu 99021c317SLaurentiu Palcu #include <drm/drm_fourcc.h> 10*05faf155SLaurentiu Palcu #include <drm/drm_plane.h> 119021c317SLaurentiu Palcu #include <linux/io.h> 129021c317SLaurentiu Palcu #include <video/videomode.h> 139021c317SLaurentiu Palcu 149021c317SLaurentiu Palcu #define SET 0x04 159021c317SLaurentiu Palcu #define CLR 0x08 169021c317SLaurentiu Palcu #define TGL 0x0C 179021c317SLaurentiu Palcu 189021c317SLaurentiu Palcu #define dcss_writel(v, c) writel((v), (c)) 199021c317SLaurentiu Palcu #define dcss_readl(c) readl(c) 209021c317SLaurentiu Palcu #define dcss_set(v, c) writel((v), (c) + SET) 219021c317SLaurentiu Palcu #define dcss_clr(v, c) writel((v), (c) + CLR) 229021c317SLaurentiu Palcu #define dcss_toggle(v, c) writel((v), (c) + TGL) 239021c317SLaurentiu Palcu 249021c317SLaurentiu Palcu static inline void dcss_update(u32 v, u32 m, void __iomem *c) 259021c317SLaurentiu Palcu { 269021c317SLaurentiu Palcu writel((readl(c) & ~(m)) | (v), (c)); 279021c317SLaurentiu Palcu } 289021c317SLaurentiu Palcu 299021c317SLaurentiu Palcu #define DCSS_DBG_REG(reg) {.name = #reg, .ofs = reg} 309021c317SLaurentiu Palcu 319021c317SLaurentiu Palcu enum { 329021c317SLaurentiu Palcu DCSS_IMX8MQ = 0, 339021c317SLaurentiu Palcu }; 349021c317SLaurentiu Palcu 359021c317SLaurentiu Palcu struct dcss_type_data { 369021c317SLaurentiu Palcu const char *name; 379021c317SLaurentiu Palcu u32 blkctl_ofs; 389021c317SLaurentiu Palcu u32 ctxld_ofs; 399021c317SLaurentiu Palcu u32 rdsrc_ofs; 409021c317SLaurentiu Palcu u32 wrscl_ofs; 419021c317SLaurentiu Palcu u32 dtg_ofs; 429021c317SLaurentiu Palcu u32 scaler_ofs; 439021c317SLaurentiu Palcu u32 ss_ofs; 449021c317SLaurentiu Palcu u32 dpr_ofs; 459021c317SLaurentiu Palcu u32 dtrc_ofs; 469021c317SLaurentiu Palcu u32 dec400d_ofs; 479021c317SLaurentiu Palcu u32 hdr10_ofs; 489021c317SLaurentiu Palcu }; 499021c317SLaurentiu Palcu 509021c317SLaurentiu Palcu struct dcss_debug_reg { 519021c317SLaurentiu Palcu char *name; 529021c317SLaurentiu Palcu u32 ofs; 539021c317SLaurentiu Palcu }; 549021c317SLaurentiu Palcu 559021c317SLaurentiu Palcu enum dcss_ctxld_ctx_type { 569021c317SLaurentiu Palcu CTX_DB, 579021c317SLaurentiu Palcu CTX_SB_HP, /* high-priority */ 589021c317SLaurentiu Palcu CTX_SB_LP, /* low-priority */ 599021c317SLaurentiu Palcu }; 609021c317SLaurentiu Palcu 619021c317SLaurentiu Palcu struct dcss_dev { 629021c317SLaurentiu Palcu struct device *dev; 639021c317SLaurentiu Palcu const struct dcss_type_data *devtype; 649021c317SLaurentiu Palcu struct device_node *of_port; 659021c317SLaurentiu Palcu 669021c317SLaurentiu Palcu u32 start_addr; 679021c317SLaurentiu Palcu 689021c317SLaurentiu Palcu struct dcss_blkctl *blkctl; 699021c317SLaurentiu Palcu struct dcss_ctxld *ctxld; 709021c317SLaurentiu Palcu struct dcss_dpr *dpr; 719021c317SLaurentiu Palcu struct dcss_dtg *dtg; 729021c317SLaurentiu Palcu struct dcss_ss *ss; 739021c317SLaurentiu Palcu struct dcss_hdr10 *hdr10; 749021c317SLaurentiu Palcu struct dcss_scaler *scaler; 759021c317SLaurentiu Palcu struct dcss_dtrc *dtrc; 769021c317SLaurentiu Palcu struct dcss_dec400d *dec400d; 779021c317SLaurentiu Palcu struct dcss_wrscl *wrscl; 789021c317SLaurentiu Palcu struct dcss_rdsrc *rdsrc; 799021c317SLaurentiu Palcu 809021c317SLaurentiu Palcu struct clk *apb_clk; 819021c317SLaurentiu Palcu struct clk *axi_clk; 829021c317SLaurentiu Palcu struct clk *pix_clk; 839021c317SLaurentiu Palcu struct clk *rtrm_clk; 849021c317SLaurentiu Palcu struct clk *dtrc_clk; 859021c317SLaurentiu Palcu struct clk *pll_src_clk; 869021c317SLaurentiu Palcu struct clk *pll_phy_ref_clk; 879021c317SLaurentiu Palcu 889021c317SLaurentiu Palcu bool hdmi_output; 899021c317SLaurentiu Palcu 909021c317SLaurentiu Palcu void (*disable_callback)(void *data); 919021c317SLaurentiu Palcu struct completion disable_completion; 929021c317SLaurentiu Palcu }; 939021c317SLaurentiu Palcu 949021c317SLaurentiu Palcu struct dcss_dev *dcss_drv_dev_to_dcss(struct device *dev); 959021c317SLaurentiu Palcu struct drm_device *dcss_drv_dev_to_drm(struct device *dev); 969021c317SLaurentiu Palcu struct dcss_dev *dcss_dev_create(struct device *dev, bool hdmi_output); 979021c317SLaurentiu Palcu void dcss_dev_destroy(struct dcss_dev *dcss); 989021c317SLaurentiu Palcu int dcss_dev_runtime_suspend(struct device *dev); 999021c317SLaurentiu Palcu int dcss_dev_runtime_resume(struct device *dev); 1009021c317SLaurentiu Palcu int dcss_dev_suspend(struct device *dev); 1019021c317SLaurentiu Palcu int dcss_dev_resume(struct device *dev); 1029021c317SLaurentiu Palcu void dcss_enable_dtg_and_ss(struct dcss_dev *dcss); 1039021c317SLaurentiu Palcu void dcss_disable_dtg_and_ss(struct dcss_dev *dcss); 1049021c317SLaurentiu Palcu 1059021c317SLaurentiu Palcu /* BLKCTL */ 1069021c317SLaurentiu Palcu int dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base); 1079021c317SLaurentiu Palcu void dcss_blkctl_cfg(struct dcss_blkctl *blkctl); 1089021c317SLaurentiu Palcu void dcss_blkctl_exit(struct dcss_blkctl *blkctl); 1099021c317SLaurentiu Palcu 1109021c317SLaurentiu Palcu /* CTXLD */ 1119021c317SLaurentiu Palcu int dcss_ctxld_init(struct dcss_dev *dcss, unsigned long ctxld_base); 1129021c317SLaurentiu Palcu void dcss_ctxld_exit(struct dcss_ctxld *ctxld); 1139021c317SLaurentiu Palcu void dcss_ctxld_write(struct dcss_ctxld *ctxld, u32 ctx_id, 1149021c317SLaurentiu Palcu u32 val, u32 reg_idx); 1159021c317SLaurentiu Palcu int dcss_ctxld_resume(struct dcss_ctxld *dcss_ctxld); 1169021c317SLaurentiu Palcu int dcss_ctxld_suspend(struct dcss_ctxld *dcss_ctxld); 1179021c317SLaurentiu Palcu void dcss_ctxld_write_irqsafe(struct dcss_ctxld *ctlxd, u32 ctx_id, u32 val, 1189021c317SLaurentiu Palcu u32 reg_ofs); 1199021c317SLaurentiu Palcu void dcss_ctxld_kick(struct dcss_ctxld *ctxld); 1209021c317SLaurentiu Palcu bool dcss_ctxld_is_flushed(struct dcss_ctxld *ctxld); 1219021c317SLaurentiu Palcu int dcss_ctxld_enable(struct dcss_ctxld *ctxld); 1229021c317SLaurentiu Palcu void dcss_ctxld_register_completion(struct dcss_ctxld *ctxld, 1239021c317SLaurentiu Palcu struct completion *dis_completion); 1249021c317SLaurentiu Palcu void dcss_ctxld_assert_locked(struct dcss_ctxld *ctxld); 1259021c317SLaurentiu Palcu 1269021c317SLaurentiu Palcu /* DPR */ 1279021c317SLaurentiu Palcu int dcss_dpr_init(struct dcss_dev *dcss, unsigned long dpr_base); 1289021c317SLaurentiu Palcu void dcss_dpr_exit(struct dcss_dpr *dpr); 1299021c317SLaurentiu Palcu void dcss_dpr_write_sysctrl(struct dcss_dpr *dpr); 1309021c317SLaurentiu Palcu void dcss_dpr_set_res(struct dcss_dpr *dpr, int ch_num, u32 xres, u32 yres); 1319021c317SLaurentiu Palcu void dcss_dpr_addr_set(struct dcss_dpr *dpr, int ch_num, u32 luma_base_addr, 1329021c317SLaurentiu Palcu u32 chroma_base_addr, u16 pitch); 1339021c317SLaurentiu Palcu void dcss_dpr_enable(struct dcss_dpr *dpr, int ch_num, bool en); 1349021c317SLaurentiu Palcu void dcss_dpr_format_set(struct dcss_dpr *dpr, int ch_num, 1359021c317SLaurentiu Palcu const struct drm_format_info *format, u64 modifier); 1369021c317SLaurentiu Palcu void dcss_dpr_set_rotation(struct dcss_dpr *dpr, int ch_num, u32 rotation); 1379021c317SLaurentiu Palcu 1389021c317SLaurentiu Palcu /* DTG */ 1399021c317SLaurentiu Palcu int dcss_dtg_init(struct dcss_dev *dcss, unsigned long dtg_base); 1409021c317SLaurentiu Palcu void dcss_dtg_exit(struct dcss_dtg *dtg); 1419021c317SLaurentiu Palcu bool dcss_dtg_vblank_irq_valid(struct dcss_dtg *dtg); 1429021c317SLaurentiu Palcu void dcss_dtg_vblank_irq_enable(struct dcss_dtg *dtg, bool en); 1439021c317SLaurentiu Palcu void dcss_dtg_vblank_irq_clear(struct dcss_dtg *dtg); 1449021c317SLaurentiu Palcu void dcss_dtg_sync_set(struct dcss_dtg *dtg, struct videomode *vm); 1459021c317SLaurentiu Palcu void dcss_dtg_css_set(struct dcss_dtg *dtg); 1469021c317SLaurentiu Palcu void dcss_dtg_enable(struct dcss_dtg *dtg); 1479021c317SLaurentiu Palcu void dcss_dtg_shutoff(struct dcss_dtg *dtg); 1489021c317SLaurentiu Palcu bool dcss_dtg_is_enabled(struct dcss_dtg *dtg); 1499021c317SLaurentiu Palcu void dcss_dtg_ctxld_kick_irq_enable(struct dcss_dtg *dtg, bool en); 1509021c317SLaurentiu Palcu bool dcss_dtg_global_alpha_changed(struct dcss_dtg *dtg, int ch_num, int alpha); 1519021c317SLaurentiu Palcu void dcss_dtg_plane_alpha_set(struct dcss_dtg *dtg, int ch_num, 1529021c317SLaurentiu Palcu const struct drm_format_info *format, int alpha); 1539021c317SLaurentiu Palcu void dcss_dtg_plane_pos_set(struct dcss_dtg *dtg, int ch_num, 1549021c317SLaurentiu Palcu int px, int py, int pw, int ph); 1559021c317SLaurentiu Palcu void dcss_dtg_ch_enable(struct dcss_dtg *dtg, int ch_num, bool en); 1569021c317SLaurentiu Palcu 1579021c317SLaurentiu Palcu /* SUBSAM */ 1589021c317SLaurentiu Palcu int dcss_ss_init(struct dcss_dev *dcss, unsigned long subsam_base); 1599021c317SLaurentiu Palcu void dcss_ss_exit(struct dcss_ss *ss); 1609021c317SLaurentiu Palcu void dcss_ss_enable(struct dcss_ss *ss); 1619021c317SLaurentiu Palcu void dcss_ss_shutoff(struct dcss_ss *ss); 1629021c317SLaurentiu Palcu void dcss_ss_subsam_set(struct dcss_ss *ss); 1639021c317SLaurentiu Palcu void dcss_ss_sync_set(struct dcss_ss *ss, struct videomode *vm, 1649021c317SLaurentiu Palcu bool phsync, bool pvsync); 1659021c317SLaurentiu Palcu 1669021c317SLaurentiu Palcu /* SCALER */ 1679021c317SLaurentiu Palcu int dcss_scaler_init(struct dcss_dev *dcss, unsigned long scaler_base); 1689021c317SLaurentiu Palcu void dcss_scaler_exit(struct dcss_scaler *scl); 169*05faf155SLaurentiu Palcu void dcss_scaler_set_filter(struct dcss_scaler *scl, int ch_num, 170*05faf155SLaurentiu Palcu enum drm_scaling_filter scaling_filter); 1719021c317SLaurentiu Palcu void dcss_scaler_setup(struct dcss_scaler *scl, int ch_num, 1729021c317SLaurentiu Palcu const struct drm_format_info *format, 1739021c317SLaurentiu Palcu int src_xres, int src_yres, int dst_xres, int dst_yres, 1749021c317SLaurentiu Palcu u32 vrefresh_hz); 1759021c317SLaurentiu Palcu void dcss_scaler_ch_enable(struct dcss_scaler *scl, int ch_num, bool en); 1769021c317SLaurentiu Palcu int dcss_scaler_get_min_max_ratios(struct dcss_scaler *scl, int ch_num, 1779021c317SLaurentiu Palcu int *min, int *max); 1789021c317SLaurentiu Palcu void dcss_scaler_write_sclctrl(struct dcss_scaler *scl); 1799021c317SLaurentiu Palcu 1809021c317SLaurentiu Palcu #endif /* __DCSS_PRV_H__ */ 181