Commit 61ec7e77 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'extcon-3.9-rc3' of...

Merge tag 'extcon-3.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon into char-misc-linus

Chanwoo writes:

	extcon fixes for 3.9-rc3

	This is small fixes against 3.9-rc2.

	Fix to max77693 extcon driver:
	- Set default value of MUIC register to bring up it.
	  Fix to max8997 extcon driver:
	- Fix null pointer error duing probe when platform data
	  isn't used.
parents 68f8ea18 0ec83bd2
...@@ -32,6 +32,38 @@ ...@@ -32,6 +32,38 @@
#define DEV_NAME "max77693-muic" #define DEV_NAME "max77693-muic"
#define DELAY_MS_DEFAULT 20000 /* unit: millisecond */ #define DELAY_MS_DEFAULT 20000 /* unit: millisecond */
/*
* Default value of MAX77693 register to bring up MUIC device.
* If user don't set some initial value for MUIC device through platform data,
* extcon-max77693 driver use 'default_init_data' to bring up base operation
* of MAX77693 MUIC device.
*/
struct max77693_reg_data default_init_data[] = {
{
/* STATUS2 - [3]ChgDetRun */
.addr = MAX77693_MUIC_REG_STATUS2,
.data = STATUS2_CHGDETRUN_MASK,
}, {
/* INTMASK1 - Unmask [3]ADC1KM,[0]ADCM */
.addr = MAX77693_MUIC_REG_INTMASK1,
.data = INTMASK1_ADC1K_MASK
| INTMASK1_ADC_MASK,
}, {
/* INTMASK2 - Unmask [0]ChgTypM */
.addr = MAX77693_MUIC_REG_INTMASK2,
.data = INTMASK2_CHGTYP_MASK,
}, {
/* INTMASK3 - Mask all of interrupts */
.addr = MAX77693_MUIC_REG_INTMASK3,
.data = 0x0,
}, {
/* CDETCTRL2 */
.addr = MAX77693_MUIC_REG_CDETCTRL2,
.data = CDETCTRL2_VIDRMEN_MASK
| CDETCTRL2_DXOVPEN_MASK,
},
};
enum max77693_muic_adc_debounce_time { enum max77693_muic_adc_debounce_time {
ADC_DEBOUNCE_TIME_5MS = 0, ADC_DEBOUNCE_TIME_5MS = 0,
ADC_DEBOUNCE_TIME_10MS, ADC_DEBOUNCE_TIME_10MS,
...@@ -1045,8 +1077,9 @@ static int max77693_muic_probe(struct platform_device *pdev) ...@@ -1045,8 +1077,9 @@ static int max77693_muic_probe(struct platform_device *pdev)
{ {
struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev); struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
struct max77693_muic_info *info; struct max77693_muic_info *info;
struct max77693_reg_data *init_data;
int num_init_data;
int delay_jiffies; int delay_jiffies;
int ret; int ret;
int i; int i;
...@@ -1145,15 +1178,25 @@ static int max77693_muic_probe(struct platform_device *pdev) ...@@ -1145,15 +1178,25 @@ static int max77693_muic_probe(struct platform_device *pdev)
goto err_irq; goto err_irq;
} }
/* Initialize MUIC register by using platform data */
for (i = 0 ; i < muic_pdata->num_init_data ; i++) { /* Initialize MUIC register by using platform data or default data */
enum max77693_irq_source irq_src = MAX77693_IRQ_GROUP_NR; if (pdata->muic_data) {
init_data = pdata->muic_data->init_data;
num_init_data = pdata->muic_data->num_init_data;
} else {
init_data = default_init_data;
num_init_data = ARRAY_SIZE(default_init_data);
}
for (i = 0 ; i < num_init_data ; i++) {
enum max77693_irq_source irq_src
= MAX77693_IRQ_GROUP_NR;
max77693_write_reg(info->max77693->regmap_muic, max77693_write_reg(info->max77693->regmap_muic,
muic_pdata->init_data[i].addr, init_data[i].addr,
muic_pdata->init_data[i].data); init_data[i].data);
switch (muic_pdata->init_data[i].addr) { switch (init_data[i].addr) {
case MAX77693_MUIC_REG_INTMASK1: case MAX77693_MUIC_REG_INTMASK1:
irq_src = MUIC_INT1; irq_src = MUIC_INT1;
break; break;
...@@ -1167,9 +1210,12 @@ static int max77693_muic_probe(struct platform_device *pdev) ...@@ -1167,9 +1210,12 @@ static int max77693_muic_probe(struct platform_device *pdev)
if (irq_src < MAX77693_IRQ_GROUP_NR) if (irq_src < MAX77693_IRQ_GROUP_NR)
info->max77693->irq_masks_cur[irq_src] info->max77693->irq_masks_cur[irq_src]
= muic_pdata->init_data[i].data; = init_data[i].data;
} }
if (pdata->muic_data) {
struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
/* /*
* Default usb/uart path whether UART/USB or AUX_UART/AUX_USB * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
* h/w path of COMP2/COMN1 on CONTROL1 register. * h/w path of COMP2/COMN1 on CONTROL1 register.
...@@ -1184,6 +1230,21 @@ static int max77693_muic_probe(struct platform_device *pdev) ...@@ -1184,6 +1230,21 @@ static int max77693_muic_probe(struct platform_device *pdev)
else else
info->path_usb = CONTROL1_SW_USB; info->path_usb = CONTROL1_SW_USB;
/*
* Default delay time for detecting cable state
* after certain time.
*/
if (muic_pdata->detcable_delay_ms)
delay_jiffies =
msecs_to_jiffies(muic_pdata->detcable_delay_ms);
else
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
} else {
info->path_usb = CONTROL1_SW_USB;
info->path_uart = CONTROL1_SW_UART;
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
}
/* Set initial path for UART */ /* Set initial path for UART */
max77693_muic_set_path(info, info->path_uart, true); max77693_muic_set_path(info, info->path_uart, true);
...@@ -1208,10 +1269,6 @@ static int max77693_muic_probe(struct platform_device *pdev) ...@@ -1208,10 +1269,6 @@ static int max77693_muic_probe(struct platform_device *pdev)
* driver should notify cable state to upper layer. * driver should notify cable state to upper layer.
*/ */
INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq); INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq);
if (muic_pdata->detcable_delay_ms)
delay_jiffies = msecs_to_jiffies(muic_pdata->detcable_delay_ms);
else
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
schedule_delayed_work(&info->wq_detcable, delay_jiffies); schedule_delayed_work(&info->wq_detcable, delay_jiffies);
return ret; return ret;
......
...@@ -712,30 +712,46 @@ static int max8997_muic_probe(struct platform_device *pdev) ...@@ -712,30 +712,46 @@ static int max8997_muic_probe(struct platform_device *pdev)
goto err_irq; goto err_irq;
} }
/* Initialize registers according to platform data */
if (pdata->muic_pdata) { if (pdata->muic_pdata) {
struct max8997_muic_platform_data *mdata = info->muic_pdata; struct max8997_muic_platform_data *muic_pdata
= pdata->muic_pdata;
for (i = 0; i < mdata->num_init_data; i++) { /* Initialize registers according to platform data */
max8997_write_reg(info->muic, mdata->init_data[i].addr, for (i = 0; i < muic_pdata->num_init_data; i++) {
mdata->init_data[i].data); max8997_write_reg(info->muic,
} muic_pdata->init_data[i].addr,
muic_pdata->init_data[i].data);
} }
/* /*
* Default usb/uart path whether UART/USB or AUX_UART/AUX_USB * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
* h/w path of COMP2/COMN1 on CONTROL1 register. * h/w path of COMP2/COMN1 on CONTROL1 register.
*/ */
if (pdata->muic_pdata->path_uart) if (muic_pdata->path_uart)
info->path_uart = pdata->muic_pdata->path_uart; info->path_uart = muic_pdata->path_uart;
else else
info->path_uart = CONTROL1_SW_UART; info->path_uart = CONTROL1_SW_UART;
if (pdata->muic_pdata->path_usb) if (muic_pdata->path_usb)
info->path_usb = pdata->muic_pdata->path_usb; info->path_usb = muic_pdata->path_usb;
else else
info->path_usb = CONTROL1_SW_USB; info->path_usb = CONTROL1_SW_USB;
/*
* Default delay time for detecting cable state
* after certain time.
*/
if (muic_pdata->detcable_delay_ms)
delay_jiffies =
msecs_to_jiffies(muic_pdata->detcable_delay_ms);
else
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
} else {
info->path_uart = CONTROL1_SW_UART;
info->path_usb = CONTROL1_SW_USB;
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
}
/* Set initial path for UART */ /* Set initial path for UART */
max8997_muic_set_path(info, info->path_uart, true); max8997_muic_set_path(info, info->path_uart, true);
...@@ -751,10 +767,6 @@ static int max8997_muic_probe(struct platform_device *pdev) ...@@ -751,10 +767,6 @@ static int max8997_muic_probe(struct platform_device *pdev)
* driver should notify cable state to upper layer. * driver should notify cable state to upper layer.
*/ */
INIT_DELAYED_WORK(&info->wq_detcable, max8997_muic_detect_cable_wq); INIT_DELAYED_WORK(&info->wq_detcable, max8997_muic_detect_cable_wq);
if (pdata->muic_pdata->detcable_delay_ms)
delay_jiffies = msecs_to_jiffies(pdata->muic_pdata->detcable_delay_ms);
else
delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
schedule_delayed_work(&info->wq_detcable, delay_jiffies); schedule_delayed_work(&info->wq_detcable, delay_jiffies);
return 0; return 0;
......
...@@ -106,6 +106,29 @@ enum max77693_muic_reg { ...@@ -106,6 +106,29 @@ enum max77693_muic_reg {
MAX77693_MUIC_REG_END, MAX77693_MUIC_REG_END,
}; };
/* MAX77693 INTMASK1~2 Register */
#define INTMASK1_ADC1K_SHIFT 3
#define INTMASK1_ADCERR_SHIFT 2
#define INTMASK1_ADCLOW_SHIFT 1
#define INTMASK1_ADC_SHIFT 0
#define INTMASK1_ADC1K_MASK (1 << INTMASK1_ADC1K_SHIFT)
#define INTMASK1_ADCERR_MASK (1 << INTMASK1_ADCERR_SHIFT)
#define INTMASK1_ADCLOW_MASK (1 << INTMASK1_ADCLOW_SHIFT)
#define INTMASK1_ADC_MASK (1 << INTMASK1_ADC_SHIFT)
#define INTMASK2_VIDRM_SHIFT 5
#define INTMASK2_VBVOLT_SHIFT 4
#define INTMASK2_DXOVP_SHIFT 3
#define INTMASK2_DCDTMR_SHIFT 2
#define INTMASK2_CHGDETRUN_SHIFT 1
#define INTMASK2_CHGTYP_SHIFT 0
#define INTMASK2_VIDRM_MASK (1 << INTMASK2_VIDRM_SHIFT)
#define INTMASK2_VBVOLT_MASK (1 << INTMASK2_VBVOLT_SHIFT)
#define INTMASK2_DXOVP_MASK (1 << INTMASK2_DXOVP_SHIFT)
#define INTMASK2_DCDTMR_MASK (1 << INTMASK2_DCDTMR_SHIFT)
#define INTMASK2_CHGDETRUN_MASK (1 << INTMASK2_CHGDETRUN_SHIFT)
#define INTMASK2_CHGTYP_MASK (1 << INTMASK2_CHGTYP_SHIFT)
/* MAX77693 MUIC - STATUS1~3 Register */ /* MAX77693 MUIC - STATUS1~3 Register */
#define STATUS1_ADC_SHIFT (0) #define STATUS1_ADC_SHIFT (0)
#define STATUS1_ADCLOW_SHIFT (5) #define STATUS1_ADCLOW_SHIFT (5)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment