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