Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
max9768.c
Go to the documentation of this file.
1 /*
2  * MAX9768 AMP driver
3  *
4  * Copyright (C) 2011, 2012 by Wolfram Sang, Pengutronix e.K.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; version 2 of the License.
9  */
10 
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/i2c.h>
14 #include <linux/slab.h>
15 #include <linux/gpio.h>
16 #include <linux/regmap.h>
17 
18 #include <sound/core.h>
19 #include <sound/soc.h>
20 #include <sound/tlv.h>
21 #include <sound/max9768.h>
22 
23 /* "Registers" */
24 #define MAX9768_VOL 0
25 #define MAX9768_CTRL 3
26 
27 /* Commands */
28 #define MAX9768_CTRL_PWM 0x15
29 #define MAX9768_CTRL_FILTERLESS 0x16
30 
31 struct max9768 {
32  struct regmap *regmap;
33  int mute_gpio;
34  int shdn_gpio;
36 };
37 
38 static struct reg_default max9768_default_regs[] = {
39  { 0, 0 },
41 };
42 
43 static int max9768_get_gpio(struct snd_kcontrol *kcontrol,
44  struct snd_ctl_elem_value *ucontrol)
45 {
46  struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
47  struct max9768 *max9768 = snd_soc_codec_get_drvdata(codec);
48  int val = gpio_get_value_cansleep(max9768->mute_gpio);
49 
50  ucontrol->value.integer.value[0] = !val;
51 
52  return 0;
53 }
54 
55 static int max9768_set_gpio(struct snd_kcontrol *kcontrol,
56  struct snd_ctl_elem_value *ucontrol)
57 {
58  struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
59  struct max9768 *max9768 = snd_soc_codec_get_drvdata(codec);
60 
61  gpio_set_value_cansleep(max9768->mute_gpio, !ucontrol->value.integer.value[0]);
62 
63  return 0;
64 }
65 
66 static const unsigned int volume_tlv[] = {
68  0, 0, TLV_DB_SCALE_ITEM(-16150, 0, 0),
69  1, 1, TLV_DB_SCALE_ITEM(-9280, 0, 0),
70  2, 2, TLV_DB_SCALE_ITEM(-9030, 0, 0),
71  3, 3, TLV_DB_SCALE_ITEM(-8680, 0, 0),
72  4, 4, TLV_DB_SCALE_ITEM(-8430, 0, 0),
73  5, 5, TLV_DB_SCALE_ITEM(-8080, 0, 0),
74  6, 6, TLV_DB_SCALE_ITEM(-7830, 0, 0),
75  7, 7, TLV_DB_SCALE_ITEM(-7470, 0, 0),
76  8, 8, TLV_DB_SCALE_ITEM(-7220, 0, 0),
77  9, 9, TLV_DB_SCALE_ITEM(-6870, 0, 0),
78  10, 10, TLV_DB_SCALE_ITEM(-6620, 0, 0),
79  11, 11, TLV_DB_SCALE_ITEM(-6270, 0, 0),
80  12, 12, TLV_DB_SCALE_ITEM(-6020, 0, 0),
81  13, 13, TLV_DB_SCALE_ITEM(-5670, 0, 0),
82  14, 14, TLV_DB_SCALE_ITEM(-5420, 0, 0),
83  15, 17, TLV_DB_SCALE_ITEM(-5060, 250, 0),
84  18, 18, TLV_DB_SCALE_ITEM(-4370, 0, 0),
85  19, 19, TLV_DB_SCALE_ITEM(-4210, 0, 0),
86  20, 20, TLV_DB_SCALE_ITEM(-3960, 0, 0),
87  21, 21, TLV_DB_SCALE_ITEM(-3760, 0, 0),
88  22, 22, TLV_DB_SCALE_ITEM(-3600, 0, 0),
89  23, 23, TLV_DB_SCALE_ITEM(-3340, 0, 0),
90  24, 24, TLV_DB_SCALE_ITEM(-3150, 0, 0),
91  25, 25, TLV_DB_SCALE_ITEM(-2980, 0, 0),
92  26, 26, TLV_DB_SCALE_ITEM(-2720, 0, 0),
93  27, 27, TLV_DB_SCALE_ITEM(-2520, 0, 0),
94  28, 30, TLV_DB_SCALE_ITEM(-2350, 190, 0),
95  31, 31, TLV_DB_SCALE_ITEM(-1750, 0, 0),
96  32, 34, TLV_DB_SCALE_ITEM(-1640, 100, 0),
97  35, 37, TLV_DB_SCALE_ITEM(-1310, 110, 0),
98  38, 39, TLV_DB_SCALE_ITEM(-990, 100, 0),
99  40, 40, TLV_DB_SCALE_ITEM(-710, 0, 0),
100  41, 41, TLV_DB_SCALE_ITEM(-600, 0, 0),
101  42, 42, TLV_DB_SCALE_ITEM(-500, 0, 0),
102  43, 43, TLV_DB_SCALE_ITEM(-340, 0, 0),
103  44, 44, TLV_DB_SCALE_ITEM(-190, 0, 0),
104  45, 45, TLV_DB_SCALE_ITEM(-50, 0, 0),
105  46, 46, TLV_DB_SCALE_ITEM(50, 0, 0),
106  47, 50, TLV_DB_SCALE_ITEM(120, 40, 0),
107  51, 57, TLV_DB_SCALE_ITEM(290, 50, 0),
108  58, 58, TLV_DB_SCALE_ITEM(650, 0, 0),
109  59, 62, TLV_DB_SCALE_ITEM(700, 60, 0),
110  63, 63, TLV_DB_SCALE_ITEM(950, 0, 0),
111 };
112 
113 static const struct snd_kcontrol_new max9768_volume[] = {
114  SOC_SINGLE_TLV("Playback Volume", MAX9768_VOL, 0, 63, 0, volume_tlv),
115 };
116 
117 static const struct snd_kcontrol_new max9768_mute[] = {
118  SOC_SINGLE_BOOL_EXT("Playback Switch", 0, max9768_get_gpio, max9768_set_gpio),
119 };
120 
121 static int max9768_probe(struct snd_soc_codec *codec)
122 {
123  struct max9768 *max9768 = snd_soc_codec_get_drvdata(codec);
124  int ret;
125 
126  codec->control_data = max9768->regmap;
127  ret = snd_soc_codec_set_cache_io(codec, 2, 6, SND_SOC_REGMAP);
128  if (ret)
129  return ret;
130 
131  if (max9768->flags & MAX9768_FLAG_CLASSIC_PWM) {
133  if (ret)
134  return ret;
135  }
136 
137  if (gpio_is_valid(max9768->mute_gpio)) {
138  ret = snd_soc_add_codec_controls(codec, max9768_mute,
139  ARRAY_SIZE(max9768_mute));
140  if (ret)
141  return ret;
142  }
143 
144  return 0;
145 }
146 
147 static struct snd_soc_codec_driver max9768_codec_driver = {
148  .probe = max9768_probe,
149  .controls = max9768_volume,
150  .num_controls = ARRAY_SIZE(max9768_volume),
151 };
152 
153 static const struct regmap_config max9768_i2c_regmap_config = {
154  .reg_bits = 2,
155  .val_bits = 6,
156  .max_register = 3,
157  .reg_defaults = max9768_default_regs,
158  .num_reg_defaults = ARRAY_SIZE(max9768_default_regs),
159  .cache_type = REGCACHE_RBTREE,
160 };
161 
162 static int __devinit max9768_i2c_probe(struct i2c_client *client,
163  const struct i2c_device_id *id)
164 {
165  struct max9768 *max9768;
166  struct max9768_pdata *pdata = client->dev.platform_data;
167  int err;
168 
169  max9768 = devm_kzalloc(&client->dev, sizeof(*max9768), GFP_KERNEL);
170  if (!max9768)
171  return -ENOMEM;
172 
173  if (pdata) {
174  /* Mute on powerup to avoid clicks */
175  err = gpio_request_one(pdata->mute_gpio, GPIOF_INIT_HIGH, "MAX9768 Mute");
176  max9768->mute_gpio = err ?: pdata->mute_gpio;
177 
178  /* Activate chip by releasing shutdown, enables I2C */
179  err = gpio_request_one(pdata->shdn_gpio, GPIOF_INIT_HIGH, "MAX9768 Shutdown");
180  max9768->shdn_gpio = err ?: pdata->shdn_gpio;
181 
182  max9768->flags = pdata->flags;
183  } else {
184  max9768->shdn_gpio = -EINVAL;
185  max9768->mute_gpio = -EINVAL;
186  }
187 
188  i2c_set_clientdata(client, max9768);
189 
190  max9768->regmap = regmap_init_i2c(client, &max9768_i2c_regmap_config);
191  if (IS_ERR(max9768->regmap)) {
192  err = PTR_ERR(max9768->regmap);
193  goto err_gpio_free;
194  }
195 
196  err = snd_soc_register_codec(&client->dev, &max9768_codec_driver, NULL, 0);
197  if (err)
198  goto err_regmap_free;
199 
200  return 0;
201 
202  err_regmap_free:
203  regmap_exit(max9768->regmap);
204  err_gpio_free:
205  if (gpio_is_valid(max9768->shdn_gpio))
206  gpio_free(max9768->shdn_gpio);
207  if (gpio_is_valid(max9768->mute_gpio))
208  gpio_free(max9768->mute_gpio);
209 
210  return err;
211 }
212 
213 static int __devexit max9768_i2c_remove(struct i2c_client *client)
214 {
215  struct max9768 *max9768 = i2c_get_clientdata(client);
216 
217  snd_soc_unregister_codec(&client->dev);
218  regmap_exit(max9768->regmap);
219 
220  if (gpio_is_valid(max9768->shdn_gpio))
221  gpio_free(max9768->shdn_gpio);
222  if (gpio_is_valid(max9768->mute_gpio))
223  gpio_free(max9768->mute_gpio);
224 
225  return 0;
226 }
227 
228 static const struct i2c_device_id max9768_i2c_id[] = {
229  { "max9768", 0 },
230  { }
231 };
232 MODULE_DEVICE_TABLE(i2c, max9768_i2c_id);
233 
234 static struct i2c_driver max9768_i2c_driver = {
235  .driver = {
236  .name = "max9768",
237  .owner = THIS_MODULE,
238  },
239  .probe = max9768_i2c_probe,
240  .remove = __devexit_p(max9768_i2c_remove),
241  .id_table = max9768_i2c_id,
242 };
243 module_i2c_driver(max9768_i2c_driver);
244 
245 MODULE_AUTHOR("Wolfram Sang <[email protected]>");
246 MODULE_DESCRIPTION("ASoC MAX9768 amplifier driver");
247 MODULE_LICENSE("GPL v2");