ASoC: ts3a227e control debounce times
Merge series from Astrid Rost <astrid.rost@axis.com>: Add debounce support to the ts3a227e driver.
This commit is contained in:
commit
843e10b394
|
@ -0,0 +1,94 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/ti,ts3a227e.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Texas Instruments TS3A227E
|
||||||
|
Autonomous Audio Accessory Detection and Configuration Switch
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Dylan Reid <dgreid@chromium.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The TS3A227E detect headsets of 3-ring and 4-ring standards and
|
||||||
|
switches automatically to route the microphone correctly. It also
|
||||||
|
handles key press detection in accordance with the Android audio
|
||||||
|
headset specification v1.0.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- ti,ts3a227e
|
||||||
|
|
||||||
|
reg:
|
||||||
|
const: 0x3b
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
ti,micbias:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
description: Intended MICBIAS voltage (datasheet section 9.6.7).
|
||||||
|
enum:
|
||||||
|
- 0 # 2.1 V
|
||||||
|
- 1 # 2.2 V
|
||||||
|
- 2 # 2.3 V
|
||||||
|
- 3 # 2.4 V
|
||||||
|
- 4 # 2.5 V
|
||||||
|
- 5 # 2.6 V
|
||||||
|
- 6 # 2.7 V
|
||||||
|
- 7 # 2.8 V
|
||||||
|
default: 1
|
||||||
|
|
||||||
|
ti,debounce-release-ms:
|
||||||
|
description: key release debounce time in ms (datasheet section 9.6.7).
|
||||||
|
enum:
|
||||||
|
- 0
|
||||||
|
- 20
|
||||||
|
default: 20
|
||||||
|
|
||||||
|
ti,debounce-press-ms:
|
||||||
|
description: key press debounce time in ms (datasheet section 9.6.7).
|
||||||
|
enum:
|
||||||
|
- 2
|
||||||
|
- 40
|
||||||
|
- 80
|
||||||
|
- 120
|
||||||
|
default: 80
|
||||||
|
|
||||||
|
ti,debounce-insertion-ms:
|
||||||
|
description: headset insertion debounce time in ms (datasheet section 9.6.5).
|
||||||
|
enum:
|
||||||
|
- 2
|
||||||
|
- 30
|
||||||
|
- 60
|
||||||
|
- 90
|
||||||
|
- 120
|
||||||
|
- 150
|
||||||
|
- 1000
|
||||||
|
- 2000
|
||||||
|
default: 90
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
i2c {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
codec: audio-controller@3b {
|
||||||
|
compatible = "ti,ts3a227e";
|
||||||
|
reg = <0x3b>;
|
||||||
|
interrupt-parent = <&gpio1>;
|
||||||
|
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
|
@ -1,30 +0,0 @@
|
||||||
Texas Instruments TS3A227E
|
|
||||||
Autonomous Audio Accessory Detection and Configuration Switch
|
|
||||||
|
|
||||||
The TS3A227E detect headsets of 3-ring and 4-ring standards and
|
|
||||||
switches automatically to route the microphone correctly. It also
|
|
||||||
handles key press detection in accordance with the Android audio
|
|
||||||
headset specification v1.0.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
|
|
||||||
- compatible: Should contain "ti,ts3a227e".
|
|
||||||
- reg: The i2c address. Should contain <0x3b>.
|
|
||||||
- interrupts: Interrupt number for /INT pin from the 227e
|
|
||||||
|
|
||||||
Optional properies:
|
|
||||||
- ti,micbias: Intended MICBIAS voltage (datasheet section 9.6.7).
|
|
||||||
Select 0/1/2/3/4/5/6/7 to specify MICBIAS voltage
|
|
||||||
2.1V/2.2V/2.3V/2.4V/2.5V/2.6V/2.7V/2.8V
|
|
||||||
Default value is "1" (2.2V).
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
i2c {
|
|
||||||
ts3a227e@3b {
|
|
||||||
compatible = "ti,ts3a227e";
|
|
||||||
reg = <0x3b>;
|
|
||||||
interrupt-parent = <&gpio>;
|
|
||||||
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -78,12 +78,20 @@ static const int ts3a227e_buttons[] = {
|
||||||
#define ADC_COMPLETE_INT_DISABLE 0x04
|
#define ADC_COMPLETE_INT_DISABLE 0x04
|
||||||
#define INTB_DISABLE 0x08
|
#define INTB_DISABLE 0x08
|
||||||
|
|
||||||
|
/* TS3A227E_REG_SETTING_1 0x4 */
|
||||||
|
#define DEBOUNCE_INSERTION_SETTING_SFT (0)
|
||||||
|
#define DEBOUNCE_INSERTION_SETTING_MASK (0x7 << DEBOUNCE_PRESS_SETTING_SFT)
|
||||||
|
|
||||||
/* TS3A227E_REG_SETTING_2 0x05 */
|
/* TS3A227E_REG_SETTING_2 0x05 */
|
||||||
#define KP_ENABLE 0x04
|
#define KP_ENABLE 0x04
|
||||||
|
|
||||||
/* TS3A227E_REG_SETTING_3 0x06 */
|
/* TS3A227E_REG_SETTING_3 0x06 */
|
||||||
#define MICBIAS_SETTING_SFT (3)
|
#define MICBIAS_SETTING_SFT 3
|
||||||
#define MICBIAS_SETTING_MASK (0x7 << MICBIAS_SETTING_SFT)
|
#define MICBIAS_SETTING_MASK (0x7 << MICBIAS_SETTING_SFT)
|
||||||
|
#define DEBOUNCE_RELEASE_SETTING_SFT 2
|
||||||
|
#define DEBOUNCE_RELEASE_SETTING_MASK (0x1 << DEBOUNCE_RELEASE_SETTING_SFT)
|
||||||
|
#define DEBOUNCE_PRESS_SETTING_SFT 0
|
||||||
|
#define DEBOUNCE_PRESS_SETTING_MASK (0x3 << DEBOUNCE_PRESS_SETTING_SFT)
|
||||||
|
|
||||||
/* TS3A227E_REG_ACCESSORY_STATUS 0x0b */
|
/* TS3A227E_REG_ACCESSORY_STATUS 0x0b */
|
||||||
#define TYPE_3_POLE 0x01
|
#define TYPE_3_POLE 0x01
|
||||||
|
@ -136,7 +144,7 @@ static bool ts3a227e_volatile_reg(struct device *dev, unsigned int reg)
|
||||||
{
|
{
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case TS3A227E_REG_INTERRUPT ... TS3A227E_REG_INTERRUPT_DISABLE:
|
case TS3A227E_REG_INTERRUPT ... TS3A227E_REG_INTERRUPT_DISABLE:
|
||||||
case TS3A227E_REG_SETTING_2:
|
case TS3A227E_REG_SETTING_1 ... TS3A227E_REG_SETTING_2:
|
||||||
case TS3A227E_REG_SWITCH_STATUS_1 ... TS3A227E_REG_ADC_OUTPUT:
|
case TS3A227E_REG_SWITCH_STATUS_1 ... TS3A227E_REG_ADC_OUTPUT:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
|
@ -269,14 +277,55 @@ static const struct regmap_config ts3a227e_regmap_config = {
|
||||||
static int ts3a227e_parse_device_property(struct ts3a227e *ts3a227e,
|
static int ts3a227e_parse_device_property(struct ts3a227e *ts3a227e,
|
||||||
struct device *dev)
|
struct device *dev)
|
||||||
{
|
{
|
||||||
u32 micbias;
|
u32 value;
|
||||||
|
u32 value_ms;
|
||||||
|
u32 setting3_value = 0;
|
||||||
|
u32 setting3_mask = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = device_property_read_u32(dev, "ti,micbias", &micbias);
|
err = device_property_read_u32(dev, "ti,micbias", &value);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
|
setting3_mask = MICBIAS_SETTING_MASK;
|
||||||
|
setting3_value = (value << MICBIAS_SETTING_SFT) &
|
||||||
|
MICBIAS_SETTING_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = device_property_read_u32(dev, "ti,debounce-release-ms",
|
||||||
|
&value_ms);
|
||||||
|
if (!err) {
|
||||||
|
value = (value_ms > 10);
|
||||||
|
setting3_mask |= DEBOUNCE_RELEASE_SETTING_MASK;
|
||||||
|
setting3_value |= (value << DEBOUNCE_RELEASE_SETTING_SFT) &
|
||||||
|
DEBOUNCE_RELEASE_SETTING_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = device_property_read_u32(dev, "ti,debounce-press-ms", &value_ms);
|
||||||
|
if (!err) {
|
||||||
|
value = (value_ms + 20) / 40;
|
||||||
|
if (value > 3)
|
||||||
|
value = 3;
|
||||||
|
setting3_mask |= DEBOUNCE_PRESS_SETTING_MASK;
|
||||||
|
setting3_value |= (value << DEBOUNCE_PRESS_SETTING_SFT) &
|
||||||
|
DEBOUNCE_PRESS_SETTING_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setting3_mask)
|
||||||
regmap_update_bits(ts3a227e->regmap, TS3A227E_REG_SETTING_3,
|
regmap_update_bits(ts3a227e->regmap, TS3A227E_REG_SETTING_3,
|
||||||
MICBIAS_SETTING_MASK,
|
setting3_mask, setting3_value);
|
||||||
(micbias & 0x07) << MICBIAS_SETTING_SFT);
|
|
||||||
|
err = device_property_read_u32(dev, "ti,debounce-insertion-ms",
|
||||||
|
&value_ms);
|
||||||
|
if (!err) {
|
||||||
|
if (value_ms < 165)
|
||||||
|
value = (value_ms + 15) / 30;
|
||||||
|
else if (value_ms < 1500)
|
||||||
|
value = 6;
|
||||||
|
else
|
||||||
|
value = 7;
|
||||||
|
regmap_update_bits(ts3a227e->regmap, TS3A227E_REG_SETTING_1,
|
||||||
|
DEBOUNCE_INSERTION_SETTING_MASK,
|
||||||
|
(value << DEBOUNCE_INSERTION_SETTING_SFT) &
|
||||||
|
DEBOUNCE_INSERTION_SETTING_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue