Index: sys/dev/extres/clk/clk.h =================================================================== --- sys/dev/extres/clk/clk.h +++ sys/dev/extres/clk/clk.h @@ -131,6 +131,7 @@ int clk_enable(clk_t clk); int clk_disable(clk_t clk); int clk_stop(clk_t clk); +int clk_mux(clk_t clk, int index); int clk_get_parent(clk_t clk, clk_t *parent); int clk_set_parent_by_clk(clk_t clk, clk_t parent); const char *clk_get_name(clk_t clk); Index: sys/dev/extres/clk/clk.c =================================================================== --- sys/dev/extres/clk/clk.c +++ sys/dev/extres/clk/clk.c @@ -376,6 +376,8 @@ *clk = clknode_find_by_id(clkdom, 1); else if (ncells == 1) *clk = clknode_find_by_id(clkdom, cells[0]); + else if (ncells == 2) + *clk = clknode_find_by_id(clkdom, cells[0]); else return (ERANGE); @@ -1265,6 +1267,22 @@ CLK_TOPO_SLOCK(); rv = clknode_stop(clknode, 0); CLK_TOPO_UNLOCK(); + return (rv); +} + +int +clk_mux(clk_t clk, int index) +{ + int rv; + struct clknode *clknode; + + clknode = clk->clknode; + KASSERT(clknode->ref_cnt > 0, + ("Attempt to access unreferenced clock: %s\n", clknode->name)); + CLK_TOPO_SLOCK(); + rv = CLKNODE_SET_MUX(clknode, index); + CLK_TOPO_UNLOCK(); + return (rv); }