aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-03 11:34:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-03 11:34:00 -0400
commit5142c33ed86acbcef5c63a63d2b7384b9210d39f (patch)
tree6a0a36207ab436e1ef03bfefa7dac8f3a0cdfae5 /drivers/base
parent5da77761e6fd51f633b4f31051c4f839e01c29c0 (diff)
parent7eb843aa5050a395bc922db1b41b7237f238d2ba (diff)
Merge tag 'staging-3.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging into next
Pull staging driver updates from Greg KH: "Here is the big staging driver pull request for 3.16-rc1. Lots of stuff here, tons of cleanup patches, a few new drivers, and some removed as well, but I think we are still adding a few thousand more lines than we remove, due to the new drivers being bigger than the ones deleted. One notible bit of work did stand out, Jes Sorensen has gone on a tear, fixing up a wireless driver to be "more sane" than it originally was from the vendor, with over 500 patches merged here. Good stuff, and a number of users laptops are better off for it. All of this has been in linux-next for a while" * tag 'staging-3.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (1703 commits) staging: skein: fix sparse warning for static declarations staging/mt29f_spinand: coding style fixes staging: silicom: fix sparse warning for static variable staging: lustre: Fix coding style staging: android: binder.c: Use more appropriate functions for euid retrieval staging: lustre: fix integer as NULL pointer warnings Revert "staging: dgap: remove unneeded kfree() in dgap_tty_register_ports()" Staging: rtl8192u: r8192U_wx.c Fixed a misplaced brace staging: ion: shrink highmem pages on kswapd staging: ion: use compound pages on high order pages for system heap staging: ion: remove struct ion_page_pool_item staging: ion: simplify ion_page_pool_total() staging: ion: tidy up a bit staging: rtl8723au: Remove redundant casting in usb_ops_linux.c staging: rtl8723au: Remove redundant casting in rtl8723a_hal_init.c staging: rtl8723au: Remove redundant casting in rtw_xmit.c staging: rtl8723au: Remove redundant casting in rtw_wlan_util.c staging: rtl8723au: Remove redundant casting in rtw_sta_mgt.c staging: rtl8723au: Remove redundant casting in rtw_recv.c staging: rtl8723au: Remove redundant casting in rtw_mlme.c ...
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/devres.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
index db4e264eecb6..52302946770f 100644
--- a/drivers/base/devres.c
+++ b/drivers/base/devres.c
@@ -831,3 +831,100 @@ void devm_kfree(struct device *dev, void *p)
831 WARN_ON(rc); 831 WARN_ON(rc);
832} 832}
833EXPORT_SYMBOL_GPL(devm_kfree); 833EXPORT_SYMBOL_GPL(devm_kfree);
834
835/**
836 * devm_kmemdup - Resource-managed kmemdup
837 * @dev: Device this memory belongs to
838 * @src: Memory region to duplicate
839 * @len: Memory region length
840 * @gfp: GFP mask to use
841 *
842 * Duplicate region of a memory using resource managed kmalloc
843 */
844void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp)
845{
846 void *p;
847
848 p = devm_kmalloc(dev, len, gfp);
849 if (p)
850 memcpy(p, src, len);
851
852 return p;
853}
854EXPORT_SYMBOL_GPL(devm_kmemdup);
855
856struct pages_devres {
857 unsigned long addr;
858 unsigned int order;
859};
860
861static int devm_pages_match(struct device *dev, void *res, void *p)
862{
863 struct pages_devres *devres = res;
864 struct pages_devres *target = p;
865
866 return devres->addr == target->addr;
867}
868
869static void devm_pages_release(struct device *dev, void *res)
870{
871 struct pages_devres *devres = res;
872
873 free_pages(devres->addr, devres->order);
874}
875
876/**
877 * devm_get_free_pages - Resource-managed __get_free_pages
878 * @dev: Device to allocate memory for
879 * @gfp_mask: Allocation gfp flags
880 * @order: Allocation size is (1 << order) pages
881 *
882 * Managed get_free_pages. Memory allocated with this function is
883 * automatically freed on driver detach.
884 *
885 * RETURNS:
886 * Address of allocated memory on success, 0 on failure.
887 */
888
889unsigned long devm_get_free_pages(struct device *dev,
890 gfp_t gfp_mask, unsigned int order)
891{
892 struct pages_devres *devres;
893 unsigned long addr;
894
895 addr = __get_free_pages(gfp_mask, order);
896
897 if (unlikely(!addr))
898 return 0;
899
900 devres = devres_alloc(devm_pages_release,
901 sizeof(struct pages_devres), GFP_KERNEL);
902 if (unlikely(!devres)) {
903 free_pages(addr, order);
904 return 0;
905 }
906
907 devres->addr = addr;
908 devres->order = order;
909
910 devres_add(dev, devres);
911 return addr;
912}
913EXPORT_SYMBOL_GPL(devm_get_free_pages);
914
915/**
916 * devm_free_pages - Resource-managed free_pages
917 * @dev: Device this memory belongs to
918 * @addr: Memory to free
919 *
920 * Free memory allocated with devm_get_free_pages(). Unlike free_pages,
921 * there is no need to supply the @order.
922 */
923void devm_free_pages(struct device *dev, unsigned long addr)
924{
925 struct pages_devres devres = { .addr = addr };
926
927 WARN_ON(devres_release(dev, devm_pages_release, devm_pages_match,
928 &devres));
929}
930EXPORT_SYMBOL_GPL(devm_free_pages);