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

This commit is contained in:
Linux Build Service Account 2018-12-11 07:08:39 -08:00 • committed by Gerrit - the friendly Code Review server
commit 02358ac5b8
2 changed files with 61 additions and 0 deletions

View file

@ -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 */

View file

@ -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