1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2018, 2020-2021 The Linux Foundation. All rights reserved.
4 * Copyright (C) 2013 Red Hat
8 #include <linux/interconnect.h>
17 struct clk *msm_clk_bulk_get_clock(struct clk_bulk_data *bulk, int count,
23 snprintf(n, sizeof(n), "%s_clk", name);
25 for (i = 0; bulk && i < count; i++) {
26 if (!strcmp(bulk[i].id, name) || !strcmp(bulk[i].id, n))
34 struct clk *msm_clk_get(struct platform_device *pdev, const char *name)
39 clk = devm_clk_get(&pdev->dev, name);
40 if (!IS_ERR(clk) || PTR_ERR(clk) == -EPROBE_DEFER)
43 snprintf(name2, sizeof(name2), "%s_clk", name);
45 clk = devm_clk_get(&pdev->dev, name2);
47 dev_warn(&pdev->dev, "Using legacy clk name binding. Use "
48 "\"%s\" instead of \"%s\"\n", name, name2);
53 void __iomem *msm_ioremap_mdss(struct platform_device *mdss_pdev,
54 struct platform_device *pdev,
59 res = platform_get_resource_byname(mdss_pdev, IORESOURCE_MEM, name);
61 return ERR_PTR(-EINVAL);
63 return devm_ioremap_resource(&pdev->dev, res);
66 static void __iomem *_msm_ioremap(struct platform_device *pdev, const char *name,
67 bool quiet, phys_addr_t *psize)
74 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
76 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
80 DRM_DEV_ERROR(&pdev->dev, "failed to get memory resource: %s\n", name);
81 return ERR_PTR(-EINVAL);
84 size = resource_size(res);
86 ptr = devm_ioremap(&pdev->dev, res->start, size);
89 DRM_DEV_ERROR(&pdev->dev, "failed to ioremap: %s\n", name);
90 return ERR_PTR(-ENOMEM);
99 void __iomem *msm_ioremap(struct platform_device *pdev, const char *name)
101 return _msm_ioremap(pdev, name, false, NULL);
104 void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name)
106 return _msm_ioremap(pdev, name, true, NULL);
109 void __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name,
112 return _msm_ioremap(pdev, name, false, psize);
115 static enum hrtimer_restart msm_hrtimer_worktimer(struct hrtimer *t)
117 struct msm_hrtimer_work *work = container_of(t,
118 struct msm_hrtimer_work, timer);
120 kthread_queue_work(work->worker, &work->work);
122 return HRTIMER_NORESTART;
125 void msm_hrtimer_queue_work(struct msm_hrtimer_work *work,
127 enum hrtimer_mode mode)
129 hrtimer_start(&work->timer, wakeup_time, mode);
132 void msm_hrtimer_work_init(struct msm_hrtimer_work *work,
133 struct kthread_worker *worker,
134 kthread_work_func_t fn,
136 enum hrtimer_mode mode)
138 hrtimer_init(&work->timer, clock_id, mode);
139 work->timer.function = msm_hrtimer_worktimer;
140 work->worker = worker;
141 kthread_init_work(&work->work, fn);
144 struct icc_path *msm_icc_get(struct device *dev, const char *name)
146 struct device *mdss_dev = dev->parent;
147 struct icc_path *path;
149 path = of_icc_get(dev, name);
154 * If there are no interconnects attached to the corresponding device
155 * node, of_icc_get() will return NULL.
157 * If the MDP5/DPU device node doesn't have interconnects, lookup the
158 * path in the parent (MDSS) device.
160 return of_icc_get(mdss_dev, name);