As Szaboics mentioned, you could use ordering (PlanarEmbedding) to find faces.
g = AdjacencyGraph[M, GraphLayout -> "PlanarEmbedding",
VertexLabels -> "Name", ImagePadding -> 5]

The following function will find next vertex of the face based on the given planar embedding:
nextCandidate[s_, t_, adj_] :=
Block[{ length, pos},
length = Length[adj];
pos = Mod[Position[adj, s][[1, 1]] + 1, length, 1];
{t, adj[[pos]]}
];
The main function to get all faces:
FindFace[g_?PlanarGraphQ] :=
Block[{emb},
emb = GraphEmbedding[g, "PlanarEmbedding"];
FindFace[g, emb]
];
FindFace[g_?PlanarGraphQ, emb_] :=
Block[{m, orderings, pAdj, rightF, s, t, initial, face},
m = AdjacencyMatrix[g];
Table[pAdj[v] =
SortBy[Pick[VertexList[g], m[[v]], 1],
ArcTan @@ (emb[[v]] - emb[[#]]) &], {v, VertexList[g]}];
rightF[_] := False;
Reap[
Table[
If[! rightF[e],
s = e[[1]];
t = e[[2]];
initial = s;
face = {s};
While[t =!= initial,
rightF[UndirectedEdge[s, t]] = True;
{s, t} = nextCandidate[s, t, pAdj[t]];
face = Join[face, {s}];
];
Sow[face];
],
{e, EdgeList[g]}]][[2, 1]]
]
For example,
In[162]:= faces = FindFace[g]
Out[162]= {{1, 2, 8, 6}, {1, 5, 4, 3, 2}, {1, 6, 5}, {2, 3, 7, 8}, {3,
4, 7}, {4, 5, 6, 8, 7}}
coord = GraphEmbedding[g];
Graphics[{EdgeForm[Directive[Black, Thick]],
Thread[{ColorData[3, "ColorList"][[;; Length[faces]]],
Polygon[coord[[#]]] & /@ faces}]}]

You could use the precomputed coordinates if you want like:
g = GridGraph[{3, 3}]

In[166]:= FindFace[g, GraphEmbedding[g]]
Out[166]= {{1, 2, 5, 4}, {1, 4, 7, 8, 9, 6, 3, 2}, {2, 3, 6, 5}, {4,
5, 8, 7}, {5, 6, 9, 8}}
Note that this function will find all faces including the external face.
Hope this help you to start this.