xref: /openbmc/linux/drivers/gpu/drm/imx/dcss/dcss-blkctl.c (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
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 Palcu void 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 Palcu int 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 Palcu void 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