Samsung VZW MB1 update
/drivers/misc/fsa9485.c
blob:d23ca038dcdc236fa1886dc339d97ae84be46962 -> blob:7f488fa3f8a647ee399d1d46116ae76b529aac3c
--- drivers/misc/fsa9485.c
+++ drivers/misc/fsa9485.c
@@ -154,7 +154,10 @@ struct fsa9485_usbsw {
struct input_dev *input;
int previous_key;
+ int dock_ready;
+
struct delayed_work init_work;
+ struct delayed_work audio_work;
struct mutex mutex;
int adc;
int deskdock;
@@ -210,6 +213,38 @@ static void EnableFSA9480Interrupts(void
}
+#if defined(CONFIG_MACH_AEGIS2)
+void fsa9485_checkandhookaudiodockfornoise(int value)
+{
+ struct i2c_client *client = local_usbsw->client;
+ int ret = 0;
+
+ if (isDeskdockconnected) {
+ ret = i2c_smbus_write_byte_data(client,
+ FSA9485_REG_MANSW1, value);
+
+ if (ret < 0)
+ dev_err(&client->dev, "%s: err %d\n",
+ __func__, ret);
+
+ ret = i2c_smbus_read_byte_data(client,
+ FSA9485_REG_CTRL);
+
+ if (ret < 0)
+ dev_err(&client->dev, "%s: err %d\n",
+ __func__, ret);
+
+ ret = i2c_smbus_write_byte_data(client,
+ FSA9485_REG_CTRL,
+ ret & ~CON_MANUAL_SW & ~CON_RAW_DATA);
+ if (ret < 0)
+ dev_err(&client->dev,
+ "%s: err %d\n", __func__, ret);
+ } else
+ pr_info("Dock is not connect\n");
+}
+#endif
+
void FSA9485_CheckAndHookAudioDock(int value)
{
struct i2c_client *client = local_usbsw->client;
@@ -633,12 +668,14 @@ static int fsa9485_detect_dev(struct fsa
if (usbsw->dock_attached)
pdata->dock_cb(FSA9485_DETACHED_DOCK);
- if (adc == 0x10)
- val2 = DEV_SMARTDOCK;
- else if (adc == 0x12)
- val2 = DEV_AUDIO_DOCK;
+ if (local_usbsw->dock_ready == 1)
+ if (adc == 0x10)
+ val2 = DEV_SMARTDOCK;
+ else if (adc == 0x12)
+ val2 = DEV_AUDIO_DOCK;
- dev_info(&client->dev, "dev1: 0x%x, dev2: 0x%x adc : 0x%x\n", val1, val2, adc);
+ dev_info(&client->dev, "dev1: 0x%x, dev2: 0x%x adc : 0x%x\n",
+ val1, val2, adc);
/* Attached */
if (val1 || val2) {
@@ -819,7 +856,7 @@ static int fsa9485_detect_dev(struct fsa
dev_err(&client->dev,
"%s: err %d\n", __func__, ret);
- if (pdata->smartdock_cb)
+ if (pdata->audio_dock_cb)
pdata->audio_dock_cb(FSA9485_ATTACHED);
}
/* Detached */
@@ -928,7 +965,7 @@ static int fsa9485_detect_dev(struct fsa
dev_err(&client->dev,
"%s: err %d\n", __func__, ret);
- if (pdata->smartdock_cb)
+ if (pdata->audio_dock_cb)
pdata->audio_dock_cb(FSA9485_DETACHED);
usbsw->adc = 0;
}
@@ -1122,7 +1159,6 @@ static irqreturn_t fsa9485_irq_thread(in
}
return IRQ_HANDLED;
}
-
return IRQ_HANDLED;
}
@@ -1167,6 +1203,20 @@ static void fsa9485_init_detect(struct w
"failed to enable irq init %s\n", __func__);
}
+static void fsa9485_delayed_audio(struct work_struct *work)
+{
+ struct fsa9485_usbsw *usbsw = container_of(work,
+ struct fsa9485_usbsw, audio_work.work);
+
+ dev_info(&usbsw->client->dev, "%s\n", __func__);
+
+ local_usbsw->dock_ready = 1;
+
+ mutex_lock(&usbsw->mutex);
+ fsa9485_detect_dev(usbsw);
+ mutex_unlock(&usbsw->mutex);
+}
+
static int __devinit fsa9485_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1278,10 +1328,13 @@ static int __devinit fsa9485_probe(struc
if (usbsw->pdata->set_init_flag)
usbsw->pdata->set_init_flag();
+
+ local_usbsw->dock_ready = 0;
/* initial cable detection */
INIT_DELAYED_WORK(&usbsw->init_work, fsa9485_init_detect);
schedule_delayed_work(&usbsw->init_work, msecs_to_jiffies(2700));
-
+ INIT_DELAYED_WORK(&usbsw->audio_work, fsa9485_delayed_audio);
+ schedule_delayed_work(&usbsw->audio_work, msecs_to_jiffies(20000));
return 0;
err_create_file_reset_switch:
@@ -1306,6 +1359,7 @@ static int __devexit fsa9485_remove(stru
struct fsa9485_usbsw *usbsw = i2c_get_clientdata(client);
cancel_delayed_work(&usbsw->init_work);
+ cancel_delayed_work(&usbsw->audio_work);
if (client->irq) {
disable_irq_wake(client->irq);
free_irq(client->irq, usbsw);