// SPDX-License-Identifier: GPL-2.0 /* * Copyright 2019 NXP. */ #include <linux/device.h> #include <linux/of.h> #include <linux/slab.h> #include "dcss-dev.h" #define DCSS_BLKCTL_RESET_CTRL 0x00 #define B_CLK_RESETN BIT(0) #define APB_CLK_RESETN BIT(1) #define P_CLK_RESETN BIT(2) #define RTR_CLK_RESETN BIT(4) #define DCSS_BLKCTL_CONTROL0 0x10 #define HDMI_MIPI_CLK_SEL BIT(0) #define DISPMIX_REFCLK_SEL_POS 4 #define DISPMIX_REFCLK_SEL_MASK GENMASK(5, 4) #define DISPMIX_PIXCLK_SEL BIT(8) #define HDMI_SRC_SECURE_EN BIT(16) struct dcss_blkctl { struct dcss_dev *dcss; void __iomem *base_reg; }; void dcss_blkctl_cfg(struct dcss_blkctl *blkctl) { if (blkctl->dcss->hdmi_output) dcss_writel(0, blkctl->base_reg + DCSS_BLKCTL_CONTROL0); else dcss_writel(DISPMIX_PIXCLK_SEL, blkctl->base_reg + DCSS_BLKCTL_CONTROL0); dcss_set(B_CLK_RESETN | APB_CLK_RESETN | P_CLK_RESETN | RTR_CLK_RESETN, blkctl->base_reg + DCSS_BLKCTL_RESET_CTRL); } int dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base) { struct dcss_blkctl *blkctl; blkctl = kzalloc(sizeof(*blkctl), GFP_KERNEL); if (!blkctl) return -ENOMEM; blkctl->base_reg = ioremap(blkctl_base, SZ_4K); if (!blkctl->base_reg) { dev_err(dcss->dev, "unable to remap BLK CTRL base\n"); kfree(blkctl); return -ENOMEM; } dcss->blkctl = blkctl; blkctl->dcss = dcss; dcss_blkctl_cfg(blkctl); return 0; } void dcss_blkctl_exit(struct dcss_blkctl *blkctl) { if (blkctl->base_reg) iounmap(blkctl->base_reg); kfree(blkctl); }