Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33692e3c authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I
Browse files

Merge branch 'ib-extcon-phy-4.9' of...

Merge branch 'ib-extcon-phy-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon into next
parents 3fa29566 8df0cfe6
Loading
Loading
Loading
Loading
+15 −12
Original line number Original line Diff line number Diff line
@@ -3,6 +3,9 @@
 *
 *
 * Analog Jack extcon driver with ADC-based detection capability.
 * Analog Jack extcon driver with ADC-based detection capability.
 *
 *
 * Copyright (C) 2016 Samsung Electronics
 * Chanwoo Choi <cw00.choi@samsung.com>
 *
 * Copyright (C) 2012 Samsung Electronics
 * Copyright (C) 2012 Samsung Electronics
 * MyungJoo Ham <myungjoo.ham@samsung.com>
 * MyungJoo Ham <myungjoo.ham@samsung.com>
 *
 *
@@ -58,7 +61,7 @@ static void adc_jack_handler(struct work_struct *work)
	struct adc_jack_data *data = container_of(to_delayed_work(work),
	struct adc_jack_data *data = container_of(to_delayed_work(work),
			struct adc_jack_data,
			struct adc_jack_data,
			handler);
			handler);
	u32 state = 0;
	struct adc_jack_cond *def;
	int ret, adc_val;
	int ret, adc_val;
	int i;
	int i;


@@ -70,17 +73,18 @@ static void adc_jack_handler(struct work_struct *work)


	/* Get state from adc value with adc_conditions */
	/* Get state from adc value with adc_conditions */
	for (i = 0; i < data->num_conditions; i++) {
	for (i = 0; i < data->num_conditions; i++) {
		struct adc_jack_cond *def = &data->adc_conditions[i];
		def = &data->adc_conditions[i];
		if (!def->state)
			break;
		if (def->min_adc <= adc_val && def->max_adc >= adc_val) {
		if (def->min_adc <= adc_val && def->max_adc >= adc_val) {
			state = def->state;
			extcon_set_cable_state_(data->edev, def->id, true);
			break;
			return;
		}
		}
	}
	}
	/* if no def has met, it means state = 0 (no cables attached) */


	extcon_set_state(data->edev, state);
	/* Set the detached state if adc value is not included in the range */
	for (i = 0; i < data->num_conditions; i++) {
		def = &data->adc_conditions[i];
		extcon_set_cable_state_(data->edev, def->id, false);
	}
}
}


static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
@@ -114,16 +118,14 @@ static int adc_jack_probe(struct platform_device *pdev)
		return -ENOMEM;
		return -ENOMEM;
	}
	}


	if (!pdata->adc_conditions ||
	if (!pdata->adc_conditions) {
			!pdata->adc_conditions[0].state) {
		dev_err(&pdev->dev, "error: adc_conditions not defined.\n");
		dev_err(&pdev->dev, "error: adc_conditions not defined.\n");
		return -EINVAL;
		return -EINVAL;
	}
	}
	data->adc_conditions = pdata->adc_conditions;
	data->adc_conditions = pdata->adc_conditions;


	/* Check the length of array and set num_conditions */
	/* Check the length of array and set num_conditions */
	for (i = 0; data->adc_conditions[i].state; i++)
	for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
		;
	data->num_conditions = i;
	data->num_conditions = i;


	data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel);
	data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel);
@@ -158,6 +160,7 @@ static int adc_jack_probe(struct platform_device *pdev)
	if (data->wakeup_source)
	if (data->wakeup_source)
		device_init_wakeup(&pdev->dev, 1);
		device_init_wakeup(&pdev->dev, 1);


	adc_jack_handler(&data->handler.work);
	return 0;
	return 0;
}
}


+8 −5
Original line number Original line Diff line number Diff line
@@ -183,7 +183,7 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
		if (clamp)
		if (clamp)
			val = ARIZONA_RMV_SHRT_HP1L;
			val = ARIZONA_RMV_SHRT_HP1L;
		break;
		break;
	};
	}


	snd_soc_dapm_mutex_lock(arizona->dapm);
	snd_soc_dapm_mutex_lock(arizona->dapm);


@@ -1149,10 +1149,13 @@ static irqreturn_t arizona_jackdet(int irq, void *data)
					 info->micd_ranges[i].key, 0);
					 info->micd_ranges[i].key, 0);
		input_sync(info->input);
		input_sync(info->input);


		ret = extcon_update_state(info->edev, 0xffffffff, 0);
		for (i = 0; i < ARRAY_SIZE(arizona_cable) - 1; i++) {
			ret = extcon_set_cable_state_(info->edev,
					arizona_cable[i], false);
			if (ret != 0)
			if (ret != 0)
			dev_err(arizona->dev, "Removal report failed: %d\n",
				dev_err(arizona->dev,
				ret);
					"Removal report failed: %d\n", ret);
		}


		regmap_update_bits(arizona->regmap,
		regmap_update_bits(arizona->regmap,
				   ARIZONA_JACK_DETECT_DEBOUNCE,
				   ARIZONA_JACK_DETECT_DEBOUNCE,
+1 −1
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@ static void gpio_extcon_work(struct work_struct *work)
	state = gpiod_get_value_cansleep(data->id_gpiod);
	state = gpiod_get_value_cansleep(data->id_gpiod);
	if (data->pdata->gpio_active_low)
	if (data->pdata->gpio_active_low)
		state = !state;
		state = !state;
	extcon_set_state(data->edev, state);
	extcon_set_cable_state_(data->edev, data->pdata->extcon_id, state);
}
}


static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
Loading