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

Commit 02358ac5 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "SoC: soundwire: Add support for device wakeup"

parents 18065271 1b9932e1
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -167,6 +167,8 @@ struct swr_master {
				u8 *dev_num);
	int (*slvdev_datapath_control)(struct swr_master *mstr, bool enable);
	bool (*remove_from_group)(struct swr_master *mstr);
	void (*device_wakeup_vote)(struct swr_master *mstr);
	void (*device_wakeup_unvote)(struct swr_master *mstr);
	u16 port_en_mask;

};
@@ -334,4 +336,8 @@ extern void swr_remove_device(struct swr_device *swr_dev);

extern struct swr_device *get_matching_swr_slave_device(struct device_node *np);

extern int swr_device_wakeup_vote(struct swr_device *dev);

extern int swr_device_wakeup_unvote(struct swr_device *dev);

#endif /* _LINUX_SOUNDWIRE_H */
+55 −0
Original line number Diff line number Diff line
@@ -482,6 +482,61 @@ int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id,
}
EXPORT_SYMBOL(swr_get_logical_dev_num);

/**
 * swr_device_wakeup_vote - Wakeup master and slave devices from clock stop
 * @dev: pointer to soundwire slave device
 *
 * This API will wake up soundwire master and slave device(s) from
 * clock stop.
 */
int swr_device_wakeup_vote(struct swr_device *dev)
{
	int ret = 0;
	struct swr_master *master = dev->master;

	if (!master) {
		pr_err("%s: Master is NULL\n", __func__);
		return -EINVAL;
	}
	mutex_lock(&master->mlock);
	if (master->device_wakeup_vote)
		master->device_wakeup_vote(master);
	else
		ret = -EINVAL;
	mutex_unlock(&master->mlock);

	return ret;
}
EXPORT_SYMBOL(swr_device_wakeup_vote);

/**
 * swr_device_wakeup_unvote - Unvote Wakeup so that master and slave
 * devices can go back to  clock stop
 * @dev: pointer to soundwire slave device
 *
 * This API will remove vote for wakeup so that soundwire master and
 * slave device(s) can go back to clock stop.
 */
int swr_device_wakeup_unvote(struct swr_device *dev)
{
	int ret = 0;
	struct swr_master *master = dev->master;

	if (!master) {
		pr_err("%s: Master is NULL\n", __func__);
		return -EINVAL;
	}
	mutex_lock(&master->mlock);
	if (master->device_wakeup_unvote)
		master->device_wakeup_unvote(master);
	else
		ret = -EINVAL;
	mutex_unlock(&master->mlock);

	return ret;
}
EXPORT_SYMBOL(swr_device_wakeup_unvote);

/**
 * swr_read - read soundwire slave device registers
 * @dev: pointer to soundwire slave device