devres.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /*
  2. * Copyright (C) 2008 Freescale Semiconductor, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version
  7. * 2 of the License, or (at your option) any later version.
  8. */
  9. #include <linux/device.h> /* devres_*(), devm_ioremap_release() */
  10. #include <linux/io.h> /* ioremap_flags() */
  11. #include <linux/module.h> /* EXPORT_SYMBOL() */
  12. /**
  13. * devm_ioremap_prot - Managed ioremap_flags()
  14. * @dev: Generic device to remap IO address for
  15. * @offset: BUS offset to map
  16. * @size: Size of map
  17. * @flags: Page flags
  18. *
  19. * Managed ioremap_prot(). Map is automatically unmapped on driver
  20. * detach.
  21. */
  22. void __iomem *devm_ioremap_prot(struct device *dev, resource_size_t offset,
  23. size_t size, unsigned long flags)
  24. {
  25. void __iomem **ptr, *addr;
  26. ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
  27. if (!ptr)
  28. return NULL;
  29. addr = ioremap_flags(offset, size, flags);
  30. if (addr) {
  31. *ptr = addr;
  32. devres_add(dev, ptr);
  33. } else
  34. devres_free(ptr);
  35. return addr;
  36. }
  37. EXPORT_SYMBOL(devm_ioremap_prot);