14
14
#include <linux/gpio.h>
15
15
#include <linux/module.h>
16
16
#include <linux/platform_device.h>
17
+ #include <linux/dma-mapping.h>
17
18
#include <soc/bcm2835/raspberrypi-firmware.h>
18
19
19
20
#define MODULE_NAME "brcmvirt-gpio"
@@ -25,6 +26,7 @@ struct brcmvirt_gpio {
25
26
/* two packed 16-bit counts of enabled and disables
26
27
Allows host to detect a brief enable that was missed */
27
28
u32 enables_disables [NUM_GPIO ];
29
+ dma_addr_t bus_addr ;
28
30
};
29
31
30
32
static int brcmvirt_gpio_dir_in (struct gpio_chip * gc , unsigned off )
@@ -75,13 +77,13 @@ static void brcmvirt_gpio_set(struct gpio_chip *gc, unsigned off, int val)
75
77
76
78
static int brcmvirt_gpio_probe (struct platform_device * pdev )
77
79
{
80
+ int err = 0 ;
78
81
struct device * dev = & pdev -> dev ;
79
82
struct device_node * np = dev -> of_node ;
80
83
struct device_node * fw_node ;
81
84
struct rpi_firmware * fw ;
82
85
struct brcmvirt_gpio * ucb ;
83
86
u32 gpiovirtbuf ;
84
- int err = 0 ;
85
87
86
88
fw_node = of_parse_phandle (np , "firmware" , 0 );
87
89
if (!fw_node ) {
@@ -93,35 +95,56 @@ static int brcmvirt_gpio_probe(struct platform_device *pdev)
93
95
if (!fw )
94
96
return - EPROBE_DEFER ;
95
97
96
- err = rpi_firmware_property (fw , RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF ,
97
- & gpiovirtbuf , sizeof (gpiovirtbuf ));
98
-
99
- if (err ) {
100
- dev_err (dev , "Failed to get gpiovirtbuf\n" );
101
- goto err ;
102
- }
103
-
104
- if (!gpiovirtbuf ) {
105
- dev_err (dev , "No virtgpio buffer\n" );
106
- err = - ENOENT ;
107
- goto err ;
108
- }
109
-
110
98
ucb = devm_kzalloc (dev , sizeof * ucb , GFP_KERNEL );
111
99
if (!ucb ) {
112
100
err = - EINVAL ;
113
- goto err ;
101
+ goto out ;
114
102
}
115
103
116
- // mmap the physical memory
117
- gpiovirtbuf &= ~0xc0000000 ;
118
- ucb -> ts_base = ioremap (gpiovirtbuf , 4096 );
119
- if (ucb -> ts_base == NULL ) {
120
- dev_err (dev , "Failed to map physical address\n" );
121
- err = - ENOENT ;
122
- goto err ;
104
+ ucb -> ts_base = dma_zalloc_coherent (dev , PAGE_SIZE , & ucb -> bus_addr , GFP_KERNEL );
105
+ if (!ucb -> ts_base ) {
106
+ pr_err ("[%s]: failed to dma_alloc_coherent(%ld)\n" ,
107
+ __func__ , PAGE_SIZE );
108
+ err = - ENOMEM ;
109
+ goto out ;
123
110
}
124
111
112
+ gpiovirtbuf = (u32 )ucb -> bus_addr ;
113
+ err = rpi_firmware_property (fw , RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF ,
114
+ & gpiovirtbuf , sizeof (gpiovirtbuf ));
115
+
116
+ if (err || gpiovirtbuf != 0 ) {
117
+ dev_warn (dev , "Failed to set gpiovirtbuf, trying to get err:%x\n" , err );
118
+ dma_free_coherent (dev , PAGE_SIZE , ucb -> ts_base , ucb -> bus_addr );
119
+ ucb -> ts_base = 0 ;
120
+ ucb -> bus_addr = 0 ;
121
+ }
122
+
123
+ if (!ucb -> ts_base ) {
124
+ err = rpi_firmware_property (fw , RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF ,
125
+ & gpiovirtbuf , sizeof (gpiovirtbuf ));
126
+
127
+ if (err ) {
128
+ dev_err (dev , "Failed to get gpiovirtbuf\n" );
129
+ goto out ;
130
+ }
131
+
132
+ if (!gpiovirtbuf ) {
133
+ dev_err (dev , "No virtgpio buffer\n" );
134
+ err = - ENOENT ;
135
+ goto out ;
136
+ }
137
+
138
+ // mmap the physical memory
139
+ gpiovirtbuf &= ~0xc0000000 ;
140
+ ucb -> ts_base = ioremap (gpiovirtbuf , 4096 );
141
+ if (ucb -> ts_base == NULL ) {
142
+ dev_err (dev , "Failed to map physical address\n" );
143
+ err = - ENOENT ;
144
+ goto out ;
145
+ }
146
+ ucb -> bus_addr = 0 ;
147
+ }
125
148
ucb -> gc .label = MODULE_NAME ;
126
149
ucb -> gc .owner = THIS_MODULE ;
127
150
//ucb->gc.dev = dev;
@@ -137,22 +160,34 @@ static int brcmvirt_gpio_probe(struct platform_device *pdev)
137
160
138
161
err = gpiochip_add (& ucb -> gc );
139
162
if (err )
140
- goto err ;
163
+ goto out ;
141
164
142
165
platform_set_drvdata (pdev , ucb );
143
166
144
- err :
167
+ return 0 ;
168
+ out :
169
+ if (ucb -> bus_addr ) {
170
+ dma_free_coherent (dev , PAGE_SIZE , ucb -> ts_base , ucb -> bus_addr );
171
+ ucb -> bus_addr = 0 ;
172
+ ucb -> ts_base = NULL ;
173
+ } else if (ucb -> ts_base ) {
174
+ iounmap (ucb -> ts_base );
175
+ ucb -> ts_base = NULL ;
176
+ }
145
177
return err ;
146
-
147
178
}
148
179
149
180
static int brcmvirt_gpio_remove (struct platform_device * pdev )
150
181
{
182
+ struct device * dev = & pdev -> dev ;
151
183
int err = 0 ;
152
184
struct brcmvirt_gpio * ucb = platform_get_drvdata (pdev );
153
185
154
186
gpiochip_remove (& ucb -> gc );
155
- iounmap (ucb -> ts_base );
187
+ if (ucb -> bus_addr )
188
+ dma_free_coherent (dev , PAGE_SIZE , ucb -> ts_base , ucb -> bus_addr );
189
+ else if (ucb -> ts_base )
190
+ iounmap (ucb -> ts_base );
156
191
return err ;
157
192
}
158
193
0 commit comments