aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/sec_jack.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/sec_jack.c')
-rw-r--r--drivers/misc/sec_jack.c64
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);