92ecf120ba0830416f874017c2a00f3eb85ef041
[openwrt/staging/stintel.git] / target / linux / brcm2708 / patches-4.19 / 950-0634-drivers-char-Use-correct-name-for-the-Raspberry-Pi-v.patch
1 From 6c8c9ca56ce6039ade09d26c069132538e4de9f0 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Sun, 28 Jul 2019 22:22:36 +0100
4 Subject: [PATCH] drivers: char: Use correct name for the Raspberry Pi
5 video decoder
6
7 Replace the old code name with a more appropriate name - RPiVid.
8
9 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
10 ---
11 arch/arm/boot/dts/bcm2838.dtsi | 10 +-
12 drivers/char/broadcom/Kconfig | 8 +-
13 drivers/char/broadcom/Makefile | 2 +-
14 .../broadcom/{argon-mem.c => rpivid-mem.c} | 105 +++++++++---------
15 drivers/mfd/bcm2835-pm.c | 12 +-
16 drivers/soc/bcm/bcm2835-power.c | 6 +-
17 include/linux/mfd/bcm2835-pm.h | 2 +-
18 8 files changed, 71 insertions(+), 76 deletions(-)
19 rename drivers/char/broadcom/{argon-mem.c => rpivid-mem.c} (69%)
20
21 --- a/arch/arm/boot/dts/bcm2838.dtsi
22 +++ b/arch/arm/boot/dts/bcm2838.dtsi
23 @@ -409,26 +409,26 @@
24 };
25
26 hevc-decoder@7eb00000 {
27 - compatible = "raspberrypi,argon-hevc-decoder";
28 + compatible = "raspberrypi,rpivid-hevc-decoder";
29 reg = <0x0 0x7eb00000 0x10000>;
30 status = "okay";
31 };
32
33 - argon-local-intc@7eb10000 {
34 - compatible = "raspberrypi,argon-local-intc";
35 + rpivid-local-intc@7eb10000 {
36 + compatible = "raspberrypi,rpivid-local-intc";
37 reg = <0x0 0x7eb10000 0x1000>;
38 status = "okay";
39 interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
40 };
41
42 h264-decoder@7eb20000 {
43 - compatible = "raspberrypi,argon-h264-decoder";
44 + compatible = "raspberrypi,rpivid-h264-decoder";
45 reg = <0x0 0x7eb20000 0x10000>;
46 status = "okay";
47 };
48
49 vp9-decoder@7eb30000 {
50 - compatible = "raspberrypi,argon-vp9-decoder";
51 + compatible = "raspberrypi,rpivid-vp9-decoder";
52 reg = <0x0 0x7eb30000 0x10000>;
53 status = "okay";
54 };
55 --- a/drivers/char/broadcom/Kconfig
56 +++ b/drivers/char/broadcom/Kconfig
57 @@ -50,10 +50,10 @@ config BCM2835_SMI_DEV
58 Broadcom's Secondary Memory interface. The low-level functionality is provided
59 by the SMI driver itself.
60
61 -config ARGON_MEM
62 - tristate "Character device driver for the Argon decoder hardware"
63 +config RPIVID_MEM
64 + tristate "Character device driver for the Raspberry Pi RPIVid video decoder hardware"
65 default n
66 help
67 This driver provides a character device interface for memory-map operations
68 - so userspace tools can access the control and status registers of the Argon
69 - video decoder hardware.
70 + so userspace tools can access the control and status registers of the
71 + Raspberry Pi RPiVid video decoder hardware.
72 --- a/drivers/char/broadcom/Makefile
73 +++ b/drivers/char/broadcom/Makefile
74 @@ -4,4 +4,4 @@ obj-$(CONFIG_BCM_VC_SM) += vc_sm
75
76 obj-$(CONFIG_BCM2835_DEVGPIOMEM)+= bcm2835-gpiomem.o
77 obj-$(CONFIG_BCM2835_SMI_DEV) += bcm2835_smi_dev.o
78 -obj-$(CONFIG_ARGON_MEM) += argon-mem.o
79 +obj-$(CONFIG_RPIVID_MEM) += rpivid-mem.o
80 --- a/drivers/char/broadcom/argon-mem.c
81 +++ /dev/null
82 @@ -1,277 +0,0 @@
83 -/**
84 - * argon-mem.c - character device access to the Argon decoder registers
85 - *
86 - * Based on bcm2835-gpiomem.c. Provides IO memory access to the decoder
87 - * register blocks such that ffmpeg plugins can access the hardware.
88 - *
89 - * Jonathan Bell <jonathan@raspberrypi.org>
90 - * Copyright (c) 2019, Raspberry Pi (Trading) Ltd.
91 - *
92 - * Redistribution and use in source and binary forms, with or without
93 - * modification, are permitted provided that the following conditions
94 - * are met:
95 - * 1. Redistributions of source code must retain the above copyright
96 - * notice, this list of conditions, and the following disclaimer,
97 - * without modification.
98 - * 2. Redistributions in binary form must reproduce the above copyright
99 - * notice, this list of conditions and the following disclaimer in the
100 - * documentation and/or other materials provided with the distribution.
101 - * 3. The names of the above-listed copyright holders may not be used
102 - * to endorse or promote products derived from this software without
103 - * specific prior written permission.
104 - *
105 - * ALTERNATIVELY, this software may be distributed under the terms of the
106 - * GNU General Public License ("GPL") version 2, as published by the Free
107 - * Software Foundation.
108 - *
109 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
110 - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
111 - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
112 - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
113 - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
114 - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
115 - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
116 - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
117 - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
118 - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
119 - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
120 - */
121 -
122 -#include <linux/kernel.h>
123 -#include <linux/module.h>
124 -#include <linux/of.h>
125 -#include <linux/of_device.h>
126 -#include <linux/platform_device.h>
127 -#include <linux/mm.h>
128 -#include <linux/slab.h>
129 -#include <linux/cdev.h>
130 -#include <linux/pagemap.h>
131 -#include <linux/io.h>
132 -
133 -#define DRIVER_NAME "argon-mem"
134 -#define DEVICE_MINOR 0
135 -
136 -struct argon_mem_priv {
137 - dev_t devid;
138 - struct class *class;
139 - struct cdev argon_mem_cdev;
140 - unsigned long regs_phys;
141 - unsigned long mem_window_len;
142 - struct device *dev;
143 - const char *name;
144 -};
145 -
146 -static int argon_mem_open(struct inode *inode, struct file *file)
147 -{
148 - int dev = iminor(inode);
149 - int ret = 0;
150 - struct argon_mem_priv *priv;
151 - if (dev != DEVICE_MINOR)
152 - ret = -ENXIO;
153 -
154 - priv = container_of(inode->i_cdev, struct argon_mem_priv,
155 - argon_mem_cdev);
156 - if (!priv)
157 - return -EINVAL;
158 - file->private_data = priv;
159 - return ret;
160 -}
161 -
162 -static int argon_mem_release(struct inode *inode, struct file *file)
163 -{
164 - int dev = iminor(inode);
165 - int ret = 0;
166 -
167 - if (dev != DEVICE_MINOR)
168 - ret = -ENXIO;
169 -
170 - return ret;
171 -}
172 -
173 -static const struct vm_operations_struct argon_mem_vm_ops = {
174 -#ifdef CONFIG_HAVE_IOREMAP_PROT
175 - .access = generic_access_phys
176 -#endif
177 -};
178 -
179 -static int argon_mem_mmap(struct file *file, struct vm_area_struct *vma)
180 -{
181 - struct argon_mem_priv *priv;
182 - unsigned long pages;
183 -
184 - priv = file->private_data;
185 - pages = priv->regs_phys >> PAGE_SHIFT;
186 - /*
187 - * The address decode is far larger than the actual number of registers.
188 - * Just map the whole lot in.
189 - */
190 - vma->vm_page_prot = phys_mem_access_prot(file, pages,
191 - priv->mem_window_len,
192 - vma->vm_page_prot);
193 - vma->vm_ops = &argon_mem_vm_ops;
194 - if (remap_pfn_range(vma, vma->vm_start,
195 - pages,
196 - priv->mem_window_len,
197 - vma->vm_page_prot)) {
198 - return -EAGAIN;
199 - }
200 - return 0;
201 -}
202 -
203 -static const struct file_operations
204 -argon_mem_fops = {
205 - .owner = THIS_MODULE,
206 - .open = argon_mem_open,
207 - .release = argon_mem_release,
208 - .mmap = argon_mem_mmap,
209 -};
210 -
211 -static const struct of_device_id argon_mem_of_match[];
212 -static int argon_mem_probe(struct platform_device *pdev)
213 -{
214 - int err;
215 - void *ptr_err;
216 - const struct of_device_id *id;
217 - struct device *dev = &pdev->dev;
218 - struct device *argon_mem_dev;
219 - struct resource *ioresource;
220 - struct argon_mem_priv *priv;
221 -
222 -
223 - /* Allocate buffers and instance data */
224 -
225 - priv = kzalloc(sizeof(struct argon_mem_priv), GFP_KERNEL);
226 -
227 - if (!priv) {
228 - err = -ENOMEM;
229 - goto failed_inst_alloc;
230 - }
231 - platform_set_drvdata(pdev, priv);
232 -
233 - priv->dev = dev;
234 - id = of_match_device(argon_mem_of_match, dev);
235 - if (!id)
236 - return -EINVAL;
237 - priv->name = id->data;
238 -
239 - ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
240 - if (ioresource) {
241 - priv->regs_phys = ioresource->start;
242 - priv->mem_window_len = ioresource->end - ioresource->start;
243 - } else {
244 - dev_err(priv->dev, "failed to get IO resource");
245 - err = -ENOENT;
246 - goto failed_get_resource;
247 - }
248 -
249 - /* Create character device entries */
250 -
251 - err = alloc_chrdev_region(&priv->devid,
252 - DEVICE_MINOR, 1, priv->name);
253 - if (err != 0) {
254 - dev_err(priv->dev, "unable to allocate device number");
255 - goto failed_alloc_chrdev;
256 - }
257 - cdev_init(&priv->argon_mem_cdev, &argon_mem_fops);
258 - priv->argon_mem_cdev.owner = THIS_MODULE;
259 - err = cdev_add(&priv->argon_mem_cdev, priv->devid, 1);
260 - if (err != 0) {
261 - dev_err(priv->dev, "unable to register device");
262 - goto failed_cdev_add;
263 - }
264 -
265 - /* Create sysfs entries */
266 -
267 - priv->class = class_create(THIS_MODULE, priv->name);
268 - ptr_err = priv->class;
269 - if (IS_ERR(ptr_err))
270 - goto failed_class_create;
271 -
272 - argon_mem_dev = device_create(priv->class, NULL,
273 - priv->devid, NULL,
274 - priv->name);
275 - ptr_err = argon_mem_dev;
276 - if (IS_ERR(ptr_err))
277 - goto failed_device_create;
278 -
279 - dev_info(priv->dev, "%s initialised: Registers at 0x%08lx length 0x%08lx",
280 - priv->name, priv->regs_phys, priv->mem_window_len);
281 -
282 - return 0;
283 -
284 -failed_device_create:
285 - class_destroy(priv->class);
286 -failed_class_create:
287 - cdev_del(&priv->argon_mem_cdev);
288 - err = PTR_ERR(ptr_err);
289 -failed_cdev_add:
290 - unregister_chrdev_region(priv->devid, 1);
291 -failed_alloc_chrdev:
292 -failed_get_resource:
293 - kfree(priv);
294 -failed_inst_alloc:
295 - dev_err(priv->dev, "could not load argon_mem");
296 - return err;
297 -}
298 -
299 -static int argon_mem_remove(struct platform_device *pdev)
300 -{
301 - struct device *dev = &pdev->dev;
302 - struct argon_mem_priv *priv = platform_get_drvdata(pdev);
303 -
304 - device_destroy(priv->class, priv->devid);
305 - class_destroy(priv->class);
306 - cdev_del(&priv->argon_mem_cdev);
307 - unregister_chrdev_region(priv->devid, 1);
308 - kfree(priv);
309 -
310 - dev_info(dev, "%s driver removed - OK", priv->name);
311 - return 0;
312 -}
313 -
314 -static const char argon_hevc_name[] = "argon-hevcmem";
315 -static const char argon_h264_name[] = "argon-h264mem";
316 -static const char argon_vp9_name[] = "argon-vp9mem";
317 -static const char argon_intc_name[] = "argon-intcmem";
318 -
319 -static const struct of_device_id argon_mem_of_match[] = {
320 - {
321 - .compatible = "raspberrypi,argon-hevc-decoder",
322 - .data = &argon_hevc_name,
323 - },
324 - {
325 - .compatible = "raspberrypi,argon-h264-decoder",
326 - .data = &argon_h264_name,
327 - },
328 - {
329 - .compatible = "raspberrypi,argon-vp9-decoder",
330 - .data = &argon_vp9_name,
331 - },
332 - /* The "intc" is included as this block of hardware contains the
333 - * "frame done" status flags.
334 - */
335 - {
336 - .compatible = "raspberrypi,argon-local-intc",
337 - .data = &argon_intc_name,
338 - },
339 - { /* sentinel */ },
340 -};
341 -
342 -MODULE_DEVICE_TABLE(of, argon_mem_of_match);
343 -
344 -static struct platform_driver argon_mem_driver = {
345 - .probe = argon_mem_probe,
346 - .remove = argon_mem_remove,
347 - .driver = {
348 - .name = DRIVER_NAME,
349 - .owner = THIS_MODULE,
350 - .of_match_table = argon_mem_of_match,
351 - },
352 -};
353 -
354 -module_platform_driver(argon_mem_driver);
355 -
356 -MODULE_ALIAS("platform:argon-mem");
357 -MODULE_LICENSE("GPL");
358 -MODULE_DESCRIPTION("Driver for accessing Argon decoder registers from userspace");
359 -MODULE_AUTHOR("Jonathan Bell <jonathan@raspberrypi.org>");
360 --- /dev/null
361 +++ b/drivers/char/broadcom/rpivid-mem.c
362 @@ -0,0 +1,272 @@
363 +/**
364 + * rpivid-mem.c - character device access to the RPiVid decoder registers
365 + *
366 + * Based on bcm2835-gpiomem.c. Provides IO memory access to the decoder
367 + * register blocks such that ffmpeg plugins can access the hardware.
368 + *
369 + * Jonathan Bell <jonathan@raspberrypi.org>
370 + * Copyright (c) 2019, Raspberry Pi (Trading) Ltd.
371 + *
372 + * Redistribution and use in source and binary forms, with or without
373 + * modification, are permitted provided that the following conditions
374 + * are met:
375 + * 1. Redistributions of source code must retain the above copyright
376 + * notice, this list of conditions, and the following disclaimer,
377 + * without modification.
378 + * 2. Redistributions in binary form must reproduce the above copyright
379 + * notice, this list of conditions and the following disclaimer in the
380 + * documentation and/or other materials provided with the distribution.
381 + * 3. The names of the above-listed copyright holders may not be used
382 + * to endorse or promote products derived from this software without
383 + * specific prior written permission.
384 + *
385 + * ALTERNATIVELY, this software may be distributed under the terms of the
386 + * GNU General Public License ("GPL") version 2, as published by the Free
387 + * Software Foundation.
388 + *
389 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
390 + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
391 + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
392 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
393 + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
394 + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
395 + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
396 + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
397 + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
398 + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
399 + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
400 + */
401 +
402 +#include <linux/kernel.h>
403 +#include <linux/module.h>
404 +#include <linux/of.h>
405 +#include <linux/of_device.h>
406 +#include <linux/platform_device.h>
407 +#include <linux/mm.h>
408 +#include <linux/slab.h>
409 +#include <linux/cdev.h>
410 +#include <linux/pagemap.h>
411 +#include <linux/io.h>
412 +
413 +#define DRIVER_NAME "rpivid-mem"
414 +#define DEVICE_MINOR 0
415 +
416 +struct rpivid_mem_priv {
417 + dev_t devid;
418 + struct class *class;
419 + struct cdev rpivid_mem_cdev;
420 + unsigned long regs_phys;
421 + unsigned long mem_window_len;
422 + struct device *dev;
423 + const char *name;
424 +};
425 +
426 +static int rpivid_mem_open(struct inode *inode, struct file *file)
427 +{
428 + int dev = iminor(inode);
429 + int ret = 0;
430 + struct rpivid_mem_priv *priv;
431 + if (dev != DEVICE_MINOR)
432 + ret = -ENXIO;
433 +
434 + priv = container_of(inode->i_cdev, struct rpivid_mem_priv,
435 + rpivid_mem_cdev);
436 + if (!priv)
437 + return -EINVAL;
438 + file->private_data = priv;
439 + return ret;
440 +}
441 +
442 +static int rpivid_mem_release(struct inode *inode, struct file *file)
443 +{
444 + int dev = iminor(inode);
445 + int ret = 0;
446 +
447 + if (dev != DEVICE_MINOR)
448 + ret = -ENXIO;
449 +
450 + return ret;
451 +}
452 +
453 +static const struct vm_operations_struct rpivid_mem_vm_ops = {
454 +#ifdef CONFIG_HAVE_IOREMAP_PROT
455 + .access = generic_access_phys
456 +#endif
457 +};
458 +
459 +static int rpivid_mem_mmap(struct file *file, struct vm_area_struct *vma)
460 +{
461 + struct rpivid_mem_priv *priv;
462 + unsigned long pages;
463 +
464 + priv = file->private_data;
465 + pages = priv->regs_phys >> PAGE_SHIFT;
466 + /*
467 + * The address decode is far larger than the actual number of registers.
468 + * Just map the whole lot in.
469 + */
470 + vma->vm_page_prot = phys_mem_access_prot(file, pages,
471 + priv->mem_window_len,
472 + vma->vm_page_prot);
473 + vma->vm_ops = &rpivid_mem_vm_ops;
474 + if (remap_pfn_range(vma, vma->vm_start,
475 + pages,
476 + priv->mem_window_len,
477 + vma->vm_page_prot)) {
478 + return -EAGAIN;
479 + }
480 + return 0;
481 +}
482 +
483 +static const struct file_operations
484 +rpivid_mem_fops = {
485 + .owner = THIS_MODULE,
486 + .open = rpivid_mem_open,
487 + .release = rpivid_mem_release,
488 + .mmap = rpivid_mem_mmap,
489 +};
490 +
491 +static const struct of_device_id rpivid_mem_of_match[];
492 +static int rpivid_mem_probe(struct platform_device *pdev)
493 +{
494 + int err;
495 + void *ptr_err;
496 + const struct of_device_id *id;
497 + struct device *dev = &pdev->dev;
498 + struct device *rpivid_mem_dev;
499 + struct resource *ioresource;
500 + struct rpivid_mem_priv *priv;
501 +
502 +
503 + /* Allocate buffers and instance data */
504 +
505 + priv = kzalloc(sizeof(struct rpivid_mem_priv), GFP_KERNEL);
506 +
507 + if (!priv) {
508 + err = -ENOMEM;
509 + goto failed_inst_alloc;
510 + }
511 + platform_set_drvdata(pdev, priv);
512 +
513 + priv->dev = dev;
514 + id = of_match_device(rpivid_mem_of_match, dev);
515 + if (!id)
516 + return -EINVAL;
517 + priv->name = id->data;
518 +
519 + ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
520 + if (ioresource) {
521 + priv->regs_phys = ioresource->start;
522 + priv->mem_window_len = ioresource->end - ioresource->start;
523 + } else {
524 + dev_err(priv->dev, "failed to get IO resource");
525 + err = -ENOENT;
526 + goto failed_get_resource;
527 + }
528 +
529 + /* Create character device entries */
530 +
531 + err = alloc_chrdev_region(&priv->devid,
532 + DEVICE_MINOR, 1, priv->name);
533 + if (err != 0) {
534 + dev_err(priv->dev, "unable to allocate device number");
535 + goto failed_alloc_chrdev;
536 + }
537 + cdev_init(&priv->rpivid_mem_cdev, &rpivid_mem_fops);
538 + priv->rpivid_mem_cdev.owner = THIS_MODULE;
539 + err = cdev_add(&priv->rpivid_mem_cdev, priv->devid, 1);
540 + if (err != 0) {
541 + dev_err(priv->dev, "unable to register device");
542 + goto failed_cdev_add;
543 + }
544 +
545 + /* Create sysfs entries */
546 +
547 + priv->class = class_create(THIS_MODULE, priv->name);
548 + ptr_err = priv->class;
549 + if (IS_ERR(ptr_err))
550 + goto failed_class_create;
551 +
552 + rpivid_mem_dev = device_create(priv->class, NULL,
553 + priv->devid, NULL,
554 + priv->name);
555 + ptr_err = rpivid_mem_dev;
556 + if (IS_ERR(ptr_err))
557 + goto failed_device_create;
558 +
559 + dev_info(priv->dev, "%s initialised: Registers at 0x%08lx length 0x%08lx",
560 + priv->name, priv->regs_phys, priv->mem_window_len);
561 +
562 + return 0;
563 +
564 +failed_device_create:
565 + class_destroy(priv->class);
566 +failed_class_create:
567 + cdev_del(&priv->rpivid_mem_cdev);
568 + err = PTR_ERR(ptr_err);
569 +failed_cdev_add:
570 + unregister_chrdev_region(priv->devid, 1);
571 +failed_alloc_chrdev:
572 +failed_get_resource:
573 + kfree(priv);
574 +failed_inst_alloc:
575 + dev_err(priv->dev, "could not load rpivid_mem");
576 + return err;
577 +}
578 +
579 +static int rpivid_mem_remove(struct platform_device *pdev)
580 +{
581 + struct device *dev = &pdev->dev;
582 + struct rpivid_mem_priv *priv = platform_get_drvdata(pdev);
583 +
584 + device_destroy(priv->class, priv->devid);
585 + class_destroy(priv->class);
586 + cdev_del(&priv->rpivid_mem_cdev);
587 + unregister_chrdev_region(priv->devid, 1);
588 + kfree(priv);
589 +
590 + dev_info(dev, "%s driver removed - OK", priv->name);
591 + return 0;
592 +}
593 +
594 +static const struct of_device_id rpivid_mem_of_match[] = {
595 + {
596 + .compatible = "raspberrypi,rpivid-hevc-decoder",
597 + .data = "rpivid-hevcmem",
598 + },
599 + {
600 + .compatible = "raspberrypi,rpivid-h264-decoder",
601 + .data = "rpivid-h264mem",
602 + },
603 + {
604 + .compatible = "raspberrypi,rpivid-vp9-decoder",
605 + .data = "rpivid-vp9mem",
606 + },
607 + /* The "intc" is included as this block of hardware contains the
608 + * "frame done" status flags.
609 + */
610 + {
611 + .compatible = "raspberrypi,rpivid-local-intc",
612 + .data = "rpivid-intcmem",
613 + },
614 + { /* sentinel */ },
615 +};
616 +
617 +MODULE_DEVICE_TABLE(of, rpivid_mem_of_match);
618 +
619 +static struct platform_driver rpivid_mem_driver = {
620 + .probe = rpivid_mem_probe,
621 + .remove = rpivid_mem_remove,
622 + .driver = {
623 + .name = DRIVER_NAME,
624 + .owner = THIS_MODULE,
625 + .of_match_table = rpivid_mem_of_match,
626 + },
627 +};
628 +
629 +module_platform_driver(rpivid_mem_driver);
630 +
631 +MODULE_ALIAS("platform:rpivid-mem");
632 +MODULE_LICENSE("GPL");
633 +MODULE_DESCRIPTION("Driver for accessing RPiVid decoder registers from userspace");
634 +MODULE_AUTHOR("Jonathan Bell <jonathan@raspberrypi.org>");
635 --- a/drivers/mfd/bcm2835-pm.c
636 +++ b/drivers/mfd/bcm2835-pm.c
637 @@ -50,14 +50,14 @@ static int bcm2835_pm_probe(struct platf
638 if (ret)
639 return ret;
640
641 - /* Map the ARGON ASB regs if present. */
642 + /* Map the RPiVid ASB regs if present. */
643 res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
644 if (res) {
645 - pm->arg_asb = devm_ioremap_resource(dev, res);
646 - if (IS_ERR(pm->arg_asb)) {
647 - dev_err(dev, "Failed to map ARGON ASB: %ld\n",
648 - PTR_ERR(pm->arg_asb));
649 - return PTR_ERR(pm->arg_asb);
650 + pm->rpivid_asb = devm_ioremap_resource(dev, res);
651 + if (IS_ERR(pm->rpivid_asb)) {
652 + dev_err(dev, "Failed to map RPiVid ASB: %ld\n",
653 + PTR_ERR(pm->rpivid_asb));
654 + return PTR_ERR(pm->rpivid_asb);
655 }
656 }
657
658 --- a/drivers/soc/bcm/bcm2835-power.c
659 +++ b/drivers/soc/bcm/bcm2835-power.c
660 @@ -637,15 +637,15 @@ static int bcm2835_power_probe(struct pl
661 power->base = pm->base;
662 power->asb = pm->asb;
663
664 - /* 2711 hack: the new ARGON ASB took over V3D, which is our
665 + /* 2711 hack: the new RPiVid ASB took over V3D, which is our
666 * only consumer of this driver so far. The old ASB seems to
667 * still be present with ISP and H264 bits but no V3D, but I
668 * don't know if that's real or not. The V3D is in the same
669 * place in the new ASB as the old one, so just poke the new
670 * one for now.
671 */
672 - if (pm->arg_asb) {
673 - power->asb = pm->arg_asb;
674 + if (pm->rpivid_asb) {
675 + power->asb = pm->rpivid_asb;
676 power->is_2711 = true;
677 }
678
679 --- a/include/linux/mfd/bcm2835-pm.h
680 +++ b/include/linux/mfd/bcm2835-pm.h
681 @@ -9,7 +9,7 @@ struct bcm2835_pm {
682 struct device *dev;
683 void __iomem *base;
684 void __iomem *asb;
685 - void __iomem *arg_asb;
686 + void __iomem *rpivid_asb;
687 };
688
689 #endif /* BCM2835_MFD_PM_H */