Lines Matching refs:rk628
360 static void rk628_display_disable(struct rk628 *rk628) in rk628_display_disable() argument
362 if (!rk628->display_enabled) in rk628_display_disable()
365 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_disable()
366 rk628_csi_disable(rk628); in rk628_display_disable()
368 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_disable()
369 rk628_gvi_disable(rk628); in rk628_display_disable()
371 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_disable()
372 rk628_lvds_disable(rk628); in rk628_display_disable()
374 if (rk628->output_mode == OUTPUT_MODE_DSI) in rk628_display_disable()
375 rk628_dsi_disable(rk628); in rk628_display_disable()
377 rk628_post_process_disable(rk628); in rk628_display_disable()
379 if (rk628->input_mode == INPUT_MODE_HDMI) in rk628_display_disable()
380 rk628_hdmirx_disable(rk628); in rk628_display_disable()
382 rk628->display_enabled = false; in rk628_display_disable()
385 static void rk628_display_resume(struct rk628 *rk628) in rk628_display_resume() argument
389 if (rk628->display_enabled) in rk628_display_resume()
392 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_resume()
393 ret = rk628_hdmirx_enable(rk628); in rk628_display_resume()
395 rk628_display_disable(rk628); in rk628_display_resume()
400 if (rk628->input_mode == INPUT_MODE_RGB) in rk628_display_resume()
401 rk628_rgb_rx_enable(rk628); in rk628_display_resume()
403 if (rk628->input_mode == INPUT_MODE_BT1120) in rk628_display_resume()
404 rk628_bt1120_rx_enable(rk628); in rk628_display_resume()
406 rk628_post_process_init(rk628); in rk628_display_resume()
407 rk628_post_process_enable(rk628); in rk628_display_resume()
409 if (rk628->output_mode == OUTPUT_MODE_DSI) { in rk628_display_resume()
410 rk628_mipi_dsi_pre_enable(rk628); in rk628_display_resume()
411 rk628_mipi_dsi_enable(rk628); in rk628_display_resume()
414 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_resume()
415 rk628_lvds_enable(rk628); in rk628_display_resume()
417 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_resume()
418 rk628_gvi_enable(rk628); in rk628_display_resume()
420 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_resume()
421 rk628_csi_enable(rk628); in rk628_display_resume()
424 if (rk628->output_mode == OUTPUT_MODE_HDMI) in rk628_display_resume()
425 rk628_hdmitx_enable(rk628); in rk628_display_resume()
428 rk628->display_enabled = true; in rk628_display_resume()
431 static void rk628_display_enable(struct rk628 *rk628) in rk628_display_enable() argument
435 if (rk628->display_enabled) in rk628_display_enable()
438 if (rk628->input_mode == INPUT_MODE_RGB) in rk628_display_enable()
439 rk628_rgb_rx_enable(rk628); in rk628_display_enable()
441 if (rk628->input_mode == INPUT_MODE_BT1120) in rk628_display_enable()
442 rk628_bt1120_rx_enable(rk628); in rk628_display_enable()
444 if (rk628->output_mode == OUTPUT_MODE_BT1120) in rk628_display_enable()
445 rk628_bt1120_tx_enable(rk628); 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()
451 ret = rk628_hdmirx_enable(rk628); in rk628_display_enable()
453 rk628_display_disable(rk628); in rk628_display_enable()
458 if (rk628->output_mode != OUTPUT_MODE_HDMI) { in rk628_display_enable()
459 rk628_post_process_init(rk628); in rk628_display_enable()
460 rk628_post_process_enable(rk628); in rk628_display_enable()
463 if (rk628->output_mode == OUTPUT_MODE_LVDS) in rk628_display_enable()
464 rk628_lvds_enable(rk628); in rk628_display_enable()
466 if (rk628->output_mode == OUTPUT_MODE_GVI) in rk628_display_enable()
467 rk628_gvi_enable(rk628); in rk628_display_enable()
469 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_display_enable()
470 rk628_csi_enable(rk628); in rk628_display_enable()
473 if (rk628->output_mode == OUTPUT_MODE_HDMI) in rk628_display_enable()
474 rk628_hdmitx_enable(rk628); in rk628_display_enable()
477 rk628->display_enabled = true; in rk628_display_enable()
483 struct rk628 *rk628 = in rk628_display_work() local
484 container_of(work, struct rk628, delay_work.work); in rk628_display_work()
487 if (rk628->input_mode == INPUT_MODE_HDMI) { in rk628_display_work()
488 ret = rk628_hdmirx_detect(rk628); 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()
494 rk628_hdmirx_enable_interrupts(rk628, true); in rk628_display_work()
501 rk628_display_disable(rk628); in rk628_display_work()
502 rk628_display_enable(rk628); in rk628_display_work()
504 rk628_display_disable(rk628); 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()
514 rk628_hdmirx_enable_interrupts(rk628, true); in rk628_display_work()
521 struct rk628 *rk628 = container_of(work, struct rk628, dsi_delay_work.work); in rk628_dsi_work() local
523 rk628_mipi_dsi_pre_enable(rk628); in rk628_dsi_work()
524 rk628_mipi_dsi_enable(rk628); in rk628_dsi_work()
529 struct rk628 *rk628 = dev_id; in rk628_hdmirx_plugin_irq() local
531 rk628_hdmirx_enable_interrupts(rk628, false); in rk628_hdmirx_plugin_irq()
533 rk628_i2c_write(rk628, HDMI_RX_MD_ICLR, 0xffffffff); in rk628_hdmirx_plugin_irq()
534 rk628_i2c_write(rk628, HDMI_RX_PDEC_ICLR, 0xffffffff); in rk628_hdmirx_plugin_irq()
535 rk628_i2c_write(rk628, GRF_INTR0_CLR_EN, 0x01000100); in rk628_hdmirx_plugin_irq()
538 schedule_delayed_work(&rk628->delay_work, HZ / 20); in rk628_hdmirx_plugin_irq()
543 static bool rk628_input_is_rgb(struct rk628 *rk628) in rk628_input_is_rgb() argument
545 if (rk628->input_mode == INPUT_MODE_RGB || rk628->input_mode == INPUT_MODE_BT1120) in rk628_input_is_rgb()
551 static int rk628_display_route_info_parse(struct rk628 *rk628) in rk628_display_route_info_parse() argument
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()
568 ret = rk628_dsi_parse(rk628, np); 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()
571 ret = rk628_lvds_parse(rk628, np); 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()
574 ret = rk628_gvi_parse(rk628, np); 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()
637 static int rk628_get_video_mode(struct rk628 *rk628) in rk628_get_video_mode() argument
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()
651 dev_info(rk628->dev, "failed to found src timing\n"); 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()
666 dev_info(rk628->dev, "failed to found dst timing\n"); 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()
687 static int rk628_display_timings_get(struct rk628 *rk628) in rk628_display_timings_get() argument
691 ret = rk628_get_video_mode(rk628); in rk628_display_timings_get()
707 struct rk628 *rk628 = s->private; in rk628_debugfs_dump() local
757 rk628_i2c_read(rk628, 0xc0088, ®_v); in rk628_debugfs_dump()
759 rk628_i2c_read(rk628, 0xc00b4, ®_v); in rk628_debugfs_dump()
773 rk628_i2c_read(rk628, 0xc0088, ®_v); in rk628_debugfs_dump()
775 rk628_i2c_read(rk628, 0xc00b8, ®_v); in rk628_debugfs_dump()
789 rk628_i2c_read(rk628, 0xc0094, ®_v); in rk628_debugfs_dump()
804 rk628_i2c_read(rk628, GRF_SYSTEM_CON0, &val); in rk628_debugfs_dump()
831 rk628_i2c_read(rk628, 0x16654, ®_v); in rk628_debugfs_dump()
838 rk628_i2c_read(rk628, 0x166a8, ®_v); in rk628_debugfs_dump()
849 rk628_i2c_read(rk628, 0x30150, ®_v); in rk628_debugfs_dump()
852 rk628_i2c_read(rk628, 0x3014c, ®_v); in rk628_debugfs_dump()
861 rk628_i2c_read(rk628, 0x30148, ®_v); in rk628_debugfs_dump()
866 rk628_i2c_read(rk628, 0x30168, ®_v); in rk628_debugfs_dump()
868 rk628_i2c_read(rk628, 0x30170, ®_v); in rk628_debugfs_dump()
870 rk628_i2c_read(rk628, 0x30164, ®_v); in rk628_debugfs_dump()
873 rk628_i2c_read(rk628, 0x3015c, ®_v); in rk628_debugfs_dump()
892 rk628_i2c_read(rk628, 0x130, ®_v); in rk628_debugfs_dump()
895 rk628_i2c_read(rk628, 0x12c, ®_v); in rk628_debugfs_dump()
898 rk628_i2c_read(rk628, 0x134, ®_v); in rk628_debugfs_dump()
952 rk628_i2c_read(rk628, GRF_SCALER_CON3, &val); in rk628_debugfs_dump()
956 rk628_i2c_read(rk628, GRF_SCALER_CON4, &val); in rk628_debugfs_dump()
960 rk628_i2c_read(rk628, GRF_SCALER_CON5, &val); in rk628_debugfs_dump()
964 rk628_i2c_read(rk628, GRF_SCALER_CON6, &val); in rk628_debugfs_dump()
979 rk628_i2c_read(rk628, GRF_CSC_CTRL_CON, &val); in rk628_debugfs_dump()
1023 rk628_i2c_read(rk628, GRF_SCALER_CON2, &val); in rk628_debugfs_dump()
1037 struct rk628 *rk628 = inode->i_private; in rk628_debugfs_open() local
1039 return single_open(file, rk628_debugfs_dump, rk628); in rk628_debugfs_open()
1056 struct rk628 *rk628; in rk628_i2c_probe() local
1064 rk628 = devm_kzalloc(dev, sizeof(*rk628), GFP_KERNEL); in rk628_i2c_probe()
1065 if (!rk628) in rk628_i2c_probe()
1068 rk628->dev = dev; in rk628_i2c_probe()
1069 rk628->client = client; in rk628_i2c_probe()
1070 i2c_set_clientdata(client, rk628); in rk628_i2c_probe()
1071 rk628->hdmirx_irq = client->irq; in rk628_i2c_probe()
1073 ret = rk628_display_route_info_parse(rk628); 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()
1081 ret = rk628_display_timings_get(rk628); 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()
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()
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()
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()
1148 ret = rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x30002000); in rk628_i2c_probe()
1154 rk628->monitor_wq = alloc_ordered_workqueue("%s", 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()
1161 INIT_DELAYED_WORK(&rk628->dsi_delay_work, rk628_dsi_work); in rk628_i2c_probe()
1164 rk628_cru_init(rk628); in rk628_i2c_probe()
1166 if (rk628->output_mode == OUTPUT_MODE_CSI) in rk628_i2c_probe()
1167 rk628_csi_init(rk628); 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()
1180 IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rk628_hdmirx", rk628); 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()
1193 IRQF_ONESHOT, "rk628", rk628); in rk628_i2c_probe()
1195 dev_err(rk628->dev, "request rk628 irq failed! err:%d\n", in rk628_i2c_probe()
1200 rk628_i2c_write(rk628, GRF_INTR0_EN, 0x01000100); in rk628_i2c_probe()
1201 rk628_display_enable(rk628); in rk628_i2c_probe()
1202 queue_delayed_work(rk628->monitor_wq, &rk628->delay_work, in rk628_i2c_probe()
1206 rk628_display_enable(rk628); in rk628_i2c_probe()
1207 queue_delayed_work(rk628->monitor_wq, &rk628->delay_work, in rk628_i2c_probe()
1211 rk628_display_enable(rk628); in rk628_i2c_probe()
1215 debug_dir = debugfs_create_dir(rk628->dev->driver->name, NULL); in rk628_i2c_probe()
1219 debugfs_create_file("summary", 0400, debug_dir, rk628, &rk628_debugfs_summary_fops); in rk628_i2c_probe()
1226 struct rk628 *rk628 = i2c_get_clientdata(client); in rk628_i2c_remove() local
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()
1244 struct rk628 *rk628 = dev_get_drvdata(dev); in rk628_suspend() local
1246 rk628_display_disable(rk628); in rk628_suspend()
1253 struct rk628 *rk628 = dev_get_drvdata(dev); in rk628_resume() local
1255 rk628_display_resume(rk628); in rk628_resume()