/src/barebox/drivers/misc/mem.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0-only |
2 | | /* |
3 | | * Copyright (c) 2011 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix |
4 | | */ |
5 | | |
6 | | #include <common.h> |
7 | | #include <driver.h> |
8 | | #include <init.h> |
9 | | #include <asm/cache.h> |
10 | | |
11 | | static int mem_flush(struct cdev *cdev) |
12 | 0 | { |
13 | 0 | sync_caches_for_execution(); |
14 | 0 | return 0; |
15 | 0 | } |
16 | | |
17 | | static struct cdev_operations memops = { |
18 | | .read = mem_read, |
19 | | .write = mem_write, |
20 | | .memmap = generic_memmap_rw, |
21 | | .flush = mem_flush, |
22 | | }; |
23 | | |
24 | | static int mem_probe(struct device *dev) |
25 | 26 | { |
26 | 26 | struct cdev *cdev; |
27 | | |
28 | 26 | cdev = xzalloc(sizeof (*cdev)); |
29 | 26 | dev->priv = cdev; |
30 | | |
31 | 26 | cdev->name = (char*)dev->resource[0].name; |
32 | 26 | if (dev->resource[0].start == 0 && dev->resource[0].end == ~0) { |
33 | | /* |
34 | | * Special case for /dev/mem. We can't express it's size as it's |
35 | | * outside of our address range. Set DEVFS_IS_CHARACTER_DEV to |
36 | | * bypass size checks. |
37 | | */ |
38 | 26 | cdev->size = 0; |
39 | 26 | cdev->flags = DEVFS_IS_CHARACTER_DEV; |
40 | 26 | } else { |
41 | 0 | cdev->size = resource_size(&dev->resource[0]); |
42 | 0 | } |
43 | | |
44 | 26 | cdev->ops = &memops; |
45 | 26 | cdev->dev = dev; |
46 | | |
47 | 26 | devfs_create(cdev); |
48 | | |
49 | 26 | return 0; |
50 | 26 | } |
51 | | |
52 | | static struct driver mem_drv = { |
53 | | .name = "mem", |
54 | | .probe = mem_probe, |
55 | | }; |
56 | | |
57 | | static int mem_init(void) |
58 | 26 | { |
59 | 26 | struct device *dev; |
60 | 26 | struct resource res = { |
61 | 26 | .start = 0, |
62 | 26 | .end = ~0, |
63 | 26 | .flags = IORESOURCE_MEM, |
64 | 26 | .name = "mem", |
65 | 26 | }; |
66 | 26 | int ret; |
67 | | |
68 | 26 | dev = device_alloc("mem", DEVICE_ID_DYNAMIC); |
69 | 26 | if (!dev) |
70 | 0 | return -ENOMEM; |
71 | | |
72 | 26 | dev->resource = xmemdup(&res, sizeof(res)); |
73 | 26 | dev->num_resources = 1; |
74 | | |
75 | 26 | ret = platform_device_register(dev); |
76 | 26 | if (ret) |
77 | 0 | return ret; |
78 | | |
79 | 26 | return platform_driver_register(&mem_drv); |
80 | 26 | } |
81 | | device_initcall(mem_init); |