diff options
| author | Sage Weil <sage@inktank.com> | 2013-08-15 11:11:45 -0700 | 
|---|---|---|
| committer | Sage Weil <sage@inktank.com> | 2013-08-15 11:11:45 -0700 | 
| commit | ee3e542fec6e69bc9fb668698889a37d93950ddf (patch) | |
| tree | e74ee766a4764769ef1d3d45d266b4dea64101d3 /drivers/misc | |
| parent | fe2a801b50c0bb8039d627e5ae1fec249d10ff39 (diff) | |
| parent | f1d6e17f540af37bb1891480143669ba7636c4cf (diff) | |
Merge remote-tracking branch 'linus/master' into testing
Diffstat (limited to 'drivers/misc')
40 files changed, 526 insertions, 584 deletions
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index c002d8660e3..8dacd4c9ee8 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -135,7 +135,7 @@ config PHANTOM  config INTEL_MID_PTI  	tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard" -	depends on PCI && TTY +	depends on PCI && TTY && (X86_INTEL_MID || COMPILE_TEST)  	default n  	help  	  The PTI (Parallel Trace Interface) driver directs @@ -480,6 +480,7 @@ config BMP085_SPI  config PCH_PHUB  	tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) PHUB" +	select GENERIC_NET_UTILS  	depends on PCI  	help  	  This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of diff --git a/drivers/misc/ad525x_dpot.c b/drivers/misc/ad525x_dpot.c index 8f99e8e3f0a..0daadcf1ed7 100644 --- a/drivers/misc/ad525x_dpot.c +++ b/drivers/misc/ad525x_dpot.c @@ -470,7 +470,7 @@ static ssize_t sysfs_set_reg(struct device *dev,  		!test_bit(DPOT_RDAC_MASK & reg, data->otp_en_mask))  		return -EPERM; -	err = strict_strtoul(buf, 10, &value); +	err = kstrtoul(buf, 10, &value);  	if (err)  		return err; diff --git a/drivers/misc/apds9802als.c b/drivers/misc/apds9802als.c index 5b5fd8416b3..0c6e037153d 100644 --- a/drivers/misc/apds9802als.c +++ b/drivers/misc/apds9802als.c @@ -126,8 +126,9 @@ static ssize_t als_sensing_range_store(struct device *dev,  	int ret_val;  	unsigned long val; -	if (strict_strtoul(buf, 10, &val)) -		return -EINVAL; +	ret_val = kstrtoul(buf, 10, &val); +	if (ret_val) +		return ret_val;  	if (val < 4096)  		val = 1; diff --git a/drivers/misc/apds990x.c b/drivers/misc/apds990x.c index 98f9bb26492..868a30a1b41 100644 --- a/drivers/misc/apds990x.c +++ b/drivers/misc/apds990x.c @@ -696,9 +696,11 @@ static ssize_t apds990x_lux_calib_store(struct device *dev,  {  	struct apds990x_chip *chip = dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	chip->lux_calib = value; @@ -759,8 +761,9 @@ static ssize_t apds990x_rate_store(struct device *dev,  	unsigned long value;  	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	ret = apds990x_set_arate(chip, value); @@ -813,9 +816,11 @@ static ssize_t apds990x_prox_enable_store(struct device *dev,  {  	struct apds990x_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex); @@ -892,11 +897,12 @@ static ssize_t apds990x_lux_thresh_below_show(struct device *dev,  static ssize_t apds990x_set_lux_thresh(struct apds990x_chip *chip, u32 *target,  				const char *buf)  { -	int ret = 0;  	unsigned long thresh; +	int ret; -	if (strict_strtoul(buf, 0, &thresh)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &thresh); +	if (ret) +		return ret;  	if (thresh > APDS_RANGE)  		return -EINVAL; @@ -957,9 +963,11 @@ static ssize_t apds990x_prox_threshold_store(struct device *dev,  {  	struct apds990x_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	if ((value > APDS_RANGE) || (value == 0) ||  		(value < APDS_PROX_HYSTERESIS)) @@ -990,9 +998,12 @@ static ssize_t apds990x_power_state_store(struct device *dev,  {  	struct apds990x_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; + +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL;  	if (value) {  		pm_runtime_get_sync(dev);  		mutex_lock(&chip->mutex); diff --git a/drivers/misc/arm-charlcd.c b/drivers/misc/arm-charlcd.c index 48651ef0028..1256a4bf1c0 100644 --- a/drivers/misc/arm-charlcd.c +++ b/drivers/misc/arm-charlcd.c @@ -291,7 +291,7 @@ static int __init charlcd_probe(struct platform_device *pdev)  	lcd->virtbase = ioremap(lcd->phybase, lcd->physize);  	if (!lcd->virtbase) {  		ret = -ENOMEM; -		goto out_no_remap; +		goto out_no_memregion;  	}  	lcd->irq = platform_get_irq(pdev, 0); @@ -320,8 +320,6 @@ static int __init charlcd_probe(struct platform_device *pdev)  out_no_irq:  	iounmap(lcd->virtbase); -out_no_remap: -	platform_set_drvdata(pdev, NULL);  out_no_memregion:  	release_mem_region(lcd->phybase, SZ_4K);  out_no_resource: @@ -337,7 +335,6 @@ static int __exit charlcd_remove(struct platform_device *pdev)  		free_irq(lcd->irq, lcd);  		iounmap(lcd->virtbase);  		release_mem_region(lcd->phybase, lcd->physize); -		platform_set_drvdata(pdev, NULL);  		kfree(lcd);  	} diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c index 1abd5ad5992..e068a76a5f6 100644 --- a/drivers/misc/atmel-ssc.c +++ b/drivers/misc/atmel-ssc.c @@ -58,7 +58,7 @@ struct ssc_device *ssc_request(unsigned int ssc_num)  	ssc->user++;  	spin_unlock(&user_lock); -	clk_enable(ssc->clk); +	clk_prepare_enable(ssc->clk);  	return ssc;  } @@ -66,14 +66,19 @@ EXPORT_SYMBOL(ssc_request);  void ssc_free(struct ssc_device *ssc)  { +	bool disable_clk = true; +  	spin_lock(&user_lock); -	if (ssc->user) { +	if (ssc->user)  		ssc->user--; -		clk_disable(ssc->clk); -	} else { +	else { +		disable_clk = false;  		dev_dbg(&ssc->pdev->dev, "device already free\n");  	}  	spin_unlock(&user_lock); + +	if (disable_clk) +		clk_disable_unprepare(ssc->clk);  }  EXPORT_SYMBOL(ssc_free); @@ -167,10 +172,10 @@ static int ssc_probe(struct platform_device *pdev)  	}  	/* disable all interrupts */ -	clk_enable(ssc->clk); +	clk_prepare_enable(ssc->clk);  	ssc_writel(ssc->regs, IDR, -1);  	ssc_readl(ssc->regs, SR); -	clk_disable(ssc->clk); +	clk_disable_unprepare(ssc->clk);  	ssc->irq = platform_get_irq(pdev, 0);  	if (!ssc->irq) { diff --git a/drivers/misc/bh1770glc.c b/drivers/misc/bh1770glc.c index f4975f7d0d5..99a04686e45 100644 --- a/drivers/misc/bh1770glc.c +++ b/drivers/misc/bh1770glc.c @@ -651,8 +651,9 @@ static ssize_t bh1770_power_state_store(struct device *dev,  	unsigned long value;  	ssize_t ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	if (value) { @@ -726,9 +727,11 @@ static ssize_t bh1770_prox_enable_store(struct device *dev,  {  	struct bh1770_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	/* Assume no proximity. Sensor will tell real state soon */ @@ -824,9 +827,11 @@ static ssize_t bh1770_set_prox_rate_above(struct device *dev,  {  	struct bh1770_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	chip->prox_rate_threshold = bh1770_prox_rate_validate(value); @@ -840,9 +845,11 @@ static ssize_t bh1770_set_prox_rate_below(struct device *dev,  {  	struct bh1770_chip *chip =  dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	chip->prox_rate = bh1770_prox_rate_validate(value); @@ -865,8 +872,10 @@ static ssize_t bh1770_set_prox_thres(struct device *dev,  	unsigned long value;  	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret; +  	if (value > BH1770_PROX_RANGE)  		return -EINVAL; @@ -893,9 +902,11 @@ static ssize_t bh1770_prox_persistence_store(struct device *dev,  {  	struct bh1770_chip *chip = dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	if (value > BH1770_PROX_MAX_PERSISTENCE)  		return -EINVAL; @@ -918,9 +929,11 @@ static ssize_t bh1770_prox_abs_thres_store(struct device *dev,  {  	struct bh1770_chip *chip = dev_get_drvdata(dev);  	unsigned long value; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	if (value > BH1770_PROX_RANGE)  		return -EINVAL; @@ -963,9 +976,11 @@ static ssize_t bh1770_lux_calib_store(struct device *dev,  	unsigned long value;  	u32 old_calib;  	u32 new_corr; +	int ret; -	if (strict_strtoul(buf, 0, &value)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &value); +	if (ret) +		return ret;  	mutex_lock(&chip->mutex);  	old_calib = chip->lux_calib; @@ -1012,8 +1027,9 @@ static ssize_t bh1770_set_lux_rate(struct device *dev,  	unsigned long rate_hz;  	int ret, i; -	if (strict_strtoul(buf, 0, &rate_hz)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &rate_hz); +	if (ret) +		return ret;  	for (i = 0; i < ARRAY_SIZE(lux_rates_hz) - 1; i++)  		if (rate_hz >= lux_rates_hz[i]) @@ -1047,11 +1063,12 @@ static ssize_t bh1770_get_lux_thresh_below(struct device *dev,  static ssize_t bh1770_set_lux_thresh(struct bh1770_chip *chip, u16 *target,  				const char *buf)  { -	int ret = 0;  	unsigned long thresh; +	int ret; -	if (strict_strtoul(buf, 0, &thresh)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &thresh); +	if (ret) +		return ret;  	if (thresh > BH1770_LUX_RANGE)  		return -EINVAL; diff --git a/drivers/misc/bh1780gli.c b/drivers/misc/bh1780gli.c index 818f3a0e62b..057580e026c 100644 --- a/drivers/misc/bh1780gli.c +++ b/drivers/misc/bh1780gli.c @@ -107,7 +107,7 @@ static ssize_t bh1780_store_power_state(struct device *dev,  	unsigned long val;  	int error; -	error = strict_strtoul(buf, 0, &val); +	error = kstrtoul(buf, 0, &val);  	if (error)  		return error; diff --git a/drivers/misc/carma/carma-fpga-program.c b/drivers/misc/carma/carma-fpga-program.c index 736c7714f56..c6bd7e84de2 100644 --- a/drivers/misc/carma/carma-fpga-program.c +++ b/drivers/misc/carma/carma-fpga-program.c @@ -830,8 +830,9 @@ static ssize_t penable_store(struct device *dev, struct device_attribute *attr,  	unsigned long val;  	int ret; -	if (strict_strtoul(buf, 0, &val)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &val); +	if (ret) +		return ret;  	if (val) {  		ret = fpga_enable_power_supplies(priv); @@ -859,8 +860,9 @@ static ssize_t program_store(struct device *dev, struct device_attribute *attr,  	unsigned long val;  	int ret; -	if (strict_strtoul(buf, 0, &val)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &val); +	if (ret) +		return ret;  	/* We can't have an image writer and be programming simultaneously */  	if (mutex_lock_interruptible(&priv->lock)) @@ -919,7 +921,7 @@ static bool dma_filter(struct dma_chan *chan, void *data)  static int fpga_of_remove(struct platform_device *op)  { -	struct fpga_dev *priv = dev_get_drvdata(&op->dev); +	struct fpga_dev *priv = platform_get_drvdata(op);  	struct device *this_device = priv->miscdev.this_device;  	sysfs_remove_group(&this_device->kobj, &fpga_attr_group); @@ -969,7 +971,7 @@ static int fpga_of_probe(struct platform_device *op)  	kref_init(&priv->ref); -	dev_set_drvdata(&op->dev, priv); +	platform_set_drvdata(op, priv);  	priv->dev = &op->dev;  	mutex_init(&priv->lock);  	init_completion(&priv->completion); diff --git a/drivers/misc/carma/carma-fpga.c b/drivers/misc/carma/carma-fpga.c index 7508cafff10..7b56563f8b7 100644 --- a/drivers/misc/carma/carma-fpga.c +++ b/drivers/misc/carma/carma-fpga.c @@ -1002,10 +1002,10 @@ static ssize_t data_en_set(struct device *dev, struct device_attribute *attr,  	unsigned long enable;  	int ret; -	ret = strict_strtoul(buf, 0, &enable); +	ret = kstrtoul(buf, 0, &enable);  	if (ret) {  		dev_err(priv->dev, "unable to parse enable input\n"); -		return -EINVAL; +		return ret;  	}  	/* protect against concurrent enable/disable */ @@ -1296,7 +1296,7 @@ static int data_of_probe(struct platform_device *op)  		goto out_return;  	} -	dev_set_drvdata(&op->dev, priv); +	platform_set_drvdata(op, priv);  	priv->dev = &op->dev;  	kref_init(&priv->ref);  	mutex_init(&priv->mutex); @@ -1400,7 +1400,7 @@ out_return:  static int data_of_remove(struct platform_device *op)  { -	struct fpga_device *priv = dev_get_drvdata(&op->dev); +	struct fpga_device *priv = platform_get_drvdata(op);  	struct device *this_device = priv->miscdev.this_device;  	/* remove all sysfs files, now the device cannot be re-enabled */ diff --git a/drivers/misc/dummy-irq.c b/drivers/misc/dummy-irq.c index c37eeedfe21..4d0db15df11 100644 --- a/drivers/misc/dummy-irq.c +++ b/drivers/misc/dummy-irq.c @@ -26,7 +26,7 @@ static irqreturn_t dummy_interrupt(int irq, void *dev_id)  	static int count = 0;  	if (count == 0) { -		printk(KERN_INFO "dummy-irq: interrupt occured on IRQ %d\n", +		printk(KERN_INFO "dummy-irq: interrupt occurred on IRQ %d\n",  				irq);  		count++;  	} diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 2baeec56edf..5d4fd69d04c 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -492,10 +492,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  	if (client->dev.platform_data) {  		chip = *(struct at24_platform_data *)client->dev.platform_data;  	} else { -		if (!id->driver_data) { -			err = -ENODEV; -			goto err_out; -		} +		if (!id->driver_data) +			return -ENODEV; +  		magic = id->driver_data;  		chip.byte_len = BIT(magic & AT24_BITMASK(AT24_SIZE_BYTELEN));  		magic >>= AT24_SIZE_BYTELEN; @@ -519,8 +518,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  			"byte_len looks suspicious (no power of 2)!\n");  	if (!chip.page_size) {  		dev_err(&client->dev, "page_size must not be 0!\n"); -		err = -EINVAL; -		goto err_out; +		return -EINVAL;  	}  	if (!is_power_of_2(chip.page_size))  		dev_warn(&client->dev, @@ -528,10 +526,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  	/* Use I2C operations unless we're stuck with SMBus extensions. */  	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { -		if (chip.flags & AT24_FLAG_ADDR16) { -			err = -EPFNOSUPPORT; -			goto err_out; -		} +		if (chip.flags & AT24_FLAG_ADDR16) +			return -EPFNOSUPPORT; +  		if (i2c_check_functionality(client->adapter,  				I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {  			use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; @@ -542,8 +539,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  				I2C_FUNC_SMBUS_READ_BYTE_DATA)) {  			use_smbus = I2C_SMBUS_BYTE_DATA;  		} else { -			err = -EPFNOSUPPORT; -			goto err_out; +			return -EPFNOSUPPORT;  		}  	} @@ -553,12 +549,10 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  		num_addresses =	DIV_ROUND_UP(chip.byte_len,  			(chip.flags & AT24_FLAG_ADDR16) ? 65536 : 256); -	at24 = kzalloc(sizeof(struct at24_data) + +	at24 = devm_kzalloc(&client->dev, sizeof(struct at24_data) +  		num_addresses * sizeof(struct i2c_client *), GFP_KERNEL); -	if (!at24) { -		err = -ENOMEM; -		goto err_out; -	} +	if (!at24) +		return -ENOMEM;  	mutex_init(&at24->lock);  	at24->use_smbus = use_smbus; @@ -596,11 +590,10 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  			at24->write_max = write_max;  			/* buffer (data + address at the beginning) */ -			at24->writebuf = kmalloc(write_max + 2, GFP_KERNEL); -			if (!at24->writebuf) { -				err = -ENOMEM; -				goto err_struct; -			} +			at24->writebuf = devm_kzalloc(&client->dev, +				write_max + 2, GFP_KERNEL); +			if (!at24->writebuf) +				return -ENOMEM;  		} else {  			dev_warn(&client->dev,  				"cannot write due to controller restrictions."); @@ -648,11 +641,6 @@ err_clients:  		if (at24->client[i])  			i2c_unregister_device(at24->client[i]); -	kfree(at24->writebuf); -err_struct: -	kfree(at24); -err_out: -	dev_dbg(&client->dev, "probe error %d\n", err);  	return err;  } @@ -667,8 +655,6 @@ static int at24_remove(struct i2c_client *client)  	for (i = 1; i < at24->num_addresses; i++)  		i2c_unregister_device(at24->client[i]); -	kfree(at24->writebuf); -	kfree(at24);  	return 0;  } diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c index ad8fd8e6493..840b3594a5a 100644 --- a/drivers/misc/eeprom/at25.c +++ b/drivers/misc/eeprom/at25.c @@ -371,11 +371,10 @@ static int at25_probe(struct spi_device *spi)  		if (np) {  			err = at25_np_to_chip(&spi->dev, np, &chip);  			if (err) -				goto fail; +				return err;  		} else {  			dev_err(&spi->dev, "Error: no chip description\n"); -			err = -ENODEV; -			goto fail; +			return -ENODEV;  		}  	} else  		chip = *(struct spi_eeprom *)spi->dev.platform_data; @@ -389,8 +388,7 @@ static int at25_probe(struct spi_device *spi)  		addrlen = 3;  	else {  		dev_dbg(&spi->dev, "unsupported address type\n"); -		err = -EINVAL; -		goto fail; +		return -EINVAL;  	}  	/* Ping the chip ... the status register is pretty portable, @@ -400,14 +398,12 @@ static int at25_probe(struct spi_device *spi)  	sr = spi_w8r8(spi, AT25_RDSR);  	if (sr < 0 || sr & AT25_SR_nRDY) {  		dev_dbg(&spi->dev, "rdsr --> %d (%02x)\n", sr, sr); -		err = -ENXIO; -		goto fail; +		return -ENXIO;  	} -	if (!(at25 = kzalloc(sizeof *at25, GFP_KERNEL))) { -		err = -ENOMEM; -		goto fail; -	} +	at25 = devm_kzalloc(&spi->dev, sizeof(struct at25_data), GFP_KERNEL); +	if (!at25) +		return -ENOMEM;  	mutex_init(&at25->lock);  	at25->chip = chip; @@ -439,7 +435,7 @@ static int at25_probe(struct spi_device *spi)  	err = sysfs_create_bin_file(&spi->dev.kobj, &at25->bin);  	if (err) -		goto fail; +		return err;  	if (chip.setup)  		chip.setup(&at25->mem, chip.context); @@ -453,10 +449,6 @@ static int at25_probe(struct spi_device *spi)  		(chip.flags & EE_READONLY) ? " (readonly)" : "",  		at25->chip.page_size);  	return 0; -fail: -	dev_dbg(&spi->dev, "probe err %d\n", err); -	kfree(at25); -	return err;  }  static int at25_remove(struct spi_device *spi) @@ -465,7 +457,6 @@ static int at25_remove(struct spi_device *spi)  	at25 = spi_get_drvdata(spi);  	sysfs_remove_bin_file(&spi->dev.kobj, &at25->bin); -	kfree(at25);  	return 0;  } diff --git a/drivers/misc/ep93xx_pwm.c b/drivers/misc/ep93xx_pwm.c index 96787ec15ca..cdb67a9c195 100644 --- a/drivers/misc/ep93xx_pwm.c +++ b/drivers/misc/ep93xx_pwm.c @@ -39,63 +39,6 @@ struct ep93xx_pwm {  	u32		duty_percent;  }; -static inline void ep93xx_pwm_writel(struct ep93xx_pwm *pwm, -		unsigned int val, unsigned int off) -{ -	__raw_writel(val, pwm->mmio_base + off); -} - -static inline unsigned int ep93xx_pwm_readl(struct ep93xx_pwm *pwm, -		unsigned int off) -{ -	return __raw_readl(pwm->mmio_base + off); -} - -static inline void ep93xx_pwm_write_tc(struct ep93xx_pwm *pwm, u16 value) -{ -	ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_TERM_COUNT); -} - -static inline u16 ep93xx_pwm_read_tc(struct ep93xx_pwm *pwm) -{ -	return ep93xx_pwm_readl(pwm, EP93XX_PWMx_TERM_COUNT); -} - -static inline void ep93xx_pwm_write_dc(struct ep93xx_pwm *pwm, u16 value) -{ -	ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_DUTY_CYCLE); -} - -static inline void ep93xx_pwm_enable(struct ep93xx_pwm *pwm) -{ -	ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_ENABLE); -} - -static inline void ep93xx_pwm_disable(struct ep93xx_pwm *pwm) -{ -	ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_ENABLE); -} - -static inline int ep93xx_pwm_is_enabled(struct ep93xx_pwm *pwm) -{ -	return ep93xx_pwm_readl(pwm, EP93XX_PWMx_ENABLE) & 0x1; -} - -static inline void ep93xx_pwm_invert(struct ep93xx_pwm *pwm) -{ -	ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_INVERT); -} - -static inline void ep93xx_pwm_normal(struct ep93xx_pwm *pwm) -{ -	ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_INVERT); -} - -static inline int ep93xx_pwm_is_inverted(struct ep93xx_pwm *pwm) -{ -	return ep93xx_pwm_readl(pwm, EP93XX_PWMx_INVERT) & 0x1; -} -  /*   * /sys/devices/platform/ep93xx-pwm.N   *   /min_freq      read-only   minimum pwm output frequency @@ -131,9 +74,9 @@ static ssize_t ep93xx_pwm_get_freq(struct device *dev,  	struct platform_device *pdev = to_platform_device(dev);  	struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); -	if (ep93xx_pwm_is_enabled(pwm)) { +	if (readl(pwm->mmio_base + EP93XX_PWMx_ENABLE) & 0x1) {  		unsigned long rate = clk_get_rate(pwm->clk); -		u16 term = ep93xx_pwm_read_tc(pwm); +		u16 term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT);  		return sprintf(buf, "%ld\n", rate / (term + 1));  	} else { @@ -149,12 +92,12 @@ static ssize_t ep93xx_pwm_set_freq(struct device *dev,  	long val;  	int err; -	err = strict_strtol(buf, 10, &val); +	err = kstrtol(buf, 10, &val);  	if (err)  		return -EINVAL;  	if (val == 0) { -		ep93xx_pwm_disable(pwm); +		writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE);  	} else if (val <= (clk_get_rate(pwm->clk) / 2)) {  		u32 term, duty; @@ -164,20 +107,20 @@ static ssize_t ep93xx_pwm_set_freq(struct device *dev,  		if (val < 1)  			val = 1; -		term = ep93xx_pwm_read_tc(pwm); +		term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT);  		duty = ((val + 1) * pwm->duty_percent / 100) - 1;  		/* If pwm is running, order is important */  		if (val > term) { -			ep93xx_pwm_write_tc(pwm, val); -			ep93xx_pwm_write_dc(pwm, duty); +			writel(val, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); +			writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE);  		} else { -			ep93xx_pwm_write_dc(pwm, duty); -			ep93xx_pwm_write_tc(pwm, val); +			writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE); +			writel(val, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT);  		} -		if (!ep93xx_pwm_is_enabled(pwm)) -			ep93xx_pwm_enable(pwm); +		if (!readl(pwm->mmio_base + EP93XX_PWMx_ENABLE) & 0x1) +			writel(0x1, pwm->mmio_base + EP93XX_PWMx_ENABLE);  	} else {  		return -EINVAL;  	} @@ -202,13 +145,15 @@ static ssize_t ep93xx_pwm_set_duty_percent(struct device *dev,  	long val;  	int err; -	err = strict_strtol(buf, 10, &val); +	err = kstrtol(buf, 10, &val);  	if (err)  		return -EINVAL;  	if (val > 0 && val < 100) { -		u32 term = ep93xx_pwm_read_tc(pwm); -		ep93xx_pwm_write_dc(pwm, ((term + 1) * val / 100) - 1); +		u32 term = readl(pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); +		u32 duty = ((term + 1) * val / 100) - 1; + +		writel(duty, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE);  		pwm->duty_percent = val;  		return count;  	} @@ -221,8 +166,9 @@ static ssize_t ep93xx_pwm_get_invert(struct device *dev,  {  	struct platform_device *pdev = to_platform_device(dev);  	struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); +	int inverted = readl(pwm->mmio_base + EP93XX_PWMx_INVERT) & 0x1; -	return sprintf(buf, "%d\n", ep93xx_pwm_is_inverted(pwm)); +	return sprintf(buf, "%d\n", inverted);  }  static ssize_t ep93xx_pwm_set_invert(struct device *dev, @@ -233,14 +179,14 @@ static ssize_t ep93xx_pwm_set_invert(struct device *dev,  	long val;  	int err; -	err = strict_strtol(buf, 10, &val); +	err = kstrtol(buf, 10, &val);  	if (err)  		return -EINVAL;  	if (val == 0) -		ep93xx_pwm_normal(pwm); +		writel(0x0, pwm->mmio_base + EP93XX_PWMx_INVERT);  	else if (val == 1) -		ep93xx_pwm_invert(pwm); +		writel(0x1, pwm->mmio_base + EP93XX_PWMx_INVERT);  	else  		return -EINVAL; @@ -269,89 +215,55 @@ static const struct attribute_group ep93xx_pwm_sysfs_files = {  	.attrs	= ep93xx_pwm_attrs,  }; -static int __init ep93xx_pwm_probe(struct platform_device *pdev) +static int ep93xx_pwm_probe(struct platform_device *pdev)  {  	struct ep93xx_pwm *pwm;  	struct resource *res; -	int err; +	int ret; -	err = ep93xx_pwm_acquire_gpio(pdev); -	if (err) -		return err; +	pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); +	if (!pwm) +		return -ENOMEM; -	pwm = kzalloc(sizeof(struct ep93xx_pwm), GFP_KERNEL); -	if (!pwm) { -		err = -ENOMEM; -		goto fail_no_mem; -	} +	pwm->clk = devm_clk_get(&pdev->dev, "pwm_clk"); +	if (IS_ERR(pwm->clk)) +		return PTR_ERR(pwm->clk);  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (res == NULL) { -		err = -ENXIO; -		goto fail_no_mem_resource; -	} - -	res = request_mem_region(res->start, resource_size(res), pdev->name); -	if (res == NULL) { -		err = -EBUSY; -		goto fail_no_mem_resource; -	} - -	pwm->mmio_base = ioremap(res->start, resource_size(res)); -	if (pwm->mmio_base == NULL) { -		err = -ENXIO; -		goto fail_no_ioremap; -	} - -	err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); -	if (err) -		goto fail_no_sysfs; - -	pwm->clk = clk_get(&pdev->dev, "pwm_clk"); -	if (IS_ERR(pwm->clk)) { -		err = PTR_ERR(pwm->clk); -		goto fail_no_clk; +	pwm->mmio_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(pwm->mmio_base)) +		return PTR_ERR(pwm->mmio_base); + +	ret = ep93xx_pwm_acquire_gpio(pdev); +	if (ret) +		return ret; + +	ret = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); +	if (ret) { +		ep93xx_pwm_release_gpio(pdev); +		return ret;  	}  	pwm->duty_percent = 50; -	platform_set_drvdata(pdev, pwm); -  	/* disable pwm at startup. Avoids zero value. */ -	ep93xx_pwm_disable(pwm); -	ep93xx_pwm_write_tc(pwm, EP93XX_PWM_MAX_COUNT); -	ep93xx_pwm_write_dc(pwm, EP93XX_PWM_MAX_COUNT / 2); +	writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE); +	writel(EP93XX_PWM_MAX_COUNT, pwm->mmio_base + EP93XX_PWMx_TERM_COUNT); +	writel(EP93XX_PWM_MAX_COUNT/2, pwm->mmio_base + EP93XX_PWMx_DUTY_CYCLE);  	clk_enable(pwm->clk); +	platform_set_drvdata(pdev, pwm);  	return 0; - -fail_no_clk: -	sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); -fail_no_sysfs: -	iounmap(pwm->mmio_base); -fail_no_ioremap: -	release_mem_region(res->start, resource_size(res)); -fail_no_mem_resource: -	kfree(pwm); -fail_no_mem: -	ep93xx_pwm_release_gpio(pdev); -	return err;  } -static int __exit ep93xx_pwm_remove(struct platform_device *pdev) +static int ep93xx_pwm_remove(struct platform_device *pdev)  {  	struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); -	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	ep93xx_pwm_disable(pwm); +	writel(0x0, pwm->mmio_base + EP93XX_PWMx_ENABLE);  	clk_disable(pwm->clk); -	clk_put(pwm->clk); -	platform_set_drvdata(pdev, NULL);  	sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); -	iounmap(pwm->mmio_base); -	release_mem_region(res->start, resource_size(res)); -	kfree(pwm);  	ep93xx_pwm_release_gpio(pdev);  	return 0; @@ -362,10 +274,10 @@ static struct platform_driver ep93xx_pwm_driver = {  		.name	= "ep93xx-pwm",  		.owner	= THIS_MODULE,  	}, -	.remove		= __exit_p(ep93xx_pwm_remove), +	.probe		= ep93xx_pwm_probe, +	.remove		= ep93xx_pwm_remove,  }; - -module_platform_driver_probe(ep93xx_pwm_driver, ep93xx_pwm_probe); +module_platform_driver(ep93xx_pwm_driver);  MODULE_AUTHOR("Matthieu Crapet <mcrapet@gmail.com>, "  	      "H Hartley Sweeten <hsweeten@visionengravers.com>"); diff --git a/drivers/misc/hmc6352.c b/drivers/misc/hmc6352.c index 423cd40f1c0..170bd3daf33 100644 --- a/drivers/misc/hmc6352.c +++ b/drivers/misc/hmc6352.c @@ -46,8 +46,9 @@ static int compass_store(struct device *dev, const char *buf, size_t count,  	int ret;  	unsigned long val; -	if (strict_strtoul(buf, 10, &val)) -		return -EINVAL; +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret;  	if (val >= strlen(map))  		return -EINVAL;  	mutex_lock(&compass_mutex); diff --git a/drivers/misc/isl29003.c b/drivers/misc/isl29003.c index c5145b3fcce..e3183f26216 100644 --- a/drivers/misc/isl29003.c +++ b/drivers/misc/isl29003.c @@ -208,7 +208,11 @@ static ssize_t isl29003_store_range(struct device *dev,  	unsigned long val;  	int ret; -	if ((strict_strtoul(buf, 10, &val) < 0) || (val > 3)) +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret; + +	if (val > 3)  		return -EINVAL;  	ret = isl29003_set_range(client, val); @@ -239,7 +243,11 @@ static ssize_t isl29003_store_resolution(struct device *dev,  	unsigned long val;  	int ret; -	if ((strict_strtoul(buf, 10, &val) < 0) || (val > 3)) +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret; + +	if (val > 3)  		return -EINVAL;  	ret = isl29003_set_resolution(client, val); @@ -267,7 +275,11 @@ static ssize_t isl29003_store_mode(struct device *dev,  	unsigned long val;  	int ret; -	if ((strict_strtoul(buf, 10, &val) < 0) || (val > 2)) +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret; + +	if (val > 2)  		return -EINVAL;  	ret = isl29003_set_mode(client, val); @@ -298,7 +310,11 @@ static ssize_t isl29003_store_power_state(struct device *dev,  	unsigned long val;  	int ret; -	if ((strict_strtoul(buf, 10, &val) < 0) || (val > 1)) +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret; + +	if (val > 1)  		return -EINVAL;  	ret = isl29003_set_power_state(client, val); diff --git a/drivers/misc/isl29020.c b/drivers/misc/isl29020.c index 0aa08c74646..b7f84dacf82 100644 --- a/drivers/misc/isl29020.c +++ b/drivers/misc/isl29020.c @@ -90,8 +90,10 @@ static ssize_t als_sensing_range_store(struct device *dev,  	int ret_val;  	unsigned long val; -	if (strict_strtoul(buf, 10, &val)) -		return -EINVAL; +	ret_val = kstrtoul(buf, 10, &val); +	if (ret_val) +		return ret_val; +  	if (val < 1 || val > 64000)  		return -EINVAL; diff --git a/drivers/misc/lattice-ecp3-config.c b/drivers/misc/lattice-ecp3-config.c index bb26f086bd8..61fbe6acabe 100644 --- a/drivers/misc/lattice-ecp3-config.c +++ b/drivers/misc/lattice-ecp3-config.c @@ -170,7 +170,7 @@ static void firmware_load(const struct firmware *fw, void *context)  	/* Check result */  	if (status & FPGA_STATUS_DONE) -		dev_info(&spi->dev, "FPGA succesfully configured!\n"); +		dev_info(&spi->dev, "FPGA successfully configured!\n");  	else  		dev_info(&spi->dev, "FPGA not configured (DONE not set)\n"); diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c index 4cd4a3d2a76..036effe9a79 100644 --- a/drivers/misc/lis3lv02d/lis3lv02d.c +++ b/drivers/misc/lis3lv02d/lis3lv02d.c @@ -831,9 +831,11 @@ static ssize_t lis3lv02d_rate_set(struct device *dev,  {  	struct lis3lv02d *lis3 = dev_get_drvdata(dev);  	unsigned long rate; +	int ret; -	if (strict_strtoul(buf, 0, &rate)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &rate); +	if (ret) +		return ret;  	lis3lv02d_sysfs_poweron(lis3);  	if (lis3lv02d_set_odr(lis3, rate)) diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index b3e50984d2c..749452f8e2f 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c @@ -443,11 +443,11 @@ unsigned int mei_amthif_poll(struct mei_device *dev,   *   * returns 0, OK; otherwise, error.   */ -int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, -			struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list) +int mei_amthif_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, +				  s32 *slots, struct mei_cl_cb *cmpl_list)  { +	struct mei_device *dev = cl->dev;  	struct mei_msg_hdr mei_hdr; -	struct mei_cl *cl = cb->cl;  	size_t len = dev->iamthif_msg_buf_size - dev->iamthif_msg_buf_index;  	u32 msg_slots = mei_data2slots(len); diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index e310ca6ed1a..21d3f5aa835 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c @@ -485,7 +485,6 @@ int mei_cl_connect(struct mei_cl *cl, struct file *file)  {  	struct mei_device *dev;  	struct mei_cl_cb *cb; -	long timeout = mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT);  	int rets;  	if (WARN_ON(!cl || !cl->dev)) @@ -518,7 +517,7 @@ int mei_cl_connect(struct mei_cl *cl, struct file *file)  	rets = wait_event_timeout(dev->wait_recvd_msg,  				 (cl->state == MEI_FILE_CONNECTED ||  				  cl->state == MEI_FILE_DISCONNECTED), -				 timeout * HZ); +				 mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));  	mutex_lock(&dev->device_lock);  	if (cl->state != MEI_FILE_CONNECTED) { @@ -682,6 +681,68 @@ err:  }  /** + * mei_cl_irq_write_complete - write a message to device + *	from the interrupt thread context + * + * @cl: client + * @cb: callback block. + * @slots: free slots. + * @cmpl_list: complete list. + * + * returns 0, OK; otherwise error. + */ +int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, +				     s32 *slots, struct mei_cl_cb *cmpl_list) +{ +	struct mei_device *dev = cl->dev; +	struct mei_msg_hdr mei_hdr; +	size_t len = cb->request_buffer.size - cb->buf_idx; +	u32 msg_slots = mei_data2slots(len); + +	mei_hdr.host_addr = cl->host_client_id; +	mei_hdr.me_addr = cl->me_client_id; +	mei_hdr.reserved = 0; + +	if (*slots >= msg_slots) { +		mei_hdr.length = len; +		mei_hdr.msg_complete = 1; +	/* Split the message only if we can write the whole host buffer */ +	} else if (*slots == dev->hbuf_depth) { +		msg_slots = *slots; +		len = (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr); +		mei_hdr.length = len; +		mei_hdr.msg_complete = 0; +	} else { +		/* wait for next time the host buffer is empty */ +		return 0; +	} + +	dev_dbg(&dev->pdev->dev, "buf: size = %d idx = %lu\n", +			cb->request_buffer.size, cb->buf_idx); +	dev_dbg(&dev->pdev->dev, MEI_HDR_FMT, MEI_HDR_PRM(&mei_hdr)); + +	*slots -=  msg_slots; +	if (mei_write_message(dev, &mei_hdr, +			cb->request_buffer.data + cb->buf_idx)) { +		cl->status = -ENODEV; +		list_move_tail(&cb->list, &cmpl_list->list); +		return -ENODEV; +	} + +	cl->status = 0; +	cl->writing_state = MEI_WRITING; +	cb->buf_idx += mei_hdr.length; + +	if (mei_hdr.msg_complete) { +		if (mei_cl_flow_ctrl_reduce(cl)) +			return -ENODEV; +		list_move_tail(&cb->list, &dev->write_waiting_list.list); +	} + +	return 0; +} + +/**   * mei_cl_write - submit a write cb to mei device  	assumes device_lock is locked   * @@ -723,7 +784,6 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking)  		cb->buf_idx = 0;  		/* unseting complete will enqueue the cb for write */  		mei_hdr.msg_complete = 0; -		cl->writing_state = MEI_WRITING;  		rets = buf->size;  		goto out;  	} @@ -785,6 +845,32 @@ err:  } +/** + * mei_cl_complete - processes completed operation for a client + * + * @cl: private data of the file object. + * @cb: callback block. + */ +void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) +{ +	if (cb->fop_type == MEI_FOP_WRITE) { +		mei_io_cb_free(cb); +		cb = NULL; +		cl->writing_state = MEI_WRITE_COMPLETE; +		if (waitqueue_active(&cl->tx_wait)) +			wake_up_interruptible(&cl->tx_wait); + +	} else if (cb->fop_type == MEI_FOP_READ && +			MEI_READING == cl->reading_state) { +		cl->reading_state = MEI_READ_COMPLETE; +		if (waitqueue_active(&cl->rx_wait)) +			wake_up_interruptible(&cl->rx_wait); +		else +			mei_cl_bus_rx_event(cl); + +	} +} +  /**   * mei_cl_all_disconnect - disconnect forcefully all connected clients diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h index cfdb144526a..26b157d8bad 100644 --- a/drivers/misc/mei/client.h +++ b/drivers/misc/mei/client.h @@ -89,6 +89,10 @@ int mei_cl_disconnect(struct mei_cl *cl);  int mei_cl_connect(struct mei_cl *cl, struct file *file);  int mei_cl_read_start(struct mei_cl *cl, size_t length);  int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking); +int mei_cl_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, +				s32 *slots, struct mei_cl_cb *cmpl_list); + +void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);  void mei_host_client_init(struct work_struct *work); diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index 6916045166e..6127ab64bb3 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c @@ -139,7 +139,7 @@ int mei_hbm_start_wait(struct mei_device *dev)  	if (ret <= 0 && (dev->hbm_state <= MEI_HBM_START)) {  		dev->hbm_state = MEI_HBM_IDLE; -		dev_err(&dev->pdev->dev, "wating for mei start failed\n"); +		dev_err(&dev->pdev->dev, "waiting for mei start failed\n");  		return -ETIMEDOUT;  	}  	return 0; @@ -167,7 +167,7 @@ int mei_hbm_start_req(struct mei_device *dev)  	dev->hbm_state = MEI_HBM_IDLE;  	if (mei_write_message(dev, mei_hdr, dev->wr_msg.data)) { -		dev_err(&dev->pdev->dev, "version message writet failed\n"); +		dev_err(&dev->pdev->dev, "version message write failed\n");  		dev->dev_state = MEI_DEV_RESETTING;  		mei_reset(dev, 1);  		return -ENODEV; @@ -536,6 +536,20 @@ static void mei_hbm_fw_disconnect_req(struct mei_device *dev,  /** + * mei_hbm_version_is_supported - checks whether the driver can + *     support the hbm version of the device + * + * @dev: the device structure + * returns true if driver can support hbm version of the device + */ +bool mei_hbm_version_is_supported(struct mei_device *dev) +{ +	return	(dev->version.major_version < HBM_MAJOR_VERSION) || +		(dev->version.major_version == HBM_MAJOR_VERSION && +		 dev->version.minor_version <= HBM_MINOR_VERSION); +} + +/**   * mei_hbm_dispatch - bottom half read routine after ISR to   * handle the read bus message cmd processing.   * @@ -562,9 +576,24 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)  	switch (mei_msg->hbm_cmd) {  	case HOST_START_RES_CMD:  		version_res = (struct hbm_host_version_response *)mei_msg; -		if (!version_res->host_version_supported) { -			dev->version = version_res->me_max_version; -			dev_dbg(&dev->pdev->dev, "version mismatch.\n"); + +		dev_dbg(&dev->pdev->dev, "HBM VERSION: DRIVER=%02d:%02d DEVICE=%02d:%02d\n", +				HBM_MAJOR_VERSION, HBM_MINOR_VERSION, +				version_res->me_max_version.major_version, +				version_res->me_max_version.minor_version); + +		if (version_res->host_version_supported) { +			dev->version.major_version = HBM_MAJOR_VERSION; +			dev->version.minor_version = HBM_MINOR_VERSION; +		} else { +			dev->version.major_version = +				version_res->me_max_version.major_version; +			dev->version.minor_version = +				version_res->me_max_version.minor_version; +		} + +		if (!mei_hbm_version_is_supported(dev)) { +			dev_warn(&dev->pdev->dev, "hbm version mismatch: stopping the driver.\n");  			dev->hbm_state = MEI_HBM_STOP;  			mei_hbm_stop_req_prepare(dev, &dev->wr_msg.hdr, @@ -575,8 +604,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)  			return;  		} -		dev->version.major_version = HBM_MAJOR_VERSION; -		dev->version.minor_version = HBM_MINOR_VERSION;  		if (dev->dev_state == MEI_DEV_INIT_CLIENTS &&  		    dev->hbm_state == MEI_HBM_START) {  			dev->init_clients_timer = 0; diff --git a/drivers/misc/mei/hbm.h b/drivers/misc/mei/hbm.h index e80dc24ef3e..4ae2e56e404 100644 --- a/drivers/misc/mei/hbm.h +++ b/drivers/misc/mei/hbm.h @@ -54,7 +54,7 @@ int mei_hbm_start_wait(struct mei_device *dev);  int mei_hbm_cl_flow_control_req(struct mei_device *dev, struct mei_cl *cl);  int mei_hbm_cl_disconnect_req(struct mei_device *dev, struct mei_cl *cl);  int mei_hbm_cl_connect_req(struct mei_device *dev, struct mei_cl *cl); - +bool mei_hbm_version_is_supported(struct mei_device *dev);  #endif /* _MEI_HBM_H_ */ diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 822170f0034..b22c7e24722 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c @@ -171,7 +171,7 @@ static void mei_me_hw_reset_release(struct mei_device *dev)   * @dev: the device structure   * @intr_enable: if interrupt should be enabled after reset.   */ -static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable) +static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)  {  	struct mei_me_hw *hw = to_me_hw(dev);  	u32 hcsr = mei_hcsr_read(hw); @@ -191,6 +191,7 @@ static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable)  		mei_me_hw_reset_release(dev);  	dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", mei_hcsr_read(hw)); +	return 0;  }  /** @@ -238,14 +239,18 @@ static int mei_me_hw_ready_wait(struct mei_device *dev)  	if (mei_me_hw_is_ready(dev))  		return 0; +	dev->recvd_hw_ready = false;  	mutex_unlock(&dev->device_lock);  	err = wait_event_interruptible_timeout(dev->wait_hw_ready, -			dev->recvd_hw_ready, MEI_INTEROP_TIMEOUT); +			dev->recvd_hw_ready, +			mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT));  	mutex_lock(&dev->device_lock);  	if (!err && !dev->recvd_hw_ready) { +		if (!err) +			err = -ETIMEDOUT;  		dev_err(&dev->pdev->dev, -			"wait hw ready failed. status = 0x%x\n", err); -		return -ETIMEDOUT; +			"wait hw ready failed. status = %d\n", err); +		return err;  	}  	dev->recvd_hw_ready = false; @@ -482,7 +487,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)  	/* check if ME wants a reset */  	if (!mei_hw_is_ready(dev) &&  	    dev->dev_state != MEI_DEV_RESETTING && -	    dev->dev_state != MEI_DEV_INITIALIZING) { +	    dev->dev_state != MEI_DEV_INITIALIZING && +	    dev->dev_state != MEI_DEV_POWER_DOWN && +	    dev->dev_state != MEI_DEV_POWER_UP) {  		dev_dbg(&dev->pdev->dev, "FW not ready.\n");  		mei_reset(dev, 1);  		mutex_unlock(&dev->device_lock); diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index f580d30bb78..e6f16f83ecd 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c @@ -38,7 +38,7 @@ const char *mei_dev_state_str(int state)  	MEI_DEV_STATE(POWER_DOWN);  	MEI_DEV_STATE(POWER_UP);  	default: -		return "unkown"; +		return "unknown";  	}  #undef MEI_DEV_STATE  } @@ -106,8 +106,7 @@ int mei_start(struct mei_device *dev)  		goto err;  	} -	if (dev->version.major_version != HBM_MAJOR_VERSION || -	    dev->version.minor_version != HBM_MINOR_VERSION) { +	if (!mei_hbm_version_is_supported(dev)) {  		dev_dbg(&dev->pdev->dev, "MEI start failed.\n");  		goto err;  	} @@ -133,17 +132,24 @@ EXPORT_SYMBOL_GPL(mei_start);  void mei_reset(struct mei_device *dev, int interrupts_enabled)  {  	bool unexpected; +	int ret;  	unexpected = (dev->dev_state != MEI_DEV_INITIALIZING &&  			dev->dev_state != MEI_DEV_DISABLED &&  			dev->dev_state != MEI_DEV_POWER_DOWN &&  			dev->dev_state != MEI_DEV_POWER_UP); -	mei_hw_reset(dev, interrupts_enabled); +	ret = mei_hw_reset(dev, interrupts_enabled); +	if (ret) { +		dev_err(&dev->pdev->dev, "hw reset failed disabling the device\n"); +		interrupts_enabled = false; +		dev->dev_state = MEI_DEV_DISABLED; +	}  	dev->hbm_state = MEI_HBM_IDLE; -	if (dev->dev_state != MEI_DEV_INITIALIZING) { +	if (dev->dev_state != MEI_DEV_INITIALIZING && +	    dev->dev_state != MEI_DEV_POWER_UP) {  		if (dev->dev_state != MEI_DEV_DISABLED &&  		    dev->dev_state != MEI_DEV_POWER_DOWN)  			dev->dev_state = MEI_DEV_RESETTING; @@ -176,7 +182,12 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled)  		return;  	} -	mei_hw_start(dev); +	ret = mei_hw_start(dev); +	if (ret) { +		dev_err(&dev->pdev->dev, "hw_start failed disabling the device\n"); +		dev->dev_state = MEI_DEV_DISABLED; +		return; +	}  	dev_dbg(&dev->pdev->dev, "link is established start sending messages.\n");  	/* link is established * start sending messages.  */ diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 2ad73698941..4b59cb742de 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c @@ -31,32 +31,6 @@  /** - * mei_cl_complete_handler - processes completed operation for a client - * - * @cl: private data of the file object. - * @cb: callback block. - */ -static void mei_cl_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb) -{ -	if (cb->fop_type == MEI_FOP_WRITE) { -		mei_io_cb_free(cb); -		cb = NULL; -		cl->writing_state = MEI_WRITE_COMPLETE; -		if (waitqueue_active(&cl->tx_wait)) -			wake_up_interruptible(&cl->tx_wait); - -	} else if (cb->fop_type == MEI_FOP_READ && -			MEI_READING == cl->reading_state) { -		cl->reading_state = MEI_READ_COMPLETE; -		if (waitqueue_active(&cl->rx_wait)) -			wake_up_interruptible(&cl->rx_wait); -		else -			mei_cl_bus_rx_event(cl); - -	} -} - -/**   * mei_irq_compl_handler - dispatch complete handelers   *	for the completed callbacks   * @@ -78,7 +52,7 @@ void mei_irq_compl_handler(struct mei_device *dev, struct mei_cl_cb *compl_list)  		if (cl == &dev->iamthif_cl)  			mei_amthif_complete(dev, cb);  		else -			mei_cl_complete_handler(cl, cb); +			mei_cl_complete(cl, cb);  	}  }  EXPORT_SYMBOL_GPL(mei_irq_compl_handler); @@ -189,21 +163,21 @@ static int mei_cl_irq_read_msg(struct mei_device *dev,  }  /** - * _mei_irq_thread_close - processes close related operation. + * mei_cl_irq_close - processes close related operation from + *	interrupt thread context - send disconnect request   * - * @dev: the device structure. + * @cl: client + * @cb: callback block.   * @slots: free slots. - * @cb_pos: callback block. - * @cl: private data of the file object.   * @cmpl_list: complete list.   *   * returns 0, OK; otherwise, error.   */ -static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots, -				struct mei_cl_cb *cb_pos, -				struct mei_cl *cl, -				struct mei_cl_cb *cmpl_list) +static int mei_cl_irq_close(struct mei_cl *cl, struct mei_cl_cb *cb, +			s32 *slots, struct mei_cl_cb *cmpl_list)  { +	struct mei_device *dev = cl->dev; +  	u32 msg_slots =  		mei_data2slots(sizeof(struct hbm_client_connect_request)); @@ -214,15 +188,15 @@ static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots,  	if (mei_hbm_cl_disconnect_req(dev, cl)) {  		cl->status = 0; -		cb_pos->buf_idx = 0; -		list_move_tail(&cb_pos->list, &cmpl_list->list); +		cb->buf_idx = 0; +		list_move_tail(&cb->list, &cmpl_list->list);  		return -EIO;  	}  	cl->state = MEI_FILE_DISCONNECTING;  	cl->status = 0; -	cb_pos->buf_idx = 0; -	list_move_tail(&cb_pos->list, &dev->ctrl_rd_list.list); +	cb->buf_idx = 0; +	list_move_tail(&cb->list, &dev->ctrl_rd_list.list);  	cl->timer_count = MEI_CONNECT_TIMEOUT;  	return 0; @@ -230,26 +204,26 @@ static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots,  /** - * _mei_irq_thread_read - processes read related operation. + * mei_cl_irq_close - processes client read related operation from the + *	interrupt thread context - request for flow control credits   * - * @dev: the device structure. + * @cl: client + * @cb: callback block.   * @slots: free slots. - * @cb_pos: callback block. - * @cl: private data of the file object.   * @cmpl_list: complete list.   *   * returns 0, OK; otherwise, error.   */ -static int _mei_irq_thread_read(struct mei_device *dev,	s32 *slots, -			struct mei_cl_cb *cb_pos, -			struct mei_cl *cl, -			struct mei_cl_cb *cmpl_list) +static int mei_cl_irq_read(struct mei_cl *cl, struct mei_cl_cb *cb, +			   s32 *slots, struct mei_cl_cb *cmpl_list)  { +	struct mei_device *dev = cl->dev; +  	u32 msg_slots = mei_data2slots(sizeof(struct hbm_flow_control));  	if (*slots < msg_slots) {  		/* return the cancel routine */ -		list_del(&cb_pos->list); +		list_del(&cb->list);  		return -EMSGSIZE;  	} @@ -257,38 +231,38 @@ static int _mei_irq_thread_read(struct mei_device *dev,	s32 *slots,  	if (mei_hbm_cl_flow_control_req(dev, cl)) {  		cl->status = -ENODEV; -		cb_pos->buf_idx = 0; -		list_move_tail(&cb_pos->list, &cmpl_list->list); +		cb->buf_idx = 0; +		list_move_tail(&cb->list, &cmpl_list->list);  		return -ENODEV;  	} -	list_move_tail(&cb_pos->list, &dev->read_list.list); +	list_move_tail(&cb->list, &dev->read_list.list);  	return 0;  }  /** - * _mei_irq_thread_ioctl - processes ioctl related operation. + * mei_cl_irq_ioctl - processes client ioctl related operation from the + *	interrupt thread context -   send connection request   * - * @dev: the device structure. + * @cl: client + * @cb: callback block.   * @slots: free slots. - * @cb_pos: callback block. - * @cl: private data of the file object.   * @cmpl_list: complete list.   *   * returns 0, OK; otherwise, error.   */ -static int _mei_irq_thread_ioctl(struct mei_device *dev, s32 *slots, -			struct mei_cl_cb *cb_pos, -			struct mei_cl *cl, -			struct mei_cl_cb *cmpl_list) +static int mei_cl_irq_ioctl(struct mei_cl *cl, struct mei_cl_cb *cb, +			   s32 *slots, struct mei_cl_cb *cmpl_list)  { +	struct mei_device *dev = cl->dev; +  	u32 msg_slots =  		mei_data2slots(sizeof(struct hbm_client_connect_request));  	if (*slots < msg_slots) {  		/* return the cancel routine */ -		list_del(&cb_pos->list); +		list_del(&cb->list);  		return -EMSGSIZE;  	} @@ -298,76 +272,17 @@ static int _mei_irq_thread_ioctl(struct mei_device *dev, s32 *slots,  	if (mei_hbm_cl_connect_req(dev, cl)) {  		cl->status = -ENODEV; -		cb_pos->buf_idx = 0; -		list_del(&cb_pos->list); -		return -ENODEV; -	} else { -		list_move_tail(&cb_pos->list, &dev->ctrl_rd_list.list); -		cl->timer_count = MEI_CONNECT_TIMEOUT; -	} -	return 0; -} - -/** - * mei_irq_thread_write_complete - write messages to device. - * - * @dev: the device structure. - * @slots: free slots. - * @cb: callback block. - * @cmpl_list: complete list. - * - * returns 0, OK; otherwise, error. - */ -static int mei_irq_thread_write_complete(struct mei_device *dev, s32 *slots, -			struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list) -{ -	struct mei_msg_hdr mei_hdr; -	struct mei_cl *cl = cb->cl; -	size_t len = cb->request_buffer.size - cb->buf_idx; -	u32 msg_slots = mei_data2slots(len); - -	mei_hdr.host_addr = cl->host_client_id; -	mei_hdr.me_addr = cl->me_client_id; -	mei_hdr.reserved = 0; - -	if (*slots >= msg_slots) { -		mei_hdr.length = len; -		mei_hdr.msg_complete = 1; -	/* Split the message only if we can write the whole host buffer */ -	} else if (*slots == dev->hbuf_depth) { -		msg_slots = *slots; -		len = (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr); -		mei_hdr.length = len; -		mei_hdr.msg_complete = 0; -	} else { -		/* wait for next time the host buffer is empty */ -		return 0; -	} - -	dev_dbg(&dev->pdev->dev, "buf: size = %d idx = %lu\n", -			cb->request_buffer.size, cb->buf_idx); -	dev_dbg(&dev->pdev->dev, MEI_HDR_FMT, MEI_HDR_PRM(&mei_hdr)); - -	*slots -=  msg_slots; -	if (mei_write_message(dev, &mei_hdr, -			cb->request_buffer.data + cb->buf_idx)) { -		cl->status = -ENODEV; -		list_move_tail(&cb->list, &cmpl_list->list); +		cb->buf_idx = 0; +		list_del(&cb->list);  		return -ENODEV;  	} - -	cl->status = 0; -	cb->buf_idx += mei_hdr.length; -	if (mei_hdr.msg_complete) { -		if (mei_cl_flow_ctrl_reduce(cl)) -			return -ENODEV; -		list_move_tail(&cb->list, &dev->write_waiting_list.list); -	} - +	list_move_tail(&cb->list, &dev->ctrl_rd_list.list); +	cl->timer_count = MEI_CONNECT_TIMEOUT;  	return 0;  } +  /**   * mei_irq_read_handler - bottom half read routine after ISR to   * handle the read processing. @@ -481,7 +396,7 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  {  	struct mei_cl *cl; -	struct mei_cl_cb *pos = NULL, *next = NULL; +	struct mei_cl_cb *cb, *next;  	struct mei_cl_cb *list;  	s32 slots;  	int ret; @@ -498,19 +413,19 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  	dev_dbg(&dev->pdev->dev, "complete all waiting for write cb.\n");  	list = &dev->write_waiting_list; -	list_for_each_entry_safe(pos, next, &list->list, list) { -		cl = pos->cl; +	list_for_each_entry_safe(cb, next, &list->list, list) { +		cl = cb->cl;  		if (cl == NULL)  			continue;  		cl->status = 0; -		list_del(&pos->list); +		list_del(&cb->list);  		if (MEI_WRITING == cl->writing_state && -		    pos->fop_type == MEI_FOP_WRITE && +		    cb->fop_type == MEI_FOP_WRITE &&  		    cl != &dev->iamthif_cl) {  			dev_dbg(&dev->pdev->dev, "MEI WRITE COMPLETE\n");  			cl->writing_state = MEI_WRITE_COMPLETE; -			list_add_tail(&pos->list, &cmpl_list->list); +			list_add_tail(&cb->list, &cmpl_list->list);  		}  		if (cl == &dev->iamthif_cl) {  			dev_dbg(&dev->pdev->dev, "check iamthif flow control.\n"); @@ -552,25 +467,23 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  	/* complete control write list CB */  	dev_dbg(&dev->pdev->dev, "complete control write list cb.\n"); -	list_for_each_entry_safe(pos, next, &dev->ctrl_wr_list.list, list) { -		cl = pos->cl; +	list_for_each_entry_safe(cb, next, &dev->ctrl_wr_list.list, list) { +		cl = cb->cl;  		if (!cl) { -			list_del(&pos->list); +			list_del(&cb->list);  			return -ENODEV;  		} -		switch (pos->fop_type) { +		switch (cb->fop_type) {  		case MEI_FOP_CLOSE:  			/* send disconnect message */ -			ret = _mei_irq_thread_close(dev, &slots, pos, -						cl, cmpl_list); +			ret = mei_cl_irq_close(cl, cb, &slots, cmpl_list);  			if (ret)  				return ret;  			break;  		case MEI_FOP_READ:  			/* send flow control message */ -			ret = _mei_irq_thread_read(dev, &slots, pos, -						cl, cmpl_list); +			ret = mei_cl_irq_read(cl, cb, &slots, cmpl_list);  			if (ret)  				return ret; @@ -579,8 +492,7 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  			/* connect message */  			if (mei_cl_is_other_connecting(cl))  				continue; -			ret = _mei_irq_thread_ioctl(dev, &slots, pos, -						cl, cmpl_list); +			ret = mei_cl_irq_ioctl(cl, cb, &slots, cmpl_list);  			if (ret)  				return ret; @@ -593,8 +505,8 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  	}  	/* complete  write list CB */  	dev_dbg(&dev->pdev->dev, "complete write list cb.\n"); -	list_for_each_entry_safe(pos, next, &dev->write_list.list, list) { -		cl = pos->cl; +	list_for_each_entry_safe(cb, next, &dev->write_list.list, list) { +		cl = cb->cl;  		if (cl == NULL)  			continue;  		if (mei_cl_flow_ctrl_creds(cl) <= 0) { @@ -605,14 +517,13 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list)  		}  		if (cl == &dev->iamthif_cl) -			ret = mei_amthif_irq_write_complete(dev, &slots, -							pos, cmpl_list); +			ret = mei_amthif_irq_write_complete(cl, cb, +						&slots, cmpl_list);  		else -			ret = mei_irq_thread_write_complete(dev, &slots, pos, -						cmpl_list); +			ret = mei_cl_irq_write_complete(cl, cb, +						&slots, cmpl_list);  		if (ret)  			return ret; -  	}  	return 0;  } diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 053139f6108..5e11b5b9b65 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c @@ -194,7 +194,6 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,  	struct mei_cl_cb *cb_pos = NULL;  	struct mei_cl_cb *cb = NULL;  	struct mei_device *dev; -	int i;  	int rets;  	int err; @@ -210,38 +209,26 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,  		goto out;  	} -	if ((cl->sm_state & MEI_WD_STATE_INDEPENDENCE_MSG_SENT) == 0) { -		/* Do not allow to read watchdog client */ -		i = mei_me_cl_by_uuid(dev, &mei_wd_guid); -		if (i >= 0) { -			struct mei_me_client *me_client = &dev->me_clients[i]; -			if (cl->me_client_id == me_client->client_id) { -				rets = -EBADF; -				goto out; -			} -		} -	} else { -		cl->sm_state &= ~MEI_WD_STATE_INDEPENDENCE_MSG_SENT; -	} -  	if (cl == &dev->iamthif_cl) {  		rets = mei_amthif_read(dev, file, ubuf, length, offset);  		goto out;  	} -	if (cl->read_cb && cl->read_cb->buf_idx > *offset) { -		cb = cl->read_cb; -		goto copy_buffer; -	} else if (cl->read_cb && cl->read_cb->buf_idx > 0 && -		   cl->read_cb->buf_idx <= *offset) { +	if (cl->read_cb) {  		cb = cl->read_cb; -		rets = 0; -		goto free; -	} else if ((!cl->read_cb || !cl->read_cb->buf_idx) && *offset > 0) { -		/*Offset needs to be cleaned for contiguous reads*/ +		/* read what left */ +		if (cb->buf_idx > *offset) +			goto copy_buffer; +		/* offset is beyond buf_idx we have no more data return 0 */ +		if (cb->buf_idx > 0 && cb->buf_idx <= *offset) { +			rets = 0; +			goto free; +		} +		/* Offset needs to be cleaned for contiguous reads*/ +		if (cb->buf_idx == 0 && *offset > 0) +			*offset = 0; +	} else if (*offset > 0) {  		*offset = 0; -		rets = 0; -		goto out;  	}  	err = mei_cl_read_start(cl, length); @@ -420,16 +407,6 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,  	if (rets)  		goto out; -	cl->sm_state = 0; -	if (length == 4 && -	    ((memcmp(mei_wd_state_independence_msg[0], -				 write_cb->request_buffer.data, 4) == 0) || -	     (memcmp(mei_wd_state_independence_msg[1], -				 write_cb->request_buffer.data, 4) == 0) || -	     (memcmp(mei_wd_state_independence_msg[2], -				 write_cb->request_buffer.data, 4) == 0))) -		cl->sm_state |= MEI_WD_STATE_INDEPENDENCE_MSG_SENT; -  	if (cl == &dev->iamthif_cl) {  		rets = mei_amthif_write(dev, write_cb); diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 4de5140e737..7b918b2fb89 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h @@ -56,11 +56,6 @@ extern const uuid_le mei_amthif_guid;  extern const uuid_le mei_wd_guid;  /* - * Watchdog independence state message - */ -extern const u8 mei_wd_state_independence_msg[3][4]; - -/*   * Number of Maximum MEI Clients   */  #define MEI_CLIENTS_MAX 256 @@ -201,7 +196,6 @@ struct mei_cl {  	u8 timer_count;  	enum mei_file_transaction_states reading_state;  	enum mei_file_transaction_states writing_state; -	int sm_state;  	struct mei_cl_cb *read_cb;  	/* MEI CL bus data */ @@ -239,7 +233,7 @@ struct mei_hw_ops {  	bool (*host_is_ready) (struct mei_device *dev);  	bool (*hw_is_ready) (struct mei_device *dev); -	void (*hw_reset) (struct mei_device *dev, bool enable); +	int (*hw_reset) (struct mei_device *dev, bool enable);  	int  (*hw_start) (struct mei_device *dev);  	void (*hw_config) (struct mei_device *dev); @@ -502,8 +496,8 @@ struct mei_cl_cb *mei_amthif_find_read_list_entry(struct mei_device *dev,  void mei_amthif_run_next_cmd(struct mei_device *dev); -int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, -			struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list); +int mei_amthif_irq_write_complete(struct mei_cl *cl, struct mei_cl_cb *cb, +				  s32 *slots, struct mei_cl_cb *cmpl_list);  void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb);  int mei_amthif_irq_read_msg(struct mei_device *dev, @@ -522,15 +516,6 @@ void mei_nfc_host_exit(void);   */  extern const uuid_le mei_nfc_guid; -int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots, -			struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list); - -void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb); -int mei_amthif_irq_read_message(struct mei_cl_cb *complete_list, -		struct mei_device *dev, struct mei_msg_hdr *mei_hdr); -int mei_amthif_irq_read(struct mei_device *dev, s32 *slots); - -  int mei_wd_send(struct mei_device *dev);  int mei_wd_stop(struct mei_device *dev);  int mei_wd_host_init(struct mei_device *dev); @@ -554,14 +539,14 @@ static inline void mei_hw_config(struct mei_device *dev)  {  	dev->ops->hw_config(dev);  } -static inline void mei_hw_reset(struct mei_device *dev, bool enable) +static inline int mei_hw_reset(struct mei_device *dev, bool enable)  { -	dev->ops->hw_reset(dev, enable); +	return dev->ops->hw_reset(dev, enable);  } -static inline void mei_hw_start(struct mei_device *dev) +static inline int mei_hw_start(struct mei_device *dev)  { -	dev->ops->hw_start(dev); +	return dev->ops->hw_start(dev);  }  static inline void mei_clear_interrupts(struct mei_device *dev) diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 0f268329bd3..1b3844e8237 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c @@ -43,9 +43,6 @@  #include "hw-me.h"  #include "client.h" -/* AMT device is a singleton on the platform */ -static struct pci_dev *mei_pdev; -  /* mei_pci_tbl - PCI Device ID Table */  static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82946GZ)}, @@ -88,8 +85,6 @@ static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = {  MODULE_DEVICE_TABLE(pci, mei_me_pci_tbl); -static DEFINE_MUTEX(mei_mutex); -  /**   * mei_quirk_probe - probe for devices that doesn't valid ME interface   * @@ -126,17 +121,12 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	struct mei_me_hw *hw;  	int err; -	mutex_lock(&mei_mutex);  	if (!mei_me_quirk_probe(pdev, ent)) {  		err = -ENODEV;  		goto end;  	} -	if (mei_pdev) { -		err = -EEXIST; -		goto end; -	}  	/* enable pci dev */  	err = pci_enable_device(pdev);  	if (err) { @@ -195,13 +185,10 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (err)  		goto release_irq; -	mei_pdev = pdev;  	pci_set_drvdata(pdev, dev);  	schedule_delayed_work(&dev->timer_work, HZ); -	mutex_unlock(&mei_mutex); -  	pr_debug("initialization successful.\n");  	return 0; @@ -220,7 +207,6 @@ release_regions:  disable_device:  	pci_disable_device(pdev);  end: -	mutex_unlock(&mei_mutex);  	dev_err(&pdev->dev, "initialization failed.\n");  	return err;  } @@ -238,9 +224,6 @@ static void mei_me_remove(struct pci_dev *pdev)  	struct mei_device *dev;  	struct mei_me_hw *hw; -	if (mei_pdev != pdev) -		return; -  	dev = pci_get_drvdata(pdev);  	if (!dev)  		return; @@ -251,8 +234,6 @@ static void mei_me_remove(struct pci_dev *pdev)  	dev_err(&pdev->dev, "stop\n");  	mei_stop(dev); -	mei_pdev = NULL; -  	/* disable interrupts */  	mei_disable_interrupts(dev); diff --git a/drivers/misc/mei/wd.c b/drivers/misc/mei/wd.c index 6251a4ee706..b8921432e89 100644 --- a/drivers/misc/mei/wd.c +++ b/drivers/misc/mei/wd.c @@ -31,12 +31,6 @@  static const u8 mei_start_wd_params[] = { 0x02, 0x12, 0x13, 0x10 };  static const u8 mei_stop_wd_params[] = { 0x02, 0x02, 0x14, 0x10 }; -const u8 mei_wd_state_independence_msg[3][4] = { -	{0x05, 0x02, 0x51, 0x10}, -	{0x05, 0x02, 0x52, 0x10}, -	{0x07, 0x02, 0x01, 0x10} -}; -  /*   * AMT Watchdog Device   */ diff --git a/drivers/misc/pch_phub.c b/drivers/misc/pch_phub.c index 931e635aa49..a5925f7f17f 100644 --- a/drivers/misc/pch_phub.c +++ b/drivers/misc/pch_phub.c @@ -633,17 +633,13 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,  static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,  			     const char *buf, size_t count)  { -	u8 mac[6]; +	u8 mac[ETH_ALEN];  	ssize_t rom_size;  	struct pch_phub_reg *chip = dev_get_drvdata(dev); -	if (count != 18) +	if (!mac_pton(buf, mac))  		return -EINVAL; -	sscanf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", -		(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3], -		(u32 *)&mac[4], (u32 *)&mac[5]); -  	chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);  	if (!chip->pch_phub_extrom_base_address)  		return -ENOMEM; @@ -669,8 +665,6 @@ static struct bin_attribute pch_bin_attr = {  static int pch_phub_probe(struct pci_dev *pdev,  				    const struct pci_device_id *id)  { -	int retval; -  	int ret;  	struct pch_phub_reg *chip; @@ -713,13 +707,13 @@ static int pch_phub_probe(struct pci_dev *pdev,  	if (id->driver_data == 1) { /* EG20T PCH */  		const char *board_name; -		retval = sysfs_create_file(&pdev->dev.kobj, -					   &dev_attr_pch_mac.attr); -		if (retval) +		ret = sysfs_create_file(&pdev->dev.kobj, +					&dev_attr_pch_mac.attr); +		if (ret)  			goto err_sysfs_create; -		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); -		if (retval) +		ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); +		if (ret)  			goto exit_bin_attr;  		pch_phub_read_modify_write_reg(chip, @@ -743,8 +737,8 @@ static int pch_phub_probe(struct pci_dev *pdev,  		chip->pch_opt_rom_start_address = PCH_PHUB_ROM_START_ADDR_EG20T;  		chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_EG20T;  	} else if (id->driver_data == 2) { /* ML7213 IOH */ -		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); -		if (retval) +		ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); +		if (ret)  			goto err_sysfs_create;  		/* set the prefech value  		 * Device2(USB OHCI #1/ USB EHCI #1/ USB Device):a @@ -766,12 +760,12 @@ static int pch_phub_probe(struct pci_dev *pdev,  						 PCH_PHUB_ROM_START_ADDR_ML7223;  		chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;  	} else if (id->driver_data == 4) { /* ML7223 IOH Bus-n*/ -		retval = sysfs_create_file(&pdev->dev.kobj, -					   &dev_attr_pch_mac.attr); -		if (retval) +		ret = sysfs_create_file(&pdev->dev.kobj, +					&dev_attr_pch_mac.attr); +		if (ret)  			goto err_sysfs_create; -		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); -		if (retval) +		ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); +		if (ret)  			goto exit_bin_attr;  		/* set the prefech value  		 * Device2(USB OHCI #0,1,2,3/ USB EHCI #0):a @@ -783,13 +777,13 @@ static int pch_phub_probe(struct pci_dev *pdev,  						 PCH_PHUB_ROM_START_ADDR_ML7223;  		chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;  	} else if (id->driver_data == 5) { /* ML7831 */ -		retval = sysfs_create_file(&pdev->dev.kobj, -					   &dev_attr_pch_mac.attr); -		if (retval) +		ret = sysfs_create_file(&pdev->dev.kobj, +					&dev_attr_pch_mac.attr); +		if (ret)  			goto err_sysfs_create; -		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); -		if (retval) +		ret = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr); +		if (ret)  			goto exit_bin_attr;  		/* set the prefech value */ diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index c4acac74725..f74fc0ca2ef 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c @@ -876,8 +876,9 @@ int gru_set_context_option(unsigned long arg)  	switch (req.op) {  	case sco_blade_chiplet:  		/* Select blade/chiplet for GRU context */ -		if (req.val1 < -1 || req.val1 >= GRU_MAX_BLADES || !gru_base[req.val1] || -		    req.val0 < -1 || req.val0 >= GRU_CHIPLETS_PER_HUB) { +		if (req.val0 < -1 || req.val0 >= GRU_CHIPLETS_PER_HUB || +		    req.val1 < -1 || req.val1 >= GRU_MAX_BLADES || +		    (req.val1 >= 0 && !gru_base[req.val1])) {  			ret = -EINVAL;  		} else {  			gts->ts_user_blade_id = req.val1; diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index 797d7962cc8..4f763592239 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c @@ -160,15 +160,11 @@ static int options_show(struct seq_file *s, void *p)  static ssize_t options_write(struct file *file, const char __user *userbuf,  			     size_t count, loff_t *data)  { -	char buf[20]; - -	if (count >= sizeof(buf)) -		return -EINVAL; -	if (copy_from_user(buf, userbuf, count)) -		return -EFAULT; -	buf[count] = '\0'; -	if (strict_strtoul(buf, 0, &gru_options)) -		return -EINVAL; +	int ret; + +	ret = kstrtoul_from_user(userbuf, count, 0, &gru_options); +	if (ret) +		return ret;  	return count;  } diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index d971817182f..82dc5748f87 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c @@ -92,7 +92,7 @@ int xpc_disengage_timelimit = XPC_DISENGAGE_DEFAULT_TIMELIMIT;  static int xpc_disengage_min_timelimit;	/* = 0 */  static int xpc_disengage_max_timelimit = 120; -static ctl_table xpc_sys_xpc_hb_dir[] = { +static struct ctl_table xpc_sys_xpc_hb_dir[] = {  	{  	 .procname = "hb_interval",  	 .data = &xpc_hb_interval, @@ -111,7 +111,7 @@ static ctl_table xpc_sys_xpc_hb_dir[] = {  	 .extra2 = &xpc_hb_check_max_interval},  	{}  }; -static ctl_table xpc_sys_xpc_dir[] = { +static struct ctl_table xpc_sys_xpc_dir[] = {  	{  	 .procname = "hb",  	 .mode = 0555, @@ -126,7 +126,7 @@ static ctl_table xpc_sys_xpc_dir[] = {  	 .extra2 = &xpc_disengage_max_timelimit},  	{}  }; -static ctl_table xpc_sys_dir[] = { +static struct ctl_table xpc_sys_dir[] = {  	{  	 .procname = "xpc",  	 .mode = 0555, diff --git a/drivers/misc/spear13xx_pcie_gadget.c b/drivers/misc/spear13xx_pcie_gadget.c index 7deb25dc86a..2e13614d41e 100644 --- a/drivers/misc/spear13xx_pcie_gadget.c +++ b/drivers/misc/spear13xx_pcie_gadget.c @@ -316,8 +316,12 @@ static ssize_t pcie_gadget_store_no_of_msi(  		struct spear_pcie_gadget_config *config,  		const char *buf, size_t count)  { -	if (strict_strtoul(buf, 0, &config->requested_msi)) -		return -EINVAL; +	int ret; + +	ret = kstrtoul(buf, 0, &config->requested_msi); +	if (ret) +		return ret; +  	if (config->requested_msi > 32)  		config->requested_msi = 32; @@ -330,9 +334,11 @@ static ssize_t pcie_gadget_store_inta(  {  	struct pcie_app_reg __iomem *app_reg = config->va_app_base;  	ulong en; +	int ret; -	if (strict_strtoul(buf, 0, &en)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &en); +	if (ret) +		return ret;  	if (en)  		writel(readl(&app_reg->app_ctrl_0) | (1 << SYS_INT_ID), @@ -351,9 +357,11 @@ static ssize_t pcie_gadget_store_send_msi(  	struct pcie_app_reg __iomem *app_reg = config->va_app_base;  	ulong vector;  	u32 ven_msi; +	int ret; -	if (strict_strtoul(buf, 0, &vector)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &vector); +	if (ret) +		return ret;  	if (!config->configured_msi)  		return -EINVAL; @@ -395,9 +403,11 @@ static ssize_t pcie_gadget_store_vendor_id(  		const char *buf, size_t count)  {  	ulong id; +	int ret; -	if (strict_strtoul(buf, 0, &id)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &id); +	if (ret) +		return ret;  	spear_dbi_write_reg(config, PCI_VENDOR_ID, 2, id); @@ -420,9 +430,11 @@ static ssize_t pcie_gadget_store_device_id(  		const char *buf, size_t count)  {  	ulong id; +	int ret; -	if (strict_strtoul(buf, 0, &id)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &id); +	if (ret) +		return ret;  	spear_dbi_write_reg(config, PCI_DEVICE_ID, 2, id); @@ -443,9 +455,12 @@ static ssize_t pcie_gadget_store_bar0_size(  	ulong size;  	u32 pos, pos1;  	u32 no_of_bit = 0; +	int ret; + +	ret = kstrtoul(buf, 0, &size); +	if (ret) +		return ret; -	if (strict_strtoul(buf, 0, &size)) -		return -EINVAL;  	/* min bar size is 256 */  	if (size <= 0x100)  		size = 0x100; @@ -490,9 +505,11 @@ static ssize_t pcie_gadget_store_bar0_address(  {  	struct pcie_app_reg __iomem *app_reg = config->va_app_base;  	ulong address; +	int ret; -	if (strict_strtoul(buf, 0, &address)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &address); +	if (ret) +		return ret;  	address &= ~(config->bar0_size - 1);  	if (config->va_bar0_address) @@ -518,9 +535,11 @@ static ssize_t pcie_gadget_store_bar0_rw_offset(  		const char *buf, size_t count)  {  	ulong offset; +	int ret; -	if (strict_strtoul(buf, 0, &offset)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &offset); +	if (ret) +		return ret;  	if (offset % 4)  		return -EINVAL; @@ -549,9 +568,11 @@ static ssize_t pcie_gadget_store_bar0_data(  		const char *buf, size_t count)  {  	ulong data; +	int ret; -	if (strict_strtoul(buf, 0, &data)) -		return -EINVAL; +	ret = kstrtoul(buf, 0, &data); +	if (ret) +		return ret;  	if (!config->va_bar0_address)  		return -ENOMEM; @@ -776,7 +797,7 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev)  		goto err_iounmap_app;  	} -	dev_set_drvdata(&pdev->dev, target); +	platform_set_drvdata(pdev, target);  	irq = platform_get_irq(pdev, 0);  	if (irq < 0) { @@ -814,9 +835,11 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev)  		clk = clk_get_sys("pcie1", NULL);  		if (IS_ERR(clk)) {  			pr_err("%s:couldn't get clk for pcie1\n", __func__); +			status = PTR_ERR(clk);  			goto err_irq;  		} -		if (clk_enable(clk)) { +		status = clk_enable(clk); +		if (status) {  			pr_err("%s:couldn't enable clk for pcie1\n", __func__);  			goto err_irq;  		} @@ -828,9 +851,11 @@ static int spear_pcie_gadget_probe(struct platform_device *pdev)  		clk = clk_get_sys("pcie2", NULL);  		if (IS_ERR(clk)) {  			pr_err("%s:couldn't get clk for pcie2\n", __func__); +			status = PTR_ERR(clk);  			goto err_irq;  		} -		if (clk_enable(clk)) { +		status = clk_enable(clk); +		if (status) {  			pr_err("%s:couldn't enable clk for pcie2\n", __func__);  			goto err_irq;  		} @@ -863,7 +888,7 @@ static int spear_pcie_gadget_remove(struct platform_device *pdev)  	res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);  	irq = platform_get_irq(pdev, 0); -	target = dev_get_drvdata(&pdev->dev); +	target = platform_get_drvdata(pdev);  	config = &target->config;  	free_irq(irq, NULL); diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index 437192e4300..d87cc91bc01 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c @@ -45,15 +45,12 @@ static int sram_probe(struct platform_device *pdev)  	int ret;  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) -		return -EINVAL; +	virt_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(virt_base)) +		return PTR_ERR(virt_base);  	size = resource_size(res); -	virt_base = devm_request_and_ioremap(&pdev->dev, res); -	if (!virt_base) -		return -EADDRNOTAVAIL; -  	sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL);  	if (!sram)  		return -ENOMEM; diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 83269f1d16e..83907c72059 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c @@ -680,7 +680,7 @@ void st_kim_ref(struct st_data_s **core_data, int id)  		*core_data = NULL;  		return;  	} -	kim_gdata = dev_get_drvdata(&pdev->dev); +	kim_gdata = platform_get_drvdata(pdev);  	*core_data = kim_gdata->core_data;  } @@ -735,7 +735,7 @@ static int kim_probe(struct platform_device *pdev)  		pr_err("no mem to allocate");  		return -ENOMEM;  	} -	dev_set_drvdata(&pdev->dev, kim_gdata); +	platform_set_drvdata(pdev, kim_gdata);  	err = st_core_init(&kim_gdata->core_data);  	if (err != 0) { @@ -810,7 +810,7 @@ static int kim_remove(struct platform_device *pdev)  	struct ti_st_plat_data	*pdata = pdev->dev.platform_data;  	struct kim_data_s	*kim_gdata; -	kim_gdata = dev_get_drvdata(&pdev->dev); +	kim_gdata = platform_get_drvdata(pdev);  	/* Free the Bluetooth/FM/GPIO  	 * nShutdown gpio from the system diff --git a/drivers/misc/ti_dac7512.c b/drivers/misc/ti_dac7512.c index 1d86407189e..9b237221bc4 100644 --- a/drivers/misc/ti_dac7512.c +++ b/drivers/misc/ti_dac7512.c @@ -33,9 +33,11 @@ static ssize_t dac7512_store_val(struct device *dev,  	struct spi_device *spi = to_spi_device(dev);  	unsigned char tmp[2];  	unsigned long val; +	int ret; -	if (strict_strtoul(buf, 10, &val) < 0) -		return -EINVAL; +	ret = kstrtoul(buf, 10, &val); +	if (ret) +		return ret;  	tmp[0] = val >> 8;  	tmp[1] = val & 0xff; diff --git a/drivers/misc/tsl2550.c b/drivers/misc/tsl2550.c index 1dfde4d543d..5bc10fa193d 100644 --- a/drivers/misc/tsl2550.c +++ b/drivers/misc/tsl2550.c @@ -204,7 +204,7 @@ static ssize_t tsl2550_store_power_state(struct device *dev,  	unsigned long val = simple_strtoul(buf, NULL, 10);  	int ret; -	if (val < 0 || val > 1) +	if (val > 1)  		return -EINVAL;  	mutex_lock(&data->update_lock); @@ -236,7 +236,7 @@ static ssize_t tsl2550_store_operating_mode(struct device *dev,  	unsigned long val = simple_strtoul(buf, NULL, 10);  	int ret; -	if (val < 0 || val > 1) +	if (val > 1)  		return -EINVAL;  	if (data->power_state == 0)  | 
