servo: cache servo_type

The servo type does not change during a servod instance. This CL caches
the value on server initialization to avoid unnecessary extra calls.

BUG=chromium:1009616

TEST=test_that --autotest_dir . $DIP firmware_Cr50CCDServoCap

/tmp/test_that_results_b2EdTg/results-1-firmware_Cr50CCDServoCap
[  PASSED  ]

Change-Id: Id705c70f207eb5c11c37d112fe99e196c9c871fd
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2023876
Tested-by: Ruben Rodriguez Buchillon <coconutruben@chromium.org>
Commit-Queue: Ruben Rodriguez Buchillon <coconutruben@chromium.org>
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index 97c7d49..2908a78 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -314,6 +314,7 @@
         self._servo_host = servo_host
         self._servo_serial = servo_serial
         self._server = servo_host.get_servod_server_proxy()
+        self._servo_type = self.get_servo_version()
         self._power_state = _PowerStateController(self)
         self._uart = _Uart(self)
         self._usb_state = None
@@ -1050,8 +1051,7 @@
 
     def get_main_servo_device(self):
         """Return the main servo device"""
-        servo_type = self.get_servo_version()
-        return servo_type.split('_with_')[-1].split('_and_')[0]
+        return self._servo_type.split('_with_')[-1].split('_and_')[0]
 
 
     def enable_main_servo_device(self):
@@ -1087,20 +1087,19 @@
         if self._programmer:
             return
         # Initialize firmware programmer
-        servo_version = self.get_servo_version()
-        if servo_version.startswith('servo_v2'):
+        if self._servo_type.startswith('servo_v2'):
             self._programmer = firmware_programmer.ProgrammerV2(self)
             self._programmer_rw = firmware_programmer.ProgrammerV2RwOnly(self)
         # Both servo v3 and v4 use the same programming methods so just leverage
         # ProgrammerV3 for servo v4 as well.
-        elif (servo_version.startswith('servo_v3') or
-              servo_version.startswith('servo_v4')):
+        elif (self._servo_type.startswith('servo_v3') or
+              self._servo_type.startswith('servo_v4')):
             self._programmer = firmware_programmer.ProgrammerV3(self)
             self._programmer_rw = firmware_programmer.ProgrammerV3RwOnly(self)
         else:
             raise error.TestError(
                     'No firmware programmer for servo version: %s' %
-                    servo_version)
+                    self._servo_type)
 
 
     def program_bios(self, image, rw_only=False):
@@ -1292,8 +1291,7 @@
 
         @param role: Power role for DUT port on servo v4, either 'src' or 'snk'.
         """
-        servo_version = self.get_servo_version()
-        if servo_version.startswith('servo_v4'):
+        if self._servo_type.startswith('servo_v4'):
             value = self.get('servo_v4_role')
             if value != role:
                 self.set_nocheck('servo_v4_role', role)
@@ -1305,12 +1303,12 @@
 
     def supports_built_in_pd_control(self):
         """Return whether the servo type supports pd charging and control."""
-        servo_type = self.get('servo_type')
-        if 'servo_v4' not in servo_type:
+        if 'servo_v4' not in self._servo_type:
             # Only servo v4 supports this feature.
-            logging.info('%r type does not support pd control.', servo_type)
+            logging.info('%r type does not support pd control.',
+                         self._servo_type)
             return False
-        # On servo v4, it still needs ot be the type-c version.
+        # On servo v4, it still needs to be the type-c version.
         if not self.get('servo_v4_type') == 'type-c':
             logging.info('PD controls require a type-c servo v4.')
             return False
@@ -1333,14 +1331,14 @@
 
         @param state: Set servo v4 dts mode 'off' or 'on'.
         """
-        servo_version = self.get_servo_version()
-        if not servo_version.startswith('servo_v4'):
+        if not self._servo_type.startswith('servo_v4'):
             logging.debug('Not a servo v4, unable to set dts mode %s.', state)
             return
 
         # TODO(mruthven): remove watchdog check once the labstation has been
         # updated to have support for modifying the watchdog.
-        set_watchdog = self.has_control('watchdog') and 'ccd' in servo_version
+        set_watchdog = (self.has_control('watchdog') and
+                        'ccd' in self._servo_type)
         enable_watchdog = state == 'on'
 
         if set_watchdog and not enable_watchdog: