[PATCH 3/5] HSI: ssi-protocol: export modem info via sysfs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently userspace knows about the rapuyama version by
checking, which gpios have been exported. This does no
longer work with kernel based power management, so export
a sysfs file, which provides the rapuyama generation. Also
export a link to the nokia-modem, so that userspace can
easily check if kernel based PM is used.

Signed-off-by: Sebastian Reichel <sre@xxxxxxxxxx>
---
 drivers/hsi/clients/nokia-modem.c  | 10 ++++------
 drivers/hsi/clients/ssi_protocol.c | 33 ++++++++++++++++++++++++++++++++-
 include/linux/hsi/ssi_protocol.h   | 11 +++++++++++
 3 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/drivers/hsi/clients/nokia-modem.c b/drivers/hsi/clients/nokia-modem.c
index 6485f4c61092..1b4a250cf113 100644
--- a/drivers/hsi/clients/nokia-modem.c
+++ b/drivers/hsi/clients/nokia-modem.c
@@ -35,11 +35,6 @@ module_param(pm, int, 0400);
 MODULE_PARM_DESC(pm,
 	"Enable power management (0=disabled, 1=userland based [default], 2=kernel based)");
 
-enum nokia_modem_type {
-	RAPUYAMA_V1,
-	RAPUYAMA_V2,
-};
-
 struct nokia_modem_device {
 	struct tasklet_struct	nokia_modem_rst_ind_tasklet;
 	int			nokia_modem_rst_ind_irq;
@@ -285,6 +280,7 @@ static int nokia_modem_probe(struct device *dev)
 	struct hsi_port *port = hsi_get_port(cl);
 	int irq, pflags, err;
 	struct hsi_board_info ssip;
+	struct ssi_protocol_platform_data ssip_pdata;
 	struct hsi_board_info cmtspeech;
 
 	np = dev->of_node;
@@ -340,7 +336,9 @@ static int nokia_modem_probe(struct device *dev)
 	ssip.name = "ssi-protocol";
 	ssip.tx_cfg = cl->tx_cfg;
 	ssip.rx_cfg = cl->rx_cfg;
-	ssip.platform_data = NULL;
+	ssip_pdata.type = modem->type;
+	ssip_pdata.nokia_modem_dev = dev;
+	ssip.platform_data = &ssip_pdata;
 	ssip.archdata = NULL;
 
 	modem->ssi_protocol = hsi_new_client(port, &ssip);
diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c
index cee33cab889e..3fb5b98b2c63 100644
--- a/drivers/hsi/clients/ssi_protocol.c
+++ b/drivers/hsi/clients/ssi_protocol.c
@@ -154,6 +154,7 @@ struct ssi_protocol {
 	int			channel_id_cmd;
 	int			channel_id_data;
 	struct blocking_notifier_head	modem_state_notifier;
+	enum nokia_modem_type	modem_type;
 };
 
 /* List of ssi protocol instances */
@@ -1080,10 +1081,20 @@ static void ssip_pn_setup(struct net_device *dev)
 	dev->header_ops		= &phonet_header_ops;
 }
 
+static ssize_t show_rapuyama_version(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct hsi_client *cl = to_hsi_client(dev);
+	struct ssi_protocol *ssi = hsi_client_drvdata(cl);
+
+	return sprintf(buf, "%d", ssi->modem_type);
+}
+static DEVICE_ATTR(rapuyama_version, S_IRUGO, show_rapuyama_version, 0);
+
 static int ssi_protocol_probe(struct device *dev)
 {
 	static const char ifname[] = "phonet%d";
 	struct hsi_client *cl = to_hsi_client(dev);
+	struct ssi_protocol_platform_data *pdata = dev_get_platdata(dev);
 	struct ssi_protocol *ssi;
 	int err;
 
@@ -1093,6 +1104,8 @@ static int ssi_protocol_probe(struct device *dev)
 		return -ENOMEM;
 	}
 
+	ssi->modem_type = pdata->type;
+
 	spin_lock_init(&ssi->lock);
 	init_timer_deferrable(&ssi->rx_wd);
 	init_timer_deferrable(&ssi->tx_wd);
@@ -1137,12 +1150,24 @@ static int ssi_protocol_probe(struct device *dev)
 		goto out1;
 	}
 
+	err = device_create_file(dev, &dev_attr_rapuyama_version);
+	if (err < 0) {
+		dev_err(dev, "Could not create sysfs file for rapuyama version");
+		goto out2;
+	}
+
+	err = sysfs_create_link(&dev->kobj, &pdata->nokia_modem_dev->kobj, "nokia-modem");
+	if (err < 0) {
+		dev_err(dev, "Could not create sysfs symlink to nokia-modem");
+		goto out3;
+	}
+
 	SET_NETDEV_DEV(ssi->netdev, dev);
 	netif_carrier_off(ssi->netdev);
 	err = register_netdev(ssi->netdev);
 	if (err < 0) {
 		dev_err(dev, "Register netdev failed (%d)\n", err);
-		goto out2;
+		goto out4;
 	}
 
 	list_add(&ssi->link, &ssip_list);
@@ -1151,6 +1176,10 @@ static int ssi_protocol_probe(struct device *dev)
 		ssi->channel_id_cmd, ssi->channel_id_data);
 
 	return 0;
+out4:
+	sysfs_remove_link(&dev->kobj, "nokia-modem");
+out3:
+	device_remove_file(dev, &dev_attr_rapuyama_version);
 out2:
 	free_netdev(ssi->netdev);
 out1:
@@ -1167,6 +1196,8 @@ static int ssi_protocol_remove(struct device *dev)
 	struct ssi_protocol *ssi = hsi_client_drvdata(cl);
 
 	list_del(&ssi->link);
+	sysfs_remove_link(&dev->kobj, "nokia-modem");
+	device_remove_file(dev, &dev_attr_rapuyama_version);
 	unregister_netdev(ssi->netdev);
 	ssip_free_cmds(ssi);
 	hsi_client_set_drvdata(cl, NULL);
diff --git a/include/linux/hsi/ssi_protocol.h b/include/linux/hsi/ssi_protocol.h
index 6b742e9368a7..ba069812341b 100644
--- a/include/linux/hsi/ssi_protocol.h
+++ b/include/linux/hsi/ssi_protocol.h
@@ -33,6 +33,17 @@ enum nokia_modem_state {
 	STATE_OFF,
 };
 
+enum nokia_modem_type {
+	UNKNOWN = 0,
+	RAPUYAMA_V1,
+	RAPUYAMA_V2,
+};
+
+struct ssi_protocol_platform_data {
+	enum nokia_modem_type type;
+	struct device *nokia_modem_dev;
+};
+
 static inline void ssip_slave_put_master(struct hsi_client *master)
 {
 }
-- 
2.7.0.rc3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux