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