• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* drivers/misc/goldfish_audio.c
2  *
3  * Copyright (C) 2007 Google, Inc.
4  * Copyright (C) 2012 Intel, Inc.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16 
17 #include <linux/module.h>
18 #include <linux/miscdevice.h>
19 #include <linux/fs.h>
20 #include <linux/platform_device.h>
21 #include <linux/types.h>
22 #include <linux/pci.h>
23 #include <linux/interrupt.h>
24 #include <linux/io.h>
25 #include <linux/sched.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/uaccess.h>
28 #include <linux/slab.h>
29 #include <linux/acpi.h>
30 
31 MODULE_AUTHOR("Google, Inc.");
32 MODULE_DESCRIPTION("Android QEMU Audio Driver");
33 MODULE_LICENSE("GPL");
34 MODULE_VERSION("1.0");
35 
36 struct goldfish_audio {
37 	char __iomem *reg_base;
38 	int irq;
39 	spinlock_t lock;
40 	wait_queue_head_t wait;
41 
42 	char __iomem *buffer_virt;      /* combined buffer virtual address */
43 	unsigned long buffer_phys;      /* combined buffer physical address */
44 
45 	char __iomem *write_buffer1;    /* write buffer 1 virtual address */
46 	char __iomem *write_buffer2;    /* write buffer 2 virtual address */
47 	char __iomem *read_buffer;      /* read buffer virtual address */
48 	int buffer_status;
49 	int read_supported;         /* true if we have audio input support */
50 };
51 
52 /* We will allocate two read buffers and two write buffers.
53    Having two read buffers facilitate stereo -> mono conversion.
54    Having two write buffers facilitate interleaved IO.
55 */
56 #define READ_BUFFER_SIZE        16384
57 #define WRITE_BUFFER_SIZE       16384
58 #define COMBINED_BUFFER_SIZE    ((2 * READ_BUFFER_SIZE) + \
59 					(2 * WRITE_BUFFER_SIZE))
60 
61 #define AUDIO_READ(data, addr)		(readl(data->reg_base + addr))
62 #define AUDIO_WRITE(data, addr, x)	(writel(x, data->reg_base + addr))
63 
64 /* temporary variable used between goldfish_audio_probe() and
65    goldfish_audio_open() */
66 static struct goldfish_audio *audio_data;
67 
68 enum {
69 	/* audio status register */
70 	AUDIO_INT_STATUS	= 0x00,
71 	/* set this to enable IRQ */
72 	AUDIO_INT_ENABLE	= 0x04,
73 	/* set these to specify buffer addresses */
74 	AUDIO_SET_WRITE_BUFFER_1 = 0x08,
75 	AUDIO_SET_WRITE_BUFFER_2 = 0x0C,
76 	/* set number of bytes in buffer to write */
77 	AUDIO_WRITE_BUFFER_1  = 0x10,
78 	AUDIO_WRITE_BUFFER_2  = 0x14,
79 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
80 	AUDIO_SET_WRITE_BUFFER_1_HIGH = 0x28,
81 	AUDIO_SET_WRITE_BUFFER_2_HIGH = 0x30,
82 #endif
83 
84 	/* true if audio input is supported */
85 	AUDIO_READ_SUPPORTED = 0x18,
86 	/* buffer to use for audio input */
87 	AUDIO_SET_READ_BUFFER = 0x1C,
88 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
89 	AUDIO_SET_READ_BUFFER_HIGH = 0x34,
90 #endif
91 
92 	/* driver writes number of bytes to read */
93 	AUDIO_START_READ  = 0x20,
94 
95 	/* number of bytes available in read buffer */
96 	AUDIO_READ_BUFFER_AVAILABLE  = 0x24,
97 
98 	/* AUDIO_INT_STATUS bits */
99 
100 	/* this bit set when it is safe to write more bytes to the buffer */
101 	AUDIO_INT_WRITE_BUFFER_1_EMPTY	= 1U << 0,
102 	AUDIO_INT_WRITE_BUFFER_2_EMPTY	= 1U << 1,
103 	AUDIO_INT_READ_BUFFER_FULL      = 1U << 2,
104 
105 	AUDIO_INT_MASK                  = AUDIO_INT_WRITE_BUFFER_1_EMPTY |
106 					  AUDIO_INT_WRITE_BUFFER_2_EMPTY |
107 					  AUDIO_INT_READ_BUFFER_FULL,
108 };
109 
110 
111 static atomic_t open_count = ATOMIC_INIT(0);
112 
113 
goldfish_audio_read(struct file * fp,char __user * buf,size_t count,loff_t * pos)114 static ssize_t goldfish_audio_read(struct file *fp, char __user *buf,
115 						size_t count, loff_t *pos)
116 {
117 	struct goldfish_audio *data = fp->private_data;
118 	unsigned long irq_flags;
119 	int length;
120 	int result = 0;
121 
122 	if (!data->read_supported)
123 		return -ENODEV;
124 
125 	while (count > 0) {
126 		length = (count > READ_BUFFER_SIZE ? READ_BUFFER_SIZE : count);
127 		AUDIO_WRITE(data, AUDIO_START_READ, length);
128 
129 		wait_event_interruptible(data->wait,
130 			(data->buffer_status & AUDIO_INT_READ_BUFFER_FULL));
131 
132 		spin_lock_irqsave(&data->lock, irq_flags);
133 		data->buffer_status &= ~AUDIO_INT_READ_BUFFER_FULL;
134 		spin_unlock_irqrestore(&data->lock, irq_flags);
135 
136 		length = AUDIO_READ(data,
137 						AUDIO_READ_BUFFER_AVAILABLE);
138 
139 		/* copy data to user space */
140 		if (copy_to_user(buf, data->read_buffer, length))
141 			return -EFAULT;
142 
143 		result += length;
144 		buf += length;
145 		count -= length;
146 	}
147 	return result;
148 }
149 
goldfish_audio_write(struct file * fp,const char __user * buf,size_t count,loff_t * pos)150 static ssize_t goldfish_audio_write(struct file *fp, const char __user *buf,
151 						 size_t count, loff_t *pos)
152 {
153 	struct goldfish_audio *data = fp->private_data;
154 	unsigned long irq_flags;
155 	ssize_t result = 0;
156 	char __iomem *kbuf;
157 
158 	while (count > 0) {
159 		ssize_t copy = count;
160 		if (copy > WRITE_BUFFER_SIZE)
161 			copy = WRITE_BUFFER_SIZE;
162 		wait_event_interruptible(data->wait, (data->buffer_status &
163 					(AUDIO_INT_WRITE_BUFFER_1_EMPTY |
164 					AUDIO_INT_WRITE_BUFFER_2_EMPTY)));
165 
166 		if ((data->buffer_status & AUDIO_INT_WRITE_BUFFER_1_EMPTY) != 0)
167 			kbuf = data->write_buffer1;
168 		else
169 			kbuf = data->write_buffer2;
170 
171 		/* copy from user space to the appropriate buffer */
172 		if (copy_from_user(kbuf, buf, copy)) {
173 			result = -EFAULT;
174 			break;
175 		}
176 
177 		spin_lock_irqsave(&data->lock, irq_flags);
178 		/* clear the buffer empty flag, and signal the emulator
179 		 * to start writing the buffer */
180 		if (kbuf == data->write_buffer1) {
181 			data->buffer_status &= ~AUDIO_INT_WRITE_BUFFER_1_EMPTY;
182 			AUDIO_WRITE(data, AUDIO_WRITE_BUFFER_1, copy);
183 		} else {
184 			data->buffer_status &= ~AUDIO_INT_WRITE_BUFFER_2_EMPTY;
185 			AUDIO_WRITE(data, AUDIO_WRITE_BUFFER_2, copy);
186 		}
187 		spin_unlock_irqrestore(&data->lock, irq_flags);
188 
189 		buf += copy;
190 		result += copy;
191 		count -= copy;
192 	}
193 	return result;
194 }
195 
goldfish_audio_open(struct inode * ip,struct file * fp)196 static int goldfish_audio_open(struct inode *ip, struct file *fp)
197 {
198 	if (!audio_data)
199 		return -ENODEV;
200 
201 	if (atomic_inc_return(&open_count) == 1) {
202 		fp->private_data = audio_data;
203 		audio_data->buffer_status = (AUDIO_INT_WRITE_BUFFER_1_EMPTY |
204 					     AUDIO_INT_WRITE_BUFFER_2_EMPTY);
205 		AUDIO_WRITE(audio_data, AUDIO_INT_ENABLE, AUDIO_INT_MASK);
206 		return 0;
207 	} else {
208 		atomic_dec(&open_count);
209 		return -EBUSY;
210 	}
211 }
212 
goldfish_audio_release(struct inode * ip,struct file * fp)213 static int goldfish_audio_release(struct inode *ip, struct file *fp)
214 {
215 	atomic_dec(&open_count);
216 	/* FIXME: surely this is wrong for the multi-opened case */
217 	AUDIO_WRITE(audio_data, AUDIO_INT_ENABLE, 0);
218 	return 0;
219 }
220 
goldfish_audio_ioctl(struct file * fp,unsigned int cmd,unsigned long arg)221 static long goldfish_audio_ioctl(struct file *fp, unsigned int cmd,
222 							unsigned long arg)
223 {
224 	/* temporary workaround, until we switch to the ALSA API */
225 	if (cmd == 315)
226 		return -1;
227 	else
228 		return 0;
229 }
230 
goldfish_audio_interrupt(int irq,void * dev_id)231 static irqreturn_t goldfish_audio_interrupt(int irq, void *dev_id)
232 {
233 	unsigned long irq_flags;
234 	struct goldfish_audio	*data = dev_id;
235 	u32 status;
236 
237 	spin_lock_irqsave(&data->lock, irq_flags);
238 
239 	/* read buffer status flags */
240 	status = AUDIO_READ(data, AUDIO_INT_STATUS);
241 	status &= AUDIO_INT_MASK;
242 	/* if buffers are newly empty, wake up blocked
243 	   goldfish_audio_write() call */
244 	if (status) {
245 		data->buffer_status = status;
246 		wake_up(&data->wait);
247 	}
248 
249 	spin_unlock_irqrestore(&data->lock, irq_flags);
250 	return status ? IRQ_HANDLED : IRQ_NONE;
251 }
252 
253 /* file operations for /dev/eac */
254 static const struct file_operations goldfish_audio_fops = {
255 	.owner = THIS_MODULE,
256 	.read = goldfish_audio_read,
257 	.write = goldfish_audio_write,
258 	.open = goldfish_audio_open,
259 	.release = goldfish_audio_release,
260 	.unlocked_ioctl = goldfish_audio_ioctl,
261 };
262 
263 static struct miscdevice goldfish_audio_device = {
264 	.minor = MISC_DYNAMIC_MINOR,
265 	.name = "eac",
266 	.fops = &goldfish_audio_fops,
267 };
268 
goldfish_audio_probe(struct platform_device * pdev)269 static int goldfish_audio_probe(struct platform_device *pdev)
270 {
271 	int ret;
272 	struct resource *r;
273 	struct goldfish_audio *data;
274 	dma_addr_t buf_addr;
275 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
276 	u32 buf_addr_high, buf_addr_low;
277 #endif
278 
279 	data = kzalloc(sizeof(*data), GFP_KERNEL);
280 	if (data == NULL) {
281 		ret = -ENOMEM;
282 		goto err_data_alloc_failed;
283 	}
284 	spin_lock_init(&data->lock);
285 	init_waitqueue_head(&data->wait);
286 	platform_set_drvdata(pdev, data);
287 
288 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
289 	if (r == NULL) {
290 		dev_err(&pdev->dev, "platform_get_resource failed\n");
291 		ret = -ENODEV;
292 		goto err_no_io_base;
293 	}
294 	data->reg_base = ioremap(r->start, PAGE_SIZE);
295 	if (data->reg_base == NULL) {
296 		ret = -ENOMEM;
297 		goto err_no_io_base;
298 	}
299 
300 	data->irq = platform_get_irq(pdev, 0);
301 	if (data->irq < 0) {
302 		dev_err(&pdev->dev, "platform_get_irq failed\n");
303 		ret = -ENODEV;
304 		goto err_no_irq;
305 	}
306 	data->buffer_virt = dma_alloc_coherent(&pdev->dev,
307 				COMBINED_BUFFER_SIZE, &buf_addr, GFP_KERNEL);
308 	if (data->buffer_virt == 0) {
309 		ret = -ENOMEM;
310 		dev_err(&pdev->dev, "allocate buffer failed\n");
311 		goto err_alloc_write_buffer_failed;
312 	}
313 	data->buffer_phys = buf_addr;
314 	data->write_buffer1 = data->buffer_virt;
315 	data->write_buffer2 = data->buffer_virt + WRITE_BUFFER_SIZE;
316 	data->read_buffer = data->buffer_virt + 2 * WRITE_BUFFER_SIZE;
317 
318 	ret = request_irq(data->irq, goldfish_audio_interrupt,
319 					IRQF_SHARED, pdev->name, data);
320 	if (ret) {
321 		dev_err(&pdev->dev, "request_irq failed\n");
322 		goto err_request_irq_failed;
323 	}
324 
325 	ret = misc_register(&goldfish_audio_device);
326 	if (ret) {
327 		dev_err(&pdev->dev,
328 			"misc_register returned %d in goldfish_audio_init\n",
329 								ret);
330 		goto err_misc_register_failed;
331 	}
332 
333 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
334 	buf_addr_low = (u32)(buf_addr);
335 	buf_addr_high = (u32)((buf_addr) >> 32);
336 
337 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1, buf_addr_low);
338 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1_HIGH, buf_addr_high);
339 
340 	buf_addr_low = (u32)(buf_addr + WRITE_BUFFER_SIZE);
341 	buf_addr_high = (u32)((buf_addr + WRITE_BUFFER_SIZE) >> 32);
342 
343 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2, buf_addr_low);
344 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2_HIGH, buf_addr_high);
345 
346 	buf_addr_low = (u32)(buf_addr + 2 * WRITE_BUFFER_SIZE);
347 	buf_addr_high = (u32)((buf_addr + 2 * WRITE_BUFFER_SIZE) >> 32);
348 
349 	data->read_supported = AUDIO_READ(data, AUDIO_READ_SUPPORTED);
350 	if (data->read_supported){
351                 AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER, buf_addr_low);
352                 AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER_HIGH, buf_addr_high);
353 	}
354 #else
355 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1, buf_addr);
356 	AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2,
357 						buf_addr + WRITE_BUFFER_SIZE);
358 
359 	data->read_supported = AUDIO_READ(data, AUDIO_READ_SUPPORTED);
360 	if (data->read_supported)
361 		AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER,
362 					buf_addr + 2 * WRITE_BUFFER_SIZE);
363 #endif
364 
365 	audio_data = data;
366 	return 0;
367 
368 err_misc_register_failed:
369 err_request_irq_failed:
370 	dma_free_coherent(&pdev->dev, COMBINED_BUFFER_SIZE,
371 					data->buffer_virt, data->buffer_phys);
372 err_alloc_write_buffer_failed:
373 err_no_irq:
374 	iounmap(data->reg_base);
375 err_no_io_base:
376 	kfree(data);
377 err_data_alloc_failed:
378 	return ret;
379 }
380 
goldfish_audio_remove(struct platform_device * pdev)381 static int goldfish_audio_remove(struct platform_device *pdev)
382 {
383 	struct goldfish_audio *data = platform_get_drvdata(pdev);
384 
385 	misc_deregister(&goldfish_audio_device);
386 	free_irq(data->irq, data);
387 	dma_free_coherent(&pdev->dev, COMBINED_BUFFER_SIZE,
388 					data->buffer_virt, data->buffer_phys);
389 	iounmap(data->reg_base);
390 	kfree(data);
391 	audio_data = NULL;
392 	return 0;
393 }
394 
395 static const struct of_device_id goldfish_audio_of_match[] = {
396 	{ .compatible = "generic,goldfish-audio", },
397 	{},
398 };
399 MODULE_DEVICE_TABLE(of, goldfish_audio_of_match);
400 
401 static const struct acpi_device_id goldfish_audio_acpi_match[] = {
402 	{ "GFSH0005", 0 },
403 	{ },
404 };
405 MODULE_DEVICE_TABLE(acpi, goldfish_audio_acpi_match);
406 
407 static struct platform_driver goldfish_audio_driver = {
408 	.probe		= goldfish_audio_probe,
409 	.remove		= goldfish_audio_remove,
410 	.driver = {
411 		.name = "goldfish_audio",
412 		.of_match_table = goldfish_audio_of_match,
413 		.acpi_match_table = ACPI_PTR(goldfish_audio_acpi_match),
414 	}
415 };
416 
417 module_platform_driver(goldfish_audio_driver);
418