blob: e442f4f8facc68450555bcbd30b76202ffbd8234 [file] [log] [blame]
/*
* extcon-madera.h - public extcon driver API for Cirrus Logic Madera codecs
*
* Copyright 2015-2017 Cirrus Logic
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef EXTCON_MADERA_H
#define EXTCON_MADERA_H
#include <linux/mfd/madera/registers.h>
/* Conversion between ohms and hundredths of an ohm. */
static inline unsigned int madera_hohm_to_ohm(unsigned int hohms)
{
if (hohms == INT_MAX)
return hohms;
else
return (hohms + 50) / 100;
}
static inline unsigned int madera_ohm_to_hohm(unsigned int ohms)
{
if (ohms >= (INT_MAX / 100))
return INT_MAX;
else
return ohms * 100;
}
#define MADERA_MICD_LVL_1_TO_7 \
(MADERA_MICD_LVL_1 | MADERA_MICD_LVL_2 | \
MADERA_MICD_LVL_3 | MADERA_MICD_LVL_4 | \
MADERA_MICD_LVL_5 | MADERA_MICD_LVL_6 | \
MADERA_MICD_LVL_7)
#define MADERA_MICD_LVL_0_TO_7 (MADERA_MICD_LVL_0 | MADERA_MICD_LVL_1_TO_7)
#define MADERA_MICD_LVL_0_TO_8 (MADERA_MICD_LVL_0_TO_7 | MADERA_MICD_LVL_8)
/* Notify data structure for MADERA_NOTIFY_HPDET */
struct madera_hpdet_notify_data {
unsigned int impedance_x100; /* ohms * 100 */
};
/* Notify data structure for MADERA_NOTIFY_MICDET */
struct madera_micdet_notify_data {
unsigned int impedance_x100; /* ohms * 100 */
bool present;
int out_num; /* 1 = OUT1, 2 = OUT2 */
};
struct madera_micd_bias {
unsigned int bias;
bool enabled;
};
struct madera_hpdet_trims {
int off_x4;
int grad_x4;
};
struct madera_extcon {
struct device *dev;
struct madera *madera;
const struct madera_accdet_pdata *pdata;
struct mutex lock;
struct regulator *micvdd;
struct input_dev *input;
struct extcon_dev *edev;
struct gpio_desc *micd_pol_gpio;
u16 last_jackdet;
int hp_tuning_level;
const struct madera_hpdet_calibration_data *hpdet_ranges;
int num_hpdet_ranges;
unsigned int hpdet_init_range;
const struct madera_hpdet_trims *hpdet_trims;
unsigned int hpdet_short_x100;
int micd_mode;
const struct madera_micd_config *micd_modes;
int num_micd_modes;
const struct madera_micd_range *micd_ranges;
int num_micd_ranges;
int micd_res_old;
int micd_debounce;
int micd_count;
int moisture_count;
int mic_impedance;
struct completion manual_mic_completion;
struct delayed_work micd_detect_work;
bool have_mic;
bool detecting;
bool wait_for_buttons;
int jack_flips;
const struct madera_jd_state *state;
const struct madera_jd_state *old_state;
struct delayed_work state_timeout_work;
struct wakeup_source detection_wake_lock;
struct madera_micd_bias micd_bias;
};
enum madera_accdet_mode {
MADERA_ACCDET_MODE_MIC,
MADERA_ACCDET_MODE_HPL,
MADERA_ACCDET_MODE_HPR,
MADERA_ACCDET_MODE_HPM,
MADERA_ACCDET_MODE_ADC,
MADERA_ACCDET_MODE_INVALID,
};
struct madera_jd_state {
enum madera_accdet_mode mode;
int (*start)(struct madera_extcon *);
void (*restart)(struct madera_extcon *);
int (*reading)(struct madera_extcon *, int);
void (*stop)(struct madera_extcon *);
int (*timeout_ms)(struct madera_extcon *);
void (*timeout)(struct madera_extcon *);
};
int madera_jds_set_state(struct madera_extcon *info,
const struct madera_jd_state *new_state);
void madera_set_headphone_imp(struct madera_extcon *info, int ohms_x100);
extern const struct madera_jd_state madera_hpdet_left;
extern const struct madera_jd_state madera_hpdet_right;
extern const struct madera_jd_state madera_hpdet_moisture;
extern const struct madera_jd_state madera_micd_button;
extern const struct madera_jd_state madera_micd_microphone;
extern const struct madera_jd_state madera_micd_adc_mic;
int madera_hpdet_start(struct madera_extcon *info);
void madera_hpdet_restart(struct madera_extcon *info);
void madera_hpdet_stop(struct madera_extcon *info);
int madera_hpdet_reading(struct madera_extcon *info, int val);
int madera_micd_start(struct madera_extcon *info);
int madera_micd_button_start(struct madera_extcon *info);
void madera_micd_stop(struct madera_extcon *info);
int madera_micd_button_reading(struct madera_extcon *info, int val);
int madera_micd_mic_start(struct madera_extcon *info);
void madera_micd_mic_stop(struct madera_extcon *info);
int madera_micd_mic_reading(struct madera_extcon *info, int val);
int madera_micd_mic_timeout_ms(struct madera_extcon *info);
void madera_micd_mic_timeout(struct madera_extcon *info);
void madera_extcon_report(struct madera_extcon *info, int which, bool attached);
int madera_extcon_manual_mic_reading(struct madera_extcon *info);
#endif