Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5caf5db8 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Linus Torvalds
Browse files

ps3av: thread updates



ps3av: Replace the kernel_thread and the ping pong semaphores by a singlethread
workqueue and a completion.

Signed-off-by: default avatarGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent eca28743
Loading
Loading
Loading
Loading
+14 −16
Original line number Diff line number Diff line
@@ -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;
	}

+3 −2
Original line number Diff line number Diff line
@@ -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;