#include <linux/soundcard.h>
#include <linux/sysrq.h>
#include <linux/delay.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/completion.h>
+#include <linux/mutex.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/hardware.h>
-#include <asm/semaphore.h>
#include "omap-audio-dma-intfc.h"
#include "omap-audio.h"
static int audio_release(struct inode *inode, struct file *file);
-static int audio_probe(struct device *dev);
+static int audio_probe(struct platform_device *pdev);
-static int audio_remove(struct device *dev);
+static int audio_remove(struct platform_device *pdev);
-static void audio_shutdown(struct device *dev);
+static void audio_shutdown(struct platform_device *pdev);
-static int audio_suspend(struct device *dev, pm_message_t mesg, u32 level);
+static int audio_suspend(struct platform_device *pdev, pm_message_t mesg);
-static int audio_resume(struct device *dev, u32 level);
+static int audio_resume(struct platform_device *pdev);
static void audio_free(struct device *dev);
};
/* Driver information */
-static struct device_driver omap_audio_driver = {
- .name = OMAP_AUDIO_NAME,
- .bus = &platform_bus_type,
+static struct platform_driver omap_audio_driver = {
.probe = audio_probe,
.remove = audio_remove,
.suspend = audio_suspend,
- .resume = audio_resume,
.shutdown = audio_shutdown,
+ .resume = audio_resume,
+ .driver = {
+ .name = OMAP_AUDIO_NAME,
+ },
};
/* Device Information */
* WARNING!!!! : It is expected that the codec would have registered with us by now
*
*********************************************************************************/
-static int audio_probe(struct device *dev)
+static int audio_probe(struct platform_device *pdev)
{
int ret;
FN_IN;
* audio_remove() Function to handle removal operations
*
*********************************************************************************/
-static int audio_remove(struct device *dev)
+static int audio_remove(struct platform_device *pdev)
{
FN_IN;
if (audio_state.hw_remove) {
* audio_shutdown(): Function to handle shutdown operations
*
*********************************************************************************/
-static void audio_shutdown(struct device *dev)
+static void audio_shutdown(struct platform_device *pdev)
{
FN_IN;
if (audio_state.hw_cleanup) {
* audio_suspend(): Function to handle suspend operations
*
*********************************************************************************/
-static int audio_suspend(struct device *dev, pm_message_t mesg, u32 level)
+static int audio_suspend(struct platform_device *pdev, pm_message_t mesg)
{
int ret = 0;
#ifdef CONFIG_PM
- void *data = dev->driver_data;
+ void *data = pdev->dev.driver_data;
FN_IN;
- if (level != SUSPEND_POWER_DOWN) {
- return 0;
- }
if (audio_state.hw_suspend) {
ret = audio_ldm_suspend(data);
if (ret == 0)
* audio_resume(): Function to handle resume operations
*
*********************************************************************************/
-static int audio_resume(struct device *dev, u32 level)
+static int audio_resume(struct platform_device *pdev)
{
int ret = 0;
#ifdef CONFIG_PM
- void *data = dev->driver_data;
+ void *data = pdev->dev.driver_data;
FN_IN;
- if (level != RESUME_POWER_ON) {
- return 0;
- }
if (audio_state.hw_resume) {
ret = audio_ldm_resume(data);
if (ret == 0)
}
memcpy(&audio_state, codec_state, sizeof(audio_state_t));
+ mutex_init(&audio_state.mutex);
ret = platform_device_register(&omap_audio_device);
if (ret != 0) {
goto register_out;
}
- ret = driver_register(&omap_audio_driver);
+ ret = platform_driver_register(&omap_audio_driver);
if (ret != 0) {
printk(KERN_ERR "Device Register failed =%d\n", ret);
ret = -ENODEV;
return -EPERM;
}
- driver_unregister(&omap_audio_driver);
+ platform_driver_unregister(&omap_audio_driver);
platform_device_unregister(&omap_audio_device);
memset(&audio_state, 0, sizeof(audio_state_t));
/* Wait for a buffer to become free */
if (file->f_flags & O_NONBLOCK) {
ret = -EAGAIN;
- if (down_trylock(&s->sem))
- break;
- } else {
- ret = -ERESTARTSYS;
- if (down_interruptible(&s->sem))
+ if (!s->wfc.done)
break;
}
+ ret = -ERESTARTSYS;
+ if (wait_for_completion_interruptible(&s->wfc))
+ break;
/* Feed the current buffer */
chunksize = s->fragsize - b->offset;
DPRINTK("write %d to %d\n", chunksize, s->usr_head);
if (copy_from_user(b->data + b->offset, buffer, chunksize)) {
printk(KERN_ERR "Audio: CopyFrom User failed \n");
- up(&s->sem);
+ complete(&s->wfc);
return -EFAULT;
}
b->offset += chunksize;
if (b->offset < s->fragsize) {
- up(&s->sem);
+ complete(&s->wfc);
break;
}
/* Wait for a buffer to become full */
if (file->f_flags & O_NONBLOCK) {
ret = -EAGAIN;
- if (down_trylock(&s->sem))
- break;
- } else {
- ret = -ERESTARTSYS;
- if (down_interruptible(&s->sem))
+ if (!s->wfc.done)
break;
}
+ ret = -ERESTARTSYS;
+ if (wait_for_completion_interruptible(&s->wfc))
+ break;
/* Grab data from the current buffer */
chunksize = s->fragsize - b->offset;
chunksize = count;
DPRINTK("read %d from %d\n", chunksize, s->usr_head);
if (copy_to_user(buffer, b->data + b->offset, chunksize)) {
- up(&s->sem);
+ complete(&s->wfc);
return -EFAULT;
}
buffer += chunksize;
count -= chunksize;
b->offset += chunksize;
if (b->offset < s->fragsize) {
- up(&s->sem);
+ complete(&s->wfc);
break;
}
if (file->f_mode & FMODE_READ)
if ((is->mapped && is->bytecount > 0) ||
- (!is->mapped && atomic_read(&is->sem.count) > 0))
+ (!is->mapped && is->wfc.done > 0))
mask |= POLLIN | POLLRDNORM;
if (file->f_mode & FMODE_WRITE)
if ((os->mapped && os->bytecount > 0) ||
- (!os->mapped && atomic_read(&os->sem.count) > 0))
+ (!os->mapped && os->wfc.done > 0))
mask |= POLLOUT | POLLWRNORM;
DPRINTK("audio_poll() returned mask of %s%s\n",
local_irq_save(flags);
if (os->mapped && !os->pending_frags) {
os->pending_frags = os->nbfrags;
- sema_init(&os->sem, 0);
+ init_completion(&os->wfc);
+ os->wfc.done = 0;
os->active = 1;
}
os->stopped = 0;
FN_OUT(19);
return -ENOMEM;
}
- inf.bytes = atomic_read(&s->sem.count) * s->fragsize;
+ inf.bytes = s->wfc.done * s->fragsize;
inf.fragments = inf.bytes / s->fragsize;
inf.fragsize = s->fragsize;
return -ESTALE;
}
- down(&state->sem);
+ mutex_lock(&state->mutex);
/* access control */
err = -ENODEV;
err = 0;
out:
- up(&state->sem);
+ mutex_unlock(&state->mutex);
if (err) {
module_put(state->owner);
module_put(THIS_MODULE);
FN_IN;
- down(&state->sem);
+ mutex_lock(&state->mutex);
if (file->f_mode & FMODE_READ) {
audio_discard_buf(is);
state->hw_shutdown(state->data);
}
- up(&state->sem);
+ mutex_unlock(&state->mutex);
module_put(state->owner);
module_put(THIS_MODULE);