brcmnand.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright © 2015 Broadcom Corporation
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #ifndef __BRCMNAND_H__
  14. #define __BRCMNAND_H__
  15. #include <linux/types.h>
  16. #include <linux/io.h>
  17. struct platform_device;
  18. struct dev_pm_ops;
  19. struct brcmnand_soc {
  20. bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
  21. void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
  22. void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare);
  23. };
  24. static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc)
  25. {
  26. if (soc && soc->prepare_data_bus)
  27. soc->prepare_data_bus(soc, true);
  28. }
  29. static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc)
  30. {
  31. if (soc && soc->prepare_data_bus)
  32. soc->prepare_data_bus(soc, false);
  33. }
  34. static inline u32 brcmnand_readl(void __iomem *addr)
  35. {
  36. /*
  37. * MIPS endianness is configured by boot strap, which also reverses all
  38. * bus endianness (i.e., big-endian CPU + big endian bus ==> native
  39. * endian I/O).
  40. *
  41. * Other architectures (e.g., ARM) either do not support big endian, or
  42. * else leave I/O in little endian mode.
  43. */
  44. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  45. return __raw_readl(addr);
  46. else
  47. return readl_relaxed(addr);
  48. }
  49. static inline void brcmnand_writel(u32 val, void __iomem *addr)
  50. {
  51. /* See brcmnand_readl() comments */
  52. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  53. __raw_writel(val, addr);
  54. else
  55. writel_relaxed(val, addr);
  56. }
  57. int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc);
  58. int brcmnand_remove(struct platform_device *pdev);
  59. extern const struct dev_pm_ops brcmnand_pm_ops;
  60. #endif /* __BRCMNAND_H__ */