aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/extcon/extcon-arizona.c19
-rw-r--r--include/linux/mfd/arizona/core.h4
-rw-r--r--include/linux/mfd/arizona/registers.h28
3 files changed, 50 insertions, 1 deletions
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c
index 635b7078ce5e..3ef3bee7d1e6 100644
--- a/drivers/extcon/extcon-arizona.c
+++ b/drivers/extcon/extcon-arizona.c
@@ -45,6 +45,7 @@ struct arizona_extcon_info {
45 int micd_num_modes; 45 int micd_num_modes;
46 46
47 bool micd_reva; 47 bool micd_reva;
48 bool micd_clamp;
48 49
49 bool mic; 50 bool mic;
50 bool detecting; 51 bool detecting;
@@ -375,6 +376,7 @@ static int arizona_extcon_probe(struct platform_device *pdev)
375 info->micd_reva = true; 376 info->micd_reva = true;
376 break; 377 break;
377 default: 378 default:
379 info->micd_clamp = true;
378 break; 380 break;
379 } 381 }
380 break; 382 break;
@@ -423,6 +425,19 @@ static int arizona_extcon_probe(struct platform_device *pdev)
423 arizona->pdata.micd_bias_start_time 425 arizona->pdata.micd_bias_start_time
424 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT); 426 << ARIZONA_MICD_BIAS_STARTTIME_SHIFT);
425 427
428 /*
429 * If we have a clamp use it.
430 */
431 if (info->micd_clamp) {
432 regmap_update_bits(arizona->regmap,
433 ARIZONA_MICD_CLAMP_CONTROL,
434 ARIZONA_MICD_CLAMP_MODE_MASK, 4);
435 regmap_update_bits(arizona->regmap,
436 ARIZONA_JACK_DETECT_DEBOUNCE,
437 ARIZONA_MICD_CLAMP_DB,
438 ARIZONA_MICD_CLAMP_DB);
439 }
440
426 arizona_extcon_set_mode(info, 0); 441 arizona_extcon_set_mode(info, 0);
427 442
428 info->input = devm_input_allocate_device(&pdev->dev); 443 info->input = devm_input_allocate_device(&pdev->dev);
@@ -529,6 +544,10 @@ static int arizona_extcon_remove(struct platform_device *pdev)
529 544
530 pm_runtime_disable(&pdev->dev); 545 pm_runtime_disable(&pdev->dev);
531 546
547 regmap_update_bits(arizona->regmap,
548 ARIZONA_MICD_CLAMP_CONTROL,
549 ARIZONA_MICD_CLAMP_MODE_MASK, 0);
550
532 arizona_set_irq_wake(arizona, ARIZONA_IRQ_JD_RISE, 0); 551 arizona_set_irq_wake(arizona, ARIZONA_IRQ_JD_RISE, 0);
533 arizona_set_irq_wake(arizona, ARIZONA_IRQ_JD_FALL, 0); 552 arizona_set_irq_wake(arizona, ARIZONA_IRQ_JD_FALL, 0);
534 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info); 553 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h
index a580363a7d29..a710255528d7 100644
--- a/include/linux/mfd/arizona/core.h
+++ b/include/linux/mfd/arizona/core.h
@@ -75,8 +75,10 @@ enum arizona_type {
75#define ARIZONA_IRQ_DCS_HP_DONE 47 75#define ARIZONA_IRQ_DCS_HP_DONE 47
76#define ARIZONA_IRQ_FLL2_CLOCK_OK 48 76#define ARIZONA_IRQ_FLL2_CLOCK_OK 48
77#define ARIZONA_IRQ_FLL1_CLOCK_OK 49 77#define ARIZONA_IRQ_FLL1_CLOCK_OK 49
78#define ARIZONA_IRQ_MICD_CLAMP_RISE 50
79#define ARIZONA_IRQ_MICD_CLAMP_FALL 51
78 80
79#define ARIZONA_NUM_IRQ 50 81#define ARIZONA_NUM_IRQ 52
80 82
81struct snd_soc_dapm_context; 83struct snd_soc_dapm_context;
82 84
diff --git a/include/linux/mfd/arizona/registers.h b/include/linux/mfd/arizona/registers.h
index 1f6fe31a4d5c..f3211f06cec6 100644
--- a/include/linux/mfd/arizona/registers.h
+++ b/include/linux/mfd/arizona/registers.h
@@ -119,6 +119,7 @@
119#define ARIZONA_ACCESSORY_DETECT_MODE_1 0x293 119#define ARIZONA_ACCESSORY_DETECT_MODE_1 0x293
120#define ARIZONA_HEADPHONE_DETECT_1 0x29B 120#define ARIZONA_HEADPHONE_DETECT_1 0x29B
121#define ARIZONA_HEADPHONE_DETECT_2 0x29C 121#define ARIZONA_HEADPHONE_DETECT_2 0x29C
122#define ARIZONA_MICD_CLAMP_CONTROL 0x2A2
122#define ARIZONA_MIC_DETECT_1 0x2A3 123#define ARIZONA_MIC_DETECT_1 0x2A3
123#define ARIZONA_MIC_DETECT_2 0x2A4 124#define ARIZONA_MIC_DETECT_2 0x2A4
124#define ARIZONA_MIC_DETECT_3 0x2A5 125#define ARIZONA_MIC_DETECT_3 0x2A5
@@ -2070,6 +2071,13 @@
2070#define ARIZONA_HP_LVL_WIDTH 7 /* HP_LVL - [6:0] */ 2071#define ARIZONA_HP_LVL_WIDTH 7 /* HP_LVL - [6:0] */
2071 2072
2072/* 2073/*
2074 * R674 (0x2A2) - MICD clamp control
2075 */
2076#define ARIZONA_MICD_CLAMP_MODE_MASK 0x000F /* MICD_CLAMP_MODE - [3:0] */
2077#define ARIZONA_MICD_CLAMP_MODE_SHIFT 0 /* MICD_CLAMP_MODE - [3:0] */
2078#define ARIZONA_MICD_CLAMP_MODE_WIDTH 4 /* MICD_CLAMP_MODE - [3:0] */
2079
2080/*
2073 * R675 (0x2A3) - Mic Detect 1 2081 * R675 (0x2A3) - Mic Detect 1
2074 */ 2082 */
2075#define ARIZONA_MICD_BIAS_STARTTIME_MASK 0xF000 /* MICD_BIAS_STARTTIME - [15:12] */ 2083#define ARIZONA_MICD_BIAS_STARTTIME_MASK 0xF000 /* MICD_BIAS_STARTTIME - [15:12] */
@@ -5267,6 +5275,12 @@
5267/* 5275/*
5268 * R3409 (0xD51) - AOD IRQ1 5276 * R3409 (0xD51) - AOD IRQ1
5269 */ 5277 */
5278#define ARIZONA_MICD_CLAMP_FALL_EINT1 0x0080 /* MICD_CLAMP_FALL_EINT1 */
5279#define ARIZONA_MICD_CLAMP_FALL_EINT1_MASK 0x0080 /* MICD_CLAMP_FALL_EINT1 */
5280#define ARIZONA_MICD_CLAMP_FALL_EINT1_SHIFT 7 /* MICD_CLAMP_FALL_EINT1 */
5281#define ARIZONA_MICD_CLAMP_RISE_EINT1 0x0040 /* MICD_CLAMP_RISE_EINT1 */
5282#define ARIZONA_MICD_CLAMP_RISE_EINT1_MASK 0x0040 /* MICD_CLAMP_RISE_EINT1 */
5283#define ARIZONA_MICD_CLAMP_RISE_EINT1_SHIFT 6 /* MICD_CLAMP_RISE_EINT1 */
5270#define ARIZONA_GP5_FALL_EINT1 0x0020 /* GP5_FALL_EINT1 */ 5284#define ARIZONA_GP5_FALL_EINT1 0x0020 /* GP5_FALL_EINT1 */
5271#define ARIZONA_GP5_FALL_EINT1_MASK 0x0020 /* GP5_FALL_EINT1 */ 5285#define ARIZONA_GP5_FALL_EINT1_MASK 0x0020 /* GP5_FALL_EINT1 */
5272#define ARIZONA_GP5_FALL_EINT1_SHIFT 5 /* GP5_FALL_EINT1 */ 5286#define ARIZONA_GP5_FALL_EINT1_SHIFT 5 /* GP5_FALL_EINT1 */
@@ -5295,6 +5309,12 @@
5295/* 5309/*
5296 * R3410 (0xD52) - AOD IRQ2 5310 * R3410 (0xD52) - AOD IRQ2
5297 */ 5311 */
5312#define ARIZONA_MICD_CLAMP_FALL_EINT2 0x0080 /* MICD_CLAMP_FALL_EINT2 */
5313#define ARIZONA_MICD_CLAMP_FALL_EINT2_MASK 0x0080 /* MICD_CLAMP_FALL_EINT2 */
5314#define ARIZONA_MICD_CLAMP_FALL_EINT2_SHIFT 7 /* MICD_CLAMP_FALL_EINT2 */
5315#define ARIZONA_MICD_CLAMP_RISE_EINT2 0x0040 /* MICD_CLAMP_RISE_EINT2 */
5316#define ARIZONA_MICD_CLAMP_RISE_EINT2_MASK 0x0040 /* MICD_CLAMP_RISE_EINT2 */
5317#define ARIZONA_MICD_CLAMP_RISE_EINT2_SHIFT 6 /* MICD_CLAMP_RISE_EINT2 */
5298#define ARIZONA_GP5_FALL_EINT2 0x0020 /* GP5_FALL_EINT2 */ 5318#define ARIZONA_GP5_FALL_EINT2 0x0020 /* GP5_FALL_EINT2 */
5299#define ARIZONA_GP5_FALL_EINT2_MASK 0x0020 /* GP5_FALL_EINT2 */ 5319#define ARIZONA_GP5_FALL_EINT2_MASK 0x0020 /* GP5_FALL_EINT2 */
5300#define ARIZONA_GP5_FALL_EINT2_SHIFT 5 /* GP5_FALL_EINT2 */ 5320#define ARIZONA_GP5_FALL_EINT2_SHIFT 5 /* GP5_FALL_EINT2 */
@@ -5379,6 +5399,10 @@
5379/* 5399/*
5380 * R3413 (0xD55) - AOD IRQ Raw Status 5400 * R3413 (0xD55) - AOD IRQ Raw Status
5381 */ 5401 */
5402#define ARIZONA_MICD_CLAMP_STS 0x0008 /* MICD_CLAMP_STS */
5403#define ARIZONA_MICD_CLAMP_STS_MASK 0x0008 /* MICD_CLAMP_STS */
5404#define ARIZONA_MICD_CLAMP_STS_SHIFT 3 /* MICD_CLAMP_STS */
5405#define ARIZONA_MICD_CLAMP_STS_WIDTH 1 /* MICD_CLAMP_STS */
5382#define ARIZONA_GP5_STS 0x0004 /* GP5_STS */ 5406#define ARIZONA_GP5_STS 0x0004 /* GP5_STS */
5383#define ARIZONA_GP5_STS_MASK 0x0004 /* GP5_STS */ 5407#define ARIZONA_GP5_STS_MASK 0x0004 /* GP5_STS */
5384#define ARIZONA_GP5_STS_SHIFT 2 /* GP5_STS */ 5408#define ARIZONA_GP5_STS_SHIFT 2 /* GP5_STS */
@@ -5395,6 +5419,10 @@
5395/* 5419/*
5396 * R3414 (0xD56) - Jack detect debounce 5420 * R3414 (0xD56) - Jack detect debounce
5397 */ 5421 */
5422#define ARIZONA_MICD_CLAMP_DB 0x0008 /* MICD_CLAMP_DB */
5423#define ARIZONA_MICD_CLAMP_DB_MASK 0x0008 /* MICD_CLAMP_DB */
5424#define ARIZONA_MICD_CLAMP_DB_SHIFT 3 /* MICD_CLAMP_DB */
5425#define ARIZONA_MICD_CLAMP_DB_WIDTH 1 /* MICD_CLAMP_DB */
5398#define ARIZONA_JD2_DB 0x0002 /* JD2_DB */ 5426#define ARIZONA_JD2_DB 0x0002 /* JD2_DB */
5399#define ARIZONA_JD2_DB_MASK 0x0002 /* JD2_DB */ 5427#define ARIZONA_JD2_DB_MASK 0x0002 /* JD2_DB */
5400#define ARIZONA_JD2_DB_SHIFT 1 /* JD2_DB */ 5428#define ARIZONA_JD2_DB_SHIFT 1 /* JD2_DB */