Lines Matching +full:rockchip +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) Rockchip Electronics Co., Ltd.
4 * Author:Mark Yao <mark.yao@rock-chips.com>
10 #include <linux/dma-mapping.h>
29 #include <asm/dma-iommu.h>
40 #define DRIVER_NAME "rockchip"
41 #define DRIVER_DESC "RockChip Soc DRM"
48 * Attach a (component) device to the shared drm dma mapping from master drm
49 * device. This is used by the VOPs to map GEM buffers to a common DMA
53 struct device *dev) in rockchip_drm_dma_attach_device()
55 struct rockchip_drm_private *private = drm_dev->dev_private; in rockchip_drm_dma_attach_device()
58 if (!private->domain) in rockchip_drm_dma_attach_device()
70 ret = iommu_attach_device(private->domain, dev); in rockchip_drm_dma_attach_device()
72 DRM_DEV_ERROR(dev, "Failed to attach iommu device\n"); in rockchip_drm_dma_attach_device()
80 struct device *dev) in rockchip_drm_dma_detach_device()
82 struct rockchip_drm_private *private = drm_dev->dev_private; in rockchip_drm_dma_detach_device()
84 if (!private->domain) in rockchip_drm_dma_detach_device()
87 iommu_detach_device(private->domain, dev); in rockchip_drm_dma_detach_device()
91 struct device *dev) in rockchip_drm_dma_init_device()
93 struct rockchip_drm_private *private = drm_dev->dev_private; in rockchip_drm_dma_init_device()
96 private->iommu_dev = ERR_PTR(-ENODEV); in rockchip_drm_dma_init_device()
97 else if (!private->iommu_dev) in rockchip_drm_dma_init_device()
98 private->iommu_dev = dev; in rockchip_drm_dma_init_device()
103 struct rockchip_drm_private *private = drm_dev->dev_private; in rockchip_drm_init_iommu()
108 if (IS_ERR_OR_NULL(private->iommu_dev)) in rockchip_drm_init_iommu()
111 private->domain = iommu_paging_domain_alloc(private->iommu_dev); in rockchip_drm_init_iommu()
112 if (IS_ERR(private->domain)) { in rockchip_drm_init_iommu()
113 ret = PTR_ERR(private->domain); in rockchip_drm_init_iommu()
114 private->domain = NULL; in rockchip_drm_init_iommu()
118 geometry = &private->domain->geometry; in rockchip_drm_init_iommu()
119 start = geometry->aperture_start; in rockchip_drm_init_iommu()
120 end = geometry->aperture_end; in rockchip_drm_init_iommu()
122 DRM_DEBUG("IOMMU context initialized (aperture: %#llx-%#llx)\n", in rockchip_drm_init_iommu()
124 drm_mm_init(&private->mm, start, end - start + 1); in rockchip_drm_init_iommu()
125 mutex_init(&private->mm_lock); in rockchip_drm_init_iommu()
132 struct rockchip_drm_private *private = drm_dev->dev_private; in rockchip_iommu_cleanup()
134 if (!private->domain) in rockchip_iommu_cleanup()
137 drm_mm_takedown(&private->mm); in rockchip_iommu_cleanup()
138 iommu_domain_free(private->domain); in rockchip_iommu_cleanup()
141 static int rockchip_drm_bind(struct device *dev) in rockchip_drm_bind()
151 "Failed to remove existing framebuffers - %d.\n", in rockchip_drm_bind()
162 private = devm_kzalloc(drm_dev->dev, sizeof(*private), GFP_KERNEL); in rockchip_drm_bind()
164 ret = -ENOMEM; in rockchip_drm_bind()
168 drm_dev->dev_private = private; in rockchip_drm_bind()
185 ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc); in rockchip_drm_bind()
212 static void rockchip_drm_unbind(struct device *dev) in rockchip_drm_unbind()
242 static int rockchip_drm_sys_suspend(struct device *dev) in rockchip_drm_sys_suspend()
249 static int rockchip_drm_sys_resume(struct device *dev) in rockchip_drm_sys_resume()
271 * @np: The encoder device node
284 return -ENOENT; in rockchip_drm_encoder_set_crtc_endpoint_id()
288 return -ENOENT; in rockchip_drm_encoder_set_crtc_endpoint_id()
294 rkencoder->crtc_endpoint_id = ep.id; in rockchip_drm_encoder_set_crtc_endpoint_id()
300 * Check if a vop endpoint is leading to a rockchip subdriver or bridge.
304 * @ep: endpoint of a rockchip vop
306 * returns true if subdriver, false if external bridge and -ENODEV
307 * if remote port does not contain a device.
317 return -ENODEV; in rockchip_drm_endpoint_is_subdriver()
319 /* status disabled will prevent creation of platform-devices */ in rockchip_drm_endpoint_is_subdriver()
322 return -ENODEV; in rockchip_drm_endpoint_is_subdriver()
328 /* enabled non-platform-devices can immediately return here */ in rockchip_drm_endpoint_is_subdriver()
333 * All rockchip subdrivers have probed at this point, so in rockchip_drm_endpoint_is_subdriver()
334 * any device not having a driver now is an external bridge. in rockchip_drm_endpoint_is_subdriver()
336 drv = pdev->dev.driver; in rockchip_drm_endpoint_is_subdriver()
353 static void rockchip_drm_match_remove(struct device *dev) in rockchip_drm_match_remove()
357 list_for_each_entry(link, &dev->links.consumers, s_node) in rockchip_drm_match_remove()
363 "rockchip,rk3399-vop-big",
367 static struct component_match *rockchip_drm_match_add(struct device *dev) in rockchip_drm_match_add()
373 /* add preferred vop device match before adding driver device matches */ in rockchip_drm_match_add()
375 port = of_parse_phandle(dev->of_node, "ports", i); in rockchip_drm_match_add()
379 if (of_device_is_available(port->parent) && in rockchip_drm_match_add()
380 of_device_compatible_match(port->parent, in rockchip_drm_match_add()
384 port->parent); in rockchip_drm_match_add()
391 struct device *p = NULL, *d; in rockchip_drm_match_add()
394 d = platform_find_device_by_driver(p, &drv->driver); in rockchip_drm_match_add()
409 return match ?: ERR_PTR(-ENODEV); in rockchip_drm_match_add()
417 static int rockchip_drm_platform_of_probe(struct device *dev) in rockchip_drm_platform_of_probe()
419 struct device_node *np = dev->of_node; in rockchip_drm_platform_of_probe()
425 return -ENODEV; in rockchip_drm_platform_of_probe()
432 if (!of_device_is_available(port->parent)) { in rockchip_drm_platform_of_probe()
443 return -ENODEV; in rockchip_drm_platform_of_probe()
448 "No available vop found for display-subsystem.\n"); in rockchip_drm_platform_of_probe()
449 return -ENODEV; in rockchip_drm_platform_of_probe()
457 struct device *dev = &pdev->dev; in rockchip_drm_platform_probe()
480 component_master_del(&pdev->dev, &rockchip_drm_ops); in rockchip_drm_platform_remove()
482 rockchip_drm_match_remove(&pdev->dev); in rockchip_drm_platform_remove()
493 { .compatible = "rockchip,display-subsystem", },
503 .name = "rockchip-drm",
520 return -ENODEV; in rockchip_drm_init()
570 MODULE_AUTHOR("Mark Yao <mark.yao@rock-chips.com>");
571 MODULE_DESCRIPTION("ROCKCHIP DRM Driver");