1*9dc15f81SMark Brown // SPDX-License-Identifier: GPL-2.0-only 2*9dc15f81SMark Brown /* 3*9dc15f81SMark Brown * wm8731-i2c.c -- WM8731 ALSA SoC Audio driver I2C code 4*9dc15f81SMark Brown * 5*9dc15f81SMark Brown * Copyright 2005 Openedhand Ltd. 6*9dc15f81SMark Brown * Copyright 2006-12 Wolfson Microelectronics, plc 7*9dc15f81SMark Brown * 8*9dc15f81SMark Brown * Author: Richard Purdie <richard@openedhand.com> 9*9dc15f81SMark Brown * 10*9dc15f81SMark Brown * Based on wm8753.c by Liam Girdwood 11*9dc15f81SMark Brown */ 12*9dc15f81SMark Brown 13*9dc15f81SMark Brown #include <linux/i2c.h> 14*9dc15f81SMark Brown #include <linux/module.h> 15*9dc15f81SMark Brown #include <linux/of_device.h> 16*9dc15f81SMark Brown 17*9dc15f81SMark Brown #include "wm8731.h" 18*9dc15f81SMark Brown 19*9dc15f81SMark Brown 20*9dc15f81SMark Brown static const struct of_device_id wm8731_of_match[] = { 21*9dc15f81SMark Brown { .compatible = "wlf,wm8731", }, 22*9dc15f81SMark Brown { } 23*9dc15f81SMark Brown }; 24*9dc15f81SMark Brown MODULE_DEVICE_TABLE(of, wm8731_of_match); 25*9dc15f81SMark Brown 26*9dc15f81SMark Brown static int wm8731_i2c_probe(struct i2c_client *i2c, 27*9dc15f81SMark Brown const struct i2c_device_id *id) 28*9dc15f81SMark Brown { 29*9dc15f81SMark Brown struct wm8731_priv *wm8731; 30*9dc15f81SMark Brown int ret; 31*9dc15f81SMark Brown 32*9dc15f81SMark Brown wm8731 = devm_kzalloc(&i2c->dev, sizeof(struct wm8731_priv), 33*9dc15f81SMark Brown GFP_KERNEL); 34*9dc15f81SMark Brown if (wm8731 == NULL) 35*9dc15f81SMark Brown return -ENOMEM; 36*9dc15f81SMark Brown 37*9dc15f81SMark Brown i2c_set_clientdata(i2c, wm8731); 38*9dc15f81SMark Brown 39*9dc15f81SMark Brown wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); 40*9dc15f81SMark Brown if (IS_ERR(wm8731->regmap)) { 41*9dc15f81SMark Brown ret = PTR_ERR(wm8731->regmap); 42*9dc15f81SMark Brown dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 43*9dc15f81SMark Brown ret); 44*9dc15f81SMark Brown return ret; 45*9dc15f81SMark Brown } 46*9dc15f81SMark Brown 47*9dc15f81SMark Brown return wm8731_init(&i2c->dev, wm8731); 48*9dc15f81SMark Brown } 49*9dc15f81SMark Brown 50*9dc15f81SMark Brown static const struct i2c_device_id wm8731_i2c_id[] = { 51*9dc15f81SMark Brown { "wm8731", 0 }, 52*9dc15f81SMark Brown { } 53*9dc15f81SMark Brown }; 54*9dc15f81SMark Brown MODULE_DEVICE_TABLE(i2c, wm8731_i2c_id); 55*9dc15f81SMark Brown 56*9dc15f81SMark Brown static struct i2c_driver wm8731_i2c_driver = { 57*9dc15f81SMark Brown .driver = { 58*9dc15f81SMark Brown .name = "wm8731", 59*9dc15f81SMark Brown .of_match_table = wm8731_of_match, 60*9dc15f81SMark Brown }, 61*9dc15f81SMark Brown .probe = wm8731_i2c_probe, 62*9dc15f81SMark Brown .id_table = wm8731_i2c_id, 63*9dc15f81SMark Brown }; 64*9dc15f81SMark Brown 65*9dc15f81SMark Brown module_i2c_driver(wm8731_i2c_driver); 66*9dc15f81SMark Brown 67*9dc15f81SMark Brown MODULE_DESCRIPTION("ASoC WM8731 driver - I2C"); 68*9dc15f81SMark Brown MODULE_AUTHOR("Richard Purdie"); 69*9dc15f81SMark Brown MODULE_LICENSE("GPL"); 70