diff --git a/drivers/staging/mfd/seco-stm32.c b/drivers/staging/mfd/seco-stm32.c index 0b5a8c687002a3006a02cb593e9f86801e1dc402..f8f34a64f22a94b45e182e8d6c76ee918c317177 100644 --- a/drivers/staging/mfd/seco-stm32.c +++ b/drivers/staging/mfd/seco-stm32.c @@ -45,6 +45,7 @@ struct stm32 { struct mutex lock; int irq_base; int irq_map[STM32_IRQ_MAX]; + unsigned char chip_id, fw_ver; //unsigned int irq_mask; //struct mutex i2c_lock; //struct mutex irq_lock; @@ -466,6 +467,27 @@ static void stm32_irq_flow_handler(struct irq_desc *desc) } #endif + +// sysfs +// can be found in /sys/bus/i2c/devices/b-aaaa +// were b is the bus number and aaaa is the address in hex +static ssize_t fw_ver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct stm32 *stm32=dev_get_drvdata(dev); + return sprintf(buf, "0x%02hhx\n",stm32->fw_ver); +} +static DEVICE_ATTR_RO(fw_ver); + +static ssize_t chip_id_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct stm32 *stm32=dev_get_drvdata(dev); + return sprintf(buf, "0x%02hhx\n",stm32->chip_id); +} +static DEVICE_ATTR_RO(chip_id); + + // parse the device tree //static int stm32_parse_dt(struct device *dev, struct stm32 *stm32) static int stm32_parse_dt(struct i2c_client *client, struct stm32 *stm32) @@ -598,6 +620,13 @@ static int stm32_probe(struct i2c_client *client, struct stm32 *stm32; dev_info(dev,"%s\n", __FUNCTION__); + + // allocate memory for private data + stm32=devm_kzalloc(dev, sizeof(*stm32), GFP_KERNEL); + if(!stm32) + return -ENOMEM; + stm32->pwm_chip.dev=dev; + // read the chip id err=i2c_xfer(client, STM32_READ, STM32_REG_ID, 0); if(err < 0) @@ -612,6 +641,7 @@ static int stm32_probe(struct i2c_client *client, dev_err(dev, "%s: invalid chip id (0x%02x)\n", __FUNCTION__, err); return -ENOENT; } + stm32->chip_id=(unsigned char)err; dev_info(dev, "%s: chip id: 0x%02x\n", __FUNCTION__, err); // read firmware version @@ -622,19 +652,15 @@ static int stm32_probe(struct i2c_client *client, __FUNCTION__, err); return err; } + stm32->fw_ver=(unsigned char)err; dev_info(dev,"%s: firmware 0x%02x\n", __FUNCTION__, err); - // allocate memory for private data and fill it from the device tree - stm32=devm_kzalloc(dev, sizeof(*stm32), GFP_KERNEL); - if(!stm32) - return -ENOMEM; - - stm32->pwm_chip.dev=dev; + // fill private data from the device tree err=stm32_parse_dt(client, stm32); if(err) return err; - if(!stm32->pwm_chip.npwm && !stm32->gpio_chip.ngpio) + if(!stm32->pwm_chip.npwm && !stm32->gpio_chip.ngpio && !client->irq) return -ENOENT; mutex_init(&stm32->lock); dev_set_drvdata(dev, stm32); @@ -695,6 +721,10 @@ static int stm32_probe(struct i2c_client *client, return err; } + // add sysfs entries + device_create_file(dev, &dev_attr_chip_id); + device_create_file(dev, &dev_attr_fw_ver); + dev_info(dev, "%s: OK\n", __FUNCTION__); return 0;