diff options
| -rw-r--r-- | sound/soc/codecs/Kconfig | 12 | ||||
| -rw-r--r-- | sound/soc/codecs/Makefile | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/sigmadsp-i2c.c | 35 | ||||
| -rw-r--r-- | sound/soc/codecs/sigmadsp-regmap.c | 36 | ||||
| -rw-r--r-- | sound/soc/codecs/sigmadsp.c | 65 | ||||
| -rw-r--r-- | sound/soc/codecs/sigmadsp.h | 20 |
6 files changed, 107 insertions, 65 deletions
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index cbfa1e18f651..0b9571c858f8 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
| @@ -225,11 +225,11 @@ config SND_SOC_ADAU1373 | |||
| 225 | config SND_SOC_ADAU1701 | 225 | config SND_SOC_ADAU1701 |
| 226 | tristate "Analog Devices ADAU1701 CODEC" | 226 | tristate "Analog Devices ADAU1701 CODEC" |
| 227 | depends on I2C | 227 | depends on I2C |
| 228 | select SND_SOC_SIGMADSP | 228 | select SND_SOC_SIGMADSP_I2C |
| 229 | 229 | ||
| 230 | config SND_SOC_ADAU17X1 | 230 | config SND_SOC_ADAU17X1 |
| 231 | tristate | 231 | tristate |
| 232 | select SND_SOC_SIGMADSP | 232 | select SND_SOC_SIGMADSP_REGMAP |
| 233 | 233 | ||
| 234 | config SND_SOC_ADAU1761 | 234 | config SND_SOC_ADAU1761 |
| 235 | tristate | 235 | tristate |
| @@ -476,6 +476,14 @@ config SND_SOC_SIGMADSP | |||
| 476 | tristate | 476 | tristate |
| 477 | select CRC32 | 477 | select CRC32 |
| 478 | 478 | ||
| 479 | config SND_SOC_SIGMADSP_I2C | ||
| 480 | tristate | ||
| 481 | select SND_SOC_SIGMADSP | ||
| 482 | |||
| 483 | config SND_SOC_SIGMADSP_REGMAP | ||
| 484 | tristate | ||
| 485 | select SND_SOC_SIGMADSP | ||
| 486 | |||
| 479 | config SND_SOC_SIRF_AUDIO_CODEC | 487 | config SND_SOC_SIRF_AUDIO_CODEC |
| 480 | tristate "SiRF SoC internal audio codec" | 488 | tristate "SiRF SoC internal audio codec" |
| 481 | select REGMAP_MMIO | 489 | select REGMAP_MMIO |
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index be3377b8d73f..1bd6e1cf6f82 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile | |||
| @@ -77,6 +77,8 @@ snd-soc-sgtl5000-objs := sgtl5000.o | |||
| 77 | snd-soc-alc5623-objs := alc5623.o | 77 | snd-soc-alc5623-objs := alc5623.o |
| 78 | snd-soc-alc5632-objs := alc5632.o | 78 | snd-soc-alc5632-objs := alc5632.o |
| 79 | snd-soc-sigmadsp-objs := sigmadsp.o | 79 | snd-soc-sigmadsp-objs := sigmadsp.o |
| 80 | snd-soc-sigmadsp-i2c-objs := sigmadsp-i2c.o | ||
| 81 | snd-soc-sigmadsp-regmap-objs := sigmadsp-regmap.o | ||
| 80 | snd-soc-si476x-objs := si476x.o | 82 | snd-soc-si476x-objs := si476x.o |
| 81 | snd-soc-sirf-audio-codec-objs := sirf-audio-codec.o | 83 | snd-soc-sirf-audio-codec-objs := sirf-audio-codec.o |
| 82 | snd-soc-sn95031-objs := sn95031.o | 84 | snd-soc-sn95031-objs := sn95031.o |
| @@ -240,6 +242,8 @@ obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o | |||
| 240 | obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o | 242 | obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o |
| 241 | obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o | 243 | obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o |
| 242 | obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o | 244 | obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o |
| 245 | obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) += snd-soc-sigmadsp-i2c.o | ||
| 246 | obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) += snd-soc-sigmadsp-regmap.o | ||
| 243 | obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o | 247 | obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o |
| 244 | obj-$(CONFIG_SND_SOC_SN95031) +=snd-soc-sn95031.o | 248 | obj-$(CONFIG_SND_SOC_SN95031) +=snd-soc-sn95031.o |
| 245 | obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o | 249 | obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o |
diff --git a/sound/soc/codecs/sigmadsp-i2c.c b/sound/soc/codecs/sigmadsp-i2c.c new file mode 100644 index 000000000000..246081aae8ca --- /dev/null +++ b/sound/soc/codecs/sigmadsp-i2c.c | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | * Load Analog Devices SigmaStudio firmware files | ||
| 3 | * | ||
| 4 | * Copyright 2009-2011 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/i2c.h> | ||
| 10 | #include <linux/export.h> | ||
| 11 | #include <linux/module.h> | ||
| 12 | |||
| 13 | #include "sigmadsp.h" | ||
| 14 | |||
| 15 | static int sigma_action_write_i2c(void *control_data, | ||
| 16 | const struct sigma_action *sa, size_t len) | ||
| 17 | { | ||
| 18 | return i2c_master_send(control_data, (const unsigned char *)&sa->addr, | ||
| 19 | len); | ||
| 20 | } | ||
| 21 | |||
| 22 | int process_sigma_firmware(struct i2c_client *client, const char *name) | ||
| 23 | { | ||
| 24 | struct sigma_firmware ssfw; | ||
| 25 | |||
| 26 | ssfw.control_data = client; | ||
| 27 | ssfw.write = sigma_action_write_i2c; | ||
| 28 | |||
| 29 | return _process_sigma_firmware(&client->dev, &ssfw, name); | ||
| 30 | } | ||
| 31 | EXPORT_SYMBOL(process_sigma_firmware); | ||
| 32 | |||
| 33 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | ||
| 34 | MODULE_DESCRIPTION("SigmaDSP I2C firmware loader"); | ||
| 35 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/sigmadsp-regmap.c b/sound/soc/codecs/sigmadsp-regmap.c new file mode 100644 index 000000000000..f78ed8d2cfb2 --- /dev/null +++ b/sound/soc/codecs/sigmadsp-regmap.c | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * Load Analog Devices SigmaStudio firmware files | ||
| 3 | * | ||
| 4 | * Copyright 2009-2011 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/regmap.h> | ||
| 10 | #include <linux/export.h> | ||
| 11 | #include <linux/module.h> | ||
| 12 | |||
| 13 | #include "sigmadsp.h" | ||
| 14 | |||
| 15 | static int sigma_action_write_regmap(void *control_data, | ||
| 16 | const struct sigma_action *sa, size_t len) | ||
| 17 | { | ||
| 18 | return regmap_raw_write(control_data, be16_to_cpu(sa->addr), | ||
| 19 | sa->payload, len - 2); | ||
| 20 | } | ||
| 21 | |||
| 22 | int process_sigma_firmware_regmap(struct device *dev, struct regmap *regmap, | ||
| 23 | const char *name) | ||
| 24 | { | ||
| 25 | struct sigma_firmware ssfw; | ||
| 26 | |||
| 27 | ssfw.control_data = regmap; | ||
| 28 | ssfw.write = sigma_action_write_regmap; | ||
| 29 | |||
| 30 | return _process_sigma_firmware(dev, &ssfw, name); | ||
| 31 | } | ||
| 32 | EXPORT_SYMBOL(process_sigma_firmware_regmap); | ||
| 33 | |||
| 34 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | ||
| 35 | MODULE_DESCRIPTION("SigmaDSP regmap firmware loader"); | ||
| 36 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/sigmadsp.c b/sound/soc/codecs/sigmadsp.c index 4068f2491232..f2de7e049bc6 100644 --- a/sound/soc/codecs/sigmadsp.c +++ b/sound/soc/codecs/sigmadsp.c | |||
| @@ -34,23 +34,6 @@ enum { | |||
| 34 | SIGMA_ACTION_END, | 34 | SIGMA_ACTION_END, |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | struct sigma_action { | ||
| 38 | u8 instr; | ||
| 39 | u8 len_hi; | ||
| 40 | __le16 len; | ||
| 41 | __be16 addr; | ||
| 42 | unsigned char payload[]; | ||
| 43 | } __packed; | ||
| 44 | |||
| 45 | struct sigma_firmware { | ||
| 46 | const struct firmware *fw; | ||
| 47 | size_t pos; | ||
| 48 | |||
| 49 | void *control_data; | ||
| 50 | int (*write)(void *control_data, const struct sigma_action *sa, | ||
| 51 | size_t len); | ||
| 52 | }; | ||
| 53 | |||
| 54 | static inline u32 sigma_action_len(struct sigma_action *sa) | 37 | static inline u32 sigma_action_len(struct sigma_action *sa) |
| 55 | { | 38 | { |
| 56 | return (sa->len_hi << 16) | le16_to_cpu(sa->len); | 39 | return (sa->len_hi << 16) | le16_to_cpu(sa->len); |
| @@ -138,7 +121,7 @@ process_sigma_actions(struct sigma_firmware *ssfw) | |||
| 138 | return 0; | 121 | return 0; |
| 139 | } | 122 | } |
| 140 | 123 | ||
| 141 | static int _process_sigma_firmware(struct device *dev, | 124 | int _process_sigma_firmware(struct device *dev, |
| 142 | struct sigma_firmware *ssfw, const char *name) | 125 | struct sigma_firmware *ssfw, const char *name) |
| 143 | { | 126 | { |
| 144 | int ret; | 127 | int ret; |
| @@ -197,50 +180,6 @@ static int _process_sigma_firmware(struct device *dev, | |||
| 197 | 180 | ||
| 198 | return ret; | 181 | return ret; |
| 199 | } | 182 | } |
| 200 | 183 | EXPORT_SYMBOL_GPL(_process_sigma_firmware); | |
| 201 | #if IS_ENABLED(CONFIG_I2C) | ||
| 202 | |||
| 203 | static int sigma_action_write_i2c(void *control_data, | ||
| 204 | const struct sigma_action *sa, size_t len) | ||
| 205 | { | ||
| 206 | return i2c_master_send(control_data, (const unsigned char *)&sa->addr, | ||
| 207 | len); | ||
| 208 | } | ||
| 209 | |||
| 210 | int process_sigma_firmware(struct i2c_client *client, const char *name) | ||
| 211 | { | ||
| 212 | struct sigma_firmware ssfw; | ||
| 213 | |||
| 214 | ssfw.control_data = client; | ||
| 215 | ssfw.write = sigma_action_write_i2c; | ||
| 216 | |||
| 217 | return _process_sigma_firmware(&client->dev, &ssfw, name); | ||
| 218 | } | ||
| 219 | EXPORT_SYMBOL(process_sigma_firmware); | ||
| 220 | |||
| 221 | #endif | ||
| 222 | |||
| 223 | #if IS_ENABLED(CONFIG_REGMAP) | ||
| 224 | |||
| 225 | static int sigma_action_write_regmap(void *control_data, | ||
| 226 | const struct sigma_action *sa, size_t len) | ||
| 227 | { | ||
| 228 | return regmap_raw_write(control_data, be16_to_cpu(sa->addr), | ||
| 229 | sa->payload, len - 2); | ||
| 230 | } | ||
| 231 | |||
| 232 | int process_sigma_firmware_regmap(struct device *dev, struct regmap *regmap, | ||
| 233 | const char *name) | ||
| 234 | { | ||
| 235 | struct sigma_firmware ssfw; | ||
| 236 | |||
| 237 | ssfw.control_data = regmap; | ||
| 238 | ssfw.write = sigma_action_write_regmap; | ||
| 239 | |||
| 240 | return _process_sigma_firmware(dev, &ssfw, name); | ||
| 241 | } | ||
| 242 | EXPORT_SYMBOL(process_sigma_firmware_regmap); | ||
| 243 | |||
| 244 | #endif | ||
| 245 | 184 | ||
| 246 | MODULE_LICENSE("GPL"); | 185 | MODULE_LICENSE("GPL"); |
diff --git a/sound/soc/codecs/sigmadsp.h b/sound/soc/codecs/sigmadsp.h index e439cbd7af7d..c47cd23e9827 100644 --- a/sound/soc/codecs/sigmadsp.h +++ b/sound/soc/codecs/sigmadsp.h | |||
| @@ -12,6 +12,26 @@ | |||
| 12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
| 13 | #include <linux/regmap.h> | 13 | #include <linux/regmap.h> |
| 14 | 14 | ||
| 15 | struct sigma_action { | ||
| 16 | u8 instr; | ||
| 17 | u8 len_hi; | ||
| 18 | __le16 len; | ||
| 19 | __be16 addr; | ||
| 20 | unsigned char payload[]; | ||
| 21 | } __packed; | ||
| 22 | |||
| 23 | struct sigma_firmware { | ||
| 24 | const struct firmware *fw; | ||
| 25 | size_t pos; | ||
| 26 | |||
| 27 | void *control_data; | ||
| 28 | int (*write)(void *control_data, const struct sigma_action *sa, | ||
| 29 | size_t len); | ||
| 30 | }; | ||
| 31 | |||
| 32 | int _process_sigma_firmware(struct device *dev, | ||
| 33 | struct sigma_firmware *ssfw, const char *name); | ||
| 34 | |||
| 15 | struct i2c_client; | 35 | struct i2c_client; |
| 16 | 36 | ||
| 17 | extern int process_sigma_firmware(struct i2c_client *client, const char *name); | 37 | extern int process_sigma_firmware(struct i2c_client *client, const char *name); |
