ps3av: thread updates
ps3av: Replace the kernel_thread and the ping pong semaphores by a singlethread workqueue and a completion. Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
eca28743b7
commit
5caf5db887
2 changed files with 17 additions and 18 deletions
|
@ -440,7 +440,7 @@ static int ps3av_set_videomode(void)
|
|||
ps3av_set_av_video_mute(PS3AV_CMD_MUTE_ON);
|
||||
|
||||
/* wake up ps3avd to do the actual video mode setting */
|
||||
up(&ps3av.ping);
|
||||
queue_work(ps3av.wq, &ps3av.work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -515,18 +515,10 @@ static void ps3av_set_videomode_cont(u32 id, u32 old_id)
|
|||
ps3av_set_av_video_mute(PS3AV_CMD_MUTE_OFF);
|
||||
}
|
||||
|
||||
static int ps3avd(void *p)
|
||||
static void ps3avd(struct work_struct *work)
|
||||
{
|
||||
struct ps3av *info = p;
|
||||
|
||||
daemonize("ps3avd");
|
||||
while (1) {
|
||||
down(&info->ping);
|
||||
ps3av_set_videomode_cont(info->ps3av_mode,
|
||||
info->ps3av_mode_old);
|
||||
up(&info->pong);
|
||||
}
|
||||
return 0;
|
||||
ps3av_set_videomode_cont(ps3av.ps3av_mode, ps3av.ps3av_mode_old);
|
||||
complete(&ps3av.done);
|
||||
}
|
||||
|
||||
static int ps3av_vid2table_id(int vid)
|
||||
|
@ -725,7 +717,7 @@ int ps3av_set_video_mode(u32 id, int boot)
|
|||
}
|
||||
|
||||
/* set videomode */
|
||||
down(&ps3av.pong);
|
||||
wait_for_completion(&ps3av.done);
|
||||
ps3av.ps3av_mode_old = ps3av.ps3av_mode;
|
||||
ps3av.ps3av_mode = id;
|
||||
if (ps3av_set_videomode())
|
||||
|
@ -881,12 +873,16 @@ static int ps3av_probe(struct ps3_vuart_port_device *dev)
|
|||
memset(&ps3av, 0, sizeof(ps3av));
|
||||
|
||||
init_MUTEX(&ps3av.sem);
|
||||
init_MUTEX_LOCKED(&ps3av.ping);
|
||||
init_MUTEX(&ps3av.pong);
|
||||
mutex_init(&ps3av.mutex);
|
||||
ps3av.ps3av_mode = 0;
|
||||
ps3av.dev = dev;
|
||||
kernel_thread(ps3avd, &ps3av, CLONE_KERNEL);
|
||||
|
||||
INIT_WORK(&ps3av.work, ps3avd);
|
||||
init_completion(&ps3av.done);
|
||||
complete(&ps3av.done);
|
||||
ps3av.wq = create_singlethread_workqueue("ps3avd");
|
||||
if (!ps3av.wq)
|
||||
return -ENOMEM;
|
||||
|
||||
ps3av.available = 1;
|
||||
switch (ps3_os_area_get_av_multi_out()) {
|
||||
|
@ -926,6 +922,8 @@ static int ps3av_remove(struct ps3_vuart_port_device *dev)
|
|||
{
|
||||
if (ps3av.available) {
|
||||
ps3av_cmd_fin();
|
||||
if (ps3av.wq)
|
||||
destroy_workqueue(ps3av.wq);
|
||||
ps3av.available = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -646,8 +646,9 @@ struct ps3av_pkt_avb_param {
|
|||
struct ps3av {
|
||||
int available;
|
||||
struct semaphore sem;
|
||||
struct semaphore ping;
|
||||
struct semaphore pong;
|
||||
struct work_struct work;
|
||||
struct completion done;
|
||||
struct workqueue_struct *wq;
|
||||
struct mutex mutex;
|
||||
int open_count;
|
||||
struct ps3_vuart_port_device *dev;
|
||||
|
|
Loading…
Reference in a new issue