| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * da7219-aad.c - Dialog DA7219 ALSA SoC AAD Driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (c) 2015 Dialog Semiconductor Ltd. |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com> |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 9 | | - * under the terms of the GNU General Public License as published by the |
|---|
| 10 | | - * Free Software Foundation; either version 2 of the License, or (at your |
|---|
| 11 | | - * option) any later version. |
|---|
| 12 | 8 | */ |
|---|
| 13 | 9 | |
|---|
| 14 | 10 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 77 | 73 | snd_soc_dapm_sync(dapm); |
|---|
| 78 | 74 | |
|---|
| 79 | 75 | do { |
|---|
| 80 | | - statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); |
|---|
| 76 | + statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A); |
|---|
| 81 | 77 | if (statusa & DA7219_MICBIAS_UP_STS_MASK) |
|---|
| 82 | 78 | micbias_up = true; |
|---|
| 83 | 79 | else if (retries++ < DA7219_AAD_MICBIAS_CHK_RETRIES) |
|---|
| .. | .. |
|---|
| 95 | 91 | */ |
|---|
| 96 | 92 | if (da7219_aad->micbias_pulse_lvl && da7219_aad->micbias_pulse_time) { |
|---|
| 97 | 93 | /* Pulse higher level voltage */ |
|---|
| 98 | | - micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); |
|---|
| 94 | + micbias_ctrl = snd_soc_component_read(component, DA7219_MICBIAS_CTRL); |
|---|
| 99 | 95 | snd_soc_component_update_bits(component, DA7219_MICBIAS_CTRL, |
|---|
| 100 | 96 | DA7219_MICBIAS1_LEVEL_MASK, |
|---|
| 101 | 97 | da7219_aad->micbias_pulse_lvl); |
|---|
| .. | .. |
|---|
| 117 | 113 | struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); |
|---|
| 118 | 114 | struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); |
|---|
| 119 | 115 | |
|---|
| 120 | | - u16 tonegen_freq_hptest; |
|---|
| 116 | + __le16 tonegen_freq_hptest; |
|---|
| 121 | 117 | u8 pll_srm_sts, pll_ctrl, gain_ramp_ctrl, accdet_cfg8; |
|---|
| 122 | 118 | int report = 0, ret = 0; |
|---|
| 123 | 119 | |
|---|
| .. | .. |
|---|
| 145 | 141 | * If MCLK is present, but PLL is not enabled then we enable it here to |
|---|
| 146 | 142 | * ensure a consistent detection procedure. |
|---|
| 147 | 143 | */ |
|---|
| 148 | | - pll_srm_sts = snd_soc_component_read32(component, DA7219_PLL_SRM_STS); |
|---|
| 144 | + pll_srm_sts = snd_soc_component_read(component, DA7219_PLL_SRM_STS); |
|---|
| 149 | 145 | if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) { |
|---|
| 150 | 146 | tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ); |
|---|
| 151 | 147 | |
|---|
| 152 | | - pll_ctrl = snd_soc_component_read32(component, DA7219_PLL_CTRL); |
|---|
| 148 | + pll_ctrl = snd_soc_component_read(component, DA7219_PLL_CTRL); |
|---|
| 153 | 149 | if ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS) |
|---|
| 154 | 150 | da7219_set_pll(component, DA7219_SYSCLK_PLL, |
|---|
| 155 | 151 | DA7219_PLL_FREQ_OUT_98304); |
|---|
| .. | .. |
|---|
| 158 | 154 | } |
|---|
| 159 | 155 | |
|---|
| 160 | 156 | /* Ensure gain ramping at fastest rate */ |
|---|
| 161 | | - gain_ramp_ctrl = snd_soc_component_read32(component, DA7219_GAIN_RAMP_CTRL); |
|---|
| 157 | + gain_ramp_ctrl = snd_soc_component_read(component, DA7219_GAIN_RAMP_CTRL); |
|---|
| 162 | 158 | snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8); |
|---|
| 163 | 159 | |
|---|
| 164 | 160 | /* Bypass cache so it saves current settings */ |
|---|
| .. | .. |
|---|
| 252 | 248 | msleep(DA7219_AAD_HPTEST_PERIOD); |
|---|
| 253 | 249 | |
|---|
| 254 | 250 | /* Grab comparator reading */ |
|---|
| 255 | | - accdet_cfg8 = snd_soc_component_read32(component, DA7219_ACCDET_CONFIG_8); |
|---|
| 251 | + accdet_cfg8 = snd_soc_component_read(component, DA7219_ACCDET_CONFIG_8); |
|---|
| 256 | 252 | if (accdet_cfg8 & DA7219_HPTEST_COMP_MASK) |
|---|
| 257 | 253 | report |= SND_JACK_HEADPHONE; |
|---|
| 258 | 254 | else |
|---|
| .. | .. |
|---|
| 351 | 347 | struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); |
|---|
| 352 | 348 | u8 events[DA7219_AAD_IRQ_REG_MAX]; |
|---|
| 353 | 349 | u8 statusa; |
|---|
| 354 | | - int i, report = 0, mask = 0; |
|---|
| 350 | + int i, ret, report = 0, mask = 0; |
|---|
| 355 | 351 | |
|---|
| 356 | 352 | /* Read current IRQ events */ |
|---|
| 357 | | - regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, |
|---|
| 358 | | - events, DA7219_AAD_IRQ_REG_MAX); |
|---|
| 353 | + ret = regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, |
|---|
| 354 | + events, DA7219_AAD_IRQ_REG_MAX); |
|---|
| 355 | + if (ret) { |
|---|
| 356 | + dev_warn_ratelimited(component->dev, "Failed to read IRQ events: %d\n", ret); |
|---|
| 357 | + return IRQ_NONE; |
|---|
| 358 | + } |
|---|
| 359 | 359 | |
|---|
| 360 | 360 | if (!events[DA7219_AAD_IRQ_REG_A] && !events[DA7219_AAD_IRQ_REG_B]) |
|---|
| 361 | 361 | return IRQ_NONE; |
|---|
| 362 | 362 | |
|---|
| 363 | 363 | /* Read status register for jack insertion & type status */ |
|---|
| 364 | | - statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); |
|---|
| 364 | + statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A); |
|---|
| 365 | 365 | |
|---|
| 366 | 366 | /* Clear events */ |
|---|
| 367 | 367 | regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, |
|---|
| .. | .. |
|---|
| 464 | 464 | */ |
|---|
| 465 | 465 | |
|---|
| 466 | 466 | static enum da7219_aad_micbias_pulse_lvl |
|---|
| 467 | | - da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_component *component, u32 val) |
|---|
| 467 | + da7219_aad_fw_micbias_pulse_lvl(struct device *dev, u32 val) |
|---|
| 468 | 468 | { |
|---|
| 469 | 469 | switch (val) { |
|---|
| 470 | 470 | case 2800: |
|---|
| .. | .. |
|---|
| 472 | 472 | case 2900: |
|---|
| 473 | 473 | return DA7219_AAD_MICBIAS_PULSE_LVL_2_9V; |
|---|
| 474 | 474 | default: |
|---|
| 475 | | - dev_warn(component->dev, "Invalid micbias pulse level"); |
|---|
| 475 | + dev_warn(dev, "Invalid micbias pulse level"); |
|---|
| 476 | 476 | return DA7219_AAD_MICBIAS_PULSE_LVL_OFF; |
|---|
| 477 | 477 | } |
|---|
| 478 | 478 | } |
|---|
| 479 | 479 | |
|---|
| 480 | 480 | static enum da7219_aad_btn_cfg |
|---|
| 481 | | - da7219_aad_fw_btn_cfg(struct snd_soc_component *component, u32 val) |
|---|
| 481 | + da7219_aad_fw_btn_cfg(struct device *dev, u32 val) |
|---|
| 482 | 482 | { |
|---|
| 483 | 483 | switch (val) { |
|---|
| 484 | 484 | case 2: |
|---|
| .. | .. |
|---|
| 496 | 496 | case 500: |
|---|
| 497 | 497 | return DA7219_AAD_BTN_CFG_500MS; |
|---|
| 498 | 498 | default: |
|---|
| 499 | | - dev_warn(component->dev, "Invalid button config"); |
|---|
| 499 | + dev_warn(dev, "Invalid button config"); |
|---|
| 500 | 500 | return DA7219_AAD_BTN_CFG_10MS; |
|---|
| 501 | 501 | } |
|---|
| 502 | 502 | } |
|---|
| 503 | 503 | |
|---|
| 504 | 504 | static enum da7219_aad_mic_det_thr |
|---|
| 505 | | - da7219_aad_fw_mic_det_thr(struct snd_soc_component *component, u32 val) |
|---|
| 505 | + da7219_aad_fw_mic_det_thr(struct device *dev, u32 val) |
|---|
| 506 | 506 | { |
|---|
| 507 | 507 | switch (val) { |
|---|
| 508 | 508 | case 200: |
|---|
| .. | .. |
|---|
| 514 | 514 | case 1000: |
|---|
| 515 | 515 | return DA7219_AAD_MIC_DET_THR_1000_OHMS; |
|---|
| 516 | 516 | default: |
|---|
| 517 | | - dev_warn(component->dev, "Invalid mic detect threshold"); |
|---|
| 517 | + dev_warn(dev, "Invalid mic detect threshold"); |
|---|
| 518 | 518 | return DA7219_AAD_MIC_DET_THR_500_OHMS; |
|---|
| 519 | 519 | } |
|---|
| 520 | 520 | } |
|---|
| 521 | 521 | |
|---|
| 522 | 522 | static enum da7219_aad_jack_ins_deb |
|---|
| 523 | | - da7219_aad_fw_jack_ins_deb(struct snd_soc_component *component, u32 val) |
|---|
| 523 | + da7219_aad_fw_jack_ins_deb(struct device *dev, u32 val) |
|---|
| 524 | 524 | { |
|---|
| 525 | 525 | switch (val) { |
|---|
| 526 | 526 | case 5: |
|---|
| .. | .. |
|---|
| 540 | 540 | case 1000: |
|---|
| 541 | 541 | return DA7219_AAD_JACK_INS_DEB_1S; |
|---|
| 542 | 542 | default: |
|---|
| 543 | | - dev_warn(component->dev, "Invalid jack insert debounce"); |
|---|
| 543 | + dev_warn(dev, "Invalid jack insert debounce"); |
|---|
| 544 | 544 | return DA7219_AAD_JACK_INS_DEB_20MS; |
|---|
| 545 | 545 | } |
|---|
| 546 | 546 | } |
|---|
| 547 | 547 | |
|---|
| 548 | 548 | static enum da7219_aad_jack_det_rate |
|---|
| 549 | | - da7219_aad_fw_jack_det_rate(struct snd_soc_component *component, const char *str) |
|---|
| 549 | + da7219_aad_fw_jack_det_rate(struct device *dev, const char *str) |
|---|
| 550 | 550 | { |
|---|
| 551 | 551 | if (!strcmp(str, "32ms_64ms")) { |
|---|
| 552 | 552 | return DA7219_AAD_JACK_DET_RATE_32_64MS; |
|---|
| .. | .. |
|---|
| 557 | 557 | } else if (!strcmp(str, "256ms_512ms")) { |
|---|
| 558 | 558 | return DA7219_AAD_JACK_DET_RATE_256_512MS; |
|---|
| 559 | 559 | } else { |
|---|
| 560 | | - dev_warn(component->dev, "Invalid jack detect rate"); |
|---|
| 560 | + dev_warn(dev, "Invalid jack detect rate"); |
|---|
| 561 | 561 | return DA7219_AAD_JACK_DET_RATE_256_512MS; |
|---|
| 562 | 562 | } |
|---|
| 563 | 563 | } |
|---|
| 564 | 564 | |
|---|
| 565 | 565 | static enum da7219_aad_jack_rem_deb |
|---|
| 566 | | - da7219_aad_fw_jack_rem_deb(struct snd_soc_component *component, u32 val) |
|---|
| 566 | + da7219_aad_fw_jack_rem_deb(struct device *dev, u32 val) |
|---|
| 567 | 567 | { |
|---|
| 568 | 568 | switch (val) { |
|---|
| 569 | 569 | case 1: |
|---|
| .. | .. |
|---|
| 575 | 575 | case 20: |
|---|
| 576 | 576 | return DA7219_AAD_JACK_REM_DEB_20MS; |
|---|
| 577 | 577 | default: |
|---|
| 578 | | - dev_warn(component->dev, "Invalid jack removal debounce"); |
|---|
| 578 | + dev_warn(dev, "Invalid jack removal debounce"); |
|---|
| 579 | 579 | return DA7219_AAD_JACK_REM_DEB_1MS; |
|---|
| 580 | 580 | } |
|---|
| 581 | 581 | } |
|---|
| 582 | 582 | |
|---|
| 583 | 583 | static enum da7219_aad_btn_avg |
|---|
| 584 | | - da7219_aad_fw_btn_avg(struct snd_soc_component *component, u32 val) |
|---|
| 584 | + da7219_aad_fw_btn_avg(struct device *dev, u32 val) |
|---|
| 585 | 585 | { |
|---|
| 586 | 586 | switch (val) { |
|---|
| 587 | 587 | case 1: |
|---|
| .. | .. |
|---|
| 593 | 593 | case 8: |
|---|
| 594 | 594 | return DA7219_AAD_BTN_AVG_8; |
|---|
| 595 | 595 | default: |
|---|
| 596 | | - dev_warn(component->dev, "Invalid button average value"); |
|---|
| 596 | + dev_warn(dev, "Invalid button average value"); |
|---|
| 597 | 597 | return DA7219_AAD_BTN_AVG_2; |
|---|
| 598 | 598 | } |
|---|
| 599 | 599 | } |
|---|
| 600 | 600 | |
|---|
| 601 | 601 | static enum da7219_aad_adc_1bit_rpt |
|---|
| 602 | | - da7219_aad_fw_adc_1bit_rpt(struct snd_soc_component *component, u32 val) |
|---|
| 602 | + da7219_aad_fw_adc_1bit_rpt(struct device *dev, u32 val) |
|---|
| 603 | 603 | { |
|---|
| 604 | 604 | switch (val) { |
|---|
| 605 | 605 | case 1: |
|---|
| .. | .. |
|---|
| 611 | 611 | case 8: |
|---|
| 612 | 612 | return DA7219_AAD_ADC_1BIT_RPT_8; |
|---|
| 613 | 613 | default: |
|---|
| 614 | | - dev_warn(component->dev, "Invalid ADC 1-bit repeat value"); |
|---|
| 614 | + dev_warn(dev, "Invalid ADC 1-bit repeat value"); |
|---|
| 615 | 615 | return DA7219_AAD_ADC_1BIT_RPT_1; |
|---|
| 616 | 616 | } |
|---|
| 617 | 617 | } |
|---|
| 618 | 618 | |
|---|
| 619 | | -static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_component *component) |
|---|
| 619 | +static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct device *dev) |
|---|
| 620 | 620 | { |
|---|
| 621 | | - struct device *dev = component->dev; |
|---|
| 622 | 621 | struct i2c_client *i2c = to_i2c_client(dev); |
|---|
| 623 | 622 | struct fwnode_handle *aad_np; |
|---|
| 624 | 623 | struct da7219_aad_pdata *aad_pdata; |
|---|
| .. | .. |
|---|
| 638 | 637 | if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", |
|---|
| 639 | 638 | &fw_val32) >= 0) |
|---|
| 640 | 639 | aad_pdata->micbias_pulse_lvl = |
|---|
| 641 | | - da7219_aad_fw_micbias_pulse_lvl(component, fw_val32); |
|---|
| 640 | + da7219_aad_fw_micbias_pulse_lvl(dev, fw_val32); |
|---|
| 642 | 641 | else |
|---|
| 643 | 642 | aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; |
|---|
| 644 | 643 | |
|---|
| .. | .. |
|---|
| 647 | 646 | aad_pdata->micbias_pulse_time = fw_val32; |
|---|
| 648 | 647 | |
|---|
| 649 | 648 | if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0) |
|---|
| 650 | | - aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(component, fw_val32); |
|---|
| 649 | + aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(dev, fw_val32); |
|---|
| 651 | 650 | else |
|---|
| 652 | 651 | aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; |
|---|
| 653 | 652 | |
|---|
| 654 | 653 | if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0) |
|---|
| 655 | 654 | aad_pdata->mic_det_thr = |
|---|
| 656 | | - da7219_aad_fw_mic_det_thr(component, fw_val32); |
|---|
| 655 | + da7219_aad_fw_mic_det_thr(dev, fw_val32); |
|---|
| 657 | 656 | else |
|---|
| 658 | 657 | aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; |
|---|
| 659 | 658 | |
|---|
| 660 | 659 | if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) |
|---|
| 661 | 660 | aad_pdata->jack_ins_deb = |
|---|
| 662 | | - da7219_aad_fw_jack_ins_deb(component, fw_val32); |
|---|
| 661 | + da7219_aad_fw_jack_ins_deb(dev, fw_val32); |
|---|
| 663 | 662 | else |
|---|
| 664 | 663 | aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; |
|---|
| 665 | 664 | |
|---|
| 666 | 665 | if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str)) |
|---|
| 667 | 666 | aad_pdata->jack_det_rate = |
|---|
| 668 | | - da7219_aad_fw_jack_det_rate(component, fw_str); |
|---|
| 667 | + da7219_aad_fw_jack_det_rate(dev, fw_str); |
|---|
| 669 | 668 | else |
|---|
| 670 | 669 | aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; |
|---|
| 671 | 670 | |
|---|
| 672 | 671 | if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0) |
|---|
| 673 | 672 | aad_pdata->jack_rem_deb = |
|---|
| 674 | | - da7219_aad_fw_jack_rem_deb(component, fw_val32); |
|---|
| 673 | + da7219_aad_fw_jack_rem_deb(dev, fw_val32); |
|---|
| 675 | 674 | else |
|---|
| 676 | 675 | aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; |
|---|
| 677 | 676 | |
|---|
| .. | .. |
|---|
| 696 | 695 | aad_pdata->c_mic_btn_thr = 0x3E; |
|---|
| 697 | 696 | |
|---|
| 698 | 697 | if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0) |
|---|
| 699 | | - aad_pdata->btn_avg = da7219_aad_fw_btn_avg(component, fw_val32); |
|---|
| 698 | + aad_pdata->btn_avg = da7219_aad_fw_btn_avg(dev, fw_val32); |
|---|
| 700 | 699 | else |
|---|
| 701 | 700 | aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; |
|---|
| 702 | 701 | |
|---|
| 703 | 702 | if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0) |
|---|
| 704 | 703 | aad_pdata->adc_1bit_rpt = |
|---|
| 705 | | - da7219_aad_fw_adc_1bit_rpt(component, fw_val32); |
|---|
| 704 | + da7219_aad_fw_adc_1bit_rpt(dev, fw_val32); |
|---|
| 706 | 705 | else |
|---|
| 707 | 706 | aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; |
|---|
| 708 | 707 | |
|---|
| .. | .. |
|---|
| 851 | 850 | * suspend then this will be dealt with through the IRQ handler. |
|---|
| 852 | 851 | */ |
|---|
| 853 | 852 | if (da7219_aad->jack_inserted) { |
|---|
| 854 | | - micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); |
|---|
| 853 | + micbias_ctrl = snd_soc_component_read(component, DA7219_MICBIAS_CTRL); |
|---|
| 855 | 854 | if (micbias_ctrl & DA7219_MICBIAS1_EN_MASK) { |
|---|
| 856 | 855 | snd_soc_dapm_disable_pin(dapm, "Mic Bias"); |
|---|
| 857 | 856 | snd_soc_dapm_sync(dapm); |
|---|
| .. | .. |
|---|
| 859 | 858 | } |
|---|
| 860 | 859 | } |
|---|
| 861 | 860 | } |
|---|
| 861 | + |
|---|
| 862 | + synchronize_irq(da7219_aad->irq); |
|---|
| 862 | 863 | } |
|---|
| 863 | 864 | |
|---|
| 864 | 865 | void da7219_aad_resume(struct snd_soc_component *component) |
|---|
| .. | .. |
|---|
| 891 | 892 | int da7219_aad_init(struct snd_soc_component *component) |
|---|
| 892 | 893 | { |
|---|
| 893 | 894 | struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); |
|---|
| 894 | | - struct da7219_aad_priv *da7219_aad; |
|---|
| 895 | + struct da7219_aad_priv *da7219_aad = da7219->aad; |
|---|
| 895 | 896 | u8 mask[DA7219_AAD_IRQ_REG_MAX]; |
|---|
| 896 | 897 | int ret; |
|---|
| 897 | 898 | |
|---|
| 898 | | - da7219_aad = devm_kzalloc(component->dev, sizeof(*da7219_aad), GFP_KERNEL); |
|---|
| 899 | | - if (!da7219_aad) |
|---|
| 900 | | - return -ENOMEM; |
|---|
| 901 | | - |
|---|
| 902 | | - da7219->aad = da7219_aad; |
|---|
| 903 | 899 | da7219_aad->component = component; |
|---|
| 904 | 900 | |
|---|
| 905 | 901 | /* Handle any DT/ACPI/platform data */ |
|---|
| 906 | | - if (da7219->pdata && !da7219->pdata->aad_pdata) |
|---|
| 907 | | - da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(component); |
|---|
| 908 | | - |
|---|
| 909 | 902 | da7219_aad_handle_pdata(component); |
|---|
| 910 | 903 | |
|---|
| 911 | 904 | /* Disable button detection */ |
|---|
| .. | .. |
|---|
| 951 | 944 | } |
|---|
| 952 | 945 | EXPORT_SYMBOL_GPL(da7219_aad_exit); |
|---|
| 953 | 946 | |
|---|
| 947 | +/* |
|---|
| 948 | + * AAD related I2C probe handling |
|---|
| 949 | + */ |
|---|
| 950 | + |
|---|
| 951 | +int da7219_aad_probe(struct i2c_client *i2c) |
|---|
| 952 | +{ |
|---|
| 953 | + struct da7219_priv *da7219 = i2c_get_clientdata(i2c); |
|---|
| 954 | + struct device *dev = &i2c->dev; |
|---|
| 955 | + struct da7219_aad_priv *da7219_aad; |
|---|
| 956 | + |
|---|
| 957 | + da7219_aad = devm_kzalloc(dev, sizeof(*da7219_aad), GFP_KERNEL); |
|---|
| 958 | + if (!da7219_aad) |
|---|
| 959 | + return -ENOMEM; |
|---|
| 960 | + |
|---|
| 961 | + da7219->aad = da7219_aad; |
|---|
| 962 | + |
|---|
| 963 | + /* Retrieve any DT/ACPI/platform data */ |
|---|
| 964 | + if (da7219->pdata && !da7219->pdata->aad_pdata) |
|---|
| 965 | + da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(dev); |
|---|
| 966 | + |
|---|
| 967 | + return 0; |
|---|
| 968 | +} |
|---|
| 969 | +EXPORT_SYMBOL_GPL(da7219_aad_probe); |
|---|
| 970 | + |
|---|
| 954 | 971 | MODULE_DESCRIPTION("ASoC DA7219 AAD Driver"); |
|---|
| 955 | 972 | MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>"); |
|---|
| 956 | 973 | MODULE_LICENSE("GPL"); |
|---|