Move init_reader() from utils.py to transport/__init__.py

This avoids a circular dependency when introducing type annotations.

Change-Id: I168597ac14497fb188a15cb632f32452128bc1c6
diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index f946af8..24d7521 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -3,6 +3,8 @@
 """ pySim: PCSC reader transport link base
 """
 
+from typing import Optional
+
 from pySim.exceptions import *
 from pySim.utils import sw_match
 
@@ -103,3 +105,30 @@
 		if not sw_match(rv[1], sw):
 			raise SwMatchError(rv[1], sw.lower())
 		return rv
+
+def init_reader(opts) -> Optional[LinkBase]:
+	"""
+	Init card reader driver
+	"""
+	sl = None # type : :Optional[LinkBase]
+	try:
+		if opts.pcsc_dev is not None:
+			print("Using PC/SC reader interface")
+			from pySim.transport.pcsc import PcscSimLink
+			sl = PcscSimLink(opts.pcsc_dev)
+		elif opts.osmocon_sock is not None:
+			print("Using Calypso-based (OsmocomBB) reader interface")
+			from pySim.transport.calypso import CalypsoSimLink
+			sl = CalypsoSimLink(sock_path=opts.osmocon_sock)
+		elif opts.modem_dev is not None:
+			print("Using modem for Generic SIM Access (3GPP TS 27.007)")
+			from pySim.transport.modem_atcmd import ModemATCommandLink
+			sl = ModemATCommandLink(device=opts.modem_dev, baudrate=opts.modem_baud)
+		else: # Serial reader is default
+			print("Using serial reader interface")
+			from pySim.transport.serial import SerialSimLink
+			sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)
+		return sl
+	except Exception as e:
+		print("Card reader initialization failed with exception:\n" + str(e))
+		return None
diff --git a/pySim/utils.py b/pySim/utils.py
index a784b7e..3e27e3f 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -650,33 +650,6 @@
 
 	return pin_adm
 
-def init_reader(opts):
-	"""
-	Init card reader driver
-	"""
-	try:
-		if opts.pcsc_dev is not None:
-			print("Using PC/SC reader interface")
-			from pySim.transport.pcsc import PcscSimLink
-			sl = PcscSimLink(opts.pcsc_dev)
-		elif opts.osmocon_sock is not None:
-			print("Using Calypso-based (OsmocomBB) reader interface")
-			from pySim.transport.calypso import CalypsoSimLink
-			sl = CalypsoSimLink(sock_path=opts.osmocon_sock)
-		elif opts.modem_dev is not None:
-			print("Using modem for Generic SIM Access (3GPP TS 27.007)")
-			from pySim.transport.modem_atcmd import ModemATCommandLink
-			sl = ModemATCommandLink(device=opts.modem_dev, baudrate=opts.modem_baud)
-		else: # Serial reader is default
-			print("Using serial reader interface")
-			from pySim.transport.serial import SerialSimLink
-			sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)
-		return sl
-	except Exception as e:
-		print("Card reader initialization failed with exception:\n" + str(e))
-		return None
-
-
 def enc_ePDGSelection(hexstr, mcc, mnc, epdg_priority='0001', epdg_fqdn_format='00'):
 	"""
 	Encode ePDGSelection so it can be stored at EF.ePDGSelection or EF.ePDGSelectionEm.