emi_reg_rw.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/interrupt.h>
  4. #include <linux/device.h>
  5. #include <linux/platform_device.h>
  6. #include <linux/mm.h>
  7. #include <linux/uaccess.h>
  8. #include <linux/slab.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/irq.h>
  11. #include <linux/sched.h>
  12. #include <linux/list.h>
  13. #include <linux/timer.h>
  14. #include <linux/workqueue.h>
  15. #include <mt-plat/mt_device_apc.h>
  16. #include <mt-plat/sync_write.h>
  17. #include <mt-plat/dma.h>
  18. #include <linux/of.h>
  19. #include <linux/of_address.h>
  20. #include <linux/of_irq.h>
  21. #include "mach/emi_mpu.h"
  22. #include "mach/mt_secure_api.h"
  23. static void __iomem *emi_base;
  24. #if defined(CONFIG_ARM_PSCI) || defined(CONFIG_MTK_PSCI)
  25. static int is_emi_mpu_reg(unsigned int offset)
  26. {
  27. if ((offset >= EMI_MPU_START) && (offset <= EMI_MPU_END))
  28. return 1;
  29. return 0;
  30. }
  31. #endif
  32. void mt_emi_reg_write(unsigned int data, unsigned int offset)
  33. {
  34. #if defined(CONFIG_ARM_PSCI) || defined(CONFIG_MTK_PSCI)
  35. if (is_emi_mpu_reg(offset)) {
  36. emi_mpu_smc_write(offset, data);
  37. return;
  38. }
  39. #endif
  40. if (emi_base)
  41. mt_reg_sync_writel(data, emi_base + offset);
  42. }
  43. unsigned int mt_emi_reg_read(unsigned int offset)
  44. {
  45. #if defined(CONFIG_ARM_PSCI) || defined(CONFIG_MTK_PSCI)
  46. if (is_emi_mpu_reg(offset))
  47. return (unsigned int)emi_mpu_smc_read(offset);
  48. #endif
  49. if (emi_base)
  50. return readl((const void __iomem *)(emi_base + offset));
  51. return 0;
  52. }
  53. int mt_emi_mpu_set_region_protection(unsigned int start,
  54. unsigned int end,
  55. unsigned int region_permission)
  56. {
  57. #if defined(CONFIG_ARM_PSCI) || defined(CONFIG_MTK_PSCI)
  58. return emi_mpu_smc_set(start, end, region_permission);
  59. #endif
  60. return 0;
  61. }
  62. void mt_emi_reg_base_set(void *base)
  63. {
  64. emi_base = base;
  65. }
  66. void *mt_emi_reg_base_get(void)
  67. {
  68. return emi_base;
  69. }