Ignore:
Timestamp:
Apr 14, 2017, 9:41:36 PM (6 weeks ago)
Author:
brainslayer
Message:

kernel update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/sound/soc/intel/boards/cht_bsw_rt5645.c

    r31574 r31859  
    2525#include <linux/platform_device.h>
    2626#include <linux/slab.h>
     27#include <asm/cpu_device_id.h>
     28#include <asm/platform_sst_audio.h>
     29#include <linux/clk.h>
    2730#include <sound/pcm.h>
    2831#include <sound/pcm_params.h>
     
    4649        struct cht_acpi_card *acpi_card;
    4750        char codec_name[16];
     51        struct clk *mclk;
    4852};
    4953
     
    6670        struct snd_soc_card *card = dapm->card;
    6771        struct snd_soc_dai *codec_dai;
     72        struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card);
    6873        int ret;
    6974
     
    7479        }
    7580
    76         if (!SND_SOC_DAPM_EVENT_OFF(event))
    77                 return 0;
    78 
    79         /* Set codec sysclk source to its internal clock because codec PLL will
    80          * be off when idle and MCLK will also be off by ACPI when codec is
    81          * runtime suspended. Codec needs clock for jack detection and button
    82          * press.
    83          */
    84         ret = snd_soc_dai_set_sysclk(codec_dai, RT5645_SCLK_S_RCCLK,
    85                         0, SND_SOC_CLOCK_IN);
    86         if (ret < 0) {
    87                 dev_err(card->dev, "can't set codec sysclk: %d\n", ret);
    88                 return ret;
     81        if (SND_SOC_DAPM_EVENT_ON(event)) {
     82                if (ctx->mclk) {
     83                        ret = clk_prepare_enable(ctx->mclk);
     84                        if (ret < 0) {
     85                                dev_err(card->dev,
     86                                        "could not configure MCLK state");
     87                                return ret;
     88                        }
     89                }
     90        } else {
     91                /* Set codec sysclk source to its internal clock because codec PLL will
     92                 * be off when idle and MCLK will also be off when codec is
     93                 * runtime suspended. Codec needs clock for jack detection and button
     94                 * press. MCLK is turned off with clock framework or ACPI.
     95                 */
     96                ret = snd_soc_dai_set_sysclk(codec_dai, RT5645_SCLK_S_RCCLK,
     97                                        48000 * 512, SND_SOC_CLOCK_IN);
     98                if (ret < 0) {
     99                        dev_err(card->dev, "can't set codec sysclk: %d\n", ret);
     100                        return ret;
     101                }
     102
     103                if (ctx->mclk)
     104                        clk_disable_unprepare(ctx->mclk);
    89105        }
    90106
     
    98114        SND_SOC_DAPM_SPK("Ext Spk", NULL),
    99115        SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
    100                         platform_clock_control, SND_SOC_DAPM_POST_PMD),
     116                        platform_clock_control, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
    101117};
    102118
     
    226242        rt5645_set_jack_detect(codec, &ctx->jack, &ctx->jack, &ctx->jack);
    227243
     244        if (ctx->mclk) {
     245                /*
     246                 * The firmware might enable the clock at
     247                 * boot (this information may or may not
     248                 * be reflected in the enable clock register).
     249                 * To change the rate we must disable the clock
     250                 * first to cover these cases. Due to common
     251                 * clock framework restrictions that do not allow
     252                 * to disable a clock that has not been enabled,
     253                 * we need to enable the clock first.
     254                 */
     255                ret = clk_prepare_enable(ctx->mclk);
     256                if (!ret)
     257                        clk_disable_unprepare(ctx->mclk);
     258
     259                ret = clk_set_rate(ctx->mclk, CHT_PLAT_CLK_3_HZ);
     260
     261                if (ret)
     262                        dev_err(runtime->dev, "unable to set MCLK rate\n");
     263        }
    228264        return ret;
    229265}
     
    350386static char cht_rt5640_codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
    351387
     388static bool is_valleyview(void)
     389{
     390        static const struct x86_cpu_id cpu_ids[] = {
     391                { X86_VENDOR_INTEL, 6, 55 }, /* Valleyview, Bay Trail */
     392                {}
     393        };
     394
     395        if (!x86_match_cpu(cpu_ids))
     396                return false;
     397        return true;
     398}
     399
    352400static int snd_cht_mc_probe(struct platform_device *pdev)
    353401{
     
    359407        const char *i2c_name = NULL;
    360408        int dai_index = 0;
     409        bool found = false;
    361410
    362411        drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_ATOMIC);
     
    364413                return -ENOMEM;
    365414
     415        mach = (&pdev->dev)->platform_data;
     416
    366417        for (i = 0; i < ARRAY_SIZE(snd_soc_cards); i++) {
    367                 if (acpi_dev_found(snd_soc_cards[i].codec_id)) {
     418                if (acpi_dev_found(snd_soc_cards[i].codec_id) &&
     419                        (!strncmp(snd_soc_cards[i].codec_id, mach->id, 8))) {
    368420                        dev_dbg(&pdev->dev,
    369421                                "found codec %s\n", snd_soc_cards[i].codec_id);
    370422                        card = snd_soc_cards[i].soc_card;
    371423                        drv->acpi_card = &snd_soc_cards[i];
     424                        found = true;
    372425                        break;
    373426                }
    374427        }
     428
     429        if (!found) {
     430                dev_err(&pdev->dev, "No matching HID found in supported list\n");
     431                return -ENODEV;
     432        }
     433
    375434        card->dev = &pdev->dev;
    376         mach = card->dev->platform_data;
    377435        sprintf(drv->codec_name, "i2c-%s:00", drv->acpi_card->codec_id);
    378436
     
    392450        }
    393451
     452        if (is_valleyview()) {
     453                drv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3");
     454                if (IS_ERR(drv->mclk)) {
     455                        dev_err(&pdev->dev,
     456                                "Failed to get MCLK from pmc_plt_clk_3: %ld\n",
     457                                PTR_ERR(drv->mclk));
     458                        return PTR_ERR(drv->mclk);
     459                }
     460        }
     461
    394462        snd_soc_card_set_drvdata(card, drv);
    395463        ret_val = devm_snd_soc_register_card(&pdev->dev, card);
Note: See TracChangeset for help on using the changeset viewer.