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