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