extcon: arizona: Update cable reporting calls and split headset

Use extcon_set_state_ for performance and split the headset into separate
headphone and microphone reports as this is more idiomatic.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Mark Brown 2012-06-28 13:08:30 +01:00 committed by Greg Kroah-Hartman
parent eed5d21507
commit 325c642380

View File

@ -54,22 +54,17 @@ static const struct arizona_micd_config micd_default_modes[] = {
{ 0, 2 << ARIZONA_MICD_BIAS_SRC_SHIFT, 1 },
};
#define ARIZONA_CABLE_MECHANICAL "Mechanical"
#define ARIZONA_CABLE_HEADPHONE "Headphone"
#define ARIZONA_CABLE_HEADSET "Headset"
#define ARIZONA_CABLE_MECHANICAL 0
#define ARIZONA_CABLE_MICROPHONE 1
#define ARIZONA_CABLE_HEADPHONE 2
static const char *arizona_cable[] = {
ARIZONA_CABLE_MECHANICAL,
ARIZONA_CABLE_HEADSET,
ARIZONA_CABLE_HEADPHONE,
"Mechanical",
"Microphone",
"Headphone",
NULL,
};
static const u32 arizona_exclusions[] = {
0x6, /* Headphone and headset */
0,
};
static void arizona_extcon_set_mode(struct arizona_extcon_info *info, int mode)
{
struct arizona *arizona = info->arizona;
@ -174,8 +169,11 @@ static irqreturn_t arizona_micdet(int irq, void *data)
/* If we got a high impedence we should have a headset, report it. */
if (info->detecting && (val & 0x400)) {
ret = extcon_set_cable_state(&info->edev,
ARIZONA_CABLE_HEADSET, true);
ret = extcon_update_state(&info->edev,
1 << ARIZONA_CABLE_MICROPHONE |
1 << ARIZONA_CABLE_HEADPHONE,
1 << ARIZONA_CABLE_MICROPHONE |
1 << ARIZONA_CABLE_HEADPHONE);
if (ret != 0)
dev_err(arizona->dev, "Headset report failed: %d\n",
@ -198,9 +196,9 @@ static irqreturn_t arizona_micdet(int irq, void *data)
if (info->jack_flips >= info->micd_num_modes) {
dev_dbg(arizona->dev, "Detected headphone\n");
info->detecting = false;
ret = extcon_set_cable_state(&info->edev,
ARIZONA_CABLE_HEADPHONE,
true);
ret = extcon_set_cable_state_(&info->edev,
ARIZONA_CABLE_HEADPHONE,
true);
if (ret != 0)
dev_err(arizona->dev,
"Headphone report failed: %d\n",
@ -231,9 +229,9 @@ static irqreturn_t arizona_micdet(int irq, void *data)
info->detecting = false;
arizona_stop_mic(info);
ret = extcon_set_cable_state(&info->edev,
ARIZONA_CABLE_HEADPHONE,
true);
ret = extcon_set_cable_state_(&info->edev,
ARIZONA_CABLE_HEADPHONE,
true);
if (ret != 0)
dev_err(arizona->dev,
"Headphone report failed: %d\n",
@ -275,8 +273,8 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
if (val & ARIZONA_JD1_STS) {
dev_dbg(arizona->dev, "Detected jack\n");
ret = extcon_set_cable_state(&info->edev,
ARIZONA_CABLE_MECHANICAL, true);
ret = extcon_set_cable_state_(&info->edev,
ARIZONA_CABLE_MECHANICAL, true);
if (ret != 0)
dev_err(arizona->dev, "Mechanical report failed: %d\n",
@ -347,7 +345,6 @@ static int __devinit arizona_extcon_probe(struct platform_device *pdev)
info->edev.name = "Headset Jack";
info->edev.supported_cable = arizona_cable;
info->edev.mutually_exclusive = arizona_exclusions;
ret = extcon_dev_register(&info->edev, arizona->dev);
if (ret < 0) {