Lines Matching +full:gpio +full:- +full:out +full:- +full:pol
1 // SPDX-License-Identifier: GPL-2.0
5 * Author: Wyon Bi <bivvy.bi@rock-chips.com>
13 #include <linux/gpio/consumer.h>
362 if (!rk628->display_enabled) in rk628_display_disable()
365 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_disable()
368 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_disable()
371 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_disable()
374 if (rk628->output_mode == OUTPUT_MODE_DSI) in rk628_display_disable()
379 if (rk628->input_mode == INPUT_MODE_HDMI) in rk628_display_disable()
382 rk628->display_enabled = false; in rk628_display_disable()
389 if (rk628->display_enabled) in rk628_display_resume()
392 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_resume()
400 if (rk628->input_mode == INPUT_MODE_RGB) in rk628_display_resume()
403 if (rk628->input_mode == INPUT_MODE_BT1120) in rk628_display_resume()
409 if (rk628->output_mode == OUTPUT_MODE_DSI) { in rk628_display_resume()
414 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_resume()
417 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_resume()
420 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_resume()
424 if (rk628->output_mode == OUTPUT_MODE_HDMI) in rk628_display_resume()
428 rk628->display_enabled = true; in rk628_display_resume()
435 if (rk628->display_enabled) in rk628_display_enable()
438 if (rk628->input_mode == INPUT_MODE_RGB) in rk628_display_enable()
441 if (rk628->input_mode == INPUT_MODE_BT1120) in rk628_display_enable()
444 if (rk628->output_mode == OUTPUT_MODE_BT1120) in rk628_display_enable()
447 if (rk628->output_mode == OUTPUT_MODE_DSI) in rk628_display_enable()
448 queue_delayed_work(rk628->dsi_wq, &rk628->dsi_delay_work, msecs_to_jiffies(10)); in rk628_display_enable()
450 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_enable()
458 if (rk628->output_mode != OUTPUT_MODE_HDMI) { in rk628_display_enable()
463 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_enable()
466 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_enable()
469 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_enable()
473 if (rk628->output_mode == OUTPUT_MODE_HDMI) in rk628_display_enable()
477 rk628->display_enabled = true; in rk628_display_enable()
487 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_work()
490 if (!rk628->plugin_det_gpio) in rk628_display_work()
491 queue_delayed_work(rk628->monitor_wq, in rk628_display_work()
492 &rk628->delay_work, delay); in rk628_display_work()
507 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_work()
508 if (!rk628->plugin_det_gpio) { in rk628_display_work()
511 queue_delayed_work(rk628->monitor_wq, &rk628->delay_work, in rk628_display_work()
538 schedule_delayed_work(&rk628->delay_work, HZ / 20); in rk628_hdmirx_plugin_irq()
545 if (rk628->input_mode == INPUT_MODE_RGB || rk628->input_mode == INPUT_MODE_BT1120) in rk628_input_is_rgb()
557 if (of_property_read_bool(rk628->dev->of_node, "rk628,hdmi-in")) in rk628_display_route_info_parse()
558 rk628->input_mode = INPUT_MODE_HDMI; in rk628_display_route_info_parse()
559 else if (of_property_read_bool(rk628->dev->of_node, "rk628,rgb-in")) in rk628_display_route_info_parse()
560 rk628->input_mode = INPUT_MODE_RGB; in rk628_display_route_info_parse()
561 else if (of_property_read_bool(rk628->dev->of_node, "rk628,bt1120-in")) in rk628_display_route_info_parse()
562 rk628->input_mode = INPUT_MODE_BT1120; in rk628_display_route_info_parse()
564 rk628->input_mode = INPUT_MODE_RGB; in rk628_display_route_info_parse()
566 if (of_find_node_by_name(rk628->dev->of_node, "rk628-dsi")) { in rk628_display_route_info_parse()
567 np = of_find_node_by_name(rk628->dev->of_node, "rk628-dsi"); in rk628_display_route_info_parse()
569 } else if (of_find_node_by_name(rk628->dev->of_node, "rk628-lvds")) { in rk628_display_route_info_parse()
570 np = of_find_node_by_name(rk628->dev->of_node, "rk628-lvds"); in rk628_display_route_info_parse()
572 } else if (of_find_node_by_name(rk628->dev->of_node, "rk628-gvi")) { in rk628_display_route_info_parse()
573 np = of_find_node_by_name(rk628->dev->of_node, "rk628-gvi"); in rk628_display_route_info_parse()
575 } else if (of_find_node_by_name(rk628->dev->of_node, "rk628-bt1120")) { in rk628_display_route_info_parse()
576 rk628->output_mode = OUTPUT_MODE_BT1120; in rk628_display_route_info_parse()
578 if (of_property_read_bool(rk628->dev->of_node, "rk628,hdmi-out")) in rk628_display_route_info_parse()
579 rk628->output_mode = OUTPUT_MODE_HDMI; in rk628_display_route_info_parse()
580 else if (of_property_read_bool(rk628->dev->of_node, "rk628,csi-out")) in rk628_display_route_info_parse()
581 rk628->output_mode = OUTPUT_MODE_CSI; in rk628_display_route_info_parse()
584 if (of_property_read_u32(rk628->dev->of_node, "mode-sync-pol", &val) < 0) in rk628_display_route_info_parse()
585 rk628->sync_pol = MODE_FLAG_PSYNC; in rk628_display_route_info_parse()
587 rk628->sync_pol = (!val ? MODE_FLAG_NSYNC : MODE_FLAG_PSYNC); in rk628_display_route_info_parse()
589 if (rk628_input_is_rgb(rk628) && rk628->output_mode == OUTPUT_MODE_RGB) in rk628_display_route_info_parse()
590 return -EINVAL; in rk628_display_route_info_parse()
599 dmode->hdisplay = vm->hactive; in rk628_display_mode_from_videomode()
600 dmode->hsync_start = dmode->hdisplay + vm->hfront_porch; in rk628_display_mode_from_videomode()
601 dmode->hsync_end = dmode->hsync_start + vm->hsync_len; in rk628_display_mode_from_videomode()
602 dmode->htotal = dmode->hsync_end + vm->hback_porch; in rk628_display_mode_from_videomode()
604 dmode->vdisplay = vm->vactive; in rk628_display_mode_from_videomode()
605 dmode->vsync_start = dmode->vdisplay + vm->vfront_porch; in rk628_display_mode_from_videomode()
606 dmode->vsync_end = dmode->vsync_start + vm->vsync_len; in rk628_display_mode_from_videomode()
607 dmode->vtotal = dmode->vsync_end + vm->vback_porch; in rk628_display_mode_from_videomode()
609 dmode->clock = vm->pixelclock / 1000; in rk628_display_mode_from_videomode()
610 dmode->flags = vm->flags; in rk628_display_mode_from_videomode()
618 of_property_read_u32(np, "clock-frequency", &vm->pixelclock); in of_parse_rk628_display_timing()
619 of_property_read_u32(np, "hactive", &vm->hactive); in of_parse_rk628_display_timing()
620 of_property_read_u32(np, "hfront-porch", &vm->hfront_porch); in of_parse_rk628_display_timing()
621 of_property_read_u32(np, "hback-porch", &vm->hback_porch); in of_parse_rk628_display_timing()
622 of_property_read_u32(np, "hsync-len", &vm->hsync_len); in of_parse_rk628_display_timing()
624 of_property_read_u32(np, "vactive", &vm->vactive); in of_parse_rk628_display_timing()
625 of_property_read_u32(np, "vfront-porch", &vm->vfront_porch); in of_parse_rk628_display_timing()
626 of_property_read_u32(np, "vback-porch", &vm->vback_porch); in of_parse_rk628_display_timing()
627 of_property_read_u32(np, "vsync-len", &vm->vsync_len); in of_parse_rk628_display_timing()
629 vm->flags = 0; in of_parse_rk628_display_timing()
630 of_property_read_u8(np, "hsync-active", &val); in of_parse_rk628_display_timing()
631 vm->flags |= val ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; in of_parse_rk628_display_timing()
633 of_property_read_u8(np, "vsync-active", &val); in of_parse_rk628_display_timing()
634 vm->flags |= val ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; in of_parse_rk628_display_timing()
643 timings_np = of_get_child_by_name(rk628->dev->of_node, "display-timings"); in rk628_get_video_mode()
645 dev_info(rk628->dev, "failed to found display timings\n"); in rk628_get_video_mode()
646 return -EINVAL; in rk628_get_video_mode()
649 src_np = of_get_child_by_name(timings_np, "src-timing"); in rk628_get_video_mode()
651 dev_info(rk628->dev, "failed to found src timing\n"); in rk628_get_video_mode()
653 return -EINVAL; in rk628_get_video_mode()
657 rk628_display_mode_from_videomode(&vm, &rk628->src_mode); in rk628_get_video_mode()
658 dev_info(rk628->dev, "src mode: %d %d %d %d %d %d %d %d %d 0x%x\n", in rk628_get_video_mode()
659 rk628->src_mode.clock, rk628->src_mode.hdisplay, rk628->src_mode.hsync_start, in rk628_get_video_mode()
660 rk628->src_mode.hsync_end, rk628->src_mode.htotal, rk628->src_mode.vdisplay, in rk628_get_video_mode()
661 rk628->src_mode.vsync_start, rk628->src_mode.vsync_end, rk628->src_mode.vtotal, in rk628_get_video_mode()
662 rk628->src_mode.flags); in rk628_get_video_mode()
664 dst_np = of_get_child_by_name(timings_np, "dst-timing"); in rk628_get_video_mode()
666 dev_info(rk628->dev, "failed to found dst timing\n"); in rk628_get_video_mode()
669 return -EINVAL; in rk628_get_video_mode()
673 rk628_display_mode_from_videomode(&vm, &rk628->dst_mode); in rk628_get_video_mode()
674 dev_info(rk628->dev, "dst mode: %d %d %d %d %d %d %d %d %d 0x%x\n", in rk628_get_video_mode()
675 rk628->dst_mode.clock, rk628->dst_mode.hdisplay, rk628->dst_mode.hsync_start, in rk628_get_video_mode()
676 rk628->dst_mode.hsync_end, rk628->dst_mode.htotal, rk628->dst_mode.vdisplay, in rk628_get_video_mode()
677 rk628->dst_mode.vsync_start, rk628->dst_mode.vsync_end, rk628->dst_mode.vtotal, in rk628_get_video_mode()
678 rk628->dst_mode.flags); in rk628_get_video_mode()
707 struct rk628 *rk628 = s->private; in rk628_debugfs_dump()
884 DEBUG_PRINT("\tH: %d %d %d %d\n", src_hactive, src_htotal - src_hoffset, in rk628_debugfs_dump()
885 src_htotal - src_hoffset + src_hs_end, src_htotal); in rk628_debugfs_dump()
888 src_vtotal - src_voffset - src_vs_end, in rk628_debugfs_dump()
889 src_vtotal - src_voffset, src_vtotal); in rk628_debugfs_dump()
908 DEBUG_PRINT("\tH-total: %d\n", src_htotal); in rk628_debugfs_dump()
910 DEBUG_PRINT("\tV-total: %d\n", src_vtotal); in rk628_debugfs_dump()
972 dsp_hact_end - dsp_hact_st, dsp_vact_end - dsp_vact_st, fps, sclk_vop); in rk628_debugfs_dump()
973 DEBUG_PRINT("\tH: %d %d %d %d\n", dsp_hact_end - dsp_hact_st, in rk628_debugfs_dump()
974 dsp_htotal - dsp_hact_st, dsp_htotal - dsp_hact_st + dsp_hs_end, dsp_htotal); in rk628_debugfs_dump()
975 DEBUG_PRINT("\tV: %d %d %d %d\n", dsp_vact_end - dsp_vact_st, in rk628_debugfs_dump()
976 dsp_vtotal - dsp_vact_st, dsp_vtotal - dsp_vact_st + dsp_vs_end, dsp_vtotal); in rk628_debugfs_dump()
1037 struct rk628 *rk628 = inode->i_private; in rk628_debugfs_open()
1055 struct device *dev = &client->dev; in rk628_i2c_probe()
1066 return -ENOMEM; in rk628_i2c_probe()
1068 rk628->dev = dev; in rk628_i2c_probe()
1069 rk628->client = client; in rk628_i2c_probe()
1071 rk628->hdmirx_irq = client->irq; in rk628_i2c_probe()
1079 if (rk628->output_mode != OUTPUT_MODE_HDMI && in rk628_i2c_probe()
1080 rk628->output_mode != OUTPUT_MODE_CSI) { in rk628_i2c_probe()
1088 rk628->soc_24M = devm_clk_get(dev, "soc_24M"); in rk628_i2c_probe()
1089 if (rk628->soc_24M == ERR_PTR(-ENOENT)) in rk628_i2c_probe()
1090 rk628->soc_24M = NULL; in rk628_i2c_probe()
1092 if (IS_ERR(rk628->soc_24M)) { in rk628_i2c_probe()
1093 ret = PTR_ERR(rk628->soc_24M); in rk628_i2c_probe()
1098 clk_prepare_enable(rk628->soc_24M); in rk628_i2c_probe()
1100 rk628->enable_gpio = devm_gpiod_get_optional(dev, "enable", in rk628_i2c_probe()
1102 if (IS_ERR(rk628->enable_gpio)) { in rk628_i2c_probe()
1103 ret = PTR_ERR(rk628->enable_gpio); in rk628_i2c_probe()
1104 dev_err(dev, "failed to request enable GPIO: %d\n", ret); in rk628_i2c_probe()
1108 rk628->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in rk628_i2c_probe()
1109 if (IS_ERR(rk628->reset_gpio)) { in rk628_i2c_probe()
1110 ret = PTR_ERR(rk628->reset_gpio); in rk628_i2c_probe()
1111 dev_err(dev, "failed to request reset GPIO: %d\n", ret); in rk628_i2c_probe()
1115 rk628->plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det", in rk628_i2c_probe()
1117 if (IS_ERR(rk628->plugin_det_gpio)) { in rk628_i2c_probe()
1118 dev_err(rk628->dev, "failed to get hdmirx det gpio\n"); in rk628_i2c_probe()
1119 ret = PTR_ERR(rk628->plugin_det_gpio); in rk628_i2c_probe()
1123 gpiod_set_value(rk628->enable_gpio, 1); in rk628_i2c_probe()
1125 gpiod_set_value(rk628->reset_gpio, 0); in rk628_i2c_probe()
1127 gpiod_set_value(rk628->reset_gpio, 1); in rk628_i2c_probe()
1129 gpiod_set_value(rk628->reset_gpio, 0); in rk628_i2c_probe()
1135 if (!config->name) in rk628_i2c_probe()
1138 rk628->regmap[i] = devm_regmap_init_i2c(client, config); in rk628_i2c_probe()
1139 if (IS_ERR(rk628->regmap[i])) { in rk628_i2c_probe()
1140 ret = PTR_ERR(rk628->regmap[i]); in rk628_i2c_probe()
1154 rk628->monitor_wq = alloc_ordered_workqueue("%s", in rk628_i2c_probe()
1155 WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk628-monitor-wq"); in rk628_i2c_probe()
1156 INIT_DELAYED_WORK(&rk628->delay_work, rk628_display_work); in rk628_i2c_probe()
1158 if (rk628->output_mode == OUTPUT_MODE_DSI) { in rk628_i2c_probe()
1159 rk628->dsi_wq = alloc_ordered_workqueue("%s", in rk628_i2c_probe()
1160 WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk628-dsi-wq"); in rk628_i2c_probe()
1161 INIT_DELAYED_WORK(&rk628->dsi_delay_work, rk628_dsi_work); in rk628_i2c_probe()
1166 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_i2c_probe()
1169 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_i2c_probe()
1170 if (rk628->plugin_det_gpio) { in rk628_i2c_probe()
1171 rk628->plugin_irq = gpiod_to_irq(rk628->plugin_det_gpio); in rk628_i2c_probe()
1172 if (rk628->plugin_irq < 0) { in rk628_i2c_probe()
1173 dev_err(rk628->dev, "failed to get plugin det irq\n"); in rk628_i2c_probe()
1174 err = rk628->plugin_irq; in rk628_i2c_probe()
1178 err = devm_request_threaded_irq(dev, rk628->plugin_irq, NULL, in rk628_i2c_probe()
1182 dev_err(rk628->dev, "failed to register plugin det irq (%d)\n", in rk628_i2c_probe()
1187 if (rk628->hdmirx_irq) { in rk628_i2c_probe()
1189 irqd_get_trigger_type(irq_get_irq_data(rk628->hdmirx_irq)); in rk628_i2c_probe()
1190 dev_dbg(rk628->dev, "cfg hdmirx irq, flags: %lu!\n", irq_flags); in rk628_i2c_probe()
1191 err = devm_request_threaded_irq(dev, rk628->hdmirx_irq, NULL, in rk628_i2c_probe()
1195 dev_err(rk628->dev, "request rk628 irq failed! err:%d\n", in rk628_i2c_probe()
1202 queue_delayed_work(rk628->monitor_wq, &rk628->delay_work, in rk628_i2c_probe()
1207 queue_delayed_work(rk628->monitor_wq, &rk628->delay_work, in rk628_i2c_probe()
1215 debug_dir = debugfs_create_dir(rk628->dev->driver->name, NULL); in rk628_i2c_probe()
1227 struct device *dev = &client->dev; in rk628_i2c_remove()
1229 if (rk628->output_mode == OUTPUT_MODE_DSI) { in rk628_i2c_remove()
1230 cancel_delayed_work_sync(&rk628->dsi_delay_work); in rk628_i2c_remove()
1231 destroy_workqueue(rk628->dsi_wq); in rk628_i2c_remove()
1234 cancel_delayed_work_sync(&rk628->delay_work); in rk628_i2c_remove()
1235 destroy_workqueue(rk628->monitor_wq); in rk628_i2c_remove()
1308 MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>");