diff options
Diffstat (limited to 'drivers/misc/sec_jack.c')
-rw-r--r-- | drivers/misc/sec_jack.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/drivers/misc/sec_jack.c b/drivers/misc/sec_jack.c index d2d4524..df77d33 100644 --- a/drivers/misc/sec_jack.c +++ b/drivers/misc/sec_jack.c @@ -55,16 +55,20 @@ #define WAKE_LOCK_TIME (HZ * 5) /* 5 sec */ #define EAR_CHECK_LOOP_CNT 10 -#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) +#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) \ + || defined(CONFIG_MACH_GC1) #define JACK_CLASS_NAME "audio" #define JACK_DEV_NAME "earjack" #else #define JACK_CLASS_NAME "jack" #define JACK_DEV_NAME "jack_selector" #endif +#define JACK_RESELECTOR_NAME "jack_reselector" static struct class *jack_class; static struct device *jack_dev; +static struct device *jack_reselector; +static bool recheck_jack; struct sec_jack_info { struct s3c_adc_client *padc; @@ -338,8 +342,16 @@ static void determine_jack_type(struct sec_jack_info *hi) for (i = 0; i < size; i++) { if (adc <= zones[i].adc_high) { if (++count[i] > zones[i].check_count) { + if (recheck_jack == true && i == 4) { + pr_info("%s : something wrong connection!\n", + __func__); + handle_jack_not_inserted(hi); + + recheck_jack = false; + return; + } sec_jack_set_type(hi, - zones[i].jack_type); + zones[i].jack_type); return; } msleep(zones[i].delay_ms); @@ -348,6 +360,7 @@ static void determine_jack_type(struct sec_jack_info *hi) } } + recheck_jack = false; /* jack removed before detection complete */ pr_debug("%s : jack removed before detection complete\n", __func__); handle_jack_not_inserted(hi); @@ -474,7 +487,8 @@ static ssize_t select_jack_store(struct device *dev, return size; } -#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) +#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) \ + || defined(CONFIG_MACH_GC1) static ssize_t earjack_key_state_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -528,6 +542,36 @@ static DEVICE_ATTR(state, S_IRUGO | S_IWUSR | S_IWGRP, static DEVICE_ATTR(select_jack, S_IRUGO | S_IWUSR | S_IWGRP, select_jack_show, select_jack_store); +static ssize_t reselect_jack_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + pr_info("%s : operate nothing\n", __func__); + + return 0; +} + +static ssize_t reselect_jack_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct sec_jack_info *hi = dev_get_drvdata(dev); + struct sec_jack_platform_data *pdata = hi->pdata; + int value = 0; + + + sscanf(buf, "%d", &value); + pr_err("%s: User reselection : 0X%x", __func__, value); + + if (value == 1) { + recheck_jack = true; + determine_jack_type(hi); + } + + return size; +} + +static DEVICE_ATTR(reselect_jack, S_IRUGO | S_IWUSR | S_IWGRP, + reselect_jack_show, reselect_jack_store); + static int sec_jack_probe(struct platform_device *pdev) { struct sec_jack_info *hi; @@ -618,7 +662,19 @@ static int sec_jack_probe(struct platform_device *pdev) if (device_create_file(jack_dev, &dev_attr_select_jack) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_select_jack.attr.name); -#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) + + jack_reselector = device_create(jack_class, NULL, 0, hi, + JACK_RESELECTOR_NAME); + if (IS_ERR(jack_reselector)) + pr_err("Failed to create device(sec_jack)!= %ld\n", + IS_ERR(jack_reselector)); + + if (device_create_file(jack_reselector, &dev_attr_reselect_jack) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_reselect_jack.attr.name); + +#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_P4NOTE) \ + || defined(CONFIG_MACH_GC1) if (device_create_file(jack_dev, &dev_attr_key_state) < 0) pr_err("Failed to create device file (%s)!\n", dev_attr_key_state.attr.name); |