1 #include <linux/kernel.h>
2 #include <linux/delay.h>
3 #include <linux/module.h>
4 #include <linux/platform_device.h>
5 #include <linux/interrupt.h>
7 #include <linux/of_gpio.h>
8 #include <linux/rockchip/cpu.h>
9 #include <linux/rockchip/grf.h>
10 #include <linux/rockchip/iomap.h>
11 #include <linux/mfd/syscon.h>
12 #if defined(CONFIG_DEBUG_FS)
13 #include <linux/uaccess.h>
15 #include <linux/debugfs.h>
16 #include <linux/seq_file.h>
19 #include "rockchip_hdmiv2.h"
20 #include "rockchip_hdmiv2_hw.h"
22 #define HDMI_SEL_LCDC(x) ((((x)&1)<<4)|(1<<20))
23 #define grf_writel(v, offset) writel_relaxed(v, RK_GRF_VIRT + offset)
25 static struct hdmi_dev *hdmi_dev;
27 static struct hdmi_property rk_hdmi_property = {
28 .videosrc = DISPLAY_SOURCE_LCDC0,
29 .display = DISPLAY_MAIN,
32 #if defined(CONFIG_DEBUG_FS)
33 static const struct rockchip_hdmiv2_reg_table hdmi_reg_table[] = {
34 {IDENTIFICATION_BASE, CONFIG3_ID},
35 {INTERRUPT_BASE, IH_MUTE},
36 {VIDEO_SAMPLER_BASE, TX_BCBDATA1},
37 {VIDEO_PACKETIZER_BASE, VP_MASK},
38 {FRAME_COMPOSER_BASE, FC_DBGTMDS2},
39 {HDMI_SOURCE_PHY_BASE, PHY_PLLCFGFREQ2},
40 {I2C_MASTER_PHY_BASE, PHY_I2CM_SDA_HOLD},
41 {AUDIO_SAMPLER_BASE, AHB_DMA_STPADDR_SET1_0},
42 {MAIN_CONTROLLER_BASE, MC_SWRSTZREQ_2},
43 {COLOR_SPACE_CONVERTER_BASE, CSC_SPARE_2},
44 {HDCP_ENCRYPTION_ENGINE_BASE, HDCP_REVOC_LIST},
45 {HDCP_BKSV_BASE, HDCPREG_BKSV4},
46 {HDCP_AN_BASE, HDCPREG_AN7},
47 {HDCP2REG_BASE, HDCP2REG_MUTE},
48 {ENCRYPTED_DPK_EMBEDDED_BASE, HDCPREG_DPK6},
49 {CEC_ENGINE_BASE, CEC_WKUPCTRL},
50 {I2C_MASTER_BASE, I2CM_SCDC_UPDATE1},
53 static int hdmi_regs_ctrl_show(struct seq_file *s, void *v)
55 u32 i = 0, j = 0, val = 0;
57 seq_puts(s, "\n>>>hdmi_ctl reg ");
58 for (i = 0; i < 16; i++)
59 seq_printf(s, " %2x", i);
60 seq_puts(s, "\n-----------------------------------------------------------------");
62 for (i = 0; i < ARRAY_SIZE(hdmi_reg_table); i++) {
63 for (j = hdmi_reg_table[i].reg_base;
64 j <= hdmi_reg_table[i].reg_end; j++) {
65 val = hdmi_readl(hdmi_dev, j);
66 if ((j - hdmi_reg_table[i].reg_base)%16 == 0)
67 seq_printf(s, "\n>>>hdmi_ctl %04x:", j);
68 seq_printf(s, " %02x", val);
71 seq_puts(s, "\n-----------------------------------------------------------------\n");
76 static ssize_t hdmi_regs_ctrl_write(struct file *file,
77 const char __user *buf,
78 size_t count, loff_t *ppos)
83 if (copy_from_user(kbuf, buf, count))
85 if (sscanf(kbuf, "%x%x", ®, &val) == -1)
87 if ((reg < 0) || (reg > I2CM_SCDC_UPDATE1)) {
88 dev_info(hdmi_dev->hdmi->dev, "it is no hdmi reg\n");
91 dev_info(hdmi_dev->hdmi->dev,
92 "/**********hdmi reg config******/");
93 dev_info(hdmi_dev->hdmi->dev, "\n reg=%x val=%x\n", reg, val);
94 hdmi_writel(hdmi_dev, reg, val);
99 static int hdmi_regs_phy_show(struct seq_file *s, void *v)
103 if (hdmi_dev->soctype == HDMI_SOC_RK322X)
107 seq_puts(s, "\n>>>hdmi_phy reg ");
108 for (i = 0; i < count; i++)
109 seq_printf(s, "regs %02x val %04x\n",
110 i, rockchip_hdmiv2_read_phy(hdmi_dev, i));
114 static ssize_t hdmi_regs_phy_write(struct file *file,
115 const char __user *buf,
116 size_t count, loff_t *ppos)
121 if (copy_from_user(kbuf, buf, count))
123 if (sscanf(kbuf, "%x%x", ®, &val) == -1)
125 dev_info(hdmi_dev->hdmi->dev,
126 "/**********hdmi reg phy config******/");
127 dev_info(hdmi_dev->hdmi->dev, "\n reg=%x val=%x\n", reg, val);
128 rockchip_hdmiv2_write_phy(hdmi_dev, reg, val);
132 #define HDMI_DEBUG_ENTRY(name) \
133 static int hdmi_##name##_open(struct inode *inode, struct file *file) \
135 return single_open(file, hdmi_##name##_show, inode->i_private); \
138 static const struct file_operations hdmi_##name##_fops = { \
139 .owner = THIS_MODULE, \
140 .open = hdmi_##name##_open, \
142 .write = hdmi_##name##_write, \
143 .llseek = seq_lseek, \
144 .release = single_release, \
147 HDMI_DEBUG_ENTRY(regs_phy);
148 HDMI_DEBUG_ENTRY(regs_ctrl);
151 #ifdef CONFIG_HAS_EARLYSUSPEND
152 static void rockchip_hdmiv2_early_suspend(struct early_suspend *h)
154 struct hdmi *hdmi = hdmi_dev->hdmi;
155 struct pinctrl_state *gpio_state;
157 HDMIDBG("hdmi enter early suspend\n");
158 hdmi_submit_work(hdmi, HDMI_SUSPEND_CTL, 0, 1);
159 /* iomux to gpio and pull down when suspend */
160 gpio_state = pinctrl_lookup_state(hdmi_dev->dev->pins->p, "gpio");
161 pinctrl_select_state(hdmi_dev->dev->pins->p, gpio_state);
162 rockchip_hdmiv2_clk_disable(hdmi_dev);
165 static void rockchip_hdmiv2_early_resume(struct early_suspend *h)
167 struct hdmi *hdmi = hdmi_dev->hdmi;
169 HDMIDBG("hdmi exit early resume\n");
170 /* iomux to default state for hdmi use when resume */
171 pinctrl_select_state(hdmi_dev->dev->pins->p,
172 hdmi_dev->dev->pins->default_state);
173 rockchip_hdmiv2_clk_enable(hdmi_dev);
174 hdmi_dev_initial(hdmi_dev);
175 if (hdmi->ops->hdcp_power_on_cb)
176 hdmi->ops->hdcp_power_on_cb();
177 hdmi_submit_work(hdmi, HDMI_RESUME_CTL, 0, 0);
181 void ext_pll_set_27m_out(void)
183 if (!hdmi_dev || hdmi_dev->soctype != HDMI_SOC_RK322X)
185 /* PHY PLL VCO is 1080MHz, output pclk is 27MHz */
186 rockchip_hdmiv2_write_phy(hdmi_dev,
187 EXT_PHY_PLL_PRE_DIVIDER,
189 rockchip_hdmiv2_write_phy(hdmi_dev,
190 EXT_PHY_PLL_FB_DIVIDER,
192 rockchip_hdmiv2_write_phy(hdmi_dev,
193 EXT_PHY_PCLK_DIVIDER1,
195 rockchip_hdmiv2_write_phy(hdmi_dev,
196 EXT_PHY_PCLK_DIVIDER2,
198 rockchip_hdmiv2_write_phy(hdmi_dev,
199 EXT_PHY_TMDSCLK_DIVIDER,
203 #define HDMI_PD_ON (1 << 0)
204 #define HDMI_PCLK_ON (1 << 1)
205 #define HDMI_HDCPCLK_ON (1 << 2)
206 #define HDMI_CECCLK_ON (1 << 3)
207 #define HDMI_EXT_PHY_CLK_ON (1 << 4)
209 static int rockchip_hdmiv2_clk_enable(struct hdmi_dev *hdmi_dev)
211 if (hdmi_dev->soctype == HDMI_SOC_RK322X) {
212 if ((hdmi_dev->clk_on & HDMI_EXT_PHY_CLK_ON) == 0) {
213 if (!hdmi_dev->pclk_phy) {
215 devm_clk_get(hdmi_dev->dev,
217 if (IS_ERR(hdmi_dev->pclk_phy)) {
218 dev_err(hdmi_dev->dev,
219 "get hdmi phy pclk error\n");
223 clk_prepare_enable(hdmi_dev->pclk_phy);
224 hdmi_dev->clk_on |= HDMI_EXT_PHY_CLK_ON;
226 } else if ((hdmi_dev->clk_on & HDMI_PD_ON) == 0) {
228 hdmi_dev->pd = devm_clk_get(hdmi_dev->dev, "pd_hdmi");
229 if (IS_ERR(hdmi_dev->pd)) {
230 dev_err(hdmi_dev->dev,
231 "Unable to get hdmi pd\n");
235 clk_prepare_enable(hdmi_dev->pd);
236 hdmi_dev->clk_on |= HDMI_PD_ON;
239 if ((hdmi_dev->clk_on & HDMI_PCLK_ON) == 0) {
240 if (hdmi_dev->pclk == NULL) {
242 devm_clk_get(hdmi_dev->dev, "pclk_hdmi");
243 if (IS_ERR(hdmi_dev->pclk)) {
244 dev_err(hdmi_dev->dev,
245 "Unable to get hdmi pclk\n");
249 clk_prepare_enable(hdmi_dev->pclk);
250 hdmi_dev->clk_on |= HDMI_PCLK_ON;
253 if ((hdmi_dev->clk_on & HDMI_HDCPCLK_ON) == 0) {
254 if (hdmi_dev->hdcp_clk == NULL) {
256 devm_clk_get(hdmi_dev->dev, "hdcp_clk_hdmi");
257 if (IS_ERR(hdmi_dev->hdcp_clk)) {
258 dev_err(hdmi_dev->dev,
259 "Unable to get hdmi hdcp_clk\n");
263 clk_prepare_enable(hdmi_dev->hdcp_clk);
264 hdmi_dev->clk_on |= HDMI_HDCPCLK_ON;
267 if ((rk_hdmi_property.feature & SUPPORT_CEC) &&
268 (hdmi_dev->clk_on & HDMI_CECCLK_ON) == 0) {
269 if (hdmi_dev->cec_clk == NULL) {
271 devm_clk_get(hdmi_dev->dev, "cec_clk_hdmi");
272 if (IS_ERR(hdmi_dev->cec_clk)) {
273 dev_err(hdmi_dev->dev,
274 "Unable to get hdmi cec_clk\n");
278 clk_prepare_enable(hdmi_dev->cec_clk);
279 hdmi_dev->clk_on |= HDMI_CECCLK_ON;
284 static int rockchip_hdmiv2_clk_disable(struct hdmi_dev *hdmi_dev)
286 if (hdmi_dev->clk_on == 0)
289 if ((hdmi_dev->clk_on & HDMI_PD_ON) && (hdmi_dev->pd != NULL)) {
290 clk_disable_unprepare(hdmi_dev->pd);
291 hdmi_dev->clk_on &= ~HDMI_PD_ON;
294 if ((hdmi_dev->clk_on & HDMI_PCLK_ON) &&
295 (hdmi_dev->pclk != NULL)) {
296 clk_disable_unprepare(hdmi_dev->pclk);
297 hdmi_dev->clk_on &= ~HDMI_PCLK_ON;
300 if ((hdmi_dev->clk_on & HDMI_HDCPCLK_ON) &&
301 (hdmi_dev->hdcp_clk != NULL)) {
302 clk_disable_unprepare(hdmi_dev->hdcp_clk);
303 hdmi_dev->clk_on &= ~HDMI_HDCPCLK_ON;
306 if ((hdmi_dev->clk_on & HDMI_EXT_PHY_CLK_ON) &&
307 hdmi_dev->pclk_phy) {
308 clk_disable_unprepare(hdmi_dev->pclk_phy);
309 hdmi_dev->clk_on &= ~HDMI_EXT_PHY_CLK_ON;
314 static int rockchip_hdmiv2_fb_event_notify(struct notifier_block *self,
315 unsigned long action, void *data)
317 struct fb_event *event = data;
318 int blank_mode = *((int *)event->data);
319 struct hdmi *hdmi = hdmi_dev->hdmi;
320 struct pinctrl_state *gpio_state;
321 #ifdef CONFIG_PINCTRL
322 struct dev_pin_info *pins = hdmi_dev->dev->pins;
325 if (action == FB_EARLY_EVENT_BLANK) {
326 switch (blank_mode) {
327 case FB_BLANK_UNBLANK:
330 HDMIDBG("suspend hdmi\n");
332 hdmi_submit_work(hdmi,
335 if (hdmi_dev->hdcp2_en)
336 hdmi_dev->hdcp2_en(0);
337 rockchip_hdmiv2_clk_disable(hdmi_dev);
338 #ifdef CONFIG_PINCTRL
339 if (hdmi_dev->soctype == HDMI_SOC_RK3288)
341 pinctrl_lookup_state(pins->p,
345 pinctrl_lookup_state(pins->p,
347 pinctrl_select_state(pins->p,
353 } else if (action == FB_EVENT_BLANK) {
354 switch (blank_mode) {
355 case FB_BLANK_UNBLANK:
356 HDMIDBG("resume hdmi\n");
358 #ifdef CONFIG_PINCTRL
359 pinctrl_select_state(pins->p,
360 pins->default_state);
362 rockchip_hdmiv2_clk_enable(hdmi_dev);
363 rockchip_hdmiv2_dev_initial(hdmi_dev);
364 if (hdmi->ops->hdcp_power_on_cb)
365 hdmi->ops->hdcp_power_on_cb();
366 if (hdmi_dev->hdcp2_reset)
367 hdmi_dev->hdcp2_reset();
368 if (hdmi_dev->hdcp2_en)
369 hdmi_dev->hdcp2_en(1);
370 hdmi_submit_work(hdmi, HDMI_RESUME_CTL,
381 static struct notifier_block rockchip_hdmiv2_fb_notifier = {
382 .notifier_call = rockchip_hdmiv2_fb_event_notify,
385 #ifdef HDMI_INT_USE_POLL
386 static void rockchip_hdmiv2_irq_work_func(struct work_struct *work)
388 if (hdmi_dev->enable) {
389 rockchip_hdmiv2_dev_irq(0, hdmi_dev);
390 queue_delayed_work(hdmi_dev->workqueue,
391 &(hdmi_dev->delay_work),
392 msecs_to_jiffies(50));
397 static struct hdmi_ops rk_hdmi_ops;
399 #if defined(CONFIG_OF)
400 static const struct of_device_id rk_hdmi_dt_ids[] = {
401 {.compatible = "rockchip,rk3288-hdmi",},
402 {.compatible = "rockchip,rk3368-hdmi",},
403 {.compatible = "rockchip,rk322x-hdmi",},
407 static int rockchip_hdmiv2_parse_dt(struct hdmi_dev *hdmi_dev)
410 struct device_node *np = hdmi_dev->dev->of_node;
411 const struct of_device_id *match;
413 match = of_match_node(rk_hdmi_dt_ids, np);
415 return PTR_ERR(match);
417 if (!strcmp(match->compatible, "rockchip,rk3288-hdmi")) {
418 hdmi_dev->soctype = HDMI_SOC_RK3288;
419 } else if (!strcmp(match->compatible, "rockchip,rk3368-hdmi")) {
420 hdmi_dev->soctype = HDMI_SOC_RK3368;
421 } else if (!strcmp(match->compatible, "rockchip,rk322x-hdmi")) {
422 hdmi_dev->soctype = HDMI_SOC_RK322X;
424 pr_err("It is not a valid rockchip soc!");
428 if (!of_property_read_u32(np, "rockchip,hdmi_video_source", &val))
429 rk_hdmi_property.videosrc = val;
431 if (!of_property_read_u32(np, "rockchip,hdmi_audio_source", &val))
432 hdmi_dev->audiosrc = val;
434 if (!of_property_read_u32(np, "rockchip,cec_enable", &val) &&
436 pr_debug("hdmi support cec\n");
437 rk_hdmi_property.feature |= SUPPORT_CEC;
439 if (!of_property_read_u32(np, "rockchip,hdcp_enable", &val) &&
441 pr_debug("hdmi support hdcp\n");
442 rk_hdmi_property.feature |= SUPPORT_HDCP;
444 if (!of_property_read_u32(np, "rockchip,defaultmode", &val) &&
446 pr_debug("default mode is %d\n", val);
447 rk_hdmi_property.defaultmode = val;
449 rk_hdmi_property.defaultmode = HDMI_VIDEO_DEFAULT_MODE;
451 if (of_get_property(np, "rockchip,phy_table", &val)) {
452 hdmi_dev->phy_table = kmalloc(val, GFP_KERNEL);
453 if (!hdmi_dev->phy_table) {
454 pr_err("kmalloc phy table %d error\n", val);
457 hdmi_dev->phy_table_size =
458 val / sizeof(struct hdmi_dev_phy_para);
459 of_property_read_u32_array(np, "rockchip,phy_table",
460 (u32 *)hdmi_dev->phy_table,
463 pr_info("hdmi phy_table not exist\n");
466 of_property_read_string(np, "rockchip,vendor",
467 &(hdmi_dev->vendor_name));
468 of_property_read_string(np, "rockchip,product",
469 &(hdmi_dev->product_name));
470 if (!of_property_read_u32(np, "rockchip,deviceinfo", &val))
471 hdmi_dev->deviceinfo = val & 0xff;
473 #ifdef CONFIG_MFD_SYSCON
475 syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
476 if (IS_ERR(hdmi_dev->grf_base)) {
477 hdmi_dev->grf_base = NULL;
479 if (of_property_read_u32(np, "rockchip,grf_reg_offset",
480 &hdmi_dev->grf_reg_offset)) {
481 pr_err("get cru_reg_offset failed\n");
484 if (of_property_read_u32(np, "rockchip,grf_reg_shift",
485 &hdmi_dev->grf_reg_shift)) {
486 pr_err("get cru_reg_shift failed\n");
495 static int rockchip_hdmiv2_probe(struct platform_device *pdev)
498 struct resource *res;
500 HDMIDBG("%s\n", __func__);
501 hdmi_dev = kmalloc(sizeof(*hdmi_dev), GFP_KERNEL);
503 dev_err(&pdev->dev, ">>rockchip hdmiv2 kmalloc fail!");
506 memset(hdmi_dev, 0, sizeof(struct hdmi_dev));
507 platform_set_drvdata(pdev, hdmi_dev);
508 hdmi_dev->dev = &pdev->dev;
510 if (rockchip_hdmiv2_parse_dt(hdmi_dev))
513 /*request and remap iomem*/
514 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
516 dev_err(&pdev->dev, "Unable to get register resource\n");
520 hdmi_dev->regbase = devm_ioremap_resource(&pdev->dev, res);
521 if (IS_ERR(hdmi_dev->regbase)) {
522 ret = PTR_ERR(hdmi_dev->regbase);
524 "cannot ioremap registers,err=%d\n", ret);
527 if (hdmi_dev->soctype == HDMI_SOC_RK322X) {
528 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
531 "Unable to get phy register resource\n");
535 hdmi_dev->phybase = devm_ioremap_resource(&pdev->dev, res);
536 if (IS_ERR(hdmi_dev->phybase)) {
537 ret = PTR_ERR(hdmi_dev->phybase);
539 "cannot ioremap registers,err=%d\n", ret);
544 hdmi_dev->reset = devm_reset_control_get(&pdev->dev, "hdmi");
545 if (IS_ERR(hdmi_dev->reset) &&
546 hdmi_dev->soctype != HDMI_SOC_RK3288) {
547 ret = PTR_ERR(hdmi_dev->reset);
548 dev_err(&pdev->dev, "failed to get hdmi reset: %d\n", ret);
552 /*enable pd and pclk and hdcp_clk*/
553 if (rockchip_hdmiv2_clk_enable(hdmi_dev) < 0) {
557 /*lcdc source select*/
558 if (hdmi_dev->soctype == HDMI_SOC_RK3288) {
559 grf_writel(HDMI_SEL_LCDC(rk_hdmi_property.videosrc),
560 RK3288_GRF_SOC_CON6);
561 /* select GPIO7_C0 as cec pin */
562 grf_writel(((1 << 12) | (1 << 28)), RK3288_GRF_SOC_CON8);
564 rockchip_hdmiv2_dev_init_ops(&rk_hdmi_ops);
565 /* Register HDMI device */
566 rk_hdmi_property.name = (char *)pdev->name;
567 rk_hdmi_property.priv = hdmi_dev;
568 if (hdmi_dev->soctype == HDMI_SOC_RK3288) {
569 rk_hdmi_property.feature |= SUPPORT_DEEP_10BIT;
570 if (rk_hdmi_property.videosrc == DISPLAY_SOURCE_LCDC0)
571 rk_hdmi_property.feature |=
574 } else if (hdmi_dev->soctype == HDMI_SOC_RK3368) {
575 rk_hdmi_property.feature |=
579 SUPPORT_YCBCR_INPUT |
581 } else if (hdmi_dev->soctype == HDMI_SOC_RK322X) {
582 rk_hdmi_property.feature |=
585 SUPPORT_YCBCR_INPUT |
588 if (rockchip_get_cpu_version())
589 rk_hdmi_property.feature |=
597 rockchip_hdmi_register(&rk_hdmi_property, &rk_hdmi_ops);
598 if (hdmi_dev->hdmi == NULL) {
599 dev_err(&pdev->dev, "register hdmi device failed\n");
603 mutex_init(&hdmi_dev->ddc_lock);
604 hdmi_dev->hdmi->dev = &pdev->dev;
605 hdmi_dev->hdmi->soctype = hdmi_dev->soctype;
606 fb_register_client(&rockchip_hdmiv2_fb_notifier);
607 rockchip_hdmiv2_dev_initial(hdmi_dev);
608 pinctrl_select_state(hdmi_dev->dev->pins->p,
609 hdmi_dev->dev->pins->default_state);
610 #if defined(CONFIG_DEBUG_FS)
611 hdmi_dev->debugfs_dir = debugfs_create_dir("rockchip_hdmiv2", NULL);
612 if (IS_ERR(hdmi_dev->debugfs_dir))
613 dev_err(hdmi_dev->hdmi->dev,
614 "failed to create debugfs dir for rockchip hdmiv2!\n");
616 debugfs_create_file("regs_ctrl", S_IRUSR,
617 hdmi_dev->debugfs_dir,
618 hdmi_dev, &hdmi_regs_ctrl_fops);
619 debugfs_create_file("regs_phy", S_IRUSR,
620 hdmi_dev->debugfs_dir,
621 hdmi_dev, &hdmi_regs_phy_fops);
625 #ifndef HDMI_INT_USE_POLL
626 /* get and request the IRQ */
627 hdmi_dev->irq = platform_get_irq(pdev, 0);
628 if (hdmi_dev->irq <= 0) {
629 dev_err(hdmi_dev->dev,
630 "failed to get hdmi irq resource (%d).\n",
636 ret = devm_request_irq(hdmi_dev->dev, hdmi_dev->irq,
637 rockchip_hdmiv2_dev_irq,
639 dev_name(hdmi_dev->dev), hdmi_dev);
641 dev_err(hdmi_dev->dev,
642 "hdmi request_irq failed (%d).\n",
647 hdmi_dev->workqueue =
648 create_singlethread_workqueue("rockchip hdmiv2 irq");
649 INIT_DELAYED_WORK(&(hdmi_dev->delay_work),
650 rockchip_hdmiv2_irq_work_func);
651 rockchip_hdmiv2_irq_work_func(NULL);
654 rk_display_device_enable(hdmi_dev->hdmi->ddev);
655 dev_info(&pdev->dev, "rockchip hdmiv2 probe sucess.\n");
659 rockchip_hdmi_unregister(hdmi_dev->hdmi);
661 kfree(hdmi_dev->phy_table);
664 dev_err(&pdev->dev, "rk3288 hdmi probe error.\n");
668 static int rockchip_hdmiv2_suspend(struct platform_device *pdev,
672 hdmi_dev->grf_base &&
673 hdmi_dev->soctype == HDMI_SOC_RK322X) {
674 regmap_write(hdmi_dev->grf_base,
676 RK322X_PLL_POWER_DOWN);
681 static int rockchip_hdmiv2_resume(struct platform_device *pdev)
684 hdmi_dev->grf_base &&
685 hdmi_dev->soctype == HDMI_SOC_RK322X) {
686 regmap_write(hdmi_dev->grf_base,
688 RK322X_PLL_POWER_UP);
693 static int rockchip_hdmiv2_remove(struct platform_device *pdev)
695 dev_info(&pdev->dev, "rk3288 hdmi driver removed.\n");
699 static void rockchip_hdmiv2_shutdown(struct platform_device *pdev)
704 #ifdef CONFIG_HAS_EARLYSUSPEND
705 unregister_early_suspend(&hdmi_dev->early_suspend);
707 hdmi = hdmi_dev->hdmi;
708 if (hdmi->hotplug == HDMI_HPD_ACTIVED &&
710 hdmi->ops->setmute(hdmi, HDMI_VIDEO_MUTE);
714 static struct platform_driver rockchip_hdmiv2_driver = {
715 .probe = rockchip_hdmiv2_probe,
716 .remove = rockchip_hdmiv2_remove,
718 .name = "rockchip-hdmiv2",
719 .owner = THIS_MODULE,
720 #if defined(CONFIG_OF)
721 .of_match_table = of_match_ptr(rk_hdmi_dt_ids),
724 .suspend = rockchip_hdmiv2_suspend,
725 .resume = rockchip_hdmiv2_resume,
726 .shutdown = rockchip_hdmiv2_shutdown,
729 static int __init rockchip_hdmiv2_init(void)
731 return platform_driver_register(&rockchip_hdmiv2_driver);
734 static void __exit rockchip_hdmiv2_exit(void)
736 platform_driver_unregister(&rockchip_hdmiv2_driver);
739 module_init(rockchip_hdmiv2_init);
740 module_exit(rockchip_hdmiv2_exit);