static int hdmi_s_power(struct v4l2_subdev *sd, int on) { struct hdmi_device *hdev = sd_to_hdmi_dev(sd); /* If runtime PM is not implemented, hdmi_runtime_resume * and hdmi_runtime_suspend functions are directly called. */ #ifdef CONFIG_PM_RUNTIME int ret; if (on) { clk_enable(hdev->res.hdmi); hdmi_hpd_enable(hdev, 1); ret = pm_runtime_get_sync(hdev->dev); set_internal_hpd_int(hdev); } else { hdmi_hpd_enable(hdev, 0); set_external_hpd_int(hdev); ret = pm_runtime_put_sync(hdev->dev); clk_disable(hdev->res.hdmi); } /* only values < 0 indicate errors */ return IS_ERR_VALUE(ret) ? ret : 0; #else if (on) hdmi_runtime_resume(hdev->dev); else hdmi_runtime_suspend(hdev->dev); return 0; #endif }
static int hdmi_s_power(struct v4l2_subdev *sd, int on) { struct hdmi_device *hdev = sd_to_hdmi_dev(sd); int ret = 0; /* If runtime PM is not implemented, hdmi_runtime_resume * and hdmi_runtime_suspend functions are directly called. */ if (on) { clk_enable(hdev->res.hdmi); #ifdef CONFIG_PM_RUNTIME ret = pm_runtime_get_sync(hdev->dev); #else hdmi_runtime_resume(hdev->dev); #endif disable_irq(hdev->ext_irq); cancel_delayed_work_sync(&hdev->hpd_work_ext); s5p_v4l2_int_src_hdmi_hpd(); hdmi_hpd_enable(hdev, 1); hdmi_hpd_clear_int(hdev); enable_irq(hdev->int_irq); dev_info(hdev->dev, "HDMI interrupt changed to internal\n"); } else { cancel_work_sync(&hdev->work); hdmi_hpd_enable(hdev, 0); disable_irq(hdev->int_irq); cancel_work_sync(&hdev->hpd_work); s5p_v4l2_int_src_ext_hpd(); enable_irq(hdev->ext_irq); dev_info(hdev->dev, "HDMI interrupt changed to external\n"); #ifdef CONFIG_PM_RUNTIME ret = pm_runtime_put_sync(hdev->dev); #else hdmi_runtime_suspend(hdev->dev); #endif clk_disable(hdev->res.hdmi); } /* only values < 0 indicate errors */ return IS_ERR_VALUE(ret) ? ret : 0; }