mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
ASoC: codecs: wcd-common: move status_update callback to common
Soundwire update_status, bus_config and interrupt callbacks for wcd937x, wcd938x, wcd939x soundwire codecs are exactly identlical, move them to common driver to remove this duplicate code. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Link: https://patch.msgid.link/20250909121954.225833-12-srinivas.kandagatla@oss.qualcomm.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
45f2c5e1d1
commit
59aebbbb0b
@@ -9,6 +9,9 @@
|
||||
#include <linux/printk.h>
|
||||
#include <linux/component.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/soundwire/sdw_type.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "wcd-common.h"
|
||||
|
||||
@@ -16,6 +19,8 @@
|
||||
#define WCD_DEF_MICBIAS_MV 1800
|
||||
#define WCD_MAX_MICBIAS_MV 2850
|
||||
|
||||
#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (0xE0 + 0x10 * (m))
|
||||
|
||||
int wcd_get_micb_vout_ctl_val(struct device *dev, u32 micb_mv)
|
||||
{
|
||||
/* min micbias voltage is 1V and maximum is 2.85V */
|
||||
@@ -93,5 +98,46 @@ const struct component_ops wcd_sdw_component_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(wcd_sdw_component_ops);
|
||||
|
||||
int wcd_update_status(struct sdw_slave *slave, enum sdw_slave_status status)
|
||||
{
|
||||
struct regmap *regmap = dev_get_regmap(&slave->dev, NULL);
|
||||
|
||||
if (regmap && status == SDW_SLAVE_ATTACHED) {
|
||||
/* Write out any cached changes that happened between probe and attach */
|
||||
regcache_cache_only(regmap, false);
|
||||
return regcache_sync(regmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_update_status);
|
||||
|
||||
int wcd_bus_config(struct sdw_slave *slave, struct sdw_bus_params *params)
|
||||
{
|
||||
sdw_write(slave, SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(params->next_bank), 0x01);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_bus_config);
|
||||
|
||||
int wcd_interrupt_callback(struct sdw_slave *slave, struct irq_domain *slave_irq,
|
||||
unsigned int wcd_intr_status0, unsigned int wcd_intr_status1,
|
||||
unsigned int wcd_intr_status2)
|
||||
{
|
||||
struct regmap *regmap = dev_get_regmap(&slave->dev, NULL);
|
||||
u32 sts1, sts2, sts3;
|
||||
|
||||
do {
|
||||
handle_nested_irq(irq_find_mapping(slave_irq, 0));
|
||||
regmap_read(regmap, wcd_intr_status0, &sts1);
|
||||
regmap_read(regmap, wcd_intr_status1, &sts2);
|
||||
regmap_read(regmap, wcd_intr_status2, &sts3);
|
||||
|
||||
} while (sts1 || sts2 || sts3);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_interrupt_callback);
|
||||
|
||||
MODULE_DESCRIPTION("Common Qualcomm WCD Codec helpers driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -37,5 +37,10 @@ struct wcd_common {
|
||||
extern const struct component_ops wcd_sdw_component_ops;
|
||||
int wcd_get_micb_vout_ctl_val(struct device *dev, u32 micb_mv);
|
||||
int wcd_dt_parse_micbias_info(struct wcd_common *common);
|
||||
int wcd_update_status(struct sdw_slave *slave, enum sdw_slave_status status);
|
||||
int wcd_bus_config(struct sdw_slave *slave, struct sdw_bus_params *params);
|
||||
int wcd_interrupt_callback(struct sdw_slave *slave, struct irq_domain *slave_irq,
|
||||
unsigned int wcd_intr_status0, unsigned int wcd_intr_status1,
|
||||
unsigned int wcd_intr_status2);
|
||||
|
||||
#endif /* __WCD_COMMON_H__ */
|
||||
|
||||
@@ -112,19 +112,6 @@ int wcd937x_sdw_hw_params(struct wcd937x_sdw_priv *wcd,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd937x_sdw_hw_params);
|
||||
|
||||
static int wcd9370_update_status(struct sdw_slave *slave, enum sdw_slave_status status)
|
||||
{
|
||||
struct wcd937x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
|
||||
if (wcd->regmap && status == SDW_SLAVE_ATTACHED) {
|
||||
/* Write out any cached changes that happened between probe and attach */
|
||||
regcache_cache_only(wcd->regmap, false);
|
||||
return regcache_sync(wcd->regmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle Soundwire out-of-band interrupt event by triggering
|
||||
* the first irq of the slave_irq irq domain, which then will
|
||||
@@ -135,18 +122,9 @@ static int wcd9370_interrupt_callback(struct sdw_slave *slave,
|
||||
struct sdw_slave_intr_status *status)
|
||||
{
|
||||
struct wcd937x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
struct irq_domain *slave_irq = wcd->slave_irq;
|
||||
u32 sts1, sts2, sts3;
|
||||
|
||||
do {
|
||||
handle_nested_irq(irq_find_mapping(slave_irq, 0));
|
||||
regmap_read(wcd->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &sts1);
|
||||
regmap_read(wcd->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &sts2);
|
||||
regmap_read(wcd->regmap, WCD937X_DIGITAL_INTR_STATUS_2, &sts3);
|
||||
|
||||
} while (sts1 || sts2 || sts3);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
return wcd_interrupt_callback(slave, wcd->slave_irq, WCD937X_DIGITAL_INTR_STATUS_0,
|
||||
WCD937X_DIGITAL_INTR_STATUS_1, WCD937X_DIGITAL_INTR_STATUS_2);
|
||||
}
|
||||
|
||||
static const struct reg_default wcd937x_defaults[] = {
|
||||
@@ -979,7 +957,7 @@ static const struct regmap_config wcd937x_regmap_config = {
|
||||
};
|
||||
|
||||
static const struct sdw_slave_ops wcd9370_slave_ops = {
|
||||
.update_status = wcd9370_update_status,
|
||||
.update_status = wcd_update_status,
|
||||
.interrupt_callback = wcd9370_interrupt_callback,
|
||||
};
|
||||
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
#include "wcd938x.h"
|
||||
#include "wcd-common.h"
|
||||
|
||||
#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (0xE0 + 0x10 * (m))
|
||||
|
||||
static const struct wcd_sdw_ch_info wcd938x_sdw_rx_ch_info[] = {
|
||||
WCD_SDW_CH(WCD938X_HPH_L, WCD938X_HPH_PORT, BIT(0)),
|
||||
WCD_SDW_CH(WCD938X_HPH_R, WCD938X_HPH_PORT, BIT(1)),
|
||||
@@ -142,44 +140,13 @@ int wcd938x_sdw_set_sdw_stream(struct wcd938x_sdw_priv *wcd,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd938x_sdw_set_sdw_stream);
|
||||
|
||||
static int wcd9380_update_status(struct sdw_slave *slave,
|
||||
enum sdw_slave_status status)
|
||||
{
|
||||
struct wcd938x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
|
||||
if (wcd->regmap && (status == SDW_SLAVE_ATTACHED)) {
|
||||
/* Write out any cached changes that happened between probe and attach */
|
||||
regcache_cache_only(wcd->regmap, false);
|
||||
return regcache_sync(wcd->regmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wcd9380_bus_config(struct sdw_slave *slave,
|
||||
struct sdw_bus_params *params)
|
||||
{
|
||||
sdw_write(slave, SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(params->next_bank), 0x01);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wcd9380_interrupt_callback(struct sdw_slave *slave,
|
||||
struct sdw_slave_intr_status *status)
|
||||
{
|
||||
struct wcd938x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
struct irq_domain *slave_irq = wcd->slave_irq;
|
||||
u32 sts1, sts2, sts3;
|
||||
|
||||
do {
|
||||
handle_nested_irq(irq_find_mapping(slave_irq, 0));
|
||||
regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1);
|
||||
regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2);
|
||||
regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3);
|
||||
|
||||
} while (sts1 || sts2 || sts3);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
return wcd_interrupt_callback(slave, wcd->slave_irq, WCD938X_DIGITAL_INTR_STATUS_0,
|
||||
WCD938X_DIGITAL_INTR_STATUS_1, WCD938X_DIGITAL_INTR_STATUS_2);
|
||||
}
|
||||
|
||||
static const struct reg_default wcd938x_defaults[] = {
|
||||
@@ -1177,9 +1144,9 @@ static const struct regmap_config wcd938x_regmap_config = {
|
||||
};
|
||||
|
||||
static const struct sdw_slave_ops wcd9380_slave_ops = {
|
||||
.update_status = wcd9380_update_status,
|
||||
.update_status = wcd_update_status,
|
||||
.interrupt_callback = wcd9380_interrupt_callback,
|
||||
.bus_config = wcd9380_bus_config,
|
||||
.bus_config = wcd_bus_config,
|
||||
};
|
||||
|
||||
static int wcd9380_probe(struct sdw_slave *pdev,
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "wcd939x.h"
|
||||
#include "wcd-common.h"
|
||||
|
||||
#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (0xE0 + 0x10 * (m))
|
||||
|
||||
static const struct wcd_sdw_ch_info wcd939x_sdw_rx_ch_info[] = {
|
||||
WCD_SDW_CH(WCD939X_HPH_L, WCD939X_HPH_PORT, BIT(0)),
|
||||
WCD_SDW_CH(WCD939X_HPH_R, WCD939X_HPH_PORT, BIT(1)),
|
||||
@@ -187,29 +185,6 @@ int wcd939x_sdw_set_sdw_stream(struct wcd939x_sdw_priv *wcd,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd939x_sdw_set_sdw_stream);
|
||||
|
||||
static int wcd9390_update_status(struct sdw_slave *slave,
|
||||
enum sdw_slave_status status)
|
||||
{
|
||||
struct wcd939x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
|
||||
if (wcd->regmap && status == SDW_SLAVE_ATTACHED) {
|
||||
/* Write out any cached changes that happened between probe and attach */
|
||||
regcache_cache_only(wcd->regmap, false);
|
||||
return regcache_sync(wcd->regmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wcd9390_bus_config(struct sdw_slave *slave,
|
||||
struct sdw_bus_params *params)
|
||||
{
|
||||
sdw_write(slave, SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(params->next_bank),
|
||||
0x01);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle Soundwire out-of-band interrupt event by triggering
|
||||
* the first irq of the slave_irq irq domain, which then will
|
||||
@@ -220,18 +195,9 @@ static int wcd9390_interrupt_callback(struct sdw_slave *slave,
|
||||
struct sdw_slave_intr_status *status)
|
||||
{
|
||||
struct wcd939x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
|
||||
struct irq_domain *slave_irq = wcd->slave_irq;
|
||||
u32 sts1, sts2, sts3;
|
||||
|
||||
do {
|
||||
handle_nested_irq(irq_find_mapping(slave_irq, 0));
|
||||
regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_0, &sts1);
|
||||
regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_1, &sts2);
|
||||
regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_2, &sts3);
|
||||
|
||||
} while (sts1 || sts2 || sts3);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
return wcd_interrupt_callback(slave, wcd->slave_irq, WCD939X_DIGITAL_INTR_STATUS_0,
|
||||
WCD939X_DIGITAL_INTR_STATUS_1, WCD939X_DIGITAL_INTR_STATUS_2);
|
||||
}
|
||||
|
||||
static const struct reg_default wcd939x_defaults[] = {
|
||||
@@ -1364,9 +1330,9 @@ static const struct regmap_config wcd939x_regmap_config = {
|
||||
};
|
||||
|
||||
static const struct sdw_slave_ops wcd9390_slave_ops = {
|
||||
.update_status = wcd9390_update_status,
|
||||
.update_status = wcd_update_status,
|
||||
.interrupt_callback = wcd9390_interrupt_callback,
|
||||
.bus_config = wcd9390_bus_config,
|
||||
.bus_config = wcd_bus_config,
|
||||
};
|
||||
|
||||
static int wcd9390_probe(struct sdw_slave *pdev, const struct sdw_device_id *id)
|
||||
|
||||
Reference in New Issue
Block a user