diff options
-rw-r--r-- | drivers/extcon/extcon-class.c | 36 | ||||
-rw-r--r-- | include/linux/extcon.h | 13 |
2 files changed, 49 insertions, 0 deletions
diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c index f6df68989651..654ed52e17c2 100644 --- a/drivers/extcon/extcon-class.c +++ b/drivers/extcon/extcon-class.c | |||
@@ -565,6 +565,42 @@ static void dummy_sysfs_dev_release(struct device *dev) | |||
565 | { | 565 | { |
566 | } | 566 | } |
567 | 567 | ||
568 | /* | ||
569 | * extcon_dev_allocate() - Allocate the memory of extcon device. | ||
570 | * @supported_cable: Array of supported cable names ending with NULL. | ||
571 | * If supported_cable is NULL, cable name related APIs | ||
572 | * are disabled. | ||
573 | * | ||
574 | * This function allocates the memory for extcon device without allocating | ||
575 | * memory in each extcon provider driver and initialize default setting for | ||
576 | * extcon device. | ||
577 | * | ||
578 | * Return the pointer of extcon device if success or ERR_PTR(err) if fail | ||
579 | */ | ||
580 | struct extcon_dev *extcon_dev_allocate(const char **supported_cable) | ||
581 | { | ||
582 | struct extcon_dev *edev; | ||
583 | |||
584 | edev = kzalloc(sizeof(*edev), GFP_KERNEL); | ||
585 | if (!edev) | ||
586 | return ERR_PTR(-ENOMEM); | ||
587 | |||
588 | edev->max_supported = 0; | ||
589 | edev->supported_cable = supported_cable; | ||
590 | |||
591 | return edev; | ||
592 | } | ||
593 | |||
594 | /* | ||
595 | * extcon_dev_free() - Free the memory of extcon device. | ||
596 | * @edev: the extcon device to free | ||
597 | */ | ||
598 | void extcon_dev_free(struct extcon_dev *edev) | ||
599 | { | ||
600 | kfree(edev); | ||
601 | } | ||
602 | EXPORT_SYMBOL_GPL(extcon_dev_free); | ||
603 | |||
568 | /** | 604 | /** |
569 | * extcon_dev_register() - Register a new extcon device | 605 | * extcon_dev_register() - Register a new extcon device |
570 | * @edev : the new extcon device (should be allocated before calling) | 606 | * @edev : the new extcon device (should be allocated before calling) |
diff --git a/include/linux/extcon.h b/include/linux/extcon.h index 548447be2d8f..15361a2f2f19 100644 --- a/include/linux/extcon.h +++ b/include/linux/extcon.h | |||
@@ -192,6 +192,12 @@ extern void devm_extcon_dev_unregister(struct device *dev, | |||
192 | extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); | 192 | extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); |
193 | 193 | ||
194 | /* | 194 | /* |
195 | * Following APIs control the memory of extcon device. | ||
196 | */ | ||
197 | extern struct extcon_dev *extcon_dev_allocate(const char **cables); | ||
198 | extern void extcon_dev_free(struct extcon_dev *edev); | ||
199 | |||
200 | /* | ||
195 | * get/set/update_state access the 32b encoded state value, which represents | 201 | * get/set/update_state access the 32b encoded state value, which represents |
196 | * states of all possible cables of the multistate port. For example, if one | 202 | * states of all possible cables of the multistate port. For example, if one |
197 | * calls extcon_set_state(edev, 0x7), it may mean that all the three cables | 203 | * calls extcon_set_state(edev, 0x7), it may mean that all the three cables |
@@ -267,6 +273,13 @@ static inline int devm_extcon_dev_register(struct device *dev, | |||
267 | static inline void devm_extcon_dev_unregister(struct device *dev, | 273 | static inline void devm_extcon_dev_unregister(struct device *dev, |
268 | struct extcon_dev *edev) { } | 274 | struct extcon_dev *edev) { } |
269 | 275 | ||
276 | static inline struct extcon_dev *extcon_dev_allocate(const char **cables) | ||
277 | { | ||
278 | return ERR_PTR(-ENOSYS); | ||
279 | } | ||
280 | |||
281 | static inline void extcon_dev_free(struct extcon_dev *edev) { } | ||
282 | |||
270 | static inline u32 extcon_get_state(struct extcon_dev *edev) | 283 | static inline u32 extcon_get_state(struct extcon_dev *edev) |
271 | { | 284 | { |
272 | return 0; | 285 | return 0; |