| /* | |
| * ARC PGU DRM driver. | |
| * | |
| * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com) | |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License version 2 as | |
| * published by the Free Software Foundation. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| */ | |
| #include <drm/drm_crtc.h> | |
| #include <drm/drm_encoder_slave.h> | |
| #include "arcpgu.h" | |
| static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = { | |
| .destroy = drm_encoder_cleanup, | |
| }; | |
| int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np) | |
| { | |
| struct drm_encoder *encoder; | |
| struct drm_bridge *bridge; | |
| int ret = 0; | |
| encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL); | |
| if (encoder == NULL) | |
| return -ENOMEM; | |
| /* Locate drm bridge from the hdmi encoder DT node */ | |
| bridge = of_drm_find_bridge(np); | |
| if (!bridge) | |
| return -EPROBE_DEFER; | |
| encoder->possible_crtcs = 1; | |
| encoder->possible_clones = 0; | |
| ret = drm_encoder_init(drm, encoder, &arcpgu_drm_encoder_funcs, | |
| DRM_MODE_ENCODER_TMDS, NULL); | |
| if (ret) | |
| return ret; | |
| /* Link drm_bridge to encoder */ | |
| bridge->encoder = encoder; | |
| encoder->bridge = bridge; | |
| ret = drm_bridge_attach(drm, bridge); | |
| if (ret) | |
| drm_encoder_cleanup(encoder); | |
| return ret; | |
| } |