+ int retval = adapter_khz_to_speed(0, speed);
+ if ((ERROR_OK != retval) && fallback_speed_khz) {
+ LOG_DEBUG("trying fallback speed...");
+ retval = adapter_khz_to_speed(fallback_speed_khz, speed);
+ }
+ return retval;
+}
+
+static int jtag_set_speed(int speed)
+{
+ jtag_speed = speed;
+ /* this command can be called during CONFIG,
+ * in which case jtag isn't initialized */
+ return jtag ? jtag->speed(speed) : ERROR_OK;
+}
+
+int jtag_config_khz(unsigned khz)
+{
+ LOG_DEBUG("handle jtag khz");
+ clock_mode = CLOCK_MODE_KHZ;
+ int speed = 0;
+ int retval = adapter_khz_to_speed(khz, &speed);
+ return (ERROR_OK != retval) ? retval : jtag_set_speed(speed);
+}
+
+int jtag_config_rclk(unsigned fallback_speed_khz)
+{
+ LOG_DEBUG("handle jtag rclk");
+ clock_mode = CLOCK_MODE_RCLK;
+ rclk_fallback_speed_khz = fallback_speed_khz;
+ int speed = 0;
+ int retval = jtag_rclk_to_speed(fallback_speed_khz, &speed);
+ return (ERROR_OK != retval) ? retval : jtag_set_speed(speed);
+}
+
+int jtag_get_speed(int *speed)
+{
+ switch (clock_mode) {
+ case CLOCK_MODE_KHZ:
+ adapter_khz_to_speed(jtag_get_speed_khz(), speed);
+ break;
+ case CLOCK_MODE_RCLK:
+ jtag_rclk_to_speed(rclk_fallback_speed_khz, speed);
+ break;
+ default:
+ LOG_ERROR("BUG: unknown jtag clock mode");
+ return ERROR_FAIL;
+ }
+ return ERROR_OK;
+}
+
+int jtag_get_speed_readable(int *khz)
+{
+ int jtag_speed_var = 0;
+ int retval = jtag_get_speed(&jtag_speed_var);
+ if (retval != ERROR_OK)
+ return retval;
+ return jtag ? jtag->speed_div(jtag_speed_var, khz) : ERROR_OK;