diff options
| author | Peter Ujfalusi <peter.ujfalusi@nokia.com> | 2009-11-04 02:58:19 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-11-10 07:07:23 -0500 |
| commit | f9b4639e045c750e2bad37462476403995508350 (patch) | |
| tree | ad64a6e75caf3733e65e436281abc3824fca62b2 | |
| parent | 953e2f3d272db9db6671ad4f4244820557a71cf7 (diff) | |
MFD: twl4030-codec: APLL_INFREQ handling in the MFD driver
Configure the APLL_INFREQ field in the APLL_CTL register
based on the platform data.
Provide also a function for childs to query the audio_mclk
frequency.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
| -rw-r--r-- | drivers/mfd/twl4030-codec.c | 35 | ||||
| -rw-r--r-- | include/linux/mfd/twl4030-codec.h | 1 |
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/mfd/twl4030-codec.c b/drivers/mfd/twl4030-codec.c index 97103078dc2a..77b914907d7c 100644 --- a/drivers/mfd/twl4030-codec.c +++ b/drivers/mfd/twl4030-codec.c | |||
| @@ -41,6 +41,7 @@ struct twl4030_codec_resource { | |||
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | struct twl4030_codec { | 43 | struct twl4030_codec { |
| 44 | unsigned int audio_mclk; | ||
| 44 | struct mutex mutex; | 45 | struct mutex mutex; |
| 45 | struct twl4030_codec_resource resource[TWL4030_CODEC_RES_MAX]; | 46 | struct twl4030_codec_resource resource[TWL4030_CODEC_RES_MAX]; |
| 46 | struct mfd_cell cells[TWL4030_CODEC_CELLS]; | 47 | struct mfd_cell cells[TWL4030_CODEC_CELLS]; |
| @@ -145,12 +146,45 @@ int twl4030_codec_disable_resource(unsigned id) | |||
| 145 | } | 146 | } |
| 146 | EXPORT_SYMBOL_GPL(twl4030_codec_disable_resource); | 147 | EXPORT_SYMBOL_GPL(twl4030_codec_disable_resource); |
| 147 | 148 | ||
| 149 | unsigned int twl4030_codec_get_mclk(void) | ||
| 150 | { | ||
| 151 | struct twl4030_codec *codec = platform_get_drvdata(twl4030_codec_dev); | ||
| 152 | |||
| 153 | return codec->audio_mclk; | ||
| 154 | } | ||
| 155 | EXPORT_SYMBOL_GPL(twl4030_codec_get_mclk); | ||
| 156 | |||
| 148 | static int __devinit twl4030_codec_probe(struct platform_device *pdev) | 157 | static int __devinit twl4030_codec_probe(struct platform_device *pdev) |
| 149 | { | 158 | { |
| 150 | struct twl4030_codec *codec; | 159 | struct twl4030_codec *codec; |
| 151 | struct twl4030_codec_data *pdata = pdev->dev.platform_data; | 160 | struct twl4030_codec_data *pdata = pdev->dev.platform_data; |
| 152 | struct mfd_cell *cell = NULL; | 161 | struct mfd_cell *cell = NULL; |
| 153 | int ret, childs = 0; | 162 | int ret, childs = 0; |
| 163 | u8 val; | ||
| 164 | |||
| 165 | if (!pdata) { | ||
| 166 | dev_err(&pdev->dev, "Platform data is missing\n"); | ||
| 167 | return -EINVAL; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* Configure APLL_INFREQ and disable APLL if enabled */ | ||
| 171 | val = 0; | ||
| 172 | switch (pdata->audio_mclk) { | ||
| 173 | case 19200000: | ||
| 174 | val |= TWL4030_APLL_INFREQ_19200KHZ; | ||
| 175 | break; | ||
| 176 | case 26000000: | ||
| 177 | val |= TWL4030_APLL_INFREQ_26000KHZ; | ||
| 178 | break; | ||
| 179 | case 38400000: | ||
| 180 | val |= TWL4030_APLL_INFREQ_38400KHZ; | ||
| 181 | break; | ||
| 182 | default: | ||
| 183 | dev_err(&pdev->dev, "Invalid audio_mclk\n"); | ||
| 184 | return -EINVAL; | ||
| 185 | } | ||
| 186 | twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 187 | val, TWL4030_REG_APLL_CTL); | ||
| 154 | 188 | ||
| 155 | codec = kzalloc(sizeof(struct twl4030_codec), GFP_KERNEL); | 189 | codec = kzalloc(sizeof(struct twl4030_codec), GFP_KERNEL); |
| 156 | if (!codec) | 190 | if (!codec) |
| @@ -160,6 +194,7 @@ static int __devinit twl4030_codec_probe(struct platform_device *pdev) | |||
| 160 | 194 | ||
| 161 | twl4030_codec_dev = pdev; | 195 | twl4030_codec_dev = pdev; |
| 162 | mutex_init(&codec->mutex); | 196 | mutex_init(&codec->mutex); |
| 197 | codec->audio_mclk = pdata->audio_mclk; | ||
| 163 | 198 | ||
| 164 | /* Codec power */ | 199 | /* Codec power */ |
| 165 | codec->resource[TWL4030_CODEC_RES_POWER].reg = TWL4030_REG_CODEC_MODE; | 200 | codec->resource[TWL4030_CODEC_RES_POWER].reg = TWL4030_REG_CODEC_MODE; |
diff --git a/include/linux/mfd/twl4030-codec.h b/include/linux/mfd/twl4030-codec.h index ef0a3041d759..2ec317c68e59 100644 --- a/include/linux/mfd/twl4030-codec.h +++ b/include/linux/mfd/twl4030-codec.h | |||
| @@ -267,5 +267,6 @@ enum twl4030_codec_res { | |||
| 267 | 267 | ||
| 268 | int twl4030_codec_disable_resource(enum twl4030_codec_res id); | 268 | int twl4030_codec_disable_resource(enum twl4030_codec_res id); |
| 269 | int twl4030_codec_enable_resource(enum twl4030_codec_res id); | 269 | int twl4030_codec_enable_resource(enum twl4030_codec_res id); |
| 270 | unsigned int twl4030_codec_get_mclk(void); | ||
| 270 | 271 | ||
| 271 | #endif /* End of __TWL4030_CODEC_H__ */ | 272 | #endif /* End of __TWL4030_CODEC_H__ */ |
