board-realtek.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2024 Allied Telesis
  4. */
  5. #include <linux/errno.h>
  6. #include <linux/libfdt.h>
  7. #include <linux/printk.h>
  8. #include <linux/types.h>
  9. #include <asm/fw/fw.h>
  10. #include <asm/machine.h>
  11. static __init int realtek_add_initrd(void *fdt)
  12. {
  13. int node, err;
  14. u32 start, size;
  15. node = fdt_path_offset(fdt, "/chosen");
  16. if (node < 0) {
  17. pr_err("/chosen node not found\n");
  18. return -ENOENT;
  19. }
  20. start = fw_getenvl("initrd_start");
  21. size = fw_getenvl("initrd_size");
  22. if (start == 0 && size == 0)
  23. return 0;
  24. pr_info("Adding initrd info from environment\n");
  25. err = fdt_setprop_u32(fdt, node, "linux,initrd-start", start);
  26. if (err) {
  27. pr_err("unable to set initrd-start: %d\n", err);
  28. return err;
  29. }
  30. err = fdt_setprop_u32(fdt, node, "linux,initrd-end", start + size);
  31. if (err) {
  32. pr_err("unable to set initrd-end: %d\n", err);
  33. return err;
  34. }
  35. return 0;
  36. }
  37. static const struct mips_fdt_fixup realtek_fdt_fixups[] __initconst = {
  38. { realtek_add_initrd, "add initrd" },
  39. {},
  40. };
  41. static __init const void *realtek_fixup_fdt(const void *fdt, const void *match_data)
  42. {
  43. static unsigned char fdt_buf[16 << 10] __initdata;
  44. int err;
  45. if (fdt_check_header(fdt))
  46. panic("Corrupt DT");
  47. fw_init_cmdline();
  48. err = apply_mips_fdt_fixups(fdt_buf, sizeof(fdt_buf), fdt, realtek_fdt_fixups);
  49. if (err)
  50. panic("Unable to fixup FDT: %d", err);
  51. return fdt_buf;
  52. }
  53. static const struct of_device_id realtek_of_match[] __initconst = {
  54. { .compatible = "realtek,rtl9302-soc" },
  55. {}
  56. };
  57. MIPS_MACHINE(realtek) = {
  58. .matches = realtek_of_match,
  59. .fixup_fdt = realtek_fixup_fdt,
  60. };