|
6 | 6 | // Copyright 2019 NXP
|
7 | 7 |
|
8 | 8 | #include <linux/clk.h>
|
| 9 | +#include <linux/firmware/imx/sm.h> |
9 | 10 | #include <linux/module.h>
|
10 | 11 | #include <linux/moduleparam.h>
|
11 | 12 | #include <linux/mfd/syscon.h>
|
@@ -74,6 +75,29 @@ struct fsl_mqs {
|
74 | 75 | #define FSL_MQS_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
|
75 | 76 | #define FSL_MQS_FORMATS SNDRV_PCM_FMTBIT_S16_LE
|
76 | 77 |
|
| 78 | +static int fsl_mqs_sm_read(void *context, unsigned int reg, unsigned int *val) |
| 79 | +{ |
| 80 | + struct fsl_mqs *mqs_priv = context; |
| 81 | + int num = 1; |
| 82 | + |
| 83 | + if (IS_ENABLED(CONFIG_IMX_SCMI_MISC_DRV) && |
| 84 | + mqs_priv->soc->ctrl_off == reg) |
| 85 | + return scmi_imx_misc_ctrl_get(SCMI_IMX_CTRL_MQS1_SETTINGS, &num, val); |
| 86 | + |
| 87 | + return -EINVAL; |
| 88 | +}; |
| 89 | + |
| 90 | +static int fsl_mqs_sm_write(void *context, unsigned int reg, unsigned int val) |
| 91 | +{ |
| 92 | + struct fsl_mqs *mqs_priv = context; |
| 93 | + |
| 94 | + if (IS_ENABLED(CONFIG_IMX_SCMI_MISC_DRV) && |
| 95 | + mqs_priv->soc->ctrl_off == reg) |
| 96 | + return scmi_imx_misc_ctrl_set(SCMI_IMX_CTRL_MQS1_SETTINGS, val); |
| 97 | + |
| 98 | + return -EINVAL; |
| 99 | +}; |
| 100 | + |
77 | 101 | static int fsl_mqs_hw_params(struct snd_pcm_substream *substream,
|
78 | 102 | struct snd_pcm_hw_params *params,
|
79 | 103 | struct snd_soc_dai *dai)
|
@@ -188,6 +212,13 @@ static const struct regmap_config fsl_mqs_regmap_config = {
|
188 | 212 | .cache_type = REGCACHE_NONE,
|
189 | 213 | };
|
190 | 214 |
|
| 215 | +static const struct regmap_config fsl_mqs_sm_regmap = { |
| 216 | + .reg_bits = 32, |
| 217 | + .val_bits = 32, |
| 218 | + .reg_read = fsl_mqs_sm_read, |
| 219 | + .reg_write = fsl_mqs_sm_write, |
| 220 | +}; |
| 221 | + |
191 | 222 | static int fsl_mqs_probe(struct platform_device *pdev)
|
192 | 223 | {
|
193 | 224 | struct device_node *np = pdev->dev.of_node;
|
@@ -219,6 +250,16 @@ static int fsl_mqs_probe(struct platform_device *pdev)
|
219 | 250 | dev_err(&pdev->dev, "failed to get gpr regmap\n");
|
220 | 251 | return PTR_ERR(mqs_priv->regmap);
|
221 | 252 | }
|
| 253 | + } else if (mqs_priv->soc->type == TYPE_REG_SM) { |
| 254 | + mqs_priv->regmap = devm_regmap_init(&pdev->dev, |
| 255 | + NULL, |
| 256 | + mqs_priv, |
| 257 | + &fsl_mqs_sm_regmap); |
| 258 | + if (IS_ERR(mqs_priv->regmap)) { |
| 259 | + dev_err(&pdev->dev, "failed to init regmap: %ld\n", |
| 260 | + PTR_ERR(mqs_priv->regmap)); |
| 261 | + return PTR_ERR(mqs_priv->regmap); |
| 262 | + } |
222 | 263 | } else {
|
223 | 264 | regs = devm_platform_ioremap_resource(pdev, 0);
|
224 | 265 | if (IS_ERR(regs))
|
|
0 commit comments