.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. |
---|
2 | | - * |
---|
3 | | - * This program is free software; you can redistribute it and/or modify |
---|
4 | | - * it under the terms of the GNU General Public License version 2 and |
---|
5 | | - * only version 2 as published by the Free Software Foundation. |
---|
6 | | - * |
---|
7 | | - * This program is distributed in the hope that it will be useful, |
---|
8 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
9 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
10 | | - * GNU General Public License for more details. |
---|
11 | 3 | */ |
---|
12 | 4 | |
---|
13 | 5 | #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ |
---|
.. | .. |
---|
63 | 55 | int dpu_core_irq_idx_lookup(struct dpu_kms *dpu_kms, |
---|
64 | 56 | enum dpu_intr_type intr_type, u32 instance_idx) |
---|
65 | 57 | { |
---|
66 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
---|
67 | | - !dpu_kms->hw_intr->ops.irq_idx_lookup) |
---|
| 58 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.irq_idx_lookup) |
---|
68 | 59 | return -EINVAL; |
---|
69 | 60 | |
---|
70 | 61 | return dpu_kms->hw_intr->ops.irq_idx_lookup(intr_type, |
---|
.. | .. |
---|
81 | 72 | unsigned long irq_flags; |
---|
82 | 73 | int ret = 0, enable_count; |
---|
83 | 74 | |
---|
84 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
---|
| 75 | + if (!dpu_kms->hw_intr || |
---|
85 | 76 | !dpu_kms->irq_obj.enable_counts || |
---|
86 | 77 | !dpu_kms->irq_obj.irq_counts) { |
---|
87 | 78 | DPU_ERROR("invalid params\n"); |
---|
.. | .. |
---|
122 | 113 | { |
---|
123 | 114 | int i, ret = 0, counts; |
---|
124 | 115 | |
---|
125 | | - if (!dpu_kms || !irq_idxs || !irq_count) { |
---|
| 116 | + if (!irq_idxs || !irq_count) { |
---|
126 | 117 | DPU_ERROR("invalid params\n"); |
---|
127 | 118 | return -EINVAL; |
---|
128 | 119 | } |
---|
.. | .. |
---|
146 | 137 | { |
---|
147 | 138 | int ret = 0, enable_count; |
---|
148 | 139 | |
---|
149 | | - if (!dpu_kms || !dpu_kms->hw_intr || !dpu_kms->irq_obj.enable_counts) { |
---|
| 140 | + if (!dpu_kms->hw_intr || !dpu_kms->irq_obj.enable_counts) { |
---|
150 | 141 | DPU_ERROR("invalid params\n"); |
---|
151 | 142 | return -EINVAL; |
---|
152 | 143 | } |
---|
.. | .. |
---|
177 | 168 | { |
---|
178 | 169 | int i, ret = 0, counts; |
---|
179 | 170 | |
---|
180 | | - if (!dpu_kms || !irq_idxs || !irq_count) { |
---|
| 171 | + if (!irq_idxs || !irq_count) { |
---|
181 | 172 | DPU_ERROR("invalid params\n"); |
---|
182 | 173 | return -EINVAL; |
---|
183 | 174 | } |
---|
.. | .. |
---|
194 | 185 | |
---|
195 | 186 | u32 dpu_core_irq_read(struct dpu_kms *dpu_kms, int irq_idx, bool clear) |
---|
196 | 187 | { |
---|
197 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
---|
| 188 | + if (!dpu_kms->hw_intr || |
---|
198 | 189 | !dpu_kms->hw_intr->ops.get_interrupt_status) |
---|
199 | 190 | return 0; |
---|
200 | 191 | |
---|
.. | .. |
---|
213 | 204 | { |
---|
214 | 205 | unsigned long irq_flags; |
---|
215 | 206 | |
---|
216 | | - if (!dpu_kms || !dpu_kms->irq_obj.irq_cb_tbl) { |
---|
| 207 | + if (!dpu_kms->irq_obj.irq_cb_tbl) { |
---|
217 | 208 | DPU_ERROR("invalid params\n"); |
---|
218 | 209 | return -EINVAL; |
---|
219 | 210 | } |
---|
.. | .. |
---|
248 | 239 | { |
---|
249 | 240 | unsigned long irq_flags; |
---|
250 | 241 | |
---|
251 | | - if (!dpu_kms || !dpu_kms->irq_obj.irq_cb_tbl) { |
---|
| 242 | + if (!dpu_kms->irq_obj.irq_cb_tbl) { |
---|
252 | 243 | DPU_ERROR("invalid params\n"); |
---|
253 | 244 | return -EINVAL; |
---|
254 | 245 | } |
---|
.. | .. |
---|
282 | 273 | |
---|
283 | 274 | static void dpu_clear_all_irqs(struct dpu_kms *dpu_kms) |
---|
284 | 275 | { |
---|
285 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
---|
286 | | - !dpu_kms->hw_intr->ops.clear_all_irqs) |
---|
| 276 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.clear_all_irqs) |
---|
287 | 277 | return; |
---|
288 | 278 | |
---|
289 | 279 | dpu_kms->hw_intr->ops.clear_all_irqs(dpu_kms->hw_intr); |
---|
.. | .. |
---|
291 | 281 | |
---|
292 | 282 | static void dpu_disable_all_irqs(struct dpu_kms *dpu_kms) |
---|
293 | 283 | { |
---|
294 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
---|
295 | | - !dpu_kms->hw_intr->ops.disable_all_irqs) |
---|
| 284 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.disable_all_irqs) |
---|
296 | 285 | return; |
---|
297 | 286 | |
---|
298 | 287 | dpu_kms->hw_intr->ops.disable_all_irqs(dpu_kms->hw_intr); |
---|
299 | 288 | } |
---|
300 | 289 | |
---|
301 | 290 | #ifdef CONFIG_DEBUG_FS |
---|
302 | | -#define DEFINE_DPU_DEBUGFS_SEQ_FOPS(__prefix) \ |
---|
303 | | -static int __prefix ## _open(struct inode *inode, struct file *file) \ |
---|
304 | | -{ \ |
---|
305 | | - return single_open(file, __prefix ## _show, inode->i_private); \ |
---|
306 | | -} \ |
---|
307 | | -static const struct file_operations __prefix ## _fops = { \ |
---|
308 | | - .owner = THIS_MODULE, \ |
---|
309 | | - .open = __prefix ## _open, \ |
---|
310 | | - .release = single_release, \ |
---|
311 | | - .read = seq_read, \ |
---|
312 | | - .llseek = seq_lseek, \ |
---|
313 | | -} |
---|
314 | | - |
---|
315 | 291 | static int dpu_debugfs_core_irq_show(struct seq_file *s, void *v) |
---|
316 | 292 | { |
---|
317 | 293 | struct dpu_irq *irq_obj = s->private; |
---|
.. | .. |
---|
319 | 295 | unsigned long irq_flags; |
---|
320 | 296 | int i, irq_count, enable_count, cb_count; |
---|
321 | 297 | |
---|
322 | | - if (!irq_obj || !irq_obj->enable_counts || !irq_obj->irq_cb_tbl) { |
---|
323 | | - DPU_ERROR("invalid parameters\n"); |
---|
| 298 | + if (WARN_ON(!irq_obj->enable_counts || !irq_obj->irq_cb_tbl)) |
---|
324 | 299 | return 0; |
---|
325 | | - } |
---|
326 | 300 | |
---|
327 | 301 | for (i = 0; i < irq_obj->total_irqs; i++) { |
---|
328 | 302 | spin_lock_irqsave(&irq_obj->cb_lock, irq_flags); |
---|
.. | .. |
---|
341 | 315 | return 0; |
---|
342 | 316 | } |
---|
343 | 317 | |
---|
344 | | -DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_core_irq); |
---|
| 318 | +DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_core_irq); |
---|
345 | 319 | |
---|
346 | | -int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
---|
| 320 | +void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
---|
347 | 321 | struct dentry *parent) |
---|
348 | 322 | { |
---|
349 | | - dpu_kms->irq_obj.debugfs_file = debugfs_create_file("core_irq", 0600, |
---|
350 | | - parent, &dpu_kms->irq_obj, |
---|
351 | | - &dpu_debugfs_core_irq_fops); |
---|
352 | | - |
---|
353 | | - return 0; |
---|
354 | | -} |
---|
355 | | - |
---|
356 | | -void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms) |
---|
357 | | -{ |
---|
358 | | - debugfs_remove(dpu_kms->irq_obj.debugfs_file); |
---|
359 | | - dpu_kms->irq_obj.debugfs_file = NULL; |
---|
360 | | -} |
---|
361 | | - |
---|
362 | | -#else |
---|
363 | | -int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
---|
364 | | - struct dentry *parent) |
---|
365 | | -{ |
---|
366 | | - return 0; |
---|
367 | | -} |
---|
368 | | - |
---|
369 | | -void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms) |
---|
370 | | -{ |
---|
| 323 | + debugfs_create_file("core_irq", 0600, parent, &dpu_kms->irq_obj, |
---|
| 324 | + &dpu_debugfs_core_irq_fops); |
---|
371 | 325 | } |
---|
372 | 326 | #endif |
---|
373 | 327 | |
---|
374 | 328 | void dpu_core_irq_preinstall(struct dpu_kms *dpu_kms) |
---|
375 | 329 | { |
---|
376 | | - struct msm_drm_private *priv; |
---|
377 | 330 | int i; |
---|
378 | | - |
---|
379 | | - if (!dpu_kms) { |
---|
380 | | - DPU_ERROR("invalid dpu_kms\n"); |
---|
381 | | - return; |
---|
382 | | - } else if (!dpu_kms->dev) { |
---|
383 | | - DPU_ERROR("invalid drm device\n"); |
---|
384 | | - return; |
---|
385 | | - } else if (!dpu_kms->dev->dev_private) { |
---|
386 | | - DPU_ERROR("invalid device private\n"); |
---|
387 | | - return; |
---|
388 | | - } |
---|
389 | | - priv = dpu_kms->dev->dev_private; |
---|
390 | 331 | |
---|
391 | 332 | pm_runtime_get_sync(&dpu_kms->pdev->dev); |
---|
392 | 333 | dpu_clear_all_irqs(dpu_kms); |
---|
.. | .. |
---|
410 | 351 | } |
---|
411 | 352 | } |
---|
412 | 353 | |
---|
413 | | -int dpu_core_irq_postinstall(struct dpu_kms *dpu_kms) |
---|
414 | | -{ |
---|
415 | | - return 0; |
---|
416 | | -} |
---|
417 | | - |
---|
418 | 354 | void dpu_core_irq_uninstall(struct dpu_kms *dpu_kms) |
---|
419 | 355 | { |
---|
420 | | - struct msm_drm_private *priv; |
---|
421 | 356 | int i; |
---|
422 | | - |
---|
423 | | - if (!dpu_kms) { |
---|
424 | | - DPU_ERROR("invalid dpu_kms\n"); |
---|
425 | | - return; |
---|
426 | | - } else if (!dpu_kms->dev) { |
---|
427 | | - DPU_ERROR("invalid drm device\n"); |
---|
428 | | - return; |
---|
429 | | - } else if (!dpu_kms->dev->dev_private) { |
---|
430 | | - DPU_ERROR("invalid device private\n"); |
---|
431 | | - return; |
---|
432 | | - } |
---|
433 | | - priv = dpu_kms->dev->dev_private; |
---|
434 | 357 | |
---|
435 | 358 | pm_runtime_get_sync(&dpu_kms->pdev->dev); |
---|
436 | 359 | for (i = 0; i < dpu_kms->irq_obj.total_irqs; i++) |
---|