[jtag/scanmode] Add clock mux on TCK for scanmode

Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/lc_ctrl/lc_ctrl.core b/hw/ip/lc_ctrl/lc_ctrl.core
index b5e0028..854cc00 100644
--- a/hw/ip/lc_ctrl/lc_ctrl.core
+++ b/hw/ip/lc_ctrl/lc_ctrl.core
@@ -9,6 +9,7 @@
   files_rtl:
     depend:
       - lowrisc:prim:all
+      - lowrisc:prim:clock_mux2
       - lowrisc:prim:lc_sync
       - lowrisc:prim:lc_sender
       - lowrisc:ip:lc_ctrl_pkg
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl.sv
index a79a91b..8ec8e37 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl.sv
@@ -142,12 +142,25 @@
   logic dmi_resp_ready;
   logic dmi_resp_valid;
 
+  logic scanmode;
+  assign scanmode = (scanmode_i == On);
+
+  logic tck_muxed;
+  prim_clock_mux2 #(
+    .NoFpgaBufG(1'b1)
+  ) u_prim_clock_mux2 (
+    .clk0_i(jtag_i.tck),
+    .clk1_i(clk_i),
+    .sel_i (scanmode),
+    .clk_o (tck_muxed)
+  );
+
   dmi_jtag #(
     .IdcodeValue(IdcodeValue)
   ) u_dmi_jtag (
     .clk_i,
     .rst_ni,
-    .testmode_i       ( scanmode_i == On  ),
+    .testmode_i       ( scanmode          ),
     .dmi_rst_no       (                   ), // unused
     .dmi_req_o        ( dmi_req           ),
     .dmi_req_valid_o  ( dmi_req_valid     ),
@@ -155,7 +168,7 @@
     .dmi_resp_i       ( dmi_resp          ),
     .dmi_resp_ready_o ( dmi_resp_ready    ),
     .dmi_resp_valid_i ( dmi_resp_valid    ),
-    .tck_i            ( jtag_i.tck        ),
+    .tck_i            ( tck_muxed         ),
     .tms_i            ( jtag_i.tms        ),
     .trst_ni          ( jtag_i.trst_n     ),
     .td_i             ( jtag_i.tdi        ),
diff --git a/hw/ip/rv_dm/rtl/rv_dm.sv b/hw/ip/rv_dm/rtl/rv_dm.sv
index e04ba89..04cad54 100644
--- a/hw/ip/rv_dm/rtl/rv_dm.sv
+++ b/hw/ip/rv_dm/rtl/rv_dm.sv
@@ -277,6 +277,17 @@
 
   // Bound-in DPI module replaces the TAP
 `ifndef DMIDirectTAP
+
+  logic tck_muxed;
+  prim_clock_mux2 #(
+    .NoFpgaBufG(1'b1)
+  ) u_prim_clock_mux2 (
+    .clk0_i(jtag_req_i.tck),
+    .clk1_i(clk_i),
+    .sel_i (testmode),
+    .clk_o (tck_muxed)
+  );
+
   // JTAG TAP
   dmi_jtag #(
     .IdcodeValue    (IdcodeValue)
@@ -295,7 +306,7 @@
     .dmi_resp_valid_i (dmi_rsp_valid),
 
     //JTAG
-    .tck_i            (jtag_req_i.tck),
+    .tck_i            (tck_muxed),
     .tms_i            (jtag_req_i.tms),
     .trst_ni          (jtag_req_i.trst_n),
     .td_i             (jtag_req_i.tdi),
diff --git a/hw/ip/rv_dm/rv_dm.core b/hw/ip/rv_dm/rv_dm.core
index ffefce5..b54d770 100644
--- a/hw/ip/rv_dm/rv_dm.core
+++ b/hw/ip/rv_dm/rv_dm.core
@@ -12,6 +12,7 @@
       - lowrisc:ip:tlul
       - lowrisc:prim:all
       - lowrisc:prim:lc_sync
+      - lowrisc:prim:clock_mux2
       - lowrisc:tlul:adapter_host
       - pulp-platform:riscv-dbg:0.1
       - lowrisc:ip:lc_ctrl_pkg