diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-01 16:20:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-01 16:20:04 -0400 |
commit | 251df49db3327c64bf917bfdba94491fde2b4ee0 (patch) | |
tree | 71eef72e1c393057f7b14cc4d8da5e48c7728336 /drivers/base | |
parent | 8a72f3820c4d14b27ad5336aed00063a7a7f1bef (diff) | |
parent | bf61c8840efe60fd8f91446860b63338fb424158 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov:
"Assorted fixes and cleanups to the existing drivers plus a new driver
for IMS Passenger Control Unit device they use for ther in-flight
entertainment system."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (44 commits)
Input: trackpoint - Optimize trackpoint init to use power-on reset
Input: apbps2 - convert to devm_ioremap_resource()
Input: ALPS - use %ph to print buffers
ARM - shmobile: Armadillo800EVA: Move st1232 reset pin handling
Input: st1232 - add reset pin handling
Input: st1232 - convert to devm_* infrastructure
Input: MT - handle semi-mt devices in core
Input: adxl34x - use spi_get_drvdata()
Input: ad7877 - use spi_get_drvdata() and spi_set_drvdata()
Input: ads7846 - use spi_get_drvdata() and spi_set_drvdata()
Input: ims-pcu - fix a memory leak on error
Input: sysrq - supplement reset sequence with timeout functionality
Input: tegra-kbc - support for defining row/columns based on SoC
Input: imx_keypad - switch to using managed resources
Input: arc_ps2 - add support for device tree
Input: mma8450 - fix signed 12bits to 32bits conversion
Input: eeti_ts - remove redundant null check
Input: edt-ft5x06 - remove redundant null check before kfree
Input: ad714x - add CONFIG_PM_SLEEP to suspend/resume functions
Input: adxl34x - add CONFIG_PM_SLEEP to suspend/resume functions
...
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/devres.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 668390664764..507379e7b763 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c | |||
@@ -671,6 +671,80 @@ int devres_release_group(struct device *dev, void *id) | |||
671 | EXPORT_SYMBOL_GPL(devres_release_group); | 671 | EXPORT_SYMBOL_GPL(devres_release_group); |
672 | 672 | ||
673 | /* | 673 | /* |
674 | * Custom devres actions allow inserting a simple function call | ||
675 | * into the teadown sequence. | ||
676 | */ | ||
677 | |||
678 | struct action_devres { | ||
679 | void *data; | ||
680 | void (*action)(void *); | ||
681 | }; | ||
682 | |||
683 | static int devm_action_match(struct device *dev, void *res, void *p) | ||
684 | { | ||
685 | struct action_devres *devres = res; | ||
686 | struct action_devres *target = p; | ||
687 | |||
688 | return devres->action == target->action && | ||
689 | devres->data == target->data; | ||
690 | } | ||
691 | |||
692 | static void devm_action_release(struct device *dev, void *res) | ||
693 | { | ||
694 | struct action_devres *devres = res; | ||
695 | |||
696 | devres->action(devres->data); | ||
697 | } | ||
698 | |||
699 | /** | ||
700 | * devm_add_action() - add a custom action to list of managed resources | ||
701 | * @dev: Device that owns the action | ||
702 | * @action: Function that should be called | ||
703 | * @data: Pointer to data passed to @action implementation | ||
704 | * | ||
705 | * This adds a custom action to the list of managed resources so that | ||
706 | * it gets executed as part of standard resource unwinding. | ||
707 | */ | ||
708 | int devm_add_action(struct device *dev, void (*action)(void *), void *data) | ||
709 | { | ||
710 | struct action_devres *devres; | ||
711 | |||
712 | devres = devres_alloc(devm_action_release, | ||
713 | sizeof(struct action_devres), GFP_KERNEL); | ||
714 | if (!devres) | ||
715 | return -ENOMEM; | ||
716 | |||
717 | devres->data = data; | ||
718 | devres->action = action; | ||
719 | |||
720 | devres_add(dev, devres); | ||
721 | return 0; | ||
722 | } | ||
723 | EXPORT_SYMBOL_GPL(devm_add_action); | ||
724 | |||
725 | /** | ||
726 | * devm_remove_action() - removes previously added custom action | ||
727 | * @dev: Device that owns the action | ||
728 | * @action: Function implementing the action | ||
729 | * @data: Pointer to data passed to @action implementation | ||
730 | * | ||
731 | * Removes instance of @action previously added by devm_add_action(). | ||
732 | * Both action and data should match one of the existing entries. | ||
733 | */ | ||
734 | void devm_remove_action(struct device *dev, void (*action)(void *), void *data) | ||
735 | { | ||
736 | struct action_devres devres = { | ||
737 | .data = data, | ||
738 | .action = action, | ||
739 | }; | ||
740 | |||
741 | WARN_ON(devres_destroy(dev, devm_action_release, devm_action_match, | ||
742 | &devres)); | ||
743 | |||
744 | } | ||
745 | EXPORT_SYMBOL_GPL(devm_remove_action); | ||
746 | |||
747 | /* | ||
674 | * Managed kzalloc/kfree | 748 | * Managed kzalloc/kfree |
675 | */ | 749 | */ |
676 | static void devm_kzalloc_release(struct device *dev, void *res) | 750 | static void devm_kzalloc_release(struct device *dev, void *res) |