xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/fm1288.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * FM1288 Voice Processor Codec driver
3  *
4  * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
5  * Author: Yeevan <showy.zhang@rock-chips.com>
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16 
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/init.h>
20 #include <linux/delay.h>
21 #include <linux/pm.h>
22 #include <linux/i2c.h>
23 #include <linux/slab.h>
24 #include <linux/gpio.h>
25 #include <linux/of_gpio.h>
26 
fm1288_i2c_probe(struct i2c_client * i2c_client,const struct i2c_device_id * id)27 static int fm1288_i2c_probe(struct i2c_client *i2c_client,
28 			    const struct i2c_device_id *id)
29 {
30 	int ret = -1;
31 	struct gpio_desc *fm1288_ctl_gpio;
32 
33 	const unsigned char reg[] = {
34 		0xFC, 0xF3, 0x68, 0x64, 0x00,
35 		0xFC, 0xF3, 0x0D, 0x3F, 0x80, 0x90, 0x94, 0x3E,
36 		0xFC, 0xF3, 0x0D, 0x3F, 0x81, 0x93, 0x83, 0xDE,
37 		0xFC, 0xF3, 0x0D, 0x3F, 0x82, 0x19, 0x2A, 0xBF,
38 		0xFC, 0xF3, 0x0D, 0x3F, 0x83, 0x40, 0x05, 0x08,
39 		0xFC, 0xF3, 0x0D, 0x3F, 0x84, 0x19, 0x3E, 0x7F,
40 		0xFC, 0xF3, 0x0D, 0x3F, 0x85, 0x80, 0x95, 0x2A,
41 		0xFC, 0xF3, 0x0D, 0x3F, 0x86, 0x2A, 0x7A, 0xAA,
42 		0xFC, 0xF3, 0x0D, 0x3F, 0x87, 0x19, 0x28, 0x4F,
43 		0xFC, 0xF3, 0x0D, 0x3F, 0x88, 0x80, 0x94, 0x3A,
44 		0xFC, 0xF3, 0x0D, 0x3F, 0x89, 0x82, 0x32, 0xD1,
45 		0xFC, 0xF3, 0x0D, 0x3F, 0x8A, 0x26, 0x79, 0x0F,
46 		0xFC, 0xF3, 0x0D, 0x3F, 0x8B, 0x19, 0x2A, 0x80,
47 		0xFC, 0xF3, 0x0D, 0x3F, 0x8C, 0x80, 0x95, 0xBA,
48 		0xFC, 0xF3, 0x0D, 0x3F, 0x8D, 0x68, 0x00, 0xA1,
49 		0xFC, 0xF3, 0x0D, 0x3F, 0x8E, 0x94, 0x96, 0xD0,
50 		0xFC, 0xF3, 0x0D, 0x3F, 0x8F, 0x90, 0x95, 0xBE,
51 		0xFC, 0xF3, 0x0D, 0x3F, 0x90, 0x19, 0x2A, 0xBF,
52 		0xFC, 0xF3, 0x0D, 0x3F, 0x91, 0x40, 0xFA, 0x0A,
53 		0xFC, 0xF3, 0x0D, 0x3F, 0x92, 0x41, 0x77, 0x0C,
54 		0xFC, 0xF3, 0x0D, 0x3F, 0x93, 0x41, 0xF4, 0x0B,
55 		0xFC, 0xF3, 0x0D, 0x3F, 0x94, 0x42, 0xB1, 0x1F,
56 		0xFC, 0xF3, 0x0D, 0x3F, 0x95, 0x42, 0xEE, 0x0E,
57 		0xFC, 0xF3, 0x0D, 0x3F, 0x96, 0x82, 0x30, 0x11,
58 		0xFC, 0xF3, 0x0D, 0x3F, 0x97, 0x27, 0x91, 0x1F,
59 		0xFC, 0xF3, 0x0D, 0x3F, 0x98, 0x22, 0x7C, 0x01,
60 		0xFC, 0xF3, 0x0D, 0x3F, 0x99, 0x27, 0x91, 0x5F,
61 		0xFC, 0xF3, 0x0D, 0x3F, 0x9A, 0x22, 0x7B, 0x01,
62 		0xFC, 0xF3, 0x0D, 0x3F, 0x9B, 0x27, 0x91, 0x9F,
63 		0xFC, 0xF3, 0x0D, 0x3F, 0x9C, 0x22, 0x7F, 0x01,
64 		0xFC, 0xF3, 0x0D, 0x3F, 0x9D, 0x27, 0x91, 0xDF,
65 		0xFC, 0xF3, 0x0D, 0x3F, 0x9E, 0x22, 0x7E, 0x01,
66 		0xFC, 0xF3, 0x0D, 0x3F, 0x9F, 0x18, 0x34, 0xBF,
67 		0xFC, 0xF3, 0x0D, 0x3F, 0xA0, 0x22, 0x7F, 0x9F,
68 		0xFC, 0xF3, 0x0D, 0x3F, 0xA1, 0x19, 0xB0, 0x5F,
69 		0xFC, 0xF3, 0x0D, 0x3F, 0xA2, 0x41, 0x00, 0x0A,
70 		0xFC, 0xF3, 0x0D, 0x3F, 0xA3, 0x90, 0x96, 0xDA,
71 		0xFC, 0xF3, 0x0D, 0x3F, 0xA4, 0x82, 0x2C, 0x4A,
72 		0xFC, 0xF3, 0x0D, 0x3F, 0xA5, 0x23, 0xA2, 0x5F,
73 		0xFC, 0xF3, 0x0D, 0x3F, 0xA6, 0x92, 0x2C, 0x4A,
74 		0xFC, 0xF3, 0x0D, 0x3F, 0xA7, 0x82, 0x32, 0x5A,
75 		0xFC, 0xF3, 0x0D, 0x3F, 0xA8, 0x19, 0x76, 0x4F,
76 		0xFC, 0xF3, 0x0D, 0x3F, 0xA9, 0x82, 0x2F, 0x2A,
77 		0xFC, 0xF3, 0x0D, 0x3F, 0xAA, 0x40, 0x03, 0x85,
78 		0xFC, 0xF3, 0x0D, 0x3F, 0xAB, 0x26, 0xEA, 0x0F,
79 		0xFC, 0xF3, 0x0D, 0x3F, 0xAC, 0x22, 0x08, 0x02,
80 		0xFC, 0xF3, 0x0D, 0x3F, 0xAD, 0x92, 0x2F, 0x2A,
81 		0xFC, 0xF3, 0x0D, 0x3F, 0xAE, 0x18, 0x28, 0x3F,
82 		0xFC, 0xF3, 0x68, 0x64, 0x00,
83 		0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x92, 0xAA,
84 		0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x3F, 0x80,
85 		0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x93, 0xE6,
86 		0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x3F, 0x83,
87 		0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x92, 0x82,
88 		0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x3F, 0x85,
89 		0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x92, 0xA7,
90 		0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x3F, 0x88,
91 		0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x83, 0x49,
92 		0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x3F, 0x91,
93 		0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x9B, 0x04,
94 		0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x3F, 0xA0,
95 		0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0x97, 0x63,
96 		0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x3F, 0xA2,
97 		0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0x82, 0x82,
98 		0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x3F, 0xA9,
99 		0xFC, 0xF3, 0x3B, 0x23, 0xF7, 0x8A, 0x64,
100 		0xFC, 0xF3, 0x3B, 0x23, 0xF8, 0x75, 0xA1,
101 		0xFC, 0xF3, 0x3B, 0x23, 0xF9, 0x82, 0x2B,
102 		0xFC, 0xF3, 0x3B, 0x23, 0xFA, 0x7C, 0x22,
103 		0xFC, 0xF3, 0x3B, 0x23, 0xFB, 0x7F, 0xFF,
104 		0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x34,
105 		0xFC, 0xF3, 0x3B, 0x23, 0xFC, 0x80, 0x0C,
106 		0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x00, 0x00,
107 		0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02,
108 		0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x00, 0x3D,
109 		0xFC, 0xF3, 0x3B, 0x23, 0x02, 0x00, 0x01,
110 		0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29,
111 		0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x09, 0x89,
112 		0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x00, 0x7F,
113 		0xFC, 0xF3, 0x3B, 0x23, 0x82, 0x02, 0x00,
114 		0xFC, 0xF3, 0x3B, 0x22, 0xE5, 0x02, 0x55,
115 		0xFC, 0xF3, 0x3B, 0x23, 0x83, 0x03, 0x00,
116 		0xFC, 0xF3, 0x3B, 0x23, 0xEE, 0x40, 0x00,
117 		0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x0C,
118 		0xFC, 0xF3, 0x3B, 0x23, 0xFD, 0x7F, 0xFF,
119 		0xFC, 0xF3, 0x3B, 0x23, 0x07, 0x00, 0x00,
120 		0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x01,
121 		0xFC, 0xF3, 0x3B, 0x23, 0x86, 0x10, 0x00,
122 		0xFC, 0xF3, 0x3B, 0x23, 0xB8, 0x00, 0x01,
123 		0xFC, 0xF3, 0x3B, 0x23, 0x48, 0x08, 0x00,
124 		0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x04,
125 		0xFC, 0xF3, 0x3B, 0x23, 0x49, 0x10, 0x00,
126 		0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x0C,
127 		0xFC, 0xF3, 0x3B, 0x23, 0xB7, 0x00, 0x00,
128 		0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x03, 0xCF,
129 		0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x04, 0x00,
130 		0xFC, 0xF3, 0x3B, 0x23, 0xBE, 0x00, 0xE0,
131 		0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00,
132 		0xFC, 0xF3, 0x3B, 0x23, 0x2D, 0x00, 0x01,
133 		0xFC, 0xF3, 0x3B, 0x23, 0x85, 0x0E, 0x00,
134 		0xFC, 0xF3, 0x3B, 0x23, 0xBF, 0x00, 0x54,
135 		0xFC, 0xF3, 0x3B, 0x23, 0x6F, 0x05, 0x00,
136 		0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x00,
137 		0xFC, 0xF3, 0x3B, 0x23, 0x10, 0x12, 0x0C,
138 		0xFC, 0xF3, 0x3B, 0x23, 0xED, 0x04, 0x00,
139 		0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x20,
140 		0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x03, 0x00,
141 		0xFC, 0xF3, 0x3B, 0x23, 0x90, 0x44, 0x44,
142 		0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00,
143 		0xFC, 0xF3, 0x3B, 0x23, 0x91, 0x44, 0x44,
144 		0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x01,
145 		0xFC, 0xF3, 0x3B, 0x23, 0xB5, 0x30, 0x00,
146 		0xFC, 0xF3, 0x3B, 0x23, 0xF1, 0x3C, 0x9B,
147 		0xFC, 0xF3, 0x3B, 0x23, 0x93, 0x44, 0x44,
148 		0xFC, 0xF3, 0x3B, 0x23, 0xF2, 0xC3, 0x65,
149 		0xFC, 0xF3, 0x3B, 0x23, 0x94, 0x44, 0x44,
150 		0xFC, 0xF3, 0x3B, 0x23, 0xF3, 0x3C, 0x9B,
151 		0xFC, 0xF3, 0x3B, 0x23, 0x95, 0x44, 0x44,
152 		0xFC, 0xF3, 0x3B, 0x23, 0xF4, 0x8A, 0x69,
153 		0xFC, 0xF3, 0x3B, 0x22, 0xC4, 0x06, 0x22,
154 		0xFC, 0xF3, 0x3B, 0x23, 0xF5, 0x6C, 0xB1,
155 		0xFC, 0xF3, 0x3B, 0x23, 0xFF, 0x7F, 0x34,
156 		0xFC, 0xF3, 0x3B, 0x23, 0xF6, 0x75, 0xA1,
157 		0xFC, 0xF3, 0x3B, 0x23, 0xFE, 0x80, 0x8B,
158 		0xFC, 0xF3, 0x3B, 0x23, 0x84, 0x0A, 0x00,
159 		0xFC, 0xF3, 0x3B, 0x23, 0xBB, 0x20, 0x00,
160 		0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00
161 	};
162 
163 	fm1288_ctl_gpio = devm_gpiod_get(&i2c_client->dev, "pwd", GPIOD_OUT_HIGH);
164 	if (IS_ERR(fm1288_ctl_gpio)) {
165 		dev_err(&i2c_client->dev, "%s Can not read property fm1288 pwd-gpios\n", __func__);
166 		return PTR_ERR(fm1288_ctl_gpio);
167 	}
168 	gpiod_direction_output(fm1288_ctl_gpio, 1);
169 	/*
170 	 * To ensure power up completely before i2c trigger,
171 	 * increase the delay of a period of time if necessary
172 	 */
173 	ret = i2c_master_send(i2c_client, reg, ARRAY_SIZE(reg));
174 	if (ret != ARRAY_SIZE(reg)) {
175 		dev_err(&i2c_client->dev, "fm1288 probe error\n");
176 		return ret;
177 	}
178 	return 0;
179 }
180 
181 static const struct i2c_device_id fm1288_i2c_id[] = {
182 	{"fm1288", 0},
183 	{ }
184 };
185 MODULE_DEVICE_TABLE(i2c, fm1288_i2c_id);
186 
187 static struct i2c_driver fm1288_i2c_driver = {
188 	.driver = {
189 		.name = "fm1288",
190 	},
191 	.probe = fm1288_i2c_probe,
192 	.id_table = fm1288_i2c_id,
193 };
194 
195 module_i2c_driver(fm1288_i2c_driver);
196 
197 MODULE_DESCRIPTION("Voice Processor fm1288 driver");
198 MODULE_AUTHOR("Yeevan <showy.zhang@rock-chips.com>");
199 MODULE_LICENSE("GPL");
200 
201