mt6359-accdet.c (32257B)
1// SPDX-License-Identifier: GPL-2.0 2// 3// mt6359-accdet.c -- ALSA SoC mt6359 accdet driver 4// 5// Copyright (C) 2021 MediaTek Inc. 6// Author: Argus Lin <argus.lin@mediatek.com> 7// 8 9#include <linux/of_gpio.h> 10#include <linux/of.h> 11#include <linux/of_irq.h> 12#include <linux/of_device.h> 13#include <linux/of_address.h> 14#include <linux/input.h> 15#include <linux/kthread.h> 16#include <linux/io.h> 17#include <linux/sched/clock.h> 18#include <linux/workqueue.h> 19#include <linux/timer.h> 20#include <linux/delay.h> 21#include <linux/module.h> 22#include <linux/platform_device.h> 23#include <linux/init.h> 24#include <linux/irqdomain.h> 25#include <linux/irq.h> 26#include <linux/regmap.h> 27#include <sound/soc.h> 28#include <sound/jack.h> 29#include <linux/mfd/mt6397/core.h> 30 31#include "mt6359-accdet.h" 32#include "mt6359.h" 33 34/* global variable definitions */ 35#define REGISTER_VAL(x) ((x) - 1) 36 37/* mt6359 accdet capability */ 38#define ACCDET_PMIC_EINT_IRQ BIT(0) 39#define ACCDET_AP_GPIO_EINT BIT(1) 40 41#define ACCDET_PMIC_EINT0 BIT(2) 42#define ACCDET_PMIC_EINT1 BIT(3) 43#define ACCDET_PMIC_BI_EINT BIT(4) 44 45#define ACCDET_PMIC_GPIO_TRIG_EINT BIT(5) 46#define ACCDET_PMIC_INVERTER_TRIG_EINT BIT(6) 47#define ACCDET_PMIC_RSV_EINT BIT(7) 48 49#define ACCDET_THREE_KEY BIT(8) 50#define ACCDET_FOUR_KEY BIT(9) 51#define ACCDET_TRI_KEY_CDD BIT(10) 52#define ACCDET_RSV_KEY BIT(11) 53 54#define ACCDET_ANALOG_FASTDISCHARGE BIT(12) 55#define ACCDET_DIGITAL_FASTDISCHARGE BIT(13) 56#define ACCDET_AD_FASTDISCHRAGE BIT(14) 57 58static struct platform_driver mt6359_accdet_driver; 59static const struct snd_soc_component_driver mt6359_accdet_soc_driver; 60 61/* local function declaration */ 62static void accdet_set_debounce(struct mt6359_accdet *priv, int state, 63 unsigned int debounce); 64static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv); 65static void config_digital_init_by_mode(struct mt6359_accdet *priv); 66static void config_eint_init_by_mode(struct mt6359_accdet *priv); 67static inline void mt6359_accdet_init(struct mt6359_accdet *priv); 68static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv); 69static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv); 70static void mt6359_accdet_jack_report(struct mt6359_accdet *priv); 71static void recover_eint_analog_setting(struct mt6359_accdet *priv); 72static void recover_eint_digital_setting(struct mt6359_accdet *priv); 73static void recover_eint_setting(struct mt6359_accdet *priv); 74 75static unsigned int adjust_eint_analog_setting(struct mt6359_accdet *priv) 76{ 77 if (priv->data->eint_detect_mode == 0x3 || 78 priv->data->eint_detect_mode == 0x4) { 79 /* ESD switches off */ 80 regmap_update_bits(priv->regmap, 81 RG_ACCDETSPARE_ADDR, 1 << 8, 0); 82 } 83 if (priv->data->eint_detect_mode == 0x4) { 84 if (priv->caps & ACCDET_PMIC_EINT0) { 85 /* enable RG_EINT0CONFIGACCDET */ 86 regmap_update_bits(priv->regmap, 87 RG_EINT0CONFIGACCDET_ADDR, 88 RG_EINT0CONFIGACCDET_MASK_SFT, 89 BIT(RG_EINT0CONFIGACCDET_SFT)); 90 } else if (priv->caps & ACCDET_PMIC_EINT1) { 91 /* enable RG_EINT1CONFIGACCDET */ 92 regmap_update_bits(priv->regmap, 93 RG_EINT1CONFIGACCDET_ADDR, 94 RG_EINT1CONFIGACCDET_MASK_SFT, 95 BIT(RG_EINT1CONFIGACCDET_SFT)); 96 } 97 if (priv->data->eint_use_ext_res == 0x3 || 98 priv->data->eint_use_ext_res == 0x4) { 99 /*select 500k, use internal resistor */ 100 regmap_update_bits(priv->regmap, 101 RG_EINT0HIRENB_ADDR, 102 RG_EINT0HIRENB_MASK_SFT, 103 BIT(RG_EINT0HIRENB_SFT)); 104 } 105 } 106 return 0; 107} 108 109static unsigned int adjust_eint_digital_setting(struct mt6359_accdet *priv) 110{ 111 if (priv->caps & ACCDET_PMIC_EINT0) { 112 /* disable inverter */ 113 regmap_update_bits(priv->regmap, 114 ACCDET_EINT0_INVERTER_SW_EN_ADDR, 115 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 0); 116 } else if (priv->caps & ACCDET_PMIC_EINT1) { 117 /* disable inverter */ 118 regmap_update_bits(priv->regmap, 119 ACCDET_EINT1_INVERTER_SW_EN_ADDR, 120 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 0); 121 } 122 123 if (priv->data->eint_detect_mode == 0x4) { 124 if (priv->caps & ACCDET_PMIC_EINT0) { 125 /* set DA stable signal */ 126 regmap_update_bits(priv->regmap, 127 ACCDET_DA_STABLE_ADDR, 128 ACCDET_EINT0_CEN_STABLE_MASK_SFT, 0); 129 } else if (priv->caps & ACCDET_PMIC_EINT1) { 130 /* set DA stable signal */ 131 regmap_update_bits(priv->regmap, 132 ACCDET_DA_STABLE_ADDR, 133 ACCDET_EINT1_CEN_STABLE_MASK_SFT, 0); 134 } 135 } 136 return 0; 137} 138 139static unsigned int mt6359_accdet_jd_setting(struct mt6359_accdet *priv) 140{ 141 if (priv->jd_sts == M_PLUG_IN) { 142 /* adjust digital setting */ 143 adjust_eint_digital_setting(priv); 144 /* adjust analog setting */ 145 adjust_eint_analog_setting(priv); 146 } else if (priv->jd_sts == M_PLUG_OUT) { 147 /* set debounce to 1ms */ 148 accdet_set_debounce(priv, eint_state000, 149 priv->data->pwm_deb->eint_debounce0); 150 } else { 151 dev_dbg(priv->dev, "should not be here %s()\n", __func__); 152 } 153 154 return 0; 155} 156 157static void recover_eint_analog_setting(struct mt6359_accdet *priv) 158{ 159 if (priv->data->eint_detect_mode == 0x3 || 160 priv->data->eint_detect_mode == 0x4) { 161 /* ESD switches on */ 162 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR, 163 1 << 8, 1 << 8); 164 } 165 if (priv->data->eint_detect_mode == 0x4) { 166 if (priv->caps & ACCDET_PMIC_EINT0) { 167 /* disable RG_EINT0CONFIGACCDET */ 168 regmap_update_bits(priv->regmap, 169 RG_EINT0CONFIGACCDET_ADDR, 170 RG_EINT0CONFIGACCDET_MASK_SFT, 0); 171 } else if (priv->caps & ACCDET_PMIC_EINT1) { 172 /* disable RG_EINT1CONFIGACCDET */ 173 regmap_update_bits(priv->regmap, 174 RG_EINT1CONFIGACCDET_ADDR, 175 RG_EINT1CONFIGACCDET_MASK_SFT, 0); 176 } 177 regmap_update_bits(priv->regmap, RG_EINT0HIRENB_ADDR, 178 RG_EINT0HIRENB_MASK_SFT, 0); 179 } 180} 181 182static void recover_eint_digital_setting(struct mt6359_accdet *priv) 183{ 184 if (priv->caps & ACCDET_PMIC_EINT0) { 185 regmap_update_bits(priv->regmap, 186 ACCDET_EINT0_M_SW_EN_ADDR, 187 ACCDET_EINT0_M_SW_EN_MASK_SFT, 0); 188 } else if (priv->caps & ACCDET_PMIC_EINT1) { 189 regmap_update_bits(priv->regmap, 190 ACCDET_EINT1_M_SW_EN_ADDR, 191 ACCDET_EINT1_M_SW_EN_MASK_SFT, 0); 192 } 193 if (priv->data->eint_detect_mode == 0x4) { 194 /* enable eint0cen */ 195 if (priv->caps & ACCDET_PMIC_EINT0) { 196 /* enable eint0cen */ 197 regmap_update_bits(priv->regmap, 198 ACCDET_DA_STABLE_ADDR, 199 ACCDET_EINT0_CEN_STABLE_MASK_SFT, 200 BIT(ACCDET_EINT0_CEN_STABLE_SFT)); 201 } else if (priv->caps & ACCDET_PMIC_EINT1) { 202 /* enable eint1cen */ 203 regmap_update_bits(priv->regmap, 204 ACCDET_DA_STABLE_ADDR, 205 ACCDET_EINT1_CEN_STABLE_MASK_SFT, 206 BIT(ACCDET_EINT1_CEN_STABLE_SFT)); 207 } 208 } 209 210 if (priv->data->eint_detect_mode != 0x1) { 211 if (priv->caps & ACCDET_PMIC_EINT0) { 212 /* enable inverter */ 213 regmap_update_bits(priv->regmap, 214 ACCDET_EINT0_INVERTER_SW_EN_ADDR, 215 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 216 BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT)); 217 } else if (priv->caps & ACCDET_PMIC_EINT1) { 218 /* enable inverter */ 219 regmap_update_bits(priv->regmap, 220 ACCDET_EINT1_INVERTER_SW_EN_ADDR, 221 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 222 BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT)); 223 } 224 } 225} 226 227static void recover_eint_setting(struct mt6359_accdet *priv) 228{ 229 if (priv->jd_sts == M_PLUG_OUT) { 230 recover_eint_analog_setting(priv); 231 recover_eint_digital_setting(priv); 232 } 233} 234 235static void mt6359_accdet_recover_jd_setting(struct mt6359_accdet *priv) 236{ 237 int ret; 238 unsigned int value = 0; 239 240 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 241 ACCDET_IRQ_CLR_MASK_SFT, BIT(ACCDET_IRQ_CLR_SFT)); 242 usleep_range(200, 300); 243 ret = regmap_read_poll_timeout(priv->regmap, 244 ACCDET_IRQ_ADDR, 245 value, 246 (value & ACCDET_IRQ_MASK_SFT) == 0, 247 0, 248 1000); 249 if (ret) 250 dev_warn(priv->dev, "%s(), ret %d\n", __func__, ret); 251 /* clear accdet int, modify for fix interrupt trigger twice error */ 252 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 253 ACCDET_IRQ_CLR_MASK_SFT, 0); 254 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR, 255 RG_INT_STATUS_ACCDET_MASK_SFT, 256 BIT(RG_INT_STATUS_ACCDET_SFT)); 257 258 /* recover accdet debounce0,3 */ 259 accdet_set_debounce(priv, accdet_state000, 260 priv->data->pwm_deb->debounce0); 261 accdet_set_debounce(priv, accdet_state001, 262 priv->data->pwm_deb->debounce1); 263 accdet_set_debounce(priv, accdet_state011, 264 priv->data->pwm_deb->debounce3); 265 266 priv->jack_type = 0; 267 priv->btn_type = 0; 268 priv->accdet_status = 0x3; 269 mt6359_accdet_jack_report(priv); 270} 271 272static void accdet_set_debounce(struct mt6359_accdet *priv, int state, 273 unsigned int debounce) 274{ 275 switch (state) { 276 case accdet_state000: 277 regmap_write(priv->regmap, ACCDET_DEBOUNCE0_ADDR, debounce); 278 break; 279 case accdet_state001: 280 regmap_write(priv->regmap, ACCDET_DEBOUNCE1_ADDR, debounce); 281 break; 282 case accdet_state010: 283 regmap_write(priv->regmap, ACCDET_DEBOUNCE2_ADDR, debounce); 284 break; 285 case accdet_state011: 286 regmap_write(priv->regmap, ACCDET_DEBOUNCE3_ADDR, debounce); 287 break; 288 case accdet_auxadc: 289 regmap_write(priv->regmap, 290 ACCDET_CONNECT_AUXADC_TIME_DIG_ADDR, debounce); 291 break; 292 case eint_state000: 293 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE0_ADDR, 294 0xF << ACCDET_EINT_DEBOUNCE0_SFT, 295 debounce << ACCDET_EINT_DEBOUNCE0_SFT); 296 break; 297 case eint_state001: 298 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE1_ADDR, 299 0xF << ACCDET_EINT_DEBOUNCE1_SFT, 300 debounce << ACCDET_EINT_DEBOUNCE1_SFT); 301 break; 302 case eint_state010: 303 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE2_ADDR, 304 0xF << ACCDET_EINT_DEBOUNCE2_SFT, 305 debounce << ACCDET_EINT_DEBOUNCE2_SFT); 306 break; 307 case eint_state011: 308 regmap_update_bits(priv->regmap, ACCDET_EINT_DEBOUNCE3_ADDR, 309 0xF << ACCDET_EINT_DEBOUNCE3_SFT, 310 debounce << ACCDET_EINT_DEBOUNCE3_SFT); 311 break; 312 case eint_inverter_state000: 313 regmap_write(priv->regmap, ACCDET_EINT_INVERTER_DEBOUNCE_ADDR, 314 debounce); 315 break; 316 default: 317 dev_warn(priv->dev, "Error: %s error state (%d)\n", __func__, 318 state); 319 break; 320 } 321} 322 323static void mt6359_accdet_jack_report(struct mt6359_accdet *priv) 324{ 325 int report = 0; 326 327 if (!priv->jack) 328 return; 329 330 report = priv->jack_type | priv->btn_type; 331 snd_soc_jack_report(priv->jack, report, MT6359_ACCDET_JACK_MASK); 332} 333 334static unsigned int check_button(struct mt6359_accdet *priv, unsigned int v) 335{ 336 if (priv->caps & ACCDET_FOUR_KEY) { 337 if (v < priv->data->four_key.down && 338 v >= priv->data->four_key.up) 339 priv->btn_type = SND_JACK_BTN_1; 340 if (v < priv->data->four_key.up && 341 v >= priv->data->four_key.voice) 342 priv->btn_type = SND_JACK_BTN_2; 343 if (v < priv->data->four_key.voice && 344 v >= priv->data->four_key.mid) 345 priv->btn_type = SND_JACK_BTN_3; 346 if (v < priv->data->four_key.mid) 347 priv->btn_type = SND_JACK_BTN_0; 348 } else { 349 if (v < priv->data->three_key.down && 350 v >= priv->data->three_key.up) 351 priv->btn_type = SND_JACK_BTN_1; 352 if (v < priv->data->three_key.up && 353 v >= priv->data->three_key.mid) 354 priv->btn_type = SND_JACK_BTN_2; 355 if (v < priv->data->three_key.mid) 356 priv->btn_type = SND_JACK_BTN_0; 357 } 358 return 0; 359} 360 361static void is_key_pressed(struct mt6359_accdet *priv, bool pressed) 362{ 363 priv->btn_type = priv->jack_type & ~MT6359_ACCDET_BTN_MASK; 364 365 if (pressed) 366 check_button(priv, priv->cali_voltage); 367} 368 369static inline void check_jack_btn_type(struct mt6359_accdet *priv) 370{ 371 unsigned int val = 0; 372 373 regmap_read(priv->regmap, ACCDET_MEM_IN_ADDR, &val); 374 375 priv->accdet_status = 376 (val >> ACCDET_STATE_MEM_IN_OFFSET) & ACCDET_STATE_AB_MASK; 377 378 switch (priv->accdet_status) { 379 case 0: 380 if (priv->jack_type == SND_JACK_HEADSET) 381 is_key_pressed(priv, true); 382 else 383 priv->jack_type = SND_JACK_HEADPHONE; 384 break; 385 case 1: 386 if (priv->jack_type == SND_JACK_HEADSET) { 387 is_key_pressed(priv, false); 388 } else { 389 priv->jack_type = SND_JACK_HEADSET; 390 accdet_set_debounce(priv, eint_state011, 0x1); 391 } 392 break; 393 case 3: 394 default: 395 priv->jack_type = 0; 396 break; 397 } 398} 399 400static void mt6359_accdet_work(struct work_struct *work) 401{ 402 struct mt6359_accdet *priv = 403 container_of(work, struct mt6359_accdet, accdet_work); 404 405 mutex_lock(&priv->res_lock); 406 priv->pre_accdet_status = priv->accdet_status; 407 check_jack_btn_type(priv); 408 409 if (priv->jack_plugged && 410 priv->pre_accdet_status != priv->accdet_status) 411 mt6359_accdet_jack_report(priv); 412 mutex_unlock(&priv->res_lock); 413} 414 415static void mt6359_accdet_jd_work(struct work_struct *work) 416{ 417 int ret; 418 unsigned int value = 0; 419 420 struct mt6359_accdet *priv = 421 container_of(work, struct mt6359_accdet, jd_work); 422 423 mutex_lock(&priv->res_lock); 424 if (priv->jd_sts == M_PLUG_IN) { 425 priv->jack_plugged = true; 426 427 /* set and clear initial bit every eint interrupt */ 428 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR, 429 ACCDET_SEQ_INIT_MASK_SFT, 430 BIT(ACCDET_SEQ_INIT_SFT)); 431 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR, 432 ACCDET_SEQ_INIT_MASK_SFT, 0); 433 ret = regmap_read_poll_timeout(priv->regmap, 434 ACCDET_SEQ_INIT_ADDR, 435 value, 436 (value & ACCDET_SEQ_INIT_MASK_SFT) == 0, 437 0, 438 1000); 439 if (ret) 440 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret); 441 442 /* enable ACCDET unit */ 443 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR, 444 ACCDET_SW_EN_MASK_SFT, BIT(ACCDET_SW_EN_SFT)); 445 } else if (priv->jd_sts == M_PLUG_OUT) { 446 priv->jack_plugged = false; 447 448 accdet_set_debounce(priv, accdet_state011, 449 priv->data->pwm_deb->debounce3); 450 regmap_update_bits(priv->regmap, ACCDET_SW_EN_ADDR, 451 ACCDET_SW_EN_MASK_SFT, 0); 452 mt6359_accdet_recover_jd_setting(priv); 453 } 454 455 if (priv->caps & ACCDET_PMIC_EINT_IRQ) 456 recover_eint_setting(priv); 457 mutex_unlock(&priv->res_lock); 458} 459 460static irqreturn_t mt6359_accdet_irq(int irq, void *data) 461{ 462 struct mt6359_accdet *priv = data; 463 unsigned int irq_val = 0, val = 0, value = 0; 464 int ret; 465 466 mutex_lock(&priv->res_lock); 467 regmap_read(priv->regmap, ACCDET_IRQ_ADDR, &irq_val); 468 469 if (irq_val & ACCDET_IRQ_MASK_SFT) { 470 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 471 ACCDET_IRQ_CLR_MASK_SFT, 472 BIT(ACCDET_IRQ_CLR_SFT)); 473 ret = regmap_read_poll_timeout(priv->regmap, 474 ACCDET_IRQ_ADDR, 475 value, 476 (value & ACCDET_IRQ_MASK_SFT) == 0, 477 0, 478 1000); 479 if (ret) { 480 dev_err(priv->dev, "%s(), ret %d\n", __func__, ret); 481 mutex_unlock(&priv->res_lock); 482 return IRQ_NONE; 483 } 484 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 485 ACCDET_IRQ_CLR_MASK_SFT, 0); 486 regmap_update_bits(priv->regmap, RG_INT_STATUS_ACCDET_ADDR, 487 RG_INT_STATUS_ACCDET_MASK_SFT, 488 BIT(RG_INT_STATUS_ACCDET_SFT)); 489 490 queue_work(priv->accdet_workqueue, &priv->accdet_work); 491 } else { 492 if (irq_val & ACCDET_EINT0_IRQ_MASK_SFT) { 493 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 494 ACCDET_EINT0_IRQ_CLR_MASK_SFT, 495 BIT(ACCDET_EINT0_IRQ_CLR_SFT)); 496 ret = regmap_read_poll_timeout(priv->regmap, 497 ACCDET_IRQ_ADDR, 498 value, 499 (value & ACCDET_EINT0_IRQ_MASK_SFT) == 0, 500 0, 501 1000); 502 if (ret) { 503 dev_err(priv->dev, "%s(), ret %d\n", __func__, 504 ret); 505 mutex_unlock(&priv->res_lock); 506 return IRQ_NONE; 507 } 508 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 509 ACCDET_EINT0_IRQ_CLR_MASK_SFT, 0); 510 regmap_update_bits(priv->regmap, 511 RG_INT_STATUS_ACCDET_ADDR, 512 RG_INT_STATUS_ACCDET_EINT0_MASK_SFT, 513 BIT(RG_INT_STATUS_ACCDET_EINT0_SFT)); 514 } 515 if (irq_val & ACCDET_EINT1_IRQ_MASK_SFT) { 516 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 517 ACCDET_EINT1_IRQ_CLR_MASK_SFT, 518 BIT(ACCDET_EINT1_IRQ_CLR_SFT)); 519 ret = regmap_read_poll_timeout(priv->regmap, 520 ACCDET_IRQ_ADDR, 521 value, 522 (value & ACCDET_EINT1_IRQ_MASK_SFT) == 0, 523 0, 524 1000); 525 if (ret) { 526 dev_err(priv->dev, "%s(), ret %d\n", __func__, 527 ret); 528 mutex_unlock(&priv->res_lock); 529 return IRQ_NONE; 530 } 531 regmap_update_bits(priv->regmap, ACCDET_IRQ_ADDR, 532 ACCDET_EINT1_IRQ_CLR_MASK_SFT, 0); 533 regmap_update_bits(priv->regmap, 534 RG_INT_STATUS_ACCDET_ADDR, 535 RG_INT_STATUS_ACCDET_EINT1_MASK_SFT, 536 BIT(RG_INT_STATUS_ACCDET_EINT1_SFT)); 537 } 538 /* get jack detection status */ 539 regmap_read(priv->regmap, ACCDET_EINT0_MEM_IN_ADDR, &val); 540 priv->jd_sts = ((val >> ACCDET_EINT0_MEM_IN_SFT) & 541 ACCDET_EINT0_MEM_IN_MASK); 542 /* adjust eint digital/analog setting */ 543 mt6359_accdet_jd_setting(priv); 544 545 queue_work(priv->jd_workqueue, &priv->jd_work); 546 } 547 mutex_unlock(&priv->res_lock); 548 549 return IRQ_HANDLED; 550} 551 552static int mt6359_accdet_parse_dt(struct mt6359_accdet *priv) 553{ 554 int ret; 555 struct device *dev = priv->dev; 556 struct device_node *node = NULL; 557 int pwm_deb[15] = {0}; 558 unsigned int tmp = 0; 559 560 node = of_get_child_by_name(dev->parent->of_node, "accdet"); 561 if (!node) 562 return -EINVAL; 563 564 ret = of_property_read_u32(node, "mediatek,mic-vol", 565 &priv->data->mic_vol); 566 if (ret) 567 priv->data->mic_vol = 8; 568 569 ret = of_property_read_u32(node, "mediatek,plugout-debounce", 570 &priv->data->plugout_deb); 571 if (ret) 572 priv->data->plugout_deb = 1; 573 574 ret = of_property_read_u32(node, "mediatek,mic-mode", 575 &priv->data->mic_mode); 576 if (ret) 577 priv->data->mic_mode = 2; 578 579 ret = of_property_read_u32_array(node, "mediatek,pwm-deb-setting", 580 pwm_deb, ARRAY_SIZE(pwm_deb)); 581 /* debounce8(auxadc debounce) is default, needn't get from dts */ 582 if (!ret) 583 memcpy(priv->data->pwm_deb, pwm_deb, sizeof(pwm_deb)); 584 585 ret = of_property_read_u32(node, "mediatek,eint-level-pol", 586 &priv->data->eint_pol); 587 if (ret) 588 priv->data->eint_pol = 8; 589 590 ret = of_property_read_u32(node, "mediatek,eint-use-ap", &tmp); 591 if (ret) 592 tmp = 0; 593 if (tmp == 0) 594 priv->caps |= ACCDET_PMIC_EINT_IRQ; 595 else if (tmp == 1) 596 priv->caps |= ACCDET_AP_GPIO_EINT; 597 598 ret = of_property_read_u32(node, "mediatek,eint-detect-mode", 599 &priv->data->eint_detect_mode); 600 if (ret) { 601 /* eint detection mode equals to EINT HW Mode */ 602 priv->data->eint_detect_mode = 0x4; 603 } 604 605 ret = of_property_read_u32(node, "mediatek,eint-num", &tmp); 606 if (ret) 607 tmp = 0; 608 if (tmp == 0) 609 priv->caps |= ACCDET_PMIC_EINT0; 610 else if (tmp == 1) 611 priv->caps |= ACCDET_PMIC_EINT1; 612 else if (tmp == 2) 613 priv->caps |= ACCDET_PMIC_BI_EINT; 614 615 ret = of_property_read_u32(node, "mediatek,eint-trig-mode", 616 &tmp); 617 if (ret) 618 tmp = 0; 619 if (tmp == 0) 620 priv->caps |= ACCDET_PMIC_GPIO_TRIG_EINT; 621 else if (tmp == 1) 622 priv->caps |= ACCDET_PMIC_INVERTER_TRIG_EINT; 623 624 ret = of_property_read_u32(node, "mediatek,eint-use-ext-res", 625 &priv->data->eint_use_ext_res); 626 if (ret) { 627 /* eint use internal resister */ 628 priv->data->eint_use_ext_res = 0x0; 629 } 630 631 ret = of_property_read_u32(node, "mediatek,eint-comp-vth", 632 &priv->data->eint_comp_vth); 633 if (ret) 634 priv->data->eint_comp_vth = 0x0; 635 636 ret = of_property_read_u32(node, "mediatek,key-mode", &tmp); 637 if (ret) 638 tmp = 0; 639 if (tmp == 0) { 640 int three_key[4]; 641 642 priv->caps |= ACCDET_THREE_KEY; 643 ret = of_property_read_u32_array(node, 644 "mediatek,three-key-thr", 645 three_key, 646 ARRAY_SIZE(three_key)); 647 if (!ret) 648 memcpy(&priv->data->three_key, three_key + 1, 649 sizeof(struct three_key_threshold)); 650 } else if (tmp == 1) { 651 int four_key[5]; 652 653 priv->caps |= ACCDET_FOUR_KEY; 654 ret = of_property_read_u32_array(node, 655 "mediatek,four-key-thr", 656 four_key, 657 ARRAY_SIZE(four_key)); 658 if (!ret) { 659 memcpy(&priv->data->four_key, four_key + 1, 660 sizeof(struct four_key_threshold)); 661 } else { 662 dev_warn(priv->dev, 663 "accdet no 4-key-thrsh dts, use efuse\n"); 664 } 665 } else if (tmp == 2) { 666 int three_key[4]; 667 668 priv->caps |= ACCDET_TRI_KEY_CDD; 669 ret = of_property_read_u32_array(node, 670 "mediatek,tri-key-cdd-thr", 671 three_key, 672 ARRAY_SIZE(three_key)); 673 if (!ret) 674 memcpy(&priv->data->three_key, three_key + 1, 675 sizeof(struct three_key_threshold)); 676 } 677 678 dev_warn(priv->dev, "accdet caps=%x\n", priv->caps); 679 680 return 0; 681} 682 683static void config_digital_init_by_mode(struct mt6359_accdet *priv) 684{ 685 /* enable eint cmpmem pwm */ 686 regmap_write(priv->regmap, ACCDET_EINT_CMPMEN_PWM_THRESH_ADDR, 687 (priv->data->pwm_deb->eint_pwm_width << 4 | 688 priv->data->pwm_deb->eint_pwm_thresh)); 689 /* DA signal stable */ 690 if (priv->caps & ACCDET_PMIC_EINT0) { 691 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR, 692 ACCDET_EINT0_STABLE_VAL); 693 } else if (priv->caps & ACCDET_PMIC_EINT1) { 694 regmap_write(priv->regmap, ACCDET_DA_STABLE_ADDR, 695 ACCDET_EINT1_STABLE_VAL); 696 } 697 /* after receive n+1 number, interrupt issued. */ 698 regmap_update_bits(priv->regmap, ACCDET_EINT_M_PLUG_IN_NUM_ADDR, 699 ACCDET_EINT_M_PLUG_IN_NUM_MASK_SFT, 700 BIT(ACCDET_EINT_M_PLUG_IN_NUM_SFT)); 701 /* setting HW mode, enable digital fast discharge 702 * if use EINT0 & EINT1 detection, please modify 703 * ACCDET_HWMODE_EN_ADDR[2:1] 704 */ 705 regmap_write(priv->regmap, ACCDET_HWMODE_EN_ADDR, 0x100); 706 707 regmap_update_bits(priv->regmap, ACCDET_EINT_M_DETECT_EN_ADDR, 708 ACCDET_EINT_M_DETECT_EN_MASK_SFT, 0); 709 710 /* enable PWM */ 711 regmap_write(priv->regmap, ACCDET_CMP_PWM_EN_ADDR, 0x67); 712 /* enable inverter detection */ 713 if (priv->data->eint_detect_mode == 0x1) { 714 /* disable inverter detection */ 715 if (priv->caps & ACCDET_PMIC_EINT0) { 716 regmap_update_bits(priv->regmap, 717 ACCDET_EINT0_INVERTER_SW_EN_ADDR, 718 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 719 0); 720 } else if (priv->caps & ACCDET_PMIC_EINT1) { 721 regmap_update_bits(priv->regmap, 722 ACCDET_EINT1_INVERTER_SW_EN_ADDR, 723 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 724 0); 725 } 726 } else { 727 if (priv->caps & ACCDET_PMIC_EINT0) { 728 regmap_update_bits(priv->regmap, 729 ACCDET_EINT0_INVERTER_SW_EN_ADDR, 730 ACCDET_EINT0_INVERTER_SW_EN_MASK_SFT, 731 BIT(ACCDET_EINT0_INVERTER_SW_EN_SFT)); 732 } else if (priv->caps & ACCDET_PMIC_EINT1) { 733 regmap_update_bits(priv->regmap, 734 ACCDET_EINT1_INVERTER_SW_EN_ADDR, 735 ACCDET_EINT1_INVERTER_SW_EN_MASK_SFT, 736 BIT(ACCDET_EINT1_INVERTER_SW_EN_SFT)); 737 } 738 } 739} 740 741static void config_eint_init_by_mode(struct mt6359_accdet *priv) 742{ 743 unsigned int val = 0; 744 745 if (priv->caps & ACCDET_PMIC_EINT0) { 746 regmap_update_bits(priv->regmap, RG_EINT0EN_ADDR, 747 RG_EINT0EN_MASK_SFT, BIT(RG_EINT0EN_SFT)); 748 } else if (priv->caps & ACCDET_PMIC_EINT1) { 749 regmap_update_bits(priv->regmap, RG_EINT1EN_ADDR, 750 RG_EINT1EN_MASK_SFT, BIT(RG_EINT1EN_SFT)); 751 } 752 /* ESD switches on */ 753 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR, 754 1 << 8, 1 << 8); 755 /* before playback, set NCP pull low before nagative voltage */ 756 regmap_update_bits(priv->regmap, RG_NCP_PDDIS_EN_ADDR, 757 RG_NCP_PDDIS_EN_MASK_SFT, BIT(RG_NCP_PDDIS_EN_SFT)); 758 759 if (priv->data->eint_detect_mode == 0x1 || 760 priv->data->eint_detect_mode == 0x2 || 761 priv->data->eint_detect_mode == 0x3) { 762 if (priv->data->eint_use_ext_res == 0x1) { 763 if (priv->caps & ACCDET_PMIC_EINT0) { 764 regmap_update_bits(priv->regmap, 765 RG_EINT0CONFIGACCDET_ADDR, 766 RG_EINT0CONFIGACCDET_MASK_SFT, 767 0); 768 } else if (priv->caps & ACCDET_PMIC_EINT1) { 769 regmap_update_bits(priv->regmap, 770 RG_EINT1CONFIGACCDET_ADDR, 771 RG_EINT1CONFIGACCDET_MASK_SFT, 772 0); 773 } 774 } else { 775 if (priv->caps & ACCDET_PMIC_EINT0) { 776 regmap_update_bits(priv->regmap, 777 RG_EINT0CONFIGACCDET_ADDR, 778 RG_EINT0CONFIGACCDET_MASK_SFT, 779 BIT(RG_EINT0CONFIGACCDET_SFT)); 780 } else if (priv->caps & ACCDET_PMIC_EINT1) { 781 regmap_update_bits(priv->regmap, 782 RG_EINT1CONFIGACCDET_ADDR, 783 RG_EINT1CONFIGACCDET_MASK_SFT, 784 BIT(RG_EINT1CONFIGACCDET_SFT)); 785 } 786 } 787 } 788 789 if (priv->data->eint_detect_mode != 0x1) { 790 /* current detect set 0.25uA */ 791 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR, 792 0x3 << RG_ACCDETSPARE_SFT, 793 0x3 << RG_ACCDETSPARE_SFT); 794 } 795 regmap_write(priv->regmap, RG_EINTCOMPVTH_ADDR, 796 val | priv->data->eint_comp_vth << RG_EINTCOMPVTH_SFT); 797} 798 799static void mt6359_accdet_init(struct mt6359_accdet *priv) 800{ 801 unsigned int reg = 0; 802 803 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR, 804 ACCDET_SEQ_INIT_MASK_SFT, BIT(ACCDET_SEQ_INIT_SFT)); 805 mdelay(2); 806 regmap_update_bits(priv->regmap, ACCDET_SEQ_INIT_ADDR, 807 ACCDET_SEQ_INIT_MASK_SFT, 0); 808 mdelay(1); 809 /* init the debounce time (debounce/32768)sec */ 810 accdet_set_debounce(priv, accdet_state000, 811 priv->data->pwm_deb->debounce0); 812 accdet_set_debounce(priv, accdet_state001, 813 priv->data->pwm_deb->debounce1); 814 accdet_set_debounce(priv, accdet_state011, 815 priv->data->pwm_deb->debounce3); 816 accdet_set_debounce(priv, accdet_auxadc, 817 priv->data->pwm_deb->debounce4); 818 819 accdet_set_debounce(priv, eint_state000, 820 priv->data->pwm_deb->eint_debounce0); 821 accdet_set_debounce(priv, eint_state001, 822 priv->data->pwm_deb->eint_debounce1); 823 accdet_set_debounce(priv, eint_state011, 824 priv->data->pwm_deb->eint_debounce3); 825 accdet_set_debounce(priv, eint_inverter_state000, 826 priv->data->pwm_deb->eint_inverter_debounce); 827 828 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR, 829 RG_ACCDET_RST_MASK_SFT, BIT(RG_ACCDET_RST_SFT)); 830 regmap_update_bits(priv->regmap, RG_ACCDET_RST_ADDR, 831 RG_ACCDET_RST_MASK_SFT, 0); 832 833 /* clear high micbias1 voltage setting */ 834 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 835 0x3 << RG_AUDMICBIAS1HVEN_SFT, 0); 836 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 837 0x7 << RG_AUDMICBIAS1VREF_SFT, 0); 838 839 /* init pwm frequency, duty & rise/falling delay */ 840 regmap_write(priv->regmap, ACCDET_PWM_WIDTH_ADDR, 841 REGISTER_VAL(priv->data->pwm_deb->pwm_width)); 842 regmap_write(priv->regmap, ACCDET_PWM_THRESH_ADDR, 843 REGISTER_VAL(priv->data->pwm_deb->pwm_thresh)); 844 regmap_write(priv->regmap, ACCDET_RISE_DELAY_ADDR, 845 (priv->data->pwm_deb->fall_delay << 15 | 846 priv->data->pwm_deb->rise_delay)); 847 848 regmap_read(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, ®); 849 if (priv->data->mic_vol <= 7) { 850 /* micbias1 <= 2.7V */ 851 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 852 reg | (priv->data->mic_vol << RG_AUDMICBIAS1VREF_SFT) | 853 RG_AUDMICBIAS1LOWPEN_MASK_SFT); 854 } else if (priv->data->mic_vol == 8) { 855 /* micbias1 = 2.8v */ 856 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 857 reg | (3 << RG_AUDMICBIAS1HVEN_SFT) | 858 RG_AUDMICBIAS1LOWPEN_MASK_SFT); 859 } else if (priv->data->mic_vol == 9) { 860 /* micbias1 = 2.85v */ 861 regmap_write(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 862 reg | (1 << RG_AUDMICBIAS1HVEN_SFT) | 863 RG_AUDMICBIAS1LOWPEN_MASK_SFT); 864 } 865 /* mic mode setting */ 866 regmap_read(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, ®); 867 if (priv->data->mic_mode == HEADSET_MODE_1) { 868 /* ACC mode*/ 869 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, 870 reg | RG_ACCDET_MODE_ANA11_MODE1); 871 /* enable analog fast discharge */ 872 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR, 873 RG_ANALOGFDEN_MASK_SFT, 874 BIT(RG_ANALOGFDEN_SFT)); 875 regmap_update_bits(priv->regmap, RG_ACCDETSPARE_ADDR, 876 0x3 << 11, 0x3 << 11); 877 } else if (priv->data->mic_mode == HEADSET_MODE_2) { 878 /* DCC mode Low cost mode without internal bias */ 879 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, 880 reg | RG_ACCDET_MODE_ANA11_MODE2); 881 /* enable analog fast discharge */ 882 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR, 883 0x3 << RG_ANALOGFDEN_SFT, 884 0x3 << RG_ANALOGFDEN_SFT); 885 } else if (priv->data->mic_mode == HEADSET_MODE_6) { 886 /* DCC mode Low cost mode with internal bias, 887 * bit8 = 1 to use internal bias 888 */ 889 regmap_write(priv->regmap, RG_AUDACCDETMICBIAS0PULLLOW_ADDR, 890 reg | RG_ACCDET_MODE_ANA11_MODE6); 891 regmap_update_bits(priv->regmap, RG_AUDPWDBMICBIAS1_ADDR, 892 RG_AUDMICBIAS1DCSW1PEN_MASK_SFT, 893 BIT(RG_AUDMICBIAS1DCSW1PEN_SFT)); 894 /* enable analog fast discharge */ 895 regmap_update_bits(priv->regmap, RG_ANALOGFDEN_ADDR, 896 0x3 << RG_ANALOGFDEN_SFT, 897 0x3 << RG_ANALOGFDEN_SFT); 898 } 899 900 if (priv->caps & ACCDET_PMIC_EINT_IRQ) { 901 config_eint_init_by_mode(priv); 902 config_digital_init_by_mode(priv); 903 } 904} 905 906int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component, 907 struct snd_soc_jack *jack) 908{ 909 struct mt6359_accdet *priv = 910 snd_soc_component_get_drvdata(component); 911 912 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 913 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEDOWN); 914 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 915 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); 916 917 priv->jack = jack; 918 919 mt6359_accdet_jack_report(priv); 920 921 return 0; 922} 923EXPORT_SYMBOL_GPL(mt6359_accdet_enable_jack_detect); 924 925static int mt6359_accdet_probe(struct platform_device *pdev) 926{ 927 struct mt6359_accdet *priv; 928 struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent); 929 int ret; 930 931 dev_dbg(&pdev->dev, "%s(), dev name %s\n", 932 __func__, dev_name(&pdev->dev)); 933 934 priv = devm_kzalloc(&pdev->dev, sizeof(struct mt6359_accdet), 935 GFP_KERNEL); 936 if (!priv) 937 return -ENOMEM; 938 939 priv->data = devm_kzalloc(&pdev->dev, sizeof(struct dts_data), 940 GFP_KERNEL); 941 if (!priv->data) 942 return -ENOMEM; 943 944 priv->data->pwm_deb = devm_kzalloc(&pdev->dev, 945 sizeof(struct pwm_deb_settings), 946 GFP_KERNEL); 947 if (!priv->data->pwm_deb) 948 return -ENOMEM; 949 950 priv->regmap = mt6397->regmap; 951 if (IS_ERR(priv->regmap)) { 952 ret = PTR_ERR(priv->regmap); 953 dev_err(&pdev->dev, "Failed to allocate register map: %d\n", 954 ret); 955 return ret; 956 } 957 priv->dev = &pdev->dev; 958 959 ret = mt6359_accdet_parse_dt(priv); 960 if (ret) { 961 dev_err(&pdev->dev, "Failed to parse dts\n"); 962 return ret; 963 } 964 mutex_init(&priv->res_lock); 965 966 priv->accdet_irq = platform_get_irq(pdev, 0); 967 if (priv->accdet_irq) { 968 ret = devm_request_threaded_irq(&pdev->dev, priv->accdet_irq, 969 NULL, mt6359_accdet_irq, 970 IRQF_TRIGGER_HIGH | IRQF_ONESHOT, 971 "ACCDET_IRQ", priv); 972 if (ret) { 973 dev_err(&pdev->dev, 974 "Failed to request IRQ: (%d)\n", ret); 975 return ret; 976 } 977 } 978 979 if (priv->caps & ACCDET_PMIC_EINT0) { 980 priv->accdet_eint0 = platform_get_irq(pdev, 1); 981 if (priv->accdet_eint0) { 982 ret = devm_request_threaded_irq(&pdev->dev, 983 priv->accdet_eint0, 984 NULL, mt6359_accdet_irq, 985 IRQF_TRIGGER_HIGH | IRQF_ONESHOT, 986 "ACCDET_EINT0", priv); 987 if (ret) { 988 dev_err(&pdev->dev, 989 "Failed to request eint0 IRQ (%d)\n", 990 ret); 991 return ret; 992 } 993 } 994 } else if (priv->caps & ACCDET_PMIC_EINT1) { 995 priv->accdet_eint1 = platform_get_irq(pdev, 2); 996 if (priv->accdet_eint1) { 997 ret = devm_request_threaded_irq(&pdev->dev, 998 priv->accdet_eint1, 999 NULL, mt6359_accdet_irq, 1000 IRQF_TRIGGER_HIGH | IRQF_ONESHOT, 1001 "ACCDET_EINT1", priv); 1002 if (ret) { 1003 dev_err(&pdev->dev, 1004 "Failed to request eint1 IRQ (%d)\n", 1005 ret); 1006 return ret; 1007 } 1008 } 1009 } 1010 1011 priv->accdet_workqueue = create_singlethread_workqueue("accdet"); 1012 INIT_WORK(&priv->accdet_work, mt6359_accdet_work); 1013 if (!priv->accdet_workqueue) { 1014 dev_err(&pdev->dev, "Failed to create accdet workqueue\n"); 1015 ret = -1; 1016 goto err_accdet_wq; 1017 } 1018 1019 priv->jd_workqueue = create_singlethread_workqueue("mt6359_accdet_jd"); 1020 INIT_WORK(&priv->jd_work, mt6359_accdet_jd_work); 1021 if (!priv->jd_workqueue) { 1022 dev_err(&pdev->dev, "Failed to create jack detect workqueue\n"); 1023 ret = -1; 1024 goto err_eint_wq; 1025 } 1026 1027 platform_set_drvdata(pdev, priv); 1028 ret = devm_snd_soc_register_component(&pdev->dev, 1029 &mt6359_accdet_soc_driver, 1030 NULL, 0); 1031 if (ret) { 1032 dev_err(&pdev->dev, "Failed to register component\n"); 1033 return ret; 1034 } 1035 1036 priv->jd_sts = M_PLUG_OUT; 1037 priv->jack_type = 0; 1038 priv->btn_type = 0; 1039 priv->accdet_status = 0x3; 1040 mt6359_accdet_init(priv); 1041 1042 mt6359_accdet_jack_report(priv); 1043 1044 return 0; 1045 1046err_eint_wq: 1047 destroy_workqueue(priv->accdet_workqueue); 1048err_accdet_wq: 1049 dev_err(&pdev->dev, "%s error. now exit.!\n", __func__); 1050 return ret; 1051} 1052 1053static struct platform_driver mt6359_accdet_driver = { 1054 .driver = { 1055 .name = "pmic-codec-accdet", 1056 }, 1057 .probe = mt6359_accdet_probe, 1058}; 1059 1060module_platform_driver(mt6359_accdet_driver) 1061 1062/* Module information */ 1063MODULE_DESCRIPTION("MT6359 ALSA SoC codec jack driver"); 1064MODULE_AUTHOR("Argus Lin <argus.lin@mediatek.com>"); 1065MODULE_LICENSE("GPL v2");