diff options
| author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2013-01-10 03:29:11 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-10 07:19:39 -0500 |
| commit | bbf1453e28e4e3ee2cf5a0c34a20469b4d465f0f (patch) | |
| tree | 3a7c8aa256103d0b183c3da76cc00f583012c7af | |
| parent | 9931faca02c604c22335f5a935a501bb2ace6e20 (diff) | |
ASoC: ak4642: add Device Tree support
Support for loading the ak4642 codec module via devicetree.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
| -rw-r--r-- | Documentation/devicetree/bindings/sound/ak4642.txt | 17 | ||||
| -rw-r--r-- | sound/soc/codecs/ak4642.c | 33 |
2 files changed, 48 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/sound/ak4642.txt b/Documentation/devicetree/bindings/sound/ak4642.txt new file mode 100644 index 000000000000..623d4e70ae11 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/ak4642.txt | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | AK4642 I2C transmitter | ||
| 2 | |||
| 3 | This device supports I2C mode only. | ||
| 4 | |||
| 5 | Required properties: | ||
| 6 | |||
| 7 | - compatible : "asahi-kasei,ak4642" or "asahi-kasei,ak4643" or "asahi-kasei,ak4648" | ||
| 8 | - reg : The chip select number on the I2C bus | ||
| 9 | |||
| 10 | Example: | ||
| 11 | |||
| 12 | &i2c { | ||
| 13 | ak4648: ak4648@0x12 { | ||
| 14 | compatible = "asahi-kasei,ak4642"; | ||
| 15 | reg = <0x12>; | ||
| 16 | }; | ||
| 17 | }; | ||
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 1f0cdab03294..c78794dc4b69 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| 27 | #include <linux/i2c.h> | 27 | #include <linux/i2c.h> |
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <linux/of_device.h> | ||
| 29 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 30 | #include <sound/soc.h> | 31 | #include <sound/soc.h> |
| 31 | #include <sound/initval.h> | 32 | #include <sound/initval.h> |
| @@ -513,12 +514,31 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4648 = { | |||
| 513 | }; | 514 | }; |
| 514 | 515 | ||
| 515 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | 516 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) |
| 517 | static struct of_device_id ak4642_of_match[]; | ||
| 516 | static int ak4642_i2c_probe(struct i2c_client *i2c, | 518 | static int ak4642_i2c_probe(struct i2c_client *i2c, |
| 517 | const struct i2c_device_id *id) | 519 | const struct i2c_device_id *id) |
| 518 | { | 520 | { |
| 521 | struct device_node *np = i2c->dev.of_node; | ||
| 522 | const struct snd_soc_codec_driver *driver; | ||
| 523 | |||
| 524 | driver = NULL; | ||
| 525 | if (np) { | ||
| 526 | const struct of_device_id *of_id; | ||
| 527 | |||
| 528 | of_id = of_match_device(ak4642_of_match, &i2c->dev); | ||
| 529 | if (of_id) | ||
| 530 | driver = of_id->data; | ||
| 531 | } else { | ||
| 532 | driver = (struct snd_soc_codec_driver *)id->driver_data; | ||
| 533 | } | ||
| 534 | |||
| 535 | if (!driver) { | ||
| 536 | dev_err(&i2c->dev, "no driver\n"); | ||
| 537 | return -EINVAL; | ||
| 538 | } | ||
| 539 | |||
| 519 | return snd_soc_register_codec(&i2c->dev, | 540 | return snd_soc_register_codec(&i2c->dev, |
| 520 | (struct snd_soc_codec_driver *)id->driver_data, | 541 | driver, &ak4642_dai, 1); |
| 521 | &ak4642_dai, 1); | ||
| 522 | } | 542 | } |
| 523 | 543 | ||
| 524 | static int ak4642_i2c_remove(struct i2c_client *client) | 544 | static int ak4642_i2c_remove(struct i2c_client *client) |
| @@ -527,6 +547,14 @@ static int ak4642_i2c_remove(struct i2c_client *client) | |||
| 527 | return 0; | 547 | return 0; |
| 528 | } | 548 | } |
| 529 | 549 | ||
| 550 | static struct of_device_id ak4642_of_match[] __devinitconst = { | ||
| 551 | { .compatible = "asahi-kasei,ak4642", .data = &soc_codec_dev_ak4642}, | ||
| 552 | { .compatible = "asahi-kasei,ak4643", .data = &soc_codec_dev_ak4642}, | ||
| 553 | { .compatible = "asahi-kasei,ak4648", .data = &soc_codec_dev_ak4648}, | ||
| 554 | {}, | ||
| 555 | }; | ||
| 556 | MODULE_DEVICE_TABLE(of, ak4642_of_match); | ||
| 557 | |||
| 530 | static const struct i2c_device_id ak4642_i2c_id[] = { | 558 | static const struct i2c_device_id ak4642_i2c_id[] = { |
| 531 | { "ak4642", (kernel_ulong_t)&soc_codec_dev_ak4642 }, | 559 | { "ak4642", (kernel_ulong_t)&soc_codec_dev_ak4642 }, |
| 532 | { "ak4643", (kernel_ulong_t)&soc_codec_dev_ak4642 }, | 560 | { "ak4643", (kernel_ulong_t)&soc_codec_dev_ak4642 }, |
| @@ -539,6 +567,7 @@ static struct i2c_driver ak4642_i2c_driver = { | |||
| 539 | .driver = { | 567 | .driver = { |
| 540 | .name = "ak4642-codec", | 568 | .name = "ak4642-codec", |
| 541 | .owner = THIS_MODULE, | 569 | .owner = THIS_MODULE, |
| 570 | .of_match_table = ak4642_of_match, | ||
| 542 | }, | 571 | }, |
| 543 | .probe = ak4642_i2c_probe, | 572 | .probe = ak4642_i2c_probe, |
| 544 | .remove = ak4642_i2c_remove, | 573 | .remove = ak4642_i2c_remove, |
