They can invoke one another after two adjustments:
Put interfaces for the child routines into the parent module
You don't need use, as every child shares that parent module
A full working example follows:
demo.f90:
module root_mod
implicit none
interface
module subroutine routine_c()
end subroutine routine_c
module subroutine routine_d()
end subroutine routine_d
end interface
end module root_mod
program demo
use root_mod
implicit none
call routine_d()
end program demo
c.f90:
submodule(root_mod) c
implicit none
contains
module subroutine routine_c
print *, "hello from routine_c"
end subroutine routine_c
end submodule c
d.f90:
submodule(root_mod) d
implicit none
contains
module subroutine routine_d
print *, "hello from routine_d"
call routine_c()
end subroutine routine_d
end submodule d