diff options
Diffstat (limited to 'drivers')
52 files changed, 413 insertions, 239 deletions
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index 78db97687f26..c4b06cc075f9 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c @@ -800,6 +800,7 @@ bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)  	match.hrv = hrv;  	dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb); +	put_device(dev);  	return !!dev;  }  EXPORT_SYMBOL(acpi_dev_present); diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 57410f9c5d44..c52c738e554a 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig @@ -164,9 +164,7 @@ config ARM_CHARLCD  	  line and the Linux version on the second line, but that's  	  still useful. -endif # AUXDISPLAY - -menuconfig PANEL +menuconfig PARPORT_PANEL  	tristate "Parallel port LCD/Keypad Panel support"  	depends on PARPORT  	select CHARLCD @@ -178,7 +176,7 @@ menuconfig PANEL  	  compiled as a module, or linked into the kernel and started at boot.  	  If you don't understand what all this is about, say N. -if PANEL +if PARPORT_PANEL  config PANEL_PARPORT  	int "Default parallel port number (0=LPT1)" @@ -419,8 +417,11 @@ config PANEL_LCD_PIN_BL  	  Default for the 'BL' pin in custom profile is '0' (uncontrolled). +endif # PARPORT_PANEL +  config PANEL_CHANGE_MESSAGE  	bool "Change LCD initialization message ?" +	depends on CHARLCD  	default "n"  	---help---  	  This allows you to replace the boot message indicating the kernel version @@ -444,7 +445,34 @@ config PANEL_BOOT_MESSAGE  	  An empty message will only clear the display at driver init time. Any other  	  printf()-formatted message is valid with newline and escape codes. -endif # PANEL +choice +	prompt "Backlight initial state" +	default CHARLCD_BL_FLASH + +	config CHARLCD_BL_OFF +		bool "Off" +		help +		  Backlight is initially turned off + +	config CHARLCD_BL_ON +		bool "On" +		help +		  Backlight is initially turned on + +	config CHARLCD_BL_FLASH +		bool "Flash" +		help +		  Backlight is flashed briefly on init + +endchoice + +endif # AUXDISPLAY + +config PANEL +	tristate "Parallel port LCD/Keypad Panel support (OLD OPTION)" +	depends on PARPORT +	select AUXDISPLAY +	select PARPORT_PANEL  config CHARLCD  	tristate "Character LCD core support" if COMPILE_TEST diff --git a/drivers/auxdisplay/Makefile b/drivers/auxdisplay/Makefile index 7ac6776ca3f6..cf54b5efb07e 100644 --- a/drivers/auxdisplay/Makefile +++ b/drivers/auxdisplay/Makefile @@ -10,4 +10,4 @@ obj-$(CONFIG_CFAG12864B)	+= cfag12864b.o cfag12864bfb.o  obj-$(CONFIG_IMG_ASCII_LCD)	+= img-ascii-lcd.o  obj-$(CONFIG_HD44780)		+= hd44780.o  obj-$(CONFIG_HT16K33)		+= ht16k33.o -obj-$(CONFIG_PANEL)             += panel.o +obj-$(CONFIG_PARPORT_PANEL)	+= panel.o diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c index 60e0b772673f..92745efefb54 100644 --- a/drivers/auxdisplay/charlcd.c +++ b/drivers/auxdisplay/charlcd.c @@ -91,7 +91,7 @@ struct charlcd_priv {  	unsigned long long drvdata[0];  }; -#define to_priv(p)	container_of(p, struct charlcd_priv, lcd) +#define charlcd_to_priv(p)	container_of(p, struct charlcd_priv, lcd)  /* Device single-open policy control */  static atomic_t charlcd_available = ATOMIC_INIT(1); @@ -105,7 +105,7 @@ static void long_sleep(int ms)  /* turn the backlight on or off */  static void charlcd_backlight(struct charlcd *lcd, int on)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	if (!lcd->ops->backlight)  		return; @@ -134,7 +134,7 @@ static void charlcd_bl_off(struct work_struct *work)  /* turn the backlight on for a little while */  void charlcd_poke(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	if (!lcd->ops->backlight)  		return; @@ -152,7 +152,7 @@ EXPORT_SYMBOL_GPL(charlcd_poke);  static void charlcd_gotoxy(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	unsigned int addr;  	/* @@ -170,7 +170,7 @@ static void charlcd_gotoxy(struct charlcd *lcd)  static void charlcd_home(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	priv->addr.x = 0;  	priv->addr.y = 0; @@ -179,7 +179,7 @@ static void charlcd_home(struct charlcd *lcd)  static void charlcd_print(struct charlcd *lcd, char c)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	if (priv->addr.x < lcd->bwidth) {  		if (lcd->char_conv) @@ -211,7 +211,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)  /* clears the display and resets X/Y */  static void charlcd_clear_display(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CLEAR);  	priv->addr.x = 0; @@ -223,7 +223,7 @@ static void charlcd_clear_display(struct charlcd *lcd)  static int charlcd_init_display(struct charlcd *lcd)  {  	void (*write_cmd_raw)(struct charlcd *lcd, int cmd); -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	u8 init;  	if (lcd->ifwidth != 4 && lcd->ifwidth != 8) @@ -369,7 +369,7 @@ static bool parse_xy(const char *s, unsigned long *x, unsigned long *y)  static inline int handle_lcd_special_code(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	/* LCD special codes */ @@ -580,7 +580,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)  static void charlcd_write_char(struct charlcd *lcd, char c)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	/* first, we'll test if we're in escape mode */  	if ((c != '\n') && priv->esc_seq.len >= 0) { @@ -705,7 +705,7 @@ static ssize_t charlcd_write(struct file *file, const char __user *buf,  static int charlcd_open(struct inode *inode, struct file *file)  { -	struct charlcd_priv *priv = to_priv(the_charlcd); +	struct charlcd_priv *priv = charlcd_to_priv(the_charlcd);  	int ret;  	ret = -EBUSY; @@ -763,10 +763,24 @@ static void charlcd_puts(struct charlcd *lcd, const char *s)  	}  } +#ifdef CONFIG_PANEL_BOOT_MESSAGE +#define LCD_INIT_TEXT CONFIG_PANEL_BOOT_MESSAGE +#else +#define LCD_INIT_TEXT "Linux-" UTS_RELEASE "\n" +#endif + +#ifdef CONFIG_CHARLCD_BL_ON +#define LCD_INIT_BL "\x1b[L+" +#elif defined(CONFIG_CHARLCD_BL_FLASH) +#define LCD_INIT_BL "\x1b[L*" +#else +#define LCD_INIT_BL "\x1b[L-" +#endif +  /* initialize the LCD driver */  static int charlcd_init(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	int ret;  	if (lcd->ops->backlight) { @@ -784,13 +798,8 @@ static int charlcd_init(struct charlcd *lcd)  		return ret;  	/* display a short message */ -#ifdef CONFIG_PANEL_CHANGE_MESSAGE -#ifdef CONFIG_PANEL_BOOT_MESSAGE -	charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*" CONFIG_PANEL_BOOT_MESSAGE); -#endif -#else -	charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*Linux-" UTS_RELEASE "\n"); -#endif +	charlcd_puts(lcd, "\x1b[Lc\x1b[Lb" LCD_INIT_BL LCD_INIT_TEXT); +  	/* clear the display on the next device opening */  	priv->must_clear = true;  	charlcd_home(lcd); @@ -818,6 +827,12 @@ struct charlcd *charlcd_alloc(unsigned int drvdata_size)  }  EXPORT_SYMBOL_GPL(charlcd_alloc); +void charlcd_free(struct charlcd *lcd) +{ +	kfree(charlcd_to_priv(lcd)); +} +EXPORT_SYMBOL_GPL(charlcd_free); +  static int panel_notify_sys(struct notifier_block *this, unsigned long code,  			    void *unused)  { @@ -866,7 +881,7 @@ EXPORT_SYMBOL_GPL(charlcd_register);  int charlcd_unregister(struct charlcd *lcd)  { -	struct charlcd_priv *priv = to_priv(lcd); +	struct charlcd_priv *priv = charlcd_to_priv(lcd);  	unregister_reboot_notifier(&panel_notifier);  	charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-"); diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c index 9ad93ea42fdc..ab15b64707ad 100644 --- a/drivers/auxdisplay/hd44780.c +++ b/drivers/auxdisplay/hd44780.c @@ -271,7 +271,7 @@ static int hd44780_probe(struct platform_device *pdev)  	return 0;  fail: -	kfree(lcd); +	charlcd_free(lcd);  	return ret;  } @@ -280,6 +280,8 @@ static int hd44780_remove(struct platform_device *pdev)  	struct charlcd *lcd = platform_get_drvdata(pdev);  	charlcd_unregister(lcd); + +	charlcd_free(lcd);  	return 0;  } diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c index 21b9b2f2470a..e06de63497cf 100644 --- a/drivers/auxdisplay/panel.c +++ b/drivers/auxdisplay/panel.c @@ -1620,7 +1620,7 @@ err_lcd_unreg:  	if (lcd.enabled)  		charlcd_unregister(lcd.charlcd);  err_unreg_device: -	kfree(lcd.charlcd); +	charlcd_free(lcd.charlcd);  	lcd.charlcd = NULL;  	parport_unregister_device(pprt);  	pprt = NULL; @@ -1647,7 +1647,7 @@ static void panel_detach(struct parport *port)  	if (lcd.enabled) {  		charlcd_unregister(lcd.charlcd);  		lcd.initialized = false; -		kfree(lcd.charlcd); +		charlcd_free(lcd.charlcd);  		lcd.charlcd = NULL;  	} diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 76c9969b7124..96a6dc9d305c 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -1469,12 +1469,12 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,  	if (IS_ERR(gpd_data))  		return PTR_ERR(gpd_data); -	genpd_lock(genpd); -  	ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0;  	if (ret)  		goto out; +	genpd_lock(genpd); +  	dev_pm_domain_set(dev, &genpd->domain);  	genpd->device_count++; @@ -1482,9 +1482,8 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,  	list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); - out:  	genpd_unlock(genpd); - + out:  	if (ret)  		genpd_free_dev_data(dev, gpd_data);  	else @@ -1533,15 +1532,15 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,  	genpd->device_count--;  	genpd->max_off_time_changed = true; -	if (genpd->detach_dev) -		genpd->detach_dev(genpd, dev); -  	dev_pm_domain_set(dev, NULL);  	list_del_init(&pdd->list_node);  	genpd_unlock(genpd); +	if (genpd->detach_dev) +		genpd->detach_dev(genpd, dev); +  	genpd_free_dev_data(dev, gpd_data);  	return 0; diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index 1fad9291f6aa..7fc5a18e02ad 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -472,7 +472,7 @@ static int software_node_read_string_array(const struct fwnode_handle *fwnode,  						val, nval);  } -struct fwnode_handle * +static struct fwnode_handle *  software_node_get_parent(const struct fwnode_handle *fwnode)  {  	struct software_node *swnode = to_software_node(fwnode); @@ -481,7 +481,7 @@ software_node_get_parent(const struct fwnode_handle *fwnode)  			NULL;  } -struct fwnode_handle * +static struct fwnode_handle *  software_node_get_next_child(const struct fwnode_handle *fwnode,  			     struct fwnode_handle *child)  { diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 1e6edd568214..bf1c61cab8eb 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -656,7 +656,7 @@ static int loop_validate_file(struct file *file, struct block_device *bdev)  			return -EBADF;  		l = f->f_mapping->host->i_bdev->bd_disk->private_data; -		if (l->lo_state == Lo_unbound) { +		if (l->lo_state != Lo_bound) {  			return -EINVAL;  		}  		f = l->lo_backing_file; diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index 96670eefaeb2..377a694dc228 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c @@ -749,8 +749,12 @@ static int pcd_detect(void)  		return 0;  	printk("%s: No CD-ROM drive found\n", name); -	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) +	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) { +		blk_cleanup_queue(cd->disk->queue); +		cd->disk->queue = NULL; +		blk_mq_free_tag_set(&cd->tag_set);  		put_disk(cd->disk); +	}  	pi_unregister_driver(par_drv);  	return -1;  } diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index e92e7a8eeeb2..103b617cdc31 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c @@ -761,8 +761,12 @@ static int pf_detect(void)  		return 0;  	printk("%s: No ATAPI disk detected\n", name); -	for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) +	for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { +		blk_cleanup_queue(pf->disk->queue); +		pf->disk->queue = NULL; +		blk_mq_free_tag_set(&pf->tag_set);  		put_disk(pf->disk); +	}  	pi_unregister_driver(par_drv);  	return -1;  } @@ -1047,13 +1051,15 @@ static void __exit pf_exit(void)  	int unit;  	unregister_blkdev(major, name);  	for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { -		if (!pf->present) -			continue; -		del_gendisk(pf->disk); +		if (pf->present) +			del_gendisk(pf->disk); +  		blk_cleanup_queue(pf->disk->queue);  		blk_mq_free_tag_set(&pf->tag_set);  		put_disk(pf->disk); -		pi_release(pf->pi); + +		if (pf->present) +			pi_release(pf->pi);  	}  } diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 4ba967d65cf9..2210c1b9491b 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -833,7 +833,7 @@ static int parse_rbd_opts_token(char *c, void *private)  		pctx->opts->queue_depth = intval;  		break;  	case Opt_alloc_size: -		if (intval < 1) { +		if (intval < SECTOR_SIZE) {  			pr_err("alloc_size out of range\n");  			return -EINVAL;  		} @@ -924,23 +924,6 @@ static void rbd_put_client(struct rbd_client *rbdc)  		kref_put(&rbdc->kref, rbd_client_release);  } -static int wait_for_latest_osdmap(struct ceph_client *client) -{ -	u64 newest_epoch; -	int ret; - -	ret = ceph_monc_get_version(&client->monc, "osdmap", &newest_epoch); -	if (ret) -		return ret; - -	if (client->osdc.osdmap->epoch >= newest_epoch) -		return 0; - -	ceph_osdc_maybe_request_map(&client->osdc); -	return ceph_monc_wait_osdmap(&client->monc, newest_epoch, -				     client->options->mount_timeout); -} -  /*   * Get a ceph client with specific addr and configuration, if one does   * not exist create it.  Either way, ceph_opts is consumed by this @@ -960,7 +943,8 @@ static struct rbd_client *rbd_get_client(struct ceph_options *ceph_opts)  		 * Using an existing client.  Make sure ->pg_pools is up to  		 * date before we look up the pool id in do_rbd_add().  		 */ -		ret = wait_for_latest_osdmap(rbdc->client); +		ret = ceph_wait_for_latest_osdmap(rbdc->client, +					rbdc->client->options->mount_timeout);  		if (ret) {  			rbd_warn(NULL, "failed to get latest osdmap: %d", ret);  			rbd_put_client(rbdc); @@ -4203,12 +4187,12 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)  	q->limits.max_sectors = queue_max_hw_sectors(q);  	blk_queue_max_segments(q, USHRT_MAX);  	blk_queue_max_segment_size(q, UINT_MAX); -	blk_queue_io_min(q, objset_bytes); -	blk_queue_io_opt(q, objset_bytes); +	blk_queue_io_min(q, rbd_dev->opts->alloc_size); +	blk_queue_io_opt(q, rbd_dev->opts->alloc_size);  	if (rbd_dev->opts->trim) {  		blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); -		q->limits.discard_granularity = objset_bytes; +		q->limits.discard_granularity = rbd_dev->opts->alloc_size;  		blk_queue_max_discard_sectors(q, objset_bytes >> SECTOR_SHIFT);  		blk_queue_max_write_zeroes_sectors(q, objset_bytes >> SECTOR_SHIFT);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index bfa9062ce6b9..16fcb56c232b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -700,6 +700,8 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	struct amdgpu_vm_bo_base *bo_base, *tmp;  	int r = 0; +	vm->bulk_moveable &= list_empty(&vm->evicted); +  	list_for_each_entry_safe(bo_base, tmp, &vm->evicted, vm_status) {  		struct amdgpu_bo *bo = bo_base->bo; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 600259b4e291..2fe8397241ea 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -742,7 +742,7 @@ static int gmc_v9_0_allocate_vm_inv_eng(struct amdgpu_device *adev)  		}  		ring->vm_inv_eng = inv_eng - 1; -		change_bit(inv_eng - 1, (unsigned long *)(&vm_inv_engs[vmhub])); +		vm_inv_engs[vmhub] &= ~(1 << ring->vm_inv_eng);  		dev_info(adev->dev, "ring %s uses VM inv eng %u on hub %u\n",  			 ring->name, ring->vm_inv_eng, ring->funcs->vmhub); diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 0573eab0e190..f35e4ab55b27 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -20,6 +20,7 @@  #include "regs-vp.h"  #include <linux/kernel.h> +#include <linux/ktime.h>  #include <linux/spinlock.h>  #include <linux/wait.h>  #include <linux/i2c.h> @@ -352,15 +353,62 @@ static void mixer_cfg_vp_blend(struct mixer_context *ctx, unsigned int alpha)  	mixer_reg_write(ctx, MXR_VIDEO_CFG, val);  } -static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) +static bool mixer_is_synced(struct mixer_context *ctx)  { -	/* block update on vsync */ -	mixer_reg_writemask(ctx, MXR_STATUS, enable ? -			MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE); +	u32 base, shadow; +	if (ctx->mxr_ver == MXR_VER_16_0_33_0 || +	    ctx->mxr_ver == MXR_VER_128_0_0_184) +		return !(mixer_reg_read(ctx, MXR_CFG) & +			 MXR_CFG_LAYER_UPDATE_COUNT_MASK); + +	if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags) && +	    vp_reg_read(ctx, VP_SHADOW_UPDATE)) +		return false; + +	base = mixer_reg_read(ctx, MXR_CFG); +	shadow = mixer_reg_read(ctx, MXR_CFG_S); +	if (base != shadow) +		return false; + +	base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(0)); +	shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(0)); +	if (base != shadow) +		return false; + +	base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(1)); +	shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(1)); +	if (base != shadow) +		return false; + +	return true; +} + +static int mixer_wait_for_sync(struct mixer_context *ctx) +{ +	ktime_t timeout = ktime_add_us(ktime_get(), 100000); + +	while (!mixer_is_synced(ctx)) { +		usleep_range(1000, 2000); +		if (ktime_compare(ktime_get(), timeout) > 0) +			return -ETIMEDOUT; +	} +	return 0; +} + +static void mixer_disable_sync(struct mixer_context *ctx) +{ +	mixer_reg_writemask(ctx, MXR_STATUS, 0, MXR_STATUS_SYNC_ENABLE); +} + +static void mixer_enable_sync(struct mixer_context *ctx) +{ +	if (ctx->mxr_ver == MXR_VER_16_0_33_0 || +	    ctx->mxr_ver == MXR_VER_128_0_0_184) +		mixer_reg_writemask(ctx, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); +	mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_SYNC_ENABLE);  	if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) -		vp_reg_write(ctx, VP_SHADOW_UPDATE, enable ? -			VP_SHADOW_UPDATE_ENABLE : 0); +		vp_reg_write(ctx, VP_SHADOW_UPDATE, VP_SHADOW_UPDATE_ENABLE);  }  static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) @@ -498,7 +546,6 @@ static void vp_video_buffer(struct mixer_context *ctx,  	spin_lock_irqsave(&ctx->reg_slock, flags); -	vp_reg_write(ctx, VP_SHADOW_UPDATE, 1);  	/* interlace or progressive scan mode */  	val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0);  	vp_reg_writemask(ctx, VP_MODE, val, VP_MODE_LINE_SKIP); @@ -553,11 +600,6 @@ static void vp_video_buffer(struct mixer_context *ctx,  	vp_regs_dump(ctx);  } -static void mixer_layer_update(struct mixer_context *ctx) -{ -	mixer_reg_writemask(ctx, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); -} -  static void mixer_graph_buffer(struct mixer_context *ctx,  			       struct exynos_drm_plane *plane)  { @@ -640,11 +682,6 @@ static void mixer_graph_buffer(struct mixer_context *ctx,  	mixer_cfg_layer(ctx, win, priority, true);  	mixer_cfg_gfx_blend(ctx, win, pixel_alpha, state->base.alpha); -	/* layer update mandatory for mixer 16.0.33.0 */ -	if (ctx->mxr_ver == MXR_VER_16_0_33_0 || -		ctx->mxr_ver == MXR_VER_128_0_0_184) -		mixer_layer_update(ctx); -  	spin_unlock_irqrestore(&ctx->reg_slock, flags);  	mixer_regs_dump(ctx); @@ -709,7 +746,7 @@ static void mixer_win_reset(struct mixer_context *ctx)  static irqreturn_t mixer_irq_handler(int irq, void *arg)  {  	struct mixer_context *ctx = arg; -	u32 val, base, shadow; +	u32 val;  	spin_lock(&ctx->reg_slock); @@ -723,26 +760,9 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)  		val &= ~MXR_INT_STATUS_VSYNC;  		/* interlace scan need to check shadow register */ -		if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { -			if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags) && -			    vp_reg_read(ctx, VP_SHADOW_UPDATE)) -				goto out; - -			base = mixer_reg_read(ctx, MXR_CFG); -			shadow = mixer_reg_read(ctx, MXR_CFG_S); -			if (base != shadow) -				goto out; - -			base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(0)); -			shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(0)); -			if (base != shadow) -				goto out; - -			base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(1)); -			shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(1)); -			if (base != shadow) -				goto out; -		} +		if (test_bit(MXR_BIT_INTERLACE, &ctx->flags) +		    && !mixer_is_synced(ctx)) +			goto out;  		drm_crtc_handle_vblank(&ctx->crtc->base);  	} @@ -917,12 +937,14 @@ static void mixer_disable_vblank(struct exynos_drm_crtc *crtc)  static void mixer_atomic_begin(struct exynos_drm_crtc *crtc)  { -	struct mixer_context *mixer_ctx = crtc->ctx; +	struct mixer_context *ctx = crtc->ctx; -	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) +	if (!test_bit(MXR_BIT_POWERED, &ctx->flags))  		return; -	mixer_vsync_set_update(mixer_ctx, false); +	if (mixer_wait_for_sync(ctx)) +		dev_err(ctx->dev, "timeout waiting for VSYNC\n"); +	mixer_disable_sync(ctx);  }  static void mixer_update_plane(struct exynos_drm_crtc *crtc, @@ -964,7 +986,7 @@ static void mixer_atomic_flush(struct exynos_drm_crtc *crtc)  	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))  		return; -	mixer_vsync_set_update(mixer_ctx, true); +	mixer_enable_sync(mixer_ctx);  	exynos_crtc_handle_event(crtc);  } @@ -979,7 +1001,7 @@ static void mixer_enable(struct exynos_drm_crtc *crtc)  	exynos_drm_pipe_clk_enable(crtc, true); -	mixer_vsync_set_update(ctx, false); +	mixer_disable_sync(ctx);  	mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET); @@ -992,7 +1014,7 @@ static void mixer_enable(struct exynos_drm_crtc *crtc)  	mixer_commit(ctx); -	mixer_vsync_set_update(ctx, true); +	mixer_enable_sync(ctx);  	set_bit(MXR_BIT_POWERED, &ctx->flags);  } diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 30d516e975c6..8558e81fdc2a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1734,8 +1734,13 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,  	 * pages from.  	 */  	if (!obj->base.filp) { -		i915_gem_object_put(obj); -		return -ENXIO; +		addr = -ENXIO; +		goto err; +	} + +	if (range_overflows(args->offset, args->size, (u64)obj->base.size)) { +		addr = -EINVAL; +		goto err;  	}  	addr = vm_mmap(obj->base.filp, 0, args->size, @@ -1749,8 +1754,8 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,  		struct vm_area_struct *vma;  		if (down_write_killable(&mm->mmap_sem)) { -			i915_gem_object_put(obj); -			return -EINTR; +			addr = -EINTR; +			goto err;  		}  		vma = find_vma(mm, addr);  		if (vma && __vma_matches(vma, obj->base.filp, addr, args->size)) @@ -1768,12 +1773,10 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,  	i915_gem_object_put(obj);  	args->addr_ptr = (u64)addr; -  	return 0;  err:  	i915_gem_object_put(obj); -  	return addr;  } diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 9a65341fec09..aa6791255252 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1721,7 +1721,7 @@ error_msg(struct i915_gpu_state *error, unsigned long engines, const char *msg)  			i915_error_generate_code(error, engines));  	if (engines) {  		/* Just show the first executing process, more is confusing */ -		i = ffs(engines); +		i = __ffs(engines);  		len += scnprintf(error->error_msg + len,  				 sizeof(error->error_msg) - len,  				 ", in %s [%d]", diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index b508d8a735e0..4364f42cac6b 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -1673,6 +1673,7 @@ init_vbt_missing_defaults(struct drm_i915_private *dev_priv)  		info->supports_dvi = (port != PORT_A && port != PORT_E);  		info->supports_hdmi = info->supports_dvi;  		info->supports_dp = (port != PORT_E); +		info->supports_edp = (port == PORT_A);  	}  } diff --git a/drivers/gpu/drm/nouveau/nouveau_debugfs.c b/drivers/gpu/drm/nouveau/nouveau_debugfs.c index 88a52f6b39fe..7dfbbbc1beea 100644 --- a/drivers/gpu/drm/nouveau/nouveau_debugfs.c +++ b/drivers/gpu/drm/nouveau/nouveau_debugfs.c @@ -181,7 +181,7 @@ nouveau_debugfs_pstate_set(struct file *file, const char __user *ubuf,  	}  	ret = pm_runtime_get_sync(drm->dev); -	if (IS_ERR_VALUE(ret) && ret != -EACCES) +	if (ret < 0 && ret != -EACCES)  		return ret;  	ret = nvif_mthd(ctrl, NVIF_CONTROL_PSTATE_USER, &args, sizeof(args));  	pm_runtime_put_autosuspend(drm->dev); diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nouveau/nouveau_dmem.c index aa9fec80492d..40c47d6a7d78 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dmem.c +++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c @@ -100,12 +100,10 @@ static void  nouveau_dmem_free(struct hmm_devmem *devmem, struct page *page)  {  	struct nouveau_dmem_chunk *chunk; -	struct nouveau_drm *drm;  	unsigned long idx;  	chunk = (void *)hmm_devmem_page_get_drvdata(page);  	idx = page_to_pfn(page) - chunk->pfn_first; -	drm = chunk->drm;  	/*  	 * FIXME: @@ -456,11 +454,6 @@ nouveau_dmem_resume(struct nouveau_drm *drm)  		/* FIXME handle pin failure */  		WARN_ON(ret);  	} -	list_for_each_entry (chunk, &drm->dmem->chunk_empty, list) { -		ret = nouveau_bo_pin(chunk->bo, TTM_PL_FLAG_VRAM, false); -		/* FIXME handle pin failure */ -		WARN_ON(ret); -	}  	mutex_unlock(&drm->dmem->mutex);  } @@ -479,9 +472,6 @@ nouveau_dmem_suspend(struct nouveau_drm *drm)  	list_for_each_entry (chunk, &drm->dmem->chunk_full, list) {  		nouveau_bo_unpin(chunk->bo);  	} -	list_for_each_entry (chunk, &drm->dmem->chunk_empty, list) { -		nouveau_bo_unpin(chunk->bo); -	}  	mutex_unlock(&drm->dmem->mutex);  } @@ -623,7 +613,7 @@ nouveau_dmem_init(struct nouveau_drm *drm)  	 */  	drm->dmem->devmem = hmm_devmem_add(&nouveau_dmem_devmem_ops,  					   device, size); -	if (drm->dmem->devmem == NULL) { +	if (IS_ERR(drm->dmem->devmem)) {  		kfree(drm->dmem);  		drm->dmem = NULL;  		return; diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index d5a23295dd80..bb7b58407039 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c @@ -224,7 +224,7 @@ int udl_gem_mmap(struct drm_file *file, struct drm_device *dev,  	*offset = drm_vma_node_offset_addr(&gobj->base.vma_node);  out: -	drm_gem_object_put(&gobj->base); +	drm_gem_object_put_unlocked(&gobj->base);  unlock:  	mutex_unlock(&udl->gem_lock);  	return ret; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c index b913a56f3426..2a9112515f46 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c @@ -564,11 +564,9 @@ static int vmw_fb_set_par(struct fb_info *info)  		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  		DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC)  	}; -	struct drm_display_mode *old_mode;  	struct drm_display_mode *mode;  	int ret; -	old_mode = par->set_mode;  	mode = drm_mode_duplicate(vmw_priv->dev, &new_mode);  	if (!mode) {  		DRM_ERROR("Could not create new fb mode.\n"); @@ -579,11 +577,7 @@ static int vmw_fb_set_par(struct fb_info *info)  	mode->vdisplay = var->yres;  	vmw_guess_mode_timing(mode); -	if (old_mode && drm_mode_equal(old_mode, mode)) { -		drm_mode_destroy(vmw_priv->dev, mode); -		mode = old_mode; -		old_mode = NULL; -	} else if (!vmw_kms_validate_mode_vram(vmw_priv, +	if (!vmw_kms_validate_mode_vram(vmw_priv,  					mode->hdisplay *  					DIV_ROUND_UP(var->bits_per_pixel, 8),  					mode->vdisplay)) { @@ -620,8 +614,8 @@ static int vmw_fb_set_par(struct fb_info *info)  	schedule_delayed_work(&par->local_work, 0);  out_unlock: -	if (old_mode) -		drm_mode_destroy(vmw_priv->dev, old_mode); +	if (par->set_mode) +		drm_mode_destroy(vmw_priv->dev, par->set_mode);  	par->set_mode = mode;  	mutex_unlock(&par->bo_mutex); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c index b93c558dd86e..7da752ca1c34 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c @@ -57,7 +57,7 @@ static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,  	id = ida_alloc_max(&gman->gmr_ida, gman->max_gmr_ids - 1, GFP_KERNEL);  	if (id < 0) -		return id; +		return (id != -ENOMEM ? 0 : id);  	spin_lock(&gman->lock); diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c index c5a881172524..337410f40860 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_utils.c +++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c @@ -173,7 +173,12 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,  		rcu_read_lock();  		in = __in_dev_get_rcu(upper_dev); -		local_ipaddr = ntohl(in->ifa_list->ifa_address); + +		if (!in->ifa_list) +			local_ipaddr = 0; +		else +			local_ipaddr = ntohl(in->ifa_list->ifa_address); +  		rcu_read_unlock();  	} else {  		local_ipaddr = ntohl(ifa->ifa_address); @@ -185,6 +190,11 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,  	case NETDEV_UP:  		/* Fall through */  	case NETDEV_CHANGEADDR: + +		/* Just skip if no need to handle ARP cache */ +		if (!local_ipaddr) +			break; +  		i40iw_manage_arp_cache(iwdev,  				       netdev->dev_addr,  				       &local_ipaddr, diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c index 782499abcd98..2a0b59a4b6eb 100644 --- a/drivers/infiniband/hw/mlx4/alias_GUID.c +++ b/drivers/infiniband/hw/mlx4/alias_GUID.c @@ -804,8 +804,8 @@ void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev)  	unsigned long flags;  	for (i = 0 ; i < dev->num_ports; i++) { -		cancel_delayed_work(&dev->sriov.alias_guid.ports_guid[i].alias_guid_work);  		det = &sriov->alias_guid.ports_guid[i]; +		cancel_delayed_work_sync(&det->alias_guid_work);  		spin_lock_irqsave(&sriov->alias_guid.ag_work_lock, flags);  		while (!list_empty(&det->cb_list)) {  			cb_ctx = list_entry(det->cb_list.next, diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index eaa055007f28..9e08df7914aa 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -20,6 +20,7 @@  enum devx_obj_flags {  	DEVX_OBJ_FLAGS_INDIRECT_MKEY = 1 << 0, +	DEVX_OBJ_FLAGS_DCT = 1 << 1,  };  struct devx_async_data { @@ -39,7 +40,10 @@ struct devx_obj {  	u32			dinlen; /* destroy inbox length */  	u32			dinbox[MLX5_MAX_DESTROY_INBOX_SIZE_DW];  	u32			flags; -	struct mlx5_ib_devx_mr	devx_mr; +	union { +		struct mlx5_ib_devx_mr	devx_mr; +		struct mlx5_core_dct	core_dct; +	};  };  struct devx_umem { @@ -347,7 +351,6 @@ static u64 devx_get_obj_id(const void *in)  		obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,  					MLX5_GET(arm_rq_in, in, srq_number));  		break; -	case MLX5_CMD_OP_DRAIN_DCT:  	case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:  		obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,  					MLX5_GET(drain_dct_in, in, dctn)); @@ -618,7 +621,6 @@ static bool devx_is_obj_modify_cmd(const void *in)  	case MLX5_CMD_OP_2RST_QP:  	case MLX5_CMD_OP_ARM_XRC_SRQ:  	case MLX5_CMD_OP_ARM_RQ: -	case MLX5_CMD_OP_DRAIN_DCT:  	case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:  	case MLX5_CMD_OP_ARM_XRQ:  	case MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY: @@ -1124,7 +1126,11 @@ static int devx_obj_cleanup(struct ib_uobject *uobject,  	if (obj->flags & DEVX_OBJ_FLAGS_INDIRECT_MKEY)  		devx_cleanup_mkey(obj); -	ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out)); +	if (obj->flags & DEVX_OBJ_FLAGS_DCT) +		ret = mlx5_core_destroy_dct(obj->mdev, &obj->core_dct); +	else +		ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, +				    sizeof(out));  	if (ib_is_destroy_retryable(ret, why, uobject))  		return ret; @@ -1185,9 +1191,17 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(  		devx_set_umem_valid(cmd_in);  	} -	err = mlx5_cmd_exec(dev->mdev, cmd_in, -			    cmd_in_len, -			    cmd_out, cmd_out_len); +	if (opcode == MLX5_CMD_OP_CREATE_DCT) { +		obj->flags |= DEVX_OBJ_FLAGS_DCT; +		err = mlx5_core_create_dct(dev->mdev, &obj->core_dct, +					   cmd_in, cmd_in_len, +					   cmd_out, cmd_out_len); +	} else { +		err = mlx5_cmd_exec(dev->mdev, cmd_in, +				    cmd_in_len, +				    cmd_out, cmd_out_len); +	} +  	if (err)  		goto obj_free; @@ -1214,7 +1228,11 @@ err_copy:  	if (obj->flags & DEVX_OBJ_FLAGS_INDIRECT_MKEY)  		devx_cleanup_mkey(obj);  obj_destroy: -	mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out)); +	if (obj->flags & DEVX_OBJ_FLAGS_DCT) +		mlx5_core_destroy_dct(obj->mdev, &obj->core_dct); +	else +		mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, +			      sizeof(out));  obj_free:  	kfree(obj);  	return err; diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 994c19d01211..531ff20b32ad 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -415,10 +415,17 @@ static int translate_eth_ext_proto_oper(u32 eth_proto_oper, u8 *active_speed,  		*active_speed = IB_SPEED_EDR;  		break;  	case MLX5E_PROT_MASK(MLX5E_50GAUI_2_LAUI_2_50GBASE_CR2_KR2): +		*active_width = IB_WIDTH_2X; +		*active_speed = IB_SPEED_EDR; +		break;  	case MLX5E_PROT_MASK(MLX5E_50GAUI_1_LAUI_1_50GBASE_CR_KR):  		*active_width = IB_WIDTH_1X;  		*active_speed = IB_SPEED_HDR;  		break; +	case MLX5E_PROT_MASK(MLX5E_CAUI_4_100GBASE_CR4_KR4): +		*active_width = IB_WIDTH_4X; +		*active_speed = IB_SPEED_EDR; +		break;  	case MLX5E_PROT_MASK(MLX5E_100GAUI_2_100GBASE_CR2_KR2):  		*active_width = IB_WIDTH_2X;  		*active_speed = IB_SPEED_HDR; diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 6b1f0e76900b..7cd006da1dae 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -3729,6 +3729,7 @@ static int mlx5_ib_modify_dct(struct ib_qp *ibqp, struct ib_qp_attr *attr,  	} else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR) {  		struct mlx5_ib_modify_qp_resp resp = {}; +		u32 out[MLX5_ST_SZ_DW(create_dct_out)] = {0};  		u32 min_resp_len = offsetof(typeof(resp), dctn) +  				   sizeof(resp.dctn); @@ -3747,7 +3748,8 @@ static int mlx5_ib_modify_dct(struct ib_qp *ibqp, struct ib_qp_attr *attr,  		MLX5_SET(dctc, dctc, hop_limit, attr->ah_attr.grh.hop_limit);  		err = mlx5_core_create_dct(dev->mdev, &qp->dct.mdct, qp->dct.in, -					   MLX5_ST_SZ_BYTES(create_dct_in)); +					   MLX5_ST_SZ_BYTES(create_dct_in), out, +					   sizeof(out));  		if (err)  			return err;  		resp.dctn = qp->dct.mdct.mqp.qpn; diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b319e51c379b..21cb088d6687 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2608,7 +2608,12 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,  	/* Everything is mapped - write the right values into s->dma_address */  	for_each_sg(sglist, s, nelems, i) { -		s->dma_address += address + s->offset; +		/* +		 * Add in the remaining piece of the scatter-gather offset that +		 * was masked out when we were determining the physical address +		 * via (sg_phys(s) & PAGE_MASK) earlier. +		 */ +		s->dma_address += address + (s->offset & ~PAGE_MASK);  		s->dma_length   = s->length;  	} diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 87274b54febd..28cb713d728c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -1538,6 +1538,9 @@ static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu)  	u32 pmen;  	unsigned long flags; +	if (!cap_plmr(iommu->cap) && !cap_phmr(iommu->cap)) +		return; +  	raw_spin_lock_irqsave(&iommu->register_lock, flags);  	pmen = readl(iommu->reg + DMAR_PMEN_REG);  	pmen &= ~DMA_PMEN_EPM; @@ -5332,7 +5335,7 @@ int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_dev *sd  	ctx_lo = context[0].lo; -	sdev->did = domain->iommu_did[iommu->seq_id]; +	sdev->did = FLPT_DEFAULT_DID;  	sdev->sid = PCI_DEVID(info->bus, info->devfn);  	if (!(ctx_lo & CONTEXT_PASIDE)) { diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index f8d3ba247523..2de8122e218f 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -207,8 +207,10 @@ static int __alloc_and_insert_iova_range(struct iova_domain *iovad,  		curr_iova = rb_entry(curr, struct iova, node);  	} while (curr && new_pfn <= curr_iova->pfn_hi); -	if (limit_pfn < size || new_pfn < iovad->start_pfn) +	if (limit_pfn < size || new_pfn < iovad->start_pfn) { +		iovad->max32_alloc_size = size;  		goto iova32_full; +	}  	/* pfn_lo will point to size aligned address if size_aligned is set */  	new->pfn_lo = new_pfn; @@ -222,7 +224,6 @@ static int __alloc_and_insert_iova_range(struct iova_domain *iovad,  	return 0;  iova32_full: -	iovad->max32_alloc_size = size;  	spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);  	return -ENOMEM;  } diff --git a/drivers/mmc/host/alcor.c b/drivers/mmc/host/alcor.c index c712b7deb3a9..82a97866e0cf 100644 --- a/drivers/mmc/host/alcor.c +++ b/drivers/mmc/host/alcor.c @@ -1044,14 +1044,27 @@ static void alcor_init_mmc(struct alcor_sdmmc_host *host)  	mmc->caps2 = MMC_CAP2_NO_SDIO;  	mmc->ops = &alcor_sdc_ops; -	/* Hardware cannot do scatter lists */ +	/* The hardware does DMA data transfer of 4096 bytes to/from a single +	 * buffer address. Scatterlists are not supported, but upon DMA +	 * completion (signalled via IRQ), the original vendor driver does +	 * then immediately set up another DMA transfer of the next 4096 +	 * bytes. +	 * +	 * This means that we need to handle the I/O in 4096 byte chunks. +	 * Lacking a way to limit the sglist entries to 4096 bytes, we instead +	 * impose that only one segment is provided, with maximum size 4096, +	 * which also happens to be the minimum size. This means that the +	 * single-entry sglist handled by this driver can be handed directly +	 * to the hardware, nice and simple. +	 * +	 * Unfortunately though, that means we only do 4096 bytes I/O per +	 * MMC command. A future improvement would be to make the driver +	 * accept sg lists and entries of any size, and simply iterate +	 * through them 4096 bytes at a time. +	 */  	mmc->max_segs = AU6601_MAX_DMA_SEGMENTS;  	mmc->max_seg_size = AU6601_MAX_DMA_BLOCK_SIZE; - -	mmc->max_blk_size = mmc->max_seg_size; -	mmc->max_blk_count = mmc->max_segs; - -	mmc->max_req_size = mmc->max_seg_size * mmc->max_segs; +	mmc->max_req_size = mmc->max_seg_size;  }  static int alcor_pci_sdmmc_drv_probe(struct platform_device *pdev) diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c index 49e0daf2ef5e..f37003df1e01 100644 --- a/drivers/mmc/host/davinci_mmc.c +++ b/drivers/mmc/host/davinci_mmc.c @@ -1117,7 +1117,7 @@ static inline void mmc_davinci_cpufreq_deregister(struct mmc_davinci_host *host)  {  }  #endif -static void __init init_mmcsd_host(struct mmc_davinci_host *host) +static void init_mmcsd_host(struct mmc_davinci_host *host)  {  	mmc_davinci_reset_ctrl(host, 1); diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index d54612257b06..45f7b9b53d48 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -290,11 +290,8 @@ static void mxcmci_swap_buffers(struct mmc_data *data)  	struct scatterlist *sg;  	int i; -	for_each_sg(data->sg, sg, data->sg_len, i) { -		void *buf = kmap_atomic(sg_page(sg) + sg->offset); -		buffer_swap32(buf, sg->length); -		kunmap_atomic(buf); -	} +	for_each_sg(data->sg, sg, data->sg_len, i) +		buffer_swap32(sg_virt(sg), sg->length);  }  #else  static inline void mxcmci_swap_buffers(struct mmc_data *data) {} @@ -611,7 +608,6 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)  {  	struct mmc_data *data = host->req->data;  	struct scatterlist *sg; -	void *buf;  	int stat, i;  	host->data = data; @@ -619,18 +615,14 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)  	if (data->flags & MMC_DATA_READ) {  		for_each_sg(data->sg, sg, data->sg_len, i) { -			buf = kmap_atomic(sg_page(sg) + sg->offset); -			stat = mxcmci_pull(host, buf, sg->length); -			kunmap(buf); +			stat = mxcmci_pull(host, sg_virt(sg), sg->length);  			if (stat)  				return stat;  			host->datasize += sg->length;  		}  	} else {  		for_each_sg(data->sg, sg, data->sg_len, i) { -			buf = kmap_atomic(sg_page(sg) + sg->offset); -			stat = mxcmci_push(host, buf, sg->length); -			kunmap(buf); +			stat = mxcmci_push(host, sg_virt(sg), sg->length);  			if (stat)  				return stat;  			host->datasize += sg->length; diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index c907bf502a12..c1d3f0e38921 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c @@ -162,7 +162,7 @@ static void pxamci_dma_irq(void *param);  static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)  {  	struct dma_async_tx_descriptor *tx; -	enum dma_data_direction direction; +	enum dma_transfer_direction direction;  	struct dma_slave_config	config;  	struct dma_chan *chan;  	unsigned int nob = data->blocks; diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c index 71e13844df6c..8742e27e4e8b 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -641,6 +641,7 @@ int renesas_sdhi_probe(struct platform_device *pdev,  	struct renesas_sdhi *priv;  	struct resource *res;  	int irq, ret, i; +	u16 ver;  	of_data = of_device_get_match_data(&pdev->dev); @@ -773,12 +774,17 @@ int renesas_sdhi_probe(struct platform_device *pdev,  	if (ret)  		goto efree; +	ver = sd_ctrl_read16(host, CTL_VERSION); +	/* GEN2_SDR104 is first known SDHI to use 32bit block count */ +	if (ver < SDHI_VER_GEN2_SDR104 && mmc_data->max_blk_count > U16_MAX) +		mmc_data->max_blk_count = U16_MAX; +  	ret = tmio_mmc_host_probe(host);  	if (ret < 0)  		goto edisclk;  	/* One Gen2 SDHI incarnation does NOT have a CBSY bit */ -	if (sd_ctrl_read16(host, CTL_VERSION) == SDHI_VER_GEN2_SDR50) +	if (ver == SDHI_VER_GEN2_SDR50)  		mmc_data->flags &= ~TMIO_MMC_HAVE_CBSY;  	/* Enable tuning iff we have an SCC and a supported mode */ diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c index b1a66ca3821a..5bbed477c9b1 100644 --- a/drivers/mmc/host/sdhci-omap.c +++ b/drivers/mmc/host/sdhci-omap.c @@ -1056,6 +1056,9 @@ static int sdhci_omap_probe(struct platform_device *pdev)  			mmc->f_max = 48000000;  	} +	if (!mmc_can_gpio_ro(mmc)) +		mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT; +  	pltfm_host->clk = devm_clk_get(dev, "fck");  	if (IS_ERR(pltfm_host->clk)) {  		ret = PTR_ERR(pltfm_host->clk); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qp.c b/drivers/net/ethernet/mellanox/mlx5/core/qp.c index 370ca94b6775..b8ba74de9555 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/qp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/qp.c @@ -40,6 +40,9 @@  #include "mlx5_core.h"  #include "lib/eq.h" +static int mlx5_core_drain_dct(struct mlx5_core_dev *dev, +			       struct mlx5_core_dct *dct); +  static struct mlx5_core_rsc_common *  mlx5_get_rsc(struct mlx5_qp_table *table, u32 rsn)  { @@ -227,20 +230,49 @@ static void destroy_resource_common(struct mlx5_core_dev *dev,  	wait_for_completion(&qp->common.free);  } +static int _mlx5_core_destroy_dct(struct mlx5_core_dev *dev, +				  struct mlx5_core_dct *dct, bool need_cleanup) +{ +	u32 out[MLX5_ST_SZ_DW(destroy_dct_out)] = {0}; +	u32 in[MLX5_ST_SZ_DW(destroy_dct_in)]   = {0}; +	struct mlx5_core_qp *qp = &dct->mqp; +	int err; + +	err = mlx5_core_drain_dct(dev, dct); +	if (err) { +		if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { +			goto destroy; +		} else { +			mlx5_core_warn( +				dev, "failed drain DCT 0x%x with error 0x%x\n", +				qp->qpn, err); +			return err; +		} +	} +	wait_for_completion(&dct->drained); +destroy: +	if (need_cleanup) +		destroy_resource_common(dev, &dct->mqp); +	MLX5_SET(destroy_dct_in, in, opcode, MLX5_CMD_OP_DESTROY_DCT); +	MLX5_SET(destroy_dct_in, in, dctn, qp->qpn); +	MLX5_SET(destroy_dct_in, in, uid, qp->uid); +	err = mlx5_cmd_exec(dev, (void *)&in, sizeof(in), +			    (void *)&out, sizeof(out)); +	return err; +} +  int mlx5_core_create_dct(struct mlx5_core_dev *dev,  			 struct mlx5_core_dct *dct, -			 u32 *in, int inlen) +			 u32 *in, int inlen, +			 u32 *out, int outlen)  { -	u32 out[MLX5_ST_SZ_DW(create_dct_out)]   = {0}; -	u32 din[MLX5_ST_SZ_DW(destroy_dct_in)]   = {0}; -	u32 dout[MLX5_ST_SZ_DW(destroy_dct_out)] = {0};  	struct mlx5_core_qp *qp = &dct->mqp;  	int err;  	init_completion(&dct->drained);  	MLX5_SET(create_dct_in, in, opcode, MLX5_CMD_OP_CREATE_DCT); -	err = mlx5_cmd_exec(dev, in, inlen, &out, sizeof(out)); +	err = mlx5_cmd_exec(dev, in, inlen, out, outlen);  	if (err) {  		mlx5_core_warn(dev, "create DCT failed, ret %d\n", err);  		return err; @@ -254,11 +286,7 @@ int mlx5_core_create_dct(struct mlx5_core_dev *dev,  	return 0;  err_cmd: -	MLX5_SET(destroy_dct_in, din, opcode, MLX5_CMD_OP_DESTROY_DCT); -	MLX5_SET(destroy_dct_in, din, dctn, qp->qpn); -	MLX5_SET(destroy_dct_in, din, uid, qp->uid); -	mlx5_cmd_exec(dev, (void *)&in, sizeof(din), -		      (void *)&out, sizeof(dout)); +	_mlx5_core_destroy_dct(dev, dct, false);  	return err;  }  EXPORT_SYMBOL_GPL(mlx5_core_create_dct); @@ -323,29 +351,7 @@ static int mlx5_core_drain_dct(struct mlx5_core_dev *dev,  int mlx5_core_destroy_dct(struct mlx5_core_dev *dev,  			  struct mlx5_core_dct *dct)  { -	u32 out[MLX5_ST_SZ_DW(destroy_dct_out)] = {0}; -	u32 in[MLX5_ST_SZ_DW(destroy_dct_in)]   = {0}; -	struct mlx5_core_qp *qp = &dct->mqp; -	int err; - -	err = mlx5_core_drain_dct(dev, dct); -	if (err) { -		if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { -			goto destroy; -		} else { -			mlx5_core_warn(dev, "failed drain DCT 0x%x with error 0x%x\n", qp->qpn, err); -			return err; -		} -	} -	wait_for_completion(&dct->drained); -destroy: -	destroy_resource_common(dev, &dct->mqp); -	MLX5_SET(destroy_dct_in, in, opcode, MLX5_CMD_OP_DESTROY_DCT); -	MLX5_SET(destroy_dct_in, in, dctn, qp->qpn); -	MLX5_SET(destroy_dct_in, in, uid, qp->uid); -	err = mlx5_cmd_exec(dev, (void *)&in, sizeof(in), -			    (void *)&out, sizeof(out)); -	return err; +	return _mlx5_core_destroy_dct(dev, dct, true);  }  EXPORT_SYMBOL_GPL(mlx5_core_destroy_dct); diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c index 900c7073c46f..71308766e891 100644 --- a/drivers/platform/chrome/cros_ec_debugfs.c +++ b/drivers/platform/chrome/cros_ec_debugfs.c @@ -440,7 +440,7 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)  	ret = cros_ec_create_pdinfo(debug_info);  	if (ret) -		goto remove_debugfs; +		goto remove_log;  	ec->debug_info = debug_info; @@ -448,6 +448,8 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)  	return 0; +remove_log: +	cros_ec_cleanup_console_log(debug_info);  remove_debugfs:  	debugfs_remove_recursive(debug_info->dir);  	return ret; @@ -467,7 +469,8 @@ static int __maybe_unused cros_ec_debugfs_suspend(struct device *dev)  {  	struct cros_ec_dev *ec = dev_get_drvdata(dev); -	cancel_delayed_work_sync(&ec->debug_info->log_poll_work); +	if (ec->debug_info->log_buffer.buf) +		cancel_delayed_work_sync(&ec->debug_info->log_poll_work);  	return 0;  } @@ -476,7 +479,8 @@ static int __maybe_unused cros_ec_debugfs_resume(struct device *dev)  {  	struct cros_ec_dev *ec = dev_get_drvdata(dev); -	schedule_delayed_work(&ec->debug_info->log_poll_work, 0); +	if (ec->debug_info->log_buffer.buf) +		schedule_delayed_work(&ec->debug_info->log_poll_work, 0);  	return 0;  } diff --git a/drivers/platform/chrome/wilco_ec/mailbox.c b/drivers/platform/chrome/wilco_ec/mailbox.c index f6ff29a11f1a..14355668ddfa 100644 --- a/drivers/platform/chrome/wilco_ec/mailbox.c +++ b/drivers/platform/chrome/wilco_ec/mailbox.c @@ -223,11 +223,11 @@ int wilco_ec_mailbox(struct wilco_ec_device *ec, struct wilco_ec_message *msg)  		msg->command, msg->type, msg->flags, msg->response_size,  		msg->request_size); +	mutex_lock(&ec->mailbox_lock);  	/* Prepare request packet */  	rq = ec->data_buffer;  	wilco_ec_prepare(msg, rq); -	mutex_lock(&ec->mailbox_lock);  	ret = wilco_ec_transfer(ec, msg, rq);  	mutex_unlock(&ec->mailbox_lock); diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index 3c3cf89f713f..14bac4966c87 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1801,6 +1801,12 @@ static int hisi_sas_I_T_nexus_reset(struct domain_device *device)  	}  	hisi_sas_dereg_device(hisi_hba, device); +	if (dev_is_sata(device)) { +		rc = hisi_sas_softreset_ata_disk(device); +		if (rc) +			return TMF_RESP_FUNC_FAILED; +	} +  	rc = hisi_sas_debug_I_T_nexus_reset(device);  	if ((rc == TMF_RESP_FUNC_COMPLETE) || (rc == -ENODEV)) diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 1135e74646e2..8cec5230fe31 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c @@ -96,6 +96,7 @@ static int client_reserve = 1;  static char partition_name[96] = "UNKNOWN";  static unsigned int partition_number = -1;  static LIST_HEAD(ibmvscsi_head); +static DEFINE_SPINLOCK(ibmvscsi_driver_lock);  static struct scsi_transport_template *ibmvscsi_transport_template; @@ -2270,7 +2271,9 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)  	}  	dev_set_drvdata(&vdev->dev, hostdata); +	spin_lock(&ibmvscsi_driver_lock);  	list_add_tail(&hostdata->host_list, &ibmvscsi_head); +	spin_unlock(&ibmvscsi_driver_lock);  	return 0;        add_srp_port_failed: @@ -2292,15 +2295,27 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)  static int ibmvscsi_remove(struct vio_dev *vdev)  {  	struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev); -	list_del(&hostdata->host_list); -	unmap_persist_bufs(hostdata); +	unsigned long flags; + +	srp_remove_host(hostdata->host); +	scsi_remove_host(hostdata->host); + +	purge_requests(hostdata, DID_ERROR); + +	spin_lock_irqsave(hostdata->host->host_lock, flags);  	release_event_pool(&hostdata->pool, hostdata); +	spin_unlock_irqrestore(hostdata->host->host_lock, flags); +  	ibmvscsi_release_crq_queue(&hostdata->queue, hostdata,  					max_events);  	kthread_stop(hostdata->work_thread); -	srp_remove_host(hostdata->host); -	scsi_remove_host(hostdata->host); +	unmap_persist_bufs(hostdata); + +	spin_lock(&ibmvscsi_driver_lock); +	list_del(&hostdata->host_list); +	spin_unlock(&ibmvscsi_driver_lock); +  	scsi_host_put(hostdata->host);  	return 0; diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 420045155ba0..0c700b140ce7 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -4991,6 +4991,13 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)  		if ((domain & 0xf0) == 0xf0)  			continue; +		/* Bypass if not same domain and area of adapter. */ +		if (area && domain && ((area != vha->d_id.b.area) || +		    (domain != vha->d_id.b.domain)) && +		    (ha->current_topology == ISP_CFG_NL)) +			continue; + +  		/* Bypass invalid local loop ID. */  		if (loop_id > LAST_LOCAL_LOOP_ID)  			continue; diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 677f82fdf56f..91f576d743fe 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -1517,7 +1517,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type,  		goto eh_reset_failed;  	}  	err = 2; -	if (do_reset(fcport, cmd->device->lun, blk_mq_rq_cpu(cmd->request) + 1) +	if (do_reset(fcport, cmd->device->lun, 1)  		!= QLA_SUCCESS) {  		ql_log(ql_log_warn, vha, 0x800c,  		    "do_reset failed for cmd=%p.\n", cmd); diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 20189675677a..601b9f1de267 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -585,10 +585,17 @@ static bool scsi_end_request(struct request *req, blk_status_t error,  	if (!blk_rq_is_scsi(req)) {  		WARN_ON_ONCE(!(cmd->flags & SCMD_INITIALIZED));  		cmd->flags &= ~SCMD_INITIALIZED; -		destroy_rcu_head(&cmd->rcu);  	}  	/* +	 * Calling rcu_barrier() is not necessary here because the +	 * SCSI error handler guarantees that the function called by +	 * call_rcu() has been called before scsi_end_request() is +	 * called. +	 */ +	destroy_rcu_head(&cmd->rcu); + +	/*  	 * In the MQ case the command gets freed by __blk_mq_end_request,  	 * so we have to do all cleanup that depends on it earlier.  	 * @@ -2541,8 +2548,10 @@ void scsi_device_resume(struct scsi_device *sdev)  	 * device deleted during suspend)  	 */  	mutex_lock(&sdev->state_mutex); -	sdev->quiesced_by = NULL; -	blk_clear_pm_only(sdev->request_queue); +	if (sdev->quiesced_by) { +		sdev->quiesced_by = NULL; +		blk_clear_pm_only(sdev->request_queue); +	}  	if (sdev->sdev_state == SDEV_QUIESCE)  		scsi_device_set_state(sdev, SDEV_RUNNING);  	mutex_unlock(&sdev->state_mutex); diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 0508831d6fb9..0a82e93566dc 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -2200,6 +2200,8 @@ void iscsi_remove_session(struct iscsi_cls_session *session)  	scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);  	/* flush running scans then delete devices */  	flush_work(&session->scan_work); +	/* flush running unbind operations */ +	flush_work(&session->unbind_work);  	__iscsi_unbind_session(&session->unbind_work);  	/* hw iscsi may not have removed all connections from session */ diff --git a/drivers/thermal/broadcom/bcm2835_thermal.c b/drivers/thermal/broadcom/bcm2835_thermal.c index 720760cd493f..ba39647a690c 100644 --- a/drivers/thermal/broadcom/bcm2835_thermal.c +++ b/drivers/thermal/broadcom/bcm2835_thermal.c @@ -119,8 +119,7 @@ static const struct debugfs_reg32 bcm2835_thermal_regs[] = {  static void bcm2835_thermal_debugfs(struct platform_device *pdev)  { -	struct thermal_zone_device *tz = platform_get_drvdata(pdev); -	struct bcm2835_thermal_data *data = tz->devdata; +	struct bcm2835_thermal_data *data = platform_get_drvdata(pdev);  	struct debugfs_regset32 *regset;  	data->debugfsdir = debugfs_create_dir("bcm2835_thermal", NULL); @@ -266,7 +265,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)  	data->tz = tz; -	platform_set_drvdata(pdev, tz); +	platform_set_drvdata(pdev, data);  	/*  	 * Thermal_zone doesn't enable hwmon as default, @@ -290,8 +289,8 @@ err_clk:  static int bcm2835_thermal_remove(struct platform_device *pdev)  { -	struct thermal_zone_device *tz = platform_get_drvdata(pdev); -	struct bcm2835_thermal_data *data = tz->devdata; +	struct bcm2835_thermal_data *data = platform_get_drvdata(pdev); +	struct thermal_zone_device *tz = data->tz;  	debugfs_remove_recursive(data->debugfsdir);  	thermal_zone_of_sensor_unregister(&pdev->dev, tz); diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c index 6fff16113628..f7c1f49ec87f 100644 --- a/drivers/thermal/cpu_cooling.c +++ b/drivers/thermal/cpu_cooling.c @@ -536,12 +536,11 @@ static int cpufreq_power2state(struct thermal_cooling_device *cdev,  			       struct thermal_zone_device *tz, u32 power,  			       unsigned long *state)  { -	unsigned int cur_freq, target_freq; +	unsigned int target_freq;  	u32 last_load, normalised_power;  	struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;  	struct cpufreq_policy *policy = cpufreq_cdev->policy; -	cur_freq = cpufreq_quick_get(policy->cpu);  	power = power > 0 ? power : 0;  	last_load = cpufreq_cdev->last_load ?: 1;  	normalised_power = (power * 100) / last_load; diff --git a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c index 61ca7ce3624e..5f3ed24e26ec 100644 --- a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c +++ b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c @@ -22,6 +22,13 @@ enum int3400_thermal_uuid {  	INT3400_THERMAL_PASSIVE_1,  	INT3400_THERMAL_ACTIVE,  	INT3400_THERMAL_CRITICAL, +	INT3400_THERMAL_ADAPTIVE_PERFORMANCE, +	INT3400_THERMAL_EMERGENCY_CALL_MODE, +	INT3400_THERMAL_PASSIVE_2, +	INT3400_THERMAL_POWER_BOSS, +	INT3400_THERMAL_VIRTUAL_SENSOR, +	INT3400_THERMAL_COOLING_MODE, +	INT3400_THERMAL_HARDWARE_DUTY_CYCLING,  	INT3400_THERMAL_MAXIMUM_UUID,  }; @@ -29,6 +36,13 @@ static char *int3400_thermal_uuids[INT3400_THERMAL_MAXIMUM_UUID] = {  	"42A441D6-AE6A-462b-A84B-4A8CE79027D3",  	"3A95C389-E4B8-4629-A526-C52C88626BAE",  	"97C68AE7-15FA-499c-B8C9-5DA81D606E0A", +	"63BE270F-1C11-48FD-A6F7-3AF253FF3E2D", +	"5349962F-71E6-431D-9AE8-0A635B710AEE", +	"9E04115A-AE87-4D1C-9500-0F3E340BFE75", +	"F5A35014-C209-46A4-993A-EB56DE7530A1", +	"6ED722A7-9240-48A5-B479-31EEF723D7CF", +	"16CAF1B7-DD38-40ED-B1C1-1B8A1913D531", +	"BE84BABF-C4D4-403D-B495-3128FD44dAC1",  };  struct int3400_thermal_priv { @@ -299,10 +313,9 @@ static int int3400_thermal_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, priv); -	if (priv->uuid_bitmap & 1 << INT3400_THERMAL_PASSIVE_1) { -		int3400_thermal_ops.get_mode = int3400_thermal_get_mode; -		int3400_thermal_ops.set_mode = int3400_thermal_set_mode; -	} +	int3400_thermal_ops.get_mode = int3400_thermal_get_mode; +	int3400_thermal_ops.set_mode = int3400_thermal_set_mode; +  	priv->thermal = thermal_zone_device_register("INT3400 Thermal", 0, 0,  						priv, &int3400_thermal_ops,  						&int3400_thermal_params, 0, 0); diff --git a/drivers/thermal/intel/intel_powerclamp.c b/drivers/thermal/intel/intel_powerclamp.c index 7571f7c2e7c9..ac7256b5f020 100644 --- a/drivers/thermal/intel/intel_powerclamp.c +++ b/drivers/thermal/intel/intel_powerclamp.c @@ -101,7 +101,7 @@ struct powerclamp_worker_data {  	bool clamping;  }; -static struct powerclamp_worker_data * __percpu worker_data; +static struct powerclamp_worker_data __percpu *worker_data;  static struct thermal_cooling_device *cooling_dev;  static unsigned long *cpu_clamping_mask;  /* bit map for tracking per cpu  					   * clamping kthread worker @@ -494,7 +494,7 @@ static void start_power_clamp_worker(unsigned long cpu)  	struct powerclamp_worker_data *w_data = per_cpu_ptr(worker_data, cpu);  	struct kthread_worker *worker; -	worker = kthread_create_worker_on_cpu(cpu, 0, "kidle_inject/%ld", cpu); +	worker = kthread_create_worker_on_cpu(cpu, 0, "kidle_inj/%ld", cpu);  	if (IS_ERR(worker))  		return; diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c index 5c07a61447d3..e4ea7f6aef20 100644 --- a/drivers/thermal/mtk_thermal.c +++ b/drivers/thermal/mtk_thermal.c @@ -199,6 +199,9 @@ enum {  #define MT7622_TS1	0  #define MT7622_NUM_CONTROLLER		1 +/* The maximum number of banks */ +#define MAX_NUM_ZONES		8 +  /* The calibration coefficient of sensor  */  #define MT7622_CALIBRATION	165 @@ -249,7 +252,7 @@ struct mtk_thermal_data {  	const int num_controller;  	const int *controller_offset;  	bool need_switch_bank; -	struct thermal_bank_cfg bank_data[]; +	struct thermal_bank_cfg bank_data[MAX_NUM_ZONES];  };  struct mtk_thermal { @@ -268,7 +271,7 @@ struct mtk_thermal {  	s32 vts[MAX_NUM_VTS];  	const struct mtk_thermal_data *conf; -	struct mtk_thermal_bank banks[]; +	struct mtk_thermal_bank banks[MAX_NUM_ZONES];  };  /* MT8183 thermal sensor data */ diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index 48eef552cba4..fc9399d9c082 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c @@ -666,7 +666,7 @@ static int exynos_get_temp(void *p, int *temp)  	struct exynos_tmu_data *data = p;  	int value, ret = 0; -	if (!data || !data->tmu_read || !data->enabled) +	if (!data || !data->tmu_read)  		return -EINVAL;  	else if (!data->enabled)  		/*  | 

