diff options
Diffstat (limited to 'sound/soc/codecs/ak4642.c')
-rw-r--r-- | sound/soc/codecs/ak4642.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 1f0cdab03294..2d0378709702 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[] = { | ||
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, |