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

Commit a4febd54 authored by Mayank Rana's avatar Mayank Rana Committed by Jack Pham
Browse files

extcon: Add usage of blocking notifier chain



This change adds required APIs to register blocking notifier call
for blocking functionality using extcon framework.

Change-Id: I0e8e3b29d169ca833f85e42d2df98dd8380cbf46
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 210fe280
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -486,6 +486,21 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id)
}
EXPORT_SYMBOL_GPL(extcon_sync);

int extcon_blocking_sync(struct extcon_dev *edev, unsigned int id, bool val)
{
	int index;

	if (!edev)
		return -EINVAL;

	index = find_cable_index_by_id(edev, id);
	if (index < 0)
		return index;

	return blocking_notifier_call_chain(&edev->bnh[index], val, edev);
}
EXPORT_SYMBOL(extcon_blocking_sync);

/**
 * extcon_get_state() - Get the state of an external connector.
 * @edev:	the extcon device
@@ -935,6 +950,38 @@ int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
}
EXPORT_SYMBOL_GPL(extcon_register_notifier);

int extcon_register_blocking_notifier(struct extcon_dev *edev, unsigned int id,
			struct notifier_block *nb)
{
	int idx = -EINVAL;

	if (!edev || !nb)
		return -EINVAL;

	idx = find_cable_index_by_id(edev, id);
	if (idx < 0)
		return idx;

	return blocking_notifier_chain_register(&edev->bnh[idx], nb);
}
EXPORT_SYMBOL(extcon_register_blocking_notifier);

int extcon_unregister_blocking_notifier(struct extcon_dev *edev,
			unsigned int id, struct notifier_block *nb)
{
	int idx;

	if (!edev || !nb)
		return -EINVAL;

	idx = find_cable_index_by_id(edev, id);
	if (idx < 0)
		return idx;

	return blocking_notifier_chain_unregister(&edev->bnh[idx], nb);
}
EXPORT_SYMBOL(extcon_unregister_blocking_notifier);

/**
 * extcon_unregister_notifier() - Unregister a notifier block from the extcon.
 * @edev:	the extcon device
@@ -1265,6 +1312,13 @@ int extcon_dev_register(struct extcon_dev *edev)
		goto err_dev;
	}

	edev->bnh = devm_kzalloc(&edev->dev,
			sizeof(*edev->bnh) * edev->max_supported, GFP_KERNEL);
	if (!edev->bnh) {
		ret = -ENOMEM;
		goto err_dev;
	}

	for (index = 0; index < edev->max_supported; index++)
		RAW_INIT_NOTIFIER_HEAD(&edev->nh[index]);

+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ struct extcon_dev {
	struct device dev;
	struct raw_notifier_head nh_all;
	struct raw_notifier_head *nh;
	struct blocking_notifier_head *bnh;
	struct list_head entry;
	int max_supported;
	spinlock_t lock;	/* could be called by irq handler */
+20 −0
Original line number Diff line number Diff line
@@ -247,6 +247,10 @@ extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
				struct notifier_block *nb);
extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id,
				struct notifier_block *nb);
extern int extcon_register_blocking_notifier(struct extcon_dev *edev,
		unsigned int id, struct notifier_block *nb);
extern int extcon_unregister_blocking_notifier(struct extcon_dev *edev,
		unsigned int id, struct notifier_block *nb);
extern int devm_extcon_register_notifier(struct device *dev,
				struct extcon_dev *edev, unsigned int id,
				struct notifier_block *nb);
@@ -275,6 +279,8 @@ extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
/* Following API get the name of extcon device. */
extern const char *extcon_get_edev_name(struct extcon_dev *edev);

extern int extcon_blocking_sync(struct extcon_dev *edev, unsigned int id,
							bool val);
#else /* CONFIG_EXTCON */
static inline int extcon_dev_register(struct extcon_dev *edev)
{
@@ -374,6 +380,20 @@ static inline int extcon_unregister_notifier(struct extcon_dev *edev,
	return 0;
}

static inline int extcon_register_blocking_notifier(struct extcon_dev *edev,
					unsigned int id,
					struct notifier_block *nb)
{
	return 0;
}

static inline int extcon_unregister_blocking_notifier(struct extcon_dev *edev,
					unsigned int id,
					struct notifier_block *nb)
{
	return 0;
}

static inline int devm_extcon_register_notifier(struct device *dev,
				struct extcon_dev *edev, unsigned int id,
				struct notifier_block *nb)