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