ASoC: Intel: bytcr_rt5651: Pass jack-src info via device-properties
This commit add support for a new BYT_RT5651_JDSRC quirk, sets this quirk for the KIANO SlimNote 14.2 laptop and uses the new "realtek, jack-detect-source" property to pass this info to the codec driver. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
c9ae06decc
commit
46058aeb6b
1 changed files with 50 additions and 4 deletions
|
@ -18,8 +18,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/property.h>
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
@ -42,10 +44,21 @@ enum {
|
||||||
BYT_RT5651_IN3_MAP,
|
BYT_RT5651_IN3_MAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(7, 0))
|
enum {
|
||||||
#define BYT_RT5651_DMIC_EN BIT(16)
|
BYT_RT5651_JD_NULL = (RT5651_JD_NULL << 4),
|
||||||
#define BYT_RT5651_MCLK_EN BIT(17)
|
BYT_RT5651_JD1_1 = (RT5651_JD1_1 << 4),
|
||||||
#define BYT_RT5651_MCLK_25MHZ BIT(18)
|
BYT_RT5651_JD1_2 = (RT5651_JD1_2 << 4),
|
||||||
|
BYT_RT5651_JD2 = (RT5651_JD2 << 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(3, 0))
|
||||||
|
#define BYT_RT5651_JDSRC(quirk) (((quirk) & GENMASK(7, 4)) >> 4)
|
||||||
|
#define BYT_RT5651_DMIC_EN BIT(16)
|
||||||
|
#define BYT_RT5651_MCLK_EN BIT(17)
|
||||||
|
#define BYT_RT5651_MCLK_25MHZ BIT(18)
|
||||||
|
|
||||||
|
/* jack-detect-source + terminating empty entry */
|
||||||
|
#define MAX_NO_PROPS 2
|
||||||
|
|
||||||
struct byt_rt5651_private {
|
struct byt_rt5651_private {
|
||||||
struct clk *mclk;
|
struct clk *mclk;
|
||||||
|
@ -66,6 +79,9 @@ static void log_quirks(struct device *dev)
|
||||||
dev_info(dev, "quirk IN2_MAP enabled");
|
dev_info(dev, "quirk IN2_MAP enabled");
|
||||||
if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN3_MAP)
|
if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN3_MAP)
|
||||||
dev_info(dev, "quirk IN3_MAP enabled");
|
dev_info(dev, "quirk IN3_MAP enabled");
|
||||||
|
if (BYT_RT5651_JDSRC(byt_rt5651_quirk))
|
||||||
|
dev_info(dev, "quirk realtek,jack-detect-source %ld\n",
|
||||||
|
BYT_RT5651_JDSRC(byt_rt5651_quirk));
|
||||||
if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN)
|
if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN)
|
||||||
dev_info(dev, "quirk DMIC enabled");
|
dev_info(dev, "quirk DMIC enabled");
|
||||||
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
|
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
|
||||||
|
@ -288,11 +304,35 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "KIANO SlimNote 14.2"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "KIANO SlimNote 14.2"),
|
||||||
},
|
},
|
||||||
.driver_data = (void *)(BYT_RT5651_MCLK_EN |
|
.driver_data = (void *)(BYT_RT5651_MCLK_EN |
|
||||||
|
BYT_RT5651_JD1_1 |
|
||||||
BYT_RT5651_IN1_IN2_MAP),
|
BYT_RT5651_IN1_IN2_MAP),
|
||||||
},
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note this MUST be called before snd_soc_register_card(), so that the props
|
||||||
|
* are in place before the codec component driver's probe function parses them.
|
||||||
|
*/
|
||||||
|
static int byt_rt5651_add_codec_device_props(const char *i2c_dev_name)
|
||||||
|
{
|
||||||
|
struct property_entry props[MAX_NO_PROPS] = {};
|
||||||
|
struct device *i2c_dev;
|
||||||
|
int ret, cnt = 0;
|
||||||
|
|
||||||
|
i2c_dev = bus_find_device_by_name(&i2c_bus_type, NULL, i2c_dev_name);
|
||||||
|
if (!i2c_dev)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
|
props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source",
|
||||||
|
BYT_RT5651_JDSRC(byt_rt5651_quirk));
|
||||||
|
|
||||||
|
ret = device_add_properties(i2c_dev, props);
|
||||||
|
put_device(i2c_dev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
|
static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
struct snd_soc_card *card = runtime->card;
|
struct snd_soc_card *card = runtime->card;
|
||||||
|
@ -550,6 +590,12 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
/* check quirks before creating card */
|
/* check quirks before creating card */
|
||||||
dmi_check_system(byt_rt5651_quirk_table);
|
dmi_check_system(byt_rt5651_quirk_table);
|
||||||
|
|
||||||
|
/* Must be called before register_card, also see declaration comment. */
|
||||||
|
ret_val = byt_rt5651_add_codec_device_props(byt_rt5651_codec_name);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
|
|
||||||
log_quirks(&pdev->dev);
|
log_quirks(&pdev->dev);
|
||||||
|
|
||||||
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
|
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
|
||||||
|
|
Loading…
Reference in a new issue