CPCAP_BIT_VBUSVLD_S | \
CPCAP_BIT_SESSVLD_S)
-#define SENSE_WHISPER_PPD (CPCAP_BIT_SE1_S)
+#define SENSE_WHISPER_PPD (0)
/* TODO: Update with appropriate value. */
#define ADC_AUDIO_THRES 0x12C
SAMPLE_1,
SAMPLE_2,
IDENTIFY,
+ IDENTIFY_WHISPER,
WHISPER,
};
NO_DOCK,
DESK_DOCK,
CAR_DOCK,
+ MOBILE_DOCK,
+ HD_DOCK,
};
struct cpcap_whisper_data {
return sprintf(buf, "DESK\n");
case CAR_DOCK:
return sprintf(buf, "CAR\n");
+ case MOBILE_DOCK:
+ return sprintf(buf, "MOBILE\n");
+ case HD_DOCK:
+ return sprintf(buf, "HD\n");
}
return -EINVAL;
case CPCAP_ACCY_USB:
retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC1, 0,
CPCAP_BIT_VBUSPD);
- gpio_set_value(data->pdata->gpio, 1);
+ gpio_set_value(data->pdata->data_gpio, 1);
/* TODO: Does this driver enable "reverse mode" for hosts? */
break;
CPCAP_BIT_EMUMODE2 |
CPCAP_BIT_EMUMODE1 |
CPCAP_BIT_EMUMODE0));
- /* TODO: Need to turn on "reverse mode" for PPD's */
break;
case CPCAP_ACCY_UNKNOWN:
- gpio_set_value(data->pdata->gpio, 0);
+ gpio_set_value(data->pdata->pwr_gpio, 0);
+ gpio_set_value(data->pdata->data_gpio, 0);
retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC1, 0,
(CPCAP_BIT_VBUSPD |
CPCAP_BIT_ID100KPU));
(CPCAP_BIT_EMUMODE2 |
CPCAP_BIT_EMUMODE1 |
CPCAP_BIT_EMUMODE0));
- /* TODO: Need to turn off "reverse mode" */
break;
case CPCAP_ACCY_NONE:
default:
+ gpio_set_value(data->pdata->pwr_gpio, 0);
retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC1,
CPCAP_BIT_VBUSPD,
CPCAP_BIT_VBUSPD);
cpcap_irq_unmask(data->cpcap, CPCAP_IRQ_IDFLOAT);
} else if (data->sense == SENSE_WHISPER_PPD) {
+ gpio_set_value(data->pdata->pwr_gpio, 1);
+
+ /* Extra identification step for Whisper. */
+ data->state = IDENTIFY_WHISPER;
+ schedule_delayed_work(&data->work,
+ msecs_to_jiffies(47));
+ } else {
+ whisper_notify(data, CPCAP_ACCY_NONE);
+
+ cpcap_irq_unmask(data->cpcap, CPCAP_IRQ_CHRG_DET);
+ cpcap_irq_unmask(data->cpcap, CPCAP_IRQ_IDFLOAT);
+ }
+ break;
+
+ case IDENTIFY_WHISPER:
+ get_sense(data);
+ data->state = CONFIG;
+
+ if (whisper_debug)
+ pr_info("%s: sense=0x%04x\n", __func__, data->sense);
+
+ if (data->sense & CPCAP_BIT_SE1_S) {
whisper_notify(data, CPCAP_ACCY_WHISPER);
whisper_audio_check(data);
struct cpcap_whisper_data *di = cpcap->accydata;
int retval = -EAGAIN;
unsigned short value;
+ int dock;
if (!di)
return -ENODEV;
retval = cpcap_regacc_write(cpcap, CPCAP_REG_USBC1,
value, CPCAP_BIT_ID100KPU);
- /* TODO: Report dock type to system. */
+ /* Report dock type to system. */
+ dock = (cmd & CPCAP_WHISPER_ACCY_MASK) >>
+ CPCAP_WHISPER_ACCY_SHFT;
+ switch_set_state(&di->dsdev, dock);
+
+ /* TODO: Report audio cable to system. */
}
return retval;
switch_dev_unregister(&data->wsdev);
switch_dev_unregister(&data->dsdev);
- gpio_set_value(data->pdata->gpio, 1);
+ gpio_set_value(data->pdata->data_gpio, 1);
vusb_disable(data);
regulator_put(data->regulator);