198615454SKuninori Morimoto /* 298615454SKuninori Morimoto * DA7210 ALSA Soc codec driver 398615454SKuninori Morimoto * 498615454SKuninori Morimoto * Copyright (c) 2009 Dialog Semiconductor 598615454SKuninori Morimoto * Written by David Chen <Dajun.chen@diasemi.com> 698615454SKuninori Morimoto * 798615454SKuninori Morimoto * Copyright (C) 2009 Renesas Solutions Corp. 898615454SKuninori Morimoto * Cleanups by Kuninori Morimoto <morimoto.kuninori@renesas.com> 998615454SKuninori Morimoto * 1098615454SKuninori Morimoto * Tested on SuperH Ecovec24 board with S16/S24 LE in 48KHz using I2S 1198615454SKuninori Morimoto * 1298615454SKuninori Morimoto * This program is free software; you can redistribute it and/or modify it 1398615454SKuninori Morimoto * under the terms of the GNU General Public License as published by the 1498615454SKuninori Morimoto * Free Software Foundation; either version 2 of the License, or (at your 1598615454SKuninori Morimoto * option) any later version. 1698615454SKuninori Morimoto */ 1798615454SKuninori Morimoto 1898615454SKuninori Morimoto #include <linux/delay.h> 1998615454SKuninori Morimoto #include <linux/i2c.h> 2098615454SKuninori Morimoto #include <linux/platform_device.h> 215a0e3ad6STejun Heo #include <linux/slab.h> 2298615454SKuninori Morimoto #include <sound/pcm.h> 2398615454SKuninori Morimoto #include <sound/pcm_params.h> 24ce6120ccSLiam Girdwood #include <sound/soc.h> 2598615454SKuninori Morimoto #include <sound/initval.h> 26a7e7cd5bSKuninori Morimoto #include <sound/tlv.h> 2798615454SKuninori Morimoto 2898615454SKuninori Morimoto /* DA7210 register space */ 2998615454SKuninori Morimoto #define DA7210_STATUS 0x02 3098615454SKuninori Morimoto #define DA7210_STARTUP1 0x03 3198615454SKuninori Morimoto #define DA7210_MIC_L 0x07 3298615454SKuninori Morimoto #define DA7210_MIC_R 0x08 3398615454SKuninori Morimoto #define DA7210_INMIX_L 0x0D 3498615454SKuninori Morimoto #define DA7210_INMIX_R 0x0E 3598615454SKuninori Morimoto #define DA7210_ADC_HPF 0x0F 3698615454SKuninori Morimoto #define DA7210_ADC 0x10 370ee6e9e7SAshish Chavan #define DA7210_ADC_EQ1_2 0X11 380ee6e9e7SAshish Chavan #define DA7210_ADC_EQ3_4 0x12 390ee6e9e7SAshish Chavan #define DA7210_ADC_EQ5 0x13 4098615454SKuninori Morimoto #define DA7210_DAC_HPF 0x14 4198615454SKuninori Morimoto #define DA7210_DAC_L 0x15 4298615454SKuninori Morimoto #define DA7210_DAC_R 0x16 4398615454SKuninori Morimoto #define DA7210_DAC_SEL 0x17 440ee6e9e7SAshish Chavan #define DA7210_DAC_EQ1_2 0x19 450ee6e9e7SAshish Chavan #define DA7210_DAC_EQ3_4 0x1A 460ee6e9e7SAshish Chavan #define DA7210_DAC_EQ5 0x1B 4798615454SKuninori Morimoto #define DA7210_OUTMIX_L 0x1C 4898615454SKuninori Morimoto #define DA7210_OUTMIX_R 0x1D 4998615454SKuninori Morimoto #define DA7210_HP_L_VOL 0x21 5098615454SKuninori Morimoto #define DA7210_HP_R_VOL 0x22 5198615454SKuninori Morimoto #define DA7210_HP_CFG 0x23 5298615454SKuninori Morimoto #define DA7210_DAI_SRC_SEL 0x25 5398615454SKuninori Morimoto #define DA7210_DAI_CFG1 0x26 5498615454SKuninori Morimoto #define DA7210_DAI_CFG3 0x28 55960b3b4bSKuninori Morimoto #define DA7210_PLL_DIV1 0x29 56960b3b4bSKuninori Morimoto #define DA7210_PLL_DIV2 0x2A 5798615454SKuninori Morimoto #define DA7210_PLL_DIV3 0x2B 5898615454SKuninori Morimoto #define DA7210_PLL 0x2C 59960b3b4bSKuninori Morimoto #define DA7210_A_HID_UNLOCK 0x8A 60960b3b4bSKuninori Morimoto #define DA7210_A_TEST_UNLOCK 0x8B 61960b3b4bSKuninori Morimoto #define DA7210_A_PLL1 0x90 62960b3b4bSKuninori Morimoto #define DA7210_A_CP_MODE 0xA7 6398615454SKuninori Morimoto 6498615454SKuninori Morimoto /* STARTUP1 bit fields */ 6598615454SKuninori Morimoto #define DA7210_SC_MST_EN (1 << 0) 6698615454SKuninori Morimoto 6798615454SKuninori Morimoto /* MIC_L bit fields */ 6898615454SKuninori Morimoto #define DA7210_MICBIAS_EN (1 << 6) 6998615454SKuninori Morimoto #define DA7210_MIC_L_EN (1 << 7) 7098615454SKuninori Morimoto 7198615454SKuninori Morimoto /* MIC_R bit fields */ 7298615454SKuninori Morimoto #define DA7210_MIC_R_EN (1 << 7) 7398615454SKuninori Morimoto 7498615454SKuninori Morimoto /* INMIX_L bit fields */ 7598615454SKuninori Morimoto #define DA7210_IN_L_EN (1 << 7) 7698615454SKuninori Morimoto 7798615454SKuninori Morimoto /* INMIX_R bit fields */ 7898615454SKuninori Morimoto #define DA7210_IN_R_EN (1 << 7) 7998615454SKuninori Morimoto 8098615454SKuninori Morimoto /* ADC bit fields */ 8198615454SKuninori Morimoto #define DA7210_ADC_L_EN (1 << 3) 8298615454SKuninori Morimoto #define DA7210_ADC_R_EN (1 << 7) 8398615454SKuninori Morimoto 843a9d6202SKuninori Morimoto /* DAC/ADC HPF fields */ 853a9d6202SKuninori Morimoto #define DA7210_VOICE_F0_MASK (0x7 << 4) 863a9d6202SKuninori Morimoto #define DA7210_VOICE_F0_25 (1 << 4) 873a9d6202SKuninori Morimoto #define DA7210_VOICE_EN (1 << 7) 88c2151433SMark Brown 8998615454SKuninori Morimoto /* DAC_SEL bit fields */ 9098615454SKuninori Morimoto #define DA7210_DAC_L_SRC_DAI_L (4 << 0) 9198615454SKuninori Morimoto #define DA7210_DAC_L_EN (1 << 3) 9298615454SKuninori Morimoto #define DA7210_DAC_R_SRC_DAI_R (5 << 4) 9398615454SKuninori Morimoto #define DA7210_DAC_R_EN (1 << 7) 9498615454SKuninori Morimoto 9598615454SKuninori Morimoto /* OUTMIX_L bit fields */ 9698615454SKuninori Morimoto #define DA7210_OUT_L_EN (1 << 7) 9798615454SKuninori Morimoto 9898615454SKuninori Morimoto /* OUTMIX_R bit fields */ 9998615454SKuninori Morimoto #define DA7210_OUT_R_EN (1 << 7) 10098615454SKuninori Morimoto 10198615454SKuninori Morimoto /* HP_CFG bit fields */ 10298615454SKuninori Morimoto #define DA7210_HP_2CAP_MODE (1 << 1) 10398615454SKuninori Morimoto #define DA7210_HP_SENSE_EN (1 << 2) 10498615454SKuninori Morimoto #define DA7210_HP_L_EN (1 << 3) 10598615454SKuninori Morimoto #define DA7210_HP_MODE (1 << 6) 10698615454SKuninori Morimoto #define DA7210_HP_R_EN (1 << 7) 10798615454SKuninori Morimoto 10898615454SKuninori Morimoto /* DAI_SRC_SEL bit fields */ 10998615454SKuninori Morimoto #define DA7210_DAI_OUT_L_SRC (6 << 0) 11098615454SKuninori Morimoto #define DA7210_DAI_OUT_R_SRC (7 << 4) 11198615454SKuninori Morimoto 11298615454SKuninori Morimoto /* DAI_CFG1 bit fields */ 11398615454SKuninori Morimoto #define DA7210_DAI_WORD_S16_LE (0 << 0) 1140f8ea586SAshish Chavan #define DA7210_DAI_WORD_S20_3LE (1 << 0) 11598615454SKuninori Morimoto #define DA7210_DAI_WORD_S24_LE (2 << 0) 1160f8ea586SAshish Chavan #define DA7210_DAI_WORD_S32_LE (3 << 0) 11798615454SKuninori Morimoto #define DA7210_DAI_FLEN_64BIT (1 << 2) 1180f8ea586SAshish Chavan #define DA7210_DAI_MODE_SLAVE (0 << 7) 11998615454SKuninori Morimoto #define DA7210_DAI_MODE_MASTER (1 << 7) 12098615454SKuninori Morimoto 12198615454SKuninori Morimoto /* DAI_CFG3 bit fields */ 12298615454SKuninori Morimoto #define DA7210_DAI_FORMAT_I2SMODE (0 << 0) 1230f8ea586SAshish Chavan #define DA7210_DAI_FORMAT_LEFT_J (1 << 0) 1240f8ea586SAshish Chavan #define DA7210_DAI_FORMAT_RIGHT_J (2 << 0) 12598615454SKuninori Morimoto #define DA7210_DAI_OE (1 << 3) 12698615454SKuninori Morimoto #define DA7210_DAI_EN (1 << 7) 12798615454SKuninori Morimoto 12898615454SKuninori Morimoto /*PLL_DIV3 bit fields */ 12998615454SKuninori Morimoto #define DA7210_MCLK_RANGE_10_20_MHZ (1 << 4) 13098615454SKuninori Morimoto #define DA7210_PLL_BYP (1 << 6) 13198615454SKuninori Morimoto 13298615454SKuninori Morimoto /* PLL bit fields */ 1333a9d6202SKuninori Morimoto #define DA7210_PLL_FS_MASK (0xF << 0) 1343a9d6202SKuninori Morimoto #define DA7210_PLL_FS_8000 (0x1 << 0) 135960b3b4bSKuninori Morimoto #define DA7210_PLL_FS_11025 (0x2 << 0) 1363a9d6202SKuninori Morimoto #define DA7210_PLL_FS_12000 (0x3 << 0) 1373a9d6202SKuninori Morimoto #define DA7210_PLL_FS_16000 (0x5 << 0) 138960b3b4bSKuninori Morimoto #define DA7210_PLL_FS_22050 (0x6 << 0) 1393a9d6202SKuninori Morimoto #define DA7210_PLL_FS_24000 (0x7 << 0) 1403a9d6202SKuninori Morimoto #define DA7210_PLL_FS_32000 (0x9 << 0) 141960b3b4bSKuninori Morimoto #define DA7210_PLL_FS_44100 (0xA << 0) 1423a9d6202SKuninori Morimoto #define DA7210_PLL_FS_48000 (0xB << 0) 143960b3b4bSKuninori Morimoto #define DA7210_PLL_FS_88200 (0xE << 0) 1443a9d6202SKuninori Morimoto #define DA7210_PLL_FS_96000 (0xF << 0) 145960b3b4bSKuninori Morimoto #define DA7210_PLL_EN (0x1 << 7) 14698615454SKuninori Morimoto 14798615454SKuninori Morimoto #define DA7210_VERSION "0.0.1" 14898615454SKuninori Morimoto 149a7e7cd5bSKuninori Morimoto /* 150a7e7cd5bSKuninori Morimoto * Playback Volume 151a7e7cd5bSKuninori Morimoto * 152a7e7cd5bSKuninori Morimoto * max : 0x3F (+15.0 dB) 153a7e7cd5bSKuninori Morimoto * (1.5 dB step) 154a7e7cd5bSKuninori Morimoto * min : 0x11 (-54.0 dB) 155a7e7cd5bSKuninori Morimoto * mute : 0x10 156a7e7cd5bSKuninori Morimoto * reserved : 0x00 - 0x0F 157a7e7cd5bSKuninori Morimoto * 158a7e7cd5bSKuninori Morimoto * Reserved area are considered as "mute". 159a7e7cd5bSKuninori Morimoto */ 1607a0e67b6SAshish Chavan static const unsigned int hp_out_tlv[] = { 1617a0e67b6SAshish Chavan TLV_DB_RANGE_HEAD(2), 1627a0e67b6SAshish Chavan 0x0, 0x10, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1), 1637a0e67b6SAshish Chavan /* -54 dB to +15 dB */ 1647a0e67b6SAshish Chavan 0x11, 0x3f, TLV_DB_SCALE_ITEM(-5400, 150, 0), 1657a0e67b6SAshish Chavan }; 166a7e7cd5bSKuninori Morimoto 1670ee6e9e7SAshish Chavan static const DECLARE_TLV_DB_SCALE(eq_gain_tlv, -1050, 150, 0); 1680ee6e9e7SAshish Chavan static const DECLARE_TLV_DB_SCALE(adc_eq_master_gain_tlv, -1800, 600, 1); 1690ee6e9e7SAshish Chavan 170*4ced2b96SAshish Chavan /* ADC and DAC high pass filter f0 value */ 171*4ced2b96SAshish Chavan static const char const *da7210_hpf_cutoff_txt[] = { 172*4ced2b96SAshish Chavan "Fs/8192*pi", "Fs/4096*pi", "Fs/2048*pi", "Fs/1024*pi" 173*4ced2b96SAshish Chavan }; 174*4ced2b96SAshish Chavan 175*4ced2b96SAshish Chavan static const struct soc_enum da7210_dac_hpf_cutoff = 176*4ced2b96SAshish Chavan SOC_ENUM_SINGLE(DA7210_DAC_HPF, 0, 4, da7210_hpf_cutoff_txt); 177*4ced2b96SAshish Chavan 178*4ced2b96SAshish Chavan static const struct soc_enum da7210_adc_hpf_cutoff = 179*4ced2b96SAshish Chavan SOC_ENUM_SINGLE(DA7210_ADC_HPF, 0, 4, da7210_hpf_cutoff_txt); 180*4ced2b96SAshish Chavan 181*4ced2b96SAshish Chavan /* ADC and DAC voice (8kHz) high pass cutoff value */ 182*4ced2b96SAshish Chavan static const char const *da7210_vf_cutoff_txt[] = { 183*4ced2b96SAshish Chavan "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" 184*4ced2b96SAshish Chavan }; 185*4ced2b96SAshish Chavan 186*4ced2b96SAshish Chavan static const struct soc_enum da7210_dac_vf_cutoff = 187*4ced2b96SAshish Chavan SOC_ENUM_SINGLE(DA7210_DAC_HPF, 4, 8, da7210_vf_cutoff_txt); 188*4ced2b96SAshish Chavan 189*4ced2b96SAshish Chavan static const struct soc_enum da7210_adc_vf_cutoff = 190*4ced2b96SAshish Chavan SOC_ENUM_SINGLE(DA7210_ADC_HPF, 4, 8, da7210_vf_cutoff_txt); 191*4ced2b96SAshish Chavan 192a7e7cd5bSKuninori Morimoto static const struct snd_kcontrol_new da7210_snd_controls[] = { 193a7e7cd5bSKuninori Morimoto 194a7e7cd5bSKuninori Morimoto SOC_DOUBLE_R_TLV("HeadPhone Playback Volume", 195a7e7cd5bSKuninori Morimoto DA7210_HP_L_VOL, DA7210_HP_R_VOL, 196a7e7cd5bSKuninori Morimoto 0, 0x3F, 0, hp_out_tlv), 1970ee6e9e7SAshish Chavan 1980ee6e9e7SAshish Chavan /* DAC Equalizer controls */ 1990ee6e9e7SAshish Chavan SOC_SINGLE("DAC EQ Switch", DA7210_DAC_EQ5, 7, 1, 0), 2000ee6e9e7SAshish Chavan SOC_SINGLE_TLV("DAC EQ1 Volume", DA7210_DAC_EQ1_2, 0, 0xf, 1, 2010ee6e9e7SAshish Chavan eq_gain_tlv), 2020ee6e9e7SAshish Chavan SOC_SINGLE_TLV("DAC EQ2 Volume", DA7210_DAC_EQ1_2, 4, 0xf, 1, 2030ee6e9e7SAshish Chavan eq_gain_tlv), 2040ee6e9e7SAshish Chavan SOC_SINGLE_TLV("DAC EQ3 Volume", DA7210_DAC_EQ3_4, 0, 0xf, 1, 2050ee6e9e7SAshish Chavan eq_gain_tlv), 2060ee6e9e7SAshish Chavan SOC_SINGLE_TLV("DAC EQ4 Volume", DA7210_DAC_EQ3_4, 4, 0xf, 1, 2070ee6e9e7SAshish Chavan eq_gain_tlv), 2080ee6e9e7SAshish Chavan SOC_SINGLE_TLV("DAC EQ5 Volume", DA7210_DAC_EQ5, 0, 0xf, 1, 2090ee6e9e7SAshish Chavan eq_gain_tlv), 2100ee6e9e7SAshish Chavan 2110ee6e9e7SAshish Chavan /* ADC Equalizer controls */ 2120ee6e9e7SAshish Chavan SOC_SINGLE("ADC EQ Switch", DA7210_ADC_EQ5, 7, 1, 0), 2130ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ Master Volume", DA7210_ADC_EQ5, 4, 0x3, 2140ee6e9e7SAshish Chavan 1, adc_eq_master_gain_tlv), 2150ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ1 Volume", DA7210_ADC_EQ1_2, 0, 0xf, 1, 2160ee6e9e7SAshish Chavan eq_gain_tlv), 2170ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ2 Volume", DA7210_ADC_EQ1_2, 4, 0xf, 1, 2180ee6e9e7SAshish Chavan eq_gain_tlv), 2190ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ3 Volume", DA7210_ADC_EQ3_4, 0, 0xf, 1, 2200ee6e9e7SAshish Chavan eq_gain_tlv), 2210ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ4 Volume", DA7210_ADC_EQ3_4, 4, 0xf, 1, 2220ee6e9e7SAshish Chavan eq_gain_tlv), 2230ee6e9e7SAshish Chavan SOC_SINGLE_TLV("ADC EQ5 Volume", DA7210_ADC_EQ5, 0, 0xf, 1, 2240ee6e9e7SAshish Chavan eq_gain_tlv), 225*4ced2b96SAshish Chavan 226*4ced2b96SAshish Chavan SOC_SINGLE("DAC HPF Switch", DA7210_DAC_HPF, 3, 1, 0), 227*4ced2b96SAshish Chavan SOC_ENUM("DAC HPF Cutoff", da7210_dac_hpf_cutoff), 228*4ced2b96SAshish Chavan SOC_SINGLE("DAC Voice Mode Switch", DA7210_DAC_HPF, 7, 1, 0), 229*4ced2b96SAshish Chavan SOC_ENUM("DAC Voice Cutoff", da7210_dac_vf_cutoff), 230*4ced2b96SAshish Chavan 231*4ced2b96SAshish Chavan SOC_SINGLE("ADC HPF Switch", DA7210_ADC_HPF, 3, 1, 0), 232*4ced2b96SAshish Chavan SOC_ENUM("ADC HPF Cutoff", da7210_adc_hpf_cutoff), 233*4ced2b96SAshish Chavan SOC_SINGLE("ADC Voice Mode Switch", DA7210_ADC_HPF, 7, 1, 0), 234*4ced2b96SAshish Chavan SOC_ENUM("ADC Voice Cutoff", da7210_adc_vf_cutoff), 235a7e7cd5bSKuninori Morimoto }; 236a7e7cd5bSKuninori Morimoto 23798615454SKuninori Morimoto /* Codec private data */ 23898615454SKuninori Morimoto struct da7210_priv { 239f0fba2adSLiam Girdwood enum snd_soc_control_type control_type; 24098615454SKuninori Morimoto }; 24198615454SKuninori Morimoto 24298615454SKuninori Morimoto /* 24398615454SKuninori Morimoto * Register cache 24498615454SKuninori Morimoto */ 24598615454SKuninori Morimoto static const u8 da7210_reg[] = { 24698615454SKuninori Morimoto 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R0 - R7 */ 24798615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, /* R8 - RF */ 24898615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x10, 0x54, /* R10 - R17 */ 24998615454SKuninori Morimoto 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R18 - R1F */ 25098615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x02, 0x00, 0x76, 0x00, 0x00, /* R20 - R27 */ 25198615454SKuninori Morimoto 0x04, 0x00, 0x00, 0x30, 0x2A, 0x00, 0x40, 0x00, /* R28 - R2F */ 25298615454SKuninori Morimoto 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, /* R30 - R37 */ 25398615454SKuninori Morimoto 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, /* R38 - R3F */ 25498615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R40 - R4F */ 25598615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R48 - R4F */ 25698615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R50 - R57 */ 25798615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R58 - R5F */ 25898615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R60 - R67 */ 25998615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R68 - R6F */ 26098615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R70 - R77 */ 26198615454SKuninori Morimoto 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x54, 0x00, /* R78 - R7F */ 26298615454SKuninori Morimoto 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, /* R80 - R87 */ 26398615454SKuninori Morimoto 0x00, /* R88 */ 26498615454SKuninori Morimoto }; 26598615454SKuninori Morimoto 26640a49710SAxel Lin static int da7210_volatile_register(struct snd_soc_codec *codec, 26740a49710SAxel Lin unsigned int reg) 26898615454SKuninori Morimoto { 26940a49710SAxel Lin switch (reg) { 27040a49710SAxel Lin case DA7210_STATUS: 27140a49710SAxel Lin return 1; 27240a49710SAxel Lin default: 27398615454SKuninori Morimoto return 0; 27498615454SKuninori Morimoto } 27598615454SKuninori Morimoto } 27698615454SKuninori Morimoto static int da7210_startup(struct snd_pcm_substream *substream, 27798615454SKuninori Morimoto struct snd_soc_dai *dai) 27898615454SKuninori Morimoto { 27998615454SKuninori Morimoto int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 28098615454SKuninori Morimoto struct snd_soc_codec *codec = dai->codec; 28198615454SKuninori Morimoto 28298615454SKuninori Morimoto if (is_play) { 28398615454SKuninori Morimoto /* Enable Out */ 28498615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_OUTMIX_L, 0x1F, 0x10); 28598615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_OUTMIX_R, 0x1F, 0x10); 28698615454SKuninori Morimoto 28798615454SKuninori Morimoto } else { 28898615454SKuninori Morimoto /* Volume 7 */ 28998615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_MIC_L, 0x7, 0x7); 29098615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_MIC_R, 0x7, 0x7); 29198615454SKuninori Morimoto 29298615454SKuninori Morimoto /* Enable Mic */ 29398615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_INMIX_L, 0x1F, 0x1); 29498615454SKuninori Morimoto snd_soc_update_bits(codec, DA7210_INMIX_R, 0x1F, 0x1); 29598615454SKuninori Morimoto } 29698615454SKuninori Morimoto 29798615454SKuninori Morimoto return 0; 29898615454SKuninori Morimoto } 29998615454SKuninori Morimoto 30098615454SKuninori Morimoto /* 30198615454SKuninori Morimoto * Set PCM DAI word length. 30298615454SKuninori Morimoto */ 30398615454SKuninori Morimoto static int da7210_hw_params(struct snd_pcm_substream *substream, 30498615454SKuninori Morimoto struct snd_pcm_hw_params *params, 30598615454SKuninori Morimoto struct snd_soc_dai *dai) 30698615454SKuninori Morimoto { 30798615454SKuninori Morimoto struct snd_soc_pcm_runtime *rtd = substream->private_data; 308f0fba2adSLiam Girdwood struct snd_soc_codec *codec = rtd->codec; 30998615454SKuninori Morimoto u32 dai_cfg1; 310960b3b4bSKuninori Morimoto u32 fs, bypass; 31198615454SKuninori Morimoto 31298615454SKuninori Morimoto /* set DAI source to Left and Right ADC */ 31340a49710SAxel Lin snd_soc_write(codec, DA7210_DAI_SRC_SEL, 31498615454SKuninori Morimoto DA7210_DAI_OUT_R_SRC | DA7210_DAI_OUT_L_SRC); 31598615454SKuninori Morimoto 31698615454SKuninori Morimoto /* Enable DAI */ 31740a49710SAxel Lin snd_soc_write(codec, DA7210_DAI_CFG3, DA7210_DAI_OE | DA7210_DAI_EN); 31898615454SKuninori Morimoto 31940a49710SAxel Lin dai_cfg1 = 0xFC & snd_soc_read(codec, DA7210_DAI_CFG1); 32098615454SKuninori Morimoto 32198615454SKuninori Morimoto switch (params_format(params)) { 32298615454SKuninori Morimoto case SNDRV_PCM_FORMAT_S16_LE: 32398615454SKuninori Morimoto dai_cfg1 |= DA7210_DAI_WORD_S16_LE; 32498615454SKuninori Morimoto break; 3250f8ea586SAshish Chavan case SNDRV_PCM_FORMAT_S20_3LE: 3260f8ea586SAshish Chavan dai_cfg1 |= DA7210_DAI_WORD_S20_3LE; 3270f8ea586SAshish Chavan break; 32898615454SKuninori Morimoto case SNDRV_PCM_FORMAT_S24_LE: 32998615454SKuninori Morimoto dai_cfg1 |= DA7210_DAI_WORD_S24_LE; 33098615454SKuninori Morimoto break; 3310f8ea586SAshish Chavan case SNDRV_PCM_FORMAT_S32_LE: 3320f8ea586SAshish Chavan dai_cfg1 |= DA7210_DAI_WORD_S32_LE; 3330f8ea586SAshish Chavan break; 33498615454SKuninori Morimoto default: 33598615454SKuninori Morimoto return -EINVAL; 33698615454SKuninori Morimoto } 33798615454SKuninori Morimoto 33840a49710SAxel Lin snd_soc_write(codec, DA7210_DAI_CFG1, dai_cfg1); 33998615454SKuninori Morimoto 34098615454SKuninori Morimoto switch (params_rate(params)) { 3413a9d6202SKuninori Morimoto case 8000: 3423a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_8000; 343960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 344960b3b4bSKuninori Morimoto break; 345960b3b4bSKuninori Morimoto case 11025: 346960b3b4bSKuninori Morimoto fs = DA7210_PLL_FS_11025; 347960b3b4bSKuninori Morimoto bypass = 0; 3483a9d6202SKuninori Morimoto break; 3493a9d6202SKuninori Morimoto case 12000: 3503a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_12000; 351960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 3523a9d6202SKuninori Morimoto break; 3533a9d6202SKuninori Morimoto case 16000: 3543a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_16000; 355960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 356960b3b4bSKuninori Morimoto break; 357960b3b4bSKuninori Morimoto case 22050: 358960b3b4bSKuninori Morimoto fs = DA7210_PLL_FS_22050; 359960b3b4bSKuninori Morimoto bypass = 0; 3603a9d6202SKuninori Morimoto break; 3613a9d6202SKuninori Morimoto case 32000: 3623a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_32000; 363960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 364960b3b4bSKuninori Morimoto break; 365960b3b4bSKuninori Morimoto case 44100: 366960b3b4bSKuninori Morimoto fs = DA7210_PLL_FS_44100; 367960b3b4bSKuninori Morimoto bypass = 0; 3683a9d6202SKuninori Morimoto break; 36998615454SKuninori Morimoto case 48000: 3703a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_48000; 371960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 372960b3b4bSKuninori Morimoto break; 373960b3b4bSKuninori Morimoto case 88200: 374960b3b4bSKuninori Morimoto fs = DA7210_PLL_FS_88200; 375960b3b4bSKuninori Morimoto bypass = 0; 3763a9d6202SKuninori Morimoto break; 3773a9d6202SKuninori Morimoto case 96000: 3783a9d6202SKuninori Morimoto fs = DA7210_PLL_FS_96000; 379960b3b4bSKuninori Morimoto bypass = DA7210_PLL_BYP; 38098615454SKuninori Morimoto break; 38198615454SKuninori Morimoto default: 38298615454SKuninori Morimoto return -EINVAL; 38398615454SKuninori Morimoto } 38498615454SKuninori Morimoto 385960b3b4bSKuninori Morimoto /* Disable active mode */ 386960b3b4bSKuninori Morimoto snd_soc_update_bits(codec, DA7210_STARTUP1, DA7210_SC_MST_EN, 0); 387960b3b4bSKuninori Morimoto 3883a9d6202SKuninori Morimoto snd_soc_update_bits(codec, DA7210_PLL, DA7210_PLL_FS_MASK, fs); 389960b3b4bSKuninori Morimoto snd_soc_update_bits(codec, DA7210_PLL_DIV3, DA7210_PLL_BYP, bypass); 390960b3b4bSKuninori Morimoto 391960b3b4bSKuninori Morimoto /* Enable active mode */ 392960b3b4bSKuninori Morimoto snd_soc_update_bits(codec, DA7210_STARTUP1, 393960b3b4bSKuninori Morimoto DA7210_SC_MST_EN, DA7210_SC_MST_EN); 39498615454SKuninori Morimoto 39598615454SKuninori Morimoto return 0; 39698615454SKuninori Morimoto } 39798615454SKuninori Morimoto 39898615454SKuninori Morimoto /* 39998615454SKuninori Morimoto * Set DAI mode and Format 40098615454SKuninori Morimoto */ 40198615454SKuninori Morimoto static int da7210_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) 40298615454SKuninori Morimoto { 40398615454SKuninori Morimoto struct snd_soc_codec *codec = codec_dai->codec; 40498615454SKuninori Morimoto u32 dai_cfg1; 40598615454SKuninori Morimoto u32 dai_cfg3; 40698615454SKuninori Morimoto 40740a49710SAxel Lin dai_cfg1 = 0x7f & snd_soc_read(codec, DA7210_DAI_CFG1); 40840a49710SAxel Lin dai_cfg3 = 0xfc & snd_soc_read(codec, DA7210_DAI_CFG3); 40998615454SKuninori Morimoto 41098615454SKuninori Morimoto switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 41198615454SKuninori Morimoto case SND_SOC_DAIFMT_CBM_CFM: 41298615454SKuninori Morimoto dai_cfg1 |= DA7210_DAI_MODE_MASTER; 41398615454SKuninori Morimoto break; 4140f8ea586SAshish Chavan case SND_SOC_DAIFMT_CBS_CFS: 4150f8ea586SAshish Chavan dai_cfg1 |= DA7210_DAI_MODE_SLAVE; 4160f8ea586SAshish Chavan break; 41798615454SKuninori Morimoto default: 41898615454SKuninori Morimoto return -EINVAL; 41998615454SKuninori Morimoto } 42098615454SKuninori Morimoto 42198615454SKuninori Morimoto /* FIXME 42298615454SKuninori Morimoto * 42398615454SKuninori Morimoto * It support I2S only now 42498615454SKuninori Morimoto */ 42598615454SKuninori Morimoto switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 42698615454SKuninori Morimoto case SND_SOC_DAIFMT_I2S: 42798615454SKuninori Morimoto dai_cfg3 |= DA7210_DAI_FORMAT_I2SMODE; 42898615454SKuninori Morimoto break; 4290f8ea586SAshish Chavan case SND_SOC_DAIFMT_LEFT_J: 4300f8ea586SAshish Chavan dai_cfg3 |= DA7210_DAI_FORMAT_LEFT_J; 4310f8ea586SAshish Chavan break; 4320f8ea586SAshish Chavan case SND_SOC_DAIFMT_RIGHT_J: 4330f8ea586SAshish Chavan dai_cfg3 |= DA7210_DAI_FORMAT_RIGHT_J; 4340f8ea586SAshish Chavan break; 43598615454SKuninori Morimoto default: 43698615454SKuninori Morimoto return -EINVAL; 43798615454SKuninori Morimoto } 43898615454SKuninori Morimoto 43998615454SKuninori Morimoto /* FIXME 44098615454SKuninori Morimoto * 44198615454SKuninori Morimoto * It support 64bit data transmission only now 44298615454SKuninori Morimoto */ 44398615454SKuninori Morimoto dai_cfg1 |= DA7210_DAI_FLEN_64BIT; 44498615454SKuninori Morimoto 44540a49710SAxel Lin snd_soc_write(codec, DA7210_DAI_CFG1, dai_cfg1); 44640a49710SAxel Lin snd_soc_write(codec, DA7210_DAI_CFG3, dai_cfg3); 44798615454SKuninori Morimoto 44898615454SKuninori Morimoto return 0; 44998615454SKuninori Morimoto } 45098615454SKuninori Morimoto 4510f8ea586SAshish Chavan #define DA7210_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ 4520f8ea586SAshish Chavan SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 45398615454SKuninori Morimoto 45498615454SKuninori Morimoto /* DAI operations */ 45598615454SKuninori Morimoto static struct snd_soc_dai_ops da7210_dai_ops = { 45698615454SKuninori Morimoto .startup = da7210_startup, 45798615454SKuninori Morimoto .hw_params = da7210_hw_params, 45898615454SKuninori Morimoto .set_fmt = da7210_set_dai_fmt, 45998615454SKuninori Morimoto }; 46098615454SKuninori Morimoto 461f0fba2adSLiam Girdwood static struct snd_soc_dai_driver da7210_dai = { 462f0fba2adSLiam Girdwood .name = "da7210-hifi", 46398615454SKuninori Morimoto /* playback capabilities */ 46498615454SKuninori Morimoto .playback = { 46598615454SKuninori Morimoto .stream_name = "Playback", 46698615454SKuninori Morimoto .channels_min = 1, 46798615454SKuninori Morimoto .channels_max = 2, 46898615454SKuninori Morimoto .rates = SNDRV_PCM_RATE_8000_96000, 46998615454SKuninori Morimoto .formats = DA7210_FORMATS, 47098615454SKuninori Morimoto }, 47198615454SKuninori Morimoto /* capture capabilities */ 47298615454SKuninori Morimoto .capture = { 47398615454SKuninori Morimoto .stream_name = "Capture", 47498615454SKuninori Morimoto .channels_min = 1, 47598615454SKuninori Morimoto .channels_max = 2, 47698615454SKuninori Morimoto .rates = SNDRV_PCM_RATE_8000_96000, 47798615454SKuninori Morimoto .formats = DA7210_FORMATS, 47898615454SKuninori Morimoto }, 47998615454SKuninori Morimoto .ops = &da7210_dai_ops, 480960b3b4bSKuninori Morimoto .symmetric_rates = 1, 48198615454SKuninori Morimoto }; 48298615454SKuninori Morimoto 483f0fba2adSLiam Girdwood static int da7210_probe(struct snd_soc_codec *codec) 48498615454SKuninori Morimoto { 485f0fba2adSLiam Girdwood struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); 48640a49710SAxel Lin int ret; 48798615454SKuninori Morimoto 488f0fba2adSLiam Girdwood dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); 48998615454SKuninori Morimoto 49040a49710SAxel Lin ret = snd_soc_codec_set_cache_io(codec, 8, 8, da7210->control_type); 49140a49710SAxel Lin if (ret < 0) { 49240a49710SAxel Lin dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); 49340a49710SAxel Lin return ret; 49440a49710SAxel Lin } 49598615454SKuninori Morimoto 49698615454SKuninori Morimoto /* FIXME 49798615454SKuninori Morimoto * 49898615454SKuninori Morimoto * This driver use fixed value here 499960b3b4bSKuninori Morimoto * And below settings expects MCLK = 12.288MHz 500960b3b4bSKuninori Morimoto * 501960b3b4bSKuninori Morimoto * When you select different MCLK, please check... 502960b3b4bSKuninori Morimoto * DA7210_PLL_DIV1 val 503960b3b4bSKuninori Morimoto * DA7210_PLL_DIV2 val 504960b3b4bSKuninori Morimoto * DA7210_PLL_DIV3 val 505960b3b4bSKuninori Morimoto * DA7210_PLL_DIV3 :: DA7210_MCLK_RANGExxx 50698615454SKuninori Morimoto */ 50798615454SKuninori Morimoto 50898615454SKuninori Morimoto /* 509960b3b4bSKuninori Morimoto * make sure that DA7210 use bypass mode before start up 510960b3b4bSKuninori Morimoto */ 51140a49710SAxel Lin snd_soc_write(codec, DA7210_STARTUP1, 0); 51240a49710SAxel Lin snd_soc_write(codec, DA7210_PLL_DIV3, 513960b3b4bSKuninori Morimoto DA7210_MCLK_RANGE_10_20_MHZ | DA7210_PLL_BYP); 514960b3b4bSKuninori Morimoto 515960b3b4bSKuninori Morimoto /* 51698615454SKuninori Morimoto * ADC settings 51798615454SKuninori Morimoto */ 51898615454SKuninori Morimoto 51998615454SKuninori Morimoto /* Enable Left & Right MIC PGA and Mic Bias */ 52040a49710SAxel Lin snd_soc_write(codec, DA7210_MIC_L, DA7210_MIC_L_EN | DA7210_MICBIAS_EN); 52140a49710SAxel Lin snd_soc_write(codec, DA7210_MIC_R, DA7210_MIC_R_EN); 52298615454SKuninori Morimoto 52398615454SKuninori Morimoto /* Enable Left and Right input PGA */ 52440a49710SAxel Lin snd_soc_write(codec, DA7210_INMIX_L, DA7210_IN_L_EN); 52540a49710SAxel Lin snd_soc_write(codec, DA7210_INMIX_R, DA7210_IN_R_EN); 52698615454SKuninori Morimoto 52798615454SKuninori Morimoto /* Enable Left and Right ADC */ 52840a49710SAxel Lin snd_soc_write(codec, DA7210_ADC, DA7210_ADC_L_EN | DA7210_ADC_R_EN); 52998615454SKuninori Morimoto 53098615454SKuninori Morimoto /* 53198615454SKuninori Morimoto * DAC settings 53298615454SKuninori Morimoto */ 53398615454SKuninori Morimoto 53498615454SKuninori Morimoto /* Enable Left and Right DAC */ 53540a49710SAxel Lin snd_soc_write(codec, DA7210_DAC_SEL, 53698615454SKuninori Morimoto DA7210_DAC_L_SRC_DAI_L | DA7210_DAC_L_EN | 53798615454SKuninori Morimoto DA7210_DAC_R_SRC_DAI_R | DA7210_DAC_R_EN); 53898615454SKuninori Morimoto 53998615454SKuninori Morimoto /* Enable Left and Right out PGA */ 54040a49710SAxel Lin snd_soc_write(codec, DA7210_OUTMIX_L, DA7210_OUT_L_EN); 54140a49710SAxel Lin snd_soc_write(codec, DA7210_OUTMIX_R, DA7210_OUT_R_EN); 54298615454SKuninori Morimoto 54398615454SKuninori Morimoto /* Enable Left and Right HeadPhone PGA */ 54440a49710SAxel Lin snd_soc_write(codec, DA7210_HP_CFG, 54598615454SKuninori Morimoto DA7210_HP_2CAP_MODE | DA7210_HP_SENSE_EN | 54698615454SKuninori Morimoto DA7210_HP_L_EN | DA7210_HP_MODE | DA7210_HP_R_EN); 54798615454SKuninori Morimoto 54898615454SKuninori Morimoto /* Diable PLL and bypass it */ 54940a49710SAxel Lin snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000); 55098615454SKuninori Morimoto 551960b3b4bSKuninori Morimoto /* 552960b3b4bSKuninori Morimoto * If 48kHz sound came, it use bypass mode, 553960b3b4bSKuninori Morimoto * and when it is 44.1kHz, it use PLL. 554960b3b4bSKuninori Morimoto * 555960b3b4bSKuninori Morimoto * This time, this driver sets PLL always ON 556960b3b4bSKuninori Morimoto * and controls bypass/PLL mode by switching 557960b3b4bSKuninori Morimoto * DA7210_PLL_DIV3 :: DA7210_PLL_BYP bit. 558960b3b4bSKuninori Morimoto * see da7210_hw_params 559960b3b4bSKuninori Morimoto */ 56040a49710SAxel Lin snd_soc_write(codec, DA7210_PLL_DIV1, 0xE5); /* MCLK = 12.288MHz */ 56140a49710SAxel Lin snd_soc_write(codec, DA7210_PLL_DIV2, 0x99); 56240a49710SAxel Lin snd_soc_write(codec, DA7210_PLL_DIV3, 0x0A | 56398615454SKuninori Morimoto DA7210_MCLK_RANGE_10_20_MHZ | DA7210_PLL_BYP); 564960b3b4bSKuninori Morimoto snd_soc_update_bits(codec, DA7210_PLL, DA7210_PLL_EN, DA7210_PLL_EN); 565960b3b4bSKuninori Morimoto 566960b3b4bSKuninori Morimoto /* As suggested by Dialog */ 56740a49710SAxel Lin snd_soc_write(codec, DA7210_A_HID_UNLOCK, 0x8B); /* unlock */ 56840a49710SAxel Lin snd_soc_write(codec, DA7210_A_TEST_UNLOCK, 0xB4); 56940a49710SAxel Lin snd_soc_write(codec, DA7210_A_PLL1, 0x01); 57040a49710SAxel Lin snd_soc_write(codec, DA7210_A_CP_MODE, 0x7C); 57140a49710SAxel Lin snd_soc_write(codec, DA7210_A_HID_UNLOCK, 0x00); /* re-lock */ 57240a49710SAxel Lin snd_soc_write(codec, DA7210_A_TEST_UNLOCK, 0x00); 57398615454SKuninori Morimoto 57498615454SKuninori Morimoto /* Activate all enabled subsystem */ 57540a49710SAxel Lin snd_soc_write(codec, DA7210_STARTUP1, DA7210_SC_MST_EN); 57698615454SKuninori Morimoto 577f0fba2adSLiam Girdwood dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); 57898615454SKuninori Morimoto 579f0fba2adSLiam Girdwood return 0; 58098615454SKuninori Morimoto } 58198615454SKuninori Morimoto 582f0fba2adSLiam Girdwood static struct snd_soc_codec_driver soc_codec_dev_da7210 = { 583f0fba2adSLiam Girdwood .probe = da7210_probe, 584f0fba2adSLiam Girdwood .reg_cache_size = ARRAY_SIZE(da7210_reg), 585f0fba2adSLiam Girdwood .reg_word_size = sizeof(u8), 586f0fba2adSLiam Girdwood .reg_cache_default = da7210_reg, 58740a49710SAxel Lin .volatile_register = da7210_volatile_register, 588a6f096f3SMark Brown 589a6f096f3SMark Brown .controls = da7210_snd_controls, 590a6f096f3SMark Brown .num_controls = ARRAY_SIZE(da7210_snd_controls), 591f0fba2adSLiam Girdwood }; 592f0fba2adSLiam Girdwood 59398615454SKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 594735fe4cfSMark Brown static int __devinit da7210_i2c_probe(struct i2c_client *i2c, 59598615454SKuninori Morimoto const struct i2c_device_id *id) 59698615454SKuninori Morimoto { 59798615454SKuninori Morimoto struct da7210_priv *da7210; 59898615454SKuninori Morimoto int ret; 59998615454SKuninori Morimoto 60098615454SKuninori Morimoto da7210 = kzalloc(sizeof(struct da7210_priv), GFP_KERNEL); 60198615454SKuninori Morimoto if (!da7210) 60298615454SKuninori Morimoto return -ENOMEM; 60398615454SKuninori Morimoto 60498615454SKuninori Morimoto i2c_set_clientdata(i2c, da7210); 605f0fba2adSLiam Girdwood da7210->control_type = SND_SOC_I2C; 60698615454SKuninori Morimoto 607f0fba2adSLiam Girdwood ret = snd_soc_register_codec(&i2c->dev, 608f0fba2adSLiam Girdwood &soc_codec_dev_da7210, &da7210_dai, 1); 609f0fba2adSLiam Girdwood if (ret < 0) 610085efd28SAxel Lin kfree(da7210); 61198615454SKuninori Morimoto 61298615454SKuninori Morimoto return ret; 61398615454SKuninori Morimoto } 61498615454SKuninori Morimoto 615735fe4cfSMark Brown static int __devexit da7210_i2c_remove(struct i2c_client *client) 61698615454SKuninori Morimoto { 617f0fba2adSLiam Girdwood snd_soc_unregister_codec(&client->dev); 618f0fba2adSLiam Girdwood kfree(i2c_get_clientdata(client)); 61998615454SKuninori Morimoto return 0; 62098615454SKuninori Morimoto } 62198615454SKuninori Morimoto 62298615454SKuninori Morimoto static const struct i2c_device_id da7210_i2c_id[] = { 62398615454SKuninori Morimoto { "da7210", 0 }, 62498615454SKuninori Morimoto { } 62598615454SKuninori Morimoto }; 62698615454SKuninori Morimoto MODULE_DEVICE_TABLE(i2c, da7210_i2c_id); 62798615454SKuninori Morimoto 62898615454SKuninori Morimoto /* I2C codec control layer */ 62998615454SKuninori Morimoto static struct i2c_driver da7210_i2c_driver = { 63098615454SKuninori Morimoto .driver = { 631f0fba2adSLiam Girdwood .name = "da7210-codec", 63298615454SKuninori Morimoto .owner = THIS_MODULE, 63398615454SKuninori Morimoto }, 63498615454SKuninori Morimoto .probe = da7210_i2c_probe, 63598615454SKuninori Morimoto .remove = __devexit_p(da7210_i2c_remove), 63698615454SKuninori Morimoto .id_table = da7210_i2c_id, 63798615454SKuninori Morimoto }; 63898615454SKuninori Morimoto #endif 63998615454SKuninori Morimoto 64098615454SKuninori Morimoto static int __init da7210_modinit(void) 64198615454SKuninori Morimoto { 64298615454SKuninori Morimoto int ret = 0; 64398615454SKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 64498615454SKuninori Morimoto ret = i2c_add_driver(&da7210_i2c_driver); 64598615454SKuninori Morimoto #endif 64698615454SKuninori Morimoto return ret; 64798615454SKuninori Morimoto } 64898615454SKuninori Morimoto module_init(da7210_modinit); 64998615454SKuninori Morimoto 65098615454SKuninori Morimoto static void __exit da7210_exit(void) 65198615454SKuninori Morimoto { 65298615454SKuninori Morimoto #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 65398615454SKuninori Morimoto i2c_del_driver(&da7210_i2c_driver); 65498615454SKuninori Morimoto #endif 65598615454SKuninori Morimoto } 65698615454SKuninori Morimoto module_exit(da7210_exit); 65798615454SKuninori Morimoto 65898615454SKuninori Morimoto MODULE_DESCRIPTION("ASoC DA7210 driver"); 65998615454SKuninori Morimoto MODULE_AUTHOR("David Chen, Kuninori Morimoto"); 66098615454SKuninori Morimoto MODULE_LICENSE("GPL"); 661