sim: Add osim_card_{reset,close}() API

This is required to reset and close a card under software control
after opening it with osim_card_open()

Change-Id: Ie9ec66db4d54fdb1331f4ae05ca3ca4274912e9d
diff --git a/src/sim/reader_pcsc.c b/src/sim/reader_pcsc.c
index 234a9a7..fa867c0 100644
--- a/src/sim/reader_pcsc.c
+++ b/src/sim/reader_pcsc.c
@@ -156,6 +156,34 @@
 	return NULL;
 }
 
+static int pcsc_card_reset(struct osim_card_hdl *card, bool cold_reset)
+{
+	struct pcsc_reader_state *st = card->reader->priv;
+	LONG rc;
+
+	rc = SCardReconnect(st->hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0,
+			    cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD,
+			    &st->dwActiveProtocol);
+	PCSC_ERROR(rc, "SCardReconnect");
+
+	return 0;
+end:
+	return -EIO;
+}
+
+static int pcsc_card_close(struct osim_card_hdl *card)
+{
+	struct pcsc_reader_state *st = card->reader->priv;
+	LONG rc;
+
+	rc = SCardDisconnect(st->hCard, SCARD_UNPOWER_CARD);
+	PCSC_ERROR(rc, "SCardDisconnect");
+
+	return 0;
+end:
+	return -EIO;
+}
+
 
 static int pcsc_transceive(struct osim_reader_hdl *rh, struct msgb *msg)
 {
@@ -179,6 +207,8 @@
 	.name = "PC/SC",
 	.reader_open = pcsc_reader_open,
 	.card_open = pcsc_card_open,
+	.card_reset = pcsc_card_reset,
+	.card_close = pcsc_card_close,
 	.transceive = pcsc_transceive,
 };