1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2019 NXP. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/device.h> 7*4882a593Smuzhiyun #include <linux/of.h> 8*4882a593Smuzhiyun #include <linux/slab.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "dcss-dev.h" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define DCSS_BLKCTL_RESET_CTRL 0x00 13*4882a593Smuzhiyun #define B_CLK_RESETN BIT(0) 14*4882a593Smuzhiyun #define APB_CLK_RESETN BIT(1) 15*4882a593Smuzhiyun #define P_CLK_RESETN BIT(2) 16*4882a593Smuzhiyun #define RTR_CLK_RESETN BIT(4) 17*4882a593Smuzhiyun #define DCSS_BLKCTL_CONTROL0 0x10 18*4882a593Smuzhiyun #define HDMI_MIPI_CLK_SEL BIT(0) 19*4882a593Smuzhiyun #define DISPMIX_REFCLK_SEL_POS 4 20*4882a593Smuzhiyun #define DISPMIX_REFCLK_SEL_MASK GENMASK(5, 4) 21*4882a593Smuzhiyun #define DISPMIX_PIXCLK_SEL BIT(8) 22*4882a593Smuzhiyun #define HDMI_SRC_SECURE_EN BIT(16) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct dcss_blkctl { 25*4882a593Smuzhiyun struct dcss_dev *dcss; 26*4882a593Smuzhiyun void __iomem *base_reg; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun dcss_blkctl_cfg(struct dcss_blkctl * blkctl)29*4882a593Smuzhiyunvoid dcss_blkctl_cfg(struct dcss_blkctl *blkctl) 30*4882a593Smuzhiyun { 31*4882a593Smuzhiyun if (blkctl->dcss->hdmi_output) 32*4882a593Smuzhiyun dcss_writel(0, blkctl->base_reg + DCSS_BLKCTL_CONTROL0); 33*4882a593Smuzhiyun else 34*4882a593Smuzhiyun dcss_writel(DISPMIX_PIXCLK_SEL, 35*4882a593Smuzhiyun blkctl->base_reg + DCSS_BLKCTL_CONTROL0); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun dcss_set(B_CLK_RESETN | APB_CLK_RESETN | P_CLK_RESETN | RTR_CLK_RESETN, 38*4882a593Smuzhiyun blkctl->base_reg + DCSS_BLKCTL_RESET_CTRL); 39*4882a593Smuzhiyun } 40*4882a593Smuzhiyun dcss_blkctl_init(struct dcss_dev * dcss,unsigned long blkctl_base)41*4882a593Smuzhiyunint dcss_blkctl_init(struct dcss_dev *dcss, unsigned long blkctl_base) 42*4882a593Smuzhiyun { 43*4882a593Smuzhiyun struct dcss_blkctl *blkctl; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun blkctl = kzalloc(sizeof(*blkctl), GFP_KERNEL); 46*4882a593Smuzhiyun if (!blkctl) 47*4882a593Smuzhiyun return -ENOMEM; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun blkctl->base_reg = ioremap(blkctl_base, SZ_4K); 50*4882a593Smuzhiyun if (!blkctl->base_reg) { 51*4882a593Smuzhiyun dev_err(dcss->dev, "unable to remap BLK CTRL base\n"); 52*4882a593Smuzhiyun kfree(blkctl); 53*4882a593Smuzhiyun return -ENOMEM; 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun dcss->blkctl = blkctl; 57*4882a593Smuzhiyun blkctl->dcss = dcss; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun dcss_blkctl_cfg(blkctl); 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun return 0; 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun dcss_blkctl_exit(struct dcss_blkctl * blkctl)64*4882a593Smuzhiyunvoid dcss_blkctl_exit(struct dcss_blkctl *blkctl) 65*4882a593Smuzhiyun { 66*4882a593Smuzhiyun if (blkctl->base_reg) 67*4882a593Smuzhiyun iounmap(blkctl->base_reg); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun kfree(blkctl); 70*4882a593Smuzhiyun } 71