memconf-proxstream2.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <linux/err.h>
  8. #include <linux/io.h>
  9. #include <linux/sizes.h>
  10. #include "../init.h"
  11. #include "../sg-regs.h"
  12. int proxstream2_memconf_init(const struct uniphier_board_data *bd)
  13. {
  14. u32 tmp;
  15. unsigned long size_per_word;
  16. tmp = readl(SG_MEMCONF);
  17. tmp &= ~(SG_MEMCONF_CH2_SZ_MASK | SG_MEMCONF_CH2_NUM_MASK);
  18. switch (bd->dram_ch[2].width) {
  19. case 16:
  20. tmp |= SG_MEMCONF_CH2_NUM_1;
  21. size_per_word = bd->dram_ch[2].size;
  22. break;
  23. case 32:
  24. tmp |= SG_MEMCONF_CH2_NUM_2;
  25. size_per_word = bd->dram_ch[2].size >> 1;
  26. break;
  27. default:
  28. pr_err("error: unsupported DRAM Ch2 width\n");
  29. return -EINVAL;
  30. }
  31. /* Set DDR size */
  32. switch (size_per_word) {
  33. case SZ_64M:
  34. tmp |= SG_MEMCONF_CH2_SZ_64M;
  35. break;
  36. case SZ_128M:
  37. tmp |= SG_MEMCONF_CH2_SZ_128M;
  38. break;
  39. case SZ_256M:
  40. tmp |= SG_MEMCONF_CH2_SZ_256M;
  41. break;
  42. case SZ_512M:
  43. tmp |= SG_MEMCONF_CH2_SZ_512M;
  44. break;
  45. default:
  46. pr_err("error: unsupported DRAM Ch2 size\n");
  47. return -EINVAL;
  48. }
  49. if (size_per_word)
  50. tmp &= ~SG_MEMCONF_CH2_DISABLE;
  51. else
  52. tmp |= SG_MEMCONF_CH2_DISABLE;
  53. writel(tmp, SG_MEMCONF);
  54. return 0;
  55. }